diff --git a/vendor/github.com/b3log/wide/Dockerfile b/vendor/github.com/b3log/wide/Dockerfile
deleted file mode 100644
index 217bb46..0000000
--- a/vendor/github.com/b3log/wide/Dockerfile
+++ /dev/null
@@ -1,13 +0,0 @@
-FROM golang:latest
-MAINTAINER Liang Ding
-
-ADD . /go/src/github.com/b3log/wide
-ADD vendor/ /go/src/
-RUN go install github.com/visualfc/gotools github.com/nsf/gocode github.com/bradfitz/goimports
-
-RUN useradd wide && useradd runner
-
-WORKDIR /go/src/github.com/b3log/wide
-RUN go build -v
-
-EXPOSE 7070
diff --git a/vendor/github.com/b3log/wide/LICENSE b/vendor/github.com/b3log/wide/LICENSE
deleted file mode 100644
index b447376..0000000
--- a/vendor/github.com/b3log/wide/LICENSE
+++ /dev/null
@@ -1,201 +0,0 @@
- 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
-
- https://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.
diff --git a/vendor/github.com/b3log/wide/README.md b/vendor/github.com/b3log/wide/README.md
deleted file mode 100644
index fb2e572..0000000
--- a/vendor/github.com/b3log/wide/README.md
+++ /dev/null
@@ -1,180 +0,0 @@
-# [Wide](https://github.com/b3log/wide) [![Build Status](https://img.shields.io/travis/b3log/wide.svg?style=flat)](https://travis-ci.org/b3log/wide) [![Go Report Card](https://goreportcard.com/badge/github.com/b3log/wide)](https://goreportcard.com/report/github.com/b3log/wide) [![Coverage Status](https://img.shields.io/coveralls/b3log/wide.svg?style=flat)](https://coveralls.io/r/b3log/wide) [![Apache License](https://img.shields.io/badge/license-apache2-orange.svg?style=flat)](https://www.apache.org/licenses/LICENSE-2.0) [![API Documentation](https://img.shields.io/badge/godoc-reference-blue.svg?style=flat)](https://godoc.org/github.com/b3log/wide) [![Download](https://img.shields.io/badge/download-~4.3K-red.svg?style=flat)](https://pan.baidu.com/s/1dD3XwOT)
-
-_Have a [try](https://wide.b3log.org/signup) first, then [download](https://pan.baidu.com/s/1dD3XwOT) and setup it on your local area network, enjoy yourself!_
-
-先试试我们搭建好的[在线服务](https://wide.b3log.org/signup),你可以在这里[下载](https://pan.baidu.com/s/1dD3XwOT)并在本地环境运行,然后邀请小伙伴们来玩吧!
-
-> * 关于 Wide 的产品定位,请看[这里](https://hacpai.com/article/1438407961481),并欢迎参与讨论~
-> * 加入[**黑客派**](https://hacpai.com/register),与其他程序员、设计师共同成长!
-
-## Introduction
-
-A W eb-based IDE for Teams using Go programming language/Golang.
-
-![Hello, 世界](https://cloud.githubusercontent.com/assets/873584/4606377/d0ca3c2a-521b-11e4-912c-d955ab05850b.png)
-
-## Authors
-
-[Daniel](https://github.com/88250) and [Vanessa](https://github.com/Vanessa219) are the main authors of Wide, [here](https://github.com/b3log/wide/graphs/contributors) are all contributors.
-
-Wide 的主要作者是 [Daniel](https://github.com/88250) 与 [Vanessa](https://github.com/Vanessa219),所有贡献者可以在[这里](https://github.com/b3log/wide/graphs/contributors)看到。
-
-## Motivation
-
-* **Team** IDE:
- * _Safe and reliable_: the project source code stored on the server in real time, the developer's machine crashes without losing any source code
- * _Unified environment_: server unified development environment configuration, the developer machine without any additional configuration
- * _Out of the box_: 5 minutes to setup a server then open browser to develop, debug
- * _Version Control_: each developer has its own source code repository, easy sync with the trunk
-* **Web-based** IDE:
- * Developer needs a browser only
- * Cross-platform, even on mobile devices
- * Easy to extend
- * Easy to integrate with other systems
- * For the geeks
-* A try for commercial-open source: versions customized for enterprises, close to their development work flows respectively
-* Currently more popular Go IDE has some defects or regrets:
- * Text editor (vim/emacs/sublime/Atom, etc.): For the Go newbie is too complex
- * Plug-in (goclipse, etc.): the need for the original IDE support, not professional
- * LiteIDE: no modern user interface :p
- * No team development experience
-* There are a few of GO IDEs, and no one developed by Go itself, this is a nice try
-
-## Features
-
-* [X] Code Highlight, Folding: Go/HTML/JavaScript/Markdown etc.
-* [X] Autocomplete: Go/HTML etc.
-* [X] Format: Go/HTML/JSON etc.
-* [X] Build & Run
-* [X] Multiplayer: a real team development experience
-* [X] Navigation, Jump to declaration, Find usages, File search etc.
-* [X] Shell: run command on the server
-* [X] Web development: HTML/JS/CSS editor with [Emmet](https://emmet.io) integrated
-* [X] Go tool: go get/install/fmt etc.
-* [X] File Import & Export
-* [X] Themes: editor and UI adjust, respectively
-* [X] Cross-Compilation
-* [ ] Debug
-* [ ] Git integration: git command on the web
-
-## Screenshots
-
-* **Overview**
-
- ![Overview](https://cloud.githubusercontent.com/assets/873584/5450620/1d51831e-8543-11e4-930b-670871902425.png)
-* **Goto File**
-
- ![Goto File](https://cloud.githubusercontent.com/assets/873584/5450616/1d495da6-8543-11e4-9285-f9d9c60779ac.png)
-* **Autocomplete**
-
- ![Autocomplete](https://cloud.githubusercontent.com/assets/873584/5450619/1d4d5712-8543-11e4-8fe4-35dbc8348a6e.png)
-* **Theme**
-
- ![4](https://cloud.githubusercontent.com/assets/873584/5450617/1d4c0826-8543-11e4-8b86-f79a4e41550a.png)
-* **Show Expression Info**
-
- ![Show Expression Info](https://cloud.githubusercontent.com/assets/873584/5450618/1d4cd9f4-8543-11e4-950f-121bd3ff4a39.png)
-* **Build Error Info**
-
- ![Build Error Info](https://cloud.githubusercontent.com/assets/873584/5450632/3e51cccc-8543-11e4-8ca8-8d2427aa16b8.png)
-* **Git Clone**
-
- ![Git Clone](https://cloud.githubusercontent.com/assets/873584/6545235/2284f230-c5b7-11e4-985e-7e04367921b1.png)
-* **Cross-Compilation**
-
- ![Cross-Compilation](https://cloud.githubusercontent.com/assets/873584/10130037/226d75fc-65f7-11e5-94e4-25ee579ca175.png)
-
-* **Playground**
- ![Playground](https://cloud.githubusercontent.com/assets/873584/21209772/449ecfd2-c2b1-11e6-9aa6-a83477d9f269.gif)
-
-## Architecture
-
-### Build & Run
-
-![Build & Run](https://cloud.githubusercontent.com/assets/873584/4389219/3642bc62-43f3-11e4-8d1f-06d7aaf22784.png)
-
- * A browser tab corresponds to a Wide session
- * Execution output push via WebSocket
-
-Flow:
- 1. Browser sends ````Build```` request
- 2. Server executes ````go build```` command via ````os/exec````
- 2.1. Generates a executable file
- 3. Browser sends ````Run```` request
- 4. Server executes the file via ````os/exec````
- 4.1. A running process
- 4.2. Execution output push via WebSocket channel
- 5. Browser renders with callback function ````ws.onmessage````
-
-### Code Assist
-
-![Code Assist](https://cloud.githubusercontent.com/assets/873584/4399135/3b80c21c-4463-11e4-8e94-7f7e8d12a4df.png)
-
- * Autocompletion
- * Find Usages/Jump To Declaration/etc.
-
-Flow:
- 1. Browser sends code assist request
- 2. Handler gets user workspace of the request with HTTP session
- 3. Server executes ````gocode````/````ide_stub(gotools)````
- 3.1 Sets environment variables (e.g. ${GOPATH})
- 3.2 ````gocode```` with ````lib-path```` parameter
-
-## Documents
-
-* [用户指南](https://www.gitbook.com/book/88250/wide-user-guide)
-* [开发指南](https://www.gitbook.com/book/88250/wide-dev-guide)
-
-## Setup
-
-### Download Binary
-
-We have provided OS-specific executable binary as follows:
-
-* linux-amd64/386
-* windows-amd64/386
-* darwin-amd64/386
-
-Download [HERE](https://pan.baidu.com/s/1dD3XwOT)!
-
-### Build Wide for yourself
-
-1. [Download](https://github.com/b3log/wide/archive/master.zip) source or by `git clone https://github.com/b3log/wide`
-2. Get dependencies with
- * `go get`
- * `go get github.com/visualfc/gotools github.com/nsf/gocode github.com/bradfitz/goimports`
-3. Compile wide with `go build`
-
-### Docker
-
-1. Get image: `sudo docker pull 88250/wide:latest`
-2. Run: `sudo docker run -p 127.0.0.1:7070:7070 88250/wide:latest ./wide -docker=true -channel=ws://127.0.0.1:7070`
-3. Open browser: http://127.0.0.1:7070
-
-## Known Issues
-
-* [Shell is not available on Windows](https://github.com/b3log/wide/issues/32)
-* [Rename directory](https://github.com/b3log/wide/issues/251)
-
-## Terms
-
-* This software is open sourced under the Apache License 2.0
-* You can not get rid of the "Powered by [B3log](https://b3log.org)" from any page, even which you made
-* If you want to use this software for commercial purpose, please mail to support@liuyun.io for a commercial license request
-* Copyright © b3log.org, all rights reserved
-
-## Credits
-
-Wide is made possible by the following open source projects.
-
-* [golang](https://golang.org)
-* [CodeMirror](https://github.com/marijnh/CodeMirror)
-* [zTree](https://github.com/zTree/zTree_v3)
-* [LiteIDE](https://github.com/visualfc/liteide)
-* [gocode](https://github.com/nsf/gocode)
-* [Gorilla](https://github.com/gorilla)
-* [Docker](https://docker.com)
-
-----
-
-
diff --git a/vendor/github.com/b3log/wide/TERMS.md b/vendor/github.com/b3log/wide/TERMS.md
deleted file mode 100644
index 0fdd02a..0000000
--- a/vendor/github.com/b3log/wide/TERMS.md
+++ /dev/null
@@ -1,4 +0,0 @@
-* This software is open sourced under the Apache License 2.0
-* You can not get rid of the "Powered by [B3log](https://b3log.org)" from any pages, even the pages are developed by you
-* If you want to use this software for commercial purpose, please mail to support@liuyun.io for request a commercial license
-* Copyright (c) b3log.org, all rights reserved
diff --git a/vendor/github.com/b3log/wide/coverage.sh b/vendor/github.com/b3log/wide/coverage.sh
deleted file mode 100644
index ec12a36..0000000
--- a/vendor/github.com/b3log/wide/coverage.sh
+++ /dev/null
@@ -1,24 +0,0 @@
-#!/bin/bash
-# see https://gist.github.com/hailiang/0f22736320abe6be71ce for more details
-
-set -e
-
-# Run test coverage on each subdirectories and merge the coverage profile.
-
-echo "mode: count" > profile.cov
-
-# Standard go tooling behavior is to ignore dirs with leading underscors
-for dir in $(find . -maxdepth 10 -not -path './.git*' -not -path '*/_*' -not -path './vendor*' -type d);
-do
-if ls $dir/*.go &> /dev/null; then
- go test -covermode=count -coverprofile=$dir/profile.tmp $dir
- if [ -f $dir/profile.tmp ]
- then
- cat $dir/profile.tmp | tail -n +2 >> profile.cov
- rm $dir/profile.tmp
- fi
-fi
-done
-
-go tool cover -func profile.cov
-
diff --git a/vendor/github.com/b3log/wide/gulpfile.js b/vendor/github.com/b3log/wide/gulpfile.js
deleted file mode 100644
index 7902f7c..0000000
--- a/vendor/github.com/b3log/wide/gulpfile.js
+++ /dev/null
@@ -1,135 +0,0 @@
-/*
- * Copyright (c) 2014-2015, b3log.org
- *
- * 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
- *
- * https://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 frontend tool.
- *
- * @author Liyuan Li
- * @version 0.1.0.0, Dec 15, 2015
- */
-var gulp = require("gulp");
-var concat = require('gulp-concat');
-var minifyCSS = require('gulp-minify-css');
-var uglify = require('gulp-uglify');
-var sourcemaps = require("gulp-sourcemaps");
-
-gulp.task('cc', function () {
- // css
- var cssLibs = ['./static/js/lib/jquery-layout/layout-default-latest.css',
- './static/js/lib/codemirror-5.1/codemirror.css',
- './static/js/lib/codemirror-5.1/addon/hint/show-hint.css',
- './static/js/lib/codemirror-5.1/addon/lint/lint.css',
- './static/js/lib/codemirror-5.1/addon/fold/foldgutter.css',
- './static/js/lib/codemirror-5.1/addon/dialog/dialog.css',
- './static/js/overwrite/codemirror/theme/*.css'];
- gulp.src(cssLibs)
- .pipe(minifyCSS())
- .pipe(concat('lib.min.css'))
- .pipe(gulp.dest('./static/css/'));
-
- gulp.src('./static/js/lib/ztree/zTreeStyle.css')
- .pipe(minifyCSS())
- .pipe(concat('zTreeStyle.min.css'))
- .pipe(gulp.dest('./static/js/lib/ztree/'));
-
- var cssWide = ['./static/css/dialog.css',
- './static/css/base.css',
- './static/css/wide.css',
- './static/css/side.css',
- './static/css/start.css',
- './static/css/about.css'
- ];
-
- gulp.src(cssWide)
- .pipe(minifyCSS())
- .pipe(concat('wide.min.css'))
- .pipe(gulp.dest('./static/css/'));
-
-
- // js
- var jsLibs = ['./static/js/lib/jquery-2.1.1.min.js',
- './static/js/lib/jquery-ui.min.js',
- './static/js/lib/jquery-layout/jquery.layout-latest.js',
- './static/js/lib/reconnecting-websocket.js',
- './static/js/lib/Autolinker.min.js',
- './static/js/lib/emmet.js',
- './static/js/lib/js-beautify-1.5.4/beautify.js',
- './static/js/lib/js-beautify-1.5.4/beautify-html.js',
- './static/js/lib/js-beautify-1.5.4/beautify-css.js',
- './static/js/lib/jquery-file-upload-9.8.0/vendor/jquery.ui.widget.js',
- './static/js/lib/jquery-file-upload-9.8.0/jquery.iframe-transport.js',
- './static/js/lib/jquery-file-upload-9.8.0/jquery.fileupload.js',
- './static/js/lib/codemirror-5.1/codemirror.min.js',
- './static/js/lib/codemirror-5.1/addon/lint/lint.js',
- './static/js/lib/codemirror-5.1/addon/lint/json-lint.js',
- './static/js/lib/codemirror-5.1/addon/selection/active-line.js',
- './static/js/lib/codemirror-5.1/addon/selection/active-line.js',
- './static/js/overwrite/codemirror/addon/hint/show-hint.js',
- './static/js/lib/codemirror-5.1/addon/hint/anyword-hint.js',
- './static/js/lib/codemirror-5.1/addon/display/rulers.js',
- './static/js/lib/codemirror-5.1/addon/edit/closebrackets.js',
- './static/js/lib/codemirror-5.1/addon/edit/matchbrackets.js',
- './static/js/lib/codemirror-5.1/addon/edit/closetag.js',
- './static/js/lib/codemirror-5.1/addon/search/searchcursor.js',
- './static/js/lib/codemirror-5.1/addon/search/search.js',
- './static/js/lib/codemirror-5.1/addon/dialog/dialog.js',
- './static/js/lib/codemirror-5.1/addon/search/match-highlighter.js',
- './static/js/lib/codemirror-5.1/addon/fold/foldcode.js',
- './static/js/lib/codemirror-5.1/addon/fold/foldgutter.js',
- './static/js/lib/codemirror-5.1/addon/fold/brace-fold.js',
- './static/js/lib/codemirror-5.1/addon/fold/xml-fold.js',
- './static/js/lib/codemirror-5.1/addon/fold/markdown-fold.js',
- './static/js/lib/codemirror-5.1/addon/fold/comment-fold.js',
- './static/js/lib/codemirror-5.1/addon/fold/mode/loadmode.js',
- './static/js/lib/codemirror-5.1/addon/fold/comment/comment.js',
- './static/js/lib/codemirror-5.1/mode/meta.js',
- './static/js/lib/codemirror-5.1/mode/go/go.js',
- './static/js/lib/codemirror-5.1/mode/clike/clike.js',
- './static/js/lib/codemirror-5.1/mode/xml/xml.js',
- './static/js/lib/codemirror-5.1/mode/htmlmixed/htmlmixed.js',
- './static/js/lib/codemirror-5.1/mode/javascript/javascript.js',
- './static/js/lib/codemirror-5.1/mode/markdown/markdown.js',
- './static/js/lib/codemirror-5.1/mode/css/css.js',
- './static/js/lib/codemirror-5.1/mode/shell/shell.js',
- './static/js/lib/codemirror-5.1/mode/sql/sql.js',
- './static/js/lib/codemirror-5.1/keymap/vim.js',
- './static/js/lib/lint/json-lint.js',
- './static/js/lib/lint/go-lint.js'];
- gulp.src(jsLibs)
- .pipe(uglify())
- .pipe(concat('lib.min.js'))
- .pipe(gulp.dest('./static/js/'));
-
- var jsWide = ['./static/js/tabs.js',
- './static/js/tabs.js',
- './static/js/dialog.js',
- './static/js/editors.js',
- './static/js/notification.js',
- './static/js/tree.js',
- './static/js/wide.js',
- './static/js/session.js',
- './static/js/menu.js',
- './static/js/windows.js',
- './static/js/hotkeys.js',
- './static/js/bottomGroup.js'
- ];
- gulp.src(jsWide)
- .pipe(sourcemaps.init())
- .pipe(uglify())
- .pipe(concat('wide.min.js'))
- .pipe(sourcemaps.write("."))
- .pipe(gulp.dest('./static/js/'));
-});
\ No newline at end of file
diff --git a/vendor/github.com/b3log/wide/header.exe b/vendor/github.com/b3log/wide/header.exe
deleted file mode 100644
index 3d725bb..0000000
Binary files a/vendor/github.com/b3log/wide/header.exe and /dev/null differ
diff --git a/vendor/github.com/b3log/wide/main.go b/vendor/github.com/b3log/wide/main.go
deleted file mode 100644
index 3030030..0000000
--- a/vendor/github.com/b3log/wide/main.go
+++ /dev/null
@@ -1,483 +0,0 @@
-// Copyright (c) 2014-2018, b3log.org & hacpai.com
-//
-// 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
-//
-// https://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.
-
-package main
-
-import (
- "compress/gzip"
- "flag"
- "html/template"
- "io"
- "mime"
- "net/http"
- _ "net/http/pprof"
- "os"
- "os/signal"
- "runtime"
- "strings"
- "syscall"
- "time"
-
- "github.com/b3log/wide/conf"
- "github.com/b3log/wide/editor"
- "github.com/b3log/wide/event"
- "github.com/b3log/wide/file"
- "github.com/b3log/wide/i18n"
- "github.com/b3log/wide/log"
- "github.com/b3log/wide/notification"
- "github.com/b3log/wide/output"
- "github.com/b3log/wide/playground"
- "github.com/b3log/wide/scm/git"
- "github.com/b3log/wide/session"
- "github.com/b3log/wide/util"
-)
-
-// Logger
-var logger *log.Logger
-
-// The only one init function in Wide.
-func init() {
- confPath := flag.String("conf", "conf/wide.json", "path of wide.json")
- confIP := flag.String("ip", "", "this will overwrite Wide.IP if specified")
- confPort := flag.String("port", "", "this will overwrite Wide.Port if specified")
- confServer := flag.String("server", "", "this will overwrite Wide.Server if specified")
- confLogLevel := flag.String("log_level", "", "this will overwrite Wide.LogLevel if specified")
- confStaticServer := flag.String("static_server", "", "this will overwrite Wide.StaticServer if specified")
- confContext := flag.String("context", "", "this will overwrite Wide.Context if specified")
- confChannel := flag.String("channel", "", "this will overwrite Wide.Channel if specified")
- confStat := flag.Bool("stat", false, "whether report statistics periodically")
- confDocker := flag.Bool("docker", false, "whether run in a docker container")
- confPlayground := flag.String("playground", "", "this will overwrite Wide.Playground if specified")
- confUsersWorkspaces := flag.String("users_workspaces", "", "this will overwrite Wide.UsersWorkspaces if specified")
-
- flag.Parse()
-
- log.SetLevel("warn")
- logger = log.NewLogger(os.Stdout)
-
- wd := util.OS.Pwd()
- if strings.HasPrefix(wd, os.TempDir()) {
- logger.Error("Don't run Wide in OS' temp directory or with `go run`")
-
- os.Exit(-1)
- }
-
- i18n.Load()
- event.Load()
- conf.Load(*confPath, *confIP, *confPort, *confServer, *confLogLevel, *confStaticServer, *confContext, *confChannel,
- *confPlayground, *confDocker, *confUsersWorkspaces)
-
- conf.FixedTimeCheckEnv()
- session.FixedTimeSave()
- session.FixedTimeRelease()
-
- if *confStat {
- session.FixedTimeReport()
- }
-
- logger.Debug("host ["+runtime.Version()+", "+runtime.GOOS+"_"+runtime.GOARCH+"], cross-compilation ",
- util.Go.GetCrossPlatforms())
-}
-
-// Main.
-func main() {
- runtime.GOMAXPROCS(conf.Wide.MaxProcs)
-
- initMime()
- handleSignal()
-
- // IDE
- http.HandleFunc(conf.Wide.Context+"/", handlerGzWrapper(indexHandler))
- http.HandleFunc(conf.Wide.Context+"/start", handlerWrapper(startHandler))
- http.HandleFunc(conf.Wide.Context+"/about", handlerWrapper(aboutHandler))
- http.HandleFunc(conf.Wide.Context+"/keyboard_shortcuts", handlerWrapper(keyboardShortcutsHandler))
-
- // static resources
- http.Handle(conf.Wide.Context+"/static/", http.StripPrefix(conf.Wide.Context+"/static/", http.FileServer(http.Dir("static"))))
- serveSingle("/favicon.ico", "./static/favicon.ico")
-
- // workspaces
- for _, user := range conf.Users {
- http.Handle(conf.Wide.Context+"/workspace/"+user.Name+"/",
- http.StripPrefix(conf.Wide.Context+"/workspace/"+user.Name+"/", http.FileServer(http.Dir(user.WorkspacePath()))))
- }
-
- // session
- http.HandleFunc(conf.Wide.Context+"/session/ws", handlerWrapper(session.WSHandler))
- http.HandleFunc(conf.Wide.Context+"/session/save", handlerWrapper(session.SaveContentHandler))
-
- // run
- http.HandleFunc(conf.Wide.Context+"/build", handlerWrapper(output.BuildHandler))
- http.HandleFunc(conf.Wide.Context+"/run", handlerWrapper(output.RunHandler))
- http.HandleFunc(conf.Wide.Context+"/stop", handlerWrapper(output.StopHandler))
- http.HandleFunc(conf.Wide.Context+"/go/test", handlerWrapper(output.GoTestHandler))
- http.HandleFunc(conf.Wide.Context+"/go/vet", handlerWrapper(output.GoVetHandler))
- http.HandleFunc(conf.Wide.Context+"/go/get", handlerWrapper(output.GoGetHandler))
- http.HandleFunc(conf.Wide.Context+"/go/install", handlerWrapper(output.GoInstallHandler))
- http.HandleFunc(conf.Wide.Context+"/output/ws", handlerWrapper(output.WSHandler))
-
- // cross-compilation
- http.HandleFunc(conf.Wide.Context+"/cross", handlerWrapper(output.CrossCompilationHandler))
-
- // file tree
- http.HandleFunc(conf.Wide.Context+"/files", handlerWrapper(file.GetFilesHandler))
- http.HandleFunc(conf.Wide.Context+"/file/refresh", handlerWrapper(file.RefreshDirectoryHandler))
- http.HandleFunc(conf.Wide.Context+"/file", handlerWrapper(file.GetFileHandler))
- http.HandleFunc(conf.Wide.Context+"/file/save", handlerWrapper(file.SaveFileHandler))
- http.HandleFunc(conf.Wide.Context+"/file/new", handlerWrapper(file.NewFileHandler))
- http.HandleFunc(conf.Wide.Context+"/file/remove", handlerWrapper(file.RemoveFileHandler))
- http.HandleFunc(conf.Wide.Context+"/file/rename", handlerWrapper(file.RenameFileHandler))
- http.HandleFunc(conf.Wide.Context+"/file/search/text", handlerWrapper(file.SearchTextHandler))
- http.HandleFunc(conf.Wide.Context+"/file/find/name", handlerWrapper(file.FindHandler))
-
- // outline
- http.HandleFunc(conf.Wide.Context+"/outline", handlerWrapper(file.GetOutlineHandler))
-
- // file export/import
- http.HandleFunc(conf.Wide.Context+"/file/zip/new", handlerWrapper(file.CreateZipHandler))
- http.HandleFunc(conf.Wide.Context+"/file/zip", handlerWrapper(file.GetZipHandler))
- http.HandleFunc(conf.Wide.Context+"/file/upload", handlerWrapper(file.UploadHandler))
- http.HandleFunc(conf.Wide.Context+"/file/decompress", handlerWrapper(file.DecompressHandler))
-
- // editor
- http.HandleFunc(conf.Wide.Context+"/editor/ws", handlerWrapper(editor.WSHandler))
- http.HandleFunc(conf.Wide.Context+"/go/fmt", handlerWrapper(editor.GoFmtHandler))
- http.HandleFunc(conf.Wide.Context+"/autocomplete", handlerWrapper(editor.AutocompleteHandler))
- http.HandleFunc(conf.Wide.Context+"/exprinfo", handlerWrapper(editor.GetExprInfoHandler))
- http.HandleFunc(conf.Wide.Context+"/find/decl", handlerWrapper(editor.FindDeclarationHandler))
- http.HandleFunc(conf.Wide.Context+"/find/usages", handlerWrapper(editor.FindUsagesHandler))
-
- // shell
- // http.HandleFunc(conf.Wide.Context+"/shell/ws", handlerWrapper(shell.WSHandler))
- // http.HandleFunc(conf.Wide.Context+"/shell", handlerWrapper(shell.IndexHandler))
-
- // notification
- http.HandleFunc(conf.Wide.Context+"/notification/ws", handlerWrapper(notification.WSHandler))
-
- // user
- http.HandleFunc(conf.Wide.Context+"/login", handlerWrapper(session.LoginHandler))
- http.HandleFunc(conf.Wide.Context+"/logout", handlerWrapper(session.LogoutHandler))
- http.HandleFunc(conf.Wide.Context+"/signup", handlerWrapper(session.SignUpUserHandler))
- http.HandleFunc(conf.Wide.Context+"/preference", handlerWrapper(session.PreferenceHandler))
-
- // playground
- http.HandleFunc(conf.Wide.Context+"/playground", handlerWrapper(playground.IndexHandler))
- http.HandleFunc(conf.Wide.Context+"/playground/", handlerWrapper(playground.IndexHandler))
- http.HandleFunc(conf.Wide.Context+"/playground/ws", handlerWrapper(playground.WSHandler))
- http.HandleFunc(conf.Wide.Context+"/playground/save", handlerWrapper(playground.SaveHandler))
- http.HandleFunc(conf.Wide.Context+"/playground/short-url", handlerWrapper(playground.ShortURLHandler))
- http.HandleFunc(conf.Wide.Context+"/playground/build", handlerWrapper(playground.BuildHandler))
- http.HandleFunc(conf.Wide.Context+"/playground/run", handlerWrapper(playground.RunHandler))
- http.HandleFunc(conf.Wide.Context+"/playground/stop", handlerWrapper(playground.StopHandler))
- http.HandleFunc(conf.Wide.Context+"/playground/autocomplete", handlerWrapper(playground.AutocompleteHandler))
-
- // git
- http.HandleFunc(conf.Wide.Context+"/git/clone", handlerWrapper(git.CloneHandler))
-
- logger.Infof("Wide is running [%s]", conf.Wide.Server+conf.Wide.Context)
-
- err := http.ListenAndServe(conf.Wide.Server, nil)
- if err != nil {
- logger.Error(err)
- }
-}
-
-// indexHandler handles request of Wide index.
-func indexHandler(w http.ResponseWriter, r *http.Request) {
- if conf.Wide.Context+"/" != r.RequestURI {
- http.Redirect(w, r, conf.Wide.Context+"/", http.StatusFound)
-
- return
- }
-
- httpSession, _ := session.HTTPSession.Get(r, "wide-session")
- if httpSession.IsNew {
- http.Redirect(w, r, conf.Wide.Context+"/login", http.StatusFound)
-
- return
- }
-
- username := httpSession.Values["username"].(string)
- if "playground" == username { // reserved user for Playground
- http.Redirect(w, r, conf.Wide.Context+"/login", http.StatusFound)
-
- return
- }
-
- httpSession.Options.MaxAge = conf.Wide.HTTPSessionMaxAge
- if "" != conf.Wide.Context {
- httpSession.Options.Path = conf.Wide.Context
- }
- httpSession.Save(r, w)
-
- user := conf.GetUser(username)
- if nil == user {
- logger.Warnf("Not found user [%s]", username)
-
- http.Redirect(w, r, conf.Wide.Context+"/login", http.StatusFound)
-
- return
- }
-
- locale := user.Locale
-
- wideSessions := session.WideSessions.GetByUsername(username)
-
- model := map[string]interface{}{"conf": conf.Wide, "i18n": i18n.GetAll(locale), "locale": locale,
- "username": username, "sid": session.WideSessions.GenId(), "latestSessionContent": user.LatestSessionContent,
- "pathSeparator": conf.PathSeparator, "codeMirrorVer": conf.CodeMirrorVer,
- "user": user, "editorThemes": conf.GetEditorThemes(), "crossPlatforms": util.Go.GetCrossPlatforms()}
-
- logger.Debugf("User [%s] has [%d] sessions", username, len(wideSessions))
-
- t, err := template.ParseFiles("views/index.html")
- if nil != err {
- logger.Error(err)
- http.Error(w, err.Error(), 500)
-
- return
- }
-
- t.Execute(w, model)
-}
-
-// handleSignal handles system signal for graceful shutdown.
-func handleSignal() {
- go func() {
- c := make(chan os.Signal)
-
- signal.Notify(c, syscall.SIGINT, syscall.SIGQUIT, syscall.SIGTERM)
- s := <-c
- logger.Tracef("Got signal [%s]", s)
-
- session.SaveOnlineUsers()
- logger.Tracef("Saved all online user, exit")
-
- os.Exit(0)
- }()
-}
-
-// serveSingle registers the handler function for the given pattern and filename.
-func serveSingle(pattern string, filename string) {
- http.HandleFunc(pattern, func(w http.ResponseWriter, r *http.Request) {
- http.ServeFile(w, r, filename)
- })
-}
-
-// startHandler handles request of start page.
-func startHandler(w http.ResponseWriter, r *http.Request) {
- httpSession, _ := session.HTTPSession.Get(r, "wide-session")
- if httpSession.IsNew {
- http.Redirect(w, r, conf.Wide.Context+"/login", http.StatusFound)
-
- return
- }
-
- httpSession.Options.MaxAge = conf.Wide.HTTPSessionMaxAge
- if "" != conf.Wide.Context {
- httpSession.Options.Path = conf.Wide.Context
- }
- httpSession.Save(r, w)
-
- username := httpSession.Values["username"].(string)
- locale := conf.GetUser(username).Locale
- userWorkspace := conf.GetUserWorkspace(username)
-
- sid := r.URL.Query()["sid"][0]
- wSession := session.WideSessions.Get(sid)
- if nil == wSession {
- logger.Errorf("Session [%s] not found", sid)
- }
-
- model := map[string]interface{}{"conf": conf.Wide, "i18n": i18n.GetAll(locale), "locale": locale,
- "username": username, "workspace": userWorkspace, "ver": conf.WideVersion, "sid": sid}
-
- t, err := template.ParseFiles("views/start.html")
-
- if nil != err {
- logger.Error(err)
- http.Error(w, err.Error(), 500)
-
- return
- }
-
- t.Execute(w, model)
-}
-
-// keyboardShortcutsHandler handles request of keyboard shortcuts page.
-func keyboardShortcutsHandler(w http.ResponseWriter, r *http.Request) {
- httpSession, _ := session.HTTPSession.Get(r, "wide-session")
- if httpSession.IsNew {
- http.Redirect(w, r, conf.Wide.Context+"/login", http.StatusFound)
-
- return
- }
-
- httpSession.Options.MaxAge = conf.Wide.HTTPSessionMaxAge
- if "" != conf.Wide.Context {
- httpSession.Options.Path = conf.Wide.Context
- }
- httpSession.Save(r, w)
-
- username := httpSession.Values["username"].(string)
- locale := conf.GetUser(username).Locale
-
- model := map[string]interface{}{"conf": conf.Wide, "i18n": i18n.GetAll(locale), "locale": locale}
-
- t, err := template.ParseFiles("views/keyboard_shortcuts.html")
-
- if nil != err {
- logger.Error(err)
- http.Error(w, err.Error(), 500)
-
- return
- }
-
- t.Execute(w, model)
-}
-
-// aboutHandle handles request of about page.
-func aboutHandler(w http.ResponseWriter, r *http.Request) {
- httpSession, _ := session.HTTPSession.Get(r, "wide-session")
- if httpSession.IsNew {
- http.Redirect(w, r, conf.Wide.Context+"/login", http.StatusFound)
-
- return
- }
-
- httpSession.Options.MaxAge = conf.Wide.HTTPSessionMaxAge
- if "" != conf.Wide.Context {
- httpSession.Options.Path = conf.Wide.Context
- }
- httpSession.Save(r, w)
-
- username := httpSession.Values["username"].(string)
- locale := conf.GetUser(username).Locale
-
- model := map[string]interface{}{"conf": conf.Wide, "i18n": i18n.GetAll(locale), "locale": locale,
- "ver": conf.WideVersion, "goos": runtime.GOOS, "goarch": runtime.GOARCH, "gover": runtime.Version()}
-
- t, err := template.ParseFiles("views/about.html")
-
- if nil != err {
- logger.Error(err)
- http.Error(w, err.Error(), 500)
-
- return
- }
-
- t.Execute(w, model)
-}
-
-// handlerWrapper wraps the HTTP Handler for some common processes.
-//
-// 1. panic recover
-// 2. request stopwatch
-// 3. i18n
-func handlerWrapper(f func(w http.ResponseWriter, r *http.Request)) func(w http.ResponseWriter, r *http.Request) {
- handler := panicRecover(f)
- handler = stopwatch(handler)
- handler = i18nLoad(handler)
-
- return handler
-}
-
-// handlerGzWrapper wraps the HTTP Handler for some common processes.
-//
-// 1. panic recover
-// 2. gzip response
-// 3. request stopwatch
-// 4. i18n
-func handlerGzWrapper(f func(w http.ResponseWriter, r *http.Request)) func(w http.ResponseWriter, r *http.Request) {
- handler := panicRecover(f)
- handler = gzipWrapper(handler)
- handler = stopwatch(handler)
- handler = i18nLoad(handler)
-
- return handler
-}
-
-// gzipWrapper wraps the process with response gzip.
-func gzipWrapper(f func(http.ResponseWriter, *http.Request)) func(w http.ResponseWriter, r *http.Request) {
- return func(w http.ResponseWriter, r *http.Request) {
- if !strings.Contains(r.Header.Get("Accept-Encoding"), "gzip") {
- f(w, r)
-
- return
- }
-
- w.Header().Set("Content-Encoding", "gzip")
- gz := gzip.NewWriter(w)
- defer gz.Close()
- gzr := gzipResponseWriter{Writer: gz, ResponseWriter: w}
-
- f(gzr, r)
- }
-}
-
-// i18nLoad wraps the i18n process.
-func i18nLoad(handler func(w http.ResponseWriter, r *http.Request)) func(w http.ResponseWriter, r *http.Request) {
- return func(w http.ResponseWriter, r *http.Request) {
- i18n.Load()
-
- handler(w, r)
- }
-}
-
-// stopwatch wraps the request stopwatch process.
-func stopwatch(handler func(w http.ResponseWriter, r *http.Request)) func(w http.ResponseWriter, r *http.Request) {
- return func(w http.ResponseWriter, r *http.Request) {
- start := time.Now()
-
- defer func() {
- logger.Tracef("[%s, %s, %s]", r.Method, r.RequestURI, time.Since(start))
- }()
-
- handler(w, r)
- }
-}
-
-// panicRecover wraps the panic recover process.
-func panicRecover(handler func(w http.ResponseWriter, r *http.Request)) func(w http.ResponseWriter, r *http.Request) {
- return func(w http.ResponseWriter, r *http.Request) {
- defer util.Recover()
-
- handler(w, r)
- }
-}
-
-// initMime initializes mime types.
-//
-// We can't get the mime types on some OS (such as Windows XP) by default, so initializes them here.
-func initMime() {
- mime.AddExtensionType(".css", "text/css")
- mime.AddExtensionType(".js", "application/x-javascript")
- mime.AddExtensionType(".json", "application/json")
-}
-
-// gzipResponseWriter represents a gzip response writer.
-type gzipResponseWriter struct {
- io.Writer
- http.ResponseWriter
-}
-
-// Write writes response with appropriate 'Content-Type'.
-func (w gzipResponseWriter) Write(b []byte) (int, error) {
- if "" == w.Header().Get("Content-Type") {
- // If no content type, apply sniffing algorithm to un-gzipped body.
- w.Header().Set("Content-Type", http.DetectContentType(b))
- }
-
- return w.Writer.Write(b)
-}
diff --git a/vendor/github.com/b3log/wide/package.json b/vendor/github.com/b3log/wide/package.json
deleted file mode 100644
index ed66be8..0000000
--- a/vendor/github.com/b3log/wide/package.json
+++ /dev/null
@@ -1,33 +0,0 @@
-{
- "name": "wide",
- "version": "1.4.0",
- "description": "A Web-based IDE for Teams using Go programming language/Golang.",
- "homepage": "https://wide.b3log.org",
- "repository": {
- "type": "git",
- "url": "git://github.com/b3log/wide.git"
- },
- "bugs": {
- "url": "https://github.com/b3log/wide/issues"
- },
- "license": "Apache License",
- "private": true,
- "author": "Daniel (http://88250.b3log.org) & Vanessa (http://vanessa.b3log.org)",
- "maintainers": [
- {
- "name": "Daniel",
- "email": "d@b3log.org"
- },
- {
- "name": "Vanessa",
- "email": "v@b3log.org"
- }
- ],
- "devDependencies": {
- "gulp": "^3.9.1",
- "gulp-concat": "^2.6.1",
- "gulp-minify-css": "^1.2.4",
- "gulp-sourcemaps": "^2.6.0",
- "gulp-uglify": "^2.1.2"
- }
-}
diff --git a/vendor/github.com/b3log/wide/pkg.sh b/vendor/github.com/b3log/wide/pkg.sh
deleted file mode 100644
index 22a6e5e..0000000
--- a/vendor/github.com/b3log/wide/pkg.sh
+++ /dev/null
@@ -1,80 +0,0 @@
-#!/bin/bash
-
-# Wide package tool.
-#
-# Command:
-# ./pkg.sh ${version} ${target}
-# Example:
-# ./pkg.sh 1.0.0 /home/daniel/1.0.0/
-
-ver=$1
-target=$2
-list="conf doc i18n static views README.md TERMS.md LICENSE"
-
-mkdir -p ${target}
-
-echo version=${ver}
-echo target=${target}
-
-## darwin
-os=darwin
-
-export GOOS=${os}
-export GOARCH=amd64
-echo wide-${ver}-${GOOS}-${GOARCH}.tar.gz
-go build
-go build github.com/visualfc/gotools
-go build github.com/nsf/gocode
-tar zcf ${target}/wide-${ver}-${GOOS}-${GOARCH}.tar.gz ${list} gotools gocode wide --exclude-vcs --exclude='conf/*.go' --exclude='i18n/*.go'
-rm -f wide gotools gocode
-
-export GOOS=${os}
-export GOARCH=386
-echo wide-${ver}-${GOOS}-${GOARCH}.tar.gz
-go build
-go build github.com/visualfc/gotools
-go build github.com/nsf/gocode
-tar zcf ${target}/wide-${ver}-${GOOS}-${GOARCH}.tar.gz ${list} gotools gocode wide --exclude-vcs --exclude='conf/*.go' --exclude='i18n/*.go'
-rm -f wide gotools gocode
-
-## linux
-os=linux
-
-export GOOS=${os}
-export GOARCH=amd64
-echo wide-${ver}-${GOOS}-${GOARCH}.tar.gz
-go build
-go build github.com/visualfc/gotools
-go build github.com/nsf/gocode
-tar zcf ${target}/wide-${ver}-${GOOS}-${GOARCH}.tar.gz ${list} gotools gocode wide --exclude-vcs --exclude='conf/*.go' --exclude='i18n/*.go'
-rm -f wide gotools gocode
-
-export GOOS=${os}
-export GOARCH=386
-echo wide-${ver}-${GOOS}-${GOARCH}.tar.gz
-go build
-go build github.com/visualfc/gotools
-go build github.com/nsf/gocode
-tar zcf ${target}/wide-${ver}-${GOOS}-${GOARCH}.tar.gz ${list} gotools gocode wide --exclude-vcs --exclude='conf/*.go' --exclude='i18n/*.go'
-rm -f wide gotools gocode
-
-## windows
-os=windows
-
-export GOOS=${os}
-export GOARCH=amd64
-echo wide-${ver}-${GOOS}-${GOARCH}.zip
-go build
-go build github.com/visualfc/gotools
-go build github.com/nsf/gocode
-zip -r -q ${target}/wide-${ver}-${GOOS}-${GOARCH}.zip ${list} gotools.exe gocode.exe wide.exe --exclude=conf/*.go --exclude=i18n/*.go
-rm -f wide.exe gotools.exe gocode.exe
-
-export GOOS=${os}
-export GOARCH=386
-echo wide-${ver}-${GOOS}-${GOARCH}.zip
-go build
-go build github.com/visualfc/gotools
-go build github.com/nsf/gocode
-zip -r -q ${target}/wide-${ver}-${GOOS}-${GOARCH}.zip ${list} gotools.exe gocode.exe wide.exe --exclude=conf/*.go --exclude=i18n/*.go
-rm -f wide.exe gotools.exe gocode.exe
diff --git a/vendor/github.com/b3log/wide/yarn.lock b/vendor/github.com/b3log/wide/yarn.lock
deleted file mode 100644
index 0ea15a7..0000000
--- a/vendor/github.com/b3log/wide/yarn.lock
+++ /dev/null
@@ -1,1341 +0,0 @@
-# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
-# yarn lockfile v1
-
-
-"@gulp-sourcemaps/identity-map@1.X":
- version "1.0.1"
- resolved "http://registry.npm.taobao.org/@gulp-sourcemaps/identity-map/download/@gulp-sourcemaps/identity-map-1.0.1.tgz#cfa23bc5840f9104ce32a65e74db7e7a974bbee1"
- dependencies:
- acorn "^5.0.3"
- css "^2.2.1"
- normalize-path "^2.1.1"
- source-map "^0.5.6"
- through2 "^2.0.3"
-
-"@gulp-sourcemaps/map-sources@1.X":
- version "1.0.0"
- resolved "http://registry.npm.taobao.org/@gulp-sourcemaps/map-sources/download/@gulp-sourcemaps/map-sources-1.0.0.tgz#890ae7c5d8c877f6d384860215ace9d7ec945bda"
- dependencies:
- normalize-path "^2.0.1"
- through2 "^2.0.3"
-
-acorn@4.X:
- version "4.0.11"
- resolved "http://registry.npm.taobao.org/acorn/download/acorn-4.0.11.tgz#edcda3bd937e7556410d42ed5860f67399c794c0"
-
-acorn@^5.0.3:
- version "5.0.3"
- resolved "http://registry.npm.taobao.org/acorn/download/acorn-5.0.3.tgz#c460df08491463f028ccb82eab3730bf01087b3d"
-
-align-text@^0.1.1, align-text@^0.1.3:
- version "0.1.4"
- resolved "http://registry.npm.taobao.org/align-text/download/align-text-0.1.4.tgz#0cd90a561093f35d0a99256c22b7069433fad117"
- dependencies:
- kind-of "^3.0.2"
- longest "^1.0.1"
- repeat-string "^1.5.2"
-
-amdefine@>=0.0.4:
- version "1.0.1"
- resolved "http://registry.npm.taobao.org/amdefine/download/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5"
-
-ansi-regex@^2.0.0:
- version "2.1.1"
- resolved "http://registry.npm.taobao.org/ansi-regex/download/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df"
-
-ansi-styles@^2.2.1:
- version "2.2.1"
- resolved "http://registry.npm.taobao.org/ansi-styles/download/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe"
-
-archy@^1.0.0:
- version "1.0.0"
- resolved "http://registry.npm.taobao.org/archy/download/archy-1.0.0.tgz#f9c8c13757cc1dd7bc379ac77b2c62a5c2868c40"
-
-arr-diff@^2.0.0:
- version "2.0.0"
- resolved "http://registry.npm.taobao.org/arr-diff/download/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf"
- dependencies:
- arr-flatten "^1.0.1"
-
-arr-flatten@^1.0.1:
- version "1.0.3"
- resolved "http://registry.npm.taobao.org/arr-flatten/download/arr-flatten-1.0.3.tgz#a274ed85ac08849b6bd7847c4580745dc51adfb1"
-
-array-differ@^1.0.0:
- version "1.0.0"
- resolved "http://registry.npm.taobao.org/array-differ/download/array-differ-1.0.0.tgz#eff52e3758249d33be402b8bb8e564bb2b5d4031"
-
-array-uniq@^1.0.2:
- version "1.0.3"
- resolved "http://registry.npm.taobao.org/array-uniq/download/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6"
-
-array-unique@^0.2.1:
- version "0.2.1"
- resolved "http://registry.npm.taobao.org/array-unique/download/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53"
-
-atob@~1.1.0:
- version "1.1.3"
- resolved "http://registry.npm.taobao.org/atob/download/atob-1.1.3.tgz#95f13629b12c3a51a5d215abdce2aa9f32f80773"
-
-balanced-match@^0.4.1:
- version "0.4.2"
- resolved "http://registry.npm.taobao.org/balanced-match/download/balanced-match-0.4.2.tgz#cb3f3e3c732dc0f01ee70b403f302e61d7709838"
-
-beeper@^1.0.0:
- version "1.1.1"
- resolved "http://registry.npm.taobao.org/beeper/download/beeper-1.1.1.tgz#e6d5ea8c5dad001304a70b22638447f69cb2f809"
-
-brace-expansion@^1.0.0:
- version "1.1.7"
- resolved "http://registry.npm.taobao.org/brace-expansion/download/brace-expansion-1.1.7.tgz#3effc3c50e000531fb720eaff80f0ae8ef23cf59"
- dependencies:
- balanced-match "^0.4.1"
- concat-map "0.0.1"
-
-braces@^1.8.2:
- version "1.8.5"
- resolved "http://registry.npm.taobao.org/braces/download/braces-1.8.5.tgz#ba77962e12dff969d6b76711e914b737857bf6a7"
- dependencies:
- expand-range "^1.8.1"
- preserve "^0.2.0"
- repeat-element "^1.1.2"
-
-buffer-shims@~1.0.0:
- version "1.0.0"
- resolved "http://registry.npm.taobao.org/buffer-shims/download/buffer-shims-1.0.0.tgz#9978ce317388c649ad8793028c3477ef044a8b51"
-
-bufferstreams@1.0.1:
- version "1.0.1"
- resolved "http://registry.npm.taobao.org/bufferstreams/download/bufferstreams-1.0.1.tgz#cfb1ad9568d3ba3cfe935ba9abdd952de88aab2a"
- dependencies:
- readable-stream "^1.0.33"
-
-camelcase@^1.0.2:
- version "1.2.1"
- resolved "http://registry.npm.taobao.org/camelcase/download/camelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a39"
-
-center-align@^0.1.1:
- version "0.1.3"
- resolved "http://registry.npm.taobao.org/center-align/download/center-align-0.1.3.tgz#aa0d32629b6ee972200411cbd4461c907bc2b7ad"
- dependencies:
- align-text "^0.1.3"
- lazy-cache "^1.0.3"
-
-chalk@^1.0.0, chalk@^1.1.1:
- version "1.1.3"
- resolved "http://registry.npm.taobao.org/chalk/download/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98"
- dependencies:
- ansi-styles "^2.2.1"
- escape-string-regexp "^1.0.2"
- has-ansi "^2.0.0"
- strip-ansi "^3.0.0"
- supports-color "^2.0.0"
-
-clean-css@^3.3.3:
- version "3.4.25"
- resolved "http://registry.npm.taobao.org/clean-css/download/clean-css-3.4.25.tgz#9e9a52d5c1e6bc5123e1b2783fa65fe958946ede"
- dependencies:
- commander "2.8.x"
- source-map "0.4.x"
-
-cliui@^2.1.0:
- version "2.1.0"
- resolved "http://registry.npm.taobao.org/cliui/download/cliui-2.1.0.tgz#4b475760ff80264c762c3a1719032e91c7fea0d1"
- dependencies:
- center-align "^0.1.1"
- right-align "^0.1.1"
- wordwrap "0.0.2"
-
-clone-buffer@^1.0.0:
- version "1.0.0"
- resolved "http://registry.npm.taobao.org/clone-buffer/download/clone-buffer-1.0.0.tgz#e3e25b207ac4e701af721e2cb5a16792cac3dc58"
-
-clone-stats@^0.0.1:
- version "0.0.1"
- resolved "http://registry.npm.taobao.org/clone-stats/download/clone-stats-0.0.1.tgz#b88f94a82cf38b8791d58046ea4029ad88ca99d1"
-
-clone-stats@^1.0.0:
- version "1.0.0"
- resolved "http://registry.npm.taobao.org/clone-stats/download/clone-stats-1.0.0.tgz#b3782dff8bb5474e18b9b6bf0fdfe782f8777680"
-
-clone@^0.2.0:
- version "0.2.0"
- resolved "http://registry.npm.taobao.org/clone/download/clone-0.2.0.tgz#c6126a90ad4f72dbf5acdb243cc37724fe93fc1f"
-
-clone@^1.0.0, clone@^1.0.2:
- version "1.0.2"
- resolved "http://registry.npm.taobao.org/clone/download/clone-1.0.2.tgz#260b7a99ebb1edfe247538175f783243cb19d149"
-
-cloneable-readable@^1.0.0:
- version "1.0.0"
- resolved "http://registry.npm.taobao.org/cloneable-readable/download/cloneable-readable-1.0.0.tgz#a6290d413f217a61232f95e458ff38418cfb0117"
- dependencies:
- inherits "^2.0.1"
- process-nextick-args "^1.0.6"
- through2 "^2.0.1"
-
-commander@2.8.x:
- version "2.8.1"
- resolved "http://registry.npm.taobao.org/commander/download/commander-2.8.1.tgz#06be367febfda0c330aa1e2a072d3dc9762425d4"
- dependencies:
- graceful-readlink ">= 1.0.0"
-
-concat-map@0.0.1:
- version "0.0.1"
- resolved "http://registry.npm.taobao.org/concat-map/download/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
-
-concat-with-sourcemaps@^1.0.0:
- version "1.0.4"
- resolved "http://registry.npm.taobao.org/concat-with-sourcemaps/download/concat-with-sourcemaps-1.0.4.tgz#f55b3be2aeb47601b10a2d5259ccfb70fd2f1dd6"
- dependencies:
- source-map "^0.5.1"
-
-convert-source-map@1.X:
- version "1.5.0"
- resolved "http://registry.npm.taobao.org/convert-source-map/download/convert-source-map-1.5.0.tgz#9acd70851c6d5dfdd93d9282e5edf94a03ff46b5"
-
-core-util-is@~1.0.0:
- version "1.0.2"
- resolved "http://registry.npm.taobao.org/core-util-is/download/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7"
-
-css@2.X, css@^2.2.1:
- version "2.2.1"
- resolved "http://registry.npm.taobao.org/css/download/css-2.2.1.tgz#73a4c81de85db664d4ee674f7d47085e3b2d55dc"
- dependencies:
- inherits "^2.0.1"
- source-map "^0.1.38"
- source-map-resolve "^0.3.0"
- urix "^0.1.0"
-
-dateformat@^2.0.0:
- version "2.0.0"
- resolved "http://registry.npm.taobao.org/dateformat/download/dateformat-2.0.0.tgz#2743e3abb5c3fc2462e527dca445e04e9f4dee17"
-
-debug-fabulous@0.1.X:
- version "0.1.0"
- resolved "http://registry.npm.taobao.org/debug-fabulous/download/debug-fabulous-0.1.0.tgz#ad0ea07a5d519324fb55842a8f34ee59c7f8ff6c"
- dependencies:
- debug "2.X"
- object-assign "4.1.0"
-
-debug@2.X:
- version "2.6.4"
- resolved "http://registry.npm.taobao.org/debug/download/debug-2.6.4.tgz#7586a9b3c39741c0282ae33445c4e8ac74734fe0"
- dependencies:
- ms "0.7.3"
-
-decamelize@^1.0.0:
- version "1.2.0"
- resolved "http://registry.npm.taobao.org/decamelize/download/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290"
-
-defaults@^1.0.0:
- version "1.0.3"
- resolved "http://registry.npm.taobao.org/defaults/download/defaults-1.0.3.tgz#c656051e9817d9ff08ed881477f3fe4019f3ef7d"
- dependencies:
- clone "^1.0.2"
-
-deprecated@^0.0.1:
- version "0.0.1"
- resolved "http://registry.npm.taobao.org/deprecated/download/deprecated-0.0.1.tgz#f9c9af5464afa1e7a971458a8bdef2aa94d5bb19"
-
-detect-file@^0.1.0:
- version "0.1.0"
- resolved "http://registry.npm.taobao.org/detect-file/download/detect-file-0.1.0.tgz#4935dedfd9488648e006b0129566e9386711ea63"
- dependencies:
- fs-exists-sync "^0.1.0"
-
-detect-newline@2.X:
- version "2.1.0"
- resolved "http://registry.npm.taobao.org/detect-newline/download/detect-newline-2.1.0.tgz#f41f1c10be4b00e87b5f13da680759f2c5bfd3e2"
-
-duplexer2@0.0.2:
- version "0.0.2"
- resolved "http://registry.npm.taobao.org/duplexer2/download/duplexer2-0.0.2.tgz#c614dcf67e2fb14995a91711e5a617e8a60a31db"
- dependencies:
- readable-stream "~1.1.9"
-
-end-of-stream@~0.1.5:
- version "0.1.5"
- resolved "http://registry.npm.taobao.org/end-of-stream/download/end-of-stream-0.1.5.tgz#8e177206c3c80837d85632e8b9359dfe8b2f6eaf"
- dependencies:
- once "~1.3.0"
-
-escape-string-regexp@^1.0.2:
- version "1.0.5"
- resolved "http://registry.npm.taobao.org/escape-string-regexp/download/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4"
-
-expand-brackets@^0.1.4:
- version "0.1.5"
- resolved "http://registry.npm.taobao.org/expand-brackets/download/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b"
- dependencies:
- is-posix-bracket "^0.1.0"
-
-expand-range@^1.8.1:
- version "1.8.2"
- resolved "http://registry.npm.taobao.org/expand-range/download/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337"
- dependencies:
- fill-range "^2.1.0"
-
-expand-tilde@^1.2.1, expand-tilde@^1.2.2:
- version "1.2.2"
- resolved "http://registry.npm.taobao.org/expand-tilde/download/expand-tilde-1.2.2.tgz#0b81eba897e5a3d31d1c3d102f8f01441e559449"
- dependencies:
- os-homedir "^1.0.1"
-
-extend@^3.0.0:
- version "3.0.0"
- resolved "http://registry.npm.taobao.org/extend/download/extend-3.0.0.tgz#5a474353b9f3353ddd8176dfd37b91c83a46f1d4"
-
-extglob@^0.3.1:
- version "0.3.2"
- resolved "http://registry.npm.taobao.org/extglob/download/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1"
- dependencies:
- is-extglob "^1.0.0"
-
-fancy-log@^1.1.0:
- version "1.3.0"
- resolved "http://registry.npm.taobao.org/fancy-log/download/fancy-log-1.3.0.tgz#45be17d02bb9917d60ccffd4995c999e6c8c9948"
- dependencies:
- chalk "^1.1.1"
- time-stamp "^1.0.0"
-
-filename-regex@^2.0.0:
- version "2.0.0"
- resolved "http://registry.npm.taobao.org/filename-regex/download/filename-regex-2.0.0.tgz#996e3e80479b98b9897f15a8a58b3d084e926775"
-
-fill-range@^2.1.0:
- version "2.2.3"
- resolved "http://registry.npm.taobao.org/fill-range/download/fill-range-2.2.3.tgz#50b77dfd7e469bc7492470963699fe7a8485a723"
- dependencies:
- is-number "^2.1.0"
- isobject "^2.0.0"
- randomatic "^1.1.3"
- repeat-element "^1.1.2"
- repeat-string "^1.5.2"
-
-find-index@^0.1.1:
- version "0.1.1"
- resolved "http://registry.npm.taobao.org/find-index/download/find-index-0.1.1.tgz#675d358b2ca3892d795a1ab47232f8b6e2e0dde4"
-
-findup-sync@^0.4.2:
- version "0.4.3"
- resolved "http://registry.npm.taobao.org/findup-sync/download/findup-sync-0.4.3.tgz#40043929e7bc60adf0b7f4827c4c6e75a0deca12"
- dependencies:
- detect-file "^0.1.0"
- is-glob "^2.0.1"
- micromatch "^2.3.7"
- resolve-dir "^0.1.0"
-
-fined@^1.0.1:
- version "1.0.2"
- resolved "http://registry.npm.taobao.org/fined/download/fined-1.0.2.tgz#5b28424b760d7598960b7ef8480dff8ad3660e97"
- dependencies:
- expand-tilde "^1.2.1"
- lodash.assignwith "^4.0.7"
- lodash.isempty "^4.2.1"
- lodash.isplainobject "^4.0.4"
- lodash.isstring "^4.0.1"
- lodash.pick "^4.2.1"
- parse-filepath "^1.0.1"
-
-first-chunk-stream@^1.0.0:
- version "1.0.0"
- resolved "http://registry.npm.taobao.org/first-chunk-stream/download/first-chunk-stream-1.0.0.tgz#59bfb50cd905f60d7c394cd3d9acaab4e6ad934e"
-
-flagged-respawn@^0.3.2:
- version "0.3.2"
- resolved "http://registry.npm.taobao.org/flagged-respawn/download/flagged-respawn-0.3.2.tgz#ff191eddcd7088a675b2610fffc976be9b8074b5"
-
-for-in@^1.0.1:
- version "1.0.2"
- resolved "http://registry.npm.taobao.org/for-in/download/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80"
-
-for-own@^0.1.4:
- version "0.1.5"
- resolved "http://registry.npm.taobao.org/for-own/download/for-own-0.1.5.tgz#5265c681a4f294dabbf17c9509b6763aa84510ce"
- dependencies:
- for-in "^1.0.1"
-
-fs-exists-sync@^0.1.0:
- version "0.1.0"
- resolved "http://registry.npm.taobao.org/fs-exists-sync/download/fs-exists-sync-0.1.0.tgz#982d6893af918e72d08dec9e8673ff2b5a8d6add"
-
-gaze@^0.5.1:
- version "0.5.2"
- resolved "http://registry.npm.taobao.org/gaze/download/gaze-0.5.2.tgz#40b709537d24d1d45767db5a908689dfe69ac44f"
- dependencies:
- globule "~0.1.0"
-
-glob-base@^0.3.0:
- version "0.3.0"
- resolved "http://registry.npm.taobao.org/glob-base/download/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4"
- dependencies:
- glob-parent "^2.0.0"
- is-glob "^2.0.0"
-
-glob-parent@^2.0.0:
- version "2.0.0"
- resolved "http://registry.npm.taobao.org/glob-parent/download/glob-parent-2.0.0.tgz#81383d72db054fcccf5336daa902f182f6edbb28"
- dependencies:
- is-glob "^2.0.0"
-
-glob-stream@^3.1.5:
- version "3.1.18"
- resolved "http://registry.npm.taobao.org/glob-stream/download/glob-stream-3.1.18.tgz#9170a5f12b790306fdfe598f313f8f7954fd143b"
- dependencies:
- glob "^4.3.1"
- glob2base "^0.0.12"
- minimatch "^2.0.1"
- ordered-read-streams "^0.1.0"
- through2 "^0.6.1"
- unique-stream "^1.0.0"
-
-glob-watcher@^0.0.6:
- version "0.0.6"
- resolved "http://registry.npm.taobao.org/glob-watcher/download/glob-watcher-0.0.6.tgz#b95b4a8df74b39c83298b0c05c978b4d9a3b710b"
- dependencies:
- gaze "^0.5.1"
-
-glob2base@^0.0.12:
- version "0.0.12"
- resolved "http://registry.npm.taobao.org/glob2base/download/glob2base-0.0.12.tgz#9d419b3e28f12e83a362164a277055922c9c0d56"
- dependencies:
- find-index "^0.1.1"
-
-glob@^4.3.1:
- version "4.5.3"
- resolved "http://registry.npm.taobao.org/glob/download/glob-4.5.3.tgz#c6cb73d3226c1efef04de3c56d012f03377ee15f"
- dependencies:
- inflight "^1.0.4"
- inherits "2"
- minimatch "^2.0.1"
- once "^1.3.0"
-
-glob@~3.1.21:
- version "3.1.21"
- resolved "http://registry.npm.taobao.org/glob/download/glob-3.1.21.tgz#d29e0a055dea5138f4d07ed40e8982e83c2066cd"
- dependencies:
- graceful-fs "~1.2.0"
- inherits "1"
- minimatch "~0.2.11"
-
-global-modules@^0.2.3:
- version "0.2.3"
- resolved "http://registry.npm.taobao.org/global-modules/download/global-modules-0.2.3.tgz#ea5a3bed42c6d6ce995a4f8a1269b5dae223828d"
- dependencies:
- global-prefix "^0.1.4"
- is-windows "^0.2.0"
-
-global-prefix@^0.1.4:
- version "0.1.5"
- resolved "http://registry.npm.taobao.org/global-prefix/download/global-prefix-0.1.5.tgz#8d3bc6b8da3ca8112a160d8d496ff0462bfef78f"
- dependencies:
- homedir-polyfill "^1.0.0"
- ini "^1.3.4"
- is-windows "^0.2.0"
- which "^1.2.12"
-
-globule@~0.1.0:
- version "0.1.0"
- resolved "http://registry.npm.taobao.org/globule/download/globule-0.1.0.tgz#d9c8edde1da79d125a151b79533b978676346ae5"
- dependencies:
- glob "~3.1.21"
- lodash "~1.0.1"
- minimatch "~0.2.11"
-
-glogg@^1.0.0:
- version "1.0.0"
- resolved "http://registry.npm.taobao.org/glogg/download/glogg-1.0.0.tgz#7fe0f199f57ac906cf512feead8f90ee4a284fc5"
- dependencies:
- sparkles "^1.0.0"
-
-graceful-fs@4.X:
- version "4.1.11"
- resolved "http://registry.npm.taobao.org/graceful-fs/download/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658"
-
-graceful-fs@^3.0.0:
- version "3.0.11"
- resolved "http://registry.npm.taobao.org/graceful-fs/download/graceful-fs-3.0.11.tgz#7613c778a1afea62f25c630a086d7f3acbbdd818"
- dependencies:
- natives "^1.1.0"
-
-graceful-fs@~1.2.0:
- version "1.2.3"
- resolved "http://registry.npm.taobao.org/graceful-fs/download/graceful-fs-1.2.3.tgz#15a4806a57547cb2d2dbf27f42e89a8c3451b364"
-
-"graceful-readlink@>= 1.0.0":
- version "1.0.1"
- resolved "http://registry.npm.taobao.org/graceful-readlink/download/graceful-readlink-1.0.1.tgz#4cafad76bc62f02fa039b2f94e9a3dd3a391a725"
-
-gulp-concat@^2.6.1:
- version "2.6.1"
- resolved "http://registry.npm.taobao.org/gulp-concat/download/gulp-concat-2.6.1.tgz#633d16c95d88504628ad02665663cee5a4793353"
- dependencies:
- concat-with-sourcemaps "^1.0.0"
- through2 "^2.0.0"
- vinyl "^2.0.0"
-
-gulp-minify-css@^1.2.4:
- version "1.2.4"
- resolved "http://registry.npm.taobao.org/gulp-minify-css/download/gulp-minify-css-1.2.4.tgz#b6164957602ea27f9e5ad88227695dd205778c06"
- dependencies:
- clean-css "^3.3.3"
- gulp-util "^3.0.5"
- object-assign "^4.0.1"
- readable-stream "^2.0.0"
- vinyl-bufferstream "^1.0.1"
- vinyl-sourcemaps-apply "^0.2.0"
-
-gulp-sourcemaps@^2.6.0:
- version "2.6.0"
- resolved "http://registry.npm.taobao.org/gulp-sourcemaps/download/gulp-sourcemaps-2.6.0.tgz#7ccce899a8a3bfca1593a3348d0fbf41dd3f51e5"
- dependencies:
- "@gulp-sourcemaps/identity-map" "1.X"
- "@gulp-sourcemaps/map-sources" "1.X"
- acorn "4.X"
- convert-source-map "1.X"
- css "2.X"
- debug-fabulous "0.1.X"
- detect-newline "2.X"
- graceful-fs "4.X"
- source-map "0.X"
- strip-bom-string "1.X"
- through2 "2.X"
- vinyl "1.X"
-
-gulp-uglify@^2.1.2:
- version "2.1.2"
- resolved "http://registry.npm.taobao.org/gulp-uglify/download/gulp-uglify-2.1.2.tgz#6db85b1d0ee63d18058592b658649d65c2ec4541"
- dependencies:
- gulplog "^1.0.0"
- has-gulplog "^0.1.0"
- lodash "^4.13.1"
- make-error-cause "^1.1.1"
- through2 "^2.0.0"
- uglify-js "~2.8.10"
- uglify-save-license "^0.4.1"
- vinyl-sourcemaps-apply "^0.2.0"
-
-gulp-util@^3.0.0, gulp-util@^3.0.5:
- version "3.0.8"
- resolved "http://registry.npm.taobao.org/gulp-util/download/gulp-util-3.0.8.tgz#0054e1e744502e27c04c187c3ecc505dd54bbb4f"
- dependencies:
- array-differ "^1.0.0"
- array-uniq "^1.0.2"
- beeper "^1.0.0"
- chalk "^1.0.0"
- dateformat "^2.0.0"
- fancy-log "^1.1.0"
- gulplog "^1.0.0"
- has-gulplog "^0.1.0"
- lodash._reescape "^3.0.0"
- lodash._reevaluate "^3.0.0"
- lodash._reinterpolate "^3.0.0"
- lodash.template "^3.0.0"
- minimist "^1.1.0"
- multipipe "^0.1.2"
- object-assign "^3.0.0"
- replace-ext "0.0.1"
- through2 "^2.0.0"
- vinyl "^0.5.0"
-
-gulp@^3.9.1:
- version "3.9.1"
- resolved "http://registry.npm.taobao.org/gulp/download/gulp-3.9.1.tgz#571ce45928dd40af6514fc4011866016c13845b4"
- dependencies:
- archy "^1.0.0"
- chalk "^1.0.0"
- deprecated "^0.0.1"
- gulp-util "^3.0.0"
- interpret "^1.0.0"
- liftoff "^2.1.0"
- minimist "^1.1.0"
- orchestrator "^0.3.0"
- pretty-hrtime "^1.0.0"
- semver "^4.1.0"
- tildify "^1.0.0"
- v8flags "^2.0.2"
- vinyl-fs "^0.3.0"
-
-gulplog@^1.0.0:
- version "1.0.0"
- resolved "http://registry.npm.taobao.org/gulplog/download/gulplog-1.0.0.tgz#e28c4d45d05ecbbed818363ce8f9c5926229ffe5"
- dependencies:
- glogg "^1.0.0"
-
-has-ansi@^2.0.0:
- version "2.0.0"
- resolved "http://registry.npm.taobao.org/has-ansi/download/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91"
- dependencies:
- ansi-regex "^2.0.0"
-
-has-gulplog@^0.1.0:
- version "0.1.0"
- resolved "http://registry.npm.taobao.org/has-gulplog/download/has-gulplog-0.1.0.tgz#6414c82913697da51590397dafb12f22967811ce"
- dependencies:
- sparkles "^1.0.0"
-
-homedir-polyfill@^1.0.0:
- version "1.0.1"
- resolved "http://registry.npm.taobao.org/homedir-polyfill/download/homedir-polyfill-1.0.1.tgz#4c2bbc8a758998feebf5ed68580f76d46768b4bc"
- dependencies:
- parse-passwd "^1.0.0"
-
-inflight@^1.0.4:
- version "1.0.6"
- resolved "http://registry.npm.taobao.org/inflight/download/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9"
- dependencies:
- once "^1.3.0"
- wrappy "1"
-
-inherits@1:
- version "1.0.2"
- resolved "http://registry.npm.taobao.org/inherits/download/inherits-1.0.2.tgz#ca4309dadee6b54cc0b8d247e8d7c7a0975bdc9b"
-
-inherits@2, inherits@^2.0.1, inherits@~2.0.1:
- version "2.0.3"
- resolved "http://registry.npm.taobao.org/inherits/download/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de"
-
-ini@^1.3.4:
- version "1.3.4"
- resolved "http://registry.npm.taobao.org/ini/download/ini-1.3.4.tgz#0537cb79daf59b59a1a517dff706c86ec039162e"
-
-interpret@^1.0.0:
- version "1.0.3"
- resolved "http://registry.npm.taobao.org/interpret/download/interpret-1.0.3.tgz#cbc35c62eeee73f19ab7b10a801511401afc0f90"
-
-is-absolute@^0.2.3:
- version "0.2.6"
- resolved "http://registry.npm.taobao.org/is-absolute/download/is-absolute-0.2.6.tgz#20de69f3db942ef2d87b9c2da36f172235b1b5eb"
- dependencies:
- is-relative "^0.2.1"
- is-windows "^0.2.0"
-
-is-buffer@^1.0.2:
- version "1.1.5"
- resolved "http://registry.npm.taobao.org/is-buffer/download/is-buffer-1.1.5.tgz#1f3b26ef613b214b88cbca23cc6c01d87961eecc"
-
-is-dotfile@^1.0.0:
- version "1.0.2"
- resolved "http://registry.npm.taobao.org/is-dotfile/download/is-dotfile-1.0.2.tgz#2c132383f39199f8edc268ca01b9b007d205cc4d"
-
-is-equal-shallow@^0.1.3:
- version "0.1.3"
- resolved "http://registry.npm.taobao.org/is-equal-shallow/download/is-equal-shallow-0.1.3.tgz#2238098fc221de0bcfa5d9eac4c45d638aa1c534"
- dependencies:
- is-primitive "^2.0.0"
-
-is-extendable@^0.1.1:
- version "0.1.1"
- resolved "http://registry.npm.taobao.org/is-extendable/download/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89"
-
-is-extglob@^1.0.0:
- version "1.0.0"
- resolved "http://registry.npm.taobao.org/is-extglob/download/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0"
-
-is-glob@^2.0.0, is-glob@^2.0.1:
- version "2.0.1"
- resolved "http://registry.npm.taobao.org/is-glob/download/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863"
- dependencies:
- is-extglob "^1.0.0"
-
-is-number@^2.0.2, is-number@^2.1.0:
- version "2.1.0"
- resolved "http://registry.npm.taobao.org/is-number/download/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f"
- dependencies:
- kind-of "^3.0.2"
-
-is-posix-bracket@^0.1.0:
- version "0.1.1"
- resolved "http://registry.npm.taobao.org/is-posix-bracket/download/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4"
-
-is-primitive@^2.0.0:
- version "2.0.0"
- resolved "http://registry.npm.taobao.org/is-primitive/download/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575"
-
-is-relative@^0.2.1:
- version "0.2.1"
- resolved "http://registry.npm.taobao.org/is-relative/download/is-relative-0.2.1.tgz#d27f4c7d516d175fb610db84bbeef23c3bc97aa5"
- dependencies:
- is-unc-path "^0.1.1"
-
-is-stream@^1.1.0:
- version "1.1.0"
- resolved "http://registry.npm.taobao.org/is-stream/download/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44"
-
-is-unc-path@^0.1.1:
- version "0.1.2"
- resolved "http://registry.npm.taobao.org/is-unc-path/download/is-unc-path-0.1.2.tgz#6ab053a72573c10250ff416a3814c35178af39b9"
- dependencies:
- unc-path-regex "^0.1.0"
-
-is-utf8@^0.2.0:
- version "0.2.1"
- resolved "http://registry.npm.taobao.org/is-utf8/download/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72"
-
-is-windows@^0.2.0:
- version "0.2.0"
- resolved "http://registry.npm.taobao.org/is-windows/download/is-windows-0.2.0.tgz#de1aa6d63ea29dd248737b69f1ff8b8002d2108c"
-
-isarray@0.0.1:
- version "0.0.1"
- resolved "http://registry.npm.taobao.org/isarray/download/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf"
-
-isarray@1.0.0, isarray@~1.0.0:
- version "1.0.0"
- resolved "http://registry.npm.taobao.org/isarray/download/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11"
-
-isexe@^2.0.0:
- version "2.0.0"
- resolved "http://registry.npm.taobao.org/isexe/download/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10"
-
-isobject@^2.0.0:
- version "2.1.0"
- resolved "http://registry.npm.taobao.org/isobject/download/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89"
- dependencies:
- isarray "1.0.0"
-
-kind-of@^3.0.2:
- version "3.1.0"
- resolved "http://registry.npm.taobao.org/kind-of/download/kind-of-3.1.0.tgz#475d698a5e49ff5e53d14e3e732429dc8bf4cf47"
- dependencies:
- is-buffer "^1.0.2"
-
-lazy-cache@^1.0.3:
- version "1.0.4"
- resolved "http://registry.npm.taobao.org/lazy-cache/download/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e"
-
-liftoff@^2.1.0:
- version "2.3.0"
- resolved "http://registry.npm.taobao.org/liftoff/download/liftoff-2.3.0.tgz#a98f2ff67183d8ba7cfaca10548bd7ff0550b385"
- dependencies:
- extend "^3.0.0"
- findup-sync "^0.4.2"
- fined "^1.0.1"
- flagged-respawn "^0.3.2"
- lodash.isplainobject "^4.0.4"
- lodash.isstring "^4.0.1"
- lodash.mapvalues "^4.4.0"
- rechoir "^0.6.2"
- resolve "^1.1.7"
-
-lodash._basecopy@^3.0.0:
- version "3.0.1"
- resolved "http://registry.npm.taobao.org/lodash._basecopy/download/lodash._basecopy-3.0.1.tgz#8da0e6a876cf344c0ad8a54882111dd3c5c7ca36"
-
-lodash._basetostring@^3.0.0:
- version "3.0.1"
- resolved "http://registry.npm.taobao.org/lodash._basetostring/download/lodash._basetostring-3.0.1.tgz#d1861d877f824a52f669832dcaf3ee15566a07d5"
-
-lodash._basevalues@^3.0.0:
- version "3.0.0"
- resolved "http://registry.npm.taobao.org/lodash._basevalues/download/lodash._basevalues-3.0.0.tgz#5b775762802bde3d3297503e26300820fdf661b7"
-
-lodash._getnative@^3.0.0:
- version "3.9.1"
- resolved "http://registry.npm.taobao.org/lodash._getnative/download/lodash._getnative-3.9.1.tgz#570bc7dede46d61cdcde687d65d3eecbaa3aaff5"
-
-lodash._isiterateecall@^3.0.0:
- version "3.0.9"
- resolved "http://registry.npm.taobao.org/lodash._isiterateecall/download/lodash._isiterateecall-3.0.9.tgz#5203ad7ba425fae842460e696db9cf3e6aac057c"
-
-lodash._reescape@^3.0.0:
- version "3.0.0"
- resolved "http://registry.npm.taobao.org/lodash._reescape/download/lodash._reescape-3.0.0.tgz#2b1d6f5dfe07c8a355753e5f27fac7f1cde1616a"
-
-lodash._reevaluate@^3.0.0:
- version "3.0.0"
- resolved "http://registry.npm.taobao.org/lodash._reevaluate/download/lodash._reevaluate-3.0.0.tgz#58bc74c40664953ae0b124d806996daca431e2ed"
-
-lodash._reinterpolate@^3.0.0:
- version "3.0.0"
- resolved "http://registry.npm.taobao.org/lodash._reinterpolate/download/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d"
-
-lodash._root@^3.0.0:
- version "3.0.1"
- resolved "http://registry.npm.taobao.org/lodash._root/download/lodash._root-3.0.1.tgz#fba1c4524c19ee9a5f8136b4609f017cf4ded692"
-
-lodash.assignwith@^4.0.7:
- version "4.2.0"
- resolved "http://registry.npm.taobao.org/lodash.assignwith/download/lodash.assignwith-4.2.0.tgz#127a97f02adc41751a954d24b0de17e100e038eb"
-
-lodash.escape@^3.0.0:
- version "3.2.0"
- resolved "http://registry.npm.taobao.org/lodash.escape/download/lodash.escape-3.2.0.tgz#995ee0dc18c1b48cc92effae71a10aab5b487698"
- dependencies:
- lodash._root "^3.0.0"
-
-lodash.isarguments@^3.0.0:
- version "3.1.0"
- resolved "http://registry.npm.taobao.org/lodash.isarguments/download/lodash.isarguments-3.1.0.tgz#2f573d85c6a24289ff00663b491c1d338ff3458a"
-
-lodash.isarray@^3.0.0:
- version "3.0.4"
- resolved "http://registry.npm.taobao.org/lodash.isarray/download/lodash.isarray-3.0.4.tgz#79e4eb88c36a8122af86f844aa9bcd851b5fbb55"
-
-lodash.isempty@^4.2.1:
- version "4.4.0"
- resolved "http://registry.npm.taobao.org/lodash.isempty/download/lodash.isempty-4.4.0.tgz#6f86cbedd8be4ec987be9aaf33c9684db1b31e7e"
-
-lodash.isplainobject@^4.0.4:
- version "4.0.6"
- resolved "http://registry.npm.taobao.org/lodash.isplainobject/download/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb"
-
-lodash.isstring@^4.0.1:
- version "4.0.1"
- resolved "http://registry.npm.taobao.org/lodash.isstring/download/lodash.isstring-4.0.1.tgz#d527dfb5456eca7cc9bb95d5daeaf88ba54a5451"
-
-lodash.keys@^3.0.0:
- version "3.1.2"
- resolved "http://registry.npm.taobao.org/lodash.keys/download/lodash.keys-3.1.2.tgz#4dbc0472b156be50a0b286855d1bd0b0c656098a"
- dependencies:
- lodash._getnative "^3.0.0"
- lodash.isarguments "^3.0.0"
- lodash.isarray "^3.0.0"
-
-lodash.mapvalues@^4.4.0:
- version "4.6.0"
- resolved "http://registry.npm.taobao.org/lodash.mapvalues/download/lodash.mapvalues-4.6.0.tgz#1bafa5005de9dd6f4f26668c30ca37230cc9689c"
-
-lodash.pick@^4.2.1:
- version "4.4.0"
- resolved "http://registry.npm.taobao.org/lodash.pick/download/lodash.pick-4.4.0.tgz#52f05610fff9ded422611441ed1fc123a03001b3"
-
-lodash.restparam@^3.0.0:
- version "3.6.1"
- resolved "http://registry.npm.taobao.org/lodash.restparam/download/lodash.restparam-3.6.1.tgz#936a4e309ef330a7645ed4145986c85ae5b20805"
-
-lodash.template@^3.0.0:
- version "3.6.2"
- resolved "http://registry.npm.taobao.org/lodash.template/download/lodash.template-3.6.2.tgz#f8cdecc6169a255be9098ae8b0c53d378931d14f"
- dependencies:
- lodash._basecopy "^3.0.0"
- lodash._basetostring "^3.0.0"
- lodash._basevalues "^3.0.0"
- lodash._isiterateecall "^3.0.0"
- lodash._reinterpolate "^3.0.0"
- lodash.escape "^3.0.0"
- lodash.keys "^3.0.0"
- lodash.restparam "^3.0.0"
- lodash.templatesettings "^3.0.0"
-
-lodash.templatesettings@^3.0.0:
- version "3.1.1"
- resolved "http://registry.npm.taobao.org/lodash.templatesettings/download/lodash.templatesettings-3.1.1.tgz#fb307844753b66b9f1afa54e262c745307dba8e5"
- dependencies:
- lodash._reinterpolate "^3.0.0"
- lodash.escape "^3.0.0"
-
-lodash@^4.13.1:
- version "4.17.4"
- resolved "http://registry.npm.taobao.org/lodash/download/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae"
-
-lodash@~1.0.1:
- version "1.0.2"
- resolved "http://registry.npm.taobao.org/lodash/download/lodash-1.0.2.tgz#8f57560c83b59fc270bd3d561b690043430e2551"
-
-longest@^1.0.1:
- version "1.0.1"
- resolved "http://registry.npm.taobao.org/longest/download/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097"
-
-lru-cache@2:
- version "2.7.3"
- resolved "http://registry.npm.taobao.org/lru-cache/download/lru-cache-2.7.3.tgz#6d4524e8b955f95d4f5b58851ce21dd72fb4e952"
-
-make-error-cause@^1.1.1:
- version "1.2.2"
- resolved "http://registry.npm.taobao.org/make-error-cause/download/make-error-cause-1.2.2.tgz#df0388fcd0b37816dff0a5fb8108939777dcbc9d"
- dependencies:
- make-error "^1.2.0"
-
-make-error@^1.2.0:
- version "1.2.3"
- resolved "http://registry.npm.taobao.org/make-error/download/make-error-1.2.3.tgz#6c4402df732e0977ac6faf754a5074b3d2b1d19d"
-
-map-cache@^0.2.0:
- version "0.2.2"
- resolved "http://registry.npm.taobao.org/map-cache/download/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf"
-
-micromatch@^2.3.7:
- version "2.3.11"
- resolved "http://registry.npm.taobao.org/micromatch/download/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565"
- dependencies:
- arr-diff "^2.0.0"
- array-unique "^0.2.1"
- braces "^1.8.2"
- expand-brackets "^0.1.4"
- extglob "^0.3.1"
- filename-regex "^2.0.0"
- is-extglob "^1.0.0"
- is-glob "^2.0.1"
- kind-of "^3.0.2"
- normalize-path "^2.0.1"
- object.omit "^2.0.0"
- parse-glob "^3.0.4"
- regex-cache "^0.4.2"
-
-minimatch@^2.0.1:
- version "2.0.10"
- resolved "http://registry.npm.taobao.org/minimatch/download/minimatch-2.0.10.tgz#8d087c39c6b38c001b97fca7ce6d0e1e80afbac7"
- dependencies:
- brace-expansion "^1.0.0"
-
-minimatch@~0.2.11:
- version "0.2.14"
- resolved "http://registry.npm.taobao.org/minimatch/download/minimatch-0.2.14.tgz#c74e780574f63c6f9a090e90efbe6ef53a6a756a"
- dependencies:
- lru-cache "2"
- sigmund "~1.0.0"
-
-minimist@0.0.8:
- version "0.0.8"
- resolved "http://registry.npm.taobao.org/minimist/download/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d"
-
-minimist@^1.1.0:
- version "1.2.0"
- resolved "http://registry.npm.taobao.org/minimist/download/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284"
-
-mkdirp@^0.5.0:
- version "0.5.1"
- resolved "http://registry.npm.taobao.org/mkdirp/download/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903"
- dependencies:
- minimist "0.0.8"
-
-ms@0.7.3:
- version "0.7.3"
- resolved "http://registry.npm.taobao.org/ms/download/ms-0.7.3.tgz#708155a5e44e33f5fd0fc53e81d0d40a91be1fff"
-
-multipipe@^0.1.2:
- version "0.1.2"
- resolved "http://registry.npm.taobao.org/multipipe/download/multipipe-0.1.2.tgz#2a8f2ddf70eed564dff2d57f1e1a137d9f05078b"
- dependencies:
- duplexer2 "0.0.2"
-
-natives@^1.1.0:
- version "1.1.0"
- resolved "http://registry.npm.taobao.org/natives/download/natives-1.1.0.tgz#e9ff841418a6b2ec7a495e939984f78f163e6e31"
-
-normalize-path@^2.0.1, normalize-path@^2.1.1:
- version "2.1.1"
- resolved "http://registry.npm.taobao.org/normalize-path/download/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9"
- dependencies:
- remove-trailing-separator "^1.0.1"
-
-object-assign@4.1.0:
- version "4.1.0"
- resolved "http://registry.npm.taobao.org/object-assign/download/object-assign-4.1.0.tgz#7a3b3d0e98063d43f4c03f2e8ae6cd51a86883a0"
-
-object-assign@^3.0.0:
- version "3.0.0"
- resolved "http://registry.npm.taobao.org/object-assign/download/object-assign-3.0.0.tgz#9bedd5ca0897949bca47e7ff408062d549f587f2"
-
-object-assign@^4.0.1:
- version "4.1.1"
- resolved "http://registry.npm.taobao.org/object-assign/download/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863"
-
-object.omit@^2.0.0:
- version "2.0.1"
- resolved "http://registry.npm.taobao.org/object.omit/download/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa"
- dependencies:
- for-own "^0.1.4"
- is-extendable "^0.1.1"
-
-once@^1.3.0, once@~1.3.0:
- version "1.3.3"
- resolved "http://registry.npm.taobao.org/once/download/once-1.3.3.tgz#b2e261557ce4c314ec8304f3fa82663e4297ca20"
- dependencies:
- wrappy "1"
-
-orchestrator@^0.3.0:
- version "0.3.8"
- resolved "http://registry.npm.taobao.org/orchestrator/download/orchestrator-0.3.8.tgz#14e7e9e2764f7315fbac184e506c7aa6df94ad7e"
- dependencies:
- end-of-stream "~0.1.5"
- sequencify "~0.0.7"
- stream-consume "~0.1.0"
-
-ordered-read-streams@^0.1.0:
- version "0.1.0"
- resolved "http://registry.npm.taobao.org/ordered-read-streams/download/ordered-read-streams-0.1.0.tgz#fd565a9af8eb4473ba69b6ed8a34352cb552f126"
-
-os-homedir@^1.0.0, os-homedir@^1.0.1:
- version "1.0.2"
- resolved "http://registry.npm.taobao.org/os-homedir/download/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3"
-
-parse-filepath@^1.0.1:
- version "1.0.1"
- resolved "http://registry.npm.taobao.org/parse-filepath/download/parse-filepath-1.0.1.tgz#159d6155d43904d16c10ef698911da1e91969b73"
- dependencies:
- is-absolute "^0.2.3"
- map-cache "^0.2.0"
- path-root "^0.1.1"
-
-parse-glob@^3.0.4:
- version "3.0.4"
- resolved "http://registry.npm.taobao.org/parse-glob/download/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c"
- dependencies:
- glob-base "^0.3.0"
- is-dotfile "^1.0.0"
- is-extglob "^1.0.0"
- is-glob "^2.0.0"
-
-parse-passwd@^1.0.0:
- version "1.0.0"
- resolved "http://registry.npm.taobao.org/parse-passwd/download/parse-passwd-1.0.0.tgz#6d5b934a456993b23d37f40a382d6f1666a8e5c6"
-
-path-parse@^1.0.5:
- version "1.0.5"
- resolved "http://registry.npm.taobao.org/path-parse/download/path-parse-1.0.5.tgz#3c1adf871ea9cd6c9431b6ea2bd74a0ff055c4c1"
-
-path-root-regex@^0.1.0:
- version "0.1.2"
- resolved "http://registry.npm.taobao.org/path-root-regex/download/path-root-regex-0.1.2.tgz#bfccdc8df5b12dc52c8b43ec38d18d72c04ba96d"
-
-path-root@^0.1.1:
- version "0.1.1"
- resolved "http://registry.npm.taobao.org/path-root/download/path-root-0.1.1.tgz#9a4a6814cac1c0cd73360a95f32083c8ea4745b7"
- dependencies:
- path-root-regex "^0.1.0"
-
-preserve@^0.2.0:
- version "0.2.0"
- resolved "http://registry.npm.taobao.org/preserve/download/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b"
-
-pretty-hrtime@^1.0.0:
- version "1.0.3"
- resolved "http://registry.npm.taobao.org/pretty-hrtime/download/pretty-hrtime-1.0.3.tgz#b7e3ea42435a4c9b2759d99e0f201eb195802ee1"
-
-process-nextick-args@^1.0.6, process-nextick-args@~1.0.6:
- version "1.0.7"
- resolved "http://registry.npm.taobao.org/process-nextick-args/download/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3"
-
-randomatic@^1.1.3:
- version "1.1.6"
- resolved "http://registry.npm.taobao.org/randomatic/download/randomatic-1.1.6.tgz#110dcabff397e9dcff7c0789ccc0a49adf1ec5bb"
- dependencies:
- is-number "^2.0.2"
- kind-of "^3.0.2"
-
-"readable-stream@>=1.0.33-1 <1.1.0-0":
- version "1.0.34"
- resolved "http://registry.npm.taobao.org/readable-stream/download/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c"
- dependencies:
- core-util-is "~1.0.0"
- inherits "~2.0.1"
- isarray "0.0.1"
- string_decoder "~0.10.x"
-
-readable-stream@^1.0.33, readable-stream@~1.1.9:
- version "1.1.14"
- resolved "http://registry.npm.taobao.org/readable-stream/download/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9"
- dependencies:
- core-util-is "~1.0.0"
- inherits "~2.0.1"
- isarray "0.0.1"
- string_decoder "~0.10.x"
-
-readable-stream@^2.0.0, readable-stream@^2.1.5:
- version "2.2.9"
- resolved "http://registry.npm.taobao.org/readable-stream/download/readable-stream-2.2.9.tgz#cf78ec6f4a6d1eb43d26488cac97f042e74b7fc8"
- dependencies:
- buffer-shims "~1.0.0"
- core-util-is "~1.0.0"
- inherits "~2.0.1"
- isarray "~1.0.0"
- process-nextick-args "~1.0.6"
- string_decoder "~1.0.0"
- util-deprecate "~1.0.1"
-
-rechoir@^0.6.2:
- version "0.6.2"
- resolved "http://registry.npm.taobao.org/rechoir/download/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384"
- dependencies:
- resolve "^1.1.6"
-
-regex-cache@^0.4.2:
- version "0.4.3"
- resolved "http://registry.npm.taobao.org/regex-cache/download/regex-cache-0.4.3.tgz#9b1a6c35d4d0dfcef5711ae651e8e9d3d7114145"
- dependencies:
- is-equal-shallow "^0.1.3"
- is-primitive "^2.0.0"
-
-remove-trailing-separator@^1.0.1:
- version "1.0.1"
- resolved "http://registry.npm.taobao.org/remove-trailing-separator/download/remove-trailing-separator-1.0.1.tgz#615ebb96af559552d4bf4057c8436d486ab63cc4"
-
-repeat-element@^1.1.2:
- version "1.1.2"
- resolved "http://registry.npm.taobao.org/repeat-element/download/repeat-element-1.1.2.tgz#ef089a178d1483baae4d93eb98b4f9e4e11d990a"
-
-repeat-string@^1.5.2:
- version "1.6.1"
- resolved "http://registry.npm.taobao.org/repeat-string/download/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637"
-
-replace-ext@0.0.1:
- version "0.0.1"
- resolved "http://registry.npm.taobao.org/replace-ext/download/replace-ext-0.0.1.tgz#29bbd92078a739f0bcce2b4ee41e837953522924"
-
-replace-ext@^1.0.0:
- version "1.0.0"
- resolved "http://registry.npm.taobao.org/replace-ext/download/replace-ext-1.0.0.tgz#de63128373fcbf7c3ccfa4de5a480c45a67958eb"
-
-resolve-dir@^0.1.0:
- version "0.1.1"
- resolved "http://registry.npm.taobao.org/resolve-dir/download/resolve-dir-0.1.1.tgz#b219259a5602fac5c5c496ad894a6e8cc430261e"
- dependencies:
- expand-tilde "^1.2.2"
- global-modules "^0.2.3"
-
-resolve-url@~0.2.1:
- version "0.2.1"
- resolved "http://registry.npm.taobao.org/resolve-url/download/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a"
-
-resolve@^1.1.6, resolve@^1.1.7:
- version "1.3.3"
- resolved "http://registry.npm.taobao.org/resolve/download/resolve-1.3.3.tgz#655907c3469a8680dc2de3a275a8fdd69691f0e5"
- dependencies:
- path-parse "^1.0.5"
-
-right-align@^0.1.1:
- version "0.1.3"
- resolved "http://registry.npm.taobao.org/right-align/download/right-align-0.1.3.tgz#61339b722fe6a3515689210d24e14c96148613ef"
- dependencies:
- align-text "^0.1.1"
-
-semver@^4.1.0:
- version "4.3.6"
- resolved "http://registry.npm.taobao.org/semver/download/semver-4.3.6.tgz#300bc6e0e86374f7ba61068b5b1ecd57fc6532da"
-
-sequencify@~0.0.7:
- version "0.0.7"
- resolved "http://registry.npm.taobao.org/sequencify/download/sequencify-0.0.7.tgz#90cff19d02e07027fd767f5ead3e7b95d1e7380c"
-
-sigmund@~1.0.0:
- version "1.0.1"
- resolved "http://registry.npm.taobao.org/sigmund/download/sigmund-1.0.1.tgz#3ff21f198cad2175f9f3b781853fd94d0d19b590"
-
-source-map-resolve@^0.3.0:
- version "0.3.1"
- resolved "http://registry.npm.taobao.org/source-map-resolve/download/source-map-resolve-0.3.1.tgz#610f6122a445b8dd51535a2a71b783dfc1248761"
- dependencies:
- atob "~1.1.0"
- resolve-url "~0.2.1"
- source-map-url "~0.3.0"
- urix "~0.1.0"
-
-source-map-url@~0.3.0:
- version "0.3.0"
- resolved "http://registry.npm.taobao.org/source-map-url/download/source-map-url-0.3.0.tgz#7ecaf13b57bcd09da8a40c5d269db33799d4aaf9"
-
-source-map@0.4.x:
- version "0.4.4"
- resolved "http://registry.npm.taobao.org/source-map/download/source-map-0.4.4.tgz#eba4f5da9c0dc999de68032d8b4f76173652036b"
- dependencies:
- amdefine ">=0.0.4"
-
-source-map@0.X, source-map@^0.5.1, source-map@^0.5.6, source-map@~0.5.1:
- version "0.5.6"
- resolved "http://registry.npm.taobao.org/source-map/download/source-map-0.5.6.tgz#75ce38f52bf0733c5a7f0c118d81334a2bb5f412"
-
-source-map@^0.1.38:
- version "0.1.43"
- resolved "http://registry.npm.taobao.org/source-map/download/source-map-0.1.43.tgz#c24bc146ca517c1471f5dacbe2571b2b7f9e3346"
- dependencies:
- amdefine ">=0.0.4"
-
-sparkles@^1.0.0:
- version "1.0.0"
- resolved "http://registry.npm.taobao.org/sparkles/download/sparkles-1.0.0.tgz#1acbbfb592436d10bbe8f785b7cc6f82815012c3"
-
-stream-consume@~0.1.0:
- version "0.1.0"
- resolved "http://registry.npm.taobao.org/stream-consume/download/stream-consume-0.1.0.tgz#a41ead1a6d6081ceb79f65b061901b6d8f3d1d0f"
-
-string_decoder@~0.10.x:
- version "0.10.31"
- resolved "http://registry.npm.taobao.org/string_decoder/download/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94"
-
-string_decoder@~1.0.0:
- version "1.0.0"
- resolved "http://registry.npm.taobao.org/string_decoder/download/string_decoder-1.0.0.tgz#f06f41157b664d86069f84bdbdc9b0d8ab281667"
- dependencies:
- buffer-shims "~1.0.0"
-
-strip-ansi@^3.0.0:
- version "3.0.1"
- resolved "http://registry.npm.taobao.org/strip-ansi/download/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf"
- dependencies:
- ansi-regex "^2.0.0"
-
-strip-bom-string@1.X:
- version "1.0.0"
- resolved "http://registry.npm.taobao.org/strip-bom-string/download/strip-bom-string-1.0.0.tgz#e5211e9224369fbb81d633a2f00044dc8cedad92"
-
-strip-bom@^1.0.0:
- version "1.0.0"
- resolved "http://registry.npm.taobao.org/strip-bom/download/strip-bom-1.0.0.tgz#85b8862f3844b5a6d5ec8467a93598173a36f794"
- dependencies:
- first-chunk-stream "^1.0.0"
- is-utf8 "^0.2.0"
-
-supports-color@^2.0.0:
- version "2.0.0"
- resolved "http://registry.npm.taobao.org/supports-color/download/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7"
-
-through2@2.X, through2@^2.0.0, through2@^2.0.1, through2@^2.0.3:
- version "2.0.3"
- resolved "http://registry.npm.taobao.org/through2/download/through2-2.0.3.tgz#0004569b37c7c74ba39c43f3ced78d1ad94140be"
- dependencies:
- readable-stream "^2.1.5"
- xtend "~4.0.1"
-
-through2@^0.6.1:
- version "0.6.5"
- resolved "http://registry.npm.taobao.org/through2/download/through2-0.6.5.tgz#41ab9c67b29d57209071410e1d7a7a968cd3ad48"
- dependencies:
- readable-stream ">=1.0.33-1 <1.1.0-0"
- xtend ">=4.0.0 <4.1.0-0"
-
-tildify@^1.0.0:
- version "1.2.0"
- resolved "http://registry.npm.taobao.org/tildify/download/tildify-1.2.0.tgz#dcec03f55dca9b7aa3e5b04f21817eb56e63588a"
- dependencies:
- os-homedir "^1.0.0"
-
-time-stamp@^1.0.0:
- version "1.0.1"
- resolved "http://registry.npm.taobao.org/time-stamp/download/time-stamp-1.0.1.tgz#9f4bd23559c9365966f3302dbba2b07c6b99b151"
-
-uglify-js@~2.8.10:
- version "2.8.22"
- resolved "http://registry.npm.taobao.org/uglify-js/download/uglify-js-2.8.22.tgz#d54934778a8da14903fa29a326fb24c0ab51a1a0"
- dependencies:
- source-map "~0.5.1"
- yargs "~3.10.0"
- optionalDependencies:
- uglify-to-browserify "~1.0.0"
-
-uglify-save-license@^0.4.1:
- version "0.4.1"
- resolved "http://registry.npm.taobao.org/uglify-save-license/download/uglify-save-license-0.4.1.tgz#95726c17cc6fd171c3617e3bf4d8d82aa8c4cce1"
-
-uglify-to-browserify@~1.0.0:
- version "1.0.2"
- resolved "http://registry.npm.taobao.org/uglify-to-browserify/download/uglify-to-browserify-1.0.2.tgz#6e0924d6bda6b5afe349e39a6d632850a0f882b7"
-
-unc-path-regex@^0.1.0:
- version "0.1.2"
- resolved "http://registry.npm.taobao.org/unc-path-regex/download/unc-path-regex-0.1.2.tgz#e73dd3d7b0d7c5ed86fbac6b0ae7d8c6a69d50fa"
-
-unique-stream@^1.0.0:
- version "1.0.0"
- resolved "http://registry.npm.taobao.org/unique-stream/download/unique-stream-1.0.0.tgz#d59a4a75427447d9aa6c91e70263f8d26a4b104b"
-
-urix@^0.1.0, urix@~0.1.0:
- version "0.1.0"
- resolved "http://registry.npm.taobao.org/urix/download/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72"
-
-user-home@^1.1.1:
- version "1.1.1"
- resolved "http://registry.npm.taobao.org/user-home/download/user-home-1.1.1.tgz#2b5be23a32b63a7c9deb8d0f28d485724a3df190"
-
-util-deprecate@~1.0.1:
- version "1.0.2"
- resolved "http://registry.npm.taobao.org/util-deprecate/download/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
-
-v8flags@^2.0.2:
- version "2.1.1"
- resolved "http://registry.npm.taobao.org/v8flags/download/v8flags-2.1.1.tgz#aab1a1fa30d45f88dd321148875ac02c0b55e5b4"
- dependencies:
- user-home "^1.1.1"
-
-vinyl-bufferstream@^1.0.1:
- version "1.0.1"
- resolved "http://registry.npm.taobao.org/vinyl-bufferstream/download/vinyl-bufferstream-1.0.1.tgz#0537869f580effa4ca45acb47579e4b9fe63081a"
- dependencies:
- bufferstreams "1.0.1"
-
-vinyl-fs@^0.3.0:
- version "0.3.14"
- resolved "http://registry.npm.taobao.org/vinyl-fs/download/vinyl-fs-0.3.14.tgz#9a6851ce1cac1c1cea5fe86c0931d620c2cfa9e6"
- dependencies:
- defaults "^1.0.0"
- glob-stream "^3.1.5"
- glob-watcher "^0.0.6"
- graceful-fs "^3.0.0"
- mkdirp "^0.5.0"
- strip-bom "^1.0.0"
- through2 "^0.6.1"
- vinyl "^0.4.0"
-
-vinyl-sourcemaps-apply@^0.2.0:
- version "0.2.1"
- resolved "http://registry.npm.taobao.org/vinyl-sourcemaps-apply/download/vinyl-sourcemaps-apply-0.2.1.tgz#ab6549d61d172c2b1b87be5c508d239c8ef87705"
- dependencies:
- source-map "^0.5.1"
-
-vinyl@1.X:
- version "1.2.0"
- resolved "http://registry.npm.taobao.org/vinyl/download/vinyl-1.2.0.tgz#5c88036cf565e5df05558bfc911f8656df218884"
- dependencies:
- clone "^1.0.0"
- clone-stats "^0.0.1"
- replace-ext "0.0.1"
-
-vinyl@^0.4.0:
- version "0.4.6"
- resolved "http://registry.npm.taobao.org/vinyl/download/vinyl-0.4.6.tgz#2f356c87a550a255461f36bbeb2a5ba8bf784847"
- dependencies:
- clone "^0.2.0"
- clone-stats "^0.0.1"
-
-vinyl@^0.5.0:
- version "0.5.3"
- resolved "http://registry.npm.taobao.org/vinyl/download/vinyl-0.5.3.tgz#b0455b38fc5e0cf30d4325132e461970c2091cde"
- dependencies:
- clone "^1.0.0"
- clone-stats "^0.0.1"
- replace-ext "0.0.1"
-
-vinyl@^2.0.0:
- version "2.0.2"
- resolved "http://registry.npm.taobao.org/vinyl/download/vinyl-2.0.2.tgz#0a3713d8d4e9221c58f10ca16c0116c9e25eda7c"
- dependencies:
- clone "^1.0.0"
- clone-buffer "^1.0.0"
- clone-stats "^1.0.0"
- cloneable-readable "^1.0.0"
- is-stream "^1.1.0"
- remove-trailing-separator "^1.0.1"
- replace-ext "^1.0.0"
-
-which@^1.2.12:
- version "1.2.14"
- resolved "http://registry.npm.taobao.org/which/download/which-1.2.14.tgz#9a87c4378f03e827cecaf1acdf56c736c01c14e5"
- dependencies:
- isexe "^2.0.0"
-
-window-size@0.1.0:
- version "0.1.0"
- resolved "http://registry.npm.taobao.org/window-size/download/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94f9c9d"
-
-wordwrap@0.0.2:
- version "0.0.2"
- resolved "http://registry.npm.taobao.org/wordwrap/download/wordwrap-0.0.2.tgz#b79669bb42ecb409f83d583cad52ca17eaa1643f"
-
-wrappy@1:
- version "1.0.2"
- resolved "http://registry.npm.taobao.org/wrappy/download/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
-
-"xtend@>=4.0.0 <4.1.0-0", xtend@~4.0.1:
- version "4.0.1"
- resolved "http://registry.npm.taobao.org/xtend/download/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af"
-
-yargs@~3.10.0:
- version "3.10.0"
- resolved "http://registry.npm.taobao.org/yargs/download/yargs-3.10.0.tgz#f7ee7bd857dd7c1d2d38c0e74efbd681d1431fd1"
- dependencies:
- camelcase "^1.0.2"
- cliui "^2.1.0"
- decamelize "^1.0.0"
- window-size "0.1.0"
diff --git a/vendor/github.com/bradfitz/goimports/LICENSE b/vendor/github.com/bradfitz/goimports/LICENSE
deleted file mode 100644
index 65d761b..0000000
--- a/vendor/github.com/bradfitz/goimports/LICENSE
+++ /dev/null
@@ -1,27 +0,0 @@
-Copyright (c) 2013 The Go Authors. All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are
-met:
-
- * Redistributions of source code must retain the above copyright
-notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
-copyright notice, this list of conditions and the following disclaimer
-in the documentation and/or other materials provided with the
-distribution.
- * Neither the name of Google Inc. nor the names of its
-contributors may be used to endorse or promote products derived from
-this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/vendor/github.com/bradfitz/goimports/README b/vendor/github.com/bradfitz/goimports/README
deleted file mode 100644
index b362bd2..0000000
--- a/vendor/github.com/bradfitz/goimports/README
+++ /dev/null
@@ -1,17 +0,0 @@
-This tool updates your Go import lines, adding missing ones and
-removing unreferenced ones.
-
- $ go get golang.org/x/tools/cmd/goimports
-
- Note the new location. This project has moved to the official
- go.tools repo. Pull requests here will no longer be accepted.
- Please use the Go process: http://golang.org/doc/contribute.html
-
-It acts the same as gofmt (same flags, etc) but in addition to code
-formatting, also fixes imports.
-
-See usage and editor integration notes, now moved elsewhere:
-
- http://godoc.org/golang.org/x/tools/cmd/goimports
-
-Happy hacking!
diff --git a/vendor/github.com/bradfitz/goimports/goimports.go b/vendor/github.com/bradfitz/goimports/goimports.go
deleted file mode 100644
index a008d82..0000000
--- a/vendor/github.com/bradfitz/goimports/goimports.go
+++ /dev/null
@@ -1,195 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-import (
- "bytes"
- "flag"
- "fmt"
- "go/scanner"
- "io"
- "io/ioutil"
- "os"
- "os/exec"
- "path/filepath"
- "runtime"
- "strings"
-
- "golang.org/x/tools/imports"
-)
-
-var (
- // main operation modes
- list = flag.Bool("l", false, "list files whose formatting differs from goimport's")
- write = flag.Bool("w", false, "write result to (source) file instead of stdout")
- doDiff = flag.Bool("d", false, "display diffs instead of rewriting files")
-
- options = &imports.Options{
- TabWidth: 8,
- TabIndent: true,
- Comments: true,
- Fragment: true,
- }
- exitCode = 0
-)
-
-func init() {
- flag.BoolVar(&options.AllErrors, "e", false, "report all errors (not just the first 10 on different lines)")
-}
-
-func report(err error) {
- scanner.PrintError(os.Stderr, err)
- exitCode = 2
-}
-
-func usage() {
- fmt.Fprintf(os.Stderr, "usage: goimports [flags] [path ...]\n")
- flag.PrintDefaults()
- os.Exit(2)
-}
-
-func isGoFile(f os.FileInfo) bool {
- // ignore non-Go files
- name := f.Name()
- return !f.IsDir() && !strings.HasPrefix(name, ".") && strings.HasSuffix(name, ".go")
-}
-
-func processFile(filename string, in io.Reader, out io.Writer, stdin bool) error {
- opt := options
- if stdin {
- nopt := *options
- nopt.Fragment = true
- opt = &nopt
- }
-
- if in == nil {
- f, err := os.Open(filename)
- if err != nil {
- return err
- }
- defer f.Close()
- in = f
- }
-
- src, err := ioutil.ReadAll(in)
- if err != nil {
- return err
- }
-
- res, err := imports.Process(filename, src, opt)
- if err != nil {
- return err
- }
-
- if !bytes.Equal(src, res) {
- // formatting has changed
- if *list {
- fmt.Fprintln(out, filename)
- }
- if *write {
- err = ioutil.WriteFile(filename, res, 0)
- if err != nil {
- return err
- }
- }
- if *doDiff {
- data, err := diff(src, res)
- if err != nil {
- return fmt.Errorf("computing diff: %s", err)
- }
- fmt.Printf("diff %s gofmt/%s\n", filename, filename)
- out.Write(data)
- }
- }
-
- if !*list && !*write && !*doDiff {
- _, err = out.Write(res)
- }
-
- return err
-}
-
-func visitFile(path string, f os.FileInfo, err error) error {
- if err == nil && isGoFile(f) {
- err = processFile(path, nil, os.Stdout, false)
- }
- if err != nil {
- report(err)
- }
- return nil
-}
-
-func walkDir(path string) {
- filepath.Walk(path, visitFile)
-}
-
-func main() {
- runtime.GOMAXPROCS(runtime.NumCPU())
-
- // call gofmtMain in a separate function
- // so that it can use defer and have them
- // run before the exit.
- gofmtMain()
- os.Exit(exitCode)
-}
-
-func gofmtMain() {
- flag.Usage = usage
- flag.Parse()
-
- if options.TabWidth < 0 {
- fmt.Fprintf(os.Stderr, "negative tabwidth %d\n", options.TabWidth)
- exitCode = 2
- return
- }
-
- if flag.NArg() == 0 {
- if err := processFile("", os.Stdin, os.Stdout, true); err != nil {
- report(err)
- }
- return
- }
-
- for i := 0; i < flag.NArg(); i++ {
- path := flag.Arg(i)
- switch dir, err := os.Stat(path); {
- case err != nil:
- report(err)
- case dir.IsDir():
- walkDir(path)
- default:
- if err := processFile(path, nil, os.Stdout, false); err != nil {
- report(err)
- }
- }
- }
-}
-
-func diff(b1, b2 []byte) (data []byte, err error) {
- f1, err := ioutil.TempFile("", "gofmt")
- if err != nil {
- return
- }
- defer os.Remove(f1.Name())
- defer f1.Close()
-
- f2, err := ioutil.TempFile("", "gofmt")
- if err != nil {
- return
- }
- defer os.Remove(f2.Name())
- defer f2.Close()
-
- f1.Write(b1)
- f2.Write(b2)
-
- data, err = exec.Command("diff", "-u", f1.Name(), f2.Name()).CombinedOutput()
- if len(data) > 0 {
- // diff exits with a non-zero status when the files don't match.
- // Ignore that failure as long as we get output.
- err = nil
- }
- return
-}
diff --git a/vendor/github.com/go-fsnotify/fsnotify/AUTHORS b/vendor/github.com/go-fsnotify/fsnotify/AUTHORS
deleted file mode 100644
index 4e0e828..0000000
--- a/vendor/github.com/go-fsnotify/fsnotify/AUTHORS
+++ /dev/null
@@ -1,34 +0,0 @@
-# Names should be added to this file as
-# Name or Organization
-# The email address is not required for organizations.
-
-# You can update this list using the following command:
-#
-# $ git shortlog -se | awk '{print $2 " " $3 " " $4}'
-
-# Please keep the list sorted.
-
-Adrien Bustany
-Caleb Spare
-Case Nelson
-Chris Howey
-Christoffer Buchholz
-Dave Cheney
-Francisco Souza
-Hari haran
-John C Barstow
-Kelvin Fo
-Matt Layher
-Nathan Youngman
-Paul Hammond
-Pieter Droogendijk
-Pursuit92
-Rob Figueiredo
-Soge Zhang
-Tilak Sharma
-Travis Cline
-Tudor Golubenco
-Yukang
-bronze1man
-debrando
-henrikedwards
diff --git a/vendor/github.com/go-fsnotify/fsnotify/CHANGELOG.md b/vendor/github.com/go-fsnotify/fsnotify/CHANGELOG.md
deleted file mode 100644
index ea9428a..0000000
--- a/vendor/github.com/go-fsnotify/fsnotify/CHANGELOG.md
+++ /dev/null
@@ -1,263 +0,0 @@
-# Changelog
-
-## v1.2.0 / 2015-02-08
-
-* inotify: use epoll to wake up readEvents [#66](https://github.com/go-fsnotify/fsnotify/pull/66) (thanks @PieterD)
-* inotify: closing watcher should now always shut down goroutine [#63](https://github.com/go-fsnotify/fsnotify/pull/63) (thanks @PieterD)
-* kqueue: close kqueue after removing watches, fixes [#59](https://github.com/go-fsnotify/fsnotify/issues/59)
-
-## v1.1.1 / 2015-02-05
-
-* inotify: Retry read on EINTR [#61](https://github.com/go-fsnotify/fsnotify/issues/61) (thanks @PieterD)
-
-## v1.1.0 / 2014-12-12
-
-* kqueue: rework internals [#43](https://github.com/go-fsnotify/fsnotify/pull/43)
- * add low-level functions
- * only need to store flags on directories
- * less mutexes [#13](https://github.com/go-fsnotify/fsnotify/issues/13)
- * done can be an unbuffered channel
- * remove calls to os.NewSyscallError
-* More efficient string concatenation for Event.String() [#52](https://github.com/go-fsnotify/fsnotify/pull/52) (thanks @mdlayher)
-* kqueue: fix regression in rework causing subdirectories to be watched [#48](https://github.com/go-fsnotify/fsnotify/issues/48)
-* kqueue: cleanup internal watch before sending remove event [#51](https://github.com/go-fsnotify/fsnotify/issues/51)
-
-## v1.0.4 / 2014-09-07
-
-* kqueue: add dragonfly to the build tags.
-* Rename source code files, rearrange code so exported APIs are at the top.
-* Add done channel to example code. [#37](https://github.com/go-fsnotify/fsnotify/pull/37) (thanks @chenyukang)
-
-## v1.0.3 / 2014-08-19
-
-* [Fix] Windows MOVED_TO now translates to Create like on BSD and Linux. [#36](https://github.com/go-fsnotify/fsnotify/issues/36)
-
-## v1.0.2 / 2014-08-17
-
-* [Fix] Missing create events on OS X. [#14](https://github.com/go-fsnotify/fsnotify/issues/14) (thanks @zhsso)
-* [Fix] Make ./path and path equivalent. (thanks @zhsso)
-
-## v1.0.0 / 2014-08-15
-
-* [API] Remove AddWatch on Windows, use Add.
-* Improve documentation for exported identifiers. [#30](https://github.com/go-fsnotify/fsnotify/issues/30)
-* Minor updates based on feedback from golint.
-
-## dev / 2014-07-09
-
-* Moved to [github.com/go-fsnotify/fsnotify](https://github.com/go-fsnotify/fsnotify).
-* Use os.NewSyscallError instead of returning errno (thanks @hariharan-uno)
-
-## dev / 2014-07-04
-
-* kqueue: fix incorrect mutex used in Close()
-* Update example to demonstrate usage of Op.
-
-## dev / 2014-06-28
-
-* [API] Don't set the Write Op for attribute notifications [#4](https://github.com/go-fsnotify/fsnotify/issues/4)
-* Fix for String() method on Event (thanks Alex Brainman)
-* Don't build on Plan 9 or Solaris (thanks @4ad)
-
-## dev / 2014-06-21
-
-* Events channel of type Event rather than *Event.
-* [internal] use syscall constants directly for inotify and kqueue.
-* [internal] kqueue: rename events to kevents and fileEvent to event.
-
-## dev / 2014-06-19
-
-* Go 1.3+ required on Windows (uses syscall.ERROR_MORE_DATA internally).
-* [internal] remove cookie from Event struct (unused).
-* [internal] Event struct has the same definition across every OS.
-* [internal] remove internal watch and removeWatch methods.
-
-## dev / 2014-06-12
-
-* [API] Renamed Watch() to Add() and RemoveWatch() to Remove().
-* [API] Pluralized channel names: Events and Errors.
-* [API] Renamed FileEvent struct to Event.
-* [API] Op constants replace methods like IsCreate().
-
-## dev / 2014-06-12
-
-* Fix data race on kevent buffer (thanks @tilaks) [#98](https://github.com/howeyc/fsnotify/pull/98)
-
-## dev / 2014-05-23
-
-* [API] Remove current implementation of WatchFlags.
- * current implementation doesn't take advantage of OS for efficiency
- * provides little benefit over filtering events as they are received, but has extra bookkeeping and mutexes
- * no tests for the current implementation
- * not fully implemented on Windows [#93](https://github.com/howeyc/fsnotify/issues/93#issuecomment-39285195)
-
-## v0.9.3 / 2014-12-31
-
-* kqueue: cleanup internal watch before sending remove event [#51](https://github.com/go-fsnotify/fsnotify/issues/51)
-
-## v0.9.2 / 2014-08-17
-
-* [Backport] Fix missing create events on OS X. [#14](https://github.com/go-fsnotify/fsnotify/issues/14) (thanks @zhsso)
-
-## v0.9.1 / 2014-06-12
-
-* Fix data race on kevent buffer (thanks @tilaks) [#98](https://github.com/howeyc/fsnotify/pull/98)
-
-## v0.9.0 / 2014-01-17
-
-* IsAttrib() for events that only concern a file's metadata [#79][] (thanks @abustany)
-* [Fix] kqueue: fix deadlock [#77][] (thanks @cespare)
-* [NOTICE] Development has moved to `code.google.com/p/go.exp/fsnotify` in preparation for inclusion in the Go standard library.
-
-## v0.8.12 / 2013-11-13
-
-* [API] Remove FD_SET and friends from Linux adapter
-
-## v0.8.11 / 2013-11-02
-
-* [Doc] Add Changelog [#72][] (thanks @nathany)
-* [Doc] Spotlight and double modify events on OS X [#62][] (reported by @paulhammond)
-
-## v0.8.10 / 2013-10-19
-
-* [Fix] kqueue: remove file watches when parent directory is removed [#71][] (reported by @mdwhatcott)
-* [Fix] kqueue: race between Close and readEvents [#70][] (reported by @bernerdschaefer)
-* [Doc] specify OS-specific limits in README (thanks @debrando)
-
-## v0.8.9 / 2013-09-08
-
-* [Doc] Contributing (thanks @nathany)
-* [Doc] update package path in example code [#63][] (thanks @paulhammond)
-* [Doc] GoCI badge in README (Linux only) [#60][]
-* [Doc] Cross-platform testing with Vagrant [#59][] (thanks @nathany)
-
-## v0.8.8 / 2013-06-17
-
-* [Fix] Windows: handle `ERROR_MORE_DATA` on Windows [#49][] (thanks @jbowtie)
-
-## v0.8.7 / 2013-06-03
-
-* [API] Make syscall flags internal
-* [Fix] inotify: ignore event changes
-* [Fix] race in symlink test [#45][] (reported by @srid)
-* [Fix] tests on Windows
-* lower case error messages
-
-## v0.8.6 / 2013-05-23
-
-* kqueue: Use EVT_ONLY flag on Darwin
-* [Doc] Update README with full example
-
-## v0.8.5 / 2013-05-09
-
-* [Fix] inotify: allow monitoring of "broken" symlinks (thanks @tsg)
-
-## v0.8.4 / 2013-04-07
-
-* [Fix] kqueue: watch all file events [#40][] (thanks @ChrisBuchholz)
-
-## v0.8.3 / 2013-03-13
-
-* [Fix] inoitfy/kqueue memory leak [#36][] (reported by @nbkolchin)
-* [Fix] kqueue: use fsnFlags for watching a directory [#33][] (reported by @nbkolchin)
-
-## v0.8.2 / 2013-02-07
-
-* [Doc] add Authors
-* [Fix] fix data races for map access [#29][] (thanks @fsouza)
-
-## v0.8.1 / 2013-01-09
-
-* [Fix] Windows path separators
-* [Doc] BSD License
-
-## v0.8.0 / 2012-11-09
-
-* kqueue: directory watching improvements (thanks @vmirage)
-* inotify: add `IN_MOVED_TO` [#25][] (requested by @cpisto)
-* [Fix] kqueue: deleting watched directory [#24][] (reported by @jakerr)
-
-## v0.7.4 / 2012-10-09
-
-* [Fix] inotify: fixes from https://codereview.appspot.com/5418045/ (ugorji)
-* [Fix] kqueue: preserve watch flags when watching for delete [#21][] (reported by @robfig)
-* [Fix] kqueue: watch the directory even if it isn't a new watch (thanks @robfig)
-* [Fix] kqueue: modify after recreation of file
-
-## v0.7.3 / 2012-09-27
-
-* [Fix] kqueue: watch with an existing folder inside the watched folder (thanks @vmirage)
-* [Fix] kqueue: no longer get duplicate CREATE events
-
-## v0.7.2 / 2012-09-01
-
-* kqueue: events for created directories
-
-## v0.7.1 / 2012-07-14
-
-* [Fix] for renaming files
-
-## v0.7.0 / 2012-07-02
-
-* [Feature] FSNotify flags
-* [Fix] inotify: Added file name back to event path
-
-## v0.6.0 / 2012-06-06
-
-* kqueue: watch files after directory created (thanks @tmc)
-
-## v0.5.1 / 2012-05-22
-
-* [Fix] inotify: remove all watches before Close()
-
-## v0.5.0 / 2012-05-03
-
-* [API] kqueue: return errors during watch instead of sending over channel
-* kqueue: match symlink behavior on Linux
-* inotify: add `DELETE_SELF` (requested by @taralx)
-* [Fix] kqueue: handle EINTR (reported by @robfig)
-* [Doc] Godoc example [#1][] (thanks @davecheney)
-
-## v0.4.0 / 2012-03-30
-
-* Go 1 released: build with go tool
-* [Feature] Windows support using winfsnotify
-* Windows does not have attribute change notifications
-* Roll attribute notifications into IsModify
-
-## v0.3.0 / 2012-02-19
-
-* kqueue: add files when watch directory
-
-## v0.2.0 / 2011-12-30
-
-* update to latest Go weekly code
-
-## v0.1.0 / 2011-10-19
-
-* kqueue: add watch on file creation to match inotify
-* kqueue: create file event
-* inotify: ignore `IN_IGNORED` events
-* event String()
-* linux: common FileEvent functions
-* initial commit
-
-[#79]: https://github.com/howeyc/fsnotify/pull/79
-[#77]: https://github.com/howeyc/fsnotify/pull/77
-[#72]: https://github.com/howeyc/fsnotify/issues/72
-[#71]: https://github.com/howeyc/fsnotify/issues/71
-[#70]: https://github.com/howeyc/fsnotify/issues/70
-[#63]: https://github.com/howeyc/fsnotify/issues/63
-[#62]: https://github.com/howeyc/fsnotify/issues/62
-[#60]: https://github.com/howeyc/fsnotify/issues/60
-[#59]: https://github.com/howeyc/fsnotify/issues/59
-[#49]: https://github.com/howeyc/fsnotify/issues/49
-[#45]: https://github.com/howeyc/fsnotify/issues/45
-[#40]: https://github.com/howeyc/fsnotify/issues/40
-[#36]: https://github.com/howeyc/fsnotify/issues/36
-[#33]: https://github.com/howeyc/fsnotify/issues/33
-[#29]: https://github.com/howeyc/fsnotify/issues/29
-[#25]: https://github.com/howeyc/fsnotify/issues/25
-[#24]: https://github.com/howeyc/fsnotify/issues/24
-[#21]: https://github.com/howeyc/fsnotify/issues/21
-
diff --git a/vendor/github.com/go-fsnotify/fsnotify/CONTRIBUTING.md b/vendor/github.com/go-fsnotify/fsnotify/CONTRIBUTING.md
deleted file mode 100644
index 0f377f3..0000000
--- a/vendor/github.com/go-fsnotify/fsnotify/CONTRIBUTING.md
+++ /dev/null
@@ -1,77 +0,0 @@
-# Contributing
-
-## Issues
-
-* Request features and report bugs using the [GitHub Issue Tracker](https://github.com/go-fsnotify/fsnotify/issues).
-* Please indicate the platform you are using fsnotify on.
-* A code example to reproduce the problem is appreciated.
-
-## Pull Requests
-
-### Contributor License Agreement
-
-fsnotify is derived from code in the [golang.org/x/exp](https://godoc.org/golang.org/x/exp) package and it may be included [in the standard library](https://github.com/go-fsnotify/fsnotify/issues/1) in the future. Therefore fsnotify carries the same [LICENSE](https://github.com/go-fsnotify/fsnotify/blob/master/LICENSE) as Go. Contributors retain their copyright, so you need to fill out a short form before we can accept your contribution: [Google Individual Contributor License Agreement](https://developers.google.com/open-source/cla/individual).
-
-Please indicate that you have signed the CLA in your pull request.
-
-### How fsnotify is Developed
-
-* Development is done on feature branches.
-* Tests are run on BSD, Linux, OS X and Windows.
-* Pull requests are reviewed and [applied to master][am] using [hub][].
- * Maintainers may modify or squash commits rather than asking contributors to.
-* To issue a new release, the maintainers will:
- * Update the CHANGELOG
- * Tag a version, which will become available through gopkg.in.
-
-### How to Fork
-
-For smooth sailing, always use the original import path. Installing with `go get` makes this easy.
-
-1. Install from GitHub (`go get -u github.com/go-fsnotify/fsnotify`)
-2. Create your feature branch (`git checkout -b my-new-feature`)
-3. Ensure everything works and the tests pass (see below)
-4. Commit your changes (`git commit -am 'Add some feature'`)
-
-Contribute upstream:
-
-1. Fork fsnotify on GitHub
-2. Add your remote (`git remote add fork git@github.com:mycompany/repo.git`)
-3. Push to the branch (`git push fork my-new-feature`)
-4. Create a new Pull Request on GitHub
-
-This workflow is [thoroughly explained by Katrina Owen](https://blog.splice.com/contributing-open-source-git-repositories-go/).
-
-### Testing
-
-fsnotify uses build tags to compile different code on Linux, BSD, OS X, and Windows.
-
-Before doing a pull request, please do your best to test your changes on multiple platforms, and list which platforms you were able/unable to test on.
-
-To aid in cross-platform testing there is a Vagrantfile for Linux and BSD.
-
-* Install [Vagrant](http://www.vagrantup.com/) and [VirtualBox](https://www.virtualbox.org/)
-* Setup [Vagrant Gopher](https://github.com/nathany/vagrant-gopher) in your `src` folder.
-* Run `vagrant up` from the project folder. You can also setup just one box with `vagrant up linux` or `vagrant up bsd` (note: the BSD box doesn't support Windows hosts at this time, and NFS may prompt for your host OS password)
-* Once setup, you can run the test suite on a given OS with a single command `vagrant ssh linux -c 'cd go-fsnotify/fsnotify; go test'`.
-* When you're done, you will want to halt or destroy the Vagrant boxes.
-
-Notice: fsnotify file system events won't trigger in shared folders. The tests get around this limitation by using the /tmp directory.
-
-Right now there is no equivalent solution for Windows and OS X, but there are Windows VMs [freely available from Microsoft](http://www.modern.ie/en-us/virtualization-tools#downloads).
-
-### Maintainers
-
-Help maintaining fsnotify is welcome. To be a maintainer:
-
-* Submit a pull request and sign the CLA as above.
-* You must be able to run the test suite on Mac, Windows, Linux and BSD.
-
-To keep master clean, the fsnotify project uses the "apply mail" workflow outlined in Nathaniel Talbott's post ["Merge pull request" Considered Harmful][am]. This requires installing [hub][].
-
-All code changes should be internal pull requests.
-
-Releases are tagged using [Semantic Versioning](http://semver.org/).
-
-[hub]: https://github.com/github/hub
-[am]: http://blog.spreedly.com/2014/06/24/merge-pull-request-considered-harmful/#.VGa5yZPF_Zs
diff --git a/vendor/github.com/go-fsnotify/fsnotify/LICENSE b/vendor/github.com/go-fsnotify/fsnotify/LICENSE
deleted file mode 100644
index f21e540..0000000
--- a/vendor/github.com/go-fsnotify/fsnotify/LICENSE
+++ /dev/null
@@ -1,28 +0,0 @@
-Copyright (c) 2012 The Go Authors. All rights reserved.
-Copyright (c) 2012 fsnotify Authors. All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are
-met:
-
- * Redistributions of source code must retain the above copyright
-notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
-copyright notice, this list of conditions and the following disclaimer
-in the documentation and/or other materials provided with the
-distribution.
- * Neither the name of Google Inc. nor the names of its
-contributors may be used to endorse or promote products derived from
-this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/vendor/github.com/go-fsnotify/fsnotify/NotUsed.xcworkspace b/vendor/github.com/go-fsnotify/fsnotify/NotUsed.xcworkspace
deleted file mode 100644
index e69de29..0000000
diff --git a/vendor/github.com/go-fsnotify/fsnotify/README.md b/vendor/github.com/go-fsnotify/fsnotify/README.md
deleted file mode 100644
index c497a0f..0000000
--- a/vendor/github.com/go-fsnotify/fsnotify/README.md
+++ /dev/null
@@ -1,64 +0,0 @@
-# File system notifications for Go
-
-[![Coverage](http://gocover.io/_badge/github.com/go-fsnotify/fsnotify)](http://gocover.io/github.com/go-fsnotify/fsnotify) [![GoDoc](https://godoc.org/gopkg.in/fsnotify.v1?status.svg)](https://godoc.org/gopkg.in/fsnotify.v1)
-
-Go 1.3+ required.
-
-Cross platform: Windows, Linux, BSD and OS X.
-
-|Adapter |OS |Status |
-|----------|----------|----------|
-|inotify |Linux, Android\*|Supported [![Build Status](https://travis-ci.org/go-fsnotify/fsnotify.svg?branch=master)](https://travis-ci.org/go-fsnotify/fsnotify)|
-|kqueue |BSD, OS X, iOS\*|Supported [![Circle CI](https://circleci.com/gh/go-fsnotify/fsnotify.svg?style=svg)](https://circleci.com/gh/go-fsnotify/fsnotify)|
-|ReadDirectoryChangesW|Windows|Supported [![Build status](https://ci.appveyor.com/api/projects/status/ivwjubaih4r0udeh/branch/master?svg=true)](https://ci.appveyor.com/project/NathanYoungman/fsnotify/branch/master)|
-|FSEvents |OS X |[Planned](https://github.com/go-fsnotify/fsnotify/issues/11)|
-|FEN |Solaris 11 |[Planned](https://github.com/go-fsnotify/fsnotify/issues/12)|
-|fanotify |Linux 2.6.37+ | |
-|USN Journals |Windows |[Maybe](https://github.com/go-fsnotify/fsnotify/issues/53)|
-|Polling |*All* |[Maybe](https://github.com/go-fsnotify/fsnotify/issues/9)|
-
-\* Android and iOS are untested.
-
-Please see [the documentation](https://godoc.org/gopkg.in/fsnotify.v1) for usage. Consult the [Wiki](https://github.com/go-fsnotify/fsnotify/wiki) for the FAQ and further information.
-
-## API stability
-
-Two major versions of fsnotify exist.
-
-**[fsnotify.v0](https://gopkg.in/fsnotify.v0)** is API-compatible with [howeyc/fsnotify](https://godoc.org/github.com/howeyc/fsnotify). Bugfixes *may* be backported, but I recommend upgrading to v1.
-
-```go
-import "gopkg.in/fsnotify.v0"
-```
-
-\* Refer to the package as fsnotify (without the .v0 suffix).
-
-**[fsnotify.v1](https://gopkg.in/fsnotify.v1)** provides [a new API](https://godoc.org/gopkg.in/fsnotify.v1) based on [this design document](http://goo.gl/MrYxyA). You can import v1 with:
-
-```go
-import "gopkg.in/fsnotify.v1"
-```
-
-Further API changes are [planned](https://github.com/go-fsnotify/fsnotify/milestones), but a new major revision will be tagged, so you can depend on the v1 API.
-
-**Master** may have unreleased changes. Use it to test the very latest code or when [contributing][], but don't expect it to remain API-compatible:
-
-```go
-import "github.com/go-fsnotify/fsnotify"
-```
-
-## Contributing
-
-Please refer to [CONTRIBUTING][] before opening an issue or pull request.
-
-## Example
-
-See [example_test.go](https://github.com/go-fsnotify/fsnotify/blob/master/example_test.go).
-
-[contributing]: https://github.com/go-fsnotify/fsnotify/blob/master/CONTRIBUTING.md
-
-## Related Projects
-
-* [notify](https://github.com/rjeczalik/notify)
-* [fsevents](https://github.com/go-fsnotify/fsevents)
-
diff --git a/vendor/github.com/go-fsnotify/fsnotify/circle.yml b/vendor/github.com/go-fsnotify/fsnotify/circle.yml
deleted file mode 100644
index 204217f..0000000
--- a/vendor/github.com/go-fsnotify/fsnotify/circle.yml
+++ /dev/null
@@ -1,26 +0,0 @@
-## OS X build (CircleCI iOS beta)
-
-# Pretend like it's an Xcode project, at least to get it running.
-machine:
- environment:
- XCODE_WORKSPACE: NotUsed.xcworkspace
- XCODE_SCHEME: NotUsed
- # This is where the go project is actually checked out to:
- CIRCLE_BUILD_DIR: $HOME/.go_project/src/github.com/go-fsnotify/fsnotify
-
-dependencies:
- pre:
- - brew upgrade go
-
-test:
- override:
- - go test ./...
-
-# Idealized future config, eventually with cross-platform build matrix :-)
-
-# machine:
-# go:
-# version: 1.4
-# os:
-# - osx
-# - linux
diff --git a/vendor/github.com/go-fsnotify/fsnotify/fsnotify.go b/vendor/github.com/go-fsnotify/fsnotify/fsnotify.go
deleted file mode 100644
index c899ee0..0000000
--- a/vendor/github.com/go-fsnotify/fsnotify/fsnotify.go
+++ /dev/null
@@ -1,62 +0,0 @@
-// Copyright 2012 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build !plan9,!solaris
-
-// Package fsnotify provides a platform-independent interface for file system notifications.
-package fsnotify
-
-import (
- "bytes"
- "fmt"
-)
-
-// Event represents a single file system notification.
-type Event struct {
- Name string // Relative path to the file or directory.
- Op Op // File operation that triggered the event.
-}
-
-// Op describes a set of file operations.
-type Op uint32
-
-// These are the generalized file operations that can trigger a notification.
-const (
- Create Op = 1 << iota
- Write
- Remove
- Rename
- Chmod
-)
-
-// String returns a string representation of the event in the form
-// "file: REMOVE|WRITE|..."
-func (e Event) String() string {
- // Use a buffer for efficient string concatenation
- var buffer bytes.Buffer
-
- if e.Op&Create == Create {
- buffer.WriteString("|CREATE")
- }
- if e.Op&Remove == Remove {
- buffer.WriteString("|REMOVE")
- }
- if e.Op&Write == Write {
- buffer.WriteString("|WRITE")
- }
- if e.Op&Rename == Rename {
- buffer.WriteString("|RENAME")
- }
- if e.Op&Chmod == Chmod {
- buffer.WriteString("|CHMOD")
- }
-
- // If buffer remains empty, return no event names
- if buffer.Len() == 0 {
- return fmt.Sprintf("%q: ", e.Name)
- }
-
- // Return a list of event names, with leading pipe character stripped
- return fmt.Sprintf("%q: %s", e.Name, buffer.String()[1:])
-}
diff --git a/vendor/github.com/go-fsnotify/fsnotify/inotify.go b/vendor/github.com/go-fsnotify/fsnotify/inotify.go
deleted file mode 100644
index d7759ec..0000000
--- a/vendor/github.com/go-fsnotify/fsnotify/inotify.go
+++ /dev/null
@@ -1,306 +0,0 @@
-// Copyright 2010 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build linux
-
-package fsnotify
-
-import (
- "errors"
- "fmt"
- "io"
- "os"
- "path/filepath"
- "strings"
- "sync"
- "syscall"
- "unsafe"
-)
-
-// Watcher watches a set of files, delivering events to a channel.
-type Watcher struct {
- Events chan Event
- Errors chan error
- mu sync.Mutex // Map access
- fd int
- poller *fdPoller
- watches map[string]*watch // Map of inotify watches (key: path)
- paths map[int]string // Map of watched paths (key: watch descriptor)
- done chan struct{} // Channel for sending a "quit message" to the reader goroutine
- doneResp chan struct{} // Channel to respond to Close
-}
-
-// NewWatcher establishes a new watcher with the underlying OS and begins waiting for events.
-func NewWatcher() (*Watcher, error) {
- // Create inotify fd
- fd, errno := syscall.InotifyInit()
- if fd == -1 {
- return nil, errno
- }
- // Create epoll
- poller, err := newFdPoller(fd)
- if err != nil {
- syscall.Close(fd)
- return nil, err
- }
- w := &Watcher{
- fd: fd,
- poller: poller,
- watches: make(map[string]*watch),
- paths: make(map[int]string),
- Events: make(chan Event),
- Errors: make(chan error),
- done: make(chan struct{}),
- doneResp: make(chan struct{}),
- }
-
- go w.readEvents()
- return w, nil
-}
-
-func (w *Watcher) isClosed() bool {
- select {
- case <-w.done:
- return true
- default:
- return false
- }
-}
-
-// Close removes all watches and closes the events channel.
-func (w *Watcher) Close() error {
- if w.isClosed() {
- return nil
- }
-
- // Send 'close' signal to goroutine, and set the Watcher to closed.
- close(w.done)
-
- // Wake up goroutine
- w.poller.wake()
-
- // Wait for goroutine to close
- <-w.doneResp
-
- return nil
-}
-
-// Add starts watching the named file or directory (non-recursively).
-func (w *Watcher) Add(name string) error {
- name = filepath.Clean(name)
- if w.isClosed() {
- return errors.New("inotify instance already closed")
- }
-
- const agnosticEvents = syscall.IN_MOVED_TO | syscall.IN_MOVED_FROM |
- syscall.IN_CREATE | syscall.IN_ATTRIB | syscall.IN_MODIFY |
- syscall.IN_MOVE_SELF | syscall.IN_DELETE | syscall.IN_DELETE_SELF
-
- var flags uint32 = agnosticEvents
-
- w.mu.Lock()
- watchEntry, found := w.watches[name]
- w.mu.Unlock()
- if found {
- watchEntry.flags |= flags
- flags |= syscall.IN_MASK_ADD
- }
- wd, errno := syscall.InotifyAddWatch(w.fd, name, flags)
- if wd == -1 {
- return errno
- }
-
- w.mu.Lock()
- w.watches[name] = &watch{wd: uint32(wd), flags: flags}
- w.paths[wd] = name
- w.mu.Unlock()
-
- return nil
-}
-
-// Remove stops watching the named file or directory (non-recursively).
-func (w *Watcher) Remove(name string) error {
- name = filepath.Clean(name)
-
- // Fetch the watch.
- w.mu.Lock()
- defer w.mu.Unlock()
- watch, ok := w.watches[name]
-
- // Remove it from inotify.
- if !ok {
- return fmt.Errorf("can't remove non-existent inotify watch for: %s", name)
- }
- // inotify_rm_watch will return EINVAL if the file has been deleted;
- // the inotify will already have been removed.
- // That means we can safely delete it from our watches, whatever inotify_rm_watch does.
- delete(w.watches, name)
- success, errno := syscall.InotifyRmWatch(w.fd, watch.wd)
- if success == -1 {
- // TODO: Perhaps it's not helpful to return an error here in every case.
- // the only two possible errors are:
- // EBADF, which happens when w.fd is not a valid file descriptor of any kind.
- // EINVAL, which is when fd is not an inotify descriptor or wd is not a valid watch descriptor.
- // Watch descriptors are invalidated when they are removed explicitly or implicitly;
- // explicitly by inotify_rm_watch, implicitly when the file they are watching is deleted.
- return errno
- }
- return nil
-}
-
-type watch struct {
- wd uint32 // Watch descriptor (as returned by the inotify_add_watch() syscall)
- flags uint32 // inotify flags of this watch (see inotify(7) for the list of valid flags)
-}
-
-// readEvents reads from the inotify file descriptor, converts the
-// received events into Event objects and sends them via the Events channel
-func (w *Watcher) readEvents() {
- var (
- buf [syscall.SizeofInotifyEvent * 4096]byte // Buffer for a maximum of 4096 raw events
- n int // Number of bytes read with read()
- errno error // Syscall errno
- ok bool // For poller.wait
- )
-
- defer close(w.doneResp)
- defer close(w.Errors)
- defer close(w.Events)
- defer syscall.Close(w.fd)
- defer w.poller.close()
-
- for {
- // See if we have been closed.
- if w.isClosed() {
- return
- }
-
- ok, errno = w.poller.wait()
- if errno != nil {
- select {
- case w.Errors <- errno:
- case <-w.done:
- return
- }
- continue
- }
-
- if !ok {
- continue
- }
-
- n, errno = syscall.Read(w.fd, buf[:])
- // If a signal interrupted execution, see if we've been asked to close, and try again.
- // http://man7.org/linux/man-pages/man7/signal.7.html :
- // "Before Linux 3.8, reads from an inotify(7) file descriptor were not restartable"
- if errno == syscall.EINTR {
- continue
- }
-
- // syscall.Read might have been woken up by Close. If so, we're done.
- if w.isClosed() {
- return
- }
-
- if n < syscall.SizeofInotifyEvent {
- var err error
- if n == 0 {
- // If EOF is received. This should really never happen.
- err = io.EOF
- } else if n < 0 {
- // If an error occured while reading.
- err = errno
- } else {
- // Read was too short.
- err = errors.New("notify: short read in readEvents()")
- }
- select {
- case w.Errors <- err:
- case <-w.done:
- return
- }
- continue
- }
-
- var offset uint32
- // We don't know how many events we just read into the buffer
- // While the offset points to at least one whole event...
- for offset <= uint32(n-syscall.SizeofInotifyEvent) {
- // Point "raw" to the event in the buffer
- raw := (*syscall.InotifyEvent)(unsafe.Pointer(&buf[offset]))
-
- mask := uint32(raw.Mask)
- nameLen := uint32(raw.Len)
- // If the event happened to the watched directory or the watched file, the kernel
- // doesn't append the filename to the event, but we would like to always fill the
- // the "Name" field with a valid filename. We retrieve the path of the watch from
- // the "paths" map.
- w.mu.Lock()
- name := w.paths[int(raw.Wd)]
- w.mu.Unlock()
- if nameLen > 0 {
- // Point "bytes" at the first byte of the filename
- bytes := (*[syscall.PathMax]byte)(unsafe.Pointer(&buf[offset+syscall.SizeofInotifyEvent]))
- // The filename is padded with NULL bytes. TrimRight() gets rid of those.
- name += "/" + strings.TrimRight(string(bytes[0:nameLen]), "\000")
- }
-
- event := newEvent(name, mask)
-
- // Send the events that are not ignored on the events channel
- if !event.ignoreLinux(mask) {
- select {
- case w.Events <- event:
- case <-w.done:
- return
- }
- }
-
- // Move to the next event in the buffer
- offset += syscall.SizeofInotifyEvent + nameLen
- }
- }
-}
-
-// Certain types of events can be "ignored" and not sent over the Events
-// channel. Such as events marked ignore by the kernel, or MODIFY events
-// against files that do not exist.
-func (e *Event) ignoreLinux(mask uint32) bool {
- // Ignore anything the inotify API says to ignore
- if mask&syscall.IN_IGNORED == syscall.IN_IGNORED {
- return true
- }
-
- // If the event is not a DELETE or RENAME, the file must exist.
- // Otherwise the event is ignored.
- // *Note*: this was put in place because it was seen that a MODIFY
- // event was sent after the DELETE. This ignores that MODIFY and
- // assumes a DELETE will come or has come if the file doesn't exist.
- if !(e.Op&Remove == Remove || e.Op&Rename == Rename) {
- _, statErr := os.Lstat(e.Name)
- return os.IsNotExist(statErr)
- }
- return false
-}
-
-// newEvent returns an platform-independent Event based on an inotify mask.
-func newEvent(name string, mask uint32) Event {
- e := Event{Name: name}
- if mask&syscall.IN_CREATE == syscall.IN_CREATE || mask&syscall.IN_MOVED_TO == syscall.IN_MOVED_TO {
- e.Op |= Create
- }
- if mask&syscall.IN_DELETE_SELF == syscall.IN_DELETE_SELF || mask&syscall.IN_DELETE == syscall.IN_DELETE {
- e.Op |= Remove
- }
- if mask&syscall.IN_MODIFY == syscall.IN_MODIFY {
- e.Op |= Write
- }
- if mask&syscall.IN_MOVE_SELF == syscall.IN_MOVE_SELF || mask&syscall.IN_MOVED_FROM == syscall.IN_MOVED_FROM {
- e.Op |= Rename
- }
- if mask&syscall.IN_ATTRIB == syscall.IN_ATTRIB {
- e.Op |= Chmod
- }
- return e
-}
diff --git a/vendor/github.com/go-fsnotify/fsnotify/inotify_poller.go b/vendor/github.com/go-fsnotify/fsnotify/inotify_poller.go
deleted file mode 100644
index 3b41784..0000000
--- a/vendor/github.com/go-fsnotify/fsnotify/inotify_poller.go
+++ /dev/null
@@ -1,186 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build linux
-
-package fsnotify
-
-import (
- "errors"
- "syscall"
-)
-
-type fdPoller struct {
- fd int // File descriptor (as returned by the inotify_init() syscall)
- epfd int // Epoll file descriptor
- pipe [2]int // Pipe for waking up
-}
-
-func emptyPoller(fd int) *fdPoller {
- poller := new(fdPoller)
- poller.fd = fd
- poller.epfd = -1
- poller.pipe[0] = -1
- poller.pipe[1] = -1
- return poller
-}
-
-// Create a new inotify poller.
-// This creates an inotify handler, and an epoll handler.
-func newFdPoller(fd int) (*fdPoller, error) {
- var errno error
- poller := emptyPoller(fd)
- defer func() {
- if errno != nil {
- poller.close()
- }
- }()
- poller.fd = fd
-
- // Create epoll fd
- poller.epfd, errno = syscall.EpollCreate(1)
- if poller.epfd == -1 {
- return nil, errno
- }
- // Create pipe; pipe[0] is the read end, pipe[1] the write end.
- errno = syscall.Pipe2(poller.pipe[:], syscall.O_NONBLOCK)
- if errno != nil {
- return nil, errno
- }
-
- // Register inotify fd with epoll
- event := syscall.EpollEvent{
- Fd: int32(poller.fd),
- Events: syscall.EPOLLIN,
- }
- errno = syscall.EpollCtl(poller.epfd, syscall.EPOLL_CTL_ADD, poller.fd, &event)
- if errno != nil {
- return nil, errno
- }
-
- // Register pipe fd with epoll
- event = syscall.EpollEvent{
- Fd: int32(poller.pipe[0]),
- Events: syscall.EPOLLIN,
- }
- errno = syscall.EpollCtl(poller.epfd, syscall.EPOLL_CTL_ADD, poller.pipe[0], &event)
- if errno != nil {
- return nil, errno
- }
-
- return poller, nil
-}
-
-// Wait using epoll.
-// Returns true if something is ready to be read,
-// false if there is not.
-func (poller *fdPoller) wait() (bool, error) {
- // 3 possible events per fd, and 2 fds, makes a maximum of 6 events.
- // I don't know whether epoll_wait returns the number of events returned,
- // or the total number of events ready.
- // I decided to catch both by making the buffer one larger than the maximum.
- events := make([]syscall.EpollEvent, 7)
- for {
- n, errno := syscall.EpollWait(poller.epfd, events, -1)
- if n == -1 {
- if errno == syscall.EINTR {
- continue
- }
- return false, errno
- }
- if n == 0 {
- // If there are no events, try again.
- continue
- }
- if n > 6 {
- // This should never happen. More events were returned than should be possible.
- return false, errors.New("epoll_wait returned more events than I know what to do with")
- }
- ready := events[:n]
- epollhup := false
- epollerr := false
- epollin := false
- for _, event := range ready {
- if event.Fd == int32(poller.fd) {
- if event.Events&syscall.EPOLLHUP != 0 {
- // This should not happen, but if it does, treat it as a wakeup.
- epollhup = true
- }
- if event.Events&syscall.EPOLLERR != 0 {
- // If an error is waiting on the file descriptor, we should pretend
- // something is ready to read, and let syscall.Read pick up the error.
- epollerr = true
- }
- if event.Events&syscall.EPOLLIN != 0 {
- // There is data to read.
- epollin = true
- }
- }
- if event.Fd == int32(poller.pipe[0]) {
- if event.Events&syscall.EPOLLHUP != 0 {
- // Write pipe descriptor was closed, by us. This means we're closing down the
- // watcher, and we should wake up.
- }
- if event.Events&syscall.EPOLLERR != 0 {
- // If an error is waiting on the pipe file descriptor.
- // This is an absolute mystery, and should never ever happen.
- return false, errors.New("Error on the pipe descriptor.")
- }
- if event.Events&syscall.EPOLLIN != 0 {
- // This is a regular wakeup, so we have to clear the buffer.
- err := poller.clearWake()
- if err != nil {
- return false, err
- }
- }
- }
- }
-
- if epollhup || epollerr || epollin {
- return true, nil
- }
- return false, nil
- }
-}
-
-// Close the write end of the poller.
-func (poller *fdPoller) wake() error {
- buf := make([]byte, 1)
- n, errno := syscall.Write(poller.pipe[1], buf)
- if n == -1 {
- if errno == syscall.EAGAIN {
- // Buffer is full, poller will wake.
- return nil
- }
- return errno
- }
- return nil
-}
-
-func (poller *fdPoller) clearWake() error {
- // You have to be woken up a LOT in order to get to 100!
- buf := make([]byte, 100)
- n, errno := syscall.Read(poller.pipe[0], buf)
- if n == -1 {
- if errno == syscall.EAGAIN {
- // Buffer is empty, someone else cleared our wake.
- return nil
- }
- return errno
- }
- return nil
-}
-
-// Close all poller file descriptors, but not the one passed to it.
-func (poller *fdPoller) close() {
- if poller.pipe[1] != -1 {
- syscall.Close(poller.pipe[1])
- }
- if poller.pipe[0] != -1 {
- syscall.Close(poller.pipe[0])
- }
- if poller.epfd != -1 {
- syscall.Close(poller.epfd)
- }
-}
diff --git a/vendor/github.com/go-fsnotify/fsnotify/kqueue.go b/vendor/github.com/go-fsnotify/fsnotify/kqueue.go
deleted file mode 100644
index 265622d..0000000
--- a/vendor/github.com/go-fsnotify/fsnotify/kqueue.go
+++ /dev/null
@@ -1,463 +0,0 @@
-// Copyright 2010 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build freebsd openbsd netbsd dragonfly darwin
-
-package fsnotify
-
-import (
- "errors"
- "fmt"
- "io/ioutil"
- "os"
- "path/filepath"
- "sync"
- "syscall"
- "time"
-)
-
-// Watcher watches a set of files, delivering events to a channel.
-type Watcher struct {
- Events chan Event
- Errors chan error
- done chan bool // Channel for sending a "quit message" to the reader goroutine
-
- kq int // File descriptor (as returned by the kqueue() syscall).
-
- mu sync.Mutex // Protects access to watcher data
- watches map[string]int // Map of watched file descriptors (key: path).
- externalWatches map[string]bool // Map of watches added by user of the library.
- dirFlags map[string]uint32 // Map of watched directories to fflags used in kqueue.
- paths map[int]pathInfo // Map file descriptors to path names for processing kqueue events.
- fileExists map[string]bool // Keep track of if we know this file exists (to stop duplicate create events).
- isClosed bool // Set to true when Close() is first called
-}
-
-type pathInfo struct {
- name string
- isDir bool
-}
-
-// NewWatcher establishes a new watcher with the underlying OS and begins waiting for events.
-func NewWatcher() (*Watcher, error) {
- kq, err := kqueue()
- if err != nil {
- return nil, err
- }
-
- w := &Watcher{
- kq: kq,
- watches: make(map[string]int),
- dirFlags: make(map[string]uint32),
- paths: make(map[int]pathInfo),
- fileExists: make(map[string]bool),
- externalWatches: make(map[string]bool),
- Events: make(chan Event),
- Errors: make(chan error),
- done: make(chan bool),
- }
-
- go w.readEvents()
- return w, nil
-}
-
-// Close removes all watches and closes the events channel.
-func (w *Watcher) Close() error {
- w.mu.Lock()
- if w.isClosed {
- w.mu.Unlock()
- return nil
- }
- w.isClosed = true
- w.mu.Unlock()
-
- w.mu.Lock()
- ws := w.watches
- w.mu.Unlock()
-
- var err error
- for name := range ws {
- if e := w.Remove(name); e != nil && err == nil {
- err = e
- }
- }
-
- // Send "quit" message to the reader goroutine:
- w.done <- true
-
- return nil
-}
-
-// Add starts watching the named file or directory (non-recursively).
-func (w *Watcher) Add(name string) error {
- w.mu.Lock()
- w.externalWatches[name] = true
- w.mu.Unlock()
- return w.addWatch(name, noteAllEvents)
-}
-
-// Remove stops watching the the named file or directory (non-recursively).
-func (w *Watcher) Remove(name string) error {
- name = filepath.Clean(name)
- w.mu.Lock()
- watchfd, ok := w.watches[name]
- w.mu.Unlock()
- if !ok {
- return fmt.Errorf("can't remove non-existent kevent watch for: %s", name)
- }
-
- const registerRemove = syscall.EV_DELETE
- if err := register(w.kq, []int{watchfd}, registerRemove, 0); err != nil {
- return err
- }
-
- syscall.Close(watchfd)
-
- w.mu.Lock()
- isDir := w.paths[watchfd].isDir
- delete(w.watches, name)
- delete(w.paths, watchfd)
- delete(w.dirFlags, name)
- w.mu.Unlock()
-
- // Find all watched paths that are in this directory that are not external.
- if isDir {
- var pathsToRemove []string
- w.mu.Lock()
- for _, path := range w.paths {
- wdir, _ := filepath.Split(path.name)
- if filepath.Clean(wdir) == name {
- if !w.externalWatches[path.name] {
- pathsToRemove = append(pathsToRemove, path.name)
- }
- }
- }
- w.mu.Unlock()
- for _, name := range pathsToRemove {
- // Since these are internal, not much sense in propagating error
- // to the user, as that will just confuse them with an error about
- // a path they did not explicitly watch themselves.
- w.Remove(name)
- }
- }
-
- return nil
-}
-
-// Watch all events (except NOTE_EXTEND, NOTE_LINK, NOTE_REVOKE)
-const noteAllEvents = syscall.NOTE_DELETE | syscall.NOTE_WRITE | syscall.NOTE_ATTRIB | syscall.NOTE_RENAME
-
-// keventWaitTime to block on each read from kevent
-var keventWaitTime = durationToTimespec(100 * time.Millisecond)
-
-// addWatch adds name to the watched file set.
-// The flags are interpreted as described in kevent(2).
-func (w *Watcher) addWatch(name string, flags uint32) error {
- var isDir bool
- // Make ./name and name equivalent
- name = filepath.Clean(name)
-
- w.mu.Lock()
- if w.isClosed {
- w.mu.Unlock()
- return errors.New("kevent instance already closed")
- }
- watchfd, alreadyWatching := w.watches[name]
- // We already have a watch, but we can still override flags.
- if alreadyWatching {
- isDir = w.paths[watchfd].isDir
- }
- w.mu.Unlock()
-
- if !alreadyWatching {
- fi, err := os.Lstat(name)
- if err != nil {
- return err
- }
-
- // Don't watch sockets.
- if fi.Mode()&os.ModeSocket == os.ModeSocket {
- return nil
- }
-
- // Follow Symlinks
- // Unfortunately, Linux can add bogus symlinks to watch list without
- // issue, and Windows can't do symlinks period (AFAIK). To maintain
- // consistency, we will act like everything is fine. There will simply
- // be no file events for broken symlinks.
- // Hence the returns of nil on errors.
- if fi.Mode()&os.ModeSymlink == os.ModeSymlink {
- name, err = filepath.EvalSymlinks(name)
- if err != nil {
- return nil
- }
-
- fi, err = os.Lstat(name)
- if err != nil {
- return nil
- }
- }
-
- watchfd, err = syscall.Open(name, openMode, 0700)
- if watchfd == -1 {
- return err
- }
-
- isDir = fi.IsDir()
- }
-
- const registerAdd = syscall.EV_ADD | syscall.EV_CLEAR | syscall.EV_ENABLE
- if err := register(w.kq, []int{watchfd}, registerAdd, flags); err != nil {
- syscall.Close(watchfd)
- return err
- }
-
- if !alreadyWatching {
- w.mu.Lock()
- w.watches[name] = watchfd
- w.paths[watchfd] = pathInfo{name: name, isDir: isDir}
- w.mu.Unlock()
- }
-
- if isDir {
- // Watch the directory if it has not been watched before,
- // or if it was watched before, but perhaps only a NOTE_DELETE (watchDirectoryFiles)
- w.mu.Lock()
- watchDir := (flags&syscall.NOTE_WRITE) == syscall.NOTE_WRITE &&
- (!alreadyWatching || (w.dirFlags[name]&syscall.NOTE_WRITE) != syscall.NOTE_WRITE)
- // Store flags so this watch can be updated later
- w.dirFlags[name] = flags
- w.mu.Unlock()
-
- if watchDir {
- if err := w.watchDirectoryFiles(name); err != nil {
- return err
- }
- }
- }
- return nil
-}
-
-// readEvents reads from kqueue and converts the received kevents into
-// Event values that it sends down the Events channel.
-func (w *Watcher) readEvents() {
- eventBuffer := make([]syscall.Kevent_t, 10)
-
- for {
- // See if there is a message on the "done" channel
- select {
- case <-w.done:
- err := syscall.Close(w.kq)
- if err != nil {
- w.Errors <- err
- }
- close(w.Events)
- close(w.Errors)
- return
- default:
- }
-
- // Get new events
- kevents, err := read(w.kq, eventBuffer, &keventWaitTime)
- // EINTR is okay, the syscall was interrupted before timeout expired.
- if err != nil && err != syscall.EINTR {
- w.Errors <- err
- continue
- }
-
- // Flush the events we received to the Events channel
- for len(kevents) > 0 {
- kevent := &kevents[0]
- watchfd := int(kevent.Ident)
- mask := uint32(kevent.Fflags)
- w.mu.Lock()
- path := w.paths[watchfd]
- w.mu.Unlock()
- event := newEvent(path.name, mask)
-
- if path.isDir && !(event.Op&Remove == Remove) {
- // Double check to make sure the directory exists. This can happen when
- // we do a rm -fr on a recursively watched folders and we receive a
- // modification event first but the folder has been deleted and later
- // receive the delete event
- if _, err := os.Lstat(event.Name); os.IsNotExist(err) {
- // mark is as delete event
- event.Op |= Remove
- }
- }
-
- if event.Op&Rename == Rename || event.Op&Remove == Remove {
- w.Remove(event.Name)
- w.mu.Lock()
- delete(w.fileExists, event.Name)
- w.mu.Unlock()
- }
-
- if path.isDir && event.Op&Write == Write && !(event.Op&Remove == Remove) {
- w.sendDirectoryChangeEvents(event.Name)
- } else {
- // Send the event on the Events channel
- w.Events <- event
- }
-
- if event.Op&Remove == Remove {
- // Look for a file that may have overwritten this.
- // For example, mv f1 f2 will delete f2, then create f2.
- fileDir, _ := filepath.Split(event.Name)
- fileDir = filepath.Clean(fileDir)
- w.mu.Lock()
- _, found := w.watches[fileDir]
- w.mu.Unlock()
- if found {
- // make sure the directory exists before we watch for changes. When we
- // do a recursive watch and perform rm -fr, the parent directory might
- // have gone missing, ignore the missing directory and let the
- // upcoming delete event remove the watch from the parent directory.
- if _, err := os.Lstat(fileDir); os.IsExist(err) {
- w.sendDirectoryChangeEvents(fileDir)
- // FIXME: should this be for events on files or just isDir?
- }
- }
- }
-
- // Move to next event
- kevents = kevents[1:]
- }
- }
-}
-
-// newEvent returns an platform-independent Event based on kqueue Fflags.
-func newEvent(name string, mask uint32) Event {
- e := Event{Name: name}
- if mask&syscall.NOTE_DELETE == syscall.NOTE_DELETE {
- e.Op |= Remove
- }
- if mask&syscall.NOTE_WRITE == syscall.NOTE_WRITE {
- e.Op |= Write
- }
- if mask&syscall.NOTE_RENAME == syscall.NOTE_RENAME {
- e.Op |= Rename
- }
- if mask&syscall.NOTE_ATTRIB == syscall.NOTE_ATTRIB {
- e.Op |= Chmod
- }
- return e
-}
-
-func newCreateEvent(name string) Event {
- return Event{Name: name, Op: Create}
-}
-
-// watchDirectoryFiles to mimic inotify when adding a watch on a directory
-func (w *Watcher) watchDirectoryFiles(dirPath string) error {
- // Get all files
- files, err := ioutil.ReadDir(dirPath)
- if err != nil {
- return err
- }
-
- for _, fileInfo := range files {
- filePath := filepath.Join(dirPath, fileInfo.Name())
- if err := w.internalWatch(filePath, fileInfo); err != nil {
- return err
- }
-
- w.mu.Lock()
- w.fileExists[filePath] = true
- w.mu.Unlock()
- }
-
- return nil
-}
-
-// sendDirectoryEvents searches the directory for newly created files
-// and sends them over the event channel. This functionality is to have
-// the BSD version of fsnotify match Linux inotify which provides a
-// create event for files created in a watched directory.
-func (w *Watcher) sendDirectoryChangeEvents(dirPath string) {
- // Get all files
- files, err := ioutil.ReadDir(dirPath)
- if err != nil {
- w.Errors <- err
- }
-
- // Search for new files
- for _, fileInfo := range files {
- filePath := filepath.Join(dirPath, fileInfo.Name())
- w.mu.Lock()
- _, doesExist := w.fileExists[filePath]
- w.mu.Unlock()
- if !doesExist {
- // Send create event
- w.Events <- newCreateEvent(filePath)
- }
-
- // like watchDirectoryFiles (but without doing another ReadDir)
- if err := w.internalWatch(filePath, fileInfo); err != nil {
- return
- }
-
- w.mu.Lock()
- w.fileExists[filePath] = true
- w.mu.Unlock()
- }
-}
-
-func (w *Watcher) internalWatch(name string, fileInfo os.FileInfo) error {
- if fileInfo.IsDir() {
- // mimic Linux providing delete events for subdirectories
- // but preserve the flags used if currently watching subdirectory
- w.mu.Lock()
- flags := w.dirFlags[name]
- w.mu.Unlock()
-
- flags |= syscall.NOTE_DELETE
- return w.addWatch(name, flags)
- }
-
- // watch file to mimic Linux inotify
- return w.addWatch(name, noteAllEvents)
-}
-
-// kqueue creates a new kernel event queue and returns a descriptor.
-func kqueue() (kq int, err error) {
- kq, err = syscall.Kqueue()
- if kq == -1 {
- return kq, err
- }
- return kq, nil
-}
-
-// register events with the queue
-func register(kq int, fds []int, flags int, fflags uint32) error {
- changes := make([]syscall.Kevent_t, len(fds))
-
- for i, fd := range fds {
- // SetKevent converts int to the platform-specific types:
- syscall.SetKevent(&changes[i], fd, syscall.EVFILT_VNODE, flags)
- changes[i].Fflags = fflags
- }
-
- // register the events
- success, err := syscall.Kevent(kq, changes, nil, nil)
- if success == -1 {
- return err
- }
- return nil
-}
-
-// read retrieves pending events, or waits until an event occurs.
-// A timeout of nil blocks indefinitely, while 0 polls the queue.
-func read(kq int, events []syscall.Kevent_t, timeout *syscall.Timespec) ([]syscall.Kevent_t, error) {
- n, err := syscall.Kevent(kq, nil, events, timeout)
- if err != nil {
- return nil, err
- }
- return events[0:n], nil
-}
-
-// durationToTimespec prepares a timeout value
-func durationToTimespec(d time.Duration) syscall.Timespec {
- return syscall.NsecToTimespec(d.Nanoseconds())
-}
diff --git a/vendor/github.com/go-fsnotify/fsnotify/open_mode_bsd.go b/vendor/github.com/go-fsnotify/fsnotify/open_mode_bsd.go
deleted file mode 100644
index c57ccb4..0000000
--- a/vendor/github.com/go-fsnotify/fsnotify/open_mode_bsd.go
+++ /dev/null
@@ -1,11 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build freebsd openbsd netbsd dragonfly
-
-package fsnotify
-
-import "syscall"
-
-const openMode = syscall.O_NONBLOCK | syscall.O_RDONLY
diff --git a/vendor/github.com/go-fsnotify/fsnotify/open_mode_darwin.go b/vendor/github.com/go-fsnotify/fsnotify/open_mode_darwin.go
deleted file mode 100644
index 174b2c3..0000000
--- a/vendor/github.com/go-fsnotify/fsnotify/open_mode_darwin.go
+++ /dev/null
@@ -1,12 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build darwin
-
-package fsnotify
-
-import "syscall"
-
-// note: this constant is not defined on BSD
-const openMode = syscall.O_EVTONLY
diff --git a/vendor/github.com/go-fsnotify/fsnotify/windows.go b/vendor/github.com/go-fsnotify/fsnotify/windows.go
deleted file mode 100644
index 8115852..0000000
--- a/vendor/github.com/go-fsnotify/fsnotify/windows.go
+++ /dev/null
@@ -1,561 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build windows
-
-package fsnotify
-
-import (
- "errors"
- "fmt"
- "os"
- "path/filepath"
- "runtime"
- "sync"
- "syscall"
- "unsafe"
-)
-
-// Watcher watches a set of files, delivering events to a channel.
-type Watcher struct {
- Events chan Event
- Errors chan error
- isClosed bool // Set to true when Close() is first called
- mu sync.Mutex // Map access
- port syscall.Handle // Handle to completion port
- watches watchMap // Map of watches (key: i-number)
- input chan *input // Inputs to the reader are sent on this channel
- quit chan chan<- error
-}
-
-// NewWatcher establishes a new watcher with the underlying OS and begins waiting for events.
-func NewWatcher() (*Watcher, error) {
- port, e := syscall.CreateIoCompletionPort(syscall.InvalidHandle, 0, 0, 0)
- if e != nil {
- return nil, os.NewSyscallError("CreateIoCompletionPort", e)
- }
- w := &Watcher{
- port: port,
- watches: make(watchMap),
- input: make(chan *input, 1),
- Events: make(chan Event, 50),
- Errors: make(chan error),
- quit: make(chan chan<- error, 1),
- }
- go w.readEvents()
- return w, nil
-}
-
-// Close removes all watches and closes the events channel.
-func (w *Watcher) Close() error {
- if w.isClosed {
- return nil
- }
- w.isClosed = true
-
- // Send "quit" message to the reader goroutine
- ch := make(chan error)
- w.quit <- ch
- if err := w.wakeupReader(); err != nil {
- return err
- }
- return <-ch
-}
-
-// Add starts watching the named file or directory (non-recursively).
-func (w *Watcher) Add(name string) error {
- if w.isClosed {
- return errors.New("watcher already closed")
- }
- in := &input{
- op: opAddWatch,
- path: filepath.Clean(name),
- flags: sys_FS_ALL_EVENTS,
- reply: make(chan error),
- }
- w.input <- in
- if err := w.wakeupReader(); err != nil {
- return err
- }
- return <-in.reply
-}
-
-// Remove stops watching the the named file or directory (non-recursively).
-func (w *Watcher) Remove(name string) error {
- in := &input{
- op: opRemoveWatch,
- path: filepath.Clean(name),
- reply: make(chan error),
- }
- w.input <- in
- if err := w.wakeupReader(); err != nil {
- return err
- }
- return <-in.reply
-}
-
-const (
- // Options for AddWatch
- sys_FS_ONESHOT = 0x80000000
- sys_FS_ONLYDIR = 0x1000000
-
- // Events
- sys_FS_ACCESS = 0x1
- sys_FS_ALL_EVENTS = 0xfff
- sys_FS_ATTRIB = 0x4
- sys_FS_CLOSE = 0x18
- sys_FS_CREATE = 0x100
- sys_FS_DELETE = 0x200
- sys_FS_DELETE_SELF = 0x400
- sys_FS_MODIFY = 0x2
- sys_FS_MOVE = 0xc0
- sys_FS_MOVED_FROM = 0x40
- sys_FS_MOVED_TO = 0x80
- sys_FS_MOVE_SELF = 0x800
-
- // Special events
- sys_FS_IGNORED = 0x8000
- sys_FS_Q_OVERFLOW = 0x4000
-)
-
-func newEvent(name string, mask uint32) Event {
- e := Event{Name: name}
- if mask&sys_FS_CREATE == sys_FS_CREATE || mask&sys_FS_MOVED_TO == sys_FS_MOVED_TO {
- e.Op |= Create
- }
- if mask&sys_FS_DELETE == sys_FS_DELETE || mask&sys_FS_DELETE_SELF == sys_FS_DELETE_SELF {
- e.Op |= Remove
- }
- if mask&sys_FS_MODIFY == sys_FS_MODIFY {
- e.Op |= Write
- }
- if mask&sys_FS_MOVE == sys_FS_MOVE || mask&sys_FS_MOVE_SELF == sys_FS_MOVE_SELF || mask&sys_FS_MOVED_FROM == sys_FS_MOVED_FROM {
- e.Op |= Rename
- }
- if mask&sys_FS_ATTRIB == sys_FS_ATTRIB {
- e.Op |= Chmod
- }
- return e
-}
-
-const (
- opAddWatch = iota
- opRemoveWatch
-)
-
-const (
- provisional uint64 = 1 << (32 + iota)
-)
-
-type input struct {
- op int
- path string
- flags uint32
- reply chan error
-}
-
-type inode struct {
- handle syscall.Handle
- volume uint32
- index uint64
-}
-
-type watch struct {
- ov syscall.Overlapped
- ino *inode // i-number
- path string // Directory path
- mask uint64 // Directory itself is being watched with these notify flags
- names map[string]uint64 // Map of names being watched and their notify flags
- rename string // Remembers the old name while renaming a file
- buf [4096]byte
-}
-
-type indexMap map[uint64]*watch
-type watchMap map[uint32]indexMap
-
-func (w *Watcher) wakeupReader() error {
- e := syscall.PostQueuedCompletionStatus(w.port, 0, 0, nil)
- if e != nil {
- return os.NewSyscallError("PostQueuedCompletionStatus", e)
- }
- return nil
-}
-
-func getDir(pathname string) (dir string, err error) {
- attr, e := syscall.GetFileAttributes(syscall.StringToUTF16Ptr(pathname))
- if e != nil {
- return "", os.NewSyscallError("GetFileAttributes", e)
- }
- if attr&syscall.FILE_ATTRIBUTE_DIRECTORY != 0 {
- dir = pathname
- } else {
- dir, _ = filepath.Split(pathname)
- dir = filepath.Clean(dir)
- }
- return
-}
-
-func getIno(path string) (ino *inode, err error) {
- h, e := syscall.CreateFile(syscall.StringToUTF16Ptr(path),
- syscall.FILE_LIST_DIRECTORY,
- syscall.FILE_SHARE_READ|syscall.FILE_SHARE_WRITE|syscall.FILE_SHARE_DELETE,
- nil, syscall.OPEN_EXISTING,
- syscall.FILE_FLAG_BACKUP_SEMANTICS|syscall.FILE_FLAG_OVERLAPPED, 0)
- if e != nil {
- return nil, os.NewSyscallError("CreateFile", e)
- }
- var fi syscall.ByHandleFileInformation
- if e = syscall.GetFileInformationByHandle(h, &fi); e != nil {
- syscall.CloseHandle(h)
- return nil, os.NewSyscallError("GetFileInformationByHandle", e)
- }
- ino = &inode{
- handle: h,
- volume: fi.VolumeSerialNumber,
- index: uint64(fi.FileIndexHigh)<<32 | uint64(fi.FileIndexLow),
- }
- return ino, nil
-}
-
-// Must run within the I/O thread.
-func (m watchMap) get(ino *inode) *watch {
- if i := m[ino.volume]; i != nil {
- return i[ino.index]
- }
- return nil
-}
-
-// Must run within the I/O thread.
-func (m watchMap) set(ino *inode, watch *watch) {
- i := m[ino.volume]
- if i == nil {
- i = make(indexMap)
- m[ino.volume] = i
- }
- i[ino.index] = watch
-}
-
-// Must run within the I/O thread.
-func (w *Watcher) addWatch(pathname string, flags uint64) error {
- dir, err := getDir(pathname)
- if err != nil {
- return err
- }
- if flags&sys_FS_ONLYDIR != 0 && pathname != dir {
- return nil
- }
- ino, err := getIno(dir)
- if err != nil {
- return err
- }
- w.mu.Lock()
- watchEntry := w.watches.get(ino)
- w.mu.Unlock()
- if watchEntry == nil {
- if _, e := syscall.CreateIoCompletionPort(ino.handle, w.port, 0, 0); e != nil {
- syscall.CloseHandle(ino.handle)
- return os.NewSyscallError("CreateIoCompletionPort", e)
- }
- watchEntry = &watch{
- ino: ino,
- path: dir,
- names: make(map[string]uint64),
- }
- w.mu.Lock()
- w.watches.set(ino, watchEntry)
- w.mu.Unlock()
- flags |= provisional
- } else {
- syscall.CloseHandle(ino.handle)
- }
- if pathname == dir {
- watchEntry.mask |= flags
- } else {
- watchEntry.names[filepath.Base(pathname)] |= flags
- }
- if err = w.startRead(watchEntry); err != nil {
- return err
- }
- if pathname == dir {
- watchEntry.mask &= ^provisional
- } else {
- watchEntry.names[filepath.Base(pathname)] &= ^provisional
- }
- return nil
-}
-
-// Must run within the I/O thread.
-func (w *Watcher) remWatch(pathname string) error {
- dir, err := getDir(pathname)
- if err != nil {
- return err
- }
- ino, err := getIno(dir)
- if err != nil {
- return err
- }
- w.mu.Lock()
- watch := w.watches.get(ino)
- w.mu.Unlock()
- if watch == nil {
- return fmt.Errorf("can't remove non-existent watch for: %s", pathname)
- }
- if pathname == dir {
- w.sendEvent(watch.path, watch.mask&sys_FS_IGNORED)
- watch.mask = 0
- } else {
- name := filepath.Base(pathname)
- w.sendEvent(watch.path+"\\"+name, watch.names[name]&sys_FS_IGNORED)
- delete(watch.names, name)
- }
- return w.startRead(watch)
-}
-
-// Must run within the I/O thread.
-func (w *Watcher) deleteWatch(watch *watch) {
- for name, mask := range watch.names {
- if mask&provisional == 0 {
- w.sendEvent(watch.path+"\\"+name, mask&sys_FS_IGNORED)
- }
- delete(watch.names, name)
- }
- if watch.mask != 0 {
- if watch.mask&provisional == 0 {
- w.sendEvent(watch.path, watch.mask&sys_FS_IGNORED)
- }
- watch.mask = 0
- }
-}
-
-// Must run within the I/O thread.
-func (w *Watcher) startRead(watch *watch) error {
- if e := syscall.CancelIo(watch.ino.handle); e != nil {
- w.Errors <- os.NewSyscallError("CancelIo", e)
- w.deleteWatch(watch)
- }
- mask := toWindowsFlags(watch.mask)
- for _, m := range watch.names {
- mask |= toWindowsFlags(m)
- }
- if mask == 0 {
- if e := syscall.CloseHandle(watch.ino.handle); e != nil {
- w.Errors <- os.NewSyscallError("CloseHandle", e)
- }
- w.mu.Lock()
- delete(w.watches[watch.ino.volume], watch.ino.index)
- w.mu.Unlock()
- return nil
- }
- e := syscall.ReadDirectoryChanges(watch.ino.handle, &watch.buf[0],
- uint32(unsafe.Sizeof(watch.buf)), false, mask, nil, &watch.ov, 0)
- if e != nil {
- err := os.NewSyscallError("ReadDirectoryChanges", e)
- if e == syscall.ERROR_ACCESS_DENIED && watch.mask&provisional == 0 {
- // Watched directory was probably removed
- if w.sendEvent(watch.path, watch.mask&sys_FS_DELETE_SELF) {
- if watch.mask&sys_FS_ONESHOT != 0 {
- watch.mask = 0
- }
- }
- err = nil
- }
- w.deleteWatch(watch)
- w.startRead(watch)
- return err
- }
- return nil
-}
-
-// readEvents reads from the I/O completion port, converts the
-// received events into Event objects and sends them via the Events channel.
-// Entry point to the I/O thread.
-func (w *Watcher) readEvents() {
- var (
- n, key uint32
- ov *syscall.Overlapped
- )
- runtime.LockOSThread()
-
- for {
- e := syscall.GetQueuedCompletionStatus(w.port, &n, &key, &ov, syscall.INFINITE)
- watch := (*watch)(unsafe.Pointer(ov))
-
- if watch == nil {
- select {
- case ch := <-w.quit:
- w.mu.Lock()
- var indexes []indexMap
- for _, index := range w.watches {
- indexes = append(indexes, index)
- }
- w.mu.Unlock()
- for _, index := range indexes {
- for _, watch := range index {
- w.deleteWatch(watch)
- w.startRead(watch)
- }
- }
- var err error
- if e := syscall.CloseHandle(w.port); e != nil {
- err = os.NewSyscallError("CloseHandle", e)
- }
- close(w.Events)
- close(w.Errors)
- ch <- err
- return
- case in := <-w.input:
- switch in.op {
- case opAddWatch:
- in.reply <- w.addWatch(in.path, uint64(in.flags))
- case opRemoveWatch:
- in.reply <- w.remWatch(in.path)
- }
- default:
- }
- continue
- }
-
- switch e {
- case syscall.ERROR_MORE_DATA:
- if watch == nil {
- w.Errors <- errors.New("ERROR_MORE_DATA has unexpectedly null lpOverlapped buffer")
- } else {
- // The i/o succeeded but the buffer is full.
- // In theory we should be building up a full packet.
- // In practice we can get away with just carrying on.
- n = uint32(unsafe.Sizeof(watch.buf))
- }
- case syscall.ERROR_ACCESS_DENIED:
- // Watched directory was probably removed
- w.sendEvent(watch.path, watch.mask&sys_FS_DELETE_SELF)
- w.deleteWatch(watch)
- w.startRead(watch)
- continue
- case syscall.ERROR_OPERATION_ABORTED:
- // CancelIo was called on this handle
- continue
- default:
- w.Errors <- os.NewSyscallError("GetQueuedCompletionPort", e)
- continue
- case nil:
- }
-
- var offset uint32
- for {
- if n == 0 {
- w.Events <- newEvent("", sys_FS_Q_OVERFLOW)
- w.Errors <- errors.New("short read in readEvents()")
- break
- }
-
- // Point "raw" to the event in the buffer
- raw := (*syscall.FileNotifyInformation)(unsafe.Pointer(&watch.buf[offset]))
- buf := (*[syscall.MAX_PATH]uint16)(unsafe.Pointer(&raw.FileName))
- name := syscall.UTF16ToString(buf[:raw.FileNameLength/2])
- fullname := watch.path + "\\" + name
-
- var mask uint64
- switch raw.Action {
- case syscall.FILE_ACTION_REMOVED:
- mask = sys_FS_DELETE_SELF
- case syscall.FILE_ACTION_MODIFIED:
- mask = sys_FS_MODIFY
- case syscall.FILE_ACTION_RENAMED_OLD_NAME:
- watch.rename = name
- case syscall.FILE_ACTION_RENAMED_NEW_NAME:
- if watch.names[watch.rename] != 0 {
- watch.names[name] |= watch.names[watch.rename]
- delete(watch.names, watch.rename)
- mask = sys_FS_MOVE_SELF
- }
- }
-
- sendNameEvent := func() {
- if w.sendEvent(fullname, watch.names[name]&mask) {
- if watch.names[name]&sys_FS_ONESHOT != 0 {
- delete(watch.names, name)
- }
- }
- }
- if raw.Action != syscall.FILE_ACTION_RENAMED_NEW_NAME {
- sendNameEvent()
- }
- if raw.Action == syscall.FILE_ACTION_REMOVED {
- w.sendEvent(fullname, watch.names[name]&sys_FS_IGNORED)
- delete(watch.names, name)
- }
- if w.sendEvent(fullname, watch.mask&toFSnotifyFlags(raw.Action)) {
- if watch.mask&sys_FS_ONESHOT != 0 {
- watch.mask = 0
- }
- }
- if raw.Action == syscall.FILE_ACTION_RENAMED_NEW_NAME {
- fullname = watch.path + "\\" + watch.rename
- sendNameEvent()
- }
-
- // Move to the next event in the buffer
- if raw.NextEntryOffset == 0 {
- break
- }
- offset += raw.NextEntryOffset
-
- // Error!
- if offset >= n {
- w.Errors <- errors.New("Windows system assumed buffer larger than it is, events have likely been missed.")
- break
- }
- }
-
- if err := w.startRead(watch); err != nil {
- w.Errors <- err
- }
- }
-}
-
-func (w *Watcher) sendEvent(name string, mask uint64) bool {
- if mask == 0 {
- return false
- }
- event := newEvent(name, uint32(mask))
- select {
- case ch := <-w.quit:
- w.quit <- ch
- case w.Events <- event:
- }
- return true
-}
-
-func toWindowsFlags(mask uint64) uint32 {
- var m uint32
- if mask&sys_FS_ACCESS != 0 {
- m |= syscall.FILE_NOTIFY_CHANGE_LAST_ACCESS
- }
- if mask&sys_FS_MODIFY != 0 {
- m |= syscall.FILE_NOTIFY_CHANGE_LAST_WRITE
- }
- if mask&sys_FS_ATTRIB != 0 {
- m |= syscall.FILE_NOTIFY_CHANGE_ATTRIBUTES
- }
- if mask&(sys_FS_MOVE|sys_FS_CREATE|sys_FS_DELETE) != 0 {
- m |= syscall.FILE_NOTIFY_CHANGE_FILE_NAME | syscall.FILE_NOTIFY_CHANGE_DIR_NAME
- }
- return m
-}
-
-func toFSnotifyFlags(action uint32) uint64 {
- switch action {
- case syscall.FILE_ACTION_ADDED:
- return sys_FS_CREATE
- case syscall.FILE_ACTION_REMOVED:
- return sys_FS_DELETE
- case syscall.FILE_ACTION_MODIFIED:
- return sys_FS_MODIFY
- case syscall.FILE_ACTION_RENAMED_OLD_NAME:
- return sys_FS_MOVED_FROM
- case syscall.FILE_ACTION_RENAMED_NEW_NAME:
- return sys_FS_MOVED_TO
- }
- return 0
-}
diff --git a/vendor/github.com/gorilla/context/LICENSE b/vendor/github.com/gorilla/context/LICENSE
deleted file mode 100644
index 0e5fb87..0000000
--- a/vendor/github.com/gorilla/context/LICENSE
+++ /dev/null
@@ -1,27 +0,0 @@
-Copyright (c) 2012 Rodrigo Moraes. All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are
-met:
-
- * Redistributions of source code must retain the above copyright
-notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
-copyright notice, this list of conditions and the following disclaimer
-in the documentation and/or other materials provided with the
-distribution.
- * Neither the name of Google Inc. nor the names of its
-contributors may be used to endorse or promote products derived from
-this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/vendor/github.com/gorilla/context/README.md b/vendor/github.com/gorilla/context/README.md
deleted file mode 100644
index c60a31b..0000000
--- a/vendor/github.com/gorilla/context/README.md
+++ /dev/null
@@ -1,7 +0,0 @@
-context
-=======
-[![Build Status](https://travis-ci.org/gorilla/context.png?branch=master)](https://travis-ci.org/gorilla/context)
-
-gorilla/context is a general purpose registry for global request variables.
-
-Read the full documentation here: http://www.gorillatoolkit.org/pkg/context
diff --git a/vendor/github.com/gorilla/context/context.go b/vendor/github.com/gorilla/context/context.go
deleted file mode 100644
index 81cb128..0000000
--- a/vendor/github.com/gorilla/context/context.go
+++ /dev/null
@@ -1,143 +0,0 @@
-// Copyright 2012 The Gorilla Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package context
-
-import (
- "net/http"
- "sync"
- "time"
-)
-
-var (
- mutex sync.RWMutex
- data = make(map[*http.Request]map[interface{}]interface{})
- datat = make(map[*http.Request]int64)
-)
-
-// Set stores a value for a given key in a given request.
-func Set(r *http.Request, key, val interface{}) {
- mutex.Lock()
- if data[r] == nil {
- data[r] = make(map[interface{}]interface{})
- datat[r] = time.Now().Unix()
- }
- data[r][key] = val
- mutex.Unlock()
-}
-
-// Get returns a value stored for a given key in a given request.
-func Get(r *http.Request, key interface{}) interface{} {
- mutex.RLock()
- if ctx := data[r]; ctx != nil {
- value := ctx[key]
- mutex.RUnlock()
- return value
- }
- mutex.RUnlock()
- return nil
-}
-
-// GetOk returns stored value and presence state like multi-value return of map access.
-func GetOk(r *http.Request, key interface{}) (interface{}, bool) {
- mutex.RLock()
- if _, ok := data[r]; ok {
- value, ok := data[r][key]
- mutex.RUnlock()
- return value, ok
- }
- mutex.RUnlock()
- return nil, false
-}
-
-// GetAll returns all stored values for the request as a map. Nil is returned for invalid requests.
-func GetAll(r *http.Request) map[interface{}]interface{} {
- mutex.RLock()
- if context, ok := data[r]; ok {
- result := make(map[interface{}]interface{}, len(context))
- for k, v := range context {
- result[k] = v
- }
- mutex.RUnlock()
- return result
- }
- mutex.RUnlock()
- return nil
-}
-
-// GetAllOk returns all stored values for the request as a map and a boolean value that indicates if
-// the request was registered.
-func GetAllOk(r *http.Request) (map[interface{}]interface{}, bool) {
- mutex.RLock()
- context, ok := data[r]
- result := make(map[interface{}]interface{}, len(context))
- for k, v := range context {
- result[k] = v
- }
- mutex.RUnlock()
- return result, ok
-}
-
-// Delete removes a value stored for a given key in a given request.
-func Delete(r *http.Request, key interface{}) {
- mutex.Lock()
- if data[r] != nil {
- delete(data[r], key)
- }
- mutex.Unlock()
-}
-
-// Clear removes all values stored for a given request.
-//
-// This is usually called by a handler wrapper to clean up request
-// variables at the end of a request lifetime. See ClearHandler().
-func Clear(r *http.Request) {
- mutex.Lock()
- clear(r)
- mutex.Unlock()
-}
-
-// clear is Clear without the lock.
-func clear(r *http.Request) {
- delete(data, r)
- delete(datat, r)
-}
-
-// Purge removes request data stored for longer than maxAge, in seconds.
-// It returns the amount of requests removed.
-//
-// If maxAge <= 0, all request data is removed.
-//
-// This is only used for sanity check: in case context cleaning was not
-// properly set some request data can be kept forever, consuming an increasing
-// amount of memory. In case this is detected, Purge() must be called
-// periodically until the problem is fixed.
-func Purge(maxAge int) int {
- mutex.Lock()
- count := 0
- if maxAge <= 0 {
- count = len(data)
- data = make(map[*http.Request]map[interface{}]interface{})
- datat = make(map[*http.Request]int64)
- } else {
- min := time.Now().Unix() - int64(maxAge)
- for r := range data {
- if datat[r] < min {
- clear(r)
- count++
- }
- }
- }
- mutex.Unlock()
- return count
-}
-
-// ClearHandler wraps an http.Handler and clears request values at the end
-// of a request lifetime.
-func ClearHandler(h http.Handler) http.Handler {
- return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
- defer Clear(r)
- h.ServeHTTP(w, r)
- })
-}
diff --git a/vendor/github.com/gorilla/context/doc.go b/vendor/github.com/gorilla/context/doc.go
deleted file mode 100644
index 73c7400..0000000
--- a/vendor/github.com/gorilla/context/doc.go
+++ /dev/null
@@ -1,82 +0,0 @@
-// Copyright 2012 The Gorilla Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-/*
-Package context stores values shared during a request lifetime.
-
-For example, a router can set variables extracted from the URL and later
-application handlers can access those values, or it can be used to store
-sessions values to be saved at the end of a request. There are several
-others common uses.
-
-The idea was posted by Brad Fitzpatrick to the go-nuts mailing list:
-
- http://groups.google.com/group/golang-nuts/msg/e2d679d303aa5d53
-
-Here's the basic usage: first define the keys that you will need. The key
-type is interface{} so a key can be of any type that supports equality.
-Here we define a key using a custom int type to avoid name collisions:
-
- package foo
-
- import (
- "github.com/gorilla/context"
- )
-
- type key int
-
- const MyKey key = 0
-
-Then set a variable. Variables are bound to an http.Request object, so you
-need a request instance to set a value:
-
- context.Set(r, MyKey, "bar")
-
-The application can later access the variable using the same key you provided:
-
- func MyHandler(w http.ResponseWriter, r *http.Request) {
- // val is "bar".
- val := context.Get(r, foo.MyKey)
-
- // returns ("bar", true)
- val, ok := context.GetOk(r, foo.MyKey)
- // ...
- }
-
-And that's all about the basic usage. We discuss some other ideas below.
-
-Any type can be stored in the context. To enforce a given type, make the key
-private and wrap Get() and Set() to accept and return values of a specific
-type:
-
- type key int
-
- const mykey key = 0
-
- // GetMyKey returns a value for this package from the request values.
- func GetMyKey(r *http.Request) SomeType {
- if rv := context.Get(r, mykey); rv != nil {
- return rv.(SomeType)
- }
- return nil
- }
-
- // SetMyKey sets a value for this package in the request values.
- func SetMyKey(r *http.Request, val SomeType) {
- context.Set(r, mykey, val)
- }
-
-Variables must be cleared at the end of a request, to remove all values
-that were stored. This can be done in an http.Handler, after a request was
-served. Just call Clear() passing the request:
-
- context.Clear(r)
-
-...or use ClearHandler(), which conveniently wraps an http.Handler to clear
-variables at the end of a request lifetime.
-
-The Routers from the packages gorilla/mux and gorilla/pat call Clear()
-so if you are using either of them you don't need to clear the context manually.
-*/
-package context
diff --git a/vendor/github.com/gorilla/securecookie/LICENSE b/vendor/github.com/gorilla/securecookie/LICENSE
deleted file mode 100644
index 0e5fb87..0000000
--- a/vendor/github.com/gorilla/securecookie/LICENSE
+++ /dev/null
@@ -1,27 +0,0 @@
-Copyright (c) 2012 Rodrigo Moraes. All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are
-met:
-
- * Redistributions of source code must retain the above copyright
-notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
-copyright notice, this list of conditions and the following disclaimer
-in the documentation and/or other materials provided with the
-distribution.
- * Neither the name of Google Inc. nor the names of its
-contributors may be used to endorse or promote products derived from
-this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/vendor/github.com/gorilla/securecookie/README.md b/vendor/github.com/gorilla/securecookie/README.md
deleted file mode 100644
index 2f0d5d4..0000000
--- a/vendor/github.com/gorilla/securecookie/README.md
+++ /dev/null
@@ -1,3 +0,0 @@
-securecookie
-============
-[![Build Status](https://travis-ci.org/gorilla/securecookie.png?branch=master)](https://travis-ci.org/gorilla/securecookie)
diff --git a/vendor/github.com/gorilla/securecookie/doc.go b/vendor/github.com/gorilla/securecookie/doc.go
deleted file mode 100644
index e80e3ae..0000000
--- a/vendor/github.com/gorilla/securecookie/doc.go
+++ /dev/null
@@ -1,61 +0,0 @@
-// Copyright 2012 The Gorilla Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-/*
-Package gorilla/securecookie encodes and decodes authenticated and optionally
-encrypted cookie values.
-
-Secure cookies can't be forged, because their values are validated using HMAC.
-When encrypted, the content is also inaccessible to malicious eyes.
-
-To use it, first create a new SecureCookie instance:
-
- var hashKey = []byte("very-secret")
- var blockKey = []byte("a-lot-secret")
- var s = securecookie.New(hashKey, blockKey)
-
-The hashKey is required, used to authenticate the cookie value using HMAC.
-It is recommended to use a key with 32 or 64 bytes.
-
-The blockKey is optional, used to encrypt the cookie value -- set it to nil
-to not use encryption. If set, the length must correspond to the block size
-of the encryption algorithm. For AES, used by default, valid lengths are
-16, 24, or 32 bytes to select AES-128, AES-192, or AES-256.
-
-Strong keys can be created using the convenience function GenerateRandomKey().
-
-Once a SecureCookie instance is set, use it to encode a cookie value:
-
- func SetCookieHandler(w http.ResponseWriter, r *http.Request) {
- value := map[string]string{
- "foo": "bar",
- }
- if encoded, err := s.Encode("cookie-name", value); err == nil {
- cookie := &http.Cookie{
- Name: "cookie-name",
- Value: encoded,
- Path: "/",
- }
- http.SetCookie(w, cookie)
- }
- }
-
-Later, use the same SecureCookie instance to decode and validate a cookie
-value:
-
- func ReadCookieHandler(w http.ResponseWriter, r *http.Request) {
- if cookie, err := r.Cookie("cookie-name"); err == nil {
- value := make(map[string]string)
- if err = s2.Decode("cookie-name", cookie.Value, &value); err == nil {
- fmt.Fprintf(w, "The value of foo is %q", value["foo"])
- }
- }
- }
-
-We stored a map[string]string, but secure cookies can hold any value that
-can be encoded using encoding/gob. To store custom types, they must be
-registered first using gob.Register(). For basic types this is not needed;
-it works out of the box.
-*/
-package securecookie
diff --git a/vendor/github.com/gorilla/securecookie/securecookie.go b/vendor/github.com/gorilla/securecookie/securecookie.go
deleted file mode 100644
index 1b7acf8..0000000
--- a/vendor/github.com/gorilla/securecookie/securecookie.go
+++ /dev/null
@@ -1,429 +0,0 @@
-// Copyright 2012 The Gorilla Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package securecookie
-
-import (
- "bytes"
- "crypto/aes"
- "crypto/cipher"
- "crypto/hmac"
- "crypto/rand"
- "crypto/sha256"
- "crypto/subtle"
- "encoding/base64"
- "encoding/gob"
- "errors"
- "fmt"
- "hash"
- "io"
- "strconv"
- "time"
-)
-
-var (
- errNoCodecs = errors.New("securecookie: no codecs provided")
- errHashKeyNotSet = errors.New("securecookie: hash key is not set")
-
- ErrMacInvalid = errors.New("securecookie: the value is not valid")
-)
-
-// Codec defines an interface to encode and decode cookie values.
-type Codec interface {
- Encode(name string, value interface{}) (string, error)
- Decode(name, value string, dst interface{}) error
-}
-
-// New returns a new SecureCookie.
-//
-// hashKey is required, used to authenticate values using HMAC. Create it using
-// GenerateRandomKey(). It is recommended to use a key with 32 or 64 bytes.
-//
-// blockKey is optional, used to encrypt values. Create it using
-// GenerateRandomKey(). The key length must correspond to the block size
-// of the encryption algorithm. For AES, used by default, valid lengths are
-// 16, 24, or 32 bytes to select AES-128, AES-192, or AES-256.
-func New(hashKey, blockKey []byte) *SecureCookie {
- s := &SecureCookie{
- hashKey: hashKey,
- blockKey: blockKey,
- hashFunc: sha256.New,
- maxAge: 86400 * 30,
- maxLength: 4096,
- }
- if hashKey == nil {
- s.err = errHashKeyNotSet
- }
- if blockKey != nil {
- s.BlockFunc(aes.NewCipher)
- }
- return s
-}
-
-// SecureCookie encodes and decodes authenticated and optionally encrypted
-// cookie values.
-type SecureCookie struct {
- hashKey []byte
- hashFunc func() hash.Hash
- blockKey []byte
- block cipher.Block
- maxLength int
- maxAge int64
- minAge int64
- err error
- // For testing purposes, the function that returns the current timestamp.
- // If not set, it will use time.Now().UTC().Unix().
- timeFunc func() int64
-}
-
-// MaxLength restricts the maximum length, in bytes, for the cookie value.
-//
-// Default is 4096, which is the maximum value accepted by Internet Explorer.
-func (s *SecureCookie) MaxLength(value int) *SecureCookie {
- s.maxLength = value
- return s
-}
-
-// MaxAge restricts the maximum age, in seconds, for the cookie value.
-//
-// Default is 86400 * 30. Set it to 0 for no restriction.
-func (s *SecureCookie) MaxAge(value int) *SecureCookie {
- s.maxAge = int64(value)
- return s
-}
-
-// MinAge restricts the minimum age, in seconds, for the cookie value.
-//
-// Default is 0 (no restriction).
-func (s *SecureCookie) MinAge(value int) *SecureCookie {
- s.minAge = int64(value)
- return s
-}
-
-// HashFunc sets the hash function used to create HMAC.
-//
-// Default is crypto/sha256.New.
-func (s *SecureCookie) HashFunc(f func() hash.Hash) *SecureCookie {
- s.hashFunc = f
- return s
-}
-
-// BlockFunc sets the encryption function used to create a cipher.Block.
-//
-// Default is crypto/aes.New.
-func (s *SecureCookie) BlockFunc(f func([]byte) (cipher.Block, error)) *SecureCookie {
- if s.blockKey == nil {
- s.err = errors.New("securecookie: block key is not set")
- } else if block, err := f(s.blockKey); err == nil {
- s.block = block
- } else {
- s.err = err
- }
- return s
-}
-
-// Encode encodes a cookie value.
-//
-// It serializes, optionally encrypts, signs with a message authentication code, and
-// finally encodes the value.
-//
-// The name argument is the cookie name. It is stored with the encoded value.
-// The value argument is the value to be encoded. It can be any value that can
-// be encoded using encoding/gob. To store special structures, they must be
-// registered first using gob.Register().
-func (s *SecureCookie) Encode(name string, value interface{}) (string, error) {
- if s.err != nil {
- return "", s.err
- }
- if s.hashKey == nil {
- s.err = errHashKeyNotSet
- return "", s.err
- }
- var err error
- var b []byte
- // 1. Serialize.
- if b, err = serialize(value); err != nil {
- return "", err
- }
- // 2. Encrypt (optional).
- if s.block != nil {
- if b, err = encrypt(s.block, b); err != nil {
- return "", err
- }
- }
- b = encode(b)
- // 3. Create MAC for "name|date|value". Extra pipe to be used later.
- b = []byte(fmt.Sprintf("%s|%d|%s|", name, s.timestamp(), b))
- mac := createMac(hmac.New(s.hashFunc, s.hashKey), b[:len(b)-1])
- // Append mac, remove name.
- b = append(b, mac...)[len(name)+1:]
- // 4. Encode to base64.
- b = encode(b)
- // 5. Check length.
- if s.maxLength != 0 && len(b) > s.maxLength {
- return "", errors.New("securecookie: the value is too long")
- }
- // Done.
- return string(b), nil
-}
-
-// Decode decodes a cookie value.
-//
-// It decodes, verifies a message authentication code, optionally decrypts and
-// finally deserializes the value.
-//
-// The name argument is the cookie name. It must be the same name used when
-// it was stored. The value argument is the encoded cookie value. The dst
-// argument is where the cookie will be decoded. It must be a pointer.
-func (s *SecureCookie) Decode(name, value string, dst interface{}) error {
- if s.err != nil {
- return s.err
- }
- if s.hashKey == nil {
- s.err = errHashKeyNotSet
- return s.err
- }
- // 1. Check length.
- if s.maxLength != 0 && len(value) > s.maxLength {
- return errors.New("securecookie: the value is too long")
- }
- // 2. Decode from base64.
- b, err := decode([]byte(value))
- if err != nil {
- return err
- }
- // 3. Verify MAC. Value is "date|value|mac".
- parts := bytes.SplitN(b, []byte("|"), 3)
- if len(parts) != 3 {
- return ErrMacInvalid
- }
- h := hmac.New(s.hashFunc, s.hashKey)
- b = append([]byte(name+"|"), b[:len(b)-len(parts[2])-1]...)
- if err = verifyMac(h, b, parts[2]); err != nil {
- return err
- }
- // 4. Verify date ranges.
- var t1 int64
- if t1, err = strconv.ParseInt(string(parts[0]), 10, 64); err != nil {
- return errors.New("securecookie: invalid timestamp")
- }
- t2 := s.timestamp()
- if s.minAge != 0 && t1 > t2-s.minAge {
- return errors.New("securecookie: timestamp is too new")
- }
- if s.maxAge != 0 && t1 < t2-s.maxAge {
- return errors.New("securecookie: expired timestamp")
- }
- // 5. Decrypt (optional).
- b, err = decode(parts[1])
- if err != nil {
- return err
- }
- if s.block != nil {
- if b, err = decrypt(s.block, b); err != nil {
- return err
- }
- }
- // 6. Deserialize.
- if err = deserialize(b, dst); err != nil {
- return err
- }
- // Done.
- return nil
-}
-
-// timestamp returns the current timestamp, in seconds.
-//
-// For testing purposes, the function that generates the timestamp can be
-// overridden. If not set, it will return time.Now().UTC().Unix().
-func (s *SecureCookie) timestamp() int64 {
- if s.timeFunc == nil {
- return time.Now().UTC().Unix()
- }
- return s.timeFunc()
-}
-
-// Authentication -------------------------------------------------------------
-
-// createMac creates a message authentication code (MAC).
-func createMac(h hash.Hash, value []byte) []byte {
- h.Write(value)
- return h.Sum(nil)
-}
-
-// verifyMac verifies that a message authentication code (MAC) is valid.
-func verifyMac(h hash.Hash, value []byte, mac []byte) error {
- mac2 := createMac(h, value)
- if subtle.ConstantTimeCompare(mac, mac2) == 1 {
- return nil
- }
- return ErrMacInvalid
-}
-
-// Encryption -----------------------------------------------------------------
-
-// encrypt encrypts a value using the given block in counter mode.
-//
-// A random initialization vector (http://goo.gl/zF67k) with the length of the
-// block size is prepended to the resulting ciphertext.
-func encrypt(block cipher.Block, value []byte) ([]byte, error) {
- iv := GenerateRandomKey(block.BlockSize())
- if iv == nil {
- return nil, errors.New("securecookie: failed to generate random iv")
- }
- // Encrypt it.
- stream := cipher.NewCTR(block, iv)
- stream.XORKeyStream(value, value)
- // Return iv + ciphertext.
- return append(iv, value...), nil
-}
-
-// decrypt decrypts a value using the given block in counter mode.
-//
-// The value to be decrypted must be prepended by a initialization vector
-// (http://goo.gl/zF67k) with the length of the block size.
-func decrypt(block cipher.Block, value []byte) ([]byte, error) {
- size := block.BlockSize()
- if len(value) > size {
- // Extract iv.
- iv := value[:size]
- // Extract ciphertext.
- value = value[size:]
- // Decrypt it.
- stream := cipher.NewCTR(block, iv)
- stream.XORKeyStream(value, value)
- return value, nil
- }
- return nil, errors.New("securecookie: the value could not be decrypted")
-}
-
-// Serialization --------------------------------------------------------------
-
-// serialize encodes a value using gob.
-func serialize(src interface{}) ([]byte, error) {
- buf := new(bytes.Buffer)
- enc := gob.NewEncoder(buf)
- if err := enc.Encode(src); err != nil {
- return nil, err
- }
- return buf.Bytes(), nil
-}
-
-// deserialize decodes a value using gob.
-func deserialize(src []byte, dst interface{}) error {
- dec := gob.NewDecoder(bytes.NewBuffer(src))
- if err := dec.Decode(dst); err != nil {
- return err
- }
- return nil
-}
-
-// Encoding -------------------------------------------------------------------
-
-// encode encodes a value using base64.
-func encode(value []byte) []byte {
- encoded := make([]byte, base64.URLEncoding.EncodedLen(len(value)))
- base64.URLEncoding.Encode(encoded, value)
- return encoded
-}
-
-// decode decodes a cookie using base64.
-func decode(value []byte) ([]byte, error) {
- decoded := make([]byte, base64.URLEncoding.DecodedLen(len(value)))
- b, err := base64.URLEncoding.Decode(decoded, value)
- if err != nil {
- return nil, err
- }
- return decoded[:b], nil
-}
-
-// Helpers --------------------------------------------------------------------
-
-// GenerateRandomKey creates a random key with the given length in bytes.
-func GenerateRandomKey(length int) []byte {
- k := make([]byte, length)
- if _, err := io.ReadFull(rand.Reader, k); err != nil {
- return nil
- }
- return k
-}
-
-// CodecsFromPairs returns a slice of SecureCookie instances.
-//
-// It is a convenience function to create a list of codecs for key rotation.
-func CodecsFromPairs(keyPairs ...[]byte) []Codec {
- codecs := make([]Codec, len(keyPairs)/2+len(keyPairs)%2)
- for i := 0; i < len(keyPairs); i += 2 {
- var blockKey []byte
- if i+1 < len(keyPairs) {
- blockKey = keyPairs[i+1]
- }
- codecs[i/2] = New(keyPairs[i], blockKey)
- }
- return codecs
-}
-
-// EncodeMulti encodes a cookie value using a group of codecs.
-//
-// The codecs are tried in order. Multiple codecs are accepted to allow
-// key rotation.
-func EncodeMulti(name string, value interface{}, codecs ...Codec) (string, error) {
- if len(codecs) == 0 {
- return "", errNoCodecs
- }
-
- var errors MultiError
- for _, codec := range codecs {
- encoded, err := codec.Encode(name, value)
- if err == nil {
- return encoded, nil
- }
- errors = append(errors, err)
- }
- return "", errors
-}
-
-// DecodeMulti decodes a cookie value using a group of codecs.
-//
-// The codecs are tried in order. Multiple codecs are accepted to allow
-// key rotation.
-func DecodeMulti(name string, value string, dst interface{}, codecs ...Codec) error {
- if len(codecs) == 0 {
- return errNoCodecs
- }
-
- var errors MultiError
- for _, codec := range codecs {
- err := codec.Decode(name, value, dst)
- if err == nil {
- return nil
- }
- errors = append(errors, err)
- }
- return errors
-}
-
-// MultiError groups multiple errors.
-type MultiError []error
-
-func (m MultiError) Error() string {
- s, n := "", 0
- for _, e := range m {
- if e != nil {
- if n == 0 {
- s = e.Error()
- }
- n++
- }
- }
- switch n {
- case 0:
- return "(0 errors)"
- case 1:
- return s
- case 2:
- return s + " (and 1 other error)"
- }
- return fmt.Sprintf("%s (and %d other errors)", s, n-1)
-}
diff --git a/vendor/github.com/gorilla/sessions/LICENSE b/vendor/github.com/gorilla/sessions/LICENSE
deleted file mode 100644
index 0e5fb87..0000000
--- a/vendor/github.com/gorilla/sessions/LICENSE
+++ /dev/null
@@ -1,27 +0,0 @@
-Copyright (c) 2012 Rodrigo Moraes. All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are
-met:
-
- * Redistributions of source code must retain the above copyright
-notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
-copyright notice, this list of conditions and the following disclaimer
-in the documentation and/or other materials provided with the
-distribution.
- * Neither the name of Google Inc. nor the names of its
-contributors may be used to endorse or promote products derived from
-this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/vendor/github.com/gorilla/sessions/README.md b/vendor/github.com/gorilla/sessions/README.md
deleted file mode 100644
index 1ffa2cf..0000000
--- a/vendor/github.com/gorilla/sessions/README.md
+++ /dev/null
@@ -1,20 +0,0 @@
-sessions
-========
-
-Store Implementations
----------------------
-Other implementations of the sessions.Store interface:
-
- * [github.com/starJammer/gorilla-sessions-arangodb](https://github.com/starJammer/gorilla-sessions-arangodb) - ArangoDB
- * [github.com/yosssi/boltstore](https://github.com/yosssi/boltstore) - Bolt
- * [github.com/srinathgs/couchbasestore](https://github.com/srinathgs/couchbasestore) - Couchbase
- * [github.com/denizeren/dynamostore](https://github.com/denizeren/dynamostore) - Dynamodb on AWS
- * [github.com/bradleypeabody/gorilla-sessions-memcache](https://github.com/bradleypeabody/gorilla-sessions-memcache) - Memcache
- * [github.com/hnakamur/gaesessions](https://github.com/hnakamur/gaesessions) - Memcache on GAE
- * [github.com/kidstuff/mongostore](https://github.com/kidstuff/mongostore) - MongoDB
- * [github.com/srinathgs/mysqlstore](https://github.com/srinathgs/mysqlstore) - MySQL
- * [github.com/antonlindstrom/pgstore](https://github.com/antonlindstrom/pgstore) - PostgreSQL
- * [github.com/boj/redistore](https://github.com/boj/redistore) - Redis
- * [github.com/boj/rethinkstore](https://github.com/boj/rethinkstore) - RethinkDB
- * [github.com/boj/riakstore](https://github.com/boj/riakstore) - Riak
- * [github.com/michaeljs1990/sqlitestore](https://github.com/michaeljs1990/sqlitestore) - SQLite
diff --git a/vendor/github.com/gorilla/sessions/doc.go b/vendor/github.com/gorilla/sessions/doc.go
deleted file mode 100644
index 7f8be22..0000000
--- a/vendor/github.com/gorilla/sessions/doc.go
+++ /dev/null
@@ -1,168 +0,0 @@
-// Copyright 2012 The Gorilla Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-/*
-Package gorilla/sessions provides cookie and filesystem sessions and
-infrastructure for custom session backends.
-
-The key features are:
-
- * Simple API: use it as an easy way to set signed (and optionally
- encrypted) cookies.
- * Built-in backends to store sessions in cookies or the filesystem.
- * Flash messages: session values that last until read.
- * Convenient way to switch session persistency (aka "remember me") and set
- other attributes.
- * Mechanism to rotate authentication and encryption keys.
- * Multiple sessions per request, even using different backends.
- * Interfaces and infrastructure for custom session backends: sessions from
- different stores can be retrieved and batch-saved using a common API.
-
-Let's start with an example that shows the sessions API in a nutshell:
-
- import (
- "net/http"
- "github.com/gorilla/sessions"
- )
-
- var store = sessions.NewCookieStore([]byte("something-very-secret"))
-
- func MyHandler(w http.ResponseWriter, r *http.Request) {
- // Get a session. We're ignoring the error resulted from decoding an
- // existing session: Get() always returns a session, even if empty.
- session, _ := store.Get(r, "session-name")
- // Set some session values.
- session.Values["foo"] = "bar"
- session.Values[42] = 43
- // Save it.
- session.Save(r, w)
- }
-
-First we initialize a session store calling NewCookieStore() and passing a
-secret key used to authenticate the session. Inside the handler, we call
-store.Get() to retrieve an existing session or a new one. Then we set some
-session values in session.Values, which is a map[interface{}]interface{}.
-And finally we call session.Save() to save the session in the response.
-
-Note that in production code, we should check for errors when calling
-session.Save(r, w), and either display an error message or otherwise handle it.
-
-Important Note: If you aren't using gorilla/mux, you need to wrap your handlers
-with context.ClearHandler as or else you will leak memory! An easy way to do this
-is to wrap the top-level mux when calling http.ListenAndServe:
-
- http.ListenAndServe(":8080", context.ClearHandler(http.DefaultServeMux))
-
-The ClearHandler function is provided by the gorilla/context package.
-
-That's all you need to know for the basic usage. Let's take a look at other
-options, starting with flash messages.
-
-Flash messages are session values that last until read. The term appeared with
-Ruby On Rails a few years back. When we request a flash message, it is removed
-from the session. To add a flash, call session.AddFlash(), and to get all
-flashes, call session.Flashes(). Here is an example:
-
- func MyHandler(w http.ResponseWriter, r *http.Request) {
- // Get a session.
- session, _ := store.Get(r, "session-name")
- // Get the previously flashes, if any.
- if flashes := session.Flashes(); len(flashes) > 0 {
- // Just print the flash values.
- fmt.Fprint(w, "%v", flashes)
- } else {
- // Set a new flash.
- session.AddFlash("Hello, flash messages world!")
- fmt.Fprint(w, "No flashes found.")
- }
- session.Save(r, w)
- }
-
-Flash messages are useful to set information to be read after a redirection,
-like after form submissions.
-
-There may also be cases where you want to store a complex datatype within a
-session, such as a struct. Sessions are serialised using the encoding/gob package,
-so it is easy to register new datatypes for storage in sessions:
-
- import(
- "encoding/gob"
- "github.com/gorilla/sessions"
- )
-
- type Person struct {
- FirstName string
- LastName string
- Email string
- Age int
- }
-
- type M map[string]interface{}
-
- func init() {
-
- gob.Register(&Person{})
- gob.Register(&M{})
- }
-
-As it's not possible to pass a raw type as a parameter to a function, gob.Register()
-relies on us passing it an empty pointer to the type as a parameter. In the example
-above we've passed it a pointer to a struct and a pointer to a custom type
-representing a map[string]interface. This will then allow us to serialise/deserialise
-values of those types to and from our sessions.
-
-By default, session cookies last for a month. This is probably too long for
-some cases, but it is easy to change this and other attributes during
-runtime. Sessions can be configured individually or the store can be
-configured and then all sessions saved using it will use that configuration.
-We access session.Options or store.Options to set a new configuration. The
-fields are basically a subset of http.Cookie fields. Let's change the
-maximum age of a session to one week:
-
- session.Options = &sessions.Options{
- Path: "/",
- MaxAge: 86400 * 7,
- HttpOnly: true,
- }
-
-Sometimes we may want to change authentication and/or encryption keys without
-breaking existing sessions. The CookieStore supports key rotation, and to use
-it you just need to set multiple authentication and encryption keys, in pairs,
-to be tested in order:
-
- var store = sessions.NewCookieStore(
- []byte("new-authentication-key"),
- []byte("new-encryption-key"),
- []byte("old-authentication-key"),
- []byte("old-encryption-key"),
- )
-
-New sessions will be saved using the first pair. Old sessions can still be
-read because the first pair will fail, and the second will be tested. This
-makes it easy to "rotate" secret keys and still be able to validate existing
-sessions. Note: for all pairs the encryption key is optional; set it to nil
-or omit it and and encryption won't be used.
-
-Multiple sessions can be used in the same request, even with different
-session backends. When this happens, calling Save() on each session
-individually would be cumbersome, so we have a way to save all sessions
-at once: it's sessions.Save(). Here's an example:
-
- var store = sessions.NewCookieStore([]byte("something-very-secret"))
-
- func MyHandler(w http.ResponseWriter, r *http.Request) {
- // Get a session and set a value.
- session1, _ := store.Get(r, "session-one")
- session1.Values["foo"] = "bar"
- // Get another session and set another value.
- session2, _ := store.Get(r, "session-two")
- session2.Values[42] = 43
- // Save all sessions.
- sessions.Save(r, w)
- }
-
-This is possible because when we call Get() from a session store, it adds the
-session to a common registry. Save() uses it to save all registered sessions.
-*/
-package sessions
diff --git a/vendor/github.com/gorilla/sessions/sessions.go b/vendor/github.com/gorilla/sessions/sessions.go
deleted file mode 100644
index 53111b3..0000000
--- a/vendor/github.com/gorilla/sessions/sessions.go
+++ /dev/null
@@ -1,234 +0,0 @@
-// Copyright 2012 The Gorilla Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package sessions
-
-import (
- "encoding/gob"
- "fmt"
- "net/http"
- "time"
-
- "github.com/gorilla/context"
-)
-
-// Default flashes key.
-const flashesKey = "_flash"
-
-// Options --------------------------------------------------------------------
-
-// Options stores configuration for a session or session store.
-//
-// Fields are a subset of http.Cookie fields.
-type Options struct {
- Path string
- Domain string
- // MaxAge=0 means no 'Max-Age' attribute specified.
- // MaxAge<0 means delete cookie now, equivalently 'Max-Age: 0'.
- // MaxAge>0 means Max-Age attribute present and given in seconds.
- MaxAge int
- Secure bool
- HttpOnly bool
-}
-
-// Session --------------------------------------------------------------------
-
-// NewSession is called by session stores to create a new session instance.
-func NewSession(store Store, name string) *Session {
- return &Session{
- Values: make(map[interface{}]interface{}),
- store: store,
- name: name,
- }
-}
-
-// Session stores the values and optional configuration for a session.
-type Session struct {
- ID string
- Values map[interface{}]interface{}
- Options *Options
- IsNew bool
- store Store
- name string
-}
-
-// Flashes returns a slice of flash messages from the session.
-//
-// A single variadic argument is accepted, and it is optional: it defines
-// the flash key. If not defined "_flash" is used by default.
-func (s *Session) Flashes(vars ...string) []interface{} {
- var flashes []interface{}
- key := flashesKey
- if len(vars) > 0 {
- key = vars[0]
- }
- if v, ok := s.Values[key]; ok {
- // Drop the flashes and return it.
- delete(s.Values, key)
- flashes = v.([]interface{})
- }
- return flashes
-}
-
-// AddFlash adds a flash message to the session.
-//
-// A single variadic argument is accepted, and it is optional: it defines
-// the flash key. If not defined "_flash" is used by default.
-func (s *Session) AddFlash(value interface{}, vars ...string) {
- key := flashesKey
- if len(vars) > 0 {
- key = vars[0]
- }
- var flashes []interface{}
- if v, ok := s.Values[key]; ok {
- flashes = v.([]interface{})
- }
- s.Values[key] = append(flashes, value)
-}
-
-// Save is a convenience method to save this session. It is the same as calling
-// store.Save(request, response, session)
-func (s *Session) Save(r *http.Request, w http.ResponseWriter) error {
- return s.store.Save(r, w, s)
-}
-
-// Name returns the name used to register the session.
-func (s *Session) Name() string {
- return s.name
-}
-
-// Store returns the session store used to register the session.
-func (s *Session) Store() Store {
- return s.store
-}
-
-// Registry -------------------------------------------------------------------
-
-// sessionInfo stores a session tracked by the registry.
-type sessionInfo struct {
- s *Session
- e error
-}
-
-// contextKey is the type used to store the registry in the context.
-type contextKey int
-
-// registryKey is the key used to store the registry in the context.
-const registryKey contextKey = 0
-
-// GetRegistry returns a registry instance for the current request.
-func GetRegistry(r *http.Request) *Registry {
- registry := context.Get(r, registryKey)
- if registry != nil {
- return registry.(*Registry)
- }
- newRegistry := &Registry{
- request: r,
- sessions: make(map[string]sessionInfo),
- }
- context.Set(r, registryKey, newRegistry)
- return newRegistry
-}
-
-// Registry stores sessions used during a request.
-type Registry struct {
- request *http.Request
- sessions map[string]sessionInfo
-}
-
-// Get registers and returns a session for the given name and session store.
-//
-// It returns a new session if there are no sessions registered for the name.
-func (s *Registry) Get(store Store, name string) (session *Session, err error) {
- if info, ok := s.sessions[name]; ok {
- session, err = info.s, info.e
- } else {
- session, err = store.New(s.request, name)
- session.name = name
- s.sessions[name] = sessionInfo{s: session, e: err}
- }
- session.store = store
- return
-}
-
-// Save saves all sessions registered for the current request.
-func (s *Registry) Save(w http.ResponseWriter) error {
- var errMulti MultiError
- for name, info := range s.sessions {
- session := info.s
- if session.store == nil {
- errMulti = append(errMulti, fmt.Errorf(
- "sessions: missing store for session %q", name))
- } else if err := session.store.Save(s.request, w, session); err != nil {
- errMulti = append(errMulti, fmt.Errorf(
- "sessions: error saving session %q -- %v", name, err))
- }
- }
- if errMulti != nil {
- return errMulti
- }
- return nil
-}
-
-// Helpers --------------------------------------------------------------------
-
-func init() {
- gob.Register([]interface{}{})
-}
-
-// Save saves all sessions used during the current request.
-func Save(r *http.Request, w http.ResponseWriter) error {
- return GetRegistry(r).Save(w)
-}
-
-// NewCookie returns an http.Cookie with the options set. It also sets
-// the Expires field calculated based on the MaxAge value, for Internet
-// Explorer compatibility.
-func NewCookie(name, value string, options *Options) *http.Cookie {
- cookie := &http.Cookie{
- Name: name,
- Value: value,
- Path: options.Path,
- Domain: options.Domain,
- MaxAge: options.MaxAge,
- Secure: options.Secure,
- HttpOnly: options.HttpOnly,
- }
- if options.MaxAge > 0 {
- d := time.Duration(options.MaxAge) * time.Second
- cookie.Expires = time.Now().Add(d)
- } else if options.MaxAge < 0 {
- // Set it to the past to expire now.
- cookie.Expires = time.Unix(1, 0)
- }
- return cookie
-}
-
-// Error ----------------------------------------------------------------------
-
-// MultiError stores multiple errors.
-//
-// Borrowed from the App Engine SDK.
-type MultiError []error
-
-func (m MultiError) Error() string {
- s, n := "", 0
- for _, e := range m {
- if e != nil {
- if n == 0 {
- s = e.Error()
- }
- n++
- }
- }
- switch n {
- case 0:
- return "(0 errors)"
- case 1:
- return s
- case 2:
- return s + " (and 1 other error)"
- }
- return fmt.Sprintf("%s (and %d other errors)", s, n-1)
-}
diff --git a/vendor/github.com/gorilla/sessions/store.go b/vendor/github.com/gorilla/sessions/store.go
deleted file mode 100644
index 2c0257f..0000000
--- a/vendor/github.com/gorilla/sessions/store.go
+++ /dev/null
@@ -1,236 +0,0 @@
-// Copyright 2012 The Gorilla Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package sessions
-
-import (
- "encoding/base32"
- "io/ioutil"
- "net/http"
- "os"
- "path/filepath"
- "strings"
- "sync"
-
- "github.com/gorilla/securecookie"
-)
-
-// Store is an interface for custom session stores.
-//
-// See CookieStore and FilesystemStore for examples.
-type Store interface {
- // Get should return a cached session.
- Get(r *http.Request, name string) (*Session, error)
-
- // New should create and return a new session.
- //
- // Note that New should never return a nil session, even in the case of
- // an error if using the Registry infrastructure to cache the session.
- New(r *http.Request, name string) (*Session, error)
-
- // Save should persist session to the underlying store implementation.
- Save(r *http.Request, w http.ResponseWriter, s *Session) error
-}
-
-// CookieStore ----------------------------------------------------------------
-
-// NewCookieStore returns a new CookieStore.
-//
-// Keys are defined in pairs to allow key rotation, but the common case is
-// to set a single authentication key and optionally an encryption key.
-//
-// The first key in a pair is used for authentication and the second for
-// encryption. The encryption key can be set to nil or omitted in the last
-// pair, but the authentication key is required in all pairs.
-//
-// It is recommended to use an authentication key with 32 or 64 bytes.
-// The encryption key, if set, must be either 16, 24, or 32 bytes to select
-// AES-128, AES-192, or AES-256 modes.
-//
-// Use the convenience function securecookie.GenerateRandomKey() to create
-// strong keys.
-func NewCookieStore(keyPairs ...[]byte) *CookieStore {
- return &CookieStore{
- Codecs: securecookie.CodecsFromPairs(keyPairs...),
- Options: &Options{
- Path: "/",
- MaxAge: 86400 * 30,
- },
- }
-}
-
-// CookieStore stores sessions using secure cookies.
-type CookieStore struct {
- Codecs []securecookie.Codec
- Options *Options // default configuration
-}
-
-// Get returns a session for the given name after adding it to the registry.
-//
-// It returns a new session if the sessions doesn't exist. Access IsNew on
-// the session to check if it is an existing session or a new one.
-//
-// It returns a new session and an error if the session exists but could
-// not be decoded.
-func (s *CookieStore) Get(r *http.Request, name string) (*Session, error) {
- return GetRegistry(r).Get(s, name)
-}
-
-// New returns a session for the given name without adding it to the registry.
-//
-// The difference between New() and Get() is that calling New() twice will
-// decode the session data twice, while Get() registers and reuses the same
-// decoded session after the first call.
-func (s *CookieStore) New(r *http.Request, name string) (*Session, error) {
- session := NewSession(s, name)
- opts := *s.Options
- session.Options = &opts
- session.IsNew = true
- var err error
- if c, errCookie := r.Cookie(name); errCookie == nil {
- err = securecookie.DecodeMulti(name, c.Value, &session.Values,
- s.Codecs...)
- if err == nil {
- session.IsNew = false
- }
- }
- return session, err
-}
-
-// Save adds a single session to the response.
-func (s *CookieStore) Save(r *http.Request, w http.ResponseWriter,
- session *Session) error {
- encoded, err := securecookie.EncodeMulti(session.Name(), session.Values,
- s.Codecs...)
- if err != nil {
- return err
- }
- http.SetCookie(w, NewCookie(session.Name(), encoded, session.Options))
- return nil
-}
-
-// FilesystemStore ------------------------------------------------------------
-
-var fileMutex sync.RWMutex
-
-// NewFilesystemStore returns a new FilesystemStore.
-//
-// The path argument is the directory where sessions will be saved. If empty
-// it will use os.TempDir().
-//
-// See NewCookieStore() for a description of the other parameters.
-func NewFilesystemStore(path string, keyPairs ...[]byte) *FilesystemStore {
- if path == "" {
- path = os.TempDir()
- }
- return &FilesystemStore{
- Codecs: securecookie.CodecsFromPairs(keyPairs...),
- Options: &Options{
- Path: "/",
- MaxAge: 86400 * 30,
- },
- path: path,
- }
-}
-
-// FilesystemStore stores sessions in the filesystem.
-//
-// It also serves as a referece for custom stores.
-//
-// This store is still experimental and not well tested. Feedback is welcome.
-type FilesystemStore struct {
- Codecs []securecookie.Codec
- Options *Options // default configuration
- path string
-}
-
-// MaxLength restricts the maximum length of new sessions to l.
-// If l is 0 there is no limit to the size of a session, use with caution.
-// The default for a new FilesystemStore is 4096.
-func (s *FilesystemStore) MaxLength(l int) {
- for _, c := range s.Codecs {
- if codec, ok := c.(*securecookie.SecureCookie); ok {
- codec.MaxLength(l)
- }
- }
-}
-
-// Get returns a session for the given name after adding it to the registry.
-//
-// See CookieStore.Get().
-func (s *FilesystemStore) Get(r *http.Request, name string) (*Session, error) {
- return GetRegistry(r).Get(s, name)
-}
-
-// New returns a session for the given name without adding it to the registry.
-//
-// See CookieStore.New().
-func (s *FilesystemStore) New(r *http.Request, name string) (*Session, error) {
- session := NewSession(s, name)
- opts := *s.Options
- session.Options = &opts
- session.IsNew = true
- var err error
- if c, errCookie := r.Cookie(name); errCookie == nil {
- err = securecookie.DecodeMulti(name, c.Value, &session.ID, s.Codecs...)
- if err == nil {
- err = s.load(session)
- if err == nil {
- session.IsNew = false
- }
- }
- }
- return session, err
-}
-
-// Save adds a single session to the response.
-func (s *FilesystemStore) Save(r *http.Request, w http.ResponseWriter,
- session *Session) error {
- if session.ID == "" {
- // Because the ID is used in the filename, encode it to
- // use alphanumeric characters only.
- session.ID = strings.TrimRight(
- base32.StdEncoding.EncodeToString(
- securecookie.GenerateRandomKey(32)), "=")
- }
- if err := s.save(session); err != nil {
- return err
- }
- encoded, err := securecookie.EncodeMulti(session.Name(), session.ID,
- s.Codecs...)
- if err != nil {
- return err
- }
- http.SetCookie(w, NewCookie(session.Name(), encoded, session.Options))
- return nil
-}
-
-// save writes encoded session.Values to a file.
-func (s *FilesystemStore) save(session *Session) error {
- encoded, err := securecookie.EncodeMulti(session.Name(), session.Values,
- s.Codecs...)
- if err != nil {
- return err
- }
- filename := filepath.Join(s.path, "session_"+session.ID)
- fileMutex.Lock()
- defer fileMutex.Unlock()
- return ioutil.WriteFile(filename, []byte(encoded), 0600)
-}
-
-// load reads a file and decodes its content into session.Values.
-func (s *FilesystemStore) load(session *Session) error {
- filename := filepath.Join(s.path, "session_"+session.ID)
- fileMutex.RLock()
- defer fileMutex.RUnlock()
- fdata, err := ioutil.ReadFile(filename)
- if err != nil {
- return err
- }
- if err = securecookie.DecodeMulti(session.Name(), string(fdata),
- &session.Values, s.Codecs...); err != nil {
- return err
- }
- return nil
-}
diff --git a/vendor/github.com/gorilla/websocket/AUTHORS b/vendor/github.com/gorilla/websocket/AUTHORS
deleted file mode 100644
index b003eca..0000000
--- a/vendor/github.com/gorilla/websocket/AUTHORS
+++ /dev/null
@@ -1,8 +0,0 @@
-# This is the official list of Gorilla WebSocket authors for copyright
-# purposes.
-#
-# Please keep the list sorted.
-
-Gary Burd
-Joachim Bauch
-
diff --git a/vendor/github.com/gorilla/websocket/LICENSE b/vendor/github.com/gorilla/websocket/LICENSE
deleted file mode 100644
index 9171c97..0000000
--- a/vendor/github.com/gorilla/websocket/LICENSE
+++ /dev/null
@@ -1,22 +0,0 @@
-Copyright (c) 2013 The Gorilla WebSocket Authors. All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-
- Redistributions of source code must retain the above copyright notice, this
- list of conditions and the following disclaimer.
-
- Redistributions in binary form must reproduce the above copyright notice,
- this list of conditions and the following disclaimer in the documentation
- and/or other materials provided with the distribution.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
-ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
-FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
-SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
-OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/vendor/github.com/gorilla/websocket/README.md b/vendor/github.com/gorilla/websocket/README.md
deleted file mode 100644
index 9ad75a0..0000000
--- a/vendor/github.com/gorilla/websocket/README.md
+++ /dev/null
@@ -1,59 +0,0 @@
-# Gorilla WebSocket
-
-Gorilla WebSocket is a [Go](http://golang.org/) implementation of the
-[WebSocket](http://www.rfc-editor.org/rfc/rfc6455.txt) protocol.
-
-### Documentation
-
-* [API Reference](http://godoc.org/github.com/gorilla/websocket)
-* [Chat example](https://github.com/gorilla/websocket/tree/master/examples/chat)
-* [File watch example](https://github.com/gorilla/websocket/tree/master/examples/filewatch)
-
-### Status
-
-The Gorilla WebSocket package provides a complete and tested implementation of
-the [WebSocket](http://www.rfc-editor.org/rfc/rfc6455.txt) protocol. The
-package API is stable.
-
-### Installation
-
- go get github.com/gorilla/websocket
-
-### Protocol Compliance
-
-The Gorilla WebSocket package passes the server tests in the [Autobahn Test
-Suite](http://autobahn.ws/testsuite) using the application in the [examples/autobahn
-subdirectory](https://github.com/gorilla/websocket/tree/master/examples/autobahn).
-
-### Gorilla WebSocket compared with other packages
-
-
-
-Notes:
-
-1. Large messages are fragmented in [Chrome's new WebSocket implementation](http://www.ietf.org/mail-archive/web/hybi/current/msg10503.html).
-2. The application can get the type of a received data message by implementing
- a [Codec marshal](http://godoc.org/golang.org/x/net/websocket#Codec.Marshal)
- function.
-3. The go.net io.Reader and io.Writer operate across WebSocket frame boundaries.
- Read returns when the input buffer is full or a frame boundary is
- encountered. Each call to Write sends a single frame message. The Gorilla
- io.Reader and io.WriteCloser operate on a single WebSocket message.
-
diff --git a/vendor/github.com/gorilla/websocket/client.go b/vendor/github.com/gorilla/websocket/client.go
deleted file mode 100644
index 93db8dd..0000000
--- a/vendor/github.com/gorilla/websocket/client.go
+++ /dev/null
@@ -1,269 +0,0 @@
-// Copyright 2013 The Gorilla WebSocket Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package websocket
-
-import (
- "bytes"
- "crypto/tls"
- "errors"
- "io"
- "io/ioutil"
- "net"
- "net/http"
- "net/url"
- "strings"
- "time"
-)
-
-// ErrBadHandshake is returned when the server response to opening handshake is
-// invalid.
-var ErrBadHandshake = errors.New("websocket: bad handshake")
-
-// NewClient creates a new client connection using the given net connection.
-// The URL u specifies the host and request URI. Use requestHeader to specify
-// the origin (Origin), subprotocols (Sec-WebSocket-Protocol) and cookies
-// (Cookie). Use the response.Header to get the selected subprotocol
-// (Sec-WebSocket-Protocol) and cookies (Set-Cookie).
-//
-// If the WebSocket handshake fails, ErrBadHandshake is returned along with a
-// non-nil *http.Response so that callers can handle redirects, authentication,
-// etc.
-func NewClient(netConn net.Conn, u *url.URL, requestHeader http.Header, readBufSize, writeBufSize int) (c *Conn, response *http.Response, err error) {
- challengeKey, err := generateChallengeKey()
- if err != nil {
- return nil, nil, err
- }
- acceptKey := computeAcceptKey(challengeKey)
-
- c = newConn(netConn, false, readBufSize, writeBufSize)
- p := c.writeBuf[:0]
- p = append(p, "GET "...)
- p = append(p, u.RequestURI()...)
- p = append(p, " HTTP/1.1\r\nHost: "...)
- p = append(p, u.Host...)
- // "Upgrade" is capitalized for servers that do not use case insensitive
- // comparisons on header tokens.
- p = append(p, "\r\nUpgrade: websocket\r\nConnection: Upgrade\r\nSec-WebSocket-Version: 13\r\nSec-WebSocket-Key: "...)
- p = append(p, challengeKey...)
- p = append(p, "\r\n"...)
- for k, vs := range requestHeader {
- for _, v := range vs {
- p = append(p, k...)
- p = append(p, ": "...)
- p = append(p, v...)
- p = append(p, "\r\n"...)
- }
- }
- p = append(p, "\r\n"...)
-
- if _, err := netConn.Write(p); err != nil {
- return nil, nil, err
- }
-
- resp, err := http.ReadResponse(c.br, &http.Request{Method: "GET", URL: u})
- if err != nil {
- return nil, nil, err
- }
- if resp.StatusCode != 101 ||
- !strings.EqualFold(resp.Header.Get("Upgrade"), "websocket") ||
- !strings.EqualFold(resp.Header.Get("Connection"), "upgrade") ||
- resp.Header.Get("Sec-Websocket-Accept") != acceptKey {
- return nil, resp, ErrBadHandshake
- }
- c.subprotocol = resp.Header.Get("Sec-Websocket-Protocol")
- return c, resp, nil
-}
-
-// A Dialer contains options for connecting to WebSocket server.
-type Dialer struct {
- // NetDial specifies the dial function for creating TCP connections. If
- // NetDial is nil, net.Dial is used.
- NetDial func(network, addr string) (net.Conn, error)
-
- // TLSClientConfig specifies the TLS configuration to use with tls.Client.
- // If nil, the default configuration is used.
- TLSClientConfig *tls.Config
-
- // HandshakeTimeout specifies the duration for the handshake to complete.
- HandshakeTimeout time.Duration
-
- // Input and output buffer sizes. If the buffer size is zero, then a
- // default value of 4096 is used.
- ReadBufferSize, WriteBufferSize int
-
- // Subprotocols specifies the client's requested subprotocols.
- Subprotocols []string
-}
-
-var errMalformedURL = errors.New("malformed ws or wss URL")
-
-// parseURL parses the URL. The url.Parse function is not used here because
-// url.Parse mangles the path.
-func parseURL(s string) (*url.URL, error) {
- // From the RFC:
- //
- // ws-URI = "ws:" "//" host [ ":" port ] path [ "?" query ]
- // wss-URI = "wss:" "//" host [ ":" port ] path [ "?" query ]
- //
- // We don't use the net/url parser here because the dialer interface does
- // not provide a way for applications to work around percent deocding in
- // the net/url parser.
-
- var u url.URL
- switch {
- case strings.HasPrefix(s, "ws://"):
- u.Scheme = "ws"
- s = s[len("ws://"):]
- case strings.HasPrefix(s, "wss://"):
- u.Scheme = "wss"
- s = s[len("wss://"):]
- default:
- return nil, errMalformedURL
- }
-
- u.Host = s
- u.Opaque = "/"
- if i := strings.Index(s, "/"); i >= 0 {
- u.Host = s[:i]
- u.Opaque = s[i:]
- }
-
- if strings.Contains(u.Host, "@") {
- // WebSocket URIs do not contain user information.
- return nil, errMalformedURL
- }
-
- return &u, nil
-}
-
-func hostPortNoPort(u *url.URL) (hostPort, hostNoPort string) {
- hostPort = u.Host
- hostNoPort = u.Host
- if i := strings.LastIndex(u.Host, ":"); i > strings.LastIndex(u.Host, "]") {
- hostNoPort = hostNoPort[:i]
- } else {
- if u.Scheme == "wss" {
- hostPort += ":443"
- } else {
- hostPort += ":80"
- }
- }
- return hostPort, hostNoPort
-}
-
-// DefaultDialer is a dialer with all fields set to the default zero values.
-var DefaultDialer *Dialer
-
-// Dial creates a new client connection. Use requestHeader to specify the
-// origin (Origin), subprotocols (Sec-WebSocket-Protocol) and cookies (Cookie).
-// Use the response.Header to get the selected subprotocol
-// (Sec-WebSocket-Protocol) and cookies (Set-Cookie).
-//
-// If the WebSocket handshake fails, ErrBadHandshake is returned along with a
-// non-nil *http.Response so that callers can handle redirects, authentication,
-// etcetera. The response body may not contain the entire response and does not
-// need to be closed by the application.
-func (d *Dialer) Dial(urlStr string, requestHeader http.Header) (*Conn, *http.Response, error) {
- u, err := parseURL(urlStr)
- if err != nil {
- return nil, nil, err
- }
-
- hostPort, hostNoPort := hostPortNoPort(u)
-
- if d == nil {
- d = &Dialer{}
- }
-
- var deadline time.Time
- if d.HandshakeTimeout != 0 {
- deadline = time.Now().Add(d.HandshakeTimeout)
- }
-
- netDial := d.NetDial
- if netDial == nil {
- netDialer := &net.Dialer{Deadline: deadline}
- netDial = netDialer.Dial
- }
-
- netConn, err := netDial("tcp", hostPort)
- if err != nil {
- return nil, nil, err
- }
-
- defer func() {
- if netConn != nil {
- netConn.Close()
- }
- }()
-
- if err := netConn.SetDeadline(deadline); err != nil {
- return nil, nil, err
- }
-
- if u.Scheme == "wss" {
- cfg := d.TLSClientConfig
- if cfg == nil {
- cfg = &tls.Config{ServerName: hostNoPort}
- } else if cfg.ServerName == "" {
- shallowCopy := *cfg
- cfg = &shallowCopy
- cfg.ServerName = hostNoPort
- }
- tlsConn := tls.Client(netConn, cfg)
- netConn = tlsConn
- if err := tlsConn.Handshake(); err != nil {
- return nil, nil, err
- }
- if !cfg.InsecureSkipVerify {
- if err := tlsConn.VerifyHostname(cfg.ServerName); err != nil {
- return nil, nil, err
- }
- }
- }
-
- if len(d.Subprotocols) > 0 {
- h := http.Header{}
- for k, v := range requestHeader {
- h[k] = v
- }
- h.Set("Sec-Websocket-Protocol", strings.Join(d.Subprotocols, ", "))
- requestHeader = h
- }
-
- if len(requestHeader["Host"]) > 0 {
- // This can be used to supply a Host: header which is different from
- // the dial address.
- u.Host = requestHeader.Get("Host")
-
- // Drop "Host" header
- h := http.Header{}
- for k, v := range requestHeader {
- if k == "Host" {
- continue
- }
- h[k] = v
- }
- requestHeader = h
- }
-
- conn, resp, err := NewClient(netConn, u, requestHeader, d.ReadBufferSize, d.WriteBufferSize)
-
- if err != nil {
- if err == ErrBadHandshake {
- // Before closing the network connection on return from this
- // function, slurp up some of the response to aid application
- // debugging.
- buf := make([]byte, 1024)
- n, _ := io.ReadFull(resp.Body, buf)
- resp.Body = ioutil.NopCloser(bytes.NewReader(buf[:n]))
- }
- return nil, resp, err
- }
-
- netConn.SetDeadline(time.Time{})
- netConn = nil // to avoid close in defer.
- return conn, resp, nil
-}
diff --git a/vendor/github.com/gorilla/websocket/conn.go b/vendor/github.com/gorilla/websocket/conn.go
deleted file mode 100644
index e719f1c..0000000
--- a/vendor/github.com/gorilla/websocket/conn.go
+++ /dev/null
@@ -1,825 +0,0 @@
-// Copyright 2013 The Gorilla WebSocket Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package websocket
-
-import (
- "bufio"
- "encoding/binary"
- "errors"
- "io"
- "io/ioutil"
- "math/rand"
- "net"
- "strconv"
- "time"
-)
-
-const (
- maxFrameHeaderSize = 2 + 8 + 4 // Fixed header + length + mask
- maxControlFramePayloadSize = 125
- finalBit = 1 << 7
- maskBit = 1 << 7
- writeWait = time.Second
-
- defaultReadBufferSize = 4096
- defaultWriteBufferSize = 4096
-
- continuationFrame = 0
- noFrame = -1
-)
-
-// Close codes defined in RFC 6455, section 11.7.
-const (
- CloseNormalClosure = 1000
- CloseGoingAway = 1001
- CloseProtocolError = 1002
- CloseUnsupportedData = 1003
- CloseNoStatusReceived = 1005
- CloseAbnormalClosure = 1006
- CloseInvalidFramePayloadData = 1007
- ClosePolicyViolation = 1008
- CloseMessageTooBig = 1009
- CloseMandatoryExtension = 1010
- CloseInternalServerErr = 1011
- CloseTLSHandshake = 1015
-)
-
-// The message types are defined in RFC 6455, section 11.8.
-const (
- // TextMessage denotes a text data message. The text message payload is
- // interpreted as UTF-8 encoded text data.
- TextMessage = 1
-
- // BinaryMessage denotes a binary data message.
- BinaryMessage = 2
-
- // CloseMessage denotes a close control message. The optional message
- // payload contains a numeric code and text. Use the FormatCloseMessage
- // function to format a close message payload.
- CloseMessage = 8
-
- // PingMessage denotes a ping control message. The optional message payload
- // is UTF-8 encoded text.
- PingMessage = 9
-
- // PongMessage denotes a ping control message. The optional message payload
- // is UTF-8 encoded text.
- PongMessage = 10
-)
-
-// ErrCloseSent is returned when the application writes a message to the
-// connection after sending a close message.
-var ErrCloseSent = errors.New("websocket: close sent")
-
-// ErrReadLimit is returned when reading a message that is larger than the
-// read limit set for the connection.
-var ErrReadLimit = errors.New("websocket: read limit exceeded")
-
-// netError satisfies the net Error interface.
-type netError struct {
- msg string
- temporary bool
- timeout bool
-}
-
-func (e *netError) Error() string { return e.msg }
-func (e *netError) Temporary() bool { return e.temporary }
-func (e *netError) Timeout() bool { return e.timeout }
-
-// closeError represents close frame.
-type closeError struct {
- code int
- text string
-}
-
-func (e *closeError) Error() string {
- return "websocket: close " + strconv.Itoa(e.code) + " " + e.text
-}
-
-var (
- errWriteTimeout = &netError{msg: "websocket: write timeout", timeout: true}
- errUnexpectedEOF = &closeError{code: CloseAbnormalClosure, text: io.ErrUnexpectedEOF.Error()}
- errBadWriteOpCode = errors.New("websocket: bad write message type")
- errWriteClosed = errors.New("websocket: write closed")
- errInvalidControlFrame = errors.New("websocket: invalid control frame")
-)
-
-func hideTempErr(err error) error {
- if e, ok := err.(net.Error); ok && e.Temporary() {
- err = &netError{msg: e.Error(), timeout: e.Timeout()}
- }
- return err
-}
-
-func isControl(frameType int) bool {
- return frameType == CloseMessage || frameType == PingMessage || frameType == PongMessage
-}
-
-func isData(frameType int) bool {
- return frameType == TextMessage || frameType == BinaryMessage
-}
-
-func maskBytes(key [4]byte, pos int, b []byte) int {
- for i := range b {
- b[i] ^= key[pos&3]
- pos++
- }
- return pos & 3
-}
-
-func newMaskKey() [4]byte {
- n := rand.Uint32()
- return [4]byte{byte(n), byte(n >> 8), byte(n >> 16), byte(n >> 24)}
-}
-
-// Conn represents a WebSocket connection.
-type Conn struct {
- conn net.Conn
- isServer bool
- subprotocol string
-
- // Write fields
- mu chan bool // used as mutex to protect write to conn and closeSent
- closeSent bool // true if close message was sent
-
- // Message writer fields.
- writeErr error
- writeBuf []byte // frame is constructed in this buffer.
- writePos int // end of data in writeBuf.
- writeFrameType int // type of the current frame.
- writeSeq int // incremented to invalidate message writers.
- writeDeadline time.Time
-
- // Read fields
- readErr error
- br *bufio.Reader
- readRemaining int64 // bytes remaining in current frame.
- readFinal bool // true the current message has more frames.
- readSeq int // incremented to invalidate message readers.
- readLength int64 // Message size.
- readLimit int64 // Maximum message size.
- readMaskPos int
- readMaskKey [4]byte
- handlePong func(string) error
- handlePing func(string) error
-}
-
-func newConn(conn net.Conn, isServer bool, readBufferSize, writeBufferSize int) *Conn {
- mu := make(chan bool, 1)
- mu <- true
-
- if readBufferSize == 0 {
- readBufferSize = defaultReadBufferSize
- }
- if writeBufferSize == 0 {
- writeBufferSize = defaultWriteBufferSize
- }
-
- c := &Conn{
- isServer: isServer,
- br: bufio.NewReaderSize(conn, readBufferSize),
- conn: conn,
- mu: mu,
- readFinal: true,
- writeBuf: make([]byte, writeBufferSize+maxFrameHeaderSize),
- writeFrameType: noFrame,
- writePos: maxFrameHeaderSize,
- }
- c.SetPingHandler(nil)
- c.SetPongHandler(nil)
- return c
-}
-
-// Subprotocol returns the negotiated protocol for the connection.
-func (c *Conn) Subprotocol() string {
- return c.subprotocol
-}
-
-// Close closes the underlying network connection without sending or waiting for a close frame.
-func (c *Conn) Close() error {
- return c.conn.Close()
-}
-
-// LocalAddr returns the local network address.
-func (c *Conn) LocalAddr() net.Addr {
- return c.conn.LocalAddr()
-}
-
-// RemoteAddr returns the remote network address.
-func (c *Conn) RemoteAddr() net.Addr {
- return c.conn.RemoteAddr()
-}
-
-// Write methods
-
-func (c *Conn) write(frameType int, deadline time.Time, bufs ...[]byte) error {
- <-c.mu
- defer func() { c.mu <- true }()
-
- if c.closeSent {
- return ErrCloseSent
- } else if frameType == CloseMessage {
- c.closeSent = true
- }
-
- c.conn.SetWriteDeadline(deadline)
- for _, buf := range bufs {
- if len(buf) > 0 {
- n, err := c.conn.Write(buf)
- if n != len(buf) {
- // Close on partial write.
- c.conn.Close()
- }
- if err != nil {
- return err
- }
- }
- }
- return nil
-}
-
-// WriteControl writes a control message with the given deadline. The allowed
-// message types are CloseMessage, PingMessage and PongMessage.
-func (c *Conn) WriteControl(messageType int, data []byte, deadline time.Time) error {
- if !isControl(messageType) {
- return errBadWriteOpCode
- }
- if len(data) > maxControlFramePayloadSize {
- return errInvalidControlFrame
- }
-
- b0 := byte(messageType) | finalBit
- b1 := byte(len(data))
- if !c.isServer {
- b1 |= maskBit
- }
-
- buf := make([]byte, 0, maxFrameHeaderSize+maxControlFramePayloadSize)
- buf = append(buf, b0, b1)
-
- if c.isServer {
- buf = append(buf, data...)
- } else {
- key := newMaskKey()
- buf = append(buf, key[:]...)
- buf = append(buf, data...)
- maskBytes(key, 0, buf[6:])
- }
-
- d := time.Hour * 1000
- if !deadline.IsZero() {
- d = deadline.Sub(time.Now())
- if d < 0 {
- return errWriteTimeout
- }
- }
-
- timer := time.NewTimer(d)
- select {
- case <-c.mu:
- timer.Stop()
- case <-timer.C:
- return errWriteTimeout
- }
- defer func() { c.mu <- true }()
-
- if c.closeSent {
- return ErrCloseSent
- } else if messageType == CloseMessage {
- c.closeSent = true
- }
-
- c.conn.SetWriteDeadline(deadline)
- n, err := c.conn.Write(buf)
- if n != 0 && n != len(buf) {
- c.conn.Close()
- }
- return err
-}
-
-// NextWriter returns a writer for the next message to send. The writer's
-// Close method flushes the complete message to the network.
-//
-// There can be at most one open writer on a connection. NextWriter closes the
-// previous writer if the application has not already done so.
-//
-// The NextWriter method and the writers returned from the method cannot be
-// accessed by more than one goroutine at a time.
-func (c *Conn) NextWriter(messageType int) (io.WriteCloser, error) {
- if c.writeErr != nil {
- return nil, c.writeErr
- }
-
- if c.writeFrameType != noFrame {
- if err := c.flushFrame(true, nil); err != nil {
- return nil, err
- }
- }
-
- if !isControl(messageType) && !isData(messageType) {
- return nil, errBadWriteOpCode
- }
-
- c.writeFrameType = messageType
- return messageWriter{c, c.writeSeq}, nil
-}
-
-func (c *Conn) flushFrame(final bool, extra []byte) error {
- length := c.writePos - maxFrameHeaderSize + len(extra)
-
- // Check for invalid control frames.
- if isControl(c.writeFrameType) &&
- (!final || length > maxControlFramePayloadSize) {
- c.writeSeq++
- c.writeFrameType = noFrame
- c.writePos = maxFrameHeaderSize
- return errInvalidControlFrame
- }
-
- b0 := byte(c.writeFrameType)
- if final {
- b0 |= finalBit
- }
- b1 := byte(0)
- if !c.isServer {
- b1 |= maskBit
- }
-
- // Assume that the frame starts at beginning of c.writeBuf.
- framePos := 0
- if c.isServer {
- // Adjust up if mask not included in the header.
- framePos = 4
- }
-
- switch {
- case length >= 65536:
- c.writeBuf[framePos] = b0
- c.writeBuf[framePos+1] = b1 | 127
- binary.BigEndian.PutUint64(c.writeBuf[framePos+2:], uint64(length))
- case length > 125:
- framePos += 6
- c.writeBuf[framePos] = b0
- c.writeBuf[framePos+1] = b1 | 126
- binary.BigEndian.PutUint16(c.writeBuf[framePos+2:], uint16(length))
- default:
- framePos += 8
- c.writeBuf[framePos] = b0
- c.writeBuf[framePos+1] = b1 | byte(length)
- }
-
- if !c.isServer {
- key := newMaskKey()
- copy(c.writeBuf[maxFrameHeaderSize-4:], key[:])
- maskBytes(key, 0, c.writeBuf[maxFrameHeaderSize:c.writePos])
- if len(extra) > 0 {
- c.writeErr = errors.New("websocket: internal error, extra used in client mode")
- return c.writeErr
- }
- }
-
- // Write the buffers to the connection.
- c.writeErr = c.write(c.writeFrameType, c.writeDeadline, c.writeBuf[framePos:c.writePos], extra)
-
- // Setup for next frame.
- c.writePos = maxFrameHeaderSize
- c.writeFrameType = continuationFrame
- if final {
- c.writeSeq++
- c.writeFrameType = noFrame
- }
- return c.writeErr
-}
-
-type messageWriter struct {
- c *Conn
- seq int
-}
-
-func (w messageWriter) err() error {
- c := w.c
- if c.writeSeq != w.seq {
- return errWriteClosed
- }
- if c.writeErr != nil {
- return c.writeErr
- }
- return nil
-}
-
-func (w messageWriter) ncopy(max int) (int, error) {
- n := len(w.c.writeBuf) - w.c.writePos
- if n <= 0 {
- if err := w.c.flushFrame(false, nil); err != nil {
- return 0, err
- }
- n = len(w.c.writeBuf) - w.c.writePos
- }
- if n > max {
- n = max
- }
- return n, nil
-}
-
-func (w messageWriter) write(final bool, p []byte) (int, error) {
- if err := w.err(); err != nil {
- return 0, err
- }
-
- if len(p) > 2*len(w.c.writeBuf) && w.c.isServer {
- // Don't buffer large messages.
- err := w.c.flushFrame(final, p)
- if err != nil {
- return 0, err
- }
- return len(p), nil
- }
-
- nn := len(p)
- for len(p) > 0 {
- n, err := w.ncopy(len(p))
- if err != nil {
- return 0, err
- }
- copy(w.c.writeBuf[w.c.writePos:], p[:n])
- w.c.writePos += n
- p = p[n:]
- }
- return nn, nil
-}
-
-func (w messageWriter) Write(p []byte) (int, error) {
- return w.write(false, p)
-}
-
-func (w messageWriter) WriteString(p string) (int, error) {
- if err := w.err(); err != nil {
- return 0, err
- }
-
- nn := len(p)
- for len(p) > 0 {
- n, err := w.ncopy(len(p))
- if err != nil {
- return 0, err
- }
- copy(w.c.writeBuf[w.c.writePos:], p[:n])
- w.c.writePos += n
- p = p[n:]
- }
- return nn, nil
-}
-
-func (w messageWriter) ReadFrom(r io.Reader) (nn int64, err error) {
- if err := w.err(); err != nil {
- return 0, err
- }
- for {
- if w.c.writePos == len(w.c.writeBuf) {
- err = w.c.flushFrame(false, nil)
- if err != nil {
- break
- }
- }
- var n int
- n, err = r.Read(w.c.writeBuf[w.c.writePos:])
- w.c.writePos += n
- nn += int64(n)
- if err != nil {
- if err == io.EOF {
- err = nil
- }
- break
- }
- }
- return nn, err
-}
-
-func (w messageWriter) Close() error {
- if err := w.err(); err != nil {
- return err
- }
- return w.c.flushFrame(true, nil)
-}
-
-// WriteMessage is a helper method for getting a writer using NextWriter,
-// writing the message and closing the writer.
-func (c *Conn) WriteMessage(messageType int, data []byte) error {
- wr, err := c.NextWriter(messageType)
- if err != nil {
- return err
- }
- w := wr.(messageWriter)
- if _, err := w.write(true, data); err != nil {
- return err
- }
- if c.writeSeq == w.seq {
- if err := c.flushFrame(true, nil); err != nil {
- return err
- }
- }
- return nil
-}
-
-// SetWriteDeadline sets the write deadline on the underlying network
-// connection. After a write has timed out, the websocket state is corrupt and
-// all future writes will return an error. A zero value for t means writes will
-// not time out.
-func (c *Conn) SetWriteDeadline(t time.Time) error {
- c.writeDeadline = t
- return nil
-}
-
-// Read methods
-
-// readFull is like io.ReadFull except that io.EOF is never returned.
-func (c *Conn) readFull(p []byte) (err error) {
- var n int
- for n < len(p) && err == nil {
- var nn int
- nn, err = c.br.Read(p[n:])
- n += nn
- }
- if n == len(p) {
- err = nil
- } else if err == io.EOF {
- err = errUnexpectedEOF
- }
- return
-}
-
-func (c *Conn) advanceFrame() (int, error) {
-
- // 1. Skip remainder of previous frame.
-
- if c.readRemaining > 0 {
- if _, err := io.CopyN(ioutil.Discard, c.br, c.readRemaining); err != nil {
- return noFrame, err
- }
- }
-
- // 2. Read and parse first two bytes of frame header.
-
- var b [8]byte
- if err := c.readFull(b[:2]); err != nil {
- return noFrame, err
- }
-
- final := b[0]&finalBit != 0
- frameType := int(b[0] & 0xf)
- reserved := int((b[0] >> 4) & 0x7)
- mask := b[1]&maskBit != 0
- c.readRemaining = int64(b[1] & 0x7f)
-
- if reserved != 0 {
- return noFrame, c.handleProtocolError("unexpected reserved bits " + strconv.Itoa(reserved))
- }
-
- switch frameType {
- case CloseMessage, PingMessage, PongMessage:
- if c.readRemaining > maxControlFramePayloadSize {
- return noFrame, c.handleProtocolError("control frame length > 125")
- }
- if !final {
- return noFrame, c.handleProtocolError("control frame not final")
- }
- case TextMessage, BinaryMessage:
- if !c.readFinal {
- return noFrame, c.handleProtocolError("message start before final message frame")
- }
- c.readFinal = final
- case continuationFrame:
- if c.readFinal {
- return noFrame, c.handleProtocolError("continuation after final message frame")
- }
- c.readFinal = final
- default:
- return noFrame, c.handleProtocolError("unknown opcode " + strconv.Itoa(frameType))
- }
-
- // 3. Read and parse frame length.
-
- switch c.readRemaining {
- case 126:
- if err := c.readFull(b[:2]); err != nil {
- return noFrame, err
- }
- c.readRemaining = int64(binary.BigEndian.Uint16(b[:2]))
- case 127:
- if err := c.readFull(b[:8]); err != nil {
- return noFrame, err
- }
- c.readRemaining = int64(binary.BigEndian.Uint64(b[:8]))
- }
-
- // 4. Handle frame masking.
-
- if mask != c.isServer {
- return noFrame, c.handleProtocolError("incorrect mask flag")
- }
-
- if mask {
- c.readMaskPos = 0
- if err := c.readFull(c.readMaskKey[:]); err != nil {
- return noFrame, err
- }
- }
-
- // 5. For text and binary messages, enforce read limit and return.
-
- if frameType == continuationFrame || frameType == TextMessage || frameType == BinaryMessage {
-
- c.readLength += c.readRemaining
- if c.readLimit > 0 && c.readLength > c.readLimit {
- c.WriteControl(CloseMessage, FormatCloseMessage(CloseMessageTooBig, ""), time.Now().Add(writeWait))
- return noFrame, ErrReadLimit
- }
-
- return frameType, nil
- }
-
- // 6. Read control frame payload.
-
- var payload []byte
- if c.readRemaining > 0 {
- payload = make([]byte, c.readRemaining)
- c.readRemaining = 0
- if err := c.readFull(payload); err != nil {
- return noFrame, err
- }
- if c.isServer {
- maskBytes(c.readMaskKey, 0, payload)
- }
- }
-
- // 7. Process control frame payload.
-
- switch frameType {
- case PongMessage:
- if err := c.handlePong(string(payload)); err != nil {
- return noFrame, err
- }
- case PingMessage:
- if err := c.handlePing(string(payload)); err != nil {
- return noFrame, err
- }
- case CloseMessage:
- c.WriteControl(CloseMessage, []byte{}, time.Now().Add(writeWait))
- closeCode := CloseNoStatusReceived
- closeText := ""
- if len(payload) >= 2 {
- closeCode = int(binary.BigEndian.Uint16(payload))
- closeText = string(payload[2:])
- }
- switch closeCode {
- case CloseNormalClosure, CloseGoingAway:
- return noFrame, io.EOF
- default:
- return noFrame, &closeError{code: closeCode, text: closeText}
- }
- }
-
- return frameType, nil
-}
-
-func (c *Conn) handleProtocolError(message string) error {
- c.WriteControl(CloseMessage, FormatCloseMessage(CloseProtocolError, message), time.Now().Add(writeWait))
- return errors.New("websocket: " + message)
-}
-
-// NextReader returns the next data message received from the peer. The
-// returned messageType is either TextMessage or BinaryMessage.
-//
-// There can be at most one open reader on a connection. NextReader discards
-// the previous message if the application has not already consumed it.
-//
-// The NextReader method and the readers returned from the method cannot be
-// accessed by more than one goroutine at a time.
-func (c *Conn) NextReader() (messageType int, r io.Reader, err error) {
-
- c.readSeq++
- c.readLength = 0
-
- for c.readErr == nil {
- frameType, err := c.advanceFrame()
- if err != nil {
- c.readErr = hideTempErr(err)
- break
- }
- if frameType == TextMessage || frameType == BinaryMessage {
- return frameType, messageReader{c, c.readSeq}, nil
- }
- }
- return noFrame, nil, c.readErr
-}
-
-type messageReader struct {
- c *Conn
- seq int
-}
-
-func (r messageReader) Read(b []byte) (int, error) {
-
- if r.seq != r.c.readSeq {
- return 0, io.EOF
- }
-
- for r.c.readErr == nil {
-
- if r.c.readRemaining > 0 {
- if int64(len(b)) > r.c.readRemaining {
- b = b[:r.c.readRemaining]
- }
- n, err := r.c.br.Read(b)
- r.c.readErr = hideTempErr(err)
- if r.c.isServer {
- r.c.readMaskPos = maskBytes(r.c.readMaskKey, r.c.readMaskPos, b[:n])
- }
- r.c.readRemaining -= int64(n)
- return n, r.c.readErr
- }
-
- if r.c.readFinal {
- r.c.readSeq++
- return 0, io.EOF
- }
-
- frameType, err := r.c.advanceFrame()
- switch {
- case err != nil:
- r.c.readErr = hideTempErr(err)
- case frameType == TextMessage || frameType == BinaryMessage:
- r.c.readErr = errors.New("websocket: internal error, unexpected text or binary in Reader")
- }
- }
-
- err := r.c.readErr
- if err == io.EOF && r.seq == r.c.readSeq {
- err = errUnexpectedEOF
- }
- return 0, err
-}
-
-// ReadMessage is a helper method for getting a reader using NextReader and
-// reading from that reader to a buffer.
-func (c *Conn) ReadMessage() (messageType int, p []byte, err error) {
- var r io.Reader
- messageType, r, err = c.NextReader()
- if err != nil {
- return messageType, nil, err
- }
- p, err = ioutil.ReadAll(r)
- return messageType, p, err
-}
-
-// SetReadDeadline sets the read deadline on the underlying network connection.
-// After a read has timed out, the websocket connection state is corrupt and
-// all future reads will return an error. A zero value for t means reads will
-// not time out.
-func (c *Conn) SetReadDeadline(t time.Time) error {
- return c.conn.SetReadDeadline(t)
-}
-
-// SetReadLimit sets the maximum size for a message read from the peer. If a
-// message exceeds the limit, the connection sends a close frame to the peer
-// and returns ErrReadLimit to the application.
-func (c *Conn) SetReadLimit(limit int64) {
- c.readLimit = limit
-}
-
-// SetPingHandler sets the handler for ping messages received from the peer.
-// The default ping handler sends a pong to the peer.
-func (c *Conn) SetPingHandler(h func(string) error) {
- if h == nil {
- h = func(message string) error {
- c.WriteControl(PongMessage, []byte(message), time.Now().Add(writeWait))
- return nil
- }
- }
- c.handlePing = h
-}
-
-// SetPongHandler sets the handler for pong messages received from the peer.
-// The default pong handler does nothing.
-func (c *Conn) SetPongHandler(h func(string) error) {
- if h == nil {
- h = func(string) error { return nil }
- }
- c.handlePong = h
-}
-
-// UnderlyingConn returns the internal net.Conn. This can be used to further
-// modifications to connection specific flags.
-func (c *Conn) UnderlyingConn() net.Conn {
- return c.conn
-}
-
-// FormatCloseMessage formats closeCode and text as a WebSocket close message.
-func FormatCloseMessage(closeCode int, text string) []byte {
- buf := make([]byte, 2+len(text))
- binary.BigEndian.PutUint16(buf, uint16(closeCode))
- copy(buf[2:], text)
- return buf
-}
diff --git a/vendor/github.com/gorilla/websocket/doc.go b/vendor/github.com/gorilla/websocket/doc.go
deleted file mode 100644
index f52925d..0000000
--- a/vendor/github.com/gorilla/websocket/doc.go
+++ /dev/null
@@ -1,148 +0,0 @@
-// Copyright 2013 The Gorilla WebSocket Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Package websocket implements the WebSocket protocol defined in RFC 6455.
-//
-// Overview
-//
-// The Conn type represents a WebSocket connection. A server application uses
-// the Upgrade function from an Upgrader object with a HTTP request handler
-// to get a pointer to a Conn:
-//
-// var upgrader = websocket.Upgrader{
-// ReadBufferSize: 1024,
-// WriteBufferSize: 1024,
-// }
-//
-// func handler(w http.ResponseWriter, r *http.Request) {
-// conn, err := upgrader.Upgrade(w, r, nil)
-// if err != nil {
-// log.Println(err)
-// return
-// }
-// ... Use conn to send and receive messages.
-// }
-//
-// Call the connection's WriteMessage and ReadMessage methods to send and
-// receive messages as a slice of bytes. This snippet of code shows how to echo
-// messages using these methods:
-//
-// for {
-// messageType, p, err := conn.ReadMessage()
-// if err != nil {
-// return
-// }
-// if err = conn.WriteMessage(messageType, p); err != nil {
-// return err
-// }
-// }
-//
-// In above snippet of code, p is a []byte and messageType is an int with value
-// websocket.BinaryMessage or websocket.TextMessage.
-//
-// An application can also send and receive messages using the io.WriteCloser
-// and io.Reader interfaces. To send a message, call the connection NextWriter
-// method to get an io.WriteCloser, write the message to the writer and close
-// the writer when done. To receive a message, call the connection NextReader
-// method to get an io.Reader and read until io.EOF is returned. This snippet
-// snippet shows how to echo messages using the NextWriter and NextReader
-// methods:
-//
-// for {
-// messageType, r, err := conn.NextReader()
-// if err != nil {
-// return
-// }
-// w, err := conn.NextWriter(messageType)
-// if err != nil {
-// return err
-// }
-// if _, err := io.Copy(w, r); err != nil {
-// return err
-// }
-// if err := w.Close(); err != nil {
-// return err
-// }
-// }
-//
-// Data Messages
-//
-// The WebSocket protocol distinguishes between text and binary data messages.
-// Text messages are interpreted as UTF-8 encoded text. The interpretation of
-// binary messages is left to the application.
-//
-// This package uses the TextMessage and BinaryMessage integer constants to
-// identify the two data message types. The ReadMessage and NextReader methods
-// return the type of the received message. The messageType argument to the
-// WriteMessage and NextWriter methods specifies the type of a sent message.
-//
-// It is the application's responsibility to ensure that text messages are
-// valid UTF-8 encoded text.
-//
-// Control Messages
-//
-// The WebSocket protocol defines three types of control messages: close, ping
-// and pong. Call the connection WriteControl, WriteMessage or NextWriter
-// methods to send a control message to the peer.
-//
-// Connections handle received ping and pong messages by invoking a callback
-// function set with SetPingHandler and SetPongHandler methods. These callback
-// functions can be invoked from the ReadMessage method, the NextReader method
-// or from a call to the data message reader returned from NextReader.
-//
-// Connections handle received close messages by returning an error from the
-// ReadMessage method, the NextReader method or from a call to the data message
-// reader returned from NextReader.
-//
-// Concurrency
-//
-// Connections do not support concurrent calls to the write methods
-// (NextWriter, SetWriteDeadline, WriteMessage) or concurrent calls to the read
-// methods methods (NextReader, SetReadDeadline, ReadMessage). Connections do
-// support a concurrent reader and writer.
-//
-// The Close and WriteControl methods can be called concurrently with all other
-// methods.
-//
-// Read is Required
-//
-// The application must read the connection to process ping and close messages
-// sent from the peer. If the application is not otherwise interested in
-// messages from the peer, then the application should start a goroutine to read
-// and discard messages from the peer. A simple example is:
-//
-// func readLoop(c *websocket.Conn) {
-// for {
-// if _, _, err := c.NextReader(); err != nil {
-// c.Close()
-// break
-// }
-// }
-// }
-//
-// Origin Considerations
-//
-// Web browsers allow Javascript applications to open a WebSocket connection to
-// any host. It's up to the server to enforce an origin policy using the Origin
-// request header sent by the browser.
-//
-// The Upgrader calls the function specified in the CheckOrigin field to check
-// the origin. If the CheckOrigin function returns false, then the Upgrade
-// method fails the WebSocket handshake with HTTP status 403.
-//
-// If the CheckOrigin field is nil, then the Upgrader uses a safe default: fail
-// the handshake if the Origin request header is present and not equal to the
-// Host request header.
-//
-// An application can allow connections from any origin by specifying a
-// function that always returns true:
-//
-// var upgrader = websocket.Upgrader{
-// CheckOrigin: func(r *http.Request) bool { return true },
-// }
-//
-// The deprecated Upgrade function does not enforce an origin policy. It's the
-// application's responsibility to check the Origin header before calling
-// Upgrade.
-package websocket
diff --git a/vendor/github.com/gorilla/websocket/json.go b/vendor/github.com/gorilla/websocket/json.go
deleted file mode 100644
index 18e62f2..0000000
--- a/vendor/github.com/gorilla/websocket/json.go
+++ /dev/null
@@ -1,57 +0,0 @@
-// Copyright 2013 The Gorilla WebSocket Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package websocket
-
-import (
- "encoding/json"
- "io"
-)
-
-// WriteJSON is deprecated, use c.WriteJSON instead.
-func WriteJSON(c *Conn, v interface{}) error {
- return c.WriteJSON(v)
-}
-
-// WriteJSON writes the JSON encoding of v to the connection.
-//
-// See the documentation for encoding/json Marshal for details about the
-// conversion of Go values to JSON.
-func (c *Conn) WriteJSON(v interface{}) error {
- w, err := c.NextWriter(TextMessage)
- if err != nil {
- return err
- }
- err1 := json.NewEncoder(w).Encode(v)
- err2 := w.Close()
- if err1 != nil {
- return err1
- }
- return err2
-}
-
-// ReadJSON is deprecated, use c.ReadJSON instead.
-func ReadJSON(c *Conn, v interface{}) error {
- return c.ReadJSON(v)
-}
-
-// ReadJSON reads the next JSON-encoded message from the connection and stores
-// it in the value pointed to by v.
-//
-// See the documentation for the encoding/json Unmarshal function for details
-// about the conversion of JSON to a Go value.
-func (c *Conn) ReadJSON(v interface{}) error {
- _, r, err := c.NextReader()
- if err != nil {
- return err
- }
- err = json.NewDecoder(r).Decode(v)
- if err == io.EOF {
- // Decode returns io.EOF when the message is empty or all whitespace.
- // Convert to io.ErrUnexpectedEOF so that application can distinguish
- // between an error reading the JSON value and the connection closing.
- err = io.ErrUnexpectedEOF
- }
- return err
-}
diff --git a/vendor/github.com/gorilla/websocket/server.go b/vendor/github.com/gorilla/websocket/server.go
deleted file mode 100644
index e56a004..0000000
--- a/vendor/github.com/gorilla/websocket/server.go
+++ /dev/null
@@ -1,247 +0,0 @@
-// Copyright 2013 The Gorilla WebSocket Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package websocket
-
-import (
- "bufio"
- "errors"
- "net"
- "net/http"
- "net/url"
- "strings"
- "time"
-)
-
-// HandshakeError describes an error with the handshake from the peer.
-type HandshakeError struct {
- message string
-}
-
-func (e HandshakeError) Error() string { return e.message }
-
-// Upgrader specifies parameters for upgrading an HTTP connection to a
-// WebSocket connection.
-type Upgrader struct {
- // HandshakeTimeout specifies the duration for the handshake to complete.
- HandshakeTimeout time.Duration
-
- // ReadBufferSize and WriteBufferSize specify I/O buffer sizes. If a buffer
- // size is zero, then a default value of 4096 is used. The I/O buffer sizes
- // do not limit the size of the messages that can be sent or received.
- ReadBufferSize, WriteBufferSize int
-
- // Subprotocols specifies the server's supported protocols in order of
- // preference. If this field is set, then the Upgrade method negotiates a
- // subprotocol by selecting the first match in this list with a protocol
- // requested by the client.
- Subprotocols []string
-
- // Error specifies the function for generating HTTP error responses. If Error
- // is nil, then http.Error is used to generate the HTTP response.
- Error func(w http.ResponseWriter, r *http.Request, status int, reason error)
-
- // CheckOrigin returns true if the request Origin header is acceptable. If
- // CheckOrigin is nil, the host in the Origin header must not be set or
- // must match the host of the request.
- CheckOrigin func(r *http.Request) bool
-}
-
-func (u *Upgrader) returnError(w http.ResponseWriter, r *http.Request, status int, reason string) (*Conn, error) {
- err := HandshakeError{reason}
- if u.Error != nil {
- u.Error(w, r, status, err)
- } else {
- http.Error(w, http.StatusText(status), status)
- }
- return nil, err
-}
-
-// checkSameOrigin returns true if the origin is not set or is equal to the request host.
-func checkSameOrigin(r *http.Request) bool {
- origin := r.Header["Origin"]
- if len(origin) == 0 {
- return true
- }
- u, err := url.Parse(origin[0])
- if err != nil {
- return false
- }
- return u.Host == r.Host
-}
-
-func (u *Upgrader) selectSubprotocol(r *http.Request, responseHeader http.Header) string {
- if u.Subprotocols != nil {
- clientProtocols := Subprotocols(r)
- for _, serverProtocol := range u.Subprotocols {
- for _, clientProtocol := range clientProtocols {
- if clientProtocol == serverProtocol {
- return clientProtocol
- }
- }
- }
- } else if responseHeader != nil {
- return responseHeader.Get("Sec-Websocket-Protocol")
- }
- return ""
-}
-
-// Upgrade upgrades the HTTP server connection to the WebSocket protocol.
-//
-// The responseHeader is included in the response to the client's upgrade
-// request. Use the responseHeader to specify cookies (Set-Cookie) and the
-// application negotiated subprotocol (Sec-Websocket-Protocol).
-func (u *Upgrader) Upgrade(w http.ResponseWriter, r *http.Request, responseHeader http.Header) (*Conn, error) {
- if values := r.Header["Sec-Websocket-Version"]; len(values) == 0 || values[0] != "13" {
- return u.returnError(w, r, http.StatusBadRequest, "websocket: version != 13")
- }
-
- if !tokenListContainsValue(r.Header, "Connection", "upgrade") {
- return u.returnError(w, r, http.StatusBadRequest, "websocket: could not find connection header with token 'upgrade'")
- }
-
- if !tokenListContainsValue(r.Header, "Upgrade", "websocket") {
- return u.returnError(w, r, http.StatusBadRequest, "websocket: could not find upgrade header with token 'websocket'")
- }
-
- checkOrigin := u.CheckOrigin
- if checkOrigin == nil {
- checkOrigin = checkSameOrigin
- }
- if !checkOrigin(r) {
- return u.returnError(w, r, http.StatusForbidden, "websocket: origin not allowed")
- }
-
- challengeKey := r.Header.Get("Sec-Websocket-Key")
- if challengeKey == "" {
- return u.returnError(w, r, http.StatusBadRequest, "websocket: key missing or blank")
- }
-
- subprotocol := u.selectSubprotocol(r, responseHeader)
-
- var (
- netConn net.Conn
- br *bufio.Reader
- err error
- )
-
- h, ok := w.(http.Hijacker)
- if !ok {
- return u.returnError(w, r, http.StatusInternalServerError, "websocket: response does not implement http.Hijacker")
- }
- var rw *bufio.ReadWriter
- netConn, rw, err = h.Hijack()
- if err != nil {
- return u.returnError(w, r, http.StatusInternalServerError, err.Error())
- }
- br = rw.Reader
-
- if br.Buffered() > 0 {
- netConn.Close()
- return nil, errors.New("websocket: client sent data before handshake is complete")
- }
-
- c := newConn(netConn, true, u.ReadBufferSize, u.WriteBufferSize)
- c.subprotocol = subprotocol
-
- p := c.writeBuf[:0]
- p = append(p, "HTTP/1.1 101 Switching Protocols\r\nUpgrade: websocket\r\nConnection: Upgrade\r\nSec-WebSocket-Accept: "...)
- p = append(p, computeAcceptKey(challengeKey)...)
- p = append(p, "\r\n"...)
- if c.subprotocol != "" {
- p = append(p, "Sec-Websocket-Protocol: "...)
- p = append(p, c.subprotocol...)
- p = append(p, "\r\n"...)
- }
- for k, vs := range responseHeader {
- if k == "Sec-Websocket-Protocol" {
- continue
- }
- for _, v := range vs {
- p = append(p, k...)
- p = append(p, ": "...)
- for i := 0; i < len(v); i++ {
- b := v[i]
- if b <= 31 {
- // prevent response splitting.
- b = ' '
- }
- p = append(p, b)
- }
- p = append(p, "\r\n"...)
- }
- }
- p = append(p, "\r\n"...)
-
- // Clear deadlines set by HTTP server.
- netConn.SetDeadline(time.Time{})
-
- if u.HandshakeTimeout > 0 {
- netConn.SetWriteDeadline(time.Now().Add(u.HandshakeTimeout))
- }
- if _, err = netConn.Write(p); err != nil {
- netConn.Close()
- return nil, err
- }
- if u.HandshakeTimeout > 0 {
- netConn.SetWriteDeadline(time.Time{})
- }
-
- return c, nil
-}
-
-// Upgrade upgrades the HTTP server connection to the WebSocket protocol.
-//
-// This function is deprecated, use websocket.Upgrader instead.
-//
-// The application is responsible for checking the request origin before
-// calling Upgrade. An example implementation of the same origin policy is:
-//
-// if req.Header.Get("Origin") != "http://"+req.Host {
-// http.Error(w, "Origin not allowed", 403)
-// return
-// }
-//
-// If the endpoint supports subprotocols, then the application is responsible
-// for negotiating the protocol used on the connection. Use the Subprotocols()
-// function to get the subprotocols requested by the client. Use the
-// Sec-Websocket-Protocol response header to specify the subprotocol selected
-// by the application.
-//
-// The responseHeader is included in the response to the client's upgrade
-// request. Use the responseHeader to specify cookies (Set-Cookie) and the
-// negotiated subprotocol (Sec-Websocket-Protocol).
-//
-// The connection buffers IO to the underlying network connection. The
-// readBufSize and writeBufSize parameters specify the size of the buffers to
-// use. Messages can be larger than the buffers.
-//
-// If the request is not a valid WebSocket handshake, then Upgrade returns an
-// error of type HandshakeError. Applications should handle this error by
-// replying to the client with an HTTP error response.
-func Upgrade(w http.ResponseWriter, r *http.Request, responseHeader http.Header, readBufSize, writeBufSize int) (*Conn, error) {
- u := Upgrader{ReadBufferSize: readBufSize, WriteBufferSize: writeBufSize}
- u.Error = func(w http.ResponseWriter, r *http.Request, status int, reason error) {
- // don't return errors to maintain backwards compatibility
- }
- u.CheckOrigin = func(r *http.Request) bool {
- // allow all connections by default
- return true
- }
- return u.Upgrade(w, r, responseHeader)
-}
-
-// Subprotocols returns the subprotocols requested by the client in the
-// Sec-Websocket-Protocol header.
-func Subprotocols(r *http.Request) []string {
- h := strings.TrimSpace(r.Header.Get("Sec-Websocket-Protocol"))
- if h == "" {
- return nil
- }
- protocols := strings.Split(h, ",")
- for i := range protocols {
- protocols[i] = strings.TrimSpace(protocols[i])
- }
- return protocols
-}
diff --git a/vendor/github.com/gorilla/websocket/util.go b/vendor/github.com/gorilla/websocket/util.go
deleted file mode 100644
index ffdc265..0000000
--- a/vendor/github.com/gorilla/websocket/util.go
+++ /dev/null
@@ -1,44 +0,0 @@
-// Copyright 2013 The Gorilla WebSocket Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package websocket
-
-import (
- "crypto/rand"
- "crypto/sha1"
- "encoding/base64"
- "io"
- "net/http"
- "strings"
-)
-
-// tokenListContainsValue returns true if the 1#token header with the given
-// name contains token.
-func tokenListContainsValue(header http.Header, name string, value string) bool {
- for _, v := range header[name] {
- for _, s := range strings.Split(v, ",") {
- if strings.EqualFold(value, strings.TrimSpace(s)) {
- return true
- }
- }
- }
- return false
-}
-
-var keyGUID = []byte("258EAFA5-E914-47DA-95CA-C5AB0DC85B11")
-
-func computeAcceptKey(challengeKey string) string {
- h := sha1.New()
- h.Write([]byte(challengeKey))
- h.Write(keyGUID)
- return base64.StdEncoding.EncodeToString(h.Sum(nil))
-}
-
-func generateChallengeKey() (string, error) {
- p := make([]byte, 16)
- if _, err := io.ReadFull(rand.Reader, p); err != nil {
- return "", err
- }
- return base64.StdEncoding.EncodeToString(p), nil
-}
diff --git a/vendor/github.com/kr/pty/License b/vendor/github.com/kr/pty/License
deleted file mode 100644
index 6b7558b..0000000
--- a/vendor/github.com/kr/pty/License
+++ /dev/null
@@ -1,23 +0,0 @@
-Copyright (c) 2011 Keith Rarick
-
-Permission is hereby granted, free of charge, to any person
-obtaining a copy of this software and associated
-documentation files (the "Software"), to deal in the
-Software without restriction, including without limitation
-the rights to use, copy, modify, merge, publish, distribute,
-sublicense, and/or sell copies of the Software, and to
-permit persons to whom the Software is furnished to do so,
-subject to the following conditions:
-
-The above copyright notice and this permission notice shall
-be included in all copies or substantial portions of the
-Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
-PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS
-OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
-OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
-OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
-SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/vendor/github.com/kr/pty/README.md b/vendor/github.com/kr/pty/README.md
deleted file mode 100644
index 7b7900c..0000000
--- a/vendor/github.com/kr/pty/README.md
+++ /dev/null
@@ -1,36 +0,0 @@
-# pty
-
-Pty is a Go package for using unix pseudo-terminals.
-
-## Install
-
- go get github.com/kr/pty
-
-## Example
-
-```go
-package main
-
-import (
- "github.com/kr/pty"
- "io"
- "os"
- "os/exec"
-)
-
-func main() {
- c := exec.Command("grep", "--color=auto", "bar")
- f, err := pty.Start(c)
- if err != nil {
- panic(err)
- }
-
- go func() {
- f.Write([]byte("foo\n"))
- f.Write([]byte("bar\n"))
- f.Write([]byte("baz\n"))
- f.Write([]byte{4}) // EOT
- }()
- io.Copy(os.Stdout, f)
-}
-```
diff --git a/vendor/github.com/kr/pty/doc.go b/vendor/github.com/kr/pty/doc.go
deleted file mode 100644
index 190cfbe..0000000
--- a/vendor/github.com/kr/pty/doc.go
+++ /dev/null
@@ -1,16 +0,0 @@
-// Package pty provides functions for working with Unix terminals.
-package pty
-
-import (
- "errors"
- "os"
-)
-
-// ErrUnsupported is returned if a function is not
-// available on the current platform.
-var ErrUnsupported = errors.New("unsupported")
-
-// Opens a pty and its corresponding tty.
-func Open() (pty, tty *os.File, err error) {
- return open()
-}
diff --git a/vendor/github.com/kr/pty/ioctl.go b/vendor/github.com/kr/pty/ioctl.go
deleted file mode 100644
index c57c19e..0000000
--- a/vendor/github.com/kr/pty/ioctl.go
+++ /dev/null
@@ -1,13 +0,0 @@
-// +build !windows
-
-package pty
-
-import "syscall"
-
-func ioctl(fd, cmd, ptr uintptr) error {
- _, _, e := syscall.Syscall(syscall.SYS_IOCTL, fd, cmd, ptr)
- if e != 0 {
- return e
- }
- return nil
-}
diff --git a/vendor/github.com/kr/pty/ioctl_bsd.go b/vendor/github.com/kr/pty/ioctl_bsd.go
deleted file mode 100644
index 73b12c5..0000000
--- a/vendor/github.com/kr/pty/ioctl_bsd.go
+++ /dev/null
@@ -1,39 +0,0 @@
-// +build darwin dragonfly freebsd netbsd openbsd
-
-package pty
-
-// from
-const (
- _IOC_VOID uintptr = 0x20000000
- _IOC_OUT uintptr = 0x40000000
- _IOC_IN uintptr = 0x80000000
- _IOC_IN_OUT uintptr = _IOC_OUT | _IOC_IN
- _IOC_DIRMASK = _IOC_VOID | _IOC_OUT | _IOC_IN
-
- _IOC_PARAM_SHIFT = 13
- _IOC_PARAM_MASK = (1 << _IOC_PARAM_SHIFT) - 1
-)
-
-func _IOC_PARM_LEN(ioctl uintptr) uintptr {
- return (ioctl >> 16) & _IOC_PARAM_MASK
-}
-
-func _IOC(inout uintptr, group byte, ioctl_num uintptr, param_len uintptr) uintptr {
- return inout | (param_len&_IOC_PARAM_MASK)<<16 | uintptr(group)<<8 | ioctl_num
-}
-
-func _IO(group byte, ioctl_num uintptr) uintptr {
- return _IOC(_IOC_VOID, group, ioctl_num, 0)
-}
-
-func _IOR(group byte, ioctl_num uintptr, param_len uintptr) uintptr {
- return _IOC(_IOC_OUT, group, ioctl_num, param_len)
-}
-
-func _IOW(group byte, ioctl_num uintptr, param_len uintptr) uintptr {
- return _IOC(_IOC_IN, group, ioctl_num, param_len)
-}
-
-func _IOWR(group byte, ioctl_num uintptr, param_len uintptr) uintptr {
- return _IOC(_IOC_IN_OUT, group, ioctl_num, param_len)
-}
diff --git a/vendor/github.com/kr/pty/mktypes.bash b/vendor/github.com/kr/pty/mktypes.bash
deleted file mode 100644
index 0c07680..0000000
--- a/vendor/github.com/kr/pty/mktypes.bash
+++ /dev/null
@@ -1,19 +0,0 @@
-#!/usr/bin/env bash
-
-GOOSARCH="${GOOS}_${GOARCH}"
-case "$GOOSARCH" in
-_* | *_ | _)
- echo 'undefined $GOOS_$GOARCH:' "$GOOSARCH" 1>&2
- exit 1
- ;;
-esac
-
-GODEFS="go tool cgo -godefs"
-
-$GODEFS types.go |gofmt > ztypes_$GOARCH.go
-
-case $GOOS in
-freebsd|dragonfly)
- $GODEFS types_$GOOS.go |gofmt > ztypes_$GOOSARCH.go
- ;;
-esac
diff --git a/vendor/github.com/kr/pty/pty_darwin.go b/vendor/github.com/kr/pty/pty_darwin.go
deleted file mode 100644
index 4f4d5ca..0000000
--- a/vendor/github.com/kr/pty/pty_darwin.go
+++ /dev/null
@@ -1,60 +0,0 @@
-package pty
-
-import (
- "errors"
- "os"
- "syscall"
- "unsafe"
-)
-
-func open() (pty, tty *os.File, err error) {
- p, err := os.OpenFile("/dev/ptmx", os.O_RDWR, 0)
- if err != nil {
- return nil, nil, err
- }
-
- sname, err := ptsname(p)
- if err != nil {
- return nil, nil, err
- }
-
- err = grantpt(p)
- if err != nil {
- return nil, nil, err
- }
-
- err = unlockpt(p)
- if err != nil {
- return nil, nil, err
- }
-
- t, err := os.OpenFile(sname, os.O_RDWR, 0)
- if err != nil {
- return nil, nil, err
- }
- return p, t, nil
-}
-
-func ptsname(f *os.File) (string, error) {
- n := make([]byte, _IOC_PARM_LEN(syscall.TIOCPTYGNAME))
-
- err := ioctl(f.Fd(), syscall.TIOCPTYGNAME, uintptr(unsafe.Pointer(&n[0])))
- if err != nil {
- return "", err
- }
-
- for i, c := range n {
- if c == 0 {
- return string(n[:i]), nil
- }
- }
- return "", errors.New("TIOCPTYGNAME string not NUL-terminated")
-}
-
-func grantpt(f *os.File) error {
- return ioctl(f.Fd(), syscall.TIOCPTYGRANT, 0)
-}
-
-func unlockpt(f *os.File) error {
- return ioctl(f.Fd(), syscall.TIOCPTYUNLK, 0)
-}
diff --git a/vendor/github.com/kr/pty/pty_dragonfly.go b/vendor/github.com/kr/pty/pty_dragonfly.go
deleted file mode 100644
index 5431fb5..0000000
--- a/vendor/github.com/kr/pty/pty_dragonfly.go
+++ /dev/null
@@ -1,76 +0,0 @@
-package pty
-
-import (
- "errors"
- "os"
- "strings"
- "syscall"
- "unsafe"
-)
-
-// same code as pty_darwin.go
-func open() (pty, tty *os.File, err error) {
- p, err := os.OpenFile("/dev/ptmx", os.O_RDWR, 0)
- if err != nil {
- return nil, nil, err
- }
-
- sname, err := ptsname(p)
- if err != nil {
- return nil, nil, err
- }
-
- err = grantpt(p)
- if err != nil {
- return nil, nil, err
- }
-
- err = unlockpt(p)
- if err != nil {
- return nil, nil, err
- }
-
- t, err := os.OpenFile(sname, os.O_RDWR, 0)
- if err != nil {
- return nil, nil, err
- }
- return p, t, nil
-}
-
-func grantpt(f *os.File) error {
- _, err := isptmaster(f.Fd())
- return err
-}
-
-func unlockpt(f *os.File) error {
- _, err := isptmaster(f.Fd())
- return err
-}
-
-func isptmaster(fd uintptr) (bool, error) {
- err := ioctl(fd, syscall.TIOCISPTMASTER, 0)
- return err == nil, err
-}
-
-var (
- emptyFiodgnameArg fiodgnameArg
- ioctl_FIODNAME = _IOW('f', 120, unsafe.Sizeof(emptyFiodgnameArg))
-)
-
-func ptsname(f *os.File) (string, error) {
- name := make([]byte, _C_SPECNAMELEN)
- fa := fiodgnameArg{Name: (*byte)(unsafe.Pointer(&name[0])), Len: _C_SPECNAMELEN, Pad_cgo_0: [4]byte{0, 0, 0, 0}}
-
- err := ioctl(f.Fd(), ioctl_FIODNAME, uintptr(unsafe.Pointer(&fa)))
- if err != nil {
- return "", err
- }
-
- for i, c := range name {
- if c == 0 {
- s := "/dev/" + string(name[:i])
- return strings.Replace(s, "ptm", "pts", -1), nil
- }
- }
- return "", errors.New("TIOCPTYGNAME string not NUL-terminated")
-}
diff --git a/vendor/github.com/kr/pty/pty_freebsd.go b/vendor/github.com/kr/pty/pty_freebsd.go
deleted file mode 100644
index b341bab..0000000
--- a/vendor/github.com/kr/pty/pty_freebsd.go
+++ /dev/null
@@ -1,73 +0,0 @@
-package pty
-
-import (
- "errors"
- "os"
- "syscall"
- "unsafe"
-)
-
-func posix_openpt(oflag int) (fd int, err error) {
- r0, _, e1 := syscall.Syscall(syscall.SYS_POSIX_OPENPT, uintptr(oflag), 0, 0)
- fd = int(r0)
- if e1 != 0 {
- err = e1
- }
- return
-}
-
-func open() (pty, tty *os.File, err error) {
- fd, err := posix_openpt(syscall.O_RDWR | syscall.O_CLOEXEC)
- if err != nil {
- return nil, nil, err
- }
-
- p := os.NewFile(uintptr(fd), "/dev/pts")
- sname, err := ptsname(p)
- if err != nil {
- return nil, nil, err
- }
-
- t, err := os.OpenFile("/dev/"+sname, os.O_RDWR, 0)
- if err != nil {
- return nil, nil, err
- }
- return p, t, nil
-}
-
-func isptmaster(fd uintptr) (bool, error) {
- err := ioctl(fd, syscall.TIOCPTMASTER, 0)
- return err == nil, err
-}
-
-var (
- emptyFiodgnameArg fiodgnameArg
- ioctl_FIODGNAME = _IOW('f', 120, unsafe.Sizeof(emptyFiodgnameArg))
-)
-
-func ptsname(f *os.File) (string, error) {
- master, err := isptmaster(f.Fd())
- if err != nil {
- return "", err
- }
- if !master {
- return "", syscall.EINVAL
- }
-
- const n = _C_SPECNAMELEN + 1
- var (
- buf = make([]byte, n)
- arg = fiodgnameArg{Len: n, Buf: (*byte)(unsafe.Pointer(&buf[0]))}
- )
- err = ioctl(f.Fd(), ioctl_FIODGNAME, uintptr(unsafe.Pointer(&arg)))
- if err != nil {
- return "", err
- }
-
- for i, c := range buf {
- if c == 0 {
- return string(buf[:i]), nil
- }
- }
- return "", errors.New("FIODGNAME string not NUL-terminated")
-}
diff --git a/vendor/github.com/kr/pty/pty_linux.go b/vendor/github.com/kr/pty/pty_linux.go
deleted file mode 100644
index cb901a2..0000000
--- a/vendor/github.com/kr/pty/pty_linux.go
+++ /dev/null
@@ -1,46 +0,0 @@
-package pty
-
-import (
- "os"
- "strconv"
- "syscall"
- "unsafe"
-)
-
-func open() (pty, tty *os.File, err error) {
- p, err := os.OpenFile("/dev/ptmx", os.O_RDWR, 0)
- if err != nil {
- return nil, nil, err
- }
-
- sname, err := ptsname(p)
- if err != nil {
- return nil, nil, err
- }
-
- err = unlockpt(p)
- if err != nil {
- return nil, nil, err
- }
-
- t, err := os.OpenFile(sname, os.O_RDWR|syscall.O_NOCTTY, 0)
- if err != nil {
- return nil, nil, err
- }
- return p, t, nil
-}
-
-func ptsname(f *os.File) (string, error) {
- var n _C_uint
- err := ioctl(f.Fd(), syscall.TIOCGPTN, uintptr(unsafe.Pointer(&n)))
- if err != nil {
- return "", err
- }
- return "/dev/pts/" + strconv.Itoa(int(n)), nil
-}
-
-func unlockpt(f *os.File) error {
- var u _C_int
- // use TIOCSPTLCK with a zero valued arg to clear the slave pty lock
- return ioctl(f.Fd(), syscall.TIOCSPTLCK, uintptr(unsafe.Pointer(&u)))
-}
diff --git a/vendor/github.com/kr/pty/pty_unsupported.go b/vendor/github.com/kr/pty/pty_unsupported.go
deleted file mode 100644
index bd3d1e7..0000000
--- a/vendor/github.com/kr/pty/pty_unsupported.go
+++ /dev/null
@@ -1,11 +0,0 @@
-// +build !linux,!darwin,!freebsd,!dragonfly
-
-package pty
-
-import (
- "os"
-)
-
-func open() (pty, tty *os.File, err error) {
- return nil, nil, ErrUnsupported
-}
diff --git a/vendor/github.com/kr/pty/run.go b/vendor/github.com/kr/pty/run.go
deleted file mode 100644
index baecca8..0000000
--- a/vendor/github.com/kr/pty/run.go
+++ /dev/null
@@ -1,34 +0,0 @@
-// +build !windows
-
-package pty
-
-import (
- "os"
- "os/exec"
- "syscall"
-)
-
-// Start assigns a pseudo-terminal tty os.File to c.Stdin, c.Stdout,
-// and c.Stderr, calls c.Start, and returns the File of the tty's
-// corresponding pty.
-func Start(c *exec.Cmd) (pty *os.File, err error) {
- pty, tty, err := Open()
- if err != nil {
- return nil, err
- }
- defer tty.Close()
- c.Stdout = tty
- c.Stdin = tty
- c.Stderr = tty
- if c.SysProcAttr == nil {
- c.SysProcAttr = &syscall.SysProcAttr{}
- }
- c.SysProcAttr.Setctty = true
- c.SysProcAttr.Setsid = true
- err = c.Start()
- if err != nil {
- pty.Close()
- return nil, err
- }
- return pty, err
-}
diff --git a/vendor/github.com/kr/pty/util.go b/vendor/github.com/kr/pty/util.go
deleted file mode 100644
index a4fab9a..0000000
--- a/vendor/github.com/kr/pty/util.go
+++ /dev/null
@@ -1,37 +0,0 @@
-// +build !windows
-
-package pty
-
-import (
- "os"
- "syscall"
- "unsafe"
-)
-
-// Getsize returns the number of rows (lines) and cols (positions
-// in each line) in terminal t.
-func Getsize(t *os.File) (rows, cols int, err error) {
- var ws winsize
- err = windowrect(&ws, t.Fd())
- return int(ws.ws_row), int(ws.ws_col), err
-}
-
-type winsize struct {
- ws_row uint16
- ws_col uint16
- ws_xpixel uint16
- ws_ypixel uint16
-}
-
-func windowrect(ws *winsize, fd uintptr) error {
- _, _, errno := syscall.Syscall(
- syscall.SYS_IOCTL,
- fd,
- syscall.TIOCGWINSZ,
- uintptr(unsafe.Pointer(ws)),
- )
- if errno != 0 {
- return syscall.Errno(errno)
- }
- return nil
-}
diff --git a/vendor/github.com/kr/pty/ztypes_386.go b/vendor/github.com/kr/pty/ztypes_386.go
deleted file mode 100644
index ff0b8fd..0000000
--- a/vendor/github.com/kr/pty/ztypes_386.go
+++ /dev/null
@@ -1,9 +0,0 @@
-// Created by cgo -godefs - DO NOT EDIT
-// cgo -godefs types.go
-
-package pty
-
-type (
- _C_int int32
- _C_uint uint32
-)
diff --git a/vendor/github.com/kr/pty/ztypes_amd64.go b/vendor/github.com/kr/pty/ztypes_amd64.go
deleted file mode 100644
index ff0b8fd..0000000
--- a/vendor/github.com/kr/pty/ztypes_amd64.go
+++ /dev/null
@@ -1,9 +0,0 @@
-// Created by cgo -godefs - DO NOT EDIT
-// cgo -godefs types.go
-
-package pty
-
-type (
- _C_int int32
- _C_uint uint32
-)
diff --git a/vendor/github.com/kr/pty/ztypes_arm.go b/vendor/github.com/kr/pty/ztypes_arm.go
deleted file mode 100644
index ff0b8fd..0000000
--- a/vendor/github.com/kr/pty/ztypes_arm.go
+++ /dev/null
@@ -1,9 +0,0 @@
-// Created by cgo -godefs - DO NOT EDIT
-// cgo -godefs types.go
-
-package pty
-
-type (
- _C_int int32
- _C_uint uint32
-)
diff --git a/vendor/github.com/kr/pty/ztypes_arm64.go b/vendor/github.com/kr/pty/ztypes_arm64.go
deleted file mode 100644
index 6c29a4b..0000000
--- a/vendor/github.com/kr/pty/ztypes_arm64.go
+++ /dev/null
@@ -1,11 +0,0 @@
-// Created by cgo -godefs - DO NOT EDIT
-// cgo -godefs types.go
-
-// +build arm64
-
-package pty
-
-type (
- _C_int int32
- _C_uint uint32
-)
diff --git a/vendor/github.com/kr/pty/ztypes_dragonfly_amd64.go b/vendor/github.com/kr/pty/ztypes_dragonfly_amd64.go
deleted file mode 100644
index 6b0ba03..0000000
--- a/vendor/github.com/kr/pty/ztypes_dragonfly_amd64.go
+++ /dev/null
@@ -1,14 +0,0 @@
-// Created by cgo -godefs - DO NOT EDIT
-// cgo -godefs types_dragonfly.go
-
-package pty
-
-const (
- _C_SPECNAMELEN = 0x3f
-)
-
-type fiodgnameArg struct {
- Name *byte
- Len uint32
- Pad_cgo_0 [4]byte
-}
diff --git a/vendor/github.com/kr/pty/ztypes_freebsd_386.go b/vendor/github.com/kr/pty/ztypes_freebsd_386.go
deleted file mode 100644
index d997537..0000000
--- a/vendor/github.com/kr/pty/ztypes_freebsd_386.go
+++ /dev/null
@@ -1,13 +0,0 @@
-// Created by cgo -godefs - DO NOT EDIT
-// cgo -godefs types_freebsd.go
-
-package pty
-
-const (
- _C_SPECNAMELEN = 0x3f
-)
-
-type fiodgnameArg struct {
- Len int32
- Buf *byte
-}
diff --git a/vendor/github.com/kr/pty/ztypes_freebsd_amd64.go b/vendor/github.com/kr/pty/ztypes_freebsd_amd64.go
deleted file mode 100644
index 5fa102f..0000000
--- a/vendor/github.com/kr/pty/ztypes_freebsd_amd64.go
+++ /dev/null
@@ -1,14 +0,0 @@
-// Created by cgo -godefs - DO NOT EDIT
-// cgo -godefs types_freebsd.go
-
-package pty
-
-const (
- _C_SPECNAMELEN = 0x3f
-)
-
-type fiodgnameArg struct {
- Len int32
- Pad_cgo_0 [4]byte
- Buf *byte
-}
diff --git a/vendor/github.com/kr/pty/ztypes_freebsd_arm.go b/vendor/github.com/kr/pty/ztypes_freebsd_arm.go
deleted file mode 100644
index d997537..0000000
--- a/vendor/github.com/kr/pty/ztypes_freebsd_arm.go
+++ /dev/null
@@ -1,13 +0,0 @@
-// Created by cgo -godefs - DO NOT EDIT
-// cgo -godefs types_freebsd.go
-
-package pty
-
-const (
- _C_SPECNAMELEN = 0x3f
-)
-
-type fiodgnameArg struct {
- Len int32
- Buf *byte
-}
diff --git a/vendor/github.com/kr/pty/ztypes_mipsx.go b/vendor/github.com/kr/pty/ztypes_mipsx.go
deleted file mode 100644
index f0ce740..0000000
--- a/vendor/github.com/kr/pty/ztypes_mipsx.go
+++ /dev/null
@@ -1,12 +0,0 @@
-// Created by cgo -godefs - DO NOT EDIT
-// cgo -godefs types.go
-
-// +build linux
-// +build mips mipsle mips64 mips64le
-
-package pty
-
-type (
- _C_int int32
- _C_uint uint32
-)
diff --git a/vendor/github.com/kr/pty/ztypes_ppc64.go b/vendor/github.com/kr/pty/ztypes_ppc64.go
deleted file mode 100644
index 4e1af84..0000000
--- a/vendor/github.com/kr/pty/ztypes_ppc64.go
+++ /dev/null
@@ -1,11 +0,0 @@
-// +build ppc64
-
-// Created by cgo -godefs - DO NOT EDIT
-// cgo -godefs types.go
-
-package pty
-
-type (
- _C_int int32
- _C_uint uint32
-)
diff --git a/vendor/github.com/kr/pty/ztypes_ppc64le.go b/vendor/github.com/kr/pty/ztypes_ppc64le.go
deleted file mode 100644
index e6780f4..0000000
--- a/vendor/github.com/kr/pty/ztypes_ppc64le.go
+++ /dev/null
@@ -1,11 +0,0 @@
-// +build ppc64le
-
-// Created by cgo -godefs - DO NOT EDIT
-// cgo -godefs types.go
-
-package pty
-
-type (
- _C_int int32
- _C_uint uint32
-)
diff --git a/vendor/github.com/kr/pty/ztypes_s390x.go b/vendor/github.com/kr/pty/ztypes_s390x.go
deleted file mode 100644
index a7452b6..0000000
--- a/vendor/github.com/kr/pty/ztypes_s390x.go
+++ /dev/null
@@ -1,11 +0,0 @@
-// +build s390x
-
-// Created by cgo -godefs - DO NOT EDIT
-// cgo -godefs types.go
-
-package pty
-
-type (
- _C_int int32
- _C_uint uint32
-)
diff --git a/vendor/github.com/nsf/gocode/LICENSE b/vendor/github.com/nsf/gocode/LICENSE
deleted file mode 100644
index 5ce0cee..0000000
--- a/vendor/github.com/nsf/gocode/LICENSE
+++ /dev/null
@@ -1,19 +0,0 @@
-Copyright (C) 2010 nsf
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
diff --git a/vendor/github.com/nsf/gocode/README.md b/vendor/github.com/nsf/gocode/README.md
deleted file mode 100644
index 0e676e6..0000000
--- a/vendor/github.com/nsf/gocode/README.md
+++ /dev/null
@@ -1,211 +0,0 @@
-## An autocompletion daemon for the Go programming language
-
-Gocode is a helper tool which is intended to be integrated with your source code editor, like vim, neovim and emacs. It provides several advanced capabilities, which currently includes:
-
- - Context-sensitive autocompletion
-
-It is called *daemon*, because it uses client/server architecture for caching purposes. In particular, it makes autocompletions very fast. Typical autocompletion time with warm cache is 30ms, which is barely noticeable.
-
-Also watch the [demo screencast](http://nosmileface.ru/images/gocode-demo.swf).
-
-![Gocode in vim](http://nosmileface.ru/images/gocode-screenshot.png)
-
-![Gocode in emacs](http://nosmileface.ru/images/emacs-gocode.png)
-
-### Setup
-
- 1. You should have a correctly installed Go compiler environment and your personal workspace ($GOPATH). If you have no idea what **$GOPATH** is, take a look [here](http://golang.org/doc/code.html). Please make sure that your **$GOPATH/bin** is available in your **$PATH**. This is important, because most editors assume that **gocode** binary is available in one of the directories, specified by your **$PATH** environment variable. Otherwise manually copy the **gocode** binary from **$GOPATH/bin** to a location which is part of your **$PATH** after getting it in step 2.
-
- Do these steps only if you understand why you need to do them:
-
- `export GOPATH=$HOME/goprojects`
-
- `export PATH=$PATH:$GOPATH/bin`
-
- 2. Then you need to get the appropriate version of the gocode, for 6g/8g/5g compiler you can do this:
-
- `go get -u github.com/nsf/gocode` (-u flag for "update")
-
- Windows users should consider doing this instead:
-
- `go get -u -ldflags -H=windowsgui github.com/nsf/gocode`
-
- That way on the Windows OS gocode will be built as a GUI application and doing so solves hanging window issues with some of the editors.
-
- 3. Next steps are editor specific. See below.
-
-### Vim setup
-
-#### Vim manual installation
-
-Note: As of go 1.5 there is no $GOROOT/misc/vim script. Suggested installation is via [vim-go plugin](https://github.com/fatih/vim-go).
-
-In order to install vim scripts, you need to fulfill the following steps:
-
- 1. Install official Go vim scripts from **$GOROOT/misc/vim**. If you did that already, proceed to the step 2.
-
- 2. Install gocode vim scripts. Usually it's enough to do the following:
-
- 2.1. `vim/update.sh`
-
- **update.sh** script does the following:
-
- #!/bin/sh
- mkdir -p "$HOME/.vim/autoload"
- mkdir -p "$HOME/.vim/ftplugin/go"
- cp "${0%/*}/autoload/gocomplete.vim" "$HOME/.vim/autoload"
- cp "${0%/*}/ftplugin/go/gocomplete.vim" "$HOME/.vim/ftplugin/go"
-
- 2.2. Alternatively, you can create symlinks using symlink.sh script in order to avoid running update.sh after every gocode update.
-
- **symlink.sh** script does the following:
-
- #!/bin/sh
- cd "${0%/*}"
- ROOTDIR=`pwd`
- mkdir -p "$HOME/.vim/autoload"
- mkdir -p "$HOME/.vim/ftplugin/go"
- ln -s "$ROOTDIR/autoload/gocomplete.vim" "$HOME/.vim/autoload/"
- ln -s "$ROOTDIR/ftplugin/go/gocomplete.vim" "$HOME/.vim/ftplugin/go/"
-
- 3. Make sure vim has filetype plugin enabled. Simply add that to your **.vimrc**:
-
- `filetype plugin on`
-
- 4. Autocompletion should work now. Use `` for autocompletion (omnifunc autocompletion).
-
-#### Using Vundle in Vim
-
-Add the following line to your **.vimrc**:
-
-`Plugin 'nsf/gocode', {'rtp': 'vim/'}`
-
-And then update your packages by running `:PluginInstall`.
-
-#### Using vim-plug in Vim
-
-Add the following line to your **.vimrc**:
-
-`Plug 'nsf/gocode', { 'rtp': 'vim', 'do': '~/.vim/plugged/gocode/vim/symlink.sh' }`
-
-And then update your packages by running `:PlugInstall`.
-
-#### Other
-
-Alternatively take a look at the vundle/pathogen friendly repo: https://github.com/Blackrush/vim-gocode.
-
-### Neovim setup
-#### Neovim manual installation
-
- Neovim users should also follow `Vim manual installation`, except that you should goto `gocode/nvim` in step 2, and remember that, the Neovim configuration file is `~/.config/nvim/init.vim`.
-
-#### Using Vundle in Neovim
-
-Add the following line to your **init.vim**:
-
-`Plugin 'nsf/gocode', {'rtp': 'nvim/'}`
-
-And then update your packages by running `:PluginInstall`.
-
-#### Using vim-plug in Neovim
-
-Add the following line to your **init.vim**:
-
-`Plug 'nsf/gocode', { 'rtp': 'nvim', 'do': '~/.config/nvim/plugged/gocode/nvim/symlink.sh' }`
-
-And then update your packages by running `:PlugInstall`.
-
-### Emacs setup
-
-In order to install emacs script, you need to fulfill the following steps:
-
- 1. Install [auto-complete-mode](http://www.emacswiki.org/emacs/AutoComplete)
-
- 2. Copy **emacs/go-autocomplete.el** file from the gocode source distribution to a directory which is in your 'load-path' in emacs.
-
- 3. Add these lines to your **.emacs**:
-
- (require 'go-autocomplete)
- (require 'auto-complete-config)
- (ac-config-default)
-
-Also, there is an alternative plugin for emacs using company-mode. See `emacs-company/README` for installation instructions.
-
-If you're a MacOSX user, you may find that script useful: https://github.com/purcell/exec-path-from-shell. It helps you with setting up the right environment variables as Go and gocode require it. By default it pulls the PATH, but don't forget to add the GOPATH as well, e.g.:
-
-```
-(when (memq window-system '(mac ns))
- (exec-path-from-shell-initialize)
- (exec-path-from-shell-copy-env "GOPATH"))
-```
-
-### Options
-
-You can change all available options using `gocode set` command. The config file uses json format and is usually stored somewhere in **~/.config/gocode** directory. On windows it's stored in the appropriate AppData folder. It's suggested to avoid modifying config file manually, do that using the `gocode set` command.
-
-`gocode set` lists all options and their values.
-
-`gocode set ` shows the value of that *option*.
-
-`gocode set ` sets the new *value* for that *option*.
-
- - *propose-builtins*
-
- A boolean option. If **true**, gocode will add built-in types, functions and constants to autocompletion proposals. Default: **false**.
-
- - *lib-path*
-
- A string option. Allows you to add search paths for packages. By default, gocode only searches **$GOPATH/pkg/$GOOS_$GOARCH** and **$GOROOT/pkg/$GOOS_$GOARCH** in terms of previously existed environment variables. Also you can specify multiple paths using ':' (colon) as a separator (on Windows use semicolon ';'). The paths specified by *lib-path* are prepended to the default ones.
-
- - *autobuild*
-
- A boolean option. If **true**, gocode will try to automatically build out-of-date packages when their source files are modified, in order to obtain the freshest autocomplete results for them. This feature is experimental. Default: **false**.
-
- - *force-debug-output*
-
- A string option. If is not empty, gocode will forcefully redirect the logging into that file. Also forces enabling of the debug mode on the server side. Default: "" (empty).
-
- - *package-lookup-mode*
-
- A string option. If **go**, use standard Go package lookup rules. If **gb**, use gb-specific lookup rules. See https://github.com/constabulary/gb for details. Default: **go**.
-
- - *close-timeout*
-
- An integer option. If there have been no completion requests after this number of seconds, the gocode process will terminate. Defaults to 1800 (30 minutes).
-
- - *unimported-packages*
-
- A boolean option. If set to true, gocode will try to import certain known packages automatically for identifiers which cannot be resolved otherwise. Currently only a limited set of standard library packages are supported. Default: **false**.
-
- - *partials*
-
- A boolean option. If set to false, gocode will not filter autocompletion results based on entered prefix before the cursor. Instead it will return all available autocompletion results viable for a given context. Whether this option is set to true or false, gocode will return a valid prefix length for output formats which support it. Setting this option to a non-default value may result in editor misbehaviour. Default: **true**.
-
- - *ignore-case*
-
- A boolean option. If set to true, gocode will perform case-insensitive matching when doing prefix-based filtering. Default: **false**.
-
- - *class-filtering*
-
- A boolean option. Enables or disables gocode's feature where it performs class-based filtering if partial input matches corresponding class keyword: const, var, type, func, package. Default: **true**.
-
-### Debugging
-
-If something went wrong, the first thing you may want to do is manually start the gocode daemon with a debug mode enabled and in a separate terminal window. It will show you all the stack traces, panics if any and additional info about autocompletion requests. Shutdown the daemon if it was already started and run a new one explicitly with a debug mode enabled:
-
-`gocode close`
-
-`gocode -s -debug`
-
-Please, report bugs, feature suggestions and other rants to the [github issue tracker](http://github.com/nsf/gocode/issues) of this project.
-
-### Developing
-
-There is [Guide for IDE/editor plugin developers](docs/IDE_integration.md).
-
-If you have troubles, please, contact me and I will try to do my best answering your questions. You can contact me via email . Or for short question find me on IRC: #go-nuts @ freenode.
-
-### Misc
-
- - It's a good idea to use the latest git version always. I'm trying to keep it in a working state.
- - Use `go install` (not `go build`) for building a local source tree. The objects in `pkg/` are needed for Gocode to work.
diff --git a/vendor/github.com/nsf/gocode/autocompletecontext.go b/vendor/github.com/nsf/gocode/autocompletecontext.go
deleted file mode 100644
index d5d4bc4..0000000
--- a/vendor/github.com/nsf/gocode/autocompletecontext.go
+++ /dev/null
@@ -1,808 +0,0 @@
-package main
-
-import (
- "bytes"
- "fmt"
- "go/ast"
- "go/parser"
- "go/token"
- "log"
- "os"
- "path/filepath"
- "runtime"
- "sort"
- "strings"
- "time"
-)
-
-//-------------------------------------------------------------------------
-// out_buffers
-//
-// Temporary structure for writing autocomplete response.
-//-------------------------------------------------------------------------
-
-// fields must be exported for RPC
-type candidate struct {
- Name string
- Type string
- Class decl_class
- Package string
-}
-
-type out_buffers struct {
- tmpbuf *bytes.Buffer
- candidates []candidate
- canonical_aliases map[string]string
- ctx *auto_complete_context
- tmpns map[string]bool
- ignorecase bool
-}
-
-func new_out_buffers(ctx *auto_complete_context) *out_buffers {
- b := new(out_buffers)
- b.tmpbuf = bytes.NewBuffer(make([]byte, 0, 1024))
- b.candidates = make([]candidate, 0, 64)
- b.ctx = ctx
- b.canonical_aliases = make(map[string]string)
- for _, imp := range b.ctx.current.packages {
- b.canonical_aliases[imp.abspath] = imp.alias
- }
- return b
-}
-
-func (b *out_buffers) Len() int {
- return len(b.candidates)
-}
-
-func (b *out_buffers) Less(i, j int) bool {
- x := b.candidates[i]
- y := b.candidates[j]
- if x.Class == y.Class {
- return x.Name < y.Name
- }
- return x.Class < y.Class
-}
-
-func (b *out_buffers) Swap(i, j int) {
- b.candidates[i], b.candidates[j] = b.candidates[j], b.candidates[i]
-}
-
-func (b *out_buffers) append_decl(p, name, pkg string, decl *decl, class decl_class) {
- c1 := !g_config.ProposeBuiltins && decl.scope == g_universe_scope && decl.name != "Error"
- c2 := class != decl_invalid && decl.class != class
- c3 := class == decl_invalid && !has_prefix(name, p, b.ignorecase)
- c4 := !decl.matches()
- c5 := !check_type_expr(decl.typ)
-
- if c1 || c2 || c3 || c4 || c5 {
- return
- }
-
- decl.pretty_print_type(b.tmpbuf, b.canonical_aliases)
- b.candidates = append(b.candidates, candidate{
- Name: name,
- Type: b.tmpbuf.String(),
- Class: decl.class,
- Package: pkg,
- })
- b.tmpbuf.Reset()
-}
-
-func (b *out_buffers) append_embedded(p string, decl *decl, pkg string, class decl_class) {
- if decl.embedded == nil {
- return
- }
-
- first_level := false
- if b.tmpns == nil {
- // first level, create tmp namespace
- b.tmpns = make(map[string]bool)
- first_level = true
-
- // add all children of the current decl to the namespace
- for _, c := range decl.children {
- b.tmpns[c.name] = true
- }
- }
-
- for _, emb := range decl.embedded {
- typedecl := type_to_decl(emb, decl.scope)
- if typedecl == nil {
- continue
- }
-
- // could be type alias
- if typedecl.is_alias() {
- typedecl = typedecl.type_dealias()
- }
-
- // prevent infinite recursion here
- if typedecl.is_visited() {
- continue
- }
- typedecl.set_visited()
- defer typedecl.clear_visited()
-
- for _, c := range typedecl.children {
- if _, has := b.tmpns[c.name]; has {
- continue
- }
- b.append_decl(p, c.name, pkg, c, class)
- b.tmpns[c.name] = true
- }
- b.append_embedded(p, typedecl, pkg, class)
- }
-
- if first_level {
- // remove tmp namespace
- b.tmpns = nil
- }
-}
-
-//-------------------------------------------------------------------------
-// auto_complete_context
-//
-// Context that holds cache structures for autocompletion needs. It
-// includes cache for packages and for main package files.
-//-------------------------------------------------------------------------
-
-type auto_complete_context struct {
- current *auto_complete_file // currently edited file
- others []*decl_file_cache // other files of the current package
- pkg *scope
-
- pcache package_cache // packages cache
- declcache *decl_cache // top-level declarations cache
-}
-
-func new_auto_complete_context(pcache package_cache, declcache *decl_cache) *auto_complete_context {
- c := new(auto_complete_context)
- c.current = new_auto_complete_file("", declcache.context)
- c.pcache = pcache
- c.declcache = declcache
- return c
-}
-
-func (c *auto_complete_context) update_caches() {
- // temporary map for packages that we need to check for a cache expiration
- // map is used as a set of unique items to prevent double checks
- ps := make(map[string]*package_file_cache)
-
- // collect import information from all of the files
- c.pcache.append_packages(ps, c.current.packages)
- c.others = get_other_package_files(c.current.name, c.current.package_name, c.declcache)
- for _, other := range c.others {
- c.pcache.append_packages(ps, other.packages)
- }
-
- update_packages(ps)
-
- // fix imports for all files
- fixup_packages(c.current.filescope, c.current.packages, c.pcache)
- for _, f := range c.others {
- fixup_packages(f.filescope, f.packages, c.pcache)
- }
-
- // At this point we have collected all top level declarations, now we need to
- // merge them in the common package block.
- c.merge_decls()
-}
-
-func (c *auto_complete_context) merge_decls() {
- c.pkg = new_scope(g_universe_scope)
- merge_decls(c.current.filescope, c.pkg, c.current.decls)
- merge_decls_from_packages(c.pkg, c.current.packages, c.pcache)
- for _, f := range c.others {
- merge_decls(f.filescope, c.pkg, f.decls)
- merge_decls_from_packages(c.pkg, f.packages, c.pcache)
- }
-
- // special pass for type aliases which also have methods, while this is
- // valid code, it shouldn't happen a lot in practice, so, whatever
- // let's move all type alias methods to their first non-alias type down in
- // the chain
- propagate_type_alias_methods(c.pkg)
-}
-
-func (c *auto_complete_context) make_decl_set(scope *scope) map[string]*decl {
- set := make(map[string]*decl, len(c.pkg.entities)*2)
- make_decl_set_recursive(set, scope)
- return set
-}
-
-func (c *auto_complete_context) get_candidates_from_set(set map[string]*decl, partial string, class decl_class, b *out_buffers) {
- for key, value := range set {
- if value == nil {
- continue
- }
- value.infer_type()
- pkgname := ""
- if pkg, ok := c.pcache[value.name]; ok {
- pkgname = pkg.import_name
- }
- b.append_decl(partial, key, pkgname, value, class)
- }
-}
-
-func (c *auto_complete_context) get_candidates_from_decl_alias(cc cursor_context, class decl_class, b *out_buffers) {
- if cc.decl.is_visited() {
- return
- }
-
- cc.decl = cc.decl.type_dealias()
- if cc.decl == nil {
- return
- }
-
- cc.decl.set_visited()
- defer cc.decl.clear_visited()
-
- c.get_candidates_from_decl(cc, class, b)
- return
-}
-
-func (c *auto_complete_context) decl_package_import_path(decl *decl) string {
- if decl == nil || decl.scope == nil {
- return ""
- }
- if pkg, ok := c.pcache[decl.scope.pkgname]; ok {
- return pkg.import_name
- }
- return ""
-}
-
-func (c *auto_complete_context) get_candidates_from_decl(cc cursor_context, class decl_class, b *out_buffers) {
- if cc.decl.is_alias() {
- c.get_candidates_from_decl_alias(cc, class, b)
- return
- }
-
- // propose all children of a subject declaration and
- for _, decl := range cc.decl.children {
- if cc.decl.class == decl_package && !ast.IsExported(decl.name) {
- continue
- }
- if cc.struct_field {
- // if we're autocompleting struct field init, skip all methods
- if _, ok := decl.typ.(*ast.FuncType); ok {
- continue
- }
- }
- b.append_decl(cc.partial, decl.name, c.decl_package_import_path(decl), decl, class)
- }
- // propose all children of an underlying struct/interface type
- adecl := advance_to_struct_or_interface(cc.decl)
- if adecl != nil && adecl != cc.decl {
- for _, decl := range adecl.children {
- if decl.class == decl_var {
- b.append_decl(cc.partial, decl.name, c.decl_package_import_path(decl), decl, class)
- }
- }
- }
- // propose all children of its embedded types
- b.append_embedded(cc.partial, cc.decl, c.decl_package_import_path(cc.decl), class)
-}
-
-func (c *auto_complete_context) get_import_candidates(partial string, b *out_buffers) {
- currentPackagePath, pkgdirs := g_daemon.context.pkg_dirs()
- resultSet := map[string]struct{}{}
- for _, pkgdir := range pkgdirs {
- // convert srcpath to pkgpath and get candidates
- get_import_candidates_dir(pkgdir, filepath.FromSlash(partial), b.ignorecase, currentPackagePath, resultSet)
- }
- for k := range resultSet {
- b.candidates = append(b.candidates, candidate{Name: k, Class: decl_import})
- }
-}
-
-func get_import_candidates_dir(root, partial string, ignorecase bool, currentPackagePath string, r map[string]struct{}) {
- var fpath string
- var match bool
- if strings.HasSuffix(partial, "/") {
- fpath = filepath.Join(root, partial)
- } else {
- fpath = filepath.Join(root, filepath.Dir(partial))
- match = true
- }
- fi := readdir(fpath)
- for i := range fi {
- name := fi[i].Name()
- rel, err := filepath.Rel(root, filepath.Join(fpath, name))
- if err != nil {
- panic(err)
- }
- if match && !has_prefix(rel, partial, ignorecase) {
- continue
- } else if fi[i].IsDir() {
- get_import_candidates_dir(root, rel+string(filepath.Separator), ignorecase, currentPackagePath, r)
- } else {
- ext := filepath.Ext(name)
- if ext != ".a" {
- continue
- } else {
- rel = rel[0 : len(rel)-2]
- }
- if ipath, ok := vendorlessImportPath(filepath.ToSlash(rel), currentPackagePath); ok {
- r[ipath] = struct{}{}
- }
- }
- }
-}
-
-// returns three slices of the same length containing:
-// 1. apropos names
-// 2. apropos types (pretty-printed)
-// 3. apropos classes
-// and length of the part that should be replaced (if any)
-func (c *auto_complete_context) apropos(file []byte, filename string, cursor int) ([]candidate, int) {
- c.current.cursor = cursor
- c.current.name = filename
-
- // Update caches and parse the current file.
- // This process is quite complicated, because I was trying to design it in a
- // concurrent fashion. Apparently I'm not really good at that. Hopefully
- // will be better in future.
-
- // Ugly hack, but it actually may help in some cases. Insert a
- // semicolon right at the cursor location.
- filesemi := make([]byte, len(file)+1)
- copy(filesemi, file[:cursor])
- filesemi[cursor] = ';'
- copy(filesemi[cursor+1:], file[cursor:])
-
- // Does full processing of the currently edited file (top-level declarations plus
- // active function).
- c.current.process_data(filesemi)
-
- // Updates cache of other files and packages. See the function for details of
- // the process. At the end merges all the top-level declarations into the package
- // block.
- c.update_caches()
-
- // And we're ready to Go. ;)
-
- b := new_out_buffers(c)
- if g_config.IgnoreCase {
- if *g_debug {
- log.Printf("ignoring case sensitivity")
- }
- b.ignorecase = true
- }
-
- cc, ok := c.deduce_cursor_context(file, cursor)
- partial := len(cc.partial)
- if !g_config.Partials {
- if *g_debug {
- log.Printf("not performing partial prefix matching")
- }
- cc.partial = ""
- }
- if !ok {
- var d *decl
- if ident, ok := cc.expr.(*ast.Ident); ok && g_config.UnimportedPackages {
- p := resolveKnownPackageIdent(ident.Name, c.current.name, c.current.context)
- if p != nil {
- c.pcache[p.name] = p
- d = p.main
- }
- }
- if d == nil {
- return nil, 0
- }
- cc.decl = d
- }
-
- class := decl_invalid
- if g_config.ClassFiltering {
- switch cc.partial {
- case "const":
- class = decl_const
- case "var":
- class = decl_var
- case "type":
- class = decl_type
- case "func":
- class = decl_func
- case "package":
- class = decl_package
- }
- }
-
- if cc.decl_import {
- c.get_import_candidates(cc.partial, b)
- if cc.partial != "" && len(b.candidates) == 0 {
- // as a fallback, try case insensitive approach
- b.ignorecase = true
- c.get_import_candidates(cc.partial, b)
- }
- } else if cc.decl == nil {
- // In case if no declaraion is a subject of completion, propose all:
- set := c.make_decl_set(c.current.scope)
- c.get_candidates_from_set(set, cc.partial, class, b)
- if cc.partial != "" && len(b.candidates) == 0 {
- // as a fallback, try case insensitive approach
- b.ignorecase = true
- c.get_candidates_from_set(set, cc.partial, class, b)
- }
- } else {
- c.get_candidates_from_decl(cc, class, b)
- if cc.partial != "" && len(b.candidates) == 0 {
- // as a fallback, try case insensitive approach
- b.ignorecase = true
- c.get_candidates_from_decl(cc, class, b)
- }
- }
-
- if len(b.candidates) == 0 {
- return nil, 0
- }
-
- sort.Sort(b)
- return b.candidates, partial
-}
-
-func update_packages(ps map[string]*package_file_cache) {
- // initiate package cache update
- done := make(chan bool)
- for _, p := range ps {
- go func(p *package_file_cache) {
- defer func() {
- if err := recover(); err != nil {
- print_backtrace(err)
- done <- false
- }
- }()
- p.update_cache()
- done <- true
- }(p)
- }
-
- // wait for its completion
- for _ = range ps {
- if !<-done {
- panic("One of the package cache updaters panicked")
- }
- }
-}
-
-func collect_type_alias_methods(d *decl) map[string]*decl {
- if d == nil || d.is_visited() || !d.is_alias() {
- return nil
- }
- d.set_visited()
- defer d.clear_visited()
-
- // add own methods
- m := map[string]*decl{}
- for k, v := range d.children {
- m[k] = v
- }
-
- // recurse into more aliases
- dd := type_to_decl(d.typ, d.scope)
- for k, v := range collect_type_alias_methods(dd) {
- m[k] = v
- }
-
- return m
-}
-
-func propagate_type_alias_methods(s *scope) {
- for _, e := range s.entities {
- if !e.is_alias() {
- continue
- }
-
- methods := collect_type_alias_methods(e)
- if len(methods) == 0 {
- continue
- }
-
- dd := e.type_dealias()
- if dd == nil {
- continue
- }
-
- decl := dd.deep_copy()
- for _, v := range methods {
- decl.add_child(v)
- }
- s.entities[decl.name] = decl
- }
-}
-
-func merge_decls(filescope *scope, pkg *scope, decls map[string]*decl) {
- for _, d := range decls {
- pkg.merge_decl(d)
- }
- filescope.parent = pkg
-}
-
-func merge_decls_from_packages(pkgscope *scope, pkgs []package_import, pcache package_cache) {
- for _, p := range pkgs {
- path, alias := p.abspath, p.alias
- if alias != "." {
- continue
- }
- p := pcache[path].main
- if p == nil {
- continue
- }
- for _, d := range p.children {
- if ast.IsExported(d.name) {
- pkgscope.merge_decl(d)
- }
- }
- }
-}
-
-func fixup_packages(filescope *scope, pkgs []package_import, pcache package_cache) {
- for _, p := range pkgs {
- path, alias := p.abspath, p.alias
- if alias == "" {
- alias = pcache[path].defalias
- }
- // skip packages that will be merged to the package scope
- if alias == "." {
- continue
- }
- filescope.replace_decl(alias, pcache[path].main)
- }
-}
-
-func get_other_package_files(filename, packageName string, declcache *decl_cache) []*decl_file_cache {
- others := find_other_package_files(filename, packageName)
-
- ret := make([]*decl_file_cache, len(others))
- done := make(chan *decl_file_cache)
-
- for _, nm := range others {
- go func(name string) {
- defer func() {
- if err := recover(); err != nil {
- print_backtrace(err)
- done <- nil
- }
- }()
- done <- declcache.get_and_update(name)
- }(nm)
- }
-
- for i := range others {
- ret[i] = <-done
- if ret[i] == nil {
- panic("One of the decl cache updaters panicked")
- }
- }
-
- return ret
-}
-
-func find_other_package_files(filename, package_name string) []string {
- if filename == "" {
- return nil
- }
-
- dir, file := filepath.Split(filename)
- files_in_dir, err := readdir_lstat(dir)
- if err != nil {
- panic(err)
- }
-
- count := 0
- for _, stat := range files_in_dir {
- ok, _ := filepath.Match("*.go", stat.Name())
- if !ok || stat.Name() == file {
- continue
- }
- count++
- }
-
- out := make([]string, 0, count)
- for _, stat := range files_in_dir {
- const non_regular = os.ModeDir | os.ModeSymlink |
- os.ModeDevice | os.ModeNamedPipe | os.ModeSocket
-
- ok, _ := filepath.Match("*.go", stat.Name())
- if !ok || stat.Name() == file || stat.Mode()&non_regular != 0 {
- continue
- }
-
- abspath := filepath.Join(dir, stat.Name())
- if file_package_name(abspath) == package_name {
- n := len(out)
- out = out[:n+1]
- out[n] = abspath
- }
- }
-
- return out
-}
-
-func file_package_name(filename string) string {
- file, _ := parser.ParseFile(token.NewFileSet(), filename, nil, parser.PackageClauseOnly)
- return file.Name.Name
-}
-
-func make_decl_set_recursive(set map[string]*decl, scope *scope) {
- for name, ent := range scope.entities {
- if _, ok := set[name]; !ok {
- set[name] = ent
- }
- }
- if scope.parent != nil {
- make_decl_set_recursive(set, scope.parent)
- }
-}
-
-func check_func_field_list(f *ast.FieldList) bool {
- if f == nil {
- return true
- }
-
- for _, field := range f.List {
- if !check_type_expr(field.Type) {
- return false
- }
- }
- return true
-}
-
-// checks for a type expression correctness, it the type expression has
-// ast.BadExpr somewhere, returns false, otherwise true
-func check_type_expr(e ast.Expr) bool {
- switch t := e.(type) {
- case *ast.StarExpr:
- return check_type_expr(t.X)
- case *ast.ArrayType:
- return check_type_expr(t.Elt)
- case *ast.SelectorExpr:
- return check_type_expr(t.X)
- case *ast.FuncType:
- a := check_func_field_list(t.Params)
- b := check_func_field_list(t.Results)
- return a && b
- case *ast.MapType:
- a := check_type_expr(t.Key)
- b := check_type_expr(t.Value)
- return a && b
- case *ast.Ellipsis:
- return check_type_expr(t.Elt)
- case *ast.ChanType:
- return check_type_expr(t.Value)
- case *ast.BadExpr:
- return false
- default:
- return true
- }
-}
-
-//-------------------------------------------------------------------------
-// Status output
-//-------------------------------------------------------------------------
-
-type decl_slice []*decl
-
-func (s decl_slice) Less(i, j int) bool {
- if s[i].class != s[j].class {
- return s[i].name < s[j].name
- }
- return s[i].class < s[j].class
-}
-func (s decl_slice) Len() int { return len(s) }
-func (s decl_slice) Swap(i, j int) { s[i], s[j] = s[j], s[i] }
-
-const (
- color_red = "\033[0;31m"
- color_red_bold = "\033[1;31m"
- color_green = "\033[0;32m"
- color_green_bold = "\033[1;32m"
- color_yellow = "\033[0;33m"
- color_yellow_bold = "\033[1;33m"
- color_blue = "\033[0;34m"
- color_blue_bold = "\033[1;34m"
- color_magenta = "\033[0;35m"
- color_magenta_bold = "\033[1;35m"
- color_cyan = "\033[0;36m"
- color_cyan_bold = "\033[1;36m"
- color_white = "\033[0;37m"
- color_white_bold = "\033[1;37m"
- color_none = "\033[0m"
-)
-
-var g_decl_class_to_color = [...]string{
- decl_const: color_white_bold,
- decl_var: color_magenta,
- decl_type: color_cyan,
- decl_func: color_green,
- decl_package: color_red,
- decl_methods_stub: color_red,
-}
-
-var g_decl_class_to_string_status = [...]string{
- decl_const: " const",
- decl_var: " var",
- decl_type: " type",
- decl_func: " func",
- decl_package: "package",
- decl_methods_stub: " stub",
-}
-
-func (c *auto_complete_context) status() string {
-
- buf := bytes.NewBuffer(make([]byte, 0, 4096))
- fmt.Fprintf(buf, "Server's GOMAXPROCS == %d\n", runtime.GOMAXPROCS(0))
- fmt.Fprintf(buf, "\nPackage cache contains %d entries\n", len(c.pcache))
- fmt.Fprintf(buf, "\nListing these entries:\n")
- for _, mod := range c.pcache {
- fmt.Fprintf(buf, "\tname: %s (default alias: %s)\n", mod.name, mod.defalias)
- fmt.Fprintf(buf, "\timports %d declarations and %d packages\n", len(mod.main.children), len(mod.others))
- if mod.mtime == -1 {
- fmt.Fprintf(buf, "\tthis package stays in cache forever (built-in package)\n")
- } else {
- mtime := time.Unix(0, mod.mtime)
- fmt.Fprintf(buf, "\tlast modification time: %s\n", mtime)
- }
- fmt.Fprintf(buf, "\n")
- }
- if c.current.name != "" {
- fmt.Fprintf(buf, "Last edited file: %s (package: %s)\n", c.current.name, c.current.package_name)
- if len(c.others) > 0 {
- fmt.Fprintf(buf, "\nOther files from the current package:\n")
- }
- for _, f := range c.others {
- fmt.Fprintf(buf, "\t%s\n", f.name)
- }
- fmt.Fprintf(buf, "\nListing declarations from files:\n")
-
- const status_decls = "\t%s%s" + color_none + " " + color_yellow + "%s" + color_none + "\n"
- const status_decls_children = "\t%s%s" + color_none + " " + color_yellow + "%s" + color_none + " (%d)\n"
-
- fmt.Fprintf(buf, "\n%s:\n", c.current.name)
- ds := make(decl_slice, len(c.current.decls))
- i := 0
- for _, d := range c.current.decls {
- ds[i] = d
- i++
- }
- sort.Sort(ds)
- for _, d := range ds {
- if len(d.children) > 0 {
- fmt.Fprintf(buf, status_decls_children,
- g_decl_class_to_color[d.class],
- g_decl_class_to_string_status[d.class],
- d.name, len(d.children))
- } else {
- fmt.Fprintf(buf, status_decls,
- g_decl_class_to_color[d.class],
- g_decl_class_to_string_status[d.class],
- d.name)
- }
- }
-
- for _, f := range c.others {
- fmt.Fprintf(buf, "\n%s:\n", f.name)
- ds = make(decl_slice, len(f.decls))
- i = 0
- for _, d := range f.decls {
- ds[i] = d
- i++
- }
- sort.Sort(ds)
- for _, d := range ds {
- if len(d.children) > 0 {
- fmt.Fprintf(buf, status_decls_children,
- g_decl_class_to_color[d.class],
- g_decl_class_to_string_status[d.class],
- d.name, len(d.children))
- } else {
- fmt.Fprintf(buf, status_decls,
- g_decl_class_to_color[d.class],
- g_decl_class_to_string_status[d.class],
- d.name)
- }
- }
- }
- }
- return buf.String()
-}
diff --git a/vendor/github.com/nsf/gocode/autocompletefile.go b/vendor/github.com/nsf/gocode/autocompletefile.go
deleted file mode 100644
index c68f7ca..0000000
--- a/vendor/github.com/nsf/gocode/autocompletefile.go
+++ /dev/null
@@ -1,420 +0,0 @@
-package main
-
-import (
- "bytes"
- "go/ast"
- "go/parser"
- "go/scanner"
- "go/token"
- "log"
-)
-
-func parse_decl_list(fset *token.FileSet, data []byte) ([]ast.Decl, error) {
- var buf bytes.Buffer
- buf.WriteString("package p;")
- buf.Write(data)
- file, err := parser.ParseFile(fset, "", buf.Bytes(), parser.AllErrors)
- if err != nil {
- return file.Decls, err
- }
- return file.Decls, nil
-}
-
-func log_parse_error(intro string, err error) {
- if el, ok := err.(scanner.ErrorList); ok {
- log.Printf("%s:", intro)
- for _, er := range el {
- log.Printf(" %s", er)
- }
- } else {
- log.Printf("%s: %s", intro, err)
- }
-}
-
-//-------------------------------------------------------------------------
-// auto_complete_file
-//-------------------------------------------------------------------------
-
-type auto_complete_file struct {
- name string
- package_name string
-
- decls map[string]*decl
- packages []package_import
- filescope *scope
- scope *scope
-
- cursor int // for current file buffer only
- fset *token.FileSet
- context *package_lookup_context
-}
-
-func new_auto_complete_file(name string, context *package_lookup_context) *auto_complete_file {
- p := new(auto_complete_file)
- p.name = name
- p.cursor = -1
- p.fset = token.NewFileSet()
- p.context = context
- return p
-}
-
-func (f *auto_complete_file) offset(p token.Pos) int {
- const fixlen = len("package p;")
- return f.fset.Position(p).Offset - fixlen
-}
-
-// this one is used for current file buffer exclusively
-func (f *auto_complete_file) process_data(data []byte) {
- cur, filedata, block := rip_off_decl(data, f.cursor)
- file, err := parser.ParseFile(f.fset, "", filedata, parser.AllErrors)
- if err != nil && *g_debug {
- log_parse_error("Error parsing input file (outer block)", err)
- }
- f.package_name = package_name(file)
-
- f.decls = make(map[string]*decl)
- f.packages = collect_package_imports(f.name, file.Decls, f.context)
- f.filescope = new_scope(nil)
- f.scope = f.filescope
-
- for _, d := range file.Decls {
- anonymify_ast(d, 0, f.filescope)
- }
-
- // process all top-level declarations
- for _, decl := range file.Decls {
- append_to_top_decls(f.decls, decl, f.scope)
- }
- if block != nil {
- // process local function as top-level declaration
- decls, err := parse_decl_list(f.fset, block)
- if err != nil && *g_debug {
- log_parse_error("Error parsing input file (inner block)", err)
- }
-
- for _, d := range decls {
- anonymify_ast(d, 0, f.filescope)
- }
-
- for _, decl := range decls {
- append_to_top_decls(f.decls, decl, f.scope)
- }
-
- // process function internals
- f.cursor = cur
- for _, decl := range decls {
- f.process_decl_locals(decl)
- }
- }
-
-}
-
-func (f *auto_complete_file) process_decl_locals(decl ast.Decl) {
- switch t := decl.(type) {
- case *ast.FuncDecl:
- if f.cursor_in(t.Body) {
- s := f.scope
- f.scope = new_scope(f.scope)
-
- f.process_field_list(t.Recv, s)
- f.process_field_list(t.Type.Params, s)
- f.process_field_list(t.Type.Results, s)
- f.process_block_stmt(t.Body)
- }
- default:
- v := new(func_lit_visitor)
- v.ctx = f
- ast.Walk(v, decl)
- }
-}
-
-func (f *auto_complete_file) process_decl(decl ast.Decl) {
- if t, ok := decl.(*ast.GenDecl); ok && f.offset(t.TokPos) > f.cursor {
- return
- }
- prevscope := f.scope
- foreach_decl(decl, func(data *foreach_decl_struct) {
- class := ast_decl_class(data.decl)
- if class != decl_type {
- f.scope, prevscope = advance_scope(f.scope)
- }
- for i, name := range data.names {
- typ, v, vi := data.type_value_index(i)
-
- d := new_decl_full(name.Name, class, ast_decl_flags(data.decl), typ, v, vi, prevscope)
- if d == nil {
- return
- }
-
- f.scope.add_named_decl(d)
- }
- })
-}
-
-func (f *auto_complete_file) process_block_stmt(block *ast.BlockStmt) {
- if block != nil && f.cursor_in(block) {
- f.scope, _ = advance_scope(f.scope)
-
- for _, stmt := range block.List {
- f.process_stmt(stmt)
- }
-
- // hack to process all func literals
- v := new(func_lit_visitor)
- v.ctx = f
- ast.Walk(v, block)
- }
-}
-
-type func_lit_visitor struct {
- ctx *auto_complete_file
-}
-
-func (v *func_lit_visitor) Visit(node ast.Node) ast.Visitor {
- if t, ok := node.(*ast.FuncLit); ok && v.ctx.cursor_in(t.Body) {
- s := v.ctx.scope
- v.ctx.scope = new_scope(v.ctx.scope)
-
- v.ctx.process_field_list(t.Type.Params, s)
- v.ctx.process_field_list(t.Type.Results, s)
- v.ctx.process_block_stmt(t.Body)
-
- return nil
- }
- return v
-}
-
-func (f *auto_complete_file) process_stmt(stmt ast.Stmt) {
- switch t := stmt.(type) {
- case *ast.DeclStmt:
- f.process_decl(t.Decl)
- case *ast.AssignStmt:
- f.process_assign_stmt(t)
- case *ast.IfStmt:
- if f.cursor_in_if_head(t) {
- f.process_stmt(t.Init)
- } else if f.cursor_in_if_stmt(t) {
- f.scope, _ = advance_scope(f.scope)
- f.process_stmt(t.Init)
- f.process_block_stmt(t.Body)
- f.process_stmt(t.Else)
- }
- case *ast.BlockStmt:
- f.process_block_stmt(t)
- case *ast.RangeStmt:
- f.process_range_stmt(t)
- case *ast.ForStmt:
- if f.cursor_in_for_head(t) {
- f.process_stmt(t.Init)
- } else if f.cursor_in(t.Body) {
- f.scope, _ = advance_scope(f.scope)
-
- f.process_stmt(t.Init)
- f.process_block_stmt(t.Body)
- }
- case *ast.SwitchStmt:
- f.process_switch_stmt(t)
- case *ast.TypeSwitchStmt:
- f.process_type_switch_stmt(t)
- case *ast.SelectStmt:
- f.process_select_stmt(t)
- case *ast.LabeledStmt:
- f.process_stmt(t.Stmt)
- }
-}
-
-func (f *auto_complete_file) process_select_stmt(a *ast.SelectStmt) {
- if !f.cursor_in(a.Body) {
- return
- }
- var prevscope *scope
- f.scope, prevscope = advance_scope(f.scope)
-
- var last_cursor_after *ast.CommClause
- for _, s := range a.Body.List {
- if cc := s.(*ast.CommClause); f.cursor > f.offset(cc.Colon) {
- last_cursor_after = cc
- }
- }
-
- if last_cursor_after != nil {
- if last_cursor_after.Comm != nil {
- //if lastCursorAfter.Lhs != nil && lastCursorAfter.Tok == token.DEFINE {
- if astmt, ok := last_cursor_after.Comm.(*ast.AssignStmt); ok && astmt.Tok == token.DEFINE {
- vname := astmt.Lhs[0].(*ast.Ident).Name
- v := new_decl_var(vname, nil, astmt.Rhs[0], -1, prevscope)
- if v != nil {
- f.scope.add_named_decl(v)
- }
- }
- }
- for _, s := range last_cursor_after.Body {
- f.process_stmt(s)
- }
- }
-}
-
-func (f *auto_complete_file) process_type_switch_stmt(a *ast.TypeSwitchStmt) {
- if !f.cursor_in(a.Body) {
- return
- }
- var prevscope *scope
- f.scope, prevscope = advance_scope(f.scope)
-
- f.process_stmt(a.Init)
- // type var
- var tv *decl
- if a, ok := a.Assign.(*ast.AssignStmt); ok {
- lhs := a.Lhs
- rhs := a.Rhs
- if lhs != nil && len(lhs) == 1 {
- tvname := lhs[0].(*ast.Ident).Name
- tv = new_decl_var(tvname, nil, rhs[0], -1, prevscope)
- }
- }
-
- var last_cursor_after *ast.CaseClause
- for _, s := range a.Body.List {
- if cc := s.(*ast.CaseClause); f.cursor > f.offset(cc.Colon) {
- last_cursor_after = cc
- }
- }
-
- if last_cursor_after != nil {
- if tv != nil {
- if last_cursor_after.List != nil && len(last_cursor_after.List) == 1 {
- tv.typ = last_cursor_after.List[0]
- tv.value = nil
- }
- f.scope.add_named_decl(tv)
- }
- for _, s := range last_cursor_after.Body {
- f.process_stmt(s)
- }
- }
-}
-
-func (f *auto_complete_file) process_switch_stmt(a *ast.SwitchStmt) {
- if !f.cursor_in(a.Body) {
- return
- }
- f.scope, _ = advance_scope(f.scope)
-
- f.process_stmt(a.Init)
- var last_cursor_after *ast.CaseClause
- for _, s := range a.Body.List {
- if cc := s.(*ast.CaseClause); f.cursor > f.offset(cc.Colon) {
- last_cursor_after = cc
- }
- }
- if last_cursor_after != nil {
- for _, s := range last_cursor_after.Body {
- f.process_stmt(s)
- }
- }
-}
-
-func (f *auto_complete_file) process_range_stmt(a *ast.RangeStmt) {
- if !f.cursor_in(a.Body) {
- return
- }
- var prevscope *scope
- f.scope, prevscope = advance_scope(f.scope)
-
- if a.Tok == token.DEFINE {
- if t, ok := a.Key.(*ast.Ident); ok {
- d := new_decl_var(t.Name, nil, a.X, 0, prevscope)
- if d != nil {
- d.flags |= decl_rangevar
- f.scope.add_named_decl(d)
- }
- }
-
- if a.Value != nil {
- if t, ok := a.Value.(*ast.Ident); ok {
- d := new_decl_var(t.Name, nil, a.X, 1, prevscope)
- if d != nil {
- d.flags |= decl_rangevar
- f.scope.add_named_decl(d)
- }
- }
- }
- }
-
- f.process_block_stmt(a.Body)
-}
-
-func (f *auto_complete_file) process_assign_stmt(a *ast.AssignStmt) {
- if a.Tok != token.DEFINE || f.offset(a.TokPos) > f.cursor {
- return
- }
-
- names := make([]*ast.Ident, len(a.Lhs))
- for i, name := range a.Lhs {
- id, ok := name.(*ast.Ident)
- if !ok {
- // something is wrong, just ignore the whole stmt
- return
- }
- names[i] = id
- }
-
- var prevscope *scope
- f.scope, prevscope = advance_scope(f.scope)
-
- pack := decl_pack{names, nil, a.Rhs}
- for i, name := range pack.names {
- typ, v, vi := pack.type_value_index(i)
- d := new_decl_var(name.Name, typ, v, vi, prevscope)
- if d == nil {
- continue
- }
-
- f.scope.add_named_decl(d)
- }
-}
-
-func (f *auto_complete_file) process_field_list(field_list *ast.FieldList, s *scope) {
- if field_list != nil {
- decls := ast_field_list_to_decls(field_list, decl_var, 0, s, false)
- for _, d := range decls {
- f.scope.add_named_decl(d)
- }
- }
-}
-
-func (f *auto_complete_file) cursor_in_if_head(s *ast.IfStmt) bool {
- if f.cursor > f.offset(s.If) && f.cursor <= f.offset(s.Body.Lbrace) {
- return true
- }
- return false
-}
-
-func (f *auto_complete_file) cursor_in_if_stmt(s *ast.IfStmt) bool {
- if f.cursor > f.offset(s.If) {
- // magic -10 comes from auto_complete_file.offset method, see
- // len() expr in there
- if f.offset(s.End()) == -10 || f.cursor < f.offset(s.End()) {
- return true
- }
- }
- return false
-}
-
-func (f *auto_complete_file) cursor_in_for_head(s *ast.ForStmt) bool {
- if f.cursor > f.offset(s.For) && f.cursor <= f.offset(s.Body.Lbrace) {
- return true
- }
- return false
-}
-
-func (f *auto_complete_file) cursor_in(block *ast.BlockStmt) bool {
- if f.cursor == -1 || block == nil {
- return false
- }
-
- if f.cursor > f.offset(block.Lbrace) && f.cursor <= f.offset(block.Rbrace) {
- return true
- }
- return false
-}
diff --git a/vendor/github.com/nsf/gocode/client.go b/vendor/github.com/nsf/gocode/client.go
deleted file mode 100644
index 3174a2d..0000000
--- a/vendor/github.com/nsf/gocode/client.go
+++ /dev/null
@@ -1,188 +0,0 @@
-package main
-
-import (
- "flag"
- "fmt"
- "go/build"
- "io/ioutil"
- "net/rpc"
- "os"
- "path/filepath"
- "strconv"
- "time"
-)
-
-func do_client() int {
- addr := *g_addr
- if *g_sock == "unix" {
- addr = get_socket_filename()
- }
-
- // client
- client, err := rpc.Dial(*g_sock, addr)
- if err != nil {
- if *g_sock == "unix" && file_exists(addr) {
- os.Remove(addr)
- }
-
- err = try_run_server()
- if err != nil {
- fmt.Printf("%s\n", err.Error())
- return 1
- }
- client, err = try_to_connect(*g_sock, addr)
- if err != nil {
- fmt.Printf("%s\n", err.Error())
- return 1
- }
- }
- defer client.Close()
-
- if flag.NArg() > 0 {
- switch flag.Arg(0) {
- case "autocomplete":
- cmd_auto_complete(client)
- case "close":
- cmd_close(client)
- case "status":
- cmd_status(client)
- case "drop-cache":
- cmd_drop_cache(client)
- case "set":
- cmd_set(client)
- case "options":
- cmd_options(client)
- default:
- fmt.Printf("unknown argument: %q, try running \"gocode -h\"\n", flag.Arg(0))
- return 1
- }
- }
- return 0
-}
-
-func try_run_server() error {
- path := get_executable_filename()
- args := []string{os.Args[0], "-s", "-sock", *g_sock, "-addr", *g_addr}
- cwd, _ := os.Getwd()
-
- var err error
- stdin, err := os.Open(os.DevNull)
- if err != nil {
- return err
- }
- stdout, err := os.OpenFile(os.DevNull, os.O_WRONLY, 0)
- if err != nil {
- return err
- }
- stderr, err := os.OpenFile(os.DevNull, os.O_WRONLY, 0)
- if err != nil {
- return err
- }
-
- procattr := os.ProcAttr{Dir: cwd, Env: os.Environ(), Files: []*os.File{stdin, stdout, stderr}}
- p, err := os.StartProcess(path, args, &procattr)
- if err != nil {
- return err
- }
-
- return p.Release()
-}
-
-func try_to_connect(network, address string) (client *rpc.Client, err error) {
- t := 0
- for {
- client, err = rpc.Dial(network, address)
- if err != nil && t < 1000 {
- time.Sleep(10 * time.Millisecond)
- t += 10
- continue
- }
- break
- }
-
- return
-}
-
-func prepare_file_filename_cursor() ([]byte, string, int) {
- var file []byte
- var err error
-
- if *g_input != "" {
- file, err = ioutil.ReadFile(*g_input)
- } else {
- file, err = ioutil.ReadAll(os.Stdin)
- }
-
- if err != nil {
- panic(err.Error())
- }
-
- var skipped int
- file, skipped = filter_out_shebang(file)
-
- filename := *g_input
- cursor := -1
-
- offset := ""
- switch flag.NArg() {
- case 2:
- offset = flag.Arg(1)
- case 3:
- filename = flag.Arg(1) // Override default filename
- offset = flag.Arg(2)
- }
-
- if offset != "" {
- if offset[0] == 'c' || offset[0] == 'C' {
- cursor, _ = strconv.Atoi(offset[1:])
- cursor = char_to_byte_offset(file, cursor)
- } else {
- cursor, _ = strconv.Atoi(offset)
- }
- }
-
- cursor -= skipped
- if filename != "" && !filepath.IsAbs(filename) {
- cwd, _ := os.Getwd()
- filename = filepath.Join(cwd, filename)
- }
- return file, filename, cursor
-}
-
-//-------------------------------------------------------------------------
-// commands
-//-------------------------------------------------------------------------
-
-func cmd_status(c *rpc.Client) {
- fmt.Printf("%s\n", client_status(c, 0))
-}
-
-func cmd_auto_complete(c *rpc.Client) {
- context := pack_build_context(&build.Default)
- file, filename, cursor := prepare_file_filename_cursor()
- f := get_formatter(*g_format)
- f.write_candidates(client_auto_complete(c, file, filename, cursor, context))
-}
-
-func cmd_close(c *rpc.Client) {
- client_close(c, 0)
-}
-
-func cmd_drop_cache(c *rpc.Client) {
- client_drop_cache(c, 0)
-}
-
-func cmd_set(c *rpc.Client) {
- switch flag.NArg() {
- case 1:
- fmt.Print(client_set(c, "\x00", "\x00"))
- case 2:
- fmt.Print(client_set(c, flag.Arg(1), "\x00"))
- case 3:
- fmt.Print(client_set(c, flag.Arg(1), flag.Arg(2)))
- }
-}
-
-func cmd_options(c *rpc.Client) {
- fmt.Print(client_options(c, 0))
-}
diff --git a/vendor/github.com/nsf/gocode/config.go b/vendor/github.com/nsf/gocode/config.go
deleted file mode 100644
index 075c5c0..0000000
--- a/vendor/github.com/nsf/gocode/config.go
+++ /dev/null
@@ -1,240 +0,0 @@
-package main
-
-import (
- "bytes"
- "encoding/json"
- "fmt"
- "io"
- "io/ioutil"
- "os"
- "reflect"
- "regexp"
- "strconv"
-)
-
-//-------------------------------------------------------------------------
-// config
-//
-// Structure represents persistent config storage of the gocode daemon. Usually
-// the config is located somewhere in ~/.config/gocode directory.
-//-------------------------------------------------------------------------
-
-type config struct {
- ProposeBuiltins bool `json:"propose-builtins"`
- LibPath string `json:"lib-path"`
- CustomPkgPrefix string `json:"custom-pkg-prefix"`
- CustomVendorDir string `json:"custom-vendor-dir"`
- Autobuild bool `json:"autobuild"`
- ForceDebugOutput string `json:"force-debug-output"`
- PackageLookupMode string `json:"package-lookup-mode"`
- CloseTimeout int `json:"close-timeout"`
- UnimportedPackages bool `json:"unimported-packages"`
- Partials bool `json:"partials"`
- IgnoreCase bool `json:"ignore-case"`
- ClassFiltering bool `json:"class-filtering"`
-}
-
-var g_config_desc = map[string]string{
- "propose-builtins": "If set to {true}, gocode will add built-in types, functions and constants to autocompletion proposals.",
- "lib-path": "A string option. Allows you to add search paths for packages. By default, gocode only searches {$GOPATH/pkg/$GOOS_$GOARCH} and {$GOROOT/pkg/$GOOS_$GOARCH} in terms of previously existed environment variables. Also you can specify multiple paths using ':' (colon) as a separator (on Windows use semicolon ';'). The paths specified by {lib-path} are prepended to the default ones.",
- "custom-pkg-prefix": "",
- "custom-vendor-dir": "",
- "autobuild": "If set to {true}, gocode will try to automatically build out-of-date packages when their source files are modified, in order to obtain the freshest autocomplete results for them. This feature is experimental.",
- "force-debug-output": "If is not empty, gocode will forcefully redirect the logging into that file. Also forces enabling of the debug mode on the server side.",
- "package-lookup-mode": "If set to {go}, use standard Go package lookup rules. If set to {gb}, use gb-specific lookup rules. See {https://github.com/constabulary/gb} for details.",
- "close-timeout": "If there have been no completion requests after this number of seconds, the gocode process will terminate. Default is 30 minutes.",
- "unimported-packages": "If set to {true}, gocode will try to import certain known packages automatically for identifiers which cannot be resolved otherwise. Currently only a limited set of standard library packages is supported.",
- "partials": "If set to {false}, gocode will not filter autocompletion results based on entered prefix before the cursor. Instead it will return all available autocompletion results viable for a given context. Whether this option is set to {true} or {false}, gocode will return a valid prefix length for output formats which support it. Setting this option to a non-default value may result in editor misbehaviour.",
- "ignore-case": "If set to {true}, gocode will perform case-insensitive matching when doing prefix-based filtering.",
- "class-filtering": "Enables or disables gocode's feature where it performs class-based filtering if partial input matches corresponding class keyword: const, var, type, func, package.",
-}
-
-var g_default_config = config{
- ProposeBuiltins: false,
- LibPath: "",
- CustomPkgPrefix: "",
- Autobuild: false,
- ForceDebugOutput: "",
- PackageLookupMode: "go",
- CloseTimeout: 1800,
- UnimportedPackages: false,
- Partials: true,
- IgnoreCase: false,
- ClassFiltering: true,
-}
-var g_config = g_default_config
-
-var g_string_to_bool = map[string]bool{
- "t": true,
- "true": true,
- "y": true,
- "yes": true,
- "on": true,
- "1": true,
- "f": false,
- "false": false,
- "n": false,
- "no": false,
- "off": false,
- "0": false,
-}
-
-func set_value(v reflect.Value, value string) {
- switch t := v; t.Kind() {
- case reflect.Bool:
- v, ok := g_string_to_bool[value]
- if ok {
- t.SetBool(v)
- }
- case reflect.String:
- t.SetString(value)
- case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
- v, err := strconv.ParseInt(value, 10, 64)
- if err == nil {
- t.SetInt(v)
- }
- case reflect.Float32, reflect.Float64:
- v, err := strconv.ParseFloat(value, 64)
- if err == nil {
- t.SetFloat(v)
- }
- }
-}
-
-func list_value(v reflect.Value, name string, w io.Writer) {
- switch t := v; t.Kind() {
- case reflect.Bool:
- fmt.Fprintf(w, "%s %v\n", name, t.Bool())
- case reflect.String:
- fmt.Fprintf(w, "%s \"%v\"\n", name, t.String())
- case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
- fmt.Fprintf(w, "%s %v\n", name, t.Int())
- case reflect.Float32, reflect.Float64:
- fmt.Fprintf(w, "%s %v\n", name, t.Float())
- }
-}
-
-func (this *config) list() string {
- str, typ := this.value_and_type()
- buf := bytes.NewBuffer(make([]byte, 0, 256))
- for i := 0; i < str.NumField(); i++ {
- v := str.Field(i)
- name := typ.Field(i).Tag.Get("json")
- list_value(v, name, buf)
- }
- return buf.String()
-}
-
-func (this *config) list_option(name string) string {
- str, typ := this.value_and_type()
- buf := bytes.NewBuffer(make([]byte, 0, 256))
- for i := 0; i < str.NumField(); i++ {
- v := str.Field(i)
- nm := typ.Field(i).Tag.Get("json")
- if nm == name {
- list_value(v, name, buf)
- }
- }
- return buf.String()
-}
-
-func (this *config) set_option(name, value string) string {
- str, typ := this.value_and_type()
- buf := bytes.NewBuffer(make([]byte, 0, 256))
- for i := 0; i < str.NumField(); i++ {
- v := str.Field(i)
- nm := typ.Field(i).Tag.Get("json")
- if nm == name {
- set_value(v, value)
- list_value(v, name, buf)
- }
- }
- this.write()
- return buf.String()
-
-}
-
-func (this *config) value_and_type() (reflect.Value, reflect.Type) {
- v := reflect.ValueOf(this).Elem()
- return v, v.Type()
-}
-
-func (this *config) write() error {
- data, err := json.Marshal(this)
- if err != nil {
- return err
- }
-
- // make sure config dir exists
- dir := config_dir()
- if !file_exists(dir) {
- os.MkdirAll(dir, 0755)
- }
-
- f, err := os.Create(config_file())
- if err != nil {
- return err
- }
- defer f.Close()
-
- _, err = f.Write(data)
- if err != nil {
- return err
- }
-
- return nil
-}
-
-func (this *config) read() error {
- data, err := ioutil.ReadFile(config_file())
- if err != nil {
- return err
- }
-
- err = json.Unmarshal(data, this)
- if err != nil {
- return err
- }
-
- return nil
-}
-
-func quoted(v interface{}) string {
- switch v.(type) {
- case string:
- return fmt.Sprintf("%q", v)
- case int:
- return fmt.Sprint(v)
- case bool:
- return fmt.Sprint(v)
- default:
- panic("unreachable")
- }
-}
-
-var descRE = regexp.MustCompile(`{[^}]+}`)
-
-func preprocess_desc(v string) string {
- return descRE.ReplaceAllStringFunc(v, func(v string) string {
- return color_cyan + v[1:len(v)-1] + color_none
- })
-}
-
-func (this *config) options() string {
- var buf bytes.Buffer
- fmt.Fprintf(&buf, "%sConfig file location%s: %s\n", color_white_bold, color_none, config_file())
- dv := reflect.ValueOf(g_default_config)
- v, t := this.value_and_type()
- for i, n := 0, t.NumField(); i < n; i++ {
- f := t.Field(i)
- index := f.Index
- tag := f.Tag.Get("json")
- fmt.Fprintf(&buf, "\n%s%s%s\n", color_yellow_bold, tag, color_none)
- fmt.Fprintf(&buf, "%stype%s: %s\n", color_yellow, color_none, f.Type)
- fmt.Fprintf(&buf, "%svalue%s: %s\n", color_yellow, color_none, quoted(v.FieldByIndex(index).Interface()))
- fmt.Fprintf(&buf, "%sdefault%s: %s\n", color_yellow, color_none, quoted(dv.FieldByIndex(index).Interface()))
- fmt.Fprintf(&buf, "%sdescription%s: %s\n", color_yellow, color_none, preprocess_desc(g_config_desc[tag]))
- }
-
- return buf.String()
-}
diff --git a/vendor/github.com/nsf/gocode/cursorcontext.go b/vendor/github.com/nsf/gocode/cursorcontext.go
deleted file mode 100644
index 92c036b..0000000
--- a/vendor/github.com/nsf/gocode/cursorcontext.go
+++ /dev/null
@@ -1,582 +0,0 @@
-package main
-
-import (
- "bytes"
- "go/ast"
- "go/parser"
- "go/scanner"
- "go/token"
- "log"
-)
-
-type cursor_context struct {
- decl *decl
- partial string
- struct_field bool
- decl_import bool
-
- // store expression that was supposed to be deduced to "decl", however
- // if decl is nil, then deduction failed, we could try to resolve it to
- // unimported package instead
- expr ast.Expr
-}
-
-type token_iterator struct {
- tokens []token_item
- token_index int
-}
-
-type token_item struct {
- off int
- tok token.Token
- lit string
-}
-
-func (i token_item) literal() string {
- if i.tok.IsLiteral() {
- return i.lit
- }
- return i.tok.String()
-}
-
-func new_token_iterator(src []byte, cursor int) token_iterator {
- tokens := make([]token_item, 0, 1000)
- var s scanner.Scanner
- fset := token.NewFileSet()
- file := fset.AddFile("", fset.Base(), len(src))
- s.Init(file, src, nil, 0)
- for {
- pos, tok, lit := s.Scan()
- off := fset.Position(pos).Offset
- if tok == token.EOF || cursor <= off {
- break
- }
- tokens = append(tokens, token_item{
- off: off,
- tok: tok,
- lit: lit,
- })
- }
- return token_iterator{
- tokens: tokens,
- token_index: len(tokens) - 1,
- }
-}
-
-func (this *token_iterator) token() token_item {
- return this.tokens[this.token_index]
-}
-
-func (this *token_iterator) go_back() bool {
- if this.token_index <= 0 {
- return false
- }
- this.token_index--
- return true
-}
-
-var bracket_pairs_map = map[token.Token]token.Token{
- token.RPAREN: token.LPAREN,
- token.RBRACK: token.LBRACK,
- token.RBRACE: token.LBRACE,
-}
-
-func (ti *token_iterator) skip_to_left(left, right token.Token) bool {
- if ti.token().tok == left {
- return true
- }
- balance := 1
- for balance != 0 {
- if !ti.go_back() {
- return false
- }
- switch ti.token().tok {
- case right:
- balance++
- case left:
- balance--
- }
- }
- return true
-}
-
-// when the cursor is at the ')' or ']' or '}', move the cursor to an opposite
-// bracket pair, this functions takes nested bracket pairs into account
-func (this *token_iterator) skip_to_balanced_pair() bool {
- right := this.token().tok
- left := bracket_pairs_map[right]
- return this.skip_to_left(left, right)
-}
-
-// Move the cursor to the open brace of the current block, taking nested blocks
-// into account.
-func (this *token_iterator) skip_to_left_curly() bool {
- return this.skip_to_left(token.LBRACE, token.RBRACE)
-}
-
-func (ti *token_iterator) extract_type_alike() string {
- if ti.token().tok != token.IDENT { // not Foo, return nothing
- return ""
- }
- b := ti.token().literal()
- if !ti.go_back() { // just Foo
- return b
- }
- if ti.token().tok != token.PERIOD { // not .Foo, return Foo
- return b
- }
- if !ti.go_back() { // just .Foo, return Foo (best choice recovery)
- return b
- }
- if ti.token().tok != token.IDENT { // not lib.Foo, return Foo
- return b
- }
- out := ti.token().literal() + "." + b // lib.Foo
- ti.go_back()
- return out
-}
-
-// Extract the type expression right before the enclosing curly bracket block.
-// Examples (# - the cursor):
-// &lib.Struct{Whatever: 1, Hel#} // returns "lib.Struct"
-// X{#} // returns X
-// The idea is that we check if this type expression is a type and it is, we
-// can apply special filtering for autocompletion results.
-// Sadly, this doesn't cover anonymous structs.
-func (ti *token_iterator) extract_struct_type() string {
- if !ti.skip_to_left_curly() {
- return ""
- }
- if !ti.go_back() {
- return ""
- }
- if ti.token().tok == token.LBRACE { // Foo{#{}}
- if !ti.go_back() {
- return ""
- }
- } else if ti.token().tok == token.COMMA { // Foo{abc,#{}}
- return ti.extract_struct_type()
- }
- typ := ti.extract_type_alike()
- if typ == "" {
- return ""
- }
- if ti.token().tok == token.RPAREN || ti.token().tok == token.MUL {
- return ""
- }
- return typ
-}
-
-// Starting from the token under the cursor move back and extract something
-// that resembles a valid Go primary expression. Examples of primary expressions
-// from Go spec:
-// x
-// 2
-// (s + ".txt")
-// f(3.1415, true)
-// Point{1, 2}
-// m["foo"]
-// s[i : j + 1]
-// obj.color
-// f.p[i].x()
-//
-// As you can see we can move through all of them using balanced bracket
-// matching and applying simple rules
-// E.g.
-// Point{1, 2}.m["foo"].s[i : j + 1].MethodCall(a, func(a, b int) int { return a + b }).
-// Can be seen as:
-// Point{ }.m[ ].s[ ].MethodCall( ).
-// Which boils the rules down to these connected via dots:
-// ident
-// ident[]
-// ident{}
-// ident()
-// Of course there are also slightly more complicated rules for brackets:
-// ident{}.ident()[5][4](), etc.
-func (this *token_iterator) extract_go_expr() string {
- orig := this.token_index
-
- // Contains the type of the previously scanned token (initialized with
- // the token right under the cursor). This is the token to the *right* of
- // the current one.
- prev := this.token().tok
-loop:
- for {
- if !this.go_back() {
- return token_items_to_string(this.tokens[:orig])
- }
- switch this.token().tok {
- case token.PERIOD:
- // If the '.' is not followed by IDENT, it's invalid.
- if prev != token.IDENT {
- break loop
- }
- case token.IDENT:
- // Valid tokens after IDENT are '.', '[', '{' and '('.
- switch prev {
- case token.PERIOD, token.LBRACK, token.LBRACE, token.LPAREN:
- // all ok
- default:
- break loop
- }
- case token.RBRACE:
- // This one can only be a part of type initialization, like:
- // Dummy{}.Hello()
- // It is valid Go if Hello method is defined on a non-pointer receiver.
- if prev != token.PERIOD {
- break loop
- }
- this.skip_to_balanced_pair()
- case token.RPAREN, token.RBRACK:
- // After ']' and ')' their opening counterparts are valid '[', '(',
- // as well as the dot.
- switch prev {
- case token.PERIOD, token.LBRACK, token.LPAREN:
- // all ok
- default:
- break loop
- }
- this.skip_to_balanced_pair()
- default:
- break loop
- }
- prev = this.token().tok
- }
- expr := token_items_to_string(this.tokens[this.token_index+1 : orig])
- if *g_debug {
- log.Printf("extracted expression tokens: %s", expr)
- }
- return expr
-}
-
-// Given a slice of token_item, reassembles them into the original literal
-// expression.
-func token_items_to_string(tokens []token_item) string {
- var buf bytes.Buffer
- for _, t := range tokens {
- buf.WriteString(t.literal())
- }
- return buf.String()
-}
-
-// this function is called when the cursor is at the '.' and you need to get the
-// declaration before that dot
-func (c *auto_complete_context) deduce_cursor_decl(iter *token_iterator) (*decl, ast.Expr) {
- expr, err := parser.ParseExpr(iter.extract_go_expr())
- if err != nil {
- return nil, nil
- }
- return expr_to_decl(expr, c.current.scope), expr
-}
-
-// try to find and extract the surrounding struct literal type
-func (c *auto_complete_context) deduce_struct_type_decl(iter *token_iterator) *decl {
- typ := iter.extract_struct_type()
- if typ == "" {
- return nil
- }
-
- expr, err := parser.ParseExpr(typ)
- if err != nil {
- return nil
- }
- decl := type_to_decl(expr, c.current.scope)
- if decl == nil {
- return nil
- }
-
- // we allow only struct types here, but also support type aliases
- if decl.is_alias() {
- dd := decl.type_dealias()
- if _, ok := dd.typ.(*ast.StructType); !ok {
- return nil
- }
- } else if _, ok := decl.typ.(*ast.StructType); !ok {
- return nil
- }
- return decl
-}
-
-// Entry point from autocompletion, the function looks at text before the cursor
-// and figures out the declaration the cursor is on. This declaration is
-// used in filtering the resulting set of autocompletion suggestions.
-func (c *auto_complete_context) deduce_cursor_context(file []byte, cursor int) (cursor_context, bool) {
- if cursor <= 0 {
- return cursor_context{}, true
- }
-
- iter := new_token_iterator(file, cursor)
- if len(iter.tokens) == 0 {
- return cursor_context{}, false
- }
-
- // figure out what is just before the cursor
- switch tok := iter.token(); tok.tok {
- case token.STRING:
- // make sure cursor is inside the string
- s := tok.literal()
- if len(s) > 1 && s[len(s)-1] == '"' && tok.off+len(s) <= cursor {
- return cursor_context{}, true
- }
- // now figure out if inside an import declaration
- var ptok = token.STRING
- for iter.go_back() {
- itok := iter.token().tok
- switch itok {
- case token.STRING:
- switch ptok {
- case token.SEMICOLON, token.IDENT, token.PERIOD:
- default:
- return cursor_context{}, true
- }
- case token.LPAREN, token.SEMICOLON:
- switch ptok {
- case token.STRING, token.IDENT, token.PERIOD:
- default:
- return cursor_context{}, true
- }
- case token.IDENT, token.PERIOD:
- switch ptok {
- case token.STRING:
- default:
- return cursor_context{}, true
- }
- case token.IMPORT:
- switch ptok {
- case token.STRING, token.IDENT, token.PERIOD, token.LPAREN:
- path_len := cursor - tok.off
- path := s[1:path_len]
- return cursor_context{decl_import: true, partial: path}, true
- default:
- return cursor_context{}, true
- }
- default:
- return cursor_context{}, true
- }
- ptok = itok
- }
- case token.PERIOD:
- // we're '.'
- // figure out decl, Partial is ""
- decl, expr := c.deduce_cursor_decl(&iter)
- return cursor_context{decl: decl, expr: expr}, decl != nil
- case token.IDENT, token.TYPE, token.CONST, token.VAR, token.FUNC, token.PACKAGE:
- // we're '.'
- // parse as Partial and figure out decl
- var partial string
- if tok.tok == token.IDENT {
- // Calculate the offset of the cursor position within the identifier.
- // For instance, if we are 'ab#c', we want partial_len = 2 and partial = ab.
- partial_len := cursor - tok.off
-
- // If it happens that the cursor is past the end of the literal,
- // means there is a space between the literal and the cursor, think
- // of it as no context, because that's what it really is.
- if partial_len > len(tok.literal()) {
- return cursor_context{}, true
- }
- partial = tok.literal()[0:partial_len]
- } else {
- // Do not try to truncate if it is not an identifier.
- partial = tok.literal()
- }
-
- iter.go_back()
- switch iter.token().tok {
- case token.PERIOD:
- decl, expr := c.deduce_cursor_decl(&iter)
- return cursor_context{decl: decl, partial: partial, expr: expr}, decl != nil
- case token.COMMA, token.LBRACE:
- // This can happen for struct fields:
- // &Struct{Hello: 1, Wor#} // (# - the cursor)
- // Let's try to find the struct type
- decl := c.deduce_struct_type_decl(&iter)
- return cursor_context{
- decl: decl,
- partial: partial,
- struct_field: decl != nil,
- }, true
- default:
- return cursor_context{partial: partial}, true
- }
- case token.COMMA, token.LBRACE:
- // Try to parse the current expression as a structure initialization.
- decl := c.deduce_struct_type_decl(&iter)
- return cursor_context{
- decl: decl,
- partial: "",
- struct_field: decl != nil,
- }, true
- }
-
- return cursor_context{}, true
-}
-
-// Decl deduction failed, but we're on ".", this ident can be an
-// unexported package, let's try to match the ident against a set of known
-// packages and if it matches try to import it.
-// TODO: Right now I've made a static list of built-in packages, but in theory
-// we could scan all GOPATH packages as well. Now, don't forget that default
-// package name has nothing to do with package file name, that's why we need to
-// scan the packages. And many of them will have conflicts. Can we make a smart
-// prediction algorithm which will prefer certain packages over another ones?
-func resolveKnownPackageIdent(ident string, filename string, context *package_lookup_context) *package_file_cache {
- importPath, ok := knownPackageIdents[ident]
- if !ok {
- return nil
- }
-
- path, ok := abs_path_for_package(filename, importPath, context)
- if !ok {
- return nil
- }
-
- p := new_package_file_cache(path, importPath)
- p.update_cache()
- return p
-}
-
-var knownPackageIdents = map[string]string{
- "adler32": "hash/adler32",
- "aes": "crypto/aes",
- "ascii85": "encoding/ascii85",
- "asn1": "encoding/asn1",
- "ast": "go/ast",
- "atomic": "sync/atomic",
- "base32": "encoding/base32",
- "base64": "encoding/base64",
- "big": "math/big",
- "binary": "encoding/binary",
- "bufio": "bufio",
- "build": "go/build",
- "bytes": "bytes",
- "bzip2": "compress/bzip2",
- "cgi": "net/http/cgi",
- "cgo": "runtime/cgo",
- "cipher": "crypto/cipher",
- "cmplx": "math/cmplx",
- "color": "image/color",
- "constant": "go/constant",
- "context": "context",
- "cookiejar": "net/http/cookiejar",
- "crc32": "hash/crc32",
- "crc64": "hash/crc64",
- "crypto": "crypto",
- "csv": "encoding/csv",
- "debug": "runtime/debug",
- "des": "crypto/des",
- "doc": "go/doc",
- "draw": "image/draw",
- "driver": "database/sql/driver",
- "dsa": "crypto/dsa",
- "dwarf": "debug/dwarf",
- "ecdsa": "crypto/ecdsa",
- "elf": "debug/elf",
- "elliptic": "crypto/elliptic",
- "encoding": "encoding",
- "errors": "errors",
- "exec": "os/exec",
- "expvar": "expvar",
- "fcgi": "net/http/fcgi",
- "filepath": "path/filepath",
- "flag": "flag",
- "flate": "compress/flate",
- "fmt": "fmt",
- "fnv": "hash/fnv",
- "format": "go/format",
- "gif": "image/gif",
- "gob": "encoding/gob",
- "gosym": "debug/gosym",
- "gzip": "compress/gzip",
- "hash": "hash",
- "heap": "container/heap",
- "hex": "encoding/hex",
- "hmac": "crypto/hmac",
- "hpack": "vendor/golang_org/x/net/http2/hpack",
- "html": "html",
- "http": "net/http",
- "httplex": "vendor/golang_org/x/net/lex/httplex",
- "httptest": "net/http/httptest",
- "httptrace": "net/http/httptrace",
- "httputil": "net/http/httputil",
- "image": "image",
- "importer": "go/importer",
- "io": "io",
- "iotest": "testing/iotest",
- "ioutil": "io/ioutil",
- "jpeg": "image/jpeg",
- "json": "encoding/json",
- "jsonrpc": "net/rpc/jsonrpc",
- "list": "container/list",
- "log": "log",
- "lzw": "compress/lzw",
- "macho": "debug/macho",
- "mail": "net/mail",
- "math": "math",
- "md5": "crypto/md5",
- "mime": "mime",
- "multipart": "mime/multipart",
- "net": "net",
- "os": "os",
- "palette": "image/color/palette",
- "parse": "text/template/parse",
- "parser": "go/parser",
- "path": "path",
- "pe": "debug/pe",
- "pem": "encoding/pem",
- "pkix": "crypto/x509/pkix",
- "plan9obj": "debug/plan9obj",
- "png": "image/png",
- "pprof": "net/http/pprof",
- "printer": "go/printer",
- "quick": "testing/quick",
- "quotedprintable": "mime/quotedprintable",
- "race": "runtime/race",
- "rand": "math/rand",
- "rc4": "crypto/rc4",
- "reflect": "reflect",
- "regexp": "regexp",
- "ring": "container/ring",
- "rpc": "net/rpc",
- "rsa": "crypto/rsa",
- "runtime": "runtime",
- "scanner": "text/scanner",
- "sha1": "crypto/sha1",
- "sha256": "crypto/sha256",
- "sha512": "crypto/sha512",
- "signal": "os/signal",
- "smtp": "net/smtp",
- "sort": "sort",
- "sql": "database/sql",
- "strconv": "strconv",
- "strings": "strings",
- "subtle": "crypto/subtle",
- "suffixarray": "index/suffixarray",
- "sync": "sync",
- "syntax": "regexp/syntax",
- "syscall": "syscall",
- "syslog": "log/syslog",
- "tabwriter": "text/tabwriter",
- "tar": "archive/tar",
- "template": "html/template",
- "testing": "testing",
- "textproto": "net/textproto",
- "time": "time",
- "tls": "crypto/tls",
- "token": "go/token",
- "trace": "runtime/trace",
- "types": "go/types",
- "unicode": "unicode",
- "url": "net/url",
- "user": "os/user",
- "utf16": "unicode/utf16",
- "utf8": "unicode/utf8",
- "x509": "crypto/x509",
- "xml": "encoding/xml",
- "zip": "archive/zip",
- "zlib": "compress/zlib",
- //"scanner": "go/scanner", // DUP: prefer text/scanner
- //"template": "text/template", // DUP: prefer html/template
- //"pprof": "runtime/pprof", // DUP: prefer net/http/pprof
- //"rand": "crypto/rand", // DUP: prefer math/rand
-}
diff --git a/vendor/github.com/nsf/gocode/decl.go b/vendor/github.com/nsf/gocode/decl.go
deleted file mode 100644
index 7709c5f..0000000
--- a/vendor/github.com/nsf/gocode/decl.go
+++ /dev/null
@@ -1,1472 +0,0 @@
-package main
-
-import (
- "bytes"
- "fmt"
- "go/ast"
- "go/token"
- "io"
- "reflect"
- "strings"
- "sync"
-)
-
-// decl.class
-type decl_class int16
-
-const (
- decl_invalid = decl_class(-1 + iota)
-
- // these are in a sorted order
- decl_const
- decl_func
- decl_import
- decl_package
- decl_type
- decl_var
-
- // this one serves as a temporary type for those methods that were
- // declared before their actual owner
- decl_methods_stub
-)
-
-func (this decl_class) String() string {
- switch this {
- case decl_invalid:
- return "PANIC"
- case decl_const:
- return "const"
- case decl_func:
- return "func"
- case decl_import:
- return "import"
- case decl_package:
- return "package"
- case decl_type:
- return "type"
- case decl_var:
- return "var"
- case decl_methods_stub:
- return "IF YOU SEE THIS, REPORT A BUG" // :D
- }
- panic("unreachable")
-}
-
-// decl.flags
-type decl_flags int16
-
-const (
- decl_foreign decl_flags = 1 << iota // imported from another package
-
- // means that the decl is a part of the range statement
- // its type is inferred in a special way
- decl_rangevar
-
- // decl of decl_type class is a type alias
- decl_alias
-
- // for preventing infinite recursions and loops in type inference code
- decl_visited
-)
-
-//-------------------------------------------------------------------------
-// decl
-//
-// The most important data structure of the whole gocode project. It
-// describes a single declaration and its children.
-//-------------------------------------------------------------------------
-
-type decl struct {
- // Name starts with '$' if the declaration describes an anonymous type.
- // '$s_%d' for anonymous struct types
- // '$i_%d' for anonymous interface types
- name string
- typ ast.Expr
- class decl_class
- flags decl_flags
-
- // functions for interface type, fields+methods for struct type
- children map[string]*decl
-
- // embedded types
- embedded []ast.Expr
-
- // if the type is unknown at AST building time, I'm using these
- value ast.Expr
-
- // if it's a multiassignment and the Value is a CallExpr, it is being set
- // to an index into the return value tuple, otherwise it's a -1
- value_index int
-
- // scope where this Decl was declared in (not its visibilty scope!)
- // Decl uses it for type inference
- scope *scope
-}
-
-func ast_decl_type(d ast.Decl) ast.Expr {
- switch t := d.(type) {
- case *ast.GenDecl:
- switch t.Tok {
- case token.CONST, token.VAR:
- c := t.Specs[0].(*ast.ValueSpec)
- return c.Type
- case token.TYPE:
- t := t.Specs[0].(*ast.TypeSpec)
- return t.Type
- }
- case *ast.FuncDecl:
- return t.Type
- }
- panic("unreachable")
-}
-
-func ast_decl_flags(d ast.Decl) decl_flags {
- switch t := d.(type) {
- case *ast.GenDecl:
- switch t.Tok {
- case token.TYPE:
- if isAliasTypeSpec(t.Specs[0].(*ast.TypeSpec)) {
- return decl_alias
- }
- }
- }
- return 0
-}
-
-func ast_decl_class(d ast.Decl) decl_class {
- switch t := d.(type) {
- case *ast.GenDecl:
- switch t.Tok {
- case token.VAR:
- return decl_var
- case token.CONST:
- return decl_const
- case token.TYPE:
- return decl_type
- }
- case *ast.FuncDecl:
- return decl_func
- }
- panic("unreachable")
-}
-
-func ast_decl_convertable(d ast.Decl) bool {
- switch t := d.(type) {
- case *ast.GenDecl:
- switch t.Tok {
- case token.VAR, token.CONST, token.TYPE:
- return true
- }
- case *ast.FuncDecl:
- return true
- }
- return false
-}
-
-func ast_field_list_to_decls(f *ast.FieldList, class decl_class, flags decl_flags, scope *scope, add_anonymous bool) map[string]*decl {
- count := 0
- for _, field := range f.List {
- count += len(field.Names)
- }
-
- decls := make(map[string]*decl, count)
- for _, field := range f.List {
- for _, name := range field.Names {
- if flags&decl_foreign != 0 && !ast.IsExported(name.Name) {
- continue
- }
- d := &decl{
- name: name.Name,
- typ: field.Type,
- class: class,
- flags: flags,
- scope: scope,
- value_index: -1,
- }
- decls[d.name] = d
- }
-
- // add anonymous field as a child (type embedding)
- if class == decl_var && field.Names == nil && add_anonymous {
- tp := get_type_path(field.Type)
- if flags&decl_foreign != 0 && !ast.IsExported(tp.name) {
- continue
- }
- d := &decl{
- name: tp.name,
- typ: field.Type,
- class: class,
- flags: flags,
- scope: scope,
- value_index: -1,
- }
- decls[d.name] = d
- }
- }
- return decls
-}
-
-func ast_field_list_to_embedded(f *ast.FieldList) []ast.Expr {
- count := 0
- for _, field := range f.List {
- if field.Names == nil || field.Names[0].Name == "?" {
- count++
- }
- }
-
- if count == 0 {
- return nil
- }
-
- embedded := make([]ast.Expr, count)
- i := 0
- for _, field := range f.List {
- if field.Names == nil || field.Names[0].Name == "?" {
- embedded[i] = field.Type
- i++
- }
- }
-
- return embedded
-}
-
-func ast_type_to_embedded(ty ast.Expr) []ast.Expr {
- switch t := ty.(type) {
- case *ast.StructType:
- return ast_field_list_to_embedded(t.Fields)
- case *ast.InterfaceType:
- return ast_field_list_to_embedded(t.Methods)
- }
- return nil
-}
-
-func ast_type_to_children(ty ast.Expr, flags decl_flags, scope *scope) map[string]*decl {
- switch t := ty.(type) {
- case *ast.StructType:
- return ast_field_list_to_decls(t.Fields, decl_var, flags, scope, true)
- case *ast.InterfaceType:
- return ast_field_list_to_decls(t.Methods, decl_func, flags, scope, false)
- }
- return nil
-}
-
-//-------------------------------------------------------------------------
-// anonymous_id_gen
-//
-// ID generator for anonymous types (thread-safe)
-//-------------------------------------------------------------------------
-
-type anonymous_id_gen struct {
- sync.Mutex
- i int
-}
-
-func (a *anonymous_id_gen) gen() (id int) {
- a.Lock()
- defer a.Unlock()
- id = a.i
- a.i++
- return
-}
-
-var g_anon_gen anonymous_id_gen
-
-//-------------------------------------------------------------------------
-
-func check_for_anon_type(t ast.Expr, flags decl_flags, s *scope) ast.Expr {
- if t == nil {
- return nil
- }
- var name string
-
- switch t.(type) {
- case *ast.StructType:
- name = fmt.Sprintf("$s_%d", g_anon_gen.gen())
- case *ast.InterfaceType:
- name = fmt.Sprintf("$i_%d", g_anon_gen.gen())
- }
-
- if name != "" {
- anonymify_ast(t, flags, s)
- d := new_decl_full(name, decl_type, flags, t, nil, -1, s)
- s.add_named_decl(d)
- return ast.NewIdent(name)
- }
- return t
-}
-
-//-------------------------------------------------------------------------
-
-func new_decl_full(name string, class decl_class, flags decl_flags, typ, v ast.Expr, vi int, s *scope) *decl {
- if name == "_" {
- return nil
- }
- d := new(decl)
- d.name = name
- d.class = class
- d.flags = flags
- d.typ = typ
- d.value = v
- d.value_index = vi
- d.scope = s
- d.children = ast_type_to_children(d.typ, flags, s)
- d.embedded = ast_type_to_embedded(d.typ)
- return d
-}
-
-func new_decl(name string, class decl_class, scope *scope) *decl {
- decl := new(decl)
- decl.name = name
- decl.class = class
- decl.value_index = -1
- decl.scope = scope
- return decl
-}
-
-func new_decl_var(name string, typ ast.Expr, value ast.Expr, vindex int, scope *scope) *decl {
- if name == "_" {
- return nil
- }
- decl := new(decl)
- decl.name = name
- decl.class = decl_var
- decl.typ = typ
- decl.value = value
- decl.value_index = vindex
- decl.scope = scope
- return decl
-}
-
-func method_of(d ast.Decl) string {
- if t, ok := d.(*ast.FuncDecl); ok {
- if t.Recv != nil && len(t.Recv.List) != 0 {
- switch t := t.Recv.List[0].Type.(type) {
- case *ast.StarExpr:
- if se, ok := t.X.(*ast.SelectorExpr); ok {
- return se.Sel.Name
- }
- if ident, ok := t.X.(*ast.Ident); ok {
- return ident.Name
- }
- return ""
- case *ast.Ident:
- return t.Name
- default:
- return ""
- }
- }
- }
- return ""
-}
-
-func (other *decl) deep_copy() *decl {
- d := new(decl)
- d.name = other.name
- d.class = other.class
- d.flags = other.flags
- d.typ = other.typ
- d.value = other.value
- d.value_index = other.value_index
- d.children = make(map[string]*decl, len(other.children))
- for key, value := range other.children {
- d.children[key] = value
- }
- if other.embedded != nil {
- d.embedded = make([]ast.Expr, len(other.embedded))
- copy(d.embedded, other.embedded)
- }
- d.scope = other.scope
- return d
-}
-
-func (d *decl) is_rangevar() bool {
- return d.flags&decl_rangevar != 0
-}
-
-func (d *decl) is_alias() bool {
- return d.flags&decl_alias != 0
-}
-
-func (d *decl) is_visited() bool {
- return d.flags&decl_visited != 0
-}
-
-func (d *decl) set_visited() {
- d.flags |= decl_visited
-}
-
-func (d *decl) clear_visited() {
- d.flags &^= decl_visited
-}
-
-func (d *decl) expand_or_replace(other *decl) {
- // expand only if it's a methods stub, otherwise simply keep it as is
- if d.class != decl_methods_stub && other.class != decl_methods_stub {
- return
- }
-
- if d.class == decl_methods_stub {
- d.typ = other.typ
- d.class = other.class
- d.flags = other.flags
- }
-
- if other.children != nil {
- for _, c := range other.children {
- d.add_child(c)
- }
- }
-
- if other.embedded != nil {
- d.embedded = other.embedded
- d.scope = other.scope
- }
-}
-
-func (d *decl) matches() bool {
- if strings.HasPrefix(d.name, "$") || d.class == decl_methods_stub {
- return false
- }
- return true
-}
-
-func (d *decl) pretty_print_type(out io.Writer, canonical_aliases map[string]string) {
- switch d.class {
- case decl_type:
- switch d.typ.(type) {
- case *ast.StructType:
- // TODO: not used due to anonymify?
- fmt.Fprintf(out, "struct")
- case *ast.InterfaceType:
- // TODO: not used due to anonymify?
- fmt.Fprintf(out, "interface")
- default:
- if d.typ != nil {
- pretty_print_type_expr(out, d.typ, canonical_aliases)
- }
- }
- case decl_var:
- if d.typ != nil {
- pretty_print_type_expr(out, d.typ, canonical_aliases)
- }
- case decl_func:
- pretty_print_type_expr(out, d.typ, canonical_aliases)
- }
-}
-
-func (d *decl) add_child(cd *decl) {
- if d.children == nil {
- d.children = make(map[string]*decl)
- }
- d.children[cd.name] = cd
-}
-
-func check_for_builtin_funcs(typ *ast.Ident, c *ast.CallExpr, scope *scope) (ast.Expr, *scope) {
- if strings.HasPrefix(typ.Name, "func(") {
- if t, ok := c.Fun.(*ast.Ident); ok {
- switch t.Name {
- case "new":
- if len(c.Args) > 0 {
- e := new(ast.StarExpr)
- e.X = c.Args[0]
- return e, scope
- }
- case "make":
- if len(c.Args) > 0 {
- return c.Args[0], scope
- }
- case "append":
- if len(c.Args) > 0 {
- t, scope, _ := infer_type(c.Args[0], scope, -1)
- return t, scope
- }
- case "complex":
- // TODO: fix it
- return ast.NewIdent("complex"), g_universe_scope
- case "closed":
- return ast.NewIdent("bool"), g_universe_scope
- case "cap":
- return ast.NewIdent("int"), g_universe_scope
- case "copy":
- return ast.NewIdent("int"), g_universe_scope
- case "len":
- return ast.NewIdent("int"), g_universe_scope
- }
- // TODO:
- // func recover() interface{}
- // func imag(c ComplexType) FloatType
- // func real(c ComplexType) FloatType
- }
- }
- return nil, nil
-}
-
-func func_return_type(f *ast.FuncType, index int) ast.Expr {
- if f.Results == nil {
- return nil
- }
-
- if index == -1 {
- return f.Results.List[0].Type
- }
-
- i := 0
- var field *ast.Field
- for _, field = range f.Results.List {
- n := 1
- if field.Names != nil {
- n = len(field.Names)
- }
- if i <= index && index < i+n {
- return field.Type
- }
- i += n
- }
- return nil
-}
-
-type type_path struct {
- pkg string
- name string
-}
-
-func (tp *type_path) is_nil() bool {
- return tp.pkg == "" && tp.name == ""
-}
-
-// converts type expressions like:
-// ast.Expr
-// *ast.Expr
-// $ast$go/ast.Expr
-// to a path that can be used to lookup a type related Decl
-func get_type_path(e ast.Expr) (r type_path) {
- if e == nil {
- return type_path{"", ""}
- }
-
- switch t := e.(type) {
- case *ast.Ident:
- r.name = t.Name
- case *ast.StarExpr:
- r = get_type_path(t.X)
- case *ast.SelectorExpr:
- if ident, ok := t.X.(*ast.Ident); ok {
- r.pkg = ident.Name
- }
- r.name = t.Sel.Name
- }
- return
-}
-
-func lookup_path(tp type_path, scope *scope) *decl {
- if tp.is_nil() {
- return nil
- }
- var decl *decl
- if tp.pkg != "" {
- decl = scope.lookup(tp.pkg)
- // return nil early if the package wasn't found but it's part
- // of the type specification
- if decl == nil {
- return nil
- }
- }
-
- if decl != nil {
- if tp.name != "" {
- return decl.find_child(tp.name)
- } else {
- return decl
- }
- }
-
- return scope.lookup(tp.name)
-}
-
-func lookup_pkg(tp type_path, scope *scope) string {
- if tp.is_nil() {
- return ""
- }
- if tp.pkg == "" {
- return ""
- }
- decl := scope.lookup(tp.pkg)
- if decl == nil {
- return ""
- }
- return decl.name
-}
-
-func type_to_decl(t ast.Expr, scope *scope) *decl {
- tp := get_type_path(t)
- d := lookup_path(tp, scope)
- if d != nil && d.class == decl_var {
- // weird variable declaration pointing to itself
- return nil
- }
- return d
-}
-
-func expr_to_decl(e ast.Expr, scope *scope) *decl {
- t, scope, _ := infer_type(e, scope, -1)
- return type_to_decl(t, scope)
-}
-
-//-------------------------------------------------------------------------
-// Type inference
-//-------------------------------------------------------------------------
-
-type type_predicate func(ast.Expr) bool
-
-func advance_to_type(pred type_predicate, v ast.Expr, scope *scope) (ast.Expr, *scope) {
- if pred(v) {
- return v, scope
- }
-
- decl := type_to_decl(v, scope)
- if decl == nil {
- return nil, nil
- }
-
- if decl.is_visited() {
- return nil, nil
- }
- decl.set_visited()
- defer decl.clear_visited()
-
- return advance_to_type(pred, decl.typ, decl.scope)
-}
-
-func advance_to_struct_or_interface(decl *decl) *decl {
- if decl.is_visited() {
- return nil
- }
- decl.set_visited()
- defer decl.clear_visited()
-
- if struct_interface_predicate(decl.typ) {
- return decl
- }
-
- decl = type_to_decl(decl.typ, decl.scope)
- if decl == nil {
- return nil
- }
- return advance_to_struct_or_interface(decl)
-}
-
-func struct_interface_predicate(v ast.Expr) bool {
- switch v.(type) {
- case *ast.StructType, *ast.InterfaceType:
- return true
- }
- return false
-}
-
-func chan_predicate(v ast.Expr) bool {
- _, ok := v.(*ast.ChanType)
- return ok
-}
-
-func index_predicate(v ast.Expr) bool {
- switch v.(type) {
- case *ast.ArrayType, *ast.MapType, *ast.Ellipsis:
- return true
- }
- return false
-}
-
-func star_predicate(v ast.Expr) bool {
- _, ok := v.(*ast.StarExpr)
- return ok
-}
-
-func func_predicate(v ast.Expr) bool {
- _, ok := v.(*ast.FuncType)
- return ok
-}
-
-func range_predicate(v ast.Expr) bool {
- switch t := v.(type) {
- case *ast.Ident:
- if t.Name == "string" {
- return true
- }
- case *ast.ArrayType, *ast.MapType, *ast.ChanType, *ast.Ellipsis:
- return true
- }
- return false
-}
-
-type anonymous_typer struct {
- flags decl_flags
- scope *scope
-}
-
-func (a *anonymous_typer) Visit(node ast.Node) ast.Visitor {
- switch t := node.(type) {
- case *ast.CompositeLit:
- t.Type = check_for_anon_type(t.Type, a.flags, a.scope)
- case *ast.MapType:
- t.Key = check_for_anon_type(t.Key, a.flags, a.scope)
- t.Value = check_for_anon_type(t.Value, a.flags, a.scope)
- case *ast.ArrayType:
- t.Elt = check_for_anon_type(t.Elt, a.flags, a.scope)
- case *ast.Ellipsis:
- t.Elt = check_for_anon_type(t.Elt, a.flags, a.scope)
- case *ast.ChanType:
- t.Value = check_for_anon_type(t.Value, a.flags, a.scope)
- case *ast.Field:
- t.Type = check_for_anon_type(t.Type, a.flags, a.scope)
- case *ast.CallExpr:
- t.Fun = check_for_anon_type(t.Fun, a.flags, a.scope)
- case *ast.ParenExpr:
- t.X = check_for_anon_type(t.X, a.flags, a.scope)
- case *ast.StarExpr:
- t.X = check_for_anon_type(t.X, a.flags, a.scope)
- case *ast.GenDecl:
- switch t.Tok {
- case token.VAR:
- for _, s := range t.Specs {
- vs := s.(*ast.ValueSpec)
- vs.Type = check_for_anon_type(vs.Type, a.flags, a.scope)
- }
- }
- }
- return a
-}
-
-func anonymify_ast(node ast.Node, flags decl_flags, scope *scope) {
- v := anonymous_typer{flags, scope}
- ast.Walk(&v, node)
-}
-
-// RETURNS:
-// - type expression which represents a full name of a type
-// - bool whether a type expression is actually a type (used internally)
-// - scope in which type makes sense
-func infer_type(v ast.Expr, scope *scope, index int) (ast.Expr, *scope, bool) {
- switch t := v.(type) {
- case *ast.CompositeLit:
- return t.Type, scope, true
- case *ast.Ident:
- if d := scope.lookup(t.Name); d != nil {
- if d.class == decl_package {
- return ast.NewIdent(t.Name), scope, false
- }
- typ, scope := d.infer_type()
- return typ, scope, d.class == decl_type
- }
- case *ast.UnaryExpr:
- switch t.Op {
- case token.AND:
- // &a makes sense only with values, don't even check for type
- it, s, _ := infer_type(t.X, scope, -1)
- if it == nil {
- break
- }
-
- e := new(ast.StarExpr)
- e.X = it
- return e, s, false
- case token.ARROW:
- // <-a makes sense only with values
- it, s, _ := infer_type(t.X, scope, -1)
- if it == nil {
- break
- }
- switch index {
- case -1, 0:
- it, s = advance_to_type(chan_predicate, it, s)
- return it.(*ast.ChanType).Value, s, false
- case 1:
- // technically it's a value, but in case of index == 1
- // it is always the last infer operation
- return ast.NewIdent("bool"), g_universe_scope, false
- }
- case token.ADD, token.NOT, token.SUB, token.XOR:
- it, s, _ := infer_type(t.X, scope, -1)
- if it == nil {
- break
- }
- return it, s, false
- }
- case *ast.BinaryExpr:
- switch t.Op {
- case token.EQL, token.NEQ, token.LSS, token.LEQ,
- token.GTR, token.GEQ, token.LOR, token.LAND:
- // logic operations, the result is a bool, always
- return ast.NewIdent("bool"), g_universe_scope, false
- case token.ADD, token.SUB, token.MUL, token.QUO, token.OR,
- token.XOR, token.REM, token.AND, token.AND_NOT:
- // try X, then Y, they should be the same anyway
- it, s, _ := infer_type(t.X, scope, -1)
- if it == nil {
- it, s, _ = infer_type(t.Y, scope, -1)
- if it == nil {
- break
- }
- }
- return it, s, false
- case token.SHL, token.SHR:
- // try only X for shifts, Y is always uint
- it, s, _ := infer_type(t.X, scope, -1)
- if it == nil {
- break
- }
- return it, s, false
- }
- case *ast.IndexExpr:
- // something[another] always returns a value and it works on a value too
- it, s, _ := infer_type(t.X, scope, -1)
- if it == nil {
- break
- }
- it, s = advance_to_type(index_predicate, it, s)
- switch t := it.(type) {
- case *ast.ArrayType:
- return t.Elt, s, false
- case *ast.Ellipsis:
- return t.Elt, s, false
- case *ast.MapType:
- switch index {
- case -1, 0:
- return t.Value, s, false
- case 1:
- return ast.NewIdent("bool"), g_universe_scope, false
- }
- }
- case *ast.SliceExpr:
- // something[start : end] always returns a value
- it, s, _ := infer_type(t.X, scope, -1)
- if it == nil {
- break
- }
- it, s = advance_to_type(index_predicate, it, s)
- switch t := it.(type) {
- case *ast.ArrayType:
- e := new(ast.ArrayType)
- e.Elt = t.Elt
- return e, s, false
- }
- case *ast.StarExpr:
- it, s, is_type := infer_type(t.X, scope, -1)
- if it == nil {
- break
- }
- if is_type {
- // if it's a type, add * modifier, make it a 'pointer of' type
- e := new(ast.StarExpr)
- e.X = it
- return e, s, true
- } else {
- it, s := advance_to_type(star_predicate, it, s)
- if se, ok := it.(*ast.StarExpr); ok {
- return se.X, s, false
- }
- }
- case *ast.CallExpr:
- // this is a function call or a type cast:
- // myFunc(1,2,3) or int16(myvar)
- it, s, is_type := infer_type(t.Fun, scope, -1)
- if it == nil {
- break
- }
-
- if is_type {
- // a type cast
- return it, scope, false
- } else {
- // it must be a function call or a built-in function
- // first check for built-in
- if ct, ok := it.(*ast.Ident); ok {
- ty, s := check_for_builtin_funcs(ct, t, scope)
- if ty != nil {
- return ty, s, false
- }
- }
-
- // then check for an ordinary function call
- it, scope = advance_to_type(func_predicate, it, s)
- if ct, ok := it.(*ast.FuncType); ok {
- return func_return_type(ct, index), s, false
- }
- }
- case *ast.ParenExpr:
- it, s, is_type := infer_type(t.X, scope, -1)
- if it == nil {
- break
- }
- return it, s, is_type
- case *ast.SelectorExpr:
- it, s, _ := infer_type(t.X, scope, -1)
- if it == nil {
- break
- }
-
- if d := type_to_decl(it, s); d != nil {
- c := d.find_child_and_in_embedded(t.Sel.Name)
- if c != nil {
- if c.class == decl_type {
- return t, scope, true
- } else {
- typ, s := c.infer_type()
- return typ, s, false
- }
- }
- }
- case *ast.FuncLit:
- // it's a value, but I think most likely we don't even care, cause we can only
- // call it, and CallExpr uses the type itself to figure out
- return t.Type, scope, false
- case *ast.TypeAssertExpr:
- if t.Type == nil {
- return infer_type(t.X, scope, -1)
- }
- switch index {
- case -1, 0:
- // converting a value to a different type, but return thing is a value
- it, _, _ := infer_type(t.Type, scope, -1)
- return it, scope, false
- case 1:
- return ast.NewIdent("bool"), g_universe_scope, false
- }
- case *ast.ArrayType, *ast.MapType, *ast.ChanType, *ast.Ellipsis,
- *ast.FuncType, *ast.StructType, *ast.InterfaceType:
- return t, scope, true
- default:
- _ = reflect.TypeOf(v)
- //fmt.Println(ty)
- }
- return nil, nil, false
-}
-
-// Uses Value, ValueIndex and Scope to infer the type of this
-// declaration. Returns the type itself and the scope where this type
-// makes sense.
-func (d *decl) infer_type() (ast.Expr, *scope) {
- // special case for range vars
- if d.is_rangevar() {
- var scope *scope
- d.typ, scope = infer_range_type(d.value, d.scope, d.value_index)
- return d.typ, scope
- }
-
- switch d.class {
- case decl_package:
- // package is handled specially in inferType
- return nil, nil
- case decl_type:
- return ast.NewIdent(d.name), d.scope
- }
-
- // shortcut
- if d.typ != nil && d.value == nil {
- return d.typ, d.scope
- }
-
- // prevent loops
- if d.is_visited() {
- return nil, nil
- }
- d.set_visited()
- defer d.clear_visited()
-
- var scope *scope
- d.typ, scope, _ = infer_type(d.value, d.scope, d.value_index)
- return d.typ, scope
-}
-
-func (d *decl) type_dealias() *decl {
- if d.is_visited() {
- return nil
- }
- d.set_visited()
- defer d.clear_visited()
-
- dd := type_to_decl(d.typ, d.scope)
- if dd != nil && dd.is_alias() {
- return dd.type_dealias()
- }
- return dd
-}
-
-func (d *decl) find_child(name string) *decl {
- // type aliases don't really have any children on their own, but they
- // point to a different type, let's try to find one
- if d.is_alias() {
- dd := d.type_dealias()
- if dd != nil {
- return dd.find_child(name)
- }
-
- // note that type alias can also point to a type literal, something like
- // type A = struct { A int }
- // in this case we rely on "advance_to_struct_or_interface" below
- }
-
- if d.children != nil {
- if c, ok := d.children[name]; ok {
- return c
- }
- }
-
- decl := advance_to_struct_or_interface(d)
- if decl != nil && decl != d {
- if d.is_visited() {
- return nil
- }
- d.set_visited()
- defer d.clear_visited()
-
- return decl.find_child(name)
- }
- return nil
-}
-
-func (d *decl) find_child_and_in_embedded(name string) *decl {
- if d == nil {
- return nil
- }
-
- c := d.find_child(name)
- if c == nil {
- for _, e := range d.embedded {
- typedecl := type_to_decl(e, d.scope)
- c = typedecl.find_child_and_in_embedded(name)
- if c != nil {
- break
- }
- }
- }
- return c
-}
-
-// Special type inference for range statements.
-// [int], [int] := range [string]
-// [int], [value] := range [slice or array]
-// [key], [value] := range [map]
-// [value], [nil] := range [chan]
-func infer_range_type(e ast.Expr, sc *scope, valueindex int) (ast.Expr, *scope) {
- t, s, _ := infer_type(e, sc, -1)
- t, s = advance_to_type(range_predicate, t, s)
- if t != nil {
- var t1, t2 ast.Expr
- var s1, s2 *scope
- s1 = s
- s2 = s
-
- switch t := t.(type) {
- case *ast.Ident:
- // string
- if t.Name == "string" {
- t1 = ast.NewIdent("int")
- t2 = ast.NewIdent("rune")
- s1 = g_universe_scope
- s2 = g_universe_scope
- } else {
- t1, t2 = nil, nil
- }
- case *ast.ArrayType:
- t1 = ast.NewIdent("int")
- s1 = g_universe_scope
- t2 = t.Elt
- case *ast.Ellipsis:
- t1 = ast.NewIdent("int")
- s1 = g_universe_scope
- t2 = t.Elt
- case *ast.MapType:
- t1 = t.Key
- t2 = t.Value
- case *ast.ChanType:
- t1 = t.Value
- t2 = nil
- default:
- t1, t2 = nil, nil
- }
-
- switch valueindex {
- case 0:
- return t1, s1
- case 1:
- return t2, s2
- }
- }
- return nil, nil
-}
-
-//-------------------------------------------------------------------------
-// Pretty printing
-//-------------------------------------------------------------------------
-
-func get_array_len(e ast.Expr) string {
- switch t := e.(type) {
- case *ast.BasicLit:
- return string(t.Value)
- case *ast.Ellipsis:
- return "..."
- }
- return ""
-}
-
-func pretty_print_type_expr(out io.Writer, e ast.Expr, canonical_aliases map[string]string) {
- switch t := e.(type) {
- case *ast.StarExpr:
- fmt.Fprintf(out, "*")
- pretty_print_type_expr(out, t.X, canonical_aliases)
- case *ast.Ident:
- if strings.HasPrefix(t.Name, "$") {
- // beautify anonymous types
- switch t.Name[1] {
- case 's':
- fmt.Fprintf(out, "struct")
- case 'i':
- // ok, in most cases anonymous interface is an
- // empty interface, I'll just pretend that
- // it's always true
- fmt.Fprintf(out, "interface{}")
- }
- } else if !*g_debug && strings.HasPrefix(t.Name, "!") {
- // these are full package names for disambiguating and pretty
- // printing packages within packages, e.g.
- // !go/ast!ast vs. !github.com/nsf/my/ast!ast
- // another ugly hack, if people are punished in hell for ugly hacks
- // I'm screwed...
- emarkIdx := strings.LastIndex(t.Name, "!")
- path := t.Name[1:emarkIdx]
- alias := canonical_aliases[path]
- if alias == "" {
- alias = t.Name[emarkIdx+1:]
- }
- fmt.Fprintf(out, alias)
- } else {
- fmt.Fprintf(out, t.Name)
- }
- case *ast.ArrayType:
- al := ""
- if t.Len != nil {
- al = get_array_len(t.Len)
- }
- if al != "" {
- fmt.Fprintf(out, "[%s]", al)
- } else {
- fmt.Fprintf(out, "[]")
- }
- pretty_print_type_expr(out, t.Elt, canonical_aliases)
- case *ast.SelectorExpr:
- pretty_print_type_expr(out, t.X, canonical_aliases)
- fmt.Fprintf(out, ".%s", t.Sel.Name)
- case *ast.FuncType:
- fmt.Fprintf(out, "func(")
- pretty_print_func_field_list(out, t.Params, canonical_aliases)
- fmt.Fprintf(out, ")")
-
- buf := bytes.NewBuffer(make([]byte, 0, 256))
- nresults := pretty_print_func_field_list(buf, t.Results, canonical_aliases)
- if nresults > 0 {
- results := buf.String()
- if strings.IndexAny(results, ", ") != -1 {
- results = "(" + results + ")"
- }
- fmt.Fprintf(out, " %s", results)
- }
- case *ast.MapType:
- fmt.Fprintf(out, "map[")
- pretty_print_type_expr(out, t.Key, canonical_aliases)
- fmt.Fprintf(out, "]")
- pretty_print_type_expr(out, t.Value, canonical_aliases)
- case *ast.InterfaceType:
- fmt.Fprintf(out, "interface{}")
- case *ast.Ellipsis:
- fmt.Fprintf(out, "...")
- pretty_print_type_expr(out, t.Elt, canonical_aliases)
- case *ast.StructType:
- fmt.Fprintf(out, "struct")
- case *ast.ChanType:
- switch t.Dir {
- case ast.RECV:
- fmt.Fprintf(out, "<-chan ")
- case ast.SEND:
- fmt.Fprintf(out, "chan<- ")
- case ast.SEND | ast.RECV:
- fmt.Fprintf(out, "chan ")
- }
- pretty_print_type_expr(out, t.Value, canonical_aliases)
- case *ast.ParenExpr:
- fmt.Fprintf(out, "(")
- pretty_print_type_expr(out, t.X, canonical_aliases)
- fmt.Fprintf(out, ")")
- case *ast.BadExpr:
- // TODO: probably I should check that in a separate function
- // and simply discard declarations with BadExpr as a part of their
- // type
- default:
- // the element has some weird type, just ignore it
- }
-}
-
-func pretty_print_func_field_list(out io.Writer, f *ast.FieldList, canonical_aliases map[string]string) int {
- count := 0
- if f == nil {
- return count
- }
- for i, field := range f.List {
- // names
- if field.Names != nil {
- hasNonblank := false
- for j, name := range field.Names {
- if name.Name != "?" {
- hasNonblank = true
- fmt.Fprintf(out, "%s", name.Name)
- if j != len(field.Names)-1 {
- fmt.Fprintf(out, ", ")
- }
- }
- count++
- }
- if hasNonblank {
- fmt.Fprintf(out, " ")
- }
- } else {
- count++
- }
-
- // type
- pretty_print_type_expr(out, field.Type, canonical_aliases)
-
- // ,
- if i != len(f.List)-1 {
- fmt.Fprintf(out, ", ")
- }
- }
- return count
-}
-
-func ast_decl_names(d ast.Decl) []*ast.Ident {
- var names []*ast.Ident
-
- switch t := d.(type) {
- case *ast.GenDecl:
- switch t.Tok {
- case token.CONST:
- c := t.Specs[0].(*ast.ValueSpec)
- names = make([]*ast.Ident, len(c.Names))
- for i, name := range c.Names {
- names[i] = name
- }
- case token.TYPE:
- t := t.Specs[0].(*ast.TypeSpec)
- names = make([]*ast.Ident, 1)
- names[0] = t.Name
- case token.VAR:
- v := t.Specs[0].(*ast.ValueSpec)
- names = make([]*ast.Ident, len(v.Names))
- for i, name := range v.Names {
- names[i] = name
- }
- }
- case *ast.FuncDecl:
- names = make([]*ast.Ident, 1)
- names[0] = t.Name
- }
-
- return names
-}
-
-func ast_decl_values(d ast.Decl) []ast.Expr {
- // TODO: CONST values here too
- switch t := d.(type) {
- case *ast.GenDecl:
- switch t.Tok {
- case token.VAR:
- v := t.Specs[0].(*ast.ValueSpec)
- if v.Values != nil {
- return v.Values
- }
- }
- }
- return nil
-}
-
-func ast_decl_split(d ast.Decl) []ast.Decl {
- var decls []ast.Decl
- if t, ok := d.(*ast.GenDecl); ok {
- decls = make([]ast.Decl, len(t.Specs))
- for i, s := range t.Specs {
- decl := new(ast.GenDecl)
- *decl = *t
- decl.Specs = make([]ast.Spec, 1)
- decl.Specs[0] = s
- decls[i] = decl
- }
- } else {
- decls = make([]ast.Decl, 1)
- decls[0] = d
- }
- return decls
-}
-
-//-------------------------------------------------------------------------
-// decl_pack
-//-------------------------------------------------------------------------
-
-type decl_pack struct {
- names []*ast.Ident
- typ ast.Expr
- values []ast.Expr
-}
-
-type foreach_decl_struct struct {
- decl_pack
- decl ast.Decl
-}
-
-func (f *decl_pack) value(i int) ast.Expr {
- if f.values == nil {
- return nil
- }
- if len(f.values) > 1 {
- return f.values[i]
- }
- return f.values[0]
-}
-
-func (f *decl_pack) value_index(i int) (v ast.Expr, vi int) {
- // default: nil value
- v = nil
- vi = -1
-
- if f.values != nil {
- // A = B, if there is only one name, the value is solo too
- if len(f.names) == 1 {
- return f.values[0], -1
- }
-
- if len(f.values) > 1 {
- // in case if there are multiple values, it's a usual
- // multiassignment
- if i >= len(f.values) {
- i = len(f.values) - 1
- }
- v = f.values[i]
- } else {
- // in case if there is one value, but many names, it's
- // a tuple unpack.. use index here
- v = f.values[0]
- vi = i
- }
- }
- return
-}
-
-func (f *decl_pack) type_value_index(i int) (ast.Expr, ast.Expr, int) {
- if f.typ != nil {
- // If there is a type, we don't care about value, just return the type
- // and zero value.
- return f.typ, nil, -1
- }
-
- // And otherwise we simply return nil type and a valid value for later inferring.
- v, vi := f.value_index(i)
- return nil, v, vi
-}
-
-type foreach_decl_func func(data *foreach_decl_struct)
-
-func foreach_decl(decl ast.Decl, do foreach_decl_func) {
- decls := ast_decl_split(decl)
- var data foreach_decl_struct
- for _, decl := range decls {
- if !ast_decl_convertable(decl) {
- continue
- }
- data.names = ast_decl_names(decl)
- data.typ = ast_decl_type(decl)
- data.values = ast_decl_values(decl)
- data.decl = decl
-
- do(&data)
- }
-}
-
-//-------------------------------------------------------------------------
-// Built-in declarations
-//-------------------------------------------------------------------------
-
-var g_universe_scope = new_scope(nil)
-
-func init() {
- builtin := ast.NewIdent("built-in")
-
- add_type := func(name string) {
- d := new_decl(name, decl_type, g_universe_scope)
- d.typ = builtin
- g_universe_scope.add_named_decl(d)
- }
- add_type("bool")
- add_type("byte")
- add_type("complex64")
- add_type("complex128")
- add_type("float32")
- add_type("float64")
- add_type("int8")
- add_type("int16")
- add_type("int32")
- add_type("int64")
- add_type("string")
- add_type("uint8")
- add_type("uint16")
- add_type("uint32")
- add_type("uint64")
- add_type("int")
- add_type("uint")
- add_type("uintptr")
- add_type("rune")
-
- add_const := func(name string) {
- d := new_decl(name, decl_const, g_universe_scope)
- d.typ = builtin
- g_universe_scope.add_named_decl(d)
- }
- add_const("true")
- add_const("false")
- add_const("iota")
- add_const("nil")
-
- add_func := func(name, typ string) {
- d := new_decl(name, decl_func, g_universe_scope)
- d.typ = ast.NewIdent(typ)
- g_universe_scope.add_named_decl(d)
- }
- add_func("append", "func([]type, ...type) []type")
- add_func("cap", "func(container) int")
- add_func("close", "func(channel)")
- add_func("complex", "func(real, imag) complex")
- add_func("copy", "func(dst, src)")
- add_func("delete", "func(map[typeA]typeB, typeA)")
- add_func("imag", "func(complex)")
- add_func("len", "func(container) int")
- add_func("make", "func(type, len[, cap]) type")
- add_func("new", "func(type) *type")
- add_func("panic", "func(interface{})")
- add_func("print", "func(...interface{})")
- add_func("println", "func(...interface{})")
- add_func("real", "func(complex)")
- add_func("recover", "func() interface{}")
-
- // built-in error interface
- d := new_decl("error", decl_type, g_universe_scope)
- d.typ = &ast.InterfaceType{}
- d.children = make(map[string]*decl)
- d.children["Error"] = new_decl("Error", decl_func, g_universe_scope)
- d.children["Error"].typ = &ast.FuncType{
- Results: &ast.FieldList{
- List: []*ast.Field{
- {
- Type: ast.NewIdent("string"),
- },
- },
- },
- }
- g_universe_scope.add_named_decl(d)
-}
diff --git a/vendor/github.com/nsf/gocode/declcache.go b/vendor/github.com/nsf/gocode/declcache.go
deleted file mode 100644
index 215a5a8..0000000
--- a/vendor/github.com/nsf/gocode/declcache.go
+++ /dev/null
@@ -1,532 +0,0 @@
-package main
-
-import (
- "fmt"
- "go/ast"
- "go/build"
- "go/parser"
- "go/token"
- "log"
- "os"
- "os/exec"
- "path/filepath"
- "strings"
- "sync"
-)
-
-//-------------------------------------------------------------------------
-// []package_import
-//-------------------------------------------------------------------------
-
-type package_import struct {
- alias string
- abspath string
- path string
-}
-
-// Parses import declarations until the first non-import declaration and fills
-// `packages` array with import information.
-func collect_package_imports(filename string, decls []ast.Decl, context *package_lookup_context) []package_import {
- pi := make([]package_import, 0, 16)
- for _, decl := range decls {
- if gd, ok := decl.(*ast.GenDecl); ok && gd.Tok == token.IMPORT {
- for _, spec := range gd.Specs {
- imp := spec.(*ast.ImportSpec)
- path, alias := path_and_alias(imp)
- abspath, ok := abs_path_for_package(filename, path, context)
- if ok && alias != "_" {
- pi = append(pi, package_import{alias, abspath, path})
- }
- }
- } else {
- break
- }
- }
- return pi
-}
-
-//-------------------------------------------------------------------------
-// decl_file_cache
-//
-// Contains cache for top-level declarations of a file as well as its
-// contents, AST and import information.
-//-------------------------------------------------------------------------
-
-type decl_file_cache struct {
- name string // file name
- mtime int64 // last modification time
-
- decls map[string]*decl // top-level declarations
- error error // last error
- packages []package_import // import information
- filescope *scope
-
- fset *token.FileSet
- context *package_lookup_context
-}
-
-func new_decl_file_cache(name string, context *package_lookup_context) *decl_file_cache {
- return &decl_file_cache{
- name: name,
- context: context,
- }
-}
-
-func (f *decl_file_cache) update() {
- stat, err := os.Stat(f.name)
- if err != nil {
- f.decls = nil
- f.error = err
- f.fset = nil
- return
- }
-
- statmtime := stat.ModTime().UnixNano()
- if f.mtime == statmtime {
- return
- }
-
- f.mtime = statmtime
- f.read_file()
-}
-
-func (f *decl_file_cache) read_file() {
- var data []byte
- data, f.error = file_reader.read_file(f.name)
- if f.error != nil {
- return
- }
- data, _ = filter_out_shebang(data)
-
- f.process_data(data)
-}
-
-func (f *decl_file_cache) process_data(data []byte) {
- var file *ast.File
- f.fset = token.NewFileSet()
- file, f.error = parser.ParseFile(f.fset, "", data, 0)
- f.filescope = new_scope(nil)
- for _, d := range file.Decls {
- anonymify_ast(d, 0, f.filescope)
- }
- f.packages = collect_package_imports(f.name, file.Decls, f.context)
- f.decls = make(map[string]*decl, len(file.Decls))
- for _, decl := range file.Decls {
- append_to_top_decls(f.decls, decl, f.filescope)
- }
-}
-
-func append_to_top_decls(decls map[string]*decl, decl ast.Decl, scope *scope) {
- foreach_decl(decl, func(data *foreach_decl_struct) {
- class := ast_decl_class(data.decl)
- for i, name := range data.names {
- typ, v, vi := data.type_value_index(i)
-
- d := new_decl_full(name.Name, class, ast_decl_flags(data.decl), typ, v, vi, scope)
- if d == nil {
- return
- }
-
- methodof := method_of(decl)
- if methodof != "" {
- decl, ok := decls[methodof]
- if ok {
- decl.add_child(d)
- } else {
- decl = new_decl(methodof, decl_methods_stub, scope)
- decls[methodof] = decl
- decl.add_child(d)
- }
- } else {
- decl, ok := decls[d.name]
- if ok {
- decl.expand_or_replace(d)
- } else {
- decls[d.name] = d
- }
- }
- }
- })
-}
-
-func abs_path_for_package(filename, p string, context *package_lookup_context) (string, bool) {
- dir, _ := filepath.Split(filename)
- if len(p) == 0 {
- return "", false
- }
- if p[0] == '.' {
- return fmt.Sprintf("%s.a", filepath.Join(dir, p)), true
- }
- pkg, ok := find_go_dag_package(p, dir)
- if ok {
- return pkg, true
- }
- return find_global_file(p, context)
-}
-
-func path_and_alias(imp *ast.ImportSpec) (string, string) {
- path := ""
- if imp.Path != nil && len(imp.Path.Value) > 0 {
- path = string(imp.Path.Value)
- path = path[1 : len(path)-1]
- }
- alias := ""
- if imp.Name != nil {
- alias = imp.Name.Name
- }
- return path, alias
-}
-
-func find_go_dag_package(imp, filedir string) (string, bool) {
- // Support godag directory structure
- dir, pkg := filepath.Split(imp)
- godag_pkg := filepath.Join(filedir, "..", dir, "_obj", pkg+".a")
- if file_exists(godag_pkg) {
- return godag_pkg, true
- }
- return "", false
-}
-
-// autobuild compares the mod time of the source files of the package, and if any of them is newer
-// than the package object file will rebuild it.
-func autobuild(p *build.Package) error {
- if p.Dir == "" {
- return fmt.Errorf("no files to build")
- }
- ps, err := os.Stat(p.PkgObj)
- if err != nil {
- // Assume package file does not exist and build for the first time.
- return build_package(p)
- }
- pt := ps.ModTime()
- fs, err := readdir_lstat(p.Dir)
- if err != nil {
- return err
- }
- for _, f := range fs {
- if f.IsDir() {
- continue
- }
- if f.ModTime().After(pt) {
- // Source file is newer than package file; rebuild.
- return build_package(p)
- }
- }
- return nil
-}
-
-// build_package builds the package by calling `go install package/import`. If everything compiles
-// correctly, the newly compiled package should then be in the usual place in the `$GOPATH/pkg`
-// directory, and gocode will pick it up from there.
-func build_package(p *build.Package) error {
- if *g_debug {
- log.Printf("-------------------")
- log.Printf("rebuilding package %s", p.Name)
- log.Printf("package import: %s", p.ImportPath)
- log.Printf("package object: %s", p.PkgObj)
- log.Printf("package source dir: %s", p.Dir)
- log.Printf("package source files: %v", p.GoFiles)
- log.Printf("GOPATH: %v", g_daemon.context.GOPATH)
- log.Printf("GOROOT: %v", g_daemon.context.GOROOT)
- }
- env := os.Environ()
- for i, v := range env {
- if strings.HasPrefix(v, "GOPATH=") {
- env[i] = "GOPATH=" + g_daemon.context.GOPATH
- } else if strings.HasPrefix(v, "GOROOT=") {
- env[i] = "GOROOT=" + g_daemon.context.GOROOT
- }
- }
-
- cmd := exec.Command("go", "install", p.ImportPath)
- cmd.Env = env
-
- // TODO: Should read STDERR rather than STDOUT.
- out, err := cmd.CombinedOutput()
- if err != nil {
- return err
- }
- if *g_debug {
- log.Printf("build out: %s\n", string(out))
- }
- return nil
-}
-
-// executes autobuild function if autobuild option is enabled, logs error and
-// ignores it
-func try_autobuild(p *build.Package) {
- if g_config.Autobuild {
- err := autobuild(p)
- if err != nil && *g_debug {
- log.Printf("Autobuild error: %s\n", err)
- }
- }
-}
-
-func log_found_package_maybe(imp, pkgpath string) {
- if *g_debug {
- log.Printf("Found %q at %q\n", imp, pkgpath)
- }
-}
-
-func log_build_context(context *package_lookup_context) {
- log.Printf(" GOROOT: %s\n", context.GOROOT)
- log.Printf(" GOPATH: %s\n", context.GOPATH)
- log.Printf(" GOOS: %s\n", context.GOOS)
- log.Printf(" GOARCH: %s\n", context.GOARCH)
- log.Printf(" BzlProjectRoot: %q\n", context.BzlProjectRoot)
- log.Printf(" GBProjectRoot: %q\n", context.GBProjectRoot)
- log.Printf(" lib-path: %q\n", g_config.LibPath)
-}
-
-// find_global_file returns the file path of the compiled package corresponding to the specified
-// import, and a boolean stating whether such path is valid.
-// TODO: Return only one value, possibly empty string if not found.
-func find_global_file(imp string, context *package_lookup_context) (string, bool) {
- // gocode synthetically generates the builtin package
- // "unsafe", since the "unsafe.a" package doesn't really exist.
- // Thus, when the user request for the package "unsafe" we
- // would return synthetic global file that would be used
- // just as a key name to find this synthetic package
- if imp == "unsafe" {
- return "unsafe", true
- }
-
- pkgfile := fmt.Sprintf("%s.a", imp)
-
- // if lib-path is defined, use it
- if g_config.LibPath != "" {
- for _, p := range filepath.SplitList(g_config.LibPath) {
- pkg_path := filepath.Join(p, pkgfile)
- if file_exists(pkg_path) {
- log_found_package_maybe(imp, pkg_path)
- return pkg_path, true
- }
- // Also check the relevant pkg/OS_ARCH dir for the libpath, if provided.
- pkgdir := fmt.Sprintf("%s_%s", context.GOOS, context.GOARCH)
- pkg_path = filepath.Join(p, "pkg", pkgdir, pkgfile)
- if file_exists(pkg_path) {
- log_found_package_maybe(imp, pkg_path)
- return pkg_path, true
- }
- }
- }
-
- // gb-specific lookup mode, only if the root dir was found
- if g_config.PackageLookupMode == "gb" && context.GBProjectRoot != "" {
- root := context.GBProjectRoot
- pkgdir := filepath.Join(root, "pkg", context.GOOS+"-"+context.GOARCH)
- if !is_dir(pkgdir) {
- pkgdir = filepath.Join(root, "pkg", context.GOOS+"-"+context.GOARCH+"-race")
- }
- pkg_path := filepath.Join(pkgdir, pkgfile)
- if file_exists(pkg_path) {
- log_found_package_maybe(imp, pkg_path)
- return pkg_path, true
- }
- }
-
- // bzl-specific lookup mode, only if the root dir was found
- if g_config.PackageLookupMode == "bzl" && context.BzlProjectRoot != "" {
- var root, impath string
- if strings.HasPrefix(imp, g_config.CustomPkgPrefix+"/") {
- root = filepath.Join(context.BzlProjectRoot, "bazel-bin")
- impath = imp[len(g_config.CustomPkgPrefix)+1:]
- } else if g_config.CustomVendorDir != "" {
- // Try custom vendor dir.
- root = filepath.Join(context.BzlProjectRoot, "bazel-bin", g_config.CustomVendorDir)
- impath = imp
- }
-
- if root != "" && impath != "" {
- // There might be more than one ".a" files in the pkg path with bazel.
- // But the best practice is to keep one go_library build target in each
- // pakcage directory so that it follows the standard Go package
- // structure. Thus here we assume there is at most one ".a" file existing
- // in the pkg path.
- if d, err := os.Open(filepath.Join(root, impath)); err == nil {
- defer d.Close()
-
- if fis, err := d.Readdir(-1); err == nil {
- for _, fi := range fis {
- if !fi.IsDir() && filepath.Ext(fi.Name()) == ".a" {
- pkg_path := filepath.Join(root, impath, fi.Name())
- log_found_package_maybe(imp, pkg_path)
- return pkg_path, true
- }
- }
- }
- }
- }
- }
-
- if context.CurrentPackagePath != "" {
- // Try vendor path first, see GO15VENDOREXPERIMENT.
- // We don't check this environment variable however, seems like there is
- // almost no harm in doing so (well.. if you experiment with vendoring,
- // gocode will fail after enabling/disabling the flag, and you'll be
- // forced to get rid of vendor binaries). But asking users to set this
- // env var is up will bring more trouble. Because we also need to pass
- // it from client to server, make sure their editors set it, etc.
- // So, whatever, let's just pretend it's always on.
- package_path := context.CurrentPackagePath
- for {
- limp := filepath.Join(package_path, "vendor", imp)
- if p, err := context.Import(limp, "", build.AllowBinary|build.FindOnly); err == nil {
- try_autobuild(p)
- if file_exists(p.PkgObj) {
- log_found_package_maybe(imp, p.PkgObj)
- return p.PkgObj, true
- }
- }
- if package_path == "" {
- break
- }
- next_path := filepath.Dir(package_path)
- // let's protect ourselves from inf recursion here
- if next_path == package_path {
- break
- }
- package_path = next_path
- }
- }
-
- if p, err := context.Import(imp, "", build.AllowBinary|build.FindOnly); err == nil {
- try_autobuild(p)
- if file_exists(p.PkgObj) {
- log_found_package_maybe(imp, p.PkgObj)
- return p.PkgObj, true
- }
- }
-
- if *g_debug {
- log.Printf("Import path %q was not resolved\n", imp)
- log.Println("Gocode's build context is:")
- log_build_context(context)
- }
- return "", false
-}
-
-func package_name(file *ast.File) string {
- if file.Name != nil {
- return file.Name.Name
- }
- return ""
-}
-
-//-------------------------------------------------------------------------
-// decl_cache
-//
-// Thread-safe collection of DeclFileCache entities.
-//-------------------------------------------------------------------------
-
-type package_lookup_context struct {
- build.Context
- BzlProjectRoot string
- GBProjectRoot string
- CurrentPackagePath string
-}
-
-// gopath returns the list of Go path directories.
-func (ctxt *package_lookup_context) gopath() []string {
- var all []string
- for _, p := range filepath.SplitList(ctxt.GOPATH) {
- if p == "" || p == ctxt.GOROOT {
- // Empty paths are uninteresting.
- // If the path is the GOROOT, ignore it.
- // People sometimes set GOPATH=$GOROOT.
- // Do not get confused by this common mistake.
- continue
- }
- if strings.HasPrefix(p, "~") {
- // Path segments starting with ~ on Unix are almost always
- // users who have incorrectly quoted ~ while setting GOPATH,
- // preventing it from expanding to $HOME.
- // The situation is made more confusing by the fact that
- // bash allows quoted ~ in $PATH (most shells do not).
- // Do not get confused by this, and do not try to use the path.
- // It does not exist, and printing errors about it confuses
- // those users even more, because they think "sure ~ exists!".
- // The go command diagnoses this situation and prints a
- // useful error.
- // On Windows, ~ is used in short names, such as c:\progra~1
- // for c:\program files.
- continue
- }
- all = append(all, p)
- }
- return all
-}
-
-func (ctxt *package_lookup_context) pkg_dirs() (string, []string) {
- pkgdir := fmt.Sprintf("%s_%s", ctxt.GOOS, ctxt.GOARCH)
-
- var currentPackagePath string
- var all []string
- if ctxt.GOROOT != "" {
- dir := filepath.Join(ctxt.GOROOT, "pkg", pkgdir)
- if is_dir(dir) {
- all = append(all, dir)
- }
- }
-
- switch g_config.PackageLookupMode {
- case "go":
- currentPackagePath = ctxt.CurrentPackagePath
- for _, p := range ctxt.gopath() {
- dir := filepath.Join(p, "pkg", pkgdir)
- if is_dir(dir) {
- all = append(all, dir)
- }
- dir = filepath.Join(dir, currentPackagePath, "vendor")
- if is_dir(dir) {
- all = append(all, dir)
- }
- }
- case "gb":
- if ctxt.GBProjectRoot != "" {
- pkgdir := fmt.Sprintf("%s-%s", ctxt.GOOS, ctxt.GOARCH)
- if !is_dir(pkgdir) {
- pkgdir = fmt.Sprintf("%s-%s-race", ctxt.GOOS, ctxt.GOARCH)
- }
- dir := filepath.Join(ctxt.GBProjectRoot, "pkg", pkgdir)
- if is_dir(dir) {
- all = append(all, dir)
- }
- }
- case "bzl":
- // TODO: Support bazel mode
- }
- return currentPackagePath, all
-}
-
-type decl_cache struct {
- cache map[string]*decl_file_cache
- context *package_lookup_context
- sync.Mutex
-}
-
-func new_decl_cache(context *package_lookup_context) *decl_cache {
- return &decl_cache{
- cache: make(map[string]*decl_file_cache),
- context: context,
- }
-}
-
-func (c *decl_cache) get(filename string) *decl_file_cache {
- c.Lock()
- defer c.Unlock()
-
- f, ok := c.cache[filename]
- if !ok {
- f = new_decl_file_cache(filename, c.context)
- c.cache[filename] = f
- }
- return f
-}
-
-func (c *decl_cache) get_and_update(filename string) *decl_file_cache {
- f := c.get(filename)
- f.update()
- return f
-}
diff --git a/vendor/github.com/nsf/gocode/formatters.go b/vendor/github.com/nsf/gocode/formatters.go
deleted file mode 100644
index 4a9738c..0000000
--- a/vendor/github.com/nsf/gocode/formatters.go
+++ /dev/null
@@ -1,186 +0,0 @@
-package main
-
-import (
- "fmt"
- "strings"
-)
-
-//-------------------------------------------------------------------------
-// formatter interfaces
-//-------------------------------------------------------------------------
-
-type formatter interface {
- write_candidates(candidates []candidate, num int)
-}
-
-//-------------------------------------------------------------------------
-// nice_formatter (just for testing, simple textual output)
-//-------------------------------------------------------------------------
-
-type nice_formatter struct{}
-
-func (*nice_formatter) write_candidates(candidates []candidate, num int) {
- if candidates == nil {
- fmt.Printf("Nothing to complete.\n")
- return
- }
-
- fmt.Printf("Found %d candidates:\n", len(candidates))
- for _, c := range candidates {
- abbr := fmt.Sprintf("%s %s %s", c.Class, c.Name, c.Type)
- if c.Class == decl_func {
- abbr = fmt.Sprintf("%s %s%s", c.Class, c.Name, c.Type[len("func"):])
- }
- fmt.Printf(" %s\n", abbr)
- }
-}
-
-//-------------------------------------------------------------------------
-// vim_formatter
-//-------------------------------------------------------------------------
-
-type vim_formatter struct{}
-
-func (*vim_formatter) write_candidates(candidates []candidate, num int) {
- if candidates == nil {
- fmt.Print("[0, []]")
- return
- }
-
- fmt.Printf("[%d, [", num)
- for i, c := range candidates {
- if i != 0 {
- fmt.Printf(", ")
- }
-
- word := c.Name
- if c.Class == decl_func {
- word += "("
- if strings.HasPrefix(c.Type, "func()") {
- word += ")"
- }
- }
-
- abbr := fmt.Sprintf("%s %s %s", c.Class, c.Name, c.Type)
- if c.Class == decl_func {
- abbr = fmt.Sprintf("%s %s%s", c.Class, c.Name, c.Type[len("func"):])
- }
- fmt.Printf("{'word': '%s', 'abbr': '%s', 'info': '%s'}", word, abbr, abbr)
- }
- fmt.Printf("]]")
-}
-
-//-------------------------------------------------------------------------
-// godit_formatter
-//-------------------------------------------------------------------------
-
-type godit_formatter struct{}
-
-func (*godit_formatter) write_candidates(candidates []candidate, num int) {
- fmt.Printf("%d,,%d\n", num, len(candidates))
- for _, c := range candidates {
- contents := c.Name
- if c.Class == decl_func {
- contents += "("
- if strings.HasPrefix(c.Type, "func()") {
- contents += ")"
- }
- }
-
- display := fmt.Sprintf("%s %s %s", c.Class, c.Name, c.Type)
- if c.Class == decl_func {
- display = fmt.Sprintf("%s %s%s", c.Class, c.Name, c.Type[len("func"):])
- }
- fmt.Printf("%s,,%s\n", display, contents)
- }
-}
-
-//-------------------------------------------------------------------------
-// emacs_formatter
-//-------------------------------------------------------------------------
-
-type emacs_formatter struct{}
-
-func (*emacs_formatter) write_candidates(candidates []candidate, num int) {
- for _, c := range candidates {
- var hint string
- switch {
- case c.Class == decl_func:
- hint = c.Type
- case c.Type == "":
- hint = c.Class.String()
- default:
- hint = c.Class.String() + " " + c.Type
- }
- fmt.Printf("%s,,%s\n", c.Name, hint)
- }
-}
-
-//-------------------------------------------------------------------------
-// csv_formatter
-//-------------------------------------------------------------------------
-
-type csv_formatter struct{}
-
-func (*csv_formatter) write_candidates(candidates []candidate, num int) {
- for _, c := range candidates {
- fmt.Printf("%s,,%s,,%s\n", c.Class, c.Name, c.Type)
- }
-}
-
-//-------------------------------------------------------------------------
-// csv_with_package_formatter
-//-------------------------------------------------------------------------
-
-type csv_with_package_formatter struct{}
-
-func (*csv_with_package_formatter) write_candidates(candidates []candidate, num int) {
- for _, c := range candidates {
- fmt.Printf("%s,,%s,,%s,,%s\n", c.Class, c.Name, c.Type, c.Package)
- }
-}
-
-//-------------------------------------------------------------------------
-// json_formatter
-//-------------------------------------------------------------------------
-
-type json_formatter struct{}
-
-func (*json_formatter) write_candidates(candidates []candidate, num int) {
- if candidates == nil {
- fmt.Print("[]")
- return
- }
-
- fmt.Printf(`[%d, [`, num)
- for i, c := range candidates {
- if i != 0 {
- fmt.Printf(", ")
- }
- fmt.Printf(`{"class": "%s", "name": "%s", "type": "%s", "package": "%s"}`,
- c.Class, c.Name, c.Type, c.Package)
- }
- fmt.Print("]]")
-}
-
-//-------------------------------------------------------------------------
-
-func get_formatter(name string) formatter {
- switch name {
- case "vim":
- return new(vim_formatter)
- case "emacs":
- return new(emacs_formatter)
- case "nice":
- return new(nice_formatter)
- case "csv":
- return new(csv_formatter)
- case "csv-with-package":
- return new(csv_with_package_formatter)
- case "json":
- return new(json_formatter)
- case "godit":
- return new(godit_formatter)
- }
- return new(nice_formatter)
-}
diff --git a/vendor/github.com/nsf/gocode/gocode.go b/vendor/github.com/nsf/gocode/gocode.go
deleted file mode 100644
index b0dd5a2..0000000
--- a/vendor/github.com/nsf/gocode/gocode.go
+++ /dev/null
@@ -1,74 +0,0 @@
-package main
-
-import (
- "flag"
- "fmt"
- "log"
- "net/http"
- _ "net/http/pprof"
- "os"
- "path/filepath"
-)
-
-var (
- g_is_server = flag.Bool("s", false, "run a server instead of a client")
- g_format = flag.String("f", "nice", "output format (vim | emacs | nice | csv | csv-with-package | json)")
- g_input = flag.String("in", "", "use this file instead of stdin input")
- g_sock = create_sock_flag("sock", "socket type (unix | tcp)")
- g_addr = flag.String("addr", "127.0.0.1:37373", "address for tcp socket")
- g_debug = flag.Bool("debug", false, "enable server-side debug mode")
- g_profile = flag.Int("profile", 0, "port on which to expose profiling information for pprof; 0 to disable profiling")
-)
-
-func get_socket_filename() string {
- user := os.Getenv("USER")
- if user == "" {
- user = "all"
- }
- return filepath.Join(os.TempDir(), fmt.Sprintf("gocode-daemon.%s", user))
-}
-
-func show_usage() {
- fmt.Fprintf(os.Stderr,
- "Usage: %s [-s] [-f=] [-in=] [-sock=] [-addr=]\n"+
- " []\n\n",
- os.Args[0])
- fmt.Fprintf(os.Stderr,
- "Flags:\n")
- flag.PrintDefaults()
- fmt.Fprintf(os.Stderr,
- "\nCommands:\n"+
- " autocomplete [] main autocompletion command\n"+
- " close close the gocode daemon\n"+
- " drop-cache drop gocode daemon's cache\n"+
- " options list config options (extended)\n"+
- " set [ []] list or set config options\n"+
- " status gocode daemon status report\n"+
- "")
-}
-
-func main() {
- flag.Usage = show_usage
- flag.Parse()
-
- var retval int
- if *g_is_server {
- go func() {
- if *g_profile <= 0 {
- return
- }
- addr := fmt.Sprintf("localhost:%d", *g_profile)
- // Use the following commands to profile the binary:
- // go tool pprof http://localhost:6060/debug/pprof/profile # 30-second CPU profile
- // go tool pprof http://localhost:6060/debug/pprof/heap # heap profile
- // go tool pprof http://localhost:6060/debug/pprof/block # goroutine blocking profile
- // See http://blog.golang.org/profiling-go-programs for more info.
- log.Printf("enabling profiler on %s", addr)
- log.Print(http.ListenAndServe(addr, nil))
- }()
- retval = do_server()
- } else {
- retval = do_client()
- }
- os.Exit(retval)
-}
diff --git a/vendor/github.com/nsf/gocode/os_posix.go b/vendor/github.com/nsf/gocode/os_posix.go
deleted file mode 100644
index ac076e3..0000000
--- a/vendor/github.com/nsf/gocode/os_posix.go
+++ /dev/null
@@ -1,48 +0,0 @@
-// +build !windows
-
-package main
-
-import (
- "flag"
- "os"
- "os/exec"
- "path/filepath"
-)
-
-func create_sock_flag(name, desc string) *string {
- return flag.String(name, "unix", desc)
-}
-
-// Full path of the current executable
-func get_executable_filename() string {
- // try readlink first
- path, err := os.Readlink("/proc/self/exe")
- if err == nil {
- return path
- }
- // use argv[0]
- path = os.Args[0]
- if !filepath.IsAbs(path) {
- cwd, _ := os.Getwd()
- path = filepath.Join(cwd, path)
- }
- if file_exists(path) {
- return path
- }
- // Fallback : use "gocode" and assume we are in the PATH...
- path, err = exec.LookPath("gocode")
- if err == nil {
- return path
- }
- return ""
-}
-
-// config location
-
-func config_dir() string {
- return filepath.Join(xdg_home_dir(), "gocode")
-}
-
-func config_file() string {
- return filepath.Join(xdg_home_dir(), "gocode", "config.json")
-}
diff --git a/vendor/github.com/nsf/gocode/os_windows.go b/vendor/github.com/nsf/gocode/os_windows.go
deleted file mode 100644
index 1a63f9d..0000000
--- a/vendor/github.com/nsf/gocode/os_windows.go
+++ /dev/null
@@ -1,56 +0,0 @@
-package main
-
-import (
- "flag"
- "fmt"
- "path/filepath"
- "syscall"
- "unsafe"
-)
-
-var (
- shell32 = syscall.NewLazyDLL("shell32.dll")
- kernel32 = syscall.NewLazyDLL("kernel32.dll")
-)
-
-var (
- proc_sh_get_folder_path = shell32.NewProc("SHGetFolderPathW")
- proc_get_module_file_name = kernel32.NewProc("GetModuleFileNameW")
-)
-
-func create_sock_flag(name, desc string) *string {
- return flag.String(name, "tcp", desc)
-}
-
-// Full path of the current executable
-func get_executable_filename() string {
- b := make([]uint16, syscall.MAX_PATH)
- ret, _, err := syscall.Syscall(proc_get_module_file_name.Addr(), 3,
- 0, uintptr(unsafe.Pointer(&b[0])), uintptr(len(b)))
- if int(ret) == 0 {
- panic(fmt.Sprintf("GetModuleFileNameW : err %d", int(err)))
- }
- return syscall.UTF16ToString(b)
-}
-
-const (
- csidl_appdata = 0x1a
-)
-
-func get_appdata_folder_path() string {
- b := make([]uint16, syscall.MAX_PATH)
- ret, _, err := syscall.Syscall6(proc_sh_get_folder_path.Addr(), 5,
- 0, csidl_appdata, 0, 0, uintptr(unsafe.Pointer(&b[0])), 0)
- if int(ret) != 0 {
- panic(fmt.Sprintf("SHGetFolderPathW : err %d", int(err)))
- }
- return syscall.UTF16ToString(b)
-}
-
-func config_dir() string {
- return filepath.Join(get_appdata_folder_path(), "gocode")
-}
-
-func config_file() string {
- return filepath.Join(get_appdata_folder_path(), "gocode", "config.json")
-}
diff --git a/vendor/github.com/nsf/gocode/package.go b/vendor/github.com/nsf/gocode/package.go
deleted file mode 100644
index 687cb80..0000000
--- a/vendor/github.com/nsf/gocode/package.go
+++ /dev/null
@@ -1,254 +0,0 @@
-package main
-
-import (
- "bytes"
- "fmt"
- "go/ast"
- "os"
- "strings"
-)
-
-type package_parser interface {
- parse_export(callback func(pkg string, decl ast.Decl))
-}
-
-//-------------------------------------------------------------------------
-// package_file_cache
-//
-// Structure that represents a cache for an imported pacakge. In other words
-// these are the contents of an archive (*.a) file.
-//-------------------------------------------------------------------------
-
-type package_file_cache struct {
- name string // file name
- import_name string
- mtime int64
- defalias string
-
- scope *scope
- main *decl // package declaration
- others map[string]*decl
-}
-
-func new_package_file_cache(absname, name string) *package_file_cache {
- m := new(package_file_cache)
- m.name = absname
- m.import_name = name
- m.mtime = 0
- m.defalias = ""
- return m
-}
-
-// Creates a cache that stays in cache forever. Useful for built-in packages.
-func new_package_file_cache_forever(name, defalias string) *package_file_cache {
- m := new(package_file_cache)
- m.name = name
- m.mtime = -1
- m.defalias = defalias
- return m
-}
-
-func (m *package_file_cache) find_file() string {
- if file_exists(m.name) {
- return m.name
- }
-
- n := len(m.name)
- filename := m.name[:n-1] + "6"
- if file_exists(filename) {
- return filename
- }
-
- filename = m.name[:n-1] + "8"
- if file_exists(filename) {
- return filename
- }
-
- filename = m.name[:n-1] + "5"
- if file_exists(filename) {
- return filename
- }
- return m.name
-}
-
-func (m *package_file_cache) update_cache() {
- if m.mtime == -1 {
- return
- }
- fname := m.find_file()
- stat, err := os.Stat(fname)
- if err != nil {
- return
- }
-
- statmtime := stat.ModTime().UnixNano()
- if m.mtime != statmtime {
- m.mtime = statmtime
-
- data, err := file_reader.read_file(fname)
- if err != nil {
- return
- }
- m.process_package_data(data)
- }
-}
-
-func (m *package_file_cache) process_package_data(data []byte) {
- m.scope = new_named_scope(g_universe_scope, m.name)
-
- // find import section
- i := bytes.Index(data, []byte{'\n', '$', '$'})
- if i == -1 {
- panic(fmt.Sprintf("Can't find the import section in the package file %s", m.name))
- }
- data = data[i+len("\n$$"):]
-
- // main package
- m.main = new_decl(m.name, decl_package, nil)
- // create map for other packages
- m.others = make(map[string]*decl)
-
- var pp package_parser
- if data[0] == 'B' {
- // binary format, skip 'B\n'
- data = data[2:]
- var p gc_bin_parser
- p.init(data, m)
- pp = &p
- } else {
- // textual format, find the beginning of the package clause
- i = bytes.Index(data, []byte{'p', 'a', 'c', 'k', 'a', 'g', 'e'})
- if i == -1 {
- panic("Can't find the package clause")
- }
- data = data[i:]
-
- var p gc_parser
- p.init(data, m)
- pp = &p
- }
-
- prefix := "!" + m.name + "!"
- pp.parse_export(func(pkg string, decl ast.Decl) {
- anonymify_ast(decl, decl_foreign, m.scope)
- if pkg == "" || strings.HasPrefix(pkg, prefix) {
- // main package
- add_ast_decl_to_package(m.main, decl, m.scope)
- } else {
- // others
- if _, ok := m.others[pkg]; !ok {
- m.others[pkg] = new_decl(pkg, decl_package, nil)
- }
- add_ast_decl_to_package(m.others[pkg], decl, m.scope)
- }
- })
-
- // hack, add ourselves to the package scope
- mainName := "!" + m.name + "!" + m.defalias
- m.add_package_to_scope(mainName, m.name)
-
- // replace dummy package decls in package scope to actual packages
- for key := range m.scope.entities {
- if !strings.HasPrefix(key, "!") {
- continue
- }
- pkg, ok := m.others[key]
- if !ok && key == mainName {
- pkg = m.main
- }
- m.scope.replace_decl(key, pkg)
- }
-}
-
-func (m *package_file_cache) add_package_to_scope(alias, realname string) {
- d := new_decl(realname, decl_package, nil)
- m.scope.add_decl(alias, d)
-}
-
-func add_ast_decl_to_package(pkg *decl, decl ast.Decl, scope *scope) {
- foreach_decl(decl, func(data *foreach_decl_struct) {
- class := ast_decl_class(data.decl)
- for i, name := range data.names {
- typ, v, vi := data.type_value_index(i)
-
- d := new_decl_full(name.Name, class, decl_foreign|ast_decl_flags(data.decl), typ, v, vi, scope)
- if d == nil {
- return
- }
-
- if !name.IsExported() && d.class != decl_type {
- return
- }
-
- methodof := method_of(data.decl)
- if methodof != "" {
- decl := pkg.find_child(methodof)
- if decl != nil {
- decl.add_child(d)
- } else {
- decl = new_decl(methodof, decl_methods_stub, scope)
- decl.add_child(d)
- pkg.add_child(decl)
- }
- } else {
- decl := pkg.find_child(d.name)
- if decl != nil {
- decl.expand_or_replace(d)
- } else {
- pkg.add_child(d)
- }
- }
- }
- })
-}
-
-//-------------------------------------------------------------------------
-// package_cache
-//-------------------------------------------------------------------------
-
-type package_cache map[string]*package_file_cache
-
-func new_package_cache() package_cache {
- m := make(package_cache)
-
- // add built-in "unsafe" package
- m.add_builtin_unsafe_package()
-
- return m
-}
-
-// Function fills 'ps' set with packages from 'packages' import information.
-// In case if package is not in the cache, it creates one and adds one to the cache.
-func (c package_cache) append_packages(ps map[string]*package_file_cache, pkgs []package_import) {
- for _, m := range pkgs {
- if _, ok := ps[m.abspath]; ok {
- continue
- }
-
- if mod, ok := c[m.abspath]; ok {
- ps[m.abspath] = mod
- } else {
- mod = new_package_file_cache(m.abspath, m.path)
- ps[m.abspath] = mod
- c[m.abspath] = mod
- }
- }
-}
-
-var g_builtin_unsafe_package = []byte(`
-import
-$$
-package unsafe
- type @"".Pointer uintptr
- func @"".Offsetof (? any) uintptr
- func @"".Sizeof (? any) uintptr
- func @"".Alignof (? any) uintptr
-
-$$
-`)
-
-func (c package_cache) add_builtin_unsafe_package() {
- pkg := new_package_file_cache_forever("unsafe", "unsafe")
- pkg.process_package_data(g_builtin_unsafe_package)
- c["unsafe"] = pkg
-}
diff --git a/vendor/github.com/nsf/gocode/package_bin.go b/vendor/github.com/nsf/gocode/package_bin.go
deleted file mode 100644
index 4a51c74..0000000
--- a/vendor/github.com/nsf/gocode/package_bin.go
+++ /dev/null
@@ -1,829 +0,0 @@
-package main
-
-import (
- "encoding/binary"
- "fmt"
- "go/ast"
- "go/token"
- "strconv"
- "strings"
- "unicode"
- "unicode/utf8"
-)
-
-//-------------------------------------------------------------------------
-// gc_bin_parser
-//
-// The following part of the code may contain portions of the code from the Go
-// standard library, which tells me to retain their copyright notice:
-//
-// Copyright (c) 2012 The Go Authors. All rights reserved.
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-// * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-//-------------------------------------------------------------------------
-
-type gc_bin_parser struct {
- data []byte
- buf []byte // for reading strings
- version int // export format version
-
- // object lists
- strList []string // in order of appearance
- pathList []string // in order of appearance
- pkgList []string // in order of appearance
- typList []ast.Expr // in order of appearance
- callback func(pkg string, decl ast.Decl)
- pfc *package_file_cache
- trackAllTypes bool
-
- // position encoding
- posInfoFormat bool
- prevFile string
- prevLine int
-
- // debugging support
- debugFormat bool
- read int // bytes read
-
-}
-
-func (p *gc_bin_parser) init(data []byte, pfc *package_file_cache) {
- p.data = data
- p.version = -1 // unknown version
- p.strList = []string{""} // empty string is mapped to 0
- p.pathList = []string{""} // empty string is mapped to 0
- p.pfc = pfc
-}
-
-func (p *gc_bin_parser) parse_export(callback func(string, ast.Decl)) {
- p.callback = callback
-
- // read version info
- var versionstr string
- if b := p.rawByte(); b == 'c' || b == 'd' {
- // Go1.7 encoding; first byte encodes low-level
- // encoding format (compact vs debug).
- // For backward-compatibility only (avoid problems with
- // old installed packages). Newly compiled packages use
- // the extensible format string.
- // TODO(gri) Remove this support eventually; after Go1.8.
- if b == 'd' {
- p.debugFormat = true
- }
- p.trackAllTypes = p.rawByte() == 'a'
- p.posInfoFormat = p.int() != 0
- versionstr = p.string()
- if versionstr == "v1" {
- p.version = 0
- }
- } else {
- // Go1.8 extensible encoding
- // read version string and extract version number (ignore anything after the version number)
- versionstr = p.rawStringln(b)
- if s := strings.SplitN(versionstr, " ", 3); len(s) >= 2 && s[0] == "version" {
- if v, err := strconv.Atoi(s[1]); err == nil && v > 0 {
- p.version = v
- }
- }
- }
-
- // read version specific flags - extend as necessary
- switch p.version {
- // case 6:
- // ...
- // fallthrough
- case 5, 4, 3, 2, 1:
- p.debugFormat = p.rawStringln(p.rawByte()) == "debug"
- p.trackAllTypes = p.int() != 0
- p.posInfoFormat = p.int() != 0
- case 0:
- // Go1.7 encoding format - nothing to do here
- default:
- panic(fmt.Errorf("unknown export format version %d (%q)", p.version, versionstr))
- }
-
- // --- generic export data ---
-
- // populate typList with predeclared "known" types
- p.typList = append(p.typList, predeclared...)
-
- // read package data
- pkgName := p.pkg()
- p.pfc.defalias = pkgName[strings.LastIndex(pkgName, "!")+1:]
-
- // read objects of phase 1 only (see cmd/compiler/internal/gc/bexport.go)
- objcount := 0
- for {
- tag := p.tagOrIndex()
- if tag == endTag {
- break
- }
- p.obj(tag)
- objcount++
- }
-
- // self-verification
- if count := p.int(); count != objcount {
- panic(fmt.Sprintf("got %d objects; want %d", objcount, count))
- }
-}
-
-func (p *gc_bin_parser) pkg() string {
- // if the package was seen before, i is its index (>= 0)
- i := p.tagOrIndex()
- if i >= 0 {
- return p.pkgList[i]
- }
-
- // otherwise, i is the package tag (< 0)
- if i != packageTag {
- panic(fmt.Sprintf("unexpected package tag %d version %d", i, p.version))
- }
-
- // read package data
- name := p.string()
- var path string
- if p.version >= 5 {
- path = p.path()
- } else {
- path = p.string()
- }
-
- // we should never see an empty package name
- if name == "" {
- panic("empty package name in import")
- }
-
- // an empty path denotes the package we are currently importing;
- // it must be the first package we see
- if (path == "") != (len(p.pkgList) == 0) {
- panic(fmt.Sprintf("package path %q for pkg index %d", path, len(p.pkgList)))
- }
-
- var fullName string
- if path != "" {
- fullName = "!" + path + "!" + name
- p.pfc.add_package_to_scope(fullName, path)
- } else {
- fullName = "!" + p.pfc.name + "!" + name
- }
-
- // if the package was imported before, use that one; otherwise create a new one
- p.pkgList = append(p.pkgList, fullName)
- return p.pkgList[len(p.pkgList)-1]
-}
-
-func (p *gc_bin_parser) obj(tag int) {
- switch tag {
- case constTag:
- p.pos()
- pkg, name := p.qualifiedName()
- typ := p.typ("")
- p.skipValue() // ignore const value, gocode's not interested
- p.callback(pkg, &ast.GenDecl{
- Tok: token.CONST,
- Specs: []ast.Spec{
- &ast.ValueSpec{
- Names: []*ast.Ident{ast.NewIdent(name)},
- Type: typ,
- Values: []ast.Expr{&ast.BasicLit{Kind: token.INT, Value: "0"}},
- },
- },
- })
-
- case aliasTag:
- // TODO(gri) verify type alias hookup is correct
- p.pos()
- pkg, name := p.qualifiedName()
- typ := p.typ("")
- p.callback(pkg, &ast.GenDecl{
- Tok: token.TYPE,
- Specs: []ast.Spec{typeAliasSpec(name, typ)},
- })
-
- case typeTag:
- _ = p.typ("")
-
- case varTag:
- p.pos()
- pkg, name := p.qualifiedName()
- typ := p.typ("")
- p.callback(pkg, &ast.GenDecl{
- Tok: token.VAR,
- Specs: []ast.Spec{
- &ast.ValueSpec{
- Names: []*ast.Ident{ast.NewIdent(name)},
- Type: typ,
- },
- },
- })
-
- case funcTag:
- p.pos()
- pkg, name := p.qualifiedName()
- params := p.paramList()
- results := p.paramList()
- p.callback(pkg, &ast.FuncDecl{
- Name: ast.NewIdent(name),
- Type: &ast.FuncType{Params: params, Results: results},
- })
-
- default:
- panic(fmt.Sprintf("unexpected object tag %d", tag))
- }
-}
-
-const deltaNewFile = -64 // see cmd/compile/internal/gc/bexport.go
-
-func (p *gc_bin_parser) pos() {
- if !p.posInfoFormat {
- return
- }
-
- file := p.prevFile
- line := p.prevLine
- delta := p.int()
- line += delta
- if p.version >= 5 {
- if delta == deltaNewFile {
- if n := p.int(); n >= 0 {
- // file changed
- file = p.path()
- line = n
- }
- }
- } else {
- if delta == 0 {
- if n := p.int(); n >= 0 {
- // file changed
- file = p.prevFile[:n] + p.string()
- line = p.int()
- }
- }
- }
- p.prevFile = file
- p.prevLine = line
-
- // TODO(gri) register new position
-}
-
-func (p *gc_bin_parser) qualifiedName() (pkg string, name string) {
- name = p.string()
- pkg = p.pkg()
- return pkg, name
-}
-
-func (p *gc_bin_parser) reserveMaybe() int {
- if p.trackAllTypes {
- p.typList = append(p.typList, nil)
- return len(p.typList) - 1
- } else {
- return -1
- }
-}
-
-func (p *gc_bin_parser) recordMaybe(idx int, t ast.Expr) ast.Expr {
- if idx == -1 {
- return t
- }
- p.typList[idx] = t
- return t
-}
-
-func (p *gc_bin_parser) record(t ast.Expr) {
- p.typList = append(p.typList, t)
-}
-
-// parent is the package which declared the type; parent == nil means
-// the package currently imported. The parent package is needed for
-// exported struct fields and interface methods which don't contain
-// explicit package information in the export data.
-func (p *gc_bin_parser) typ(parent string) ast.Expr {
- // if the type was seen before, i is its index (>= 0)
- i := p.tagOrIndex()
- if i >= 0 {
- return p.typList[i]
- }
-
- // otherwise, i is the type tag (< 0)
- switch i {
- case namedTag:
- // read type object
- p.pos()
- parent, name := p.qualifiedName()
- tdecl := &ast.GenDecl{
- Tok: token.TYPE,
- Specs: []ast.Spec{
- &ast.TypeSpec{
- Name: ast.NewIdent(name),
- },
- },
- }
-
- // record it right away (underlying type can contain refs to t)
- t := &ast.SelectorExpr{X: ast.NewIdent(parent), Sel: ast.NewIdent(name)}
- p.record(t)
-
- // parse underlying type
- t0 := p.typ(parent)
- tdecl.Specs[0].(*ast.TypeSpec).Type = t0
-
- p.callback(parent, tdecl)
-
- // interfaces have no methods
- if _, ok := t0.(*ast.InterfaceType); ok {
- return t
- }
-
- // read associated methods
- for i := p.int(); i > 0; i-- {
- // TODO(gri) replace this with something closer to fieldName
- p.pos()
- name := p.string()
- if !exported(name) {
- p.pkg()
- }
-
- recv := p.paramList()
- params := p.paramList()
- results := p.paramList()
- p.int() // go:nointerface pragma - discarded
-
- strip_method_receiver(recv)
- p.callback(parent, &ast.FuncDecl{
- Recv: recv,
- Name: ast.NewIdent(name),
- Type: &ast.FuncType{Params: params, Results: results},
- })
- }
- return t
- case arrayTag:
- i := p.reserveMaybe()
- n := p.int64()
- elt := p.typ(parent)
- return p.recordMaybe(i, &ast.ArrayType{
- Len: &ast.BasicLit{Kind: token.INT, Value: fmt.Sprint(n)},
- Elt: elt,
- })
-
- case sliceTag:
- i := p.reserveMaybe()
- elt := p.typ(parent)
- return p.recordMaybe(i, &ast.ArrayType{Len: nil, Elt: elt})
-
- case dddTag:
- i := p.reserveMaybe()
- elt := p.typ(parent)
- return p.recordMaybe(i, &ast.Ellipsis{Elt: elt})
-
- case structTag:
- i := p.reserveMaybe()
- return p.recordMaybe(i, p.structType(parent))
-
- case pointerTag:
- i := p.reserveMaybe()
- elt := p.typ(parent)
- return p.recordMaybe(i, &ast.StarExpr{X: elt})
-
- case signatureTag:
- i := p.reserveMaybe()
- params := p.paramList()
- results := p.paramList()
- return p.recordMaybe(i, &ast.FuncType{Params: params, Results: results})
-
- case interfaceTag:
- i := p.reserveMaybe()
- var embeddeds []*ast.SelectorExpr
- for n := p.int(); n > 0; n-- {
- p.pos()
- if named, ok := p.typ(parent).(*ast.SelectorExpr); ok {
- embeddeds = append(embeddeds, named)
- }
- }
- methods := p.methodList(parent)
- for _, field := range embeddeds {
- methods = append(methods, &ast.Field{Type: field})
- }
- return p.recordMaybe(i, &ast.InterfaceType{Methods: &ast.FieldList{List: methods}})
-
- case mapTag:
- i := p.reserveMaybe()
- key := p.typ(parent)
- val := p.typ(parent)
- return p.recordMaybe(i, &ast.MapType{Key: key, Value: val})
-
- case chanTag:
- i := p.reserveMaybe()
- dir := ast.SEND | ast.RECV
- switch d := p.int(); d {
- case 1:
- dir = ast.RECV
- case 2:
- dir = ast.SEND
- case 3:
- // already set
- default:
- panic(fmt.Sprintf("unexpected channel dir %d", d))
- }
- elt := p.typ(parent)
- return p.recordMaybe(i, &ast.ChanType{Dir: dir, Value: elt})
-
- default:
- panic(fmt.Sprintf("unexpected type tag %d", i))
- }
-}
-
-func (p *gc_bin_parser) structType(parent string) *ast.StructType {
- var fields []*ast.Field
- if n := p.int(); n > 0 {
- fields = make([]*ast.Field, n)
- for i := range fields {
- fields[i], _ = p.field(parent) // (*ast.Field, tag), not interested in tags
- }
- }
- return &ast.StructType{Fields: &ast.FieldList{List: fields}}
-}
-
-func (p *gc_bin_parser) field(parent string) (*ast.Field, string) {
- p.pos()
- _, name, _ := p.fieldName(parent)
- typ := p.typ(parent)
- tag := p.string()
-
- var names []*ast.Ident
- if name != "" {
- names = []*ast.Ident{ast.NewIdent(name)}
- }
- return &ast.Field{
- Names: names,
- Type: typ,
- }, tag
-}
-
-func (p *gc_bin_parser) methodList(parent string) (methods []*ast.Field) {
- if n := p.int(); n > 0 {
- methods = make([]*ast.Field, n)
- for i := range methods {
- methods[i] = p.method(parent)
- }
- }
- return
-}
-
-func (p *gc_bin_parser) method(parent string) *ast.Field {
- p.pos()
- _, name, _ := p.fieldName(parent)
- params := p.paramList()
- results := p.paramList()
- return &ast.Field{
- Names: []*ast.Ident{ast.NewIdent(name)},
- Type: &ast.FuncType{Params: params, Results: results},
- }
-}
-
-func (p *gc_bin_parser) fieldName(parent string) (string, string, bool) {
- name := p.string()
- pkg := parent
- if p.version == 0 && name == "_" {
- // version 0 didn't export a package for _ fields
- return pkg, name, false
- }
- var alias bool
- switch name {
- case "":
- // 1) field name matches base type name and is exported: nothing to do
- case "?":
- // 2) field name matches base type name and is not exported: need package
- name = ""
- pkg = p.pkg()
- case "@":
- // 3) field name doesn't match type name (alias)
- name = p.string()
- alias = true
- fallthrough
- default:
- if !exported(name) {
- pkg = p.pkg()
- }
- }
- return pkg, name, alias
-}
-
-func (p *gc_bin_parser) paramList() *ast.FieldList {
- n := p.int()
- if n == 0 {
- return nil
- }
- // negative length indicates unnamed parameters
- named := true
- if n < 0 {
- n = -n
- named = false
- }
- // n > 0
- flds := make([]*ast.Field, n)
- for i := range flds {
- flds[i] = p.param(named)
- }
- return &ast.FieldList{List: flds}
-}
-
-func (p *gc_bin_parser) param(named bool) *ast.Field {
- t := p.typ("")
-
- name := "?"
- if named {
- name = p.string()
- if name == "" {
- panic("expected named parameter")
- }
- if name != "_" {
- p.pkg()
- }
- if i := strings.Index(name, "·"); i > 0 {
- name = name[:i] // cut off gc-specific parameter numbering
- }
- }
-
- // read and discard compiler-specific info
- p.string()
-
- return &ast.Field{
- Names: []*ast.Ident{ast.NewIdent(name)},
- Type: t,
- }
-}
-
-func exported(name string) bool {
- ch, _ := utf8.DecodeRuneInString(name)
- return unicode.IsUpper(ch)
-}
-
-func (p *gc_bin_parser) skipValue() {
- switch tag := p.tagOrIndex(); tag {
- case falseTag, trueTag:
- case int64Tag:
- p.int64()
- case floatTag:
- p.float()
- case complexTag:
- p.float()
- p.float()
- case stringTag:
- p.string()
- default:
- panic(fmt.Sprintf("unexpected value tag %d", tag))
- }
-}
-
-func (p *gc_bin_parser) float() {
- sign := p.int()
- if sign == 0 {
- return
- }
-
- p.int() // exp
- p.string() // mant
-}
-
-// ----------------------------------------------------------------------------
-// Low-level decoders
-
-func (p *gc_bin_parser) tagOrIndex() int {
- if p.debugFormat {
- p.marker('t')
- }
-
- return int(p.rawInt64())
-}
-
-func (p *gc_bin_parser) int() int {
- x := p.int64()
- if int64(int(x)) != x {
- panic("exported integer too large")
- }
- return int(x)
-}
-
-func (p *gc_bin_parser) int64() int64 {
- if p.debugFormat {
- p.marker('i')
- }
-
- return p.rawInt64()
-}
-
-func (p *gc_bin_parser) path() string {
- if p.debugFormat {
- p.marker('p')
- }
- // if the path was seen before, i is its index (>= 0)
- // (the empty string is at index 0)
- i := p.rawInt64()
- if i >= 0 {
- return p.pathList[i]
- }
- // otherwise, i is the negative path length (< 0)
- a := make([]string, -i)
- for n := range a {
- a[n] = p.string()
- }
- s := strings.Join(a, "/")
- p.pathList = append(p.pathList, s)
- return s
-}
-
-func (p *gc_bin_parser) string() string {
- if p.debugFormat {
- p.marker('s')
- }
- // if the string was seen before, i is its index (>= 0)
- // (the empty string is at index 0)
- i := p.rawInt64()
- if i >= 0 {
- return p.strList[i]
- }
- // otherwise, i is the negative string length (< 0)
- if n := int(-i); n <= cap(p.buf) {
- p.buf = p.buf[:n]
- } else {
- p.buf = make([]byte, n)
- }
- for i := range p.buf {
- p.buf[i] = p.rawByte()
- }
- s := string(p.buf)
- p.strList = append(p.strList, s)
- return s
-}
-
-func (p *gc_bin_parser) marker(want byte) {
- if got := p.rawByte(); got != want {
- panic(fmt.Sprintf("incorrect marker: got %c; want %c (pos = %d)", got, want, p.read))
- }
-
- pos := p.read
- if n := int(p.rawInt64()); n != pos {
- panic(fmt.Sprintf("incorrect position: got %d; want %d", n, pos))
- }
-}
-
-// rawInt64 should only be used by low-level decoders.
-func (p *gc_bin_parser) rawInt64() int64 {
- i, err := binary.ReadVarint(p)
- if err != nil {
- panic(fmt.Sprintf("read error: %v", err))
- }
- return i
-}
-
-// rawStringln should only be used to read the initial version string.
-func (p *gc_bin_parser) rawStringln(b byte) string {
- p.buf = p.buf[:0]
- for b != '\n' {
- p.buf = append(p.buf, b)
- b = p.rawByte()
- }
- return string(p.buf)
-}
-
-// needed for binary.ReadVarint in rawInt64
-func (p *gc_bin_parser) ReadByte() (byte, error) {
- return p.rawByte(), nil
-}
-
-// byte is the bottleneck interface for reading p.data.
-// It unescapes '|' 'S' to '$' and '|' '|' to '|'.
-// rawByte should only be used by low-level decoders.
-func (p *gc_bin_parser) rawByte() byte {
- b := p.data[0]
- r := 1
- if b == '|' {
- b = p.data[1]
- r = 2
- switch b {
- case 'S':
- b = '$'
- case '|':
- // nothing to do
- default:
- panic("unexpected escape sequence in export data")
- }
- }
- p.data = p.data[r:]
- p.read += r
- return b
-
-}
-
-// ----------------------------------------------------------------------------
-// Export format
-
-// Tags. Must be < 0.
-const (
- // Objects
- packageTag = -(iota + 1)
- constTag
- typeTag
- varTag
- funcTag
- endTag
-
- // Types
- namedTag
- arrayTag
- sliceTag
- dddTag
- structTag
- pointerTag
- signatureTag
- interfaceTag
- mapTag
- chanTag
-
- // Values
- falseTag
- trueTag
- int64Tag
- floatTag
- fractionTag // not used by gc
- complexTag
- stringTag
- nilTag // only used by gc (appears in exported inlined function bodies)
- unknownTag // not used by gc (only appears in packages with errors)
-
- // Type aliases
- aliasTag
-)
-
-var predeclared = []ast.Expr{
- // basic types
- ast.NewIdent("bool"),
- ast.NewIdent("int"),
- ast.NewIdent("int8"),
- ast.NewIdent("int16"),
- ast.NewIdent("int32"),
- ast.NewIdent("int64"),
- ast.NewIdent("uint"),
- ast.NewIdent("uint8"),
- ast.NewIdent("uint16"),
- ast.NewIdent("uint32"),
- ast.NewIdent("uint64"),
- ast.NewIdent("uintptr"),
- ast.NewIdent("float32"),
- ast.NewIdent("float64"),
- ast.NewIdent("complex64"),
- ast.NewIdent("complex128"),
- ast.NewIdent("string"),
-
- // basic type aliases
- ast.NewIdent("byte"),
- ast.NewIdent("rune"),
-
- // error
- ast.NewIdent("error"),
-
- // TODO(nsf): don't think those are used in just package type info,
- // maybe for consts, but we are not interested in that
- // untyped types
- ast.NewIdent(">_<"), // TODO: types.Typ[types.UntypedBool],
- ast.NewIdent(">_<"), // TODO: types.Typ[types.UntypedInt],
- ast.NewIdent(">_<"), // TODO: types.Typ[types.UntypedRune],
- ast.NewIdent(">_<"), // TODO: types.Typ[types.UntypedFloat],
- ast.NewIdent(">_<"), // TODO: types.Typ[types.UntypedComplex],
- ast.NewIdent(">_<"), // TODO: types.Typ[types.UntypedString],
- ast.NewIdent(">_<"), // TODO: types.Typ[types.UntypedNil],
-
- // package unsafe
- &ast.SelectorExpr{X: ast.NewIdent("unsafe"), Sel: ast.NewIdent("Pointer")},
-
- // invalid type
- ast.NewIdent(">_<"), // TODO: types.Typ[types.Invalid], // only appears in packages with errors
-
- // used internally by gc; never used by this package or in .a files
- ast.NewIdent("any"),
-}
diff --git a/vendor/github.com/nsf/gocode/package_text.go b/vendor/github.com/nsf/gocode/package_text.go
deleted file mode 100644
index c714bb1..0000000
--- a/vendor/github.com/nsf/gocode/package_text.go
+++ /dev/null
@@ -1,678 +0,0 @@
-package main
-
-import (
- "bytes"
- "errors"
- "fmt"
- "go/ast"
- "go/token"
- "strconv"
- "text/scanner"
-)
-
-//-------------------------------------------------------------------------
-// gc_parser
-//
-// The following part of the code may contain portions of the code from the Go
-// standard library, which tells me to retain their copyright notice:
-//
-// Copyright (c) 2009 The Go Authors. All rights reserved.
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-// * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-//-------------------------------------------------------------------------
-
-type gc_parser struct {
- scanner scanner.Scanner
- tok rune
- lit string
- path_to_name map[string]string
- beautify bool
- pfc *package_file_cache
-}
-
-func (p *gc_parser) init(data []byte, pfc *package_file_cache) {
- p.scanner.Init(bytes.NewReader(data))
- p.scanner.Error = func(_ *scanner.Scanner, msg string) { p.error(msg) }
- p.scanner.Mode = scanner.ScanIdents | scanner.ScanInts | scanner.ScanStrings |
- scanner.ScanComments | scanner.ScanChars | scanner.SkipComments
- p.scanner.Whitespace = 1<<'\t' | 1<<' ' | 1<<'\r' | 1<<'\v' | 1<<'\f'
- p.scanner.Filename = "package.go"
- p.next()
- // and the built-in "unsafe" package to the path_to_name map
- p.path_to_name = map[string]string{"unsafe": "unsafe"}
- p.pfc = pfc
-}
-
-func (p *gc_parser) next() {
- p.tok = p.scanner.Scan()
- switch p.tok {
- case scanner.Ident, scanner.Int, scanner.String:
- p.lit = p.scanner.TokenText()
- default:
- p.lit = ""
- }
-}
-
-func (p *gc_parser) error(msg string) {
- panic(errors.New(msg))
-}
-
-func (p *gc_parser) errorf(format string, args ...interface{}) {
- p.error(fmt.Sprintf(format, args...))
-}
-
-func (p *gc_parser) expect(tok rune) string {
- lit := p.lit
- if p.tok != tok {
- p.errorf("expected %s, got %s (%q)", scanner.TokenString(tok),
- scanner.TokenString(p.tok), lit)
- }
- p.next()
- return lit
-}
-
-func (p *gc_parser) expect_keyword(keyword string) {
- lit := p.expect(scanner.Ident)
- if lit != keyword {
- p.errorf("expected keyword: %s, got: %q", keyword, lit)
- }
-}
-
-func (p *gc_parser) expect_special(what string) {
- i := 0
- for i < len(what) {
- if p.tok != rune(what[i]) {
- break
- }
-
- nc := p.scanner.Peek()
- if i != len(what)-1 && nc <= ' ' {
- break
- }
-
- p.next()
- i++
- }
-
- if i < len(what) {
- p.errorf("expected: %q, got: %q", what, what[0:i])
- }
-}
-
-// dotIdentifier = "?" | ( ident | '·' ) { ident | int | '·' } .
-// we're doing lexer job here, kind of
-func (p *gc_parser) parse_dot_ident() string {
- if p.tok == '?' {
- p.next()
- return "?"
- }
-
- ident := ""
- sep := 'x'
- i, j := 0, -1
- for (p.tok == scanner.Ident || p.tok == scanner.Int || p.tok == '·') && sep > ' ' {
- ident += p.lit
- if p.tok == '·' {
- ident += "·"
- j = i
- i++
- }
- i += len(p.lit)
- sep = p.scanner.Peek()
- p.next()
- }
- // middot = \xc2\xb7
- if j != -1 && i > j+1 {
- c := ident[j+2]
- if c >= '0' && c <= '9' {
- ident = ident[0:j]
- }
- }
- return ident
-}
-
-// ImportPath = string_lit .
-// quoted name of the path, but we return it as an identifier, taking an alias
-// from 'pathToAlias' map, it is filled by import statements
-func (p *gc_parser) parse_package() *ast.Ident {
- path, err := strconv.Unquote(p.expect(scanner.String))
- if err != nil {
- panic(err)
- }
-
- return ast.NewIdent(path)
-}
-
-// ExportedName = "@" ImportPath "." dotIdentifier .
-func (p *gc_parser) parse_exported_name() *ast.SelectorExpr {
- p.expect('@')
- pkg := p.parse_package()
- if pkg.Name == "" {
- pkg.Name = "!" + p.pfc.name + "!" + p.pfc.defalias
- } else {
- pkg.Name = p.path_to_name[pkg.Name]
- }
- p.expect('.')
- name := ast.NewIdent(p.parse_dot_ident())
- return &ast.SelectorExpr{X: pkg, Sel: name}
-}
-
-// Name = identifier | "?" | ExportedName .
-func (p *gc_parser) parse_name() (string, ast.Expr) {
- switch p.tok {
- case scanner.Ident:
- name := p.lit
- p.next()
- return name, ast.NewIdent(name)
- case '?':
- p.next()
- return "?", ast.NewIdent("?")
- case '@':
- en := p.parse_exported_name()
- return en.Sel.Name, en
- }
- p.error("name expected")
- return "", nil
-}
-
-// Field = Name Type [ string_lit ] .
-func (p *gc_parser) parse_field() *ast.Field {
- var tag string
- name, _ := p.parse_name()
- typ := p.parse_type()
- if p.tok == scanner.String {
- tag = p.expect(scanner.String)
- }
-
- var names []*ast.Ident
- if name != "?" {
- names = []*ast.Ident{ast.NewIdent(name)}
- }
-
- return &ast.Field{
- Names: names,
- Type: typ,
- Tag: &ast.BasicLit{Kind: token.STRING, Value: tag},
- }
-}
-
-// Parameter = ( identifier | "?" ) [ "..." ] Type [ string_lit ] .
-func (p *gc_parser) parse_parameter() *ast.Field {
- // name
- name, _ := p.parse_name()
-
- // type
- var typ ast.Expr
- if p.tok == '.' {
- p.expect_special("...")
- typ = &ast.Ellipsis{Elt: p.parse_type()}
- } else {
- typ = p.parse_type()
- }
-
- var tag string
- if p.tok == scanner.String {
- tag = p.expect(scanner.String)
- }
-
- return &ast.Field{
- Names: []*ast.Ident{ast.NewIdent(name)},
- Type: typ,
- Tag: &ast.BasicLit{Kind: token.STRING, Value: tag},
- }
-}
-
-// Parameters = "(" [ ParameterList ] ")" .
-// ParameterList = { Parameter "," } Parameter .
-func (p *gc_parser) parse_parameters() *ast.FieldList {
- flds := []*ast.Field{}
- parse_parameter := func() {
- par := p.parse_parameter()
- flds = append(flds, par)
- }
-
- p.expect('(')
- if p.tok != ')' {
- parse_parameter()
- for p.tok == ',' {
- p.next()
- parse_parameter()
- }
- }
- p.expect(')')
- return &ast.FieldList{List: flds}
-}
-
-// Signature = Parameters [ Result ] .
-// Result = Type | Parameters .
-func (p *gc_parser) parse_signature() *ast.FuncType {
- var params *ast.FieldList
- var results *ast.FieldList
-
- params = p.parse_parameters()
- switch p.tok {
- case scanner.Ident, '[', '*', '<', '@':
- fld := &ast.Field{Type: p.parse_type()}
- results = &ast.FieldList{List: []*ast.Field{fld}}
- case '(':
- results = p.parse_parameters()
- }
- return &ast.FuncType{Params: params, Results: results}
-}
-
-// MethodOrEmbedSpec = Name [ Signature ] .
-func (p *gc_parser) parse_method_or_embed_spec() *ast.Field {
- name, nameexpr := p.parse_name()
- if p.tok == '(' {
- typ := p.parse_signature()
- return &ast.Field{
- Names: []*ast.Ident{ast.NewIdent(name)},
- Type: typ,
- }
- }
-
- return &ast.Field{
- Type: nameexpr,
- }
-}
-
-// int_lit = [ "-" | "+" ] { "0" ... "9" } .
-func (p *gc_parser) parse_int() {
- switch p.tok {
- case '-', '+':
- p.next()
- }
- p.expect(scanner.Int)
-}
-
-// number = int_lit [ "p" int_lit ] .
-func (p *gc_parser) parse_number() {
- p.parse_int()
- if p.lit == "p" {
- p.next()
- p.parse_int()
- }
-}
-
-//-------------------------------------------------------------------------------
-// gc_parser.types
-//-------------------------------------------------------------------------------
-
-// InterfaceType = "interface" "{" [ MethodOrEmbedList ] "}" .
-// MethodOrEmbedList = MethodOrEmbedSpec { ";" MethodOrEmbedSpec } .
-func (p *gc_parser) parse_interface_type() ast.Expr {
- var methods []*ast.Field
- parse_method := func() {
- meth := p.parse_method_or_embed_spec()
- methods = append(methods, meth)
- }
-
- p.expect_keyword("interface")
- p.expect('{')
- if p.tok != '}' {
- parse_method()
- for p.tok == ';' {
- p.next()
- parse_method()
- }
- }
- p.expect('}')
- return &ast.InterfaceType{Methods: &ast.FieldList{List: methods}}
-}
-
-// StructType = "struct" "{" [ FieldList ] "}" .
-// FieldList = Field { ";" Field } .
-func (p *gc_parser) parse_struct_type() ast.Expr {
- var fields []*ast.Field
- parse_field := func() {
- fld := p.parse_field()
- fields = append(fields, fld)
- }
-
- p.expect_keyword("struct")
- p.expect('{')
- if p.tok != '}' {
- parse_field()
- for p.tok == ';' {
- p.next()
- parse_field()
- }
- }
- p.expect('}')
- return &ast.StructType{Fields: &ast.FieldList{List: fields}}
-}
-
-// MapType = "map" "[" Type "]" Type .
-func (p *gc_parser) parse_map_type() ast.Expr {
- p.expect_keyword("map")
- p.expect('[')
- key := p.parse_type()
- p.expect(']')
- elt := p.parse_type()
- return &ast.MapType{Key: key, Value: elt}
-}
-
-// ChanType = ( "chan" [ "<-" ] | "<-" "chan" ) Type .
-func (p *gc_parser) parse_chan_type() ast.Expr {
- dir := ast.SEND | ast.RECV
- if p.tok == scanner.Ident {
- p.expect_keyword("chan")
- if p.tok == '<' {
- p.expect_special("<-")
- dir = ast.SEND
- }
- } else {
- p.expect_special("<-")
- p.expect_keyword("chan")
- dir = ast.RECV
- }
-
- elt := p.parse_type()
- return &ast.ChanType{Dir: dir, Value: elt}
-}
-
-// ArrayOrSliceType = ArrayType | SliceType .
-// ArrayType = "[" int_lit "]" Type .
-// SliceType = "[" "]" Type .
-func (p *gc_parser) parse_array_or_slice_type() ast.Expr {
- p.expect('[')
- if p.tok == ']' {
- // SliceType
- p.next() // skip ']'
- return &ast.ArrayType{Len: nil, Elt: p.parse_type()}
- }
-
- // ArrayType
- lit := p.expect(scanner.Int)
- p.expect(']')
- return &ast.ArrayType{
- Len: &ast.BasicLit{Kind: token.INT, Value: lit},
- Elt: p.parse_type(),
- }
-}
-
-// Type =
-// BasicType | TypeName | ArrayType | SliceType | StructType |
-// PointerType | FuncType | InterfaceType | MapType | ChanType |
-// "(" Type ")" .
-// BasicType = ident .
-// TypeName = ExportedName .
-// SliceType = "[" "]" Type .
-// PointerType = "*" Type .
-// FuncType = "func" Signature .
-func (p *gc_parser) parse_type() ast.Expr {
- switch p.tok {
- case scanner.Ident:
- switch p.lit {
- case "struct":
- return p.parse_struct_type()
- case "func":
- p.next()
- return p.parse_signature()
- case "interface":
- return p.parse_interface_type()
- case "map":
- return p.parse_map_type()
- case "chan":
- return p.parse_chan_type()
- default:
- lit := p.lit
- p.next()
- return ast.NewIdent(lit)
- }
- case '@':
- return p.parse_exported_name()
- case '[':
- return p.parse_array_or_slice_type()
- case '*':
- p.next()
- return &ast.StarExpr{X: p.parse_type()}
- case '<':
- return p.parse_chan_type()
- case '(':
- p.next()
- typ := p.parse_type()
- p.expect(')')
- return typ
- }
- p.errorf("unexpected token: %s", scanner.TokenString(p.tok))
- return nil
-}
-
-//-------------------------------------------------------------------------------
-// gc_parser.declarations
-//-------------------------------------------------------------------------------
-
-// ImportDecl = "import" identifier string_lit .
-func (p *gc_parser) parse_import_decl() {
- p.expect_keyword("import")
- alias := p.expect(scanner.Ident)
- path := p.parse_package()
- fullName := "!" + path.Name + "!" + alias
- p.path_to_name[path.Name] = fullName
- p.pfc.add_package_to_scope(fullName, path.Name)
-}
-
-// ConstDecl = "const" ExportedName [ Type ] "=" Literal .
-// Literal = bool_lit | int_lit | float_lit | complex_lit | string_lit .
-// bool_lit = "true" | "false" .
-// complex_lit = "(" float_lit "+" float_lit ")" .
-// rune_lit = "(" int_lit "+" int_lit ")" .
-// string_lit = `"` { unicode_char } `"` .
-func (p *gc_parser) parse_const_decl() (string, *ast.GenDecl) {
- // TODO: do we really need actual const value? gocode doesn't use this
- p.expect_keyword("const")
- name := p.parse_exported_name()
-
- var typ ast.Expr
- if p.tok != '=' {
- typ = p.parse_type()
- }
-
- p.expect('=')
-
- // skip the value
- switch p.tok {
- case scanner.Ident:
- // must be bool, true or false
- p.next()
- case '-', '+', scanner.Int:
- // number
- p.parse_number()
- case '(':
- // complex_lit or rune_lit
- p.next() // skip '('
- if p.tok == scanner.Char {
- p.next()
- } else {
- p.parse_number()
- }
- p.expect('+')
- p.parse_number()
- p.expect(')')
- case scanner.Char:
- p.next()
- case scanner.String:
- p.next()
- default:
- p.error("expected literal")
- }
-
- return name.X.(*ast.Ident).Name, &ast.GenDecl{
- Tok: token.CONST,
- Specs: []ast.Spec{
- &ast.ValueSpec{
- Names: []*ast.Ident{name.Sel},
- Type: typ,
- Values: []ast.Expr{&ast.BasicLit{Kind: token.INT, Value: "0"}},
- },
- },
- }
-}
-
-// TypeDecl = "type" ExportedName Type .
-func (p *gc_parser) parse_type_decl() (string, *ast.GenDecl) {
- p.expect_keyword("type")
- name := p.parse_exported_name()
- typ := p.parse_type()
- return name.X.(*ast.Ident).Name, &ast.GenDecl{
- Tok: token.TYPE,
- Specs: []ast.Spec{
- &ast.TypeSpec{
- Name: name.Sel,
- Type: typ,
- },
- },
- }
-}
-
-// VarDecl = "var" ExportedName Type .
-func (p *gc_parser) parse_var_decl() (string, *ast.GenDecl) {
- p.expect_keyword("var")
- name := p.parse_exported_name()
- typ := p.parse_type()
- return name.X.(*ast.Ident).Name, &ast.GenDecl{
- Tok: token.VAR,
- Specs: []ast.Spec{
- &ast.ValueSpec{
- Names: []*ast.Ident{name.Sel},
- Type: typ,
- },
- },
- }
-}
-
-// FuncBody = "{" ... "}" .
-func (p *gc_parser) parse_func_body() {
- p.expect('{')
- for i := 1; i > 0; p.next() {
- switch p.tok {
- case '{':
- i++
- case '}':
- i--
- }
- }
-}
-
-// FuncDecl = "func" ExportedName Signature [ FuncBody ] .
-func (p *gc_parser) parse_func_decl() (string, *ast.FuncDecl) {
- // "func" was already consumed by lookahead
- name := p.parse_exported_name()
- typ := p.parse_signature()
- if p.tok == '{' {
- p.parse_func_body()
- }
- return name.X.(*ast.Ident).Name, &ast.FuncDecl{
- Name: name.Sel,
- Type: typ,
- }
-}
-
-func strip_method_receiver(recv *ast.FieldList) string {
- var sel *ast.SelectorExpr
-
- // find selector expression
- typ := recv.List[0].Type
- switch t := typ.(type) {
- case *ast.StarExpr:
- sel = t.X.(*ast.SelectorExpr)
- case *ast.SelectorExpr:
- sel = t
- }
-
- // extract package path
- pkg := sel.X.(*ast.Ident).Name
-
- // write back stripped type
- switch t := typ.(type) {
- case *ast.StarExpr:
- t.X = sel.Sel
- case *ast.SelectorExpr:
- recv.List[0].Type = sel.Sel
- }
-
- return pkg
-}
-
-// MethodDecl = "func" Receiver Name Signature .
-// Receiver = "(" ( identifier | "?" ) [ "*" ] ExportedName ")" [ FuncBody ] .
-func (p *gc_parser) parse_method_decl() (string, *ast.FuncDecl) {
- recv := p.parse_parameters()
- pkg := strip_method_receiver(recv)
- name, _ := p.parse_name()
- typ := p.parse_signature()
- if p.tok == '{' {
- p.parse_func_body()
- }
- return pkg, &ast.FuncDecl{
- Recv: recv,
- Name: ast.NewIdent(name),
- Type: typ,
- }
-}
-
-// Decl = [ ImportDecl | ConstDecl | TypeDecl | VarDecl | FuncDecl | MethodDecl ] "\n" .
-func (p *gc_parser) parse_decl() (pkg string, decl ast.Decl) {
- switch p.lit {
- case "import":
- p.parse_import_decl()
- case "const":
- pkg, decl = p.parse_const_decl()
- case "type":
- pkg, decl = p.parse_type_decl()
- case "var":
- pkg, decl = p.parse_var_decl()
- case "func":
- p.next()
- if p.tok == '(' {
- pkg, decl = p.parse_method_decl()
- } else {
- pkg, decl = p.parse_func_decl()
- }
- }
- p.expect('\n')
- return
-}
-
-// Export = PackageClause { Decl } "$$" .
-// PackageClause = "package" identifier [ "safe" ] "\n" .
-func (p *gc_parser) parse_export(callback func(string, ast.Decl)) {
- p.expect_keyword("package")
- p.pfc.defalias = p.expect(scanner.Ident)
- if p.tok != '\n' {
- p.expect_keyword("safe")
- }
- p.expect('\n')
-
- for p.tok != '$' && p.tok != scanner.EOF {
- pkg, decl := p.parse_decl()
- if decl != nil {
- callback(pkg, decl)
- }
- }
-}
diff --git a/vendor/github.com/nsf/gocode/pre_go17.go b/vendor/github.com/nsf/gocode/pre_go17.go
deleted file mode 100644
index 6fca344..0000000
--- a/vendor/github.com/nsf/gocode/pre_go17.go
+++ /dev/null
@@ -1,7 +0,0 @@
-// +build !go1.7,!go1.8
-
-package main
-
-func init() {
- knownPackageIdents["context"] = "golang.org/x/net/context"
-}
diff --git a/vendor/github.com/nsf/gocode/ripper.go b/vendor/github.com/nsf/gocode/ripper.go
deleted file mode 100644
index e1c2f75..0000000
--- a/vendor/github.com/nsf/gocode/ripper.go
+++ /dev/null
@@ -1,141 +0,0 @@
-package main
-
-import (
- "go/scanner"
- "go/token"
-)
-
-// All the code in this file serves single purpose:
-// It separates a function with the cursor inside and the rest of the code. I'm
-// doing that, because sometimes parser is not able to recover itself from an
-// error and the autocompletion results become less complete.
-
-type tok_pos_pair struct {
- tok token.Token
- pos token.Pos
-}
-
-type tok_collection struct {
- tokens []tok_pos_pair
- fset *token.FileSet
-}
-
-func (this *tok_collection) next(s *scanner.Scanner) bool {
- pos, tok, _ := s.Scan()
- if tok == token.EOF {
- return false
- }
-
- this.tokens = append(this.tokens, tok_pos_pair{tok, pos})
- return true
-}
-
-func (this *tok_collection) find_decl_beg(pos int) int {
- lowest := 0
- lowpos := -1
- lowi := -1
- cur := 0
- for i := pos; i >= 0; i-- {
- t := this.tokens[i]
- switch t.tok {
- case token.RBRACE:
- cur++
- case token.LBRACE:
- cur--
- }
-
- if cur < lowest {
- lowest = cur
- lowpos = this.fset.Position(t.pos).Offset
- lowi = i
- }
- }
-
- cur = lowest
- for i := lowi - 1; i >= 0; i-- {
- t := this.tokens[i]
- switch t.tok {
- case token.RBRACE:
- cur++
- case token.LBRACE:
- cur--
- }
- if t.tok == token.SEMICOLON && cur == lowest {
- lowpos = this.fset.Position(t.pos).Offset
- break
- }
- }
-
- return lowpos
-}
-
-func (this *tok_collection) find_decl_end(pos int) int {
- highest := 0
- highpos := -1
- cur := 0
-
- if this.tokens[pos].tok == token.LBRACE {
- pos++
- }
-
- for i := pos; i < len(this.tokens); i++ {
- t := this.tokens[i]
- switch t.tok {
- case token.RBRACE:
- cur++
- case token.LBRACE:
- cur--
- }
-
- if cur > highest {
- highest = cur
- highpos = this.fset.Position(t.pos).Offset
- }
- }
-
- return highpos
-}
-
-func (this *tok_collection) find_outermost_scope(cursor int) (int, int) {
- pos := 0
-
- for i, t := range this.tokens {
- if cursor <= this.fset.Position(t.pos).Offset {
- break
- }
- pos = i
- }
-
- return this.find_decl_beg(pos), this.find_decl_end(pos)
-}
-
-// return new cursor position, file without ripped part and the ripped part itself
-// variants:
-// new-cursor, file-without-ripped-part, ripped-part
-// old-cursor, file, nil
-func (this *tok_collection) rip_off_decl(file []byte, cursor int) (int, []byte, []byte) {
- this.fset = token.NewFileSet()
- var s scanner.Scanner
- s.Init(this.fset.AddFile("", this.fset.Base(), len(file)), file, nil, scanner.ScanComments)
- for this.next(&s) {
- }
-
- beg, end := this.find_outermost_scope(cursor)
- if beg == -1 || end == -1 {
- return cursor, file, nil
- }
-
- ripped := make([]byte, end+1-beg)
- copy(ripped, file[beg:end+1])
-
- newfile := make([]byte, len(file)-len(ripped))
- copy(newfile, file[:beg])
- copy(newfile[beg:], file[end+1:])
-
- return cursor - beg, newfile, ripped
-}
-
-func rip_off_decl(file []byte, cursor int) (int, []byte, []byte) {
- var tc tok_collection
- return tc.rip_off_decl(file, cursor)
-}
diff --git a/vendor/github.com/nsf/gocode/rpc.go b/vendor/github.com/nsf/gocode/rpc.go
deleted file mode 100644
index b1e0ea7..0000000
--- a/vendor/github.com/nsf/gocode/rpc.go
+++ /dev/null
@@ -1,162 +0,0 @@
-// WARNING! Autogenerated by goremote, don't touch.
-
-package main
-
-import (
- "net/rpc"
-)
-
-type RPC struct {
-}
-
-// wrapper for: server_auto_complete
-
-type Args_auto_complete struct {
- Arg0 []byte
- Arg1 string
- Arg2 int
- Arg3 go_build_context
-}
-type Reply_auto_complete struct {
- Arg0 []candidate
- Arg1 int
-}
-
-func (r *RPC) RPC_auto_complete(args *Args_auto_complete, reply *Reply_auto_complete) error {
- reply.Arg0, reply.Arg1 = server_auto_complete(args.Arg0, args.Arg1, args.Arg2, args.Arg3)
- return nil
-}
-func client_auto_complete(cli *rpc.Client, Arg0 []byte, Arg1 string, Arg2 int, Arg3 go_build_context) (c []candidate, d int) {
- var args Args_auto_complete
- var reply Reply_auto_complete
- args.Arg0 = Arg0
- args.Arg1 = Arg1
- args.Arg2 = Arg2
- args.Arg3 = Arg3
- err := cli.Call("RPC.RPC_auto_complete", &args, &reply)
- if err != nil {
- panic(err)
- }
- return reply.Arg0, reply.Arg1
-}
-
-// wrapper for: server_close
-
-type Args_close struct {
- Arg0 int
-}
-type Reply_close struct {
- Arg0 int
-}
-
-func (r *RPC) RPC_close(args *Args_close, reply *Reply_close) error {
- reply.Arg0 = server_close(args.Arg0)
- return nil
-}
-func client_close(cli *rpc.Client, Arg0 int) int {
- var args Args_close
- var reply Reply_close
- args.Arg0 = Arg0
- err := cli.Call("RPC.RPC_close", &args, &reply)
- if err != nil {
- panic(err)
- }
- return reply.Arg0
-}
-
-// wrapper for: server_status
-
-type Args_status struct {
- Arg0 int
-}
-type Reply_status struct {
- Arg0 string
-}
-
-func (r *RPC) RPC_status(args *Args_status, reply *Reply_status) error {
- reply.Arg0 = server_status(args.Arg0)
- return nil
-}
-func client_status(cli *rpc.Client, Arg0 int) string {
- var args Args_status
- var reply Reply_status
- args.Arg0 = Arg0
- err := cli.Call("RPC.RPC_status", &args, &reply)
- if err != nil {
- panic(err)
- }
- return reply.Arg0
-}
-
-// wrapper for: server_drop_cache
-
-type Args_drop_cache struct {
- Arg0 int
-}
-type Reply_drop_cache struct {
- Arg0 int
-}
-
-func (r *RPC) RPC_drop_cache(args *Args_drop_cache, reply *Reply_drop_cache) error {
- reply.Arg0 = server_drop_cache(args.Arg0)
- return nil
-}
-func client_drop_cache(cli *rpc.Client, Arg0 int) int {
- var args Args_drop_cache
- var reply Reply_drop_cache
- args.Arg0 = Arg0
- err := cli.Call("RPC.RPC_drop_cache", &args, &reply)
- if err != nil {
- panic(err)
- }
- return reply.Arg0
-}
-
-// wrapper for: server_set
-
-type Args_set struct {
- Arg0, Arg1 string
-}
-type Reply_set struct {
- Arg0 string
-}
-
-func (r *RPC) RPC_set(args *Args_set, reply *Reply_set) error {
- reply.Arg0 = server_set(args.Arg0, args.Arg1)
- return nil
-}
-func client_set(cli *rpc.Client, Arg0, Arg1 string) string {
- var args Args_set
- var reply Reply_set
- args.Arg0 = Arg0
- args.Arg1 = Arg1
- err := cli.Call("RPC.RPC_set", &args, &reply)
- if err != nil {
- panic(err)
- }
- return reply.Arg0
-}
-
-// wrapper for: server_options
-
-type Args_options struct {
- Arg0 int
-}
-type Reply_options struct {
- Arg0 string
-}
-
-func (r *RPC) RPC_options(args *Args_options, reply *Reply_options) error {
- reply.Arg0 = server_options(args.Arg0)
- return nil
-}
-func client_options(cli *rpc.Client, Arg0 int) string {
- var args Args_options
- var reply Reply_options
- args.Arg0 = Arg0
- err := cli.Call("RPC.RPC_options", &args, &reply)
- if err != nil {
- panic(err)
- }
- return reply.Arg0
-}
diff --git a/vendor/github.com/nsf/gocode/scope.go b/vendor/github.com/nsf/gocode/scope.go
deleted file mode 100644
index 802e296..0000000
--- a/vendor/github.com/nsf/gocode/scope.go
+++ /dev/null
@@ -1,77 +0,0 @@
-package main
-
-//-------------------------------------------------------------------------
-// scope
-//-------------------------------------------------------------------------
-
-type scope struct {
- // the package name that this scope resides in
- pkgname string
- parent *scope // nil for universe scope
- entities map[string]*decl
-}
-
-func new_named_scope(outer *scope, name string) *scope {
- s := new_scope(outer)
- s.pkgname = name
- return s
-}
-
-func new_scope(outer *scope) *scope {
- s := new(scope)
- if outer != nil {
- s.pkgname = outer.pkgname
- }
- s.parent = outer
- s.entities = make(map[string]*decl)
- return s
-}
-
-// returns: new, prev
-func advance_scope(s *scope) (*scope, *scope) {
- if len(s.entities) == 0 {
- return s, s.parent
- }
- return new_scope(s), s
-}
-
-// adds declaration or returns an existing one
-func (s *scope) add_named_decl(d *decl) *decl {
- return s.add_decl(d.name, d)
-}
-
-func (s *scope) add_decl(name string, d *decl) *decl {
- decl, ok := s.entities[name]
- if !ok {
- s.entities[name] = d
- return d
- }
- return decl
-}
-
-func (s *scope) replace_decl(name string, d *decl) {
- s.entities[name] = d
-}
-
-func (s *scope) merge_decl(d *decl) {
- decl, ok := s.entities[d.name]
- if !ok {
- s.entities[d.name] = d
- } else {
- decl := decl.deep_copy()
- decl.expand_or_replace(d)
- s.entities[d.name] = decl
- }
-}
-
-func (s *scope) lookup(name string) *decl {
- decl, ok := s.entities[name]
- if !ok {
- if s.parent != nil {
- return s.parent.lookup(name)
- } else {
- return nil
- }
- }
- return decl
-}
diff --git a/vendor/github.com/nsf/gocode/server.go b/vendor/github.com/nsf/gocode/server.go
deleted file mode 100644
index 82813df..0000000
--- a/vendor/github.com/nsf/gocode/server.go
+++ /dev/null
@@ -1,247 +0,0 @@
-package main
-
-import (
- "bytes"
- "fmt"
- "go/build"
- "log"
- "net"
- "net/rpc"
- "os"
- "path/filepath"
- "reflect"
- "runtime"
- "time"
-)
-
-func do_server() int {
- g_config.read()
- if g_config.ForceDebugOutput != "" {
- // forcefully enable debugging and redirect logging into the
- // specified file
- *g_debug = true
- f, err := os.Create(g_config.ForceDebugOutput)
- if err != nil {
- panic(err)
- }
- log.SetOutput(f)
- }
-
- addr := *g_addr
- if *g_sock == "unix" {
- addr = get_socket_filename()
- if file_exists(addr) {
- log.Printf("unix socket: '%s' already exists\n", addr)
- return 1
- }
- }
- g_daemon = new_daemon(*g_sock, addr)
- if *g_sock == "unix" {
- // cleanup unix socket file
- defer os.Remove(addr)
- }
-
- rpc.Register(new(RPC))
-
- g_daemon.loop()
- return 0
-}
-
-//-------------------------------------------------------------------------
-// daemon
-//-------------------------------------------------------------------------
-
-type daemon struct {
- listener net.Listener
- cmd_in chan int
- autocomplete *auto_complete_context
- pkgcache package_cache
- declcache *decl_cache
- context package_lookup_context
-}
-
-func new_daemon(network, address string) *daemon {
- var err error
-
- d := new(daemon)
- d.listener, err = net.Listen(network, address)
- if err != nil {
- panic(err)
- }
-
- d.cmd_in = make(chan int, 1)
- d.pkgcache = new_package_cache()
- d.declcache = new_decl_cache(&d.context)
- d.autocomplete = new_auto_complete_context(d.pkgcache, d.declcache)
- return d
-}
-
-func (this *daemon) drop_cache() {
- this.pkgcache = new_package_cache()
- this.declcache = new_decl_cache(&this.context)
- this.autocomplete = new_auto_complete_context(this.pkgcache, this.declcache)
-}
-
-const (
- daemon_close = iota
-)
-
-func (this *daemon) loop() {
- conn_in := make(chan net.Conn)
- go func() {
- for {
- c, err := this.listener.Accept()
- if err != nil {
- panic(err)
- }
- conn_in <- c
- }
- }()
-
- timeout := time.Duration(g_config.CloseTimeout) * time.Second
- countdown := time.NewTimer(timeout)
-
- for {
- // handle connections or server CMDs (currently one CMD)
- select {
- case c := <-conn_in:
- rpc.ServeConn(c)
- countdown.Reset(timeout)
- runtime.GC()
- case cmd := <-this.cmd_in:
- switch cmd {
- case daemon_close:
- return
- }
- case <-countdown.C:
- return
- }
- }
-}
-
-func (this *daemon) close() {
- this.cmd_in <- daemon_close
-}
-
-var g_daemon *daemon
-
-//-------------------------------------------------------------------------
-// server_* functions
-//
-// Corresponding client_* functions are autogenerated by goremote.
-//-------------------------------------------------------------------------
-
-func server_auto_complete(file []byte, filename string, cursor int, context_packed go_build_context) (c []candidate, d int) {
- context := unpack_build_context(&context_packed)
- defer func() {
- if err := recover(); err != nil {
- print_backtrace(err)
- c = []candidate{
- {"PANIC", "PANIC", decl_invalid, "panic"},
- }
-
- // drop cache
- g_daemon.drop_cache()
- }
- }()
- // TODO: Probably we don't care about comparing all the fields, checking GOROOT and GOPATH
- // should be enough.
- if !reflect.DeepEqual(g_daemon.context.Context, context.Context) {
- g_daemon.context = context
- g_daemon.drop_cache()
- }
- switch g_config.PackageLookupMode {
- case "bzl":
- // when package lookup mode is bzl, we set GOPATH to "" explicitly and
- // BzlProjectRoot becomes valid (or empty)
- var err error
- g_daemon.context.GOPATH = ""
- g_daemon.context.BzlProjectRoot, err = find_bzl_project_root(g_config.LibPath, filename)
- if *g_debug && err != nil {
- log.Printf("Bzl project root not found: %s", err)
- }
- case "gb":
- // when package lookup mode is gb, we set GOPATH to "" explicitly and
- // GBProjectRoot becomes valid (or empty)
- var err error
- g_daemon.context.GOPATH = ""
- g_daemon.context.GBProjectRoot, err = find_gb_project_root(filename)
- if *g_debug && err != nil {
- log.Printf("Gb project root not found: %s", err)
- }
- case "go":
- // get current package path for GO15VENDOREXPERIMENT hack
- g_daemon.context.CurrentPackagePath = ""
- pkg, err := g_daemon.context.ImportDir(filepath.Dir(filename), build.FindOnly)
- if err == nil {
- if *g_debug {
- log.Printf("Go project path: %s", pkg.ImportPath)
- }
- g_daemon.context.CurrentPackagePath = pkg.ImportPath
- } else if *g_debug {
- log.Printf("Go project path not found: %s", err)
- }
- }
- if *g_debug {
- var buf bytes.Buffer
- log.Printf("Got autocompletion request for '%s'\n", filename)
- log.Printf("Cursor at: %d\n", cursor)
- if cursor > len(file) || cursor < 0 {
- log.Println("ERROR! Cursor is outside of the boundaries of the buffer, " +
- "this is most likely a text editor plugin bug. Text editor is responsible " +
- "for passing the correct cursor position to gocode.")
- } else {
- buf.WriteString("-------------------------------------------------------\n")
- buf.Write(file[:cursor])
- buf.WriteString("#")
- buf.Write(file[cursor:])
- log.Print(buf.String())
- log.Println("-------------------------------------------------------")
- }
- }
- candidates, d := g_daemon.autocomplete.apropos(file, filename, cursor)
- if *g_debug {
- log.Printf("Offset: %d\n", d)
- log.Printf("Number of candidates found: %d\n", len(candidates))
- log.Printf("Candidates are:\n")
- for _, c := range candidates {
- abbr := fmt.Sprintf("%s %s %s", c.Class, c.Name, c.Type)
- if c.Class == decl_func {
- abbr = fmt.Sprintf("%s %s%s", c.Class, c.Name, c.Type[len("func"):])
- }
- log.Printf(" %s\n", abbr)
- }
- log.Println("=======================================================")
- }
- return candidates, d
-}
-
-func server_close(notused int) int {
- g_daemon.close()
- return 0
-}
-
-func server_status(notused int) string {
- return g_daemon.autocomplete.status()
-}
-
-func server_drop_cache(notused int) int {
- // drop cache
- g_daemon.drop_cache()
- return 0
-}
-
-func server_set(key, value string) string {
- if key == "\x00" {
- return g_config.list()
- } else if value == "\x00" {
- return g_config.list_option(key)
- }
- // drop cache on settings changes
- g_daemon.drop_cache()
- return g_config.set_option(key, value)
-}
-
-func server_options(notused int) string {
- return g_config.options()
-}
diff --git a/vendor/github.com/nsf/gocode/type_alias_build_hack_18.go b/vendor/github.com/nsf/gocode/type_alias_build_hack_18.go
deleted file mode 100644
index cb7d1f1..0000000
--- a/vendor/github.com/nsf/gocode/type_alias_build_hack_18.go
+++ /dev/null
@@ -1,18 +0,0 @@
-// +build !go1.9,!go1.8.typealias
-
-package main
-
-import (
- "go/ast"
-)
-
-func typeAliasSpec(name string, typ ast.Expr) *ast.TypeSpec {
- return &ast.TypeSpec{
- Name: ast.NewIdent(name),
- Type: typ,
- }
-}
-
-func isAliasTypeSpec(t *ast.TypeSpec) bool {
- return false
-}
diff --git a/vendor/github.com/nsf/gocode/type_alias_build_hack_19.go b/vendor/github.com/nsf/gocode/type_alias_build_hack_19.go
deleted file mode 100644
index b2b074f..0000000
--- a/vendor/github.com/nsf/gocode/type_alias_build_hack_19.go
+++ /dev/null
@@ -1,19 +0,0 @@
-// +build go1.9 go1.8.typealias
-
-package main
-
-import (
- "go/ast"
-)
-
-func typeAliasSpec(name string, typ ast.Expr) *ast.TypeSpec {
- return &ast.TypeSpec{
- Name: ast.NewIdent(name),
- Assign: 1,
- Type: typ,
- }
-}
-
-func isAliasTypeSpec(t *ast.TypeSpec) bool {
- return t.Assign != 0
-}
diff --git a/vendor/github.com/nsf/gocode/utils.go b/vendor/github.com/nsf/gocode/utils.go
deleted file mode 100644
index 8b153c5..0000000
--- a/vendor/github.com/nsf/gocode/utils.go
+++ /dev/null
@@ -1,296 +0,0 @@
-package main
-
-import (
- "bytes"
- "fmt"
- "go/build"
- "io/ioutil"
- "os"
- "path/filepath"
- "runtime"
- "strings"
- "sync"
- "unicode/utf8"
-)
-
-// our own readdir, which skips the files it cannot lstat
-func readdir_lstat(name string) ([]os.FileInfo, error) {
- f, err := os.Open(name)
- if err != nil {
- return nil, err
- }
- defer f.Close()
-
- names, err := f.Readdirnames(-1)
- if err != nil {
- return nil, err
- }
-
- out := make([]os.FileInfo, 0, len(names))
- for _, lname := range names {
- s, err := os.Lstat(filepath.Join(name, lname))
- if err != nil {
- continue
- }
- out = append(out, s)
- }
- return out, nil
-}
-
-// our other readdir function, only opens and reads
-func readdir(dirname string) []os.FileInfo {
- f, err := os.Open(dirname)
- if err != nil {
- return nil
- }
- fi, err := f.Readdir(-1)
- f.Close()
- if err != nil {
- panic(err)
- }
- return fi
-}
-
-// returns truncated 'data' and amount of bytes skipped (for cursor pos adjustment)
-func filter_out_shebang(data []byte) ([]byte, int) {
- if len(data) > 2 && data[0] == '#' && data[1] == '!' {
- newline := bytes.Index(data, []byte("\n"))
- if newline != -1 && len(data) > newline+1 {
- return data[newline+1:], newline + 1
- }
- }
- return data, 0
-}
-
-func file_exists(filename string) bool {
- _, err := os.Stat(filename)
- if err != nil {
- return false
- }
- return true
-}
-
-func is_dir(path string) bool {
- fi, err := os.Stat(path)
- return err == nil && fi.IsDir()
-}
-
-func char_to_byte_offset(s []byte, offset_c int) (offset_b int) {
- for offset_b = 0; offset_c > 0 && offset_b < len(s); offset_b++ {
- if utf8.RuneStart(s[offset_b]) {
- offset_c--
- }
- }
- return offset_b
-}
-
-func xdg_home_dir() string {
- xdghome := os.Getenv("XDG_CONFIG_HOME")
- if xdghome == "" {
- xdghome = filepath.Join(os.Getenv("HOME"), ".config")
- }
- return xdghome
-}
-
-func has_prefix(s, prefix string, ignorecase bool) bool {
- if ignorecase {
- s = strings.ToLower(s)
- prefix = strings.ToLower(prefix)
- }
- return strings.HasPrefix(s, prefix)
-}
-
-func find_bzl_project_root(libpath, path string) (string, error) {
- if libpath == "" {
- return "", fmt.Errorf("could not find project root, libpath is empty")
- }
-
- pathMap := map[string]struct{}{}
- for _, lp := range strings.Split(libpath, ":") {
- lp := strings.TrimSpace(lp)
- pathMap[filepath.Clean(lp)] = struct{}{}
- }
-
- path = filepath.Dir(path)
- if path == "" {
- return "", fmt.Errorf("project root is blank")
- }
-
- start := path
- for path != "/" {
- if _, ok := pathMap[filepath.Clean(path)]; ok {
- return path, nil
- }
- path = filepath.Dir(path)
- }
- return "", fmt.Errorf("could not find project root in %q or its parents", start)
-}
-
-// Code taken directly from `gb`, I hope author doesn't mind.
-func find_gb_project_root(path string) (string, error) {
- path = filepath.Dir(path)
- if path == "" {
- return "", fmt.Errorf("project root is blank")
- }
- start := path
- for path != "/" {
- root := filepath.Join(path, "src")
- if _, err := os.Stat(root); err != nil {
- if os.IsNotExist(err) {
- path = filepath.Dir(path)
- continue
- }
- return "", err
- }
- path, err := filepath.EvalSymlinks(path)
- if err != nil {
- return "", err
- }
- return path, nil
- }
- return "", fmt.Errorf("could not find project root in %q or its parents", start)
-}
-
-// vendorlessImportPath returns the devendorized version of the provided import path.
-// e.g. "foo/bar/vendor/a/b" => "a/b"
-func vendorlessImportPath(ipath string, currentPackagePath string) (string, bool) {
- split := strings.Split(ipath, "vendor/")
- // no vendor in path
- if len(split) == 1 {
- return ipath, true
- }
- // this import path does not belong to the current package
- if currentPackagePath != "" && !strings.Contains(currentPackagePath, split[0]) {
- return "", false
- }
- // Devendorize for use in import statement.
- if i := strings.LastIndex(ipath, "/vendor/"); i >= 0 {
- return ipath[i+len("/vendor/"):], true
- }
- if strings.HasPrefix(ipath, "vendor/") {
- return ipath[len("vendor/"):], true
- }
- return ipath, true
-}
-
-//-------------------------------------------------------------------------
-// print_backtrace
-//
-// a nicer backtrace printer than the default one
-//-------------------------------------------------------------------------
-
-var g_backtrace_mutex sync.Mutex
-
-func print_backtrace(err interface{}) {
- g_backtrace_mutex.Lock()
- defer g_backtrace_mutex.Unlock()
- fmt.Printf("panic: %v\n", err)
- i := 2
- for {
- pc, file, line, ok := runtime.Caller(i)
- if !ok {
- break
- }
- f := runtime.FuncForPC(pc)
- fmt.Printf("%d(%s): %s:%d\n", i-1, f.Name(), file, line)
- i++
- }
- fmt.Println("")
-}
-
-//-------------------------------------------------------------------------
-// File reader goroutine
-//
-// It's a bad idea to block multiple goroutines on file I/O. Creates many
-// threads which fight for HDD. Therefore only single goroutine should read HDD
-// at the same time.
-//-------------------------------------------------------------------------
-
-type file_read_request struct {
- filename string
- out chan file_read_response
-}
-
-type file_read_response struct {
- data []byte
- error error
-}
-
-type file_reader_type struct {
- in chan file_read_request
-}
-
-func new_file_reader() *file_reader_type {
- this := new(file_reader_type)
- this.in = make(chan file_read_request)
- go func() {
- var rsp file_read_response
- for {
- req := <-this.in
- rsp.data, rsp.error = ioutil.ReadFile(req.filename)
- req.out <- rsp
- }
- }()
- return this
-}
-
-func (this *file_reader_type) read_file(filename string) ([]byte, error) {
- req := file_read_request{
- filename,
- make(chan file_read_response),
- }
- this.in <- req
- rsp := <-req.out
- return rsp.data, rsp.error
-}
-
-var file_reader = new_file_reader()
-
-//-------------------------------------------------------------------------
-// copy of the build.Context without func fields
-//-------------------------------------------------------------------------
-
-type go_build_context struct {
- GOARCH string
- GOOS string
- GOROOT string
- GOPATH string
- CgoEnabled bool
- UseAllFiles bool
- Compiler string
- BuildTags []string
- ReleaseTags []string
- InstallSuffix string
-}
-
-func pack_build_context(ctx *build.Context) go_build_context {
- return go_build_context{
- GOARCH: ctx.GOARCH,
- GOOS: ctx.GOOS,
- GOROOT: ctx.GOROOT,
- GOPATH: ctx.GOPATH,
- CgoEnabled: ctx.CgoEnabled,
- UseAllFiles: ctx.UseAllFiles,
- Compiler: ctx.Compiler,
- BuildTags: ctx.BuildTags,
- ReleaseTags: ctx.ReleaseTags,
- InstallSuffix: ctx.InstallSuffix,
- }
-}
-
-func unpack_build_context(ctx *go_build_context) package_lookup_context {
- return package_lookup_context{
- Context: build.Context{
- GOARCH: ctx.GOARCH,
- GOOS: ctx.GOOS,
- GOROOT: ctx.GOROOT,
- GOPATH: ctx.GOPATH,
- CgoEnabled: ctx.CgoEnabled,
- UseAllFiles: ctx.UseAllFiles,
- Compiler: ctx.Compiler,
- BuildTags: ctx.BuildTags,
- ReleaseTags: ctx.ReleaseTags,
- InstallSuffix: ctx.InstallSuffix,
- },
- }
-}
diff --git a/vendor/github.com/pmezard/go-difflib/LICENSE b/vendor/github.com/pmezard/go-difflib/LICENSE
deleted file mode 100644
index c67dad6..0000000
--- a/vendor/github.com/pmezard/go-difflib/LICENSE
+++ /dev/null
@@ -1,27 +0,0 @@
-Copyright (c) 2013, Patrick Mezard
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are
-met:
-
- Redistributions of source code must retain the above copyright
-notice, this list of conditions and the following disclaimer.
- Redistributions in binary form must reproduce the above copyright
-notice, this list of conditions and the following disclaimer in the
-documentation and/or other materials provided with the distribution.
- The names of its contributors may not be used to endorse or promote
-products derived from this software without specific prior written
-permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
-IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
-TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
-PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
-TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
-PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
-LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
-NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/vendor/github.com/pmezard/go-difflib/difflib/difflib.go b/vendor/github.com/pmezard/go-difflib/difflib/difflib.go
deleted file mode 100644
index 003e99f..0000000
--- a/vendor/github.com/pmezard/go-difflib/difflib/difflib.go
+++ /dev/null
@@ -1,772 +0,0 @@
-// Package difflib is a partial port of Python difflib module.
-//
-// It provides tools to compare sequences of strings and generate textual diffs.
-//
-// The following class and functions have been ported:
-//
-// - SequenceMatcher
-//
-// - unified_diff
-//
-// - context_diff
-//
-// Getting unified diffs was the main goal of the port. Keep in mind this code
-// is mostly suitable to output text differences in a human friendly way, there
-// are no guarantees generated diffs are consumable by patch(1).
-package difflib
-
-import (
- "bufio"
- "bytes"
- "fmt"
- "io"
- "strings"
-)
-
-func min(a, b int) int {
- if a < b {
- return a
- }
- return b
-}
-
-func max(a, b int) int {
- if a > b {
- return a
- }
- return b
-}
-
-func calculateRatio(matches, length int) float64 {
- if length > 0 {
- return 2.0 * float64(matches) / float64(length)
- }
- return 1.0
-}
-
-type Match struct {
- A int
- B int
- Size int
-}
-
-type OpCode struct {
- Tag byte
- I1 int
- I2 int
- J1 int
- J2 int
-}
-
-// SequenceMatcher compares sequence of strings. The basic
-// algorithm predates, and is a little fancier than, an algorithm
-// published in the late 1980's by Ratcliff and Obershelp under the
-// hyperbolic name "gestalt pattern matching". The basic idea is to find
-// the longest contiguous matching subsequence that contains no "junk"
-// elements (R-O doesn't address junk). The same idea is then applied
-// recursively to the pieces of the sequences to the left and to the right
-// of the matching subsequence. This does not yield minimal edit
-// sequences, but does tend to yield matches that "look right" to people.
-//
-// SequenceMatcher tries to compute a "human-friendly diff" between two
-// sequences. Unlike e.g. UNIX(tm) diff, the fundamental notion is the
-// longest *contiguous* & junk-free matching subsequence. That's what
-// catches peoples' eyes. The Windows(tm) windiff has another interesting
-// notion, pairing up elements that appear uniquely in each sequence.
-// That, and the method here, appear to yield more intuitive difference
-// reports than does diff. This method appears to be the least vulnerable
-// to synching up on blocks of "junk lines", though (like blank lines in
-// ordinary text files, or maybe "" lines in HTML files). That may be
-// because this is the only method of the 3 that has a *concept* of
-// "junk" .
-//
-// Timing: Basic R-O is cubic time worst case and quadratic time expected
-// case. SequenceMatcher is quadratic time for the worst case and has
-// expected-case behavior dependent in a complicated way on how many
-// elements the sequences have in common; best case time is linear.
-type SequenceMatcher struct {
- a []string
- b []string
- b2j map[string][]int
- IsJunk func(string) bool
- autoJunk bool
- bJunk map[string]struct{}
- matchingBlocks []Match
- fullBCount map[string]int
- bPopular map[string]struct{}
- opCodes []OpCode
-}
-
-func NewMatcher(a, b []string) *SequenceMatcher {
- m := SequenceMatcher{autoJunk: true}
- m.SetSeqs(a, b)
- return &m
-}
-
-func NewMatcherWithJunk(a, b []string, autoJunk bool,
- isJunk func(string) bool) *SequenceMatcher {
-
- m := SequenceMatcher{IsJunk: isJunk, autoJunk: autoJunk}
- m.SetSeqs(a, b)
- return &m
-}
-
-// Set two sequences to be compared.
-func (m *SequenceMatcher) SetSeqs(a, b []string) {
- m.SetSeq1(a)
- m.SetSeq2(b)
-}
-
-// Set the first sequence to be compared. The second sequence to be compared is
-// not changed.
-//
-// SequenceMatcher computes and caches detailed information about the second
-// sequence, so if you want to compare one sequence S against many sequences,
-// use .SetSeq2(s) once and call .SetSeq1(x) repeatedly for each of the other
-// sequences.
-//
-// See also SetSeqs() and SetSeq2().
-func (m *SequenceMatcher) SetSeq1(a []string) {
- if &a == &m.a {
- return
- }
- m.a = a
- m.matchingBlocks = nil
- m.opCodes = nil
-}
-
-// Set the second sequence to be compared. The first sequence to be compared is
-// not changed.
-func (m *SequenceMatcher) SetSeq2(b []string) {
- if &b == &m.b {
- return
- }
- m.b = b
- m.matchingBlocks = nil
- m.opCodes = nil
- m.fullBCount = nil
- m.chainB()
-}
-
-func (m *SequenceMatcher) chainB() {
- // Populate line -> index mapping
- b2j := map[string][]int{}
- for i, s := range m.b {
- indices := b2j[s]
- indices = append(indices, i)
- b2j[s] = indices
- }
-
- // Purge junk elements
- m.bJunk = map[string]struct{}{}
- if m.IsJunk != nil {
- junk := m.bJunk
- for s, _ := range b2j {
- if m.IsJunk(s) {
- junk[s] = struct{}{}
- }
- }
- for s, _ := range junk {
- delete(b2j, s)
- }
- }
-
- // Purge remaining popular elements
- popular := map[string]struct{}{}
- n := len(m.b)
- if m.autoJunk && n >= 200 {
- ntest := n/100 + 1
- for s, indices := range b2j {
- if len(indices) > ntest {
- popular[s] = struct{}{}
- }
- }
- for s, _ := range popular {
- delete(b2j, s)
- }
- }
- m.bPopular = popular
- m.b2j = b2j
-}
-
-func (m *SequenceMatcher) isBJunk(s string) bool {
- _, ok := m.bJunk[s]
- return ok
-}
-
-// Find longest matching block in a[alo:ahi] and b[blo:bhi].
-//
-// If IsJunk is not defined:
-//
-// Return (i,j,k) such that a[i:i+k] is equal to b[j:j+k], where
-// alo <= i <= i+k <= ahi
-// blo <= j <= j+k <= bhi
-// and for all (i',j',k') meeting those conditions,
-// k >= k'
-// i <= i'
-// and if i == i', j <= j'
-//
-// In other words, of all maximal matching blocks, return one that
-// starts earliest in a, and of all those maximal matching blocks that
-// start earliest in a, return the one that starts earliest in b.
-//
-// If IsJunk is defined, first the longest matching block is
-// determined as above, but with the additional restriction that no
-// junk element appears in the block. Then that block is extended as
-// far as possible by matching (only) junk elements on both sides. So
-// the resulting block never matches on junk except as identical junk
-// happens to be adjacent to an "interesting" match.
-//
-// If no blocks match, return (alo, blo, 0).
-func (m *SequenceMatcher) findLongestMatch(alo, ahi, blo, bhi int) Match {
- // CAUTION: stripping common prefix or suffix would be incorrect.
- // E.g.,
- // ab
- // acab
- // Longest matching block is "ab", but if common prefix is
- // stripped, it's "a" (tied with "b"). UNIX(tm) diff does so
- // strip, so ends up claiming that ab is changed to acab by
- // inserting "ca" in the middle. That's minimal but unintuitive:
- // "it's obvious" that someone inserted "ac" at the front.
- // Windiff ends up at the same place as diff, but by pairing up
- // the unique 'b's and then matching the first two 'a's.
- besti, bestj, bestsize := alo, blo, 0
-
- // find longest junk-free match
- // during an iteration of the loop, j2len[j] = length of longest
- // junk-free match ending with a[i-1] and b[j]
- j2len := map[int]int{}
- for i := alo; i != ahi; i++ {
- // look at all instances of a[i] in b; note that because
- // b2j has no junk keys, the loop is skipped if a[i] is junk
- newj2len := map[int]int{}
- for _, j := range m.b2j[m.a[i]] {
- // a[i] matches b[j]
- if j < blo {
- continue
- }
- if j >= bhi {
- break
- }
- k := j2len[j-1] + 1
- newj2len[j] = k
- if k > bestsize {
- besti, bestj, bestsize = i-k+1, j-k+1, k
- }
- }
- j2len = newj2len
- }
-
- // Extend the best by non-junk elements on each end. In particular,
- // "popular" non-junk elements aren't in b2j, which greatly speeds
- // the inner loop above, but also means "the best" match so far
- // doesn't contain any junk *or* popular non-junk elements.
- for besti > alo && bestj > blo && !m.isBJunk(m.b[bestj-1]) &&
- m.a[besti-1] == m.b[bestj-1] {
- besti, bestj, bestsize = besti-1, bestj-1, bestsize+1
- }
- for besti+bestsize < ahi && bestj+bestsize < bhi &&
- !m.isBJunk(m.b[bestj+bestsize]) &&
- m.a[besti+bestsize] == m.b[bestj+bestsize] {
- bestsize += 1
- }
-
- // Now that we have a wholly interesting match (albeit possibly
- // empty!), we may as well suck up the matching junk on each
- // side of it too. Can't think of a good reason not to, and it
- // saves post-processing the (possibly considerable) expense of
- // figuring out what to do with it. In the case of an empty
- // interesting match, this is clearly the right thing to do,
- // because no other kind of match is possible in the regions.
- for besti > alo && bestj > blo && m.isBJunk(m.b[bestj-1]) &&
- m.a[besti-1] == m.b[bestj-1] {
- besti, bestj, bestsize = besti-1, bestj-1, bestsize+1
- }
- for besti+bestsize < ahi && bestj+bestsize < bhi &&
- m.isBJunk(m.b[bestj+bestsize]) &&
- m.a[besti+bestsize] == m.b[bestj+bestsize] {
- bestsize += 1
- }
-
- return Match{A: besti, B: bestj, Size: bestsize}
-}
-
-// Return list of triples describing matching subsequences.
-//
-// Each triple is of the form (i, j, n), and means that
-// a[i:i+n] == b[j:j+n]. The triples are monotonically increasing in
-// i and in j. It's also guaranteed that if (i, j, n) and (i', j', n') are
-// adjacent triples in the list, and the second is not the last triple in the
-// list, then i+n != i' or j+n != j'. IOW, adjacent triples never describe
-// adjacent equal blocks.
-//
-// The last triple is a dummy, (len(a), len(b), 0), and is the only
-// triple with n==0.
-func (m *SequenceMatcher) GetMatchingBlocks() []Match {
- if m.matchingBlocks != nil {
- return m.matchingBlocks
- }
-
- var matchBlocks func(alo, ahi, blo, bhi int, matched []Match) []Match
- matchBlocks = func(alo, ahi, blo, bhi int, matched []Match) []Match {
- match := m.findLongestMatch(alo, ahi, blo, bhi)
- i, j, k := match.A, match.B, match.Size
- if match.Size > 0 {
- if alo < i && blo < j {
- matched = matchBlocks(alo, i, blo, j, matched)
- }
- matched = append(matched, match)
- if i+k < ahi && j+k < bhi {
- matched = matchBlocks(i+k, ahi, j+k, bhi, matched)
- }
- }
- return matched
- }
- matched := matchBlocks(0, len(m.a), 0, len(m.b), nil)
-
- // It's possible that we have adjacent equal blocks in the
- // matching_blocks list now.
- nonAdjacent := []Match{}
- i1, j1, k1 := 0, 0, 0
- for _, b := range matched {
- // Is this block adjacent to i1, j1, k1?
- i2, j2, k2 := b.A, b.B, b.Size
- if i1+k1 == i2 && j1+k1 == j2 {
- // Yes, so collapse them -- this just increases the length of
- // the first block by the length of the second, and the first
- // block so lengthened remains the block to compare against.
- k1 += k2
- } else {
- // Not adjacent. Remember the first block (k1==0 means it's
- // the dummy we started with), and make the second block the
- // new block to compare against.
- if k1 > 0 {
- nonAdjacent = append(nonAdjacent, Match{i1, j1, k1})
- }
- i1, j1, k1 = i2, j2, k2
- }
- }
- if k1 > 0 {
- nonAdjacent = append(nonAdjacent, Match{i1, j1, k1})
- }
-
- nonAdjacent = append(nonAdjacent, Match{len(m.a), len(m.b), 0})
- m.matchingBlocks = nonAdjacent
- return m.matchingBlocks
-}
-
-// Return list of 5-tuples describing how to turn a into b.
-//
-// Each tuple is of the form (tag, i1, i2, j1, j2). The first tuple
-// has i1 == j1 == 0, and remaining tuples have i1 == the i2 from the
-// tuple preceding it, and likewise for j1 == the previous j2.
-//
-// The tags are characters, with these meanings:
-//
-// 'r' (replace): a[i1:i2] should be replaced by b[j1:j2]
-//
-// 'd' (delete): a[i1:i2] should be deleted, j1==j2 in this case.
-//
-// 'i' (insert): b[j1:j2] should be inserted at a[i1:i1], i1==i2 in this case.
-//
-// 'e' (equal): a[i1:i2] == b[j1:j2]
-func (m *SequenceMatcher) GetOpCodes() []OpCode {
- if m.opCodes != nil {
- return m.opCodes
- }
- i, j := 0, 0
- matching := m.GetMatchingBlocks()
- opCodes := make([]OpCode, 0, len(matching))
- for _, m := range matching {
- // invariant: we've pumped out correct diffs to change
- // a[:i] into b[:j], and the next matching block is
- // a[ai:ai+size] == b[bj:bj+size]. So we need to pump
- // out a diff to change a[i:ai] into b[j:bj], pump out
- // the matching block, and move (i,j) beyond the match
- ai, bj, size := m.A, m.B, m.Size
- tag := byte(0)
- if i < ai && j < bj {
- tag = 'r'
- } else if i < ai {
- tag = 'd'
- } else if j < bj {
- tag = 'i'
- }
- if tag > 0 {
- opCodes = append(opCodes, OpCode{tag, i, ai, j, bj})
- }
- i, j = ai+size, bj+size
- // the list of matching blocks is terminated by a
- // sentinel with size 0
- if size > 0 {
- opCodes = append(opCodes, OpCode{'e', ai, i, bj, j})
- }
- }
- m.opCodes = opCodes
- return m.opCodes
-}
-
-// Isolate change clusters by eliminating ranges with no changes.
-//
-// Return a generator of groups with up to n lines of context.
-// Each group is in the same format as returned by GetOpCodes().
-func (m *SequenceMatcher) GetGroupedOpCodes(n int) [][]OpCode {
- if n < 0 {
- n = 3
- }
- codes := m.GetOpCodes()
- if len(codes) == 0 {
- codes = []OpCode{OpCode{'e', 0, 1, 0, 1}}
- }
- // Fixup leading and trailing groups if they show no changes.
- if codes[0].Tag == 'e' {
- c := codes[0]
- i1, i2, j1, j2 := c.I1, c.I2, c.J1, c.J2
- codes[0] = OpCode{c.Tag, max(i1, i2-n), i2, max(j1, j2-n), j2}
- }
- if codes[len(codes)-1].Tag == 'e' {
- c := codes[len(codes)-1]
- i1, i2, j1, j2 := c.I1, c.I2, c.J1, c.J2
- codes[len(codes)-1] = OpCode{c.Tag, i1, min(i2, i1+n), j1, min(j2, j1+n)}
- }
- nn := n + n
- groups := [][]OpCode{}
- group := []OpCode{}
- for _, c := range codes {
- i1, i2, j1, j2 := c.I1, c.I2, c.J1, c.J2
- // End the current group and start a new one whenever
- // there is a large range with no changes.
- if c.Tag == 'e' && i2-i1 > nn {
- group = append(group, OpCode{c.Tag, i1, min(i2, i1+n),
- j1, min(j2, j1+n)})
- groups = append(groups, group)
- group = []OpCode{}
- i1, j1 = max(i1, i2-n), max(j1, j2-n)
- }
- group = append(group, OpCode{c.Tag, i1, i2, j1, j2})
- }
- if len(group) > 0 && !(len(group) == 1 && group[0].Tag == 'e') {
- groups = append(groups, group)
- }
- return groups
-}
-
-// Return a measure of the sequences' similarity (float in [0,1]).
-//
-// Where T is the total number of elements in both sequences, and
-// M is the number of matches, this is 2.0*M / T.
-// Note that this is 1 if the sequences are identical, and 0 if
-// they have nothing in common.
-//
-// .Ratio() is expensive to compute if you haven't already computed
-// .GetMatchingBlocks() or .GetOpCodes(), in which case you may
-// want to try .QuickRatio() or .RealQuickRation() first to get an
-// upper bound.
-func (m *SequenceMatcher) Ratio() float64 {
- matches := 0
- for _, m := range m.GetMatchingBlocks() {
- matches += m.Size
- }
- return calculateRatio(matches, len(m.a)+len(m.b))
-}
-
-// Return an upper bound on ratio() relatively quickly.
-//
-// This isn't defined beyond that it is an upper bound on .Ratio(), and
-// is faster to compute.
-func (m *SequenceMatcher) QuickRatio() float64 {
- // viewing a and b as multisets, set matches to the cardinality
- // of their intersection; this counts the number of matches
- // without regard to order, so is clearly an upper bound
- if m.fullBCount == nil {
- m.fullBCount = map[string]int{}
- for _, s := range m.b {
- m.fullBCount[s] = m.fullBCount[s] + 1
- }
- }
-
- // avail[x] is the number of times x appears in 'b' less the
- // number of times we've seen it in 'a' so far ... kinda
- avail := map[string]int{}
- matches := 0
- for _, s := range m.a {
- n, ok := avail[s]
- if !ok {
- n = m.fullBCount[s]
- }
- avail[s] = n - 1
- if n > 0 {
- matches += 1
- }
- }
- return calculateRatio(matches, len(m.a)+len(m.b))
-}
-
-// Return an upper bound on ratio() very quickly.
-//
-// This isn't defined beyond that it is an upper bound on .Ratio(), and
-// is faster to compute than either .Ratio() or .QuickRatio().
-func (m *SequenceMatcher) RealQuickRatio() float64 {
- la, lb := len(m.a), len(m.b)
- return calculateRatio(min(la, lb), la+lb)
-}
-
-// Convert range to the "ed" format
-func formatRangeUnified(start, stop int) string {
- // Per the diff spec at http://www.unix.org/single_unix_specification/
- beginning := start + 1 // lines start numbering with one
- length := stop - start
- if length == 1 {
- return fmt.Sprintf("%d", beginning)
- }
- if length == 0 {
- beginning -= 1 // empty ranges begin at line just before the range
- }
- return fmt.Sprintf("%d,%d", beginning, length)
-}
-
-// Unified diff parameters
-type UnifiedDiff struct {
- A []string // First sequence lines
- FromFile string // First file name
- FromDate string // First file time
- B []string // Second sequence lines
- ToFile string // Second file name
- ToDate string // Second file time
- Eol string // Headers end of line, defaults to LF
- Context int // Number of context lines
-}
-
-// Compare two sequences of lines; generate the delta as a unified diff.
-//
-// Unified diffs are a compact way of showing line changes and a few
-// lines of context. The number of context lines is set by 'n' which
-// defaults to three.
-//
-// By default, the diff control lines (those with ---, +++, or @@) are
-// created with a trailing newline. This is helpful so that inputs
-// created from file.readlines() result in diffs that are suitable for
-// file.writelines() since both the inputs and outputs have trailing
-// newlines.
-//
-// For inputs that do not have trailing newlines, set the lineterm
-// argument to "" so that the output will be uniformly newline free.
-//
-// The unidiff format normally has a header for filenames and modification
-// times. Any or all of these may be specified using strings for
-// 'fromfile', 'tofile', 'fromfiledate', and 'tofiledate'.
-// The modification times are normally expressed in the ISO 8601 format.
-func WriteUnifiedDiff(writer io.Writer, diff UnifiedDiff) error {
- buf := bufio.NewWriter(writer)
- defer buf.Flush()
- wf := func(format string, args ...interface{}) error {
- _, err := buf.WriteString(fmt.Sprintf(format, args...))
- return err
- }
- ws := func(s string) error {
- _, err := buf.WriteString(s)
- return err
- }
-
- if len(diff.Eol) == 0 {
- diff.Eol = "\n"
- }
-
- started := false
- m := NewMatcher(diff.A, diff.B)
- for _, g := range m.GetGroupedOpCodes(diff.Context) {
- if !started {
- started = true
- fromDate := ""
- if len(diff.FromDate) > 0 {
- fromDate = "\t" + diff.FromDate
- }
- toDate := ""
- if len(diff.ToDate) > 0 {
- toDate = "\t" + diff.ToDate
- }
- if diff.FromFile != "" || diff.ToFile != "" {
- err := wf("--- %s%s%s", diff.FromFile, fromDate, diff.Eol)
- if err != nil {
- return err
- }
- err = wf("+++ %s%s%s", diff.ToFile, toDate, diff.Eol)
- if err != nil {
- return err
- }
- }
- }
- first, last := g[0], g[len(g)-1]
- range1 := formatRangeUnified(first.I1, last.I2)
- range2 := formatRangeUnified(first.J1, last.J2)
- if err := wf("@@ -%s +%s @@%s", range1, range2, diff.Eol); err != nil {
- return err
- }
- for _, c := range g {
- i1, i2, j1, j2 := c.I1, c.I2, c.J1, c.J2
- if c.Tag == 'e' {
- for _, line := range diff.A[i1:i2] {
- if err := ws(" " + line); err != nil {
- return err
- }
- }
- continue
- }
- if c.Tag == 'r' || c.Tag == 'd' {
- for _, line := range diff.A[i1:i2] {
- if err := ws("-" + line); err != nil {
- return err
- }
- }
- }
- if c.Tag == 'r' || c.Tag == 'i' {
- for _, line := range diff.B[j1:j2] {
- if err := ws("+" + line); err != nil {
- return err
- }
- }
- }
- }
- }
- return nil
-}
-
-// Like WriteUnifiedDiff but returns the diff a string.
-func GetUnifiedDiffString(diff UnifiedDiff) (string, error) {
- w := &bytes.Buffer{}
- err := WriteUnifiedDiff(w, diff)
- return string(w.Bytes()), err
-}
-
-// Convert range to the "ed" format.
-func formatRangeContext(start, stop int) string {
- // Per the diff spec at http://www.unix.org/single_unix_specification/
- beginning := start + 1 // lines start numbering with one
- length := stop - start
- if length == 0 {
- beginning -= 1 // empty ranges begin at line just before the range
- }
- if length <= 1 {
- return fmt.Sprintf("%d", beginning)
- }
- return fmt.Sprintf("%d,%d", beginning, beginning+length-1)
-}
-
-type ContextDiff UnifiedDiff
-
-// Compare two sequences of lines; generate the delta as a context diff.
-//
-// Context diffs are a compact way of showing line changes and a few
-// lines of context. The number of context lines is set by diff.Context
-// which defaults to three.
-//
-// By default, the diff control lines (those with *** or ---) are
-// created with a trailing newline.
-//
-// For inputs that do not have trailing newlines, set the diff.Eol
-// argument to "" so that the output will be uniformly newline free.
-//
-// The context diff format normally has a header for filenames and
-// modification times. Any or all of these may be specified using
-// strings for diff.FromFile, diff.ToFile, diff.FromDate, diff.ToDate.
-// The modification times are normally expressed in the ISO 8601 format.
-// If not specified, the strings default to blanks.
-func WriteContextDiff(writer io.Writer, diff ContextDiff) error {
- buf := bufio.NewWriter(writer)
- defer buf.Flush()
- var diffErr error
- wf := func(format string, args ...interface{}) {
- _, err := buf.WriteString(fmt.Sprintf(format, args...))
- if diffErr == nil && err != nil {
- diffErr = err
- }
- }
- ws := func(s string) {
- _, err := buf.WriteString(s)
- if diffErr == nil && err != nil {
- diffErr = err
- }
- }
-
- if len(diff.Eol) == 0 {
- diff.Eol = "\n"
- }
-
- prefix := map[byte]string{
- 'i': "+ ",
- 'd': "- ",
- 'r': "! ",
- 'e': " ",
- }
-
- started := false
- m := NewMatcher(diff.A, diff.B)
- for _, g := range m.GetGroupedOpCodes(diff.Context) {
- if !started {
- started = true
- fromDate := ""
- if len(diff.FromDate) > 0 {
- fromDate = "\t" + diff.FromDate
- }
- toDate := ""
- if len(diff.ToDate) > 0 {
- toDate = "\t" + diff.ToDate
- }
- if diff.FromFile != "" || diff.ToFile != "" {
- wf("*** %s%s%s", diff.FromFile, fromDate, diff.Eol)
- wf("--- %s%s%s", diff.ToFile, toDate, diff.Eol)
- }
- }
-
- first, last := g[0], g[len(g)-1]
- ws("***************" + diff.Eol)
-
- range1 := formatRangeContext(first.I1, last.I2)
- wf("*** %s ****%s", range1, diff.Eol)
- for _, c := range g {
- if c.Tag == 'r' || c.Tag == 'd' {
- for _, cc := range g {
- if cc.Tag == 'i' {
- continue
- }
- for _, line := range diff.A[cc.I1:cc.I2] {
- ws(prefix[cc.Tag] + line)
- }
- }
- break
- }
- }
-
- range2 := formatRangeContext(first.J1, last.J2)
- wf("--- %s ----%s", range2, diff.Eol)
- for _, c := range g {
- if c.Tag == 'r' || c.Tag == 'i' {
- for _, cc := range g {
- if cc.Tag == 'd' {
- continue
- }
- for _, line := range diff.B[cc.J1:cc.J2] {
- ws(prefix[cc.Tag] + line)
- }
- }
- break
- }
- }
- }
- return diffErr
-}
-
-// Like WriteContextDiff but returns the diff a string.
-func GetContextDiffString(diff ContextDiff) (string, error) {
- w := &bytes.Buffer{}
- err := WriteContextDiff(w, diff)
- return string(w.Bytes()), err
-}
-
-// Split a string on "\n" while preserving them. The output can be used
-// as input for UnifiedDiff and ContextDiff structures.
-func SplitLines(s string) []string {
- lines := strings.SplitAfter(s, "\n")
- lines[len(lines)-1] += "\n"
- return lines
-}
diff --git a/vendor/github.com/visualfc/gotools/LICENSE b/vendor/github.com/visualfc/gotools/LICENSE
deleted file mode 100644
index ca2493d..0000000
--- a/vendor/github.com/visualfc/gotools/LICENSE
+++ /dev/null
@@ -1,28 +0,0 @@
-Copyright (c) 2011-2017, visualfc
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-
-* Redistributions of source code must retain the above copyright notice, this
- list of conditions and the following disclaimer.
-
-* Redistributions in binary form must reproduce the above copyright notice,
- this list of conditions and the following disclaimer in the documentation
- and/or other materials provided with the distribution.
-
-* Neither the name of gotools nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
-FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
-SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
-OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
diff --git a/vendor/github.com/visualfc/gotools/README.md b/vendor/github.com/visualfc/gotools/README.md
deleted file mode 100644
index 7ad5359..0000000
--- a/vendor/github.com/visualfc/gotools/README.md
+++ /dev/null
@@ -1,28 +0,0 @@
-LiteIDE Golang Tools
-=========
-
-### LiteIDE
-
-_LiteIDE is a simple, open source, cross-platform Go IDE._
-
-### GoTools
-_GoTools is a golang tools support for LiteIDE._
-
-### Website
-* LiteIDE Source code
-
-* Gotools Source code
-
-* Binary downloads
-
-* Google group
-
-* How to Install
-
-* FAQ
-
-* Changes
-
-
-### Donate
-*
diff --git a/vendor/github.com/visualfc/gotools/astview/astdoc.go b/vendor/github.com/visualfc/gotools/astview/astdoc.go
deleted file mode 100644
index a03bd5c..0000000
--- a/vendor/github.com/visualfc/gotools/astview/astdoc.go
+++ /dev/null
@@ -1,700 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Package doc extracts source code documentation from a Go AST.
-package astview
-
-import (
- "fmt"
- "go/ast"
- "go/token"
- "regexp"
- "sort"
- "strconv"
- "strings"
-)
-
-// ----------------------------------------------------------------------------
-
-type typeDoc struct {
- // len(decl.Specs) == 1, and the element type is *ast.TypeSpec
- // if the type declaration hasn't been seen yet, decl is nil
- decl *ast.GenDecl
- // values, factory functions, and methods associated with the type
- values []*ast.GenDecl // consts and vars
- factories map[string]*ast.FuncDecl
- methods map[string]*ast.FuncDecl
-}
-
-// docReader accumulates documentation for a single package.
-// It modifies the AST: Comments (declaration documentation)
-// that have been collected by the DocReader are set to nil
-// in the respective AST nodes so that they are not printed
-// twice (once when printing the documentation and once when
-// printing the corresponding AST node).
-//
-type docReader struct {
- doc *ast.CommentGroup // package documentation, if any
- pkgName string
- showAll bool
- values []*ast.GenDecl // consts and vars
- types map[string]*typeDoc
- funcs map[string]*ast.FuncDecl
- imports map[string]int
- bugs []*ast.CommentGroup
- todos []*TodoDoc
-}
-
-func (doc *docReader) init(pkgName string, showAll bool) {
- doc.pkgName = pkgName
- doc.showAll = showAll
- doc.imports = make(map[string]int)
- doc.types = make(map[string]*typeDoc)
- doc.funcs = make(map[string]*ast.FuncDecl)
-}
-
-func (doc *docReader) addDoc(comments *ast.CommentGroup) {
- if doc.doc == nil {
- // common case: just one package comment
- doc.doc = comments
- return
- }
-
- // More than one package comment: Usually there will be only
- // one file with a package comment, but it's better to collect
- // all comments than drop them on the floor.
- // (This code isn't particularly clever - no amortized doubling is
- // used - but this situation occurs rarely and is not time-critical.)
- n1 := len(doc.doc.List)
- n2 := len(comments.List)
- list := make([]*ast.Comment, n1+1+n2) // + 1 for separator line
- copy(list, doc.doc.List)
- list[n1] = &ast.Comment{token.NoPos, "//"} // separator line
- copy(list[n1+1:], comments.List)
- doc.doc = &ast.CommentGroup{list}
-}
-
-func (doc *docReader) addType(decl *ast.GenDecl) {
- spec := decl.Specs[0].(*ast.TypeSpec)
- typ := doc.lookupTypeDoc(spec.Name.Name)
- // typ should always be != nil since declared types
- // are always named - be conservative and check
- if typ != nil {
- // a type should be added at most once, so typ.decl
- // should be nil - if it isn't, simply overwrite it
- typ.decl = decl
- }
-}
-
-func (doc *docReader) lookupTypeDoc(name string) *typeDoc {
- if name == "" {
- return nil // no type docs for anonymous types
- }
- if tdoc, found := doc.types[name]; found {
- return tdoc
- }
- // type wasn't found - add one without declaration
- tdoc := &typeDoc{nil, nil, make(map[string]*ast.FuncDecl), make(map[string]*ast.FuncDecl)}
- doc.types[name] = tdoc
- return tdoc
-}
-
-func docBaseTypeName(typ ast.Expr, showAll bool) string {
- switch t := typ.(type) {
- case *ast.Ident:
- // if the type is not exported, the effect to
- // a client is as if there were no type name
- if showAll || t.IsExported() {
- return t.Name
- }
- case *ast.StarExpr:
- return docBaseTypeName(t.X, showAll)
- }
- return ""
-}
-
-func (doc *docReader) addValue(decl *ast.GenDecl) {
- // determine if decl should be associated with a type
- // Heuristic: For each typed entry, determine the type name, if any.
- // If there is exactly one type name that is sufficiently
- // frequent, associate the decl with the respective type.
- domName := ""
- domFreq := 0
- prev := ""
- for _, s := range decl.Specs {
- if v, ok := s.(*ast.ValueSpec); ok {
- name := ""
- switch {
- case v.Type != nil:
- // a type is present; determine its name
- name = docBaseTypeName(v.Type, doc.showAll)
- case decl.Tok == token.CONST:
- // no type is present but we have a constant declaration;
- // use the previous type name (w/o more type information
- // we cannot handle the case of unnamed variables with
- // initializer expressions except for some trivial cases)
- name = prev
- }
- if name != "" {
- // entry has a named type
- if domName != "" && domName != name {
- // more than one type name - do not associate
- // with any type
- domName = ""
- break
- }
- domName = name
- domFreq++
- }
- prev = name
- }
- }
-
- // determine values list
- const threshold = 0.75
- values := &doc.values
- if domName != "" && domFreq >= int(float64(len(decl.Specs))*threshold) {
- // typed entries are sufficiently frequent
- typ := doc.lookupTypeDoc(domName)
- if typ != nil {
- values = &typ.values // associate with that type
- }
- }
-
- *values = append(*values, decl)
-}
-
-// Helper function to set the table entry for function f. Makes sure that
-// at least one f with associated documentation is stored in table, if there
-// are multiple f's with the same name.
-func setFunc(table map[string]*ast.FuncDecl, f *ast.FuncDecl) {
- name := f.Name.Name
- if g, exists := table[name]; exists && g.Doc != nil {
- // a function with the same name has already been registered;
- // since it has documentation, assume f is simply another
- // implementation and ignore it
- // TODO(gri) consider collecting all functions, or at least
- // all comments
- return
- }
- // function doesn't exist or has no documentation; use f
- table[name] = f
-}
-
-func (doc *docReader) addFunc(fun *ast.FuncDecl) {
- name := fun.Name.Name
-
- // determine if it should be associated with a type
- if fun.Recv != nil {
- // method
- typ := doc.lookupTypeDoc(docBaseTypeName(fun.Recv.List[0].Type, doc.showAll))
- if typ != nil {
- // exported receiver type
- setFunc(typ.methods, fun)
- }
- // otherwise don't show the method
- // TODO(gri): There may be exported methods of non-exported types
- // that can be called because of exported values (consts, vars, or
- // function results) of that type. Could determine if that is the
- // case and then show those methods in an appropriate section.
- return
- }
-
- // perhaps a factory function
- // determine result type, if any
- if fun.Type.Results.NumFields() >= 1 {
- res := fun.Type.Results.List[0]
- if len(res.Names) <= 1 {
- // exactly one (named or anonymous) result associated
- // with the first type in result signature (there may
- // be more than one result)
- tname := docBaseTypeName(res.Type, doc.showAll)
- typ := doc.lookupTypeDoc(tname)
- if typ != nil {
- // named and exported result type
-
- // Work-around for failure of heuristic: In package os
- // too many functions are considered factory functions
- // for the Error type. Eliminate manually for now as
- // this appears to be the only important case in the
- // current library where the heuristic fails.
- if doc.pkgName == "os" && tname == "Error" &&
- name != "NewError" && name != "NewSyscallError" {
- // not a factory function for os.Error
- setFunc(doc.funcs, fun) // treat as ordinary function
- return
- }
-
- setFunc(typ.factories, fun)
- return
- }
- }
- }
-
- // ordinary function
- setFunc(doc.funcs, fun)
-}
-
-func (doc *docReader) addDecl(decl ast.Decl) {
- switch d := decl.(type) {
- case *ast.GenDecl:
- if len(d.Specs) > 0 {
- switch d.Tok {
- case token.IMPORT:
- // imports are handled individually
- for _, spec := range d.Specs {
- if s, ok := spec.(*ast.ImportSpec); ok {
- if import_, err := strconv.Unquote(s.Path.Value); err == nil {
- doc.imports[import_] = 1
- }
- }
- }
- case token.CONST, token.VAR:
- // constants and variables are always handled as a group
- doc.addValue(d)
- case token.TYPE:
- // types are handled individually
- for _, spec := range d.Specs {
- // make a (fake) GenDecl node for this TypeSpec
- // (we need to do this here - as opposed to just
- // for printing - so we don't lose the GenDecl
- // documentation)
- //
- // TODO(gri): Consider just collecting the TypeSpec
- // node (and copy in the GenDecl.doc if there is no
- // doc in the TypeSpec - this is currently done in
- // makeTypeDocs below). Simpler data structures, but
- // would lose GenDecl documentation if the TypeSpec
- // has documentation as well.
- doc.addType(&ast.GenDecl{d.Doc, d.Pos(), token.TYPE, token.NoPos, []ast.Spec{spec}, token.NoPos})
- // A new GenDecl node is created, no need to nil out d.Doc.
- }
- }
- }
- case *ast.FuncDecl:
- doc.addFunc(d)
- }
-}
-
-func copyCommentList(list []*ast.Comment) []*ast.Comment {
- return append([]*ast.Comment(nil), list...)
-}
-
-var (
- todoList = "TODO,BUG,FIXME,NOTE,SECBUG"
- bug_markers = regexp.MustCompile("^/[/*][ \t]*BUG\\(.*\\):[ \t]*") // BUG(uid):
- bug_content = regexp.MustCompile("[^ \n\r\t]+") // at least one non-whitespace char
- todo_markers = regexp.MustCompile(fmt.Sprintf("^/[/*][ \t]*(%s)[\\s\\:\\(\\,].*$", strings.Replace(todoList, ",", "|", -1)))
-)
-
-// addFile adds the AST for a source file to the docReader.
-// Adding the same AST multiple times is a no-op.
-//
-func (doc *docReader) addFile(src *ast.File) {
- // add package documentation
- if src.Doc != nil {
- doc.addDoc(src.Doc)
- src.Doc = nil // doc consumed - remove from ast.File node
- }
-
- // add all declarations
- for _, decl := range src.Decls {
- doc.addDecl(decl)
- }
- // collect BUG(...) comments
- for _, c := range src.Comments {
- text := c.List[0].Text
- if m := todo_markers.FindStringSubmatchIndex(text); m != nil {
- doc.todos = append(doc.todos, &TodoDoc{text[m[2]:m[3]], text[m[2]:], c})
- }
- // if m := bug_markers.FindStringIndex(text); m != nil {
- // // found a BUG comment; maybe empty
- // if btxt := text[m[1]:]; bug_content.MatchString(btxt) {
- // // non-empty BUG comment; collect comment without BUG prefix
- // list := copyCommentList(c.List)
- // list[0].Text = text[m[1]:]
- // doc.bugs = append(doc.bugs, &ast.CommentGroup{list})
- // }
- // }
- }
- src.Comments = nil // consumed unassociated comments - remove from ast.File node
-}
-
-func NewFileDoc(file *ast.File, showAll bool) *PackageDoc {
- var r docReader
- r.init(file.Name.Name, showAll)
- r.addFile(file)
- return r.newDoc("", nil)
-}
-
-func NewPackageDoc(pkg *ast.Package, importpath string, showAll bool) *PackageDoc {
- var r docReader
- r.init(pkg.Name, showAll)
- filenames := make([]string, len(pkg.Files))
- i := 0
- for filename, f := range pkg.Files {
- r.addFile(f)
- filenames[i] = filename
- i++
- }
- return r.newDoc(importpath, filenames)
-}
-
-// ----------------------------------------------------------------------------
-// Conversion to external representation
-
-// ValueDoc is the documentation for a group of declared
-// values, either vars or consts.
-//
-type ValueDoc struct {
- Doc string
- Decl *ast.GenDecl
- order int
-}
-
-type sortValueDoc []*ValueDoc
-
-func (p sortValueDoc) Len() int { return len(p) }
-func (p sortValueDoc) Swap(i, j int) { p[i], p[j] = p[j], p[i] }
-
-func declName(d *ast.GenDecl) string {
- if len(d.Specs) != 1 {
- return ""
- }
-
- switch v := d.Specs[0].(type) {
- case *ast.ValueSpec:
- return v.Names[0].Name
- case *ast.TypeSpec:
- return v.Name.Name
- }
-
- return ""
-}
-
-func (p sortValueDoc) Less(i, j int) bool {
- // sort by name
- // pull blocks (name = "") up to top
- // in original order
- if ni, nj := declName(p[i].Decl), declName(p[j].Decl); ni != nj {
- return ni < nj
- }
- return p[i].order < p[j].order
-}
-
-func makeValueDocs(list []*ast.GenDecl, tok token.Token) []*ValueDoc {
- d := make([]*ValueDoc, len(list)) // big enough in any case
- n := 0
- for i, decl := range list {
- if decl.Tok == tok {
- d[n] = &ValueDoc{decl.Doc.Text(), decl, i}
- n++
- decl.Doc = nil // doc consumed - removed from AST
- }
- }
- d = d[0:n]
- sort.Sort(sortValueDoc(d))
- return d
-}
-
-// FuncDoc is the documentation for a func declaration,
-// either a top-level function or a method function.
-//
-type FuncDoc struct {
- Doc string
- Recv ast.Expr // TODO(rsc): Would like string here
- Name string
- Decl *ast.FuncDecl
-}
-
-type sortFuncDoc []*FuncDoc
-
-func (p sortFuncDoc) Len() int { return len(p) }
-func (p sortFuncDoc) Swap(i, j int) { p[i], p[j] = p[j], p[i] }
-func (p sortFuncDoc) Less(i, j int) bool { return p[i].Name < p[j].Name }
-
-func makeFuncDocs(m map[string]*ast.FuncDecl) []*FuncDoc {
- d := make([]*FuncDoc, len(m))
- i := 0
- for _, f := range m {
- doc := new(FuncDoc)
- doc.Doc = f.Doc.Text()
- f.Doc = nil // doc consumed - remove from ast.FuncDecl node
- if f.Recv != nil {
- doc.Recv = f.Recv.List[0].Type
- }
- doc.Name = f.Name.Name
- doc.Decl = f
- d[i] = doc
- i++
- }
- sort.Sort(sortFuncDoc(d))
- return d
-}
-
-// TypeDoc is the documentation for a declared type.
-// Consts and Vars are sorted lists of constants and variables of (mostly) that type.
-// Factories is a sorted list of factory functions that return that type.
-// Methods is a sorted list of method functions on that type.
-type TypeDoc struct {
- Doc string
- Type *ast.TypeSpec
- Consts []*ValueDoc
- Vars []*ValueDoc
- Funcs []*FuncDoc
- Methods []*FuncDoc
- Decl *ast.GenDecl
- order int
-}
-
-type sortTypeDoc []*TypeDoc
-
-func (p sortTypeDoc) Len() int { return len(p) }
-func (p sortTypeDoc) Swap(i, j int) { p[i], p[j] = p[j], p[i] }
-func (p sortTypeDoc) Less(i, j int) bool {
- // sort by name
- // pull blocks (name = "") up to top
- // in original order
- if ni, nj := p[i].Type.Name.Name, p[j].Type.Name.Name; ni != nj {
- return ni < nj
- }
- return p[i].order < p[j].order
-}
-
-// NOTE(rsc): This would appear not to be correct for type ( )
-// blocks, but the doc extractor above has split them into
-// individual declarations.
-func (doc *docReader) makeTypeDocs(m map[string]*typeDoc) []*TypeDoc {
- d := make([]*TypeDoc, len(m))
- i := 0
- for _, old := range m {
- // all typeDocs should have a declaration associated with
- // them after processing an entire package - be conservative
- // and check
- if decl := old.decl; decl != nil {
- typespec := decl.Specs[0].(*ast.TypeSpec)
- t := new(TypeDoc)
- doc := typespec.Doc
- typespec.Doc = nil // doc consumed - remove from ast.TypeSpec node
- if doc == nil {
- // no doc associated with the spec, use the declaration doc, if any
- doc = decl.Doc
- }
- decl.Doc = nil // doc consumed - remove from ast.Decl node
- t.Doc = doc.Text()
- t.Type = typespec
- t.Consts = makeValueDocs(old.values, token.CONST)
- t.Vars = makeValueDocs(old.values, token.VAR)
- t.Funcs = makeFuncDocs(old.factories)
- t.Methods = makeFuncDocs(old.methods)
- t.Decl = old.decl
- t.order = i
- d[i] = t
- i++
- } else {
- // no corresponding type declaration found - move any associated
- // values, factory functions, and methods back to the top-level
- // so that they are not lost (this should only happen if a package
- // file containing the explicit type declaration is missing or if
- // an unqualified type name was used after a "." import)
- // 1) move values
- doc.values = append(doc.values, old.values...)
- // 2) move factory functions
- for name, f := range old.factories {
- doc.funcs[name] = f
- }
- // 3) move methods
- for name, f := range old.methods {
- // don't overwrite functions with the same name
- if _, found := doc.funcs[name]; !found {
- doc.funcs[name] = f
- }
- }
- }
- }
- d = d[0:i] // some types may have been ignored
- sort.Sort(sortTypeDoc(d))
- return d
-}
-
-func makeBugDocs(list []*ast.CommentGroup) []string {
- d := make([]string, len(list))
- for i, g := range list {
- d[i] = g.Text()
- }
- return d
-}
-
-type TodoDoc struct {
- Tag string
- Text string
- Comments *ast.CommentGroup
-}
-
-// PackageDoc is the documentation for an entire package.
-//
-type PackageDoc struct {
- PackageName string
- ImportPath string
- Imports []string
- Filenames []string
- Doc string
- Consts []*ValueDoc
- Types []*TypeDoc
- Vars []*ValueDoc
- Funcs []*FuncDoc
- Factorys []*FuncDoc
- Todos []*TodoDoc
- Bugs []string
-}
-
-// newDoc returns the accumulated documentation for the package.
-//
-func (doc *docReader) newDoc(importpath string, filenames []string) *PackageDoc {
- p := new(PackageDoc)
- p.PackageName = doc.pkgName
- p.ImportPath = importpath
- sort.Strings(filenames)
- p.Filenames = filenames
- p.Doc = doc.doc.Text()
- p.Imports = sortedKeys(doc.imports)
- // makeTypeDocs may extend the list of doc.values and
- // doc.funcs and thus must be called before any other
- // function consuming those lists
- p.Types = doc.makeTypeDocs(doc.types)
- p.Consts = makeValueDocs(doc.values, token.CONST)
- p.Vars = makeValueDocs(doc.values, token.VAR)
- p.Funcs = makeFuncDocs(doc.funcs)
- p.Bugs = makeBugDocs(doc.bugs)
- p.Todos = doc.todos
-
- for _, d := range p.Types {
- switch d.Type.Type.(type) {
- case *ast.StructType:
- p.Factorys = append(p.Factorys, d.Funcs...)
- d.Funcs = make([]*FuncDoc, 0)
- case *ast.InterfaceType:
- p.Factorys = append(p.Factorys, d.Funcs...)
- d.Funcs = make([]*FuncDoc, 0)
- default:
- p.Vars = append(p.Vars, d.Vars...)
- d.Vars = make([]*ValueDoc, 0)
- p.Consts = append(p.Consts, d.Consts...)
- d.Consts = make([]*ValueDoc, 0)
- }
- }
- return p
-}
-
-func sortedKeys(m map[string]int) []string {
- list := make([]string, len(m))
- i := 0
- for key := range m {
- list[i] = key
- i++
- }
- sort.Strings(list)
- return list
-}
-
-// ----------------------------------------------------------------------------
-// Filtering by name
-
-type Filter func(string) bool
-
-func matchFields(fields *ast.FieldList, f Filter) bool {
- if fields != nil {
- for _, field := range fields.List {
- for _, name := range field.Names {
- if f(name.Name) {
- return true
- }
- }
- }
- }
- return false
-}
-
-func matchDecl(d *ast.GenDecl, f Filter) bool {
- for _, d := range d.Specs {
- switch v := d.(type) {
- case *ast.ValueSpec:
- for _, name := range v.Names {
- if f(name.Name) {
- return true
- }
- }
- case *ast.TypeSpec:
- if f(v.Name.Name) {
- return true
- }
- switch t := v.Type.(type) {
- case *ast.StructType:
- if matchFields(t.Fields, f) {
- return true
- }
- case *ast.InterfaceType:
- if matchFields(t.Methods, f) {
- return true
- }
- }
- }
- }
- return false
-}
-
-func filterValueDocs(a []*ValueDoc, f Filter) []*ValueDoc {
- w := 0
- for _, vd := range a {
- if matchDecl(vd.Decl, f) {
- a[w] = vd
- w++
- }
- }
- return a[0:w]
-}
-
-func filterFuncDocs(a []*FuncDoc, f Filter) []*FuncDoc {
- w := 0
- for _, fd := range a {
- if f(fd.Name) {
- a[w] = fd
- w++
- }
- }
- return a[0:w]
-}
-
-func filterTypeDocs(a []*TypeDoc, f Filter) []*TypeDoc {
- w := 0
- for _, td := range a {
- n := 0 // number of matches
- if matchDecl(td.Decl, f) {
- n = 1
- } else {
- // type name doesn't match, but we may have matching consts, vars, factories or methods
- td.Consts = filterValueDocs(td.Consts, f)
- td.Vars = filterValueDocs(td.Vars, f)
- td.Funcs = filterFuncDocs(td.Funcs, f)
- td.Methods = filterFuncDocs(td.Methods, f)
- n += len(td.Consts) + len(td.Vars) + len(td.Funcs) + len(td.Methods)
- }
- if n > 0 {
- a[w] = td
- w++
- }
- }
- return a[0:w]
-}
-
-// Filter eliminates documentation for names that don't pass through the filter f.
-// TODO: Recognize "Type.Method" as a name.
-//
-func (p *PackageDoc) Filter(f Filter) {
- p.Consts = filterValueDocs(p.Consts, f)
- p.Vars = filterValueDocs(p.Vars, f)
- p.Types = filterTypeDocs(p.Types, f)
- p.Funcs = filterFuncDocs(p.Funcs, f)
- p.Doc = "" // don't show top-level package doc
-}
diff --git a/vendor/github.com/visualfc/gotools/astview/astview.go b/vendor/github.com/visualfc/gotools/astview/astview.go
deleted file mode 100644
index 3fe9660..0000000
--- a/vendor/github.com/visualfc/gotools/astview/astview.go
+++ /dev/null
@@ -1,408 +0,0 @@
-// Copyright 2011-2015 visualfc . All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package astview
-
-import (
- "fmt"
- "go/ast"
- "go/parser"
- "go/token"
- "go/types"
- "io"
- "io/ioutil"
- "os"
- "path/filepath"
- "strings"
-
- "github.com/visualfc/gotools/command"
- "github.com/visualfc/gotools/pkgutil"
-)
-
-var Command = &command.Command{
- Run: runAstView,
- UsageLine: "astview [-stdin] files...",
- Short: "print go files astview",
- Long: `print go files astview`,
-}
-
-var astViewStdin bool
-var astViewShowEndPos bool
-var astViewShowTodo bool
-
-func init() {
- Command.Flag.BoolVar(&astViewStdin, "stdin", false, "input from stdin")
- Command.Flag.BoolVar(&astViewShowEndPos, "end", false, "show decl end pos")
- Command.Flag.BoolVar(&astViewShowTodo, "todo", false, "show todo list")
-}
-
-func runAstView(cmd *command.Command, args []string) error {
- if len(args) == 0 {
- cmd.Usage()
- return os.ErrInvalid
- }
- if astViewStdin {
- view, err := NewFilePackageSource(args[0], os.Stdin, true)
- if err != nil {
- fmt.Fprintf(os.Stderr, "astview: %s", err)
- command.SetExitStatus(3)
- command.Exit()
- }
- view.PrintTree(os.Stdout)
- } else {
- err := PrintFilesTree(args, os.Stdout, true)
- if err != nil {
- fmt.Fprintf(os.Stderr, "astview:%s", err)
- command.SetExitStatus(3)
- command.Exit()
- }
- }
- return nil
-}
-
-const (
- tag_package = "p"
- tag_imports_folder = "+m"
- tag_import = "mm"
- tag_type = "t"
- tag_struct = "s"
- tag_interface = "i"
- tag_value = "v"
- tag_const = "c"
- tag_func = "f"
- tag_value_folder = "+v"
- tag_const_folder = "+c"
- tag_func_folder = "+f"
- tag_factor_folder = "+tf"
- tag_type_method = "tm"
- tag_type_factor = "tf"
- tag_type_value = "tv"
- tag_todo = "b"
- tag_todo_folder = "+b"
-)
-
-type PackageView struct {
- fset *token.FileSet
- pdoc *PackageDoc
- pkg *ast.Package
- expr bool
-}
-
-var AllFiles []string
-
-func (p *PackageView) posFileIndex(pos token.Position) int {
- var index = -1
- for i := 0; i < len(AllFiles); i++ {
- if AllFiles[i] == pos.Filename {
- index = i
- break
- }
- }
- if index == -1 {
- AllFiles = append(AllFiles, pos.Filename)
- index = len(AllFiles) - 1
- }
- return index
-}
-
-func (p *PackageView) posText(pos token.Position, end token.Position) (s string) {
- index := p.posFileIndex(pos)
- if astViewShowEndPos {
- return fmt.Sprintf("%d:%d:%d:%d:%d", index, pos.Line, pos.Column, end.Line, end.Column)
- }
- return fmt.Sprintf("%d:%d:%d", index, pos.Line, pos.Column)
-}
-
-func NewFilePackage(filename string) (*PackageView, error) {
- p := new(PackageView)
- p.fset = token.NewFileSet()
- file, err := parser.ParseFile(p.fset, filename, nil, parser.AllErrors)
- if file == nil {
- return nil, err
- }
- m := make(map[string]*ast.File)
- m[filename] = file
- pkg, err := ast.NewPackage(p.fset, m, nil, nil)
- if err != nil {
- return nil, err
- }
- p.pkg = pkg
- p.pdoc = NewPackageDoc(pkg, pkg.Name, true)
- return p, nil
-}
-
-func NewPackageView(pkg *ast.Package, fset *token.FileSet, expr bool) (*PackageView, error) {
- p := new(PackageView)
- p.fset = fset
- p.pkg = pkg
- p.pdoc = NewPackageDoc(pkg, pkg.Name, true)
- p.expr = expr
- return p, nil
-}
-
-func ParseFiles(fset *token.FileSet, filenames []string, mode parser.Mode) (pkgs map[string]*ast.Package, pkgsfiles []string, first error) {
- pkgs = make(map[string]*ast.Package)
- for _, filename := range filenames {
- if src, err := parser.ParseFile(fset, filename, nil, mode); src != nil {
- name := src.Name.Name
- pkg, found := pkgs[name]
- if !found {
- pkg = &ast.Package{
- Name: name,
- Files: make(map[string]*ast.File),
- }
- pkgs[name] = pkg
- }
- pkg.Files[filename] = src
- pkgsfiles = append(pkgsfiles, filename)
- } else {
- first = err
- return
- }
- }
- return
-}
-
-func PrintFilesTree(filenames []string, w io.Writer, expr bool) error {
- fset := token.NewFileSet()
- mode := parser.AllErrors
- if astViewShowTodo {
- mode |= parser.ParseComments
- }
- pkgs, pkgsfiles, err := ParseFiles(fset, filenames, mode)
- if err != nil {
- return err
- }
- AllFiles = pkgsfiles
- for i := 0; i < len(AllFiles); i++ {
- fmt.Fprintf(w, "@%s\n", AllFiles[i])
- }
- for _, pkg := range pkgs {
- view, err := NewPackageView(pkg, fset, expr)
- if err != nil {
- return err
- }
- view.PrintTree(w)
- }
- return nil
-}
-
-func NewFilePackageSource(filename string, f *os.File, expr bool) (*PackageView, error) {
- src, err := ioutil.ReadAll(f)
- if err != nil {
- return nil, err
- }
- p := new(PackageView)
- p.fset = token.NewFileSet()
- p.expr = expr
- mode := parser.AllErrors
- if astViewShowTodo {
- mode |= parser.ParseComments
- }
- file, err := parser.ParseFile(p.fset, filename, src, mode)
- if err != nil {
- return nil, err
- }
- m := make(map[string]*ast.File)
- m[filename] = file
- pkg, err := ast.NewPackage(p.fset, m, nil, nil)
- if err != nil {
- return nil, err
- }
-
- p.pdoc = NewPackageDoc(pkg, pkg.Name, true)
- return p, nil
-}
-
-func (p *PackageView) printFuncsHelper(w io.Writer, funcs []*FuncDoc, level int, tag string, tag_folder string) {
- for _, f := range funcs {
- pos := p.fset.Position(f.Decl.Pos())
- end := p.fset.Position(f.Decl.End())
- if p.expr {
- fmt.Fprintf(w, "%d,%s,%s,%s@%s\n", level, tag, f.Name, p.posText(pos, end), types.ExprString(f.Decl.Type))
- } else {
- fmt.Fprintf(w, "%d,%s,%s,%s\n", level, tag, f.Name, p.posText(pos, end))
- }
- }
-}
-
-func (p *PackageView) PrintVars(w io.Writer, vars []*ValueDoc, level int, tag string, tag_folder string) {
- if len(tag_folder) > 0 && len(vars) > 0 {
- if tag_folder == tag_value_folder {
- fmt.Fprintf(w, "%d,%s,Variables\n", level, tag_folder)
- } else if tag_folder == tag_const_folder {
- fmt.Fprintf(w, "%d,%s,Constants\n", level, tag_folder)
- }
- level++
- }
- for _, v := range vars {
- if v.Decl == nil {
- continue
- }
- for _, s := range v.Decl.Specs {
- if m, ok := s.(*ast.ValueSpec); ok {
- pos := p.fset.Position(m.Pos())
- end := p.fset.Position(m.End())
- for i := 0; i < len(m.Names); i++ {
- if p.expr && m.Type != nil {
- fmt.Fprintf(w, "%d,%s,%s,%s@%s\n", level, tag, m.Names[i], p.posText(pos, end), types.ExprString(m.Type))
- } else {
- fmt.Fprintf(w, "%d,%s,%s,%s\n", level, tag, m.Names[i], p.posText(pos, end))
- }
- }
- }
- }
- }
-}
-func (p *PackageView) PrintTypes(w io.Writer, types []*TypeDoc, level int) {
- for _, d := range types {
- if d.Decl == nil {
- continue
- }
- typespec := d.Decl.Specs[0].(*ast.TypeSpec)
- var tag = tag_type
- if _, ok := typespec.Type.(*ast.InterfaceType); ok {
- tag = tag_interface
- } else if _, ok := typespec.Type.(*ast.StructType); ok {
- tag = tag_struct
- }
- pos := p.fset.Position(d.Decl.Pos())
- end := p.fset.Position(d.Decl.End())
- fmt.Fprintf(w, "%d,%s,%s,%s\n", level, tag, d.Type.Name, p.posText(pos, end))
- p.printFuncsHelper(w, d.Funcs, level+1, tag_type_factor, "")
- p.printFuncsHelper(w, d.Methods, level+1, tag_type_method, "")
- p.PrintTypeFields(w, d.Decl, level+1)
- //p.PrintVars(w, d.Consts, level+1, tag_const, "")
- //p.PrintVars(w, d.Vars, level+1, tag_value, "")
- }
-}
-
-func (p *PackageView) PrintTypeFields(w io.Writer, decl *ast.GenDecl, level int) {
- spec, ok := decl.Specs[0].(*ast.TypeSpec)
- if ok == false {
- return
- }
- switch d := spec.Type.(type) {
- case *ast.StructType:
- for _, list := range d.Fields.List {
- if list.Names == nil {
- continue
- }
- for _, m := range list.Names {
- pos := p.fset.Position(m.Pos())
- end := p.fset.Position(m.End())
- if list.Type != nil {
- fmt.Fprintf(w, "%d,%s,%s,%s@%s\n", level, tag_type_value, m.Name, p.posText(pos, end), types.ExprString(list.Type))
- } else {
- fmt.Fprintf(w, "%d,%s,%s,%s\n", level, tag_type_value, m.Name, p.posText(pos, end))
- }
- }
- }
- case *ast.InterfaceType:
- for _, list := range d.Methods.List {
- if list.Names == nil {
- continue
- }
- for _, m := range list.Names {
- pos := p.fset.Position(m.Pos())
- end := p.fset.Position(m.End())
- fmt.Fprintf(w, "%d,%s,%s,%s\n", level, tag_type_method, m.Name, p.posText(pos, end))
- }
- }
- }
-}
-
-func (p *PackageView) PrintHeader(w io.Writer, level int) {
- fmt.Fprintf(w, "%d,%s,%s\n", level, tag_package, p.pdoc.PackageName)
-}
-
-func (p *PackageView) PrintImports(w io.Writer, level int, tag, tag_folder string) {
- if tag_folder != "" && len(p.pdoc.Imports) > 0 {
- fmt.Fprintf(w, "%d,%s,%s\n", level, tag_folder, "Imports")
- level++
- }
- var parentPkg *pkgutil.Package
- if pkgutil.IsVendorExperiment() {
- for filename, _ := range p.pkg.Files {
- if !filepath.IsAbs(filename) {
- name, err := filepath.Abs(filename)
- if err == nil {
- filename = name
- }
- }
- parentPkg = pkgutil.ImportFile(filename)
- break
- }
- }
- for _, name := range p.pdoc.Imports {
- vname := "\"" + name + "\""
- var ps []string
- for _, file := range p.pkg.Files {
- for _, v := range file.Imports {
- if v.Path.Value == vname {
- pos := p.fset.Position(v.Pos())
- end := p.fset.Position(v.End())
- ps = append(ps, p.posText(pos, end))
- }
- }
- }
- if parentPkg != nil {
- name = pkgutil.VendoredImportPath(parentPkg, name)
- }
- fmt.Fprintf(w, "%d,%s,%s,%s\n", level, tag, name, strings.Join(ps, ";"))
- }
-}
-
-func (p *PackageView) PrintFuncs(w io.Writer, level int, tag_folder string) {
- hasFolder := false
- if len(p.pdoc.Funcs) > 0 || len(p.pdoc.Factorys) > 0 {
- hasFolder = true
- }
- if !hasFolder {
- return
- }
- if len(tag_folder) > 0 {
- fmt.Fprintf(w, "%d,%s,Functions\n", level, tag_folder)
- level++
- }
- p.printFuncsHelper(w, p.pdoc.Factorys, level, tag_type_factor, tag_func_folder)
- p.printFuncsHelper(w, p.pdoc.Funcs, level, tag_func, tag_func_folder)
-}
-
-func (p *PackageView) PrintTodos(w io.Writer, level int, tag, tag_folder string) {
- hasFolder := false
- if len(p.pdoc.Todos) > 0 {
- hasFolder = true
- }
- if !hasFolder {
- return
- }
- if len(tag_folder) > 0 {
- fmt.Fprintf(w, "%d,%s,TodoList\n", level, tag_folder)
- level++
- }
- for _, todo := range p.pdoc.Todos {
- c := todo.Comments.List[0]
- pos := p.fset.Position(c.Pos())
- end := p.fset.Position(c.End())
- ps := p.posText(pos, end)
- fmt.Fprintf(w, "%d,%s,%s,%s@%s\n", level, tag, todo.Tag, ps, todo.Text)
- }
-}
-
-func (p *PackageView) PrintPackage(w io.Writer, level int) {
- p.PrintHeader(w, level)
- level++
- p.PrintImports(w, level, tag_import, tag_imports_folder)
- p.PrintVars(w, p.pdoc.Vars, level, tag_value, tag_value_folder)
- p.PrintVars(w, p.pdoc.Consts, level, tag_const, tag_const_folder)
- p.PrintFuncs(w, level, tag_func_folder)
- p.PrintTypes(w, p.pdoc.Types, level)
- p.PrintTodos(w, level, tag_todo, tag_todo_folder)
-}
-
-// level,tag,pos@info
-func (p *PackageView) PrintTree(w io.Writer) {
- p.PrintPackage(w, 0)
-}
diff --git a/vendor/github.com/visualfc/gotools/command/command.go b/vendor/github.com/visualfc/gotools/command/command.go
deleted file mode 100644
index 2f6676b..0000000
--- a/vendor/github.com/visualfc/gotools/command/command.go
+++ /dev/null
@@ -1,346 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-//modify 2013-2014 visualfc
-
-package command
-
-import (
- "bytes"
- "flag"
- "fmt"
- "io"
- "log"
- "os"
- "strings"
- "sync"
- "text/template"
- "unicode"
- "unicode/utf8"
-)
-
-// A Command is an implementation of a go command
-// like go build or go fix.
-type Command struct {
- // Run runs the command.
- // The args are the arguments after the command name.
- Run func(cmd *Command, args []string) error
-
- // UsageLine is the one-line usage message.
- // The first word in the line is taken to be the command name.
- UsageLine string
-
- // Short is the short description shown in the 'go help' output.
- Short string
-
- // Long is the long message shown in the 'go help ' output.
- Long string
-
- // Flag is a set of flags specific to this command.
- Flag flag.FlagSet
-
- // CustomFlags indicates that the command will do its own
- // flag parsing.
- CustomFlags bool
-
- Stdin io.Reader
- Stdout io.Writer
- Stderr io.Writer
-}
-
-// Name returns the command's name: the first word in the usage line.
-func (c *Command) Name() string {
- name := c.UsageLine
- i := strings.Index(name, " ")
- if i >= 0 {
- name = name[:i]
- }
- return name
-}
-
-func (c *Command) Usage() {
- fmt.Fprintf(os.Stderr, "usage: %s %s\n", AppName, c.UsageLine)
- c.Flag.SetOutput(os.Stderr)
- c.Flag.PrintDefaults()
- //fmt.Fprintf(os.Stderr, "%s\n", strings.TrimSpace(c.Long))
- os.Exit(2)
-}
-
-func (c *Command) PrintUsage() {
- fmt.Fprintf(Stderr, "usage: %s %s\n", AppName, c.UsageLine)
- c.Flag.SetOutput(Stderr)
- c.Flag.PrintDefaults()
-}
-
-// Runnable reports whether the command can be run; otherwise
-// it is a documentation pseudo-command such as importpath.
-func (c *Command) Runnable() bool {
- return c.Run != nil
-}
-
-func (c *Command) Println(args ...interface{}) {
- fmt.Fprintln(c.Stdout, args...)
-}
-
-func (c *Command) Printf(format string, args ...interface{}) {
- fmt.Fprintf(c.Stdout, format, args...)
-}
-
-var commands []*Command
-
-func Register(cmd *Command) {
- commands = append(commands, cmd)
-}
-
-func CommandList() (cmds []string) {
- for _, cmd := range commands {
- cmds = append(cmds, cmd.Name())
- }
- return
-}
-
-var exitStatus = 0
-var exitMu sync.Mutex
-
-func SetExitStatus(n int) {
- exitMu.Lock()
- if exitStatus < n {
- exitStatus = n
- }
- exitMu.Unlock()
-}
-
-var (
- Stdout io.Writer = os.Stdout
- Stderr io.Writer = os.Stderr
- Stdin io.Reader = os.Stdin
-)
-
-func RunArgs(arguments []string, stdin io.Reader, stdout io.Writer, stderr io.Writer) error {
- flag.CommandLine.Parse(arguments)
- args := flag.Args()
- if len(args) < 1 {
- printUsage(os.Stderr)
- return os.ErrInvalid
- }
-
- if len(args) == 1 && strings.TrimSpace(args[0]) == "" {
- printUsage(os.Stderr)
- return os.ErrInvalid
- }
-
- if args[0] == "help" {
- if !help(args[1:]) {
- return os.ErrInvalid
- }
- return nil
- }
-
- for _, cmd := range commands {
- if cmd.Name() == args[0] && cmd.Run != nil {
- cmd.Flag.Usage = func() { cmd.Usage() }
- if cmd.CustomFlags {
- args = args[1:]
- } else {
- cmd.Flag.Parse(args[1:])
- args = cmd.Flag.Args()
- }
- cmd.Stdin = stdin
- cmd.Stdout = stdout
- cmd.Stderr = stderr
- return cmd.Run(cmd, args)
- }
- }
-
- fmt.Fprintf(os.Stderr, "%s: unknown subcommand %q\nRun '%s help' for usage.\n",
- AppName, args[0], AppName)
- return os.ErrInvalid
-}
-
-func Main() {
- flag.Usage = usage
- flag.Parse()
- log.SetFlags(0)
-
- args := flag.Args()
- if len(args) < 1 {
- usage()
- }
-
- if len(args) == 1 && strings.TrimSpace(args[0]) == "" {
- usage()
- }
-
- if args[0] == "help" {
- if !help(args[1:]) {
- os.Exit(2)
- }
- return
- }
-
- for _, cmd := range commands {
- if cmd.Name() == args[0] && cmd.Run != nil {
- cmd.Flag.Usage = func() { cmd.Usage() }
- if cmd.CustomFlags {
- args = args[1:]
- } else {
- cmd.Flag.Parse(args[1:])
- args = cmd.Flag.Args()
- }
- cmd.Stdin = Stdin
- cmd.Stdout = Stdout
- cmd.Stderr = Stderr
- err := cmd.Run(cmd, args)
- if err != nil {
- SetExitStatus(2)
- }
- Exit()
- return
- }
- }
-
- fmt.Fprintf(os.Stderr, "%s: unknown subcommand %q\nRun '%s help' for usage.\n",
- AppName, args[0], AppName)
- SetExitStatus(2)
- Exit()
-}
-
-var AppInfo string = "LiteIDE golang tool."
-var AppName string = "tools"
-
-var usageTemplate = `
-Usage:
-
- {{AppName}} command [arguments]
-
-The commands are:
-{{range .}}{{if .Runnable}}
- {{.Name | printf "%-11s"}} {{.Short}}{{end}}{{end}}
-
-Use "{{AppName}} help [command]" for more information about a command.
-
-Additional help topics:
-{{range .}}{{if not .Runnable}}
- {{.Name | printf "%-11s"}} {{.Short}}{{end}}{{end}}
-
-Use "{{AppName}} help [topic]" for more information about that topic.
-
-`
-
-var helpTemplate = `{{if .Runnable}}usage: {{AppName}} {{.UsageLine}}
-
-{{end}}{{.Long | trim}}
-`
-
-var documentationTemplate = `//
-/*
-{{range .}}{{if .Short}}{{.Short | capitalize}}
-
-{{end}}{{if .Runnable}}Usage:
-
- {{AppName}} {{.UsageLine}}
-
-{{end}}{{.Long | trim}}
-
-
-{{end}}*/
-package main
-`
-
-// tmpl executes the given template text on data, writing the result to w.
-func tmpl(w io.Writer, text string, data interface{}) {
- t := template.New("top")
- t.Funcs(template.FuncMap{"trim": strings.TrimSpace, "capitalize": capitalize})
- template.Must(t.Parse(text))
- if err := t.Execute(w, data); err != nil {
- panic(err)
- }
-}
-
-func capitalize(s string) string {
- if s == "" {
- return s
- }
- r, n := utf8.DecodeRuneInString(s)
- return string(unicode.ToTitle(r)) + s[n:]
-}
-
-func printUsage(w io.Writer) {
- if len(AppInfo) > 0 {
- fmt.Fprintln(w, AppInfo)
- }
- tmpl(w, strings.Replace(usageTemplate, "{{AppName}}", AppName, -1), commands)
-}
-
-func usage() {
- printUsage(os.Stderr)
- os.Exit(2)
-}
-
-// help implements the 'help' command.
-func help(args []string) bool {
- if len(args) == 0 {
- printUsage(os.Stdout)
- // not exit 2: succeeded at 'go help'.
- return true
- }
- if len(args) != 1 {
- fmt.Fprintf(os.Stderr, "usage: %s help command\n\nToo many arguments given.\n", AppName)
- return false
- }
-
- arg := args[0]
-
- // 'go help documentation' generates doc.go.
- if arg == "documentation" {
- buf := new(bytes.Buffer)
- printUsage(buf)
- usage := &Command{Long: buf.String()}
- tmpl(os.Stdout, strings.Replace(documentationTemplate, "{{AppName}}", AppName, -1), append([]*Command{usage}, commands...))
- return false
- }
-
- for _, cmd := range commands {
- if cmd.Name() == arg {
- tmpl(os.Stdout, strings.Replace(helpTemplate, "{{AppName}}", AppName, -1), cmd)
- // not exit 2: succeeded at 'go help cmd'.
- return true
- }
- }
-
- fmt.Fprintf(os.Stderr, "Unknown help topic %#q. Run '%s help'.\n", arg, AppName)
- //os.Exit(2) // failed at 'go help cmd'
- return false
-}
-
-var atexitFuncs []func()
-
-func Atexit(f func()) {
- atexitFuncs = append(atexitFuncs, f)
-}
-
-func Exit() {
- for _, f := range atexitFuncs {
- f()
- }
- os.Exit(exitStatus)
-}
-
-func Fatalf(format string, args ...interface{}) {
- Errorf(format, args...)
- Exit()
-}
-
-func Errorf(format string, args ...interface{}) {
- log.Printf(format, args...)
- SetExitStatus(1)
-}
-
-var logf = log.Printf
-
-func ExitIfErrors() {
- if exitStatus != 0 {
- Exit()
- }
-}
diff --git a/vendor/github.com/visualfc/gotools/command/version.go b/vendor/github.com/visualfc/gotools/command/version.go
deleted file mode 100644
index 0a88780..0000000
--- a/vendor/github.com/visualfc/gotools/command/version.go
+++ /dev/null
@@ -1,33 +0,0 @@
-// Copyright 2011-2015 visualfc . All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package command
-
-import (
- "os"
- "runtime"
-)
-
-func init() {
- Register(cmdVersion)
-}
-
-var AppVersion string = "1.0"
-
-var cmdVersion = &Command{
- Run: runVersion,
- UsageLine: "version",
- Short: "print tool version",
- Long: `Version prints the version.`,
-}
-
-func runVersion(cmd *Command, args []string) error {
- if len(args) != 0 {
- cmd.PrintUsage()
- return os.ErrInvalid
- }
-
- cmd.Printf("%s version %s [%s %s/%s]\n", AppName, AppVersion, runtime.Version(), runtime.GOOS, runtime.GOARCH)
- return nil
-}
diff --git a/vendor/github.com/visualfc/gotools/doc.go b/vendor/github.com/visualfc/gotools/doc.go
deleted file mode 100644
index e992f7d..0000000
--- a/vendor/github.com/visualfc/gotools/doc.go
+++ /dev/null
@@ -1,8 +0,0 @@
-// Copyright 2011-2017 visualfc . All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-/*
-gotools document
-*/
-package main
diff --git a/vendor/github.com/visualfc/gotools/docview/dirtrees.go b/vendor/github.com/visualfc/gotools/docview/dirtrees.go
deleted file mode 100644
index 2293e00..0000000
--- a/vendor/github.com/visualfc/gotools/docview/dirtrees.go
+++ /dev/null
@@ -1,352 +0,0 @@
-// Copyright 2010 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// This file contains the code dealing with package directory trees.
-
-package docview
-
-import (
- "bytes"
- "go/doc"
- "go/parser"
- "go/token"
- "log"
- "os"
- "path/filepath"
- "strings"
- "unicode"
-)
-
-type Directory struct {
- Depth int
- Path string // includes Name
- Name string
- Text string // package documentation, if any
- Dirs []*Directory // subdirectories
-}
-
-//func isGoFile(fi os.FileInfo) bool {
-// name := fi.Name()
-// return !fi.IsDir() &&
-// len(name) > 0 && name[0] != '.' && // ignore .files
-// filepath.Ext(name) == ".go"
-//}
-
-func isGoFile(f os.FileInfo) bool {
- // ignore non-Go files
- name := f.Name()
- return !f.IsDir() && !strings.HasPrefix(name, ".") && strings.HasSuffix(name, ".go")
-}
-
-func isPkgFile(fi os.FileInfo) bool {
- return isGoFile(fi) &&
- !strings.HasSuffix(fi.Name(), "_test.go") // ignore test files
-}
-
-func isPkgDir(fi os.FileInfo) bool {
- name := fi.Name()
- return fi.IsDir() && len(name) > 0 &&
- name[0] != '_' && name[0] != '.' // ignore _files and .files
-}
-
-func firstSentence(s string) string {
- i := -1 // index+1 of first terminator (punctuation ending a sentence)
- j := -1 // index+1 of first terminator followed by white space
- prev := 'A'
- for k, ch := range s {
- k1 := k + 1
- if ch == '.' || ch == '!' || ch == '?' {
- if i < 0 {
- i = k1 // first terminator
- }
- if k1 < len(s) && s[k1] <= ' ' {
- if j < 0 {
- j = k1 // first terminator followed by white space
- }
- if !unicode.IsUpper(prev) {
- j = k1
- break
- }
- }
- }
- prev = ch
- }
-
- if j < 0 {
- // use the next best terminator
- j = i
- if j < 0 {
- // no terminator at all, use the entire string
- j = len(s)
- }
- }
-
- return s[0:j]
-}
-
-type treeBuilder struct {
- pathFilter func(string) bool
- maxDepth int
-}
-
-func (b *treeBuilder) newDirTree(fset *token.FileSet, path, name string, depth int) *Directory {
- if b.pathFilter != nil && !b.pathFilter(path) {
- return nil
- }
-
- if depth >= b.maxDepth {
- // return a dummy directory so that the parent directory
- // doesn't get discarded just because we reached the max
- // directory depth
- return &Directory{depth, path, name, "", nil}
- }
-
- list, err := fs.ReadDir(path)
- if err != nil {
- // newDirTree is called with a path that should be a package
- // directory; errors here should not happen, but if they do,
- // we want to know about them
- log.Printf("ReadDir(%s): %s", path, err)
- }
-
- // determine number of subdirectories and if there are package files
- ndirs := 0
- hasPkgFiles := false
- var synopses [4]string // prioritized package documentation (0 == highest priority)
- for _, d := range list {
- switch {
- case isPkgDir(d):
- ndirs++
- case isPkgFile(d):
- // looks like a package file, but may just be a file ending in ".go";
- // don't just count it yet (otherwise we may end up with hasPkgFiles even
- // though the directory doesn't contain any real package files - was bug)
- if synopses[0] == "" {
- // no "optimal" package synopsis yet; continue to collect synopses
- //file, err := parseFile(fset, filepath.Join(path, d.Name()),
- //parser.ParseComments|parser.PackageClauseOnly)
- file, err := parser.ParseFile(fset, filepath.Join(path, d.Name()), nil,
- parser.ParseComments|parser.PackageClauseOnly)
-
- if err == nil {
- hasPkgFiles = true
- if file.Doc != nil {
- // prioritize documentation
- i := -1
- switch file.Name.Name {
- case name:
- i = 0 // normal case: directory name matches package name
- case fakePkgName:
- i = 1 // synopses for commands
- case "main":
- i = 2 // directory contains a main package
- default:
- i = 3 // none of the above
- }
- if 0 <= i && i < len(synopses) && synopses[i] == "" {
- synopses[i] = doc.Synopsis(file.Doc.Text())
- }
- }
- }
- }
- }
- }
-
- // create subdirectory tree
- var dirs []*Directory
- if ndirs > 0 {
- dirs = make([]*Directory, ndirs)
- i := 0
- for _, d := range list {
- if isPkgDir(d) {
- name := d.Name()
- dd := b.newDirTree(fset, filepath.Join(path, name), name, depth+1)
- if dd != nil {
- dirs[i] = dd
- i++
- }
- }
- }
- dirs = dirs[0:i]
- }
-
- // if there are no package files and no subdirectories
- // containing package files, ignore the directory
- if !hasPkgFiles && len(dirs) == 0 {
- return nil
- }
-
- // select the highest-priority synopsis for the directory entry, if any
- synopsis := ""
- for _, synopsis = range synopses {
- if synopsis != "" {
- break
- }
- }
-
- return &Directory{depth, path, name, synopsis, dirs}
-}
-
-// newDirectory creates a new package directory tree with at most maxDepth
-// levels, anchored at root. The result tree is pruned such that it only
-// contains directories that contain package files or that contain
-// subdirectories containing package files (transitively). If a non-nil
-// pathFilter is provided, directory paths additionally must be accepted
-// by the filter (i.e., pathFilter(path) must be true). If a value >= 0 is
-// provided for maxDepth, nodes at larger depths are pruned as well; they
-// are assumed to contain package files even if their contents are not known
-// (i.e., in this case the tree may contain directories w/o any package files).
-//
-func newDirectory(root string, pathFilter func(string) bool, maxDepth int) *Directory {
- // The root could be a symbolic link so use Stat not Lstat.
- d, err := fs.Stat(root)
- // If we fail here, report detailed error messages; otherwise
- // is is hard to see why a directory tree was not built.
- switch {
- case err != nil:
- log.Printf("newDirectory(%s): %s", root, err)
- return nil
- case !isPkgDir(d):
- log.Printf("newDirectory(%s): not a package directory", root)
- return nil
- }
- if maxDepth < 0 {
- maxDepth = 1e6 // "infinity"
- }
- b := treeBuilder{pathFilter, maxDepth}
- // the file set provided is only for local parsing, no position
- // information escapes and thus we don't need to save the set
- return b.newDirTree(token.NewFileSet(), root, d.Name(), 0)
-}
-
-func (dir *Directory) writeLeafs(buf *bytes.Buffer) {
- if dir != nil {
- if len(dir.Dirs) == 0 {
- buf.WriteString(dir.Path)
- buf.WriteByte('\n')
- return
- }
-
- for _, d := range dir.Dirs {
- d.writeLeafs(buf)
- }
- }
-}
-
-func (dir *Directory) walk(c chan<- *Directory, skipRoot bool) {
- if dir != nil {
- if !skipRoot {
- c <- dir
- }
- for _, d := range dir.Dirs {
- d.walk(c, false)
- }
- }
-}
-
-func (dir *Directory) iter(skipRoot bool) <-chan *Directory {
- c := make(chan *Directory)
- go func() {
- dir.walk(c, skipRoot)
- close(c)
- }()
- return c
-}
-
-func (dir *Directory) lookupLocal(name string) *Directory {
- for _, d := range dir.Dirs {
- if d.Name == name {
- return d
- }
- }
- return nil
-}
-
-// lookup looks for the *Directory for a given path, relative to dir.
-func (dir *Directory) lookup(path string) *Directory {
- d := strings.Split(dir.Path, string(filepath.Separator))
- p := strings.Split(path, string(filepath.Separator))
- i := 0
- for i < len(d) {
- if i >= len(p) || d[i] != p[i] {
- return nil
- }
- i++
- }
- for dir != nil && i < len(p) {
- dir = dir.lookupLocal(p[i])
- i++
- }
- return dir
-}
-
-// DirEntry describes a directory entry. The Depth and Height values
-// are useful for presenting an entry in an indented fashion.
-//
-type DirEntry struct {
- Depth int // >= 0
- Height int // = DirList.MaxHeight - Depth, > 0
- Path string // includes Name, relative to DirList root
- Name string
- Synopsis string
-}
-
-type DirList struct {
- MaxHeight int // directory tree height, > 0
- List []DirEntry
-}
-
-// listing creates a (linear) directory listing from a directory tree.
-// If skipRoot is set, the root directory itself is excluded from the list.
-//
-func (root *Directory) listing(skipRoot bool) *DirList {
- if root == nil {
- return nil
- }
-
- // determine number of entries n and maximum height
- n := 0
- minDepth := 1 << 30 // infinity
- maxDepth := 0
- for d := range root.iter(skipRoot) {
- n++
- if minDepth > d.Depth {
- minDepth = d.Depth
- }
- if maxDepth < d.Depth {
- maxDepth = d.Depth
- }
- }
- maxHeight := maxDepth - minDepth + 1
-
- if n == 0 {
- return nil
- }
-
- // create list
- list := make([]DirEntry, n)
- i := 0
- for d := range root.iter(skipRoot) {
- p := &list[i]
- p.Depth = d.Depth - minDepth
- p.Height = maxHeight - p.Depth
- // the path is relative to root.Path - remove the root.Path
- // prefix (the prefix should always be present but avoid
- // crashes and check)
- path := d.Path
- if strings.HasPrefix(d.Path, root.Path) {
- path = d.Path[len(root.Path):]
- }
- // remove trailing separator if any - path must be relative
- if len(path) > 0 && path[0] == filepath.Separator {
- path = path[1:]
- }
- p.Path = filepath.ToSlash(path)
- p.Name = d.Name
- p.Synopsis = d.Text
- i++
- }
-
- return &DirList{maxHeight, list}
-}
diff --git a/vendor/github.com/visualfc/gotools/docview/docview.go b/vendor/github.com/visualfc/gotools/docview/docview.go
deleted file mode 100644
index 85d96b6..0000000
--- a/vendor/github.com/visualfc/gotools/docview/docview.go
+++ /dev/null
@@ -1,407 +0,0 @@
-// Copyright 2011-2015 visualfc . All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package docview
-
-import (
- "bytes"
- "fmt"
- "go/build"
- "io"
- "log"
- "os"
- "path/filepath"
- "runtime"
- "strconv"
- "strings"
- "text/template"
- "time"
-
- "github.com/visualfc/gotools/command"
-)
-
-var Command = &command.Command{
- Run: runDocView,
- UsageLine: "docview [-mode] [-list|-find]",
- Short: "golang docview util",
- Long: `golang docview util`,
-}
-
-var goroot = runtime.GOROOT()
-
-var docViewFind string
-var docViewList string
-var docViewMode string
-
-func init() {
- Command.Flag.StringVar(&docViewFind, "find", "", "find package list, :pkg flag is best match")
- Command.Flag.StringVar(&docViewList, "list", "", "Print go packages list [pkg|cmd]")
- Command.Flag.StringVar(&docViewMode, "mode", "text", "Print mode [text|html|lite]")
-}
-
-func runDocView(cmd *command.Command, args []string) error {
- if docViewFind == "" && docViewList == "" {
- cmd.Usage()
- return os.ErrInvalid
- }
-
- var template string
- var info *Info
- if len(docViewList) > 0 {
- pkgPath := filepath.Join(goroot, "src", docViewList)
- if docViewList == "pkg" {
- _, err := os.Stat(pkgPath)
- if err != nil {
- pkgPath = filepath.Join(goroot, "src")
- }
- }
- info = NewListInfo(pkgPath)
- if info != nil {
- if docViewList == "pkg" {
- var filterList []DirEntry
- for _, v := range info.Dirs.List {
- if v.Path == "cmd" {
- continue
- }
- if strings.HasPrefix(v.Path, "cmd/") {
- continue
- }
- if strings.Contains(v.Path, "/testdata") {
- continue
- }
- filterList = append(filterList, v)
- }
- info.Dirs.List = filterList
- } else if docViewList == "cmd" {
- var filterList []DirEntry
- for _, v := range info.Dirs.List {
- if strings.Contains(v.Path, "/") {
- continue
- }
- if strings.Contains(v.Path, "internal") {
- continue
- }
- filterList = append(filterList, v)
- }
- info.Dirs.List = filterList
- }
- }
- switch docViewMode {
- case "html":
- template = listHTML
- case "lite":
- template = listLite
- case "text":
- template = listText
- default:
- template = listText
- }
- } else if len(docViewFind) > 0 {
- dir := NewSourceDir(goroot)
- info = dir.FindInfo(docViewFind)
- switch docViewMode {
- case "html":
- template = findHTML
- case "lite":
- template = findLite
- case "text":
- template = findText
- default:
- template = findText
- }
- }
- if info == nil {
- fmt.Fprintf(os.Stderr, "\n")
- command.SetExitStatus(3)
- command.Exit()
- }
- contents := info.GetPkgList(docViewMode, template)
- fmt.Fprintf(os.Stdout, "%s", contents)
- return nil
-}
-
-var (
- fs FileSystem = OS // the underlying file system
-)
-
-// Fake package file and name for commands. Contains the command documentation.
-const fakePkgFile = "doc.go"
-const fakePkgName = "documentation"
-
-func textFmt(w io.Writer, format string, x ...interface{}) {
- var buf bytes.Buffer
- fmt.Fprint(&buf, x)
- template.HTMLEscape(w, buf.Bytes())
-}
-
-func pathEscFmt(w io.Writer, format string, x ...interface{}) {
- switch v := x[0].(type) {
- case []byte:
- template.HTMLEscape(w, v)
- case string:
- template.HTMLEscape(w, []byte(filepath.ToSlash(v)))
- default:
- var buf bytes.Buffer
- fmt.Fprint(&buf, x)
- template.HTMLEscape(w, buf.Bytes())
- }
-}
-
-func htmlEscFmt(w io.Writer, format string, x ...interface{}) {
- switch v := x[0].(type) {
- case int:
- template.HTMLEscape(w, []byte(strconv.Itoa(v)))
- case []byte:
- template.HTMLEscape(w, v)
- case string:
- template.HTMLEscape(w, []byte(v))
- default:
- var buf bytes.Buffer
- fmt.Fprint(&buf, x)
- template.HTMLEscape(w, buf.Bytes())
- }
-}
-
-// Template formatter for "padding" format.
-func paddingFmt(w io.Writer, format string, x ...interface{}) {
- for i := x[0].(int); i > 0; i-- {
- fmt.Fprint(w, ` `)
- }
-}
-
-// Template formatter for "time" format.
-func timeFmt(w io.Writer, format string, x ...interface{}) {
- template.HTMLEscape(w, []byte(time.Unix(x[0].(int64)/1e9, 0).String()))
-}
-
-var fmap = template.FuncMap{
- "repeat": strings.Repeat,
-}
-
-func readTemplateData(name, data string) *template.Template {
- return template.Must(template.New(name).Funcs(fmap).Parse(data))
-}
-
-func readTemplateFile(name, path string) *template.Template {
- return template.Must(template.New(name).Funcs(fmap).ParseFiles(path))
-}
-
-func applyTemplate(t *template.Template, name string, data interface{}) []byte {
- var buf bytes.Buffer
- if err := t.Execute(&buf, data); err != nil {
- log.Printf("%s.Execute: %s", name, err)
- }
- return buf.Bytes()
-}
-
-type Info struct {
- Find string
- Best *DirEntry
- Dirs *DirList
-}
-
-type GodocDir struct {
- pkg *Directory
- cmd *Directory
- gopath []*Directory
-}
-
-func NewSourceDir(goroot string) *GodocDir {
- pkgPath := filepath.Join(goroot, "src/pkg")
- _, err := os.Stat(pkgPath)
- var cmd *Directory
- if err != nil {
- pkgPath = filepath.Join(goroot, "src")
- } else {
- cmd = newDirectory(filepath.Join(goroot, "src", "cmd"), nil, -1)
- }
- pkg := newDirectory(pkgPath, nil, -1)
- ctx := build.Default
- ctx.GOROOT = ""
- var gopath []*Directory
- for _, v := range ctx.SrcDirs() {
- gopath = append(gopath, newDirectory(v, nil, -1))
- }
- return &GodocDir{pkg, cmd, gopath}
-}
-
-func (dir *GodocDir) FindInfo(name string) *Info {
- max1, best1, list1 := FindDir(dir.pkg, name)
- max2, best2, list2 := FindDir(dir.cmd, name)
- var maxHeight int
- if max1 >= max2 {
- maxHeight = max1
- } else {
- maxHeight = max2
- }
- var best *DirEntry
- if best1 != nil {
- best = best1
- if best2 != nil {
- list2 = append(list2, *best2)
- }
- } else {
- best = best2
- }
- var list []DirEntry
- list = append(list, list1...)
- list = append(list, list2...)
- for _, v := range dir.gopath {
- max3, best3, list3 := FindDir(v, name)
- if max3 > maxHeight {
- maxHeight = max3
- }
- if best == nil {
- best = best3
- }
- list = append(list, list3...)
- }
- return &Info{name, best, &DirList{maxHeight, list}}
-}
-
-func FindDir(dir *Directory, pkgname string) (maxHeight int, best *DirEntry, list []DirEntry) {
- if dir == nil {
- return
- }
- dirList := dir.listing(true)
- max := len(dirList.List)
- maxHeight = dirList.MaxHeight
-
- for i := 0; i < max; i++ {
- name := dirList.List[i].Name
- path := filepath.ToSlash(dirList.List[i].Path)
- if name == pkgname || path == pkgname {
- best = &dirList.List[i]
- } else if strings.Contains(path, pkgname) {
- list = append(list, dirList.List[i])
- }
- }
- return
-}
-
-func appendList(list1, list2 []DirEntry) []DirEntry {
- list := list1
- max := len(list2)
- for i := 0; i < max; i++ {
- list = append(list, list2[i])
- }
- return list
-}
-
-func NewListInfo(root string) *Info {
- dir := newDirectory(root, nil, -1)
- if dir == nil {
- return nil
- }
- return &Info{"", nil, dir.listing(true)}
-}
-
-func FindPkgInfo(root string, pkgname string) *Info {
- dir := newDirectory(root, nil, -1)
- if dir == nil {
- return nil
- }
- dirList := dir.listing(true)
- if pkgname == "*" {
- return &Info{pkgname, nil, dirList}
- }
- var best DirEntry
- var list []DirEntry
- max := len(dirList.List)
- for i := 0; i < max; i++ {
- name := dirList.List[i].Name
- path := filepath.ToSlash(dirList.List[i].Path)
- if name == pkgname || path == pkgname {
- best = dirList.List[i]
- } else if strings.Contains(path, pkgname) {
- list = append(list, dirList.List[i])
- }
- }
- return &Info{pkgname, &best, &DirList{dirList.MaxHeight, list}}
-}
-
-func (info *Info) GetPkgList(name, templateData string) []byte {
- data := readTemplateData(name, templateData)
- return applyTemplate(data, "pkglist", info)
-}
-
-var listHTML = `
-
-Need more packages? The
-Package Dashboard
-provides a list of goinstallable packages.
-
-Subdirectories
-
-{{with .Dirs}}
-
-
-
- Name
-
- Synopsis
-
- {{range .List}}
-
- {{repeat " " .Depth}}
- {{html .Name}}
-
- {{html .Synopsis}}
-
- {{end}}
-
-
-{{end}}`
-
-var listText = `$list
-{{with .Dirs}}
-{{range .List}}{{.Path }}
-{{end}}
-{{end}}`
-
-var listLite = `$list{{with .Dirs}}{{range .List}},{{.Path}}{{end}}{{end}}`
-
-var findHTML = `
-
-Need more packages? The
-Package Dashboard
-provides a list of goinstallable packages.
-
-Subdirectories
-
-
- Best
-
- Synopsis
- {{with .Best}}
-
- {{.Path}}
-
- {{html .Synopsis}}
-
- {{end}}
- {{with .Dirs}}
-
- Match
-
- Synopsis
-
- {{range .List}}
-
- {{.Path}}
-
- {{html .Synopsis}}
-
- {{end}}
-
-
-{{end}}`
-
-var findText = `$best
-{{with .Best}}{{.Path}}{{end}}
-$list
-{{with .Dirs}}{{range .List}}{{.Path}}
-{{end}}{{end}}`
-
-var findLite = `$find,{{with .Best}}{{.Path}}{{end}}{{with .Dirs}}{{range .List}},{{.Path}}{{end}}{{end}}`
diff --git a/vendor/github.com/visualfc/gotools/docview/docx.go b/vendor/github.com/visualfc/gotools/docview/docx.go
deleted file mode 100644
index 01a9355..0000000
--- a/vendor/github.com/visualfc/gotools/docview/docx.go
+++ /dev/null
@@ -1,668 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Package doc extracts source code documentation from a Go AST.
-package docview
-
-import (
- "go/ast"
- "go/token"
- "regexp"
- "sort"
- "strconv"
-)
-
-// ----------------------------------------------------------------------------
-
-type typeDoc struct {
- // len(decl.Specs) == 1, and the element type is *ast.TypeSpec
- // if the type declaration hasn't been seen yet, decl is nil
- decl *ast.GenDecl
- // values, factory functions, and methods associated with the type
- values []*ast.GenDecl // consts and vars
- factories map[string]*ast.FuncDecl
- methods map[string]*ast.FuncDecl
-}
-
-// docReader accumulates documentation for a single package.
-// It modifies the AST: Comments (declaration documentation)
-// that have been collected by the DocReader are set to nil
-// in the respective AST nodes so that they are not printed
-// twice (once when printing the documentation and once when
-// printing the corresponding AST node).
-//
-type docReader struct {
- doc *ast.CommentGroup // package documentation, if any
- pkgName string
- showAll bool
- values []*ast.GenDecl // consts and vars
- types map[string]*typeDoc
- funcs map[string]*ast.FuncDecl
- imports map[string]int
- bugs []*ast.CommentGroup
-}
-
-func (doc *docReader) init(pkgName string, showAll bool) {
- doc.pkgName = pkgName
- doc.showAll = showAll
- doc.imports = make(map[string]int)
- doc.types = make(map[string]*typeDoc)
- doc.funcs = make(map[string]*ast.FuncDecl)
-}
-
-func (doc *docReader) addDoc(comments *ast.CommentGroup) {
- if doc.doc == nil {
- // common case: just one package comment
- doc.doc = comments
- return
- }
-
- // More than one package comment: Usually there will be only
- // one file with a package comment, but it's better to collect
- // all comments than drop them on the floor.
- // (This code isn't particularly clever - no amortized doubling is
- // used - but this situation occurs rarely and is not time-critical.)
- n1 := len(doc.doc.List)
- n2 := len(comments.List)
- list := make([]*ast.Comment, n1+1+n2) // + 1 for separator line
- copy(list, doc.doc.List)
- list[n1] = &ast.Comment{token.NoPos, "//"} // separator line
- copy(list[n1+1:], comments.List)
- doc.doc = &ast.CommentGroup{list}
-}
-
-func (doc *docReader) addType(decl *ast.GenDecl) {
- spec := decl.Specs[0].(*ast.TypeSpec)
- typ := doc.lookupTypeDoc(spec.Name.Name)
- // typ should always be != nil since declared types
- // are always named - be conservative and check
- if typ != nil {
- // a type should be added at most once, so typ.decl
- // should be nil - if it isn't, simply overwrite it
- typ.decl = decl
- }
-}
-
-func (doc *docReader) lookupTypeDoc(name string) *typeDoc {
- if name == "" {
- return nil // no type docs for anonymous types
- }
- if tdoc, found := doc.types[name]; found {
- return tdoc
- }
- // type wasn't found - add one without declaration
- tdoc := &typeDoc{nil, nil, make(map[string]*ast.FuncDecl), make(map[string]*ast.FuncDecl)}
- doc.types[name] = tdoc
- return tdoc
-}
-
-func docBaseTypeName(typ ast.Expr, showAll bool) string {
- switch t := typ.(type) {
- case *ast.Ident:
- // if the type is not exported, the effect to
- // a client is as if there were no type name
- if showAll || t.IsExported() {
- return t.Name
- }
- case *ast.StarExpr:
- return docBaseTypeName(t.X, showAll)
- }
- return ""
-}
-
-func (doc *docReader) addValue(decl *ast.GenDecl) {
- // determine if decl should be associated with a type
- // Heuristic: For each typed entry, determine the type name, if any.
- // If there is exactly one type name that is sufficiently
- // frequent, associate the decl with the respective type.
- domName := ""
- domFreq := 0
- prev := ""
- for _, s := range decl.Specs {
- if v, ok := s.(*ast.ValueSpec); ok {
- name := ""
- switch {
- case v.Type != nil:
- // a type is present; determine its name
- name = docBaseTypeName(v.Type, doc.showAll)
- case decl.Tok == token.CONST:
- // no type is present but we have a constant declaration;
- // use the previous type name (w/o more type information
- // we cannot handle the case of unnamed variables with
- // initializer expressions except for some trivial cases)
- name = prev
- }
- if name != "" {
- // entry has a named type
- if domName != "" && domName != name {
- // more than one type name - do not associate
- // with any type
- domName = ""
- break
- }
- domName = name
- domFreq++
- }
- prev = name
- }
- }
-
- // determine values list
- const threshold = 0.75
- values := &doc.values
- if domName != "" && domFreq >= int(float64(len(decl.Specs))*threshold) {
- // typed entries are sufficiently frequent
- typ := doc.lookupTypeDoc(domName)
- if typ != nil {
- values = &typ.values // associate with that type
- }
- }
-
- *values = append(*values, decl)
-}
-
-// Helper function to set the table entry for function f. Makes sure that
-// at least one f with associated documentation is stored in table, if there
-// are multiple f's with the same name.
-func setFunc(table map[string]*ast.FuncDecl, f *ast.FuncDecl) {
- name := f.Name.Name
- if g, exists := table[name]; exists && g.Doc != nil {
- // a function with the same name has already been registered;
- // since it has documentation, assume f is simply another
- // implementation and ignore it
- // TODO(gri) consider collecting all functions, or at least
- // all comments
- return
- }
- // function doesn't exist or has no documentation; use f
- table[name] = f
-}
-
-func (doc *docReader) addFunc(fun *ast.FuncDecl) {
- name := fun.Name.Name
-
- // determine if it should be associated with a type
- if fun.Recv != nil {
- // method
- typ := doc.lookupTypeDoc(docBaseTypeName(fun.Recv.List[0].Type, doc.showAll))
- if typ != nil {
- // exported receiver type
- setFunc(typ.methods, fun)
- }
- // otherwise don't show the method
- // TODO(gri): There may be exported methods of non-exported types
- // that can be called because of exported values (consts, vars, or
- // function results) of that type. Could determine if that is the
- // case and then show those methods in an appropriate section.
- return
- }
-
- // perhaps a factory function
- // determine result type, if any
- if fun.Type.Results.NumFields() >= 1 {
- res := fun.Type.Results.List[0]
- if len(res.Names) <= 1 {
- // exactly one (named or anonymous) result associated
- // with the first type in result signature (there may
- // be more than one result)
- tname := docBaseTypeName(res.Type, doc.showAll)
- typ := doc.lookupTypeDoc(tname)
- if typ != nil {
- // named and exported result type
-
- // Work-around for failure of heuristic: In package os
- // too many functions are considered factory functions
- // for the Error type. Eliminate manually for now as
- // this appears to be the only important case in the
- // current library where the heuristic fails.
- if doc.pkgName == "os" && tname == "Error" &&
- name != "NewError" && name != "NewSyscallError" {
- // not a factory function for os.Error
- setFunc(doc.funcs, fun) // treat as ordinary function
- return
- }
-
- setFunc(typ.factories, fun)
- return
- }
- }
- }
-
- // ordinary function
- setFunc(doc.funcs, fun)
-}
-
-func (doc *docReader) addDecl(decl ast.Decl) {
- switch d := decl.(type) {
- case *ast.GenDecl:
- if len(d.Specs) > 0 {
- switch d.Tok {
- case token.IMPORT:
- // imports are handled individually
- for _, spec := range d.Specs {
- if s, ok := spec.(*ast.ImportSpec); ok {
- if import_, err := strconv.Unquote(s.Path.Value); err == nil {
- doc.imports[import_] = 1
- }
- }
- }
- case token.CONST, token.VAR:
- // constants and variables are always handled as a group
- doc.addValue(d)
- case token.TYPE:
- // types are handled individually
- for _, spec := range d.Specs {
- // make a (fake) GenDecl node for this TypeSpec
- // (we need to do this here - as opposed to just
- // for printing - so we don't lose the GenDecl
- // documentation)
- //
- // TODO(gri): Consider just collecting the TypeSpec
- // node (and copy in the GenDecl.doc if there is no
- // doc in the TypeSpec - this is currently done in
- // makeTypeDocs below). Simpler data structures, but
- // would lose GenDecl documentation if the TypeSpec
- // has documentation as well.
- doc.addType(&ast.GenDecl{d.Doc, d.Pos(), token.TYPE, token.NoPos, []ast.Spec{spec}, token.NoPos})
- // A new GenDecl node is created, no need to nil out d.Doc.
- }
- }
- }
- case *ast.FuncDecl:
- doc.addFunc(d)
- }
-}
-
-func copyCommentList(list []*ast.Comment) []*ast.Comment {
- return append([]*ast.Comment(nil), list...)
-}
-
-var (
- bug_markers = regexp.MustCompile("^/[/*][ \t]*BUG\\(.*\\):[ \t]*") // BUG(uid):
- bug_content = regexp.MustCompile("[^ \n\r\t]+") // at least one non-whitespace char
-)
-
-// addFile adds the AST for a source file to the docReader.
-// Adding the same AST multiple times is a no-op.
-//
-func (doc *docReader) addFile(src *ast.File) {
- // add package documentation
- if src.Doc != nil {
- doc.addDoc(src.Doc)
- src.Doc = nil // doc consumed - remove from ast.File node
- }
-
- // add all declarations
- for _, decl := range src.Decls {
- doc.addDecl(decl)
- }
-
- // collect BUG(...) comments
- for _, c := range src.Comments {
- text := c.List[0].Text
- if m := bug_markers.FindStringIndex(text); m != nil {
- // found a BUG comment; maybe empty
- if btxt := text[m[1]:]; bug_content.MatchString(btxt) {
- // non-empty BUG comment; collect comment without BUG prefix
- list := copyCommentList(c.List)
- list[0].Text = text[m[1]:]
- doc.bugs = append(doc.bugs, &ast.CommentGroup{list})
- }
- }
- }
- src.Comments = nil // consumed unassociated comments - remove from ast.File node
-}
-
-func NewFileDoc(file *ast.File, showAll bool) *PackageDoc {
- var r docReader
- r.init(file.Name.Name, showAll)
- r.addFile(file)
- return r.newDoc("", nil)
-}
-
-func NewPackageDoc(pkg *ast.Package, importpath string, showAll bool) *PackageDoc {
- var r docReader
- r.init(pkg.Name, showAll)
- filenames := make([]string, len(pkg.Files))
- i := 0
- for filename, f := range pkg.Files {
- r.addFile(f)
- filenames[i] = filename
- i++
- }
- return r.newDoc(importpath, filenames)
-}
-
-// ----------------------------------------------------------------------------
-// Conversion to external representation
-
-// ValueDoc is the documentation for a group of declared
-// values, either vars or consts.
-//
-type ValueDoc struct {
- Doc string
- Decl *ast.GenDecl
- order int
-}
-
-type sortValueDoc []*ValueDoc
-
-func (p sortValueDoc) Len() int { return len(p) }
-func (p sortValueDoc) Swap(i, j int) { p[i], p[j] = p[j], p[i] }
-
-func declName(d *ast.GenDecl) string {
- if len(d.Specs) != 1 {
- return ""
- }
-
- switch v := d.Specs[0].(type) {
- case *ast.ValueSpec:
- return v.Names[0].Name
- case *ast.TypeSpec:
- return v.Name.Name
- }
-
- return ""
-}
-
-func (p sortValueDoc) Less(i, j int) bool {
- // sort by name
- // pull blocks (name = "") up to top
- // in original order
- if ni, nj := declName(p[i].Decl), declName(p[j].Decl); ni != nj {
- return ni < nj
- }
- return p[i].order < p[j].order
-}
-
-func makeValueDocs(list []*ast.GenDecl, tok token.Token) []*ValueDoc {
- d := make([]*ValueDoc, len(list)) // big enough in any case
- n := 0
- for i, decl := range list {
- if decl.Tok == tok {
- d[n] = &ValueDoc{decl.Doc.Text(), decl, i}
- n++
- decl.Doc = nil // doc consumed - removed from AST
- }
- }
- d = d[0:n]
- sort.Sort(sortValueDoc(d))
- return d
-}
-
-// FuncDoc is the documentation for a func declaration,
-// either a top-level function or a method function.
-//
-type FuncDoc struct {
- Doc string
- Recv ast.Expr // TODO(rsc): Would like string here
- Name string
- Decl *ast.FuncDecl
-}
-
-type sortFuncDoc []*FuncDoc
-
-func (p sortFuncDoc) Len() int { return len(p) }
-func (p sortFuncDoc) Swap(i, j int) { p[i], p[j] = p[j], p[i] }
-func (p sortFuncDoc) Less(i, j int) bool { return p[i].Name < p[j].Name }
-
-func makeFuncDocs(m map[string]*ast.FuncDecl) []*FuncDoc {
- d := make([]*FuncDoc, len(m))
- i := 0
- for _, f := range m {
- doc := new(FuncDoc)
- doc.Doc = f.Doc.Text()
- f.Doc = nil // doc consumed - remove from ast.FuncDecl node
- if f.Recv != nil {
- doc.Recv = f.Recv.List[0].Type
- }
- doc.Name = f.Name.Name
- doc.Decl = f
- d[i] = doc
- i++
- }
- sort.Sort(sortFuncDoc(d))
- return d
-}
-
-// TypeDoc is the documentation for a declared type.
-// Consts and Vars are sorted lists of constants and variables of (mostly) that type.
-// Factories is a sorted list of factory functions that return that type.
-// Methods is a sorted list of method functions on that type.
-type TypeDoc struct {
- Doc string
- Type *ast.TypeSpec
- Consts []*ValueDoc
- Vars []*ValueDoc
- Funcs []*FuncDoc
- Methods []*FuncDoc
- Decl *ast.GenDecl
- order int
-}
-
-type sortTypeDoc []*TypeDoc
-
-func (p sortTypeDoc) Len() int { return len(p) }
-func (p sortTypeDoc) Swap(i, j int) { p[i], p[j] = p[j], p[i] }
-func (p sortTypeDoc) Less(i, j int) bool {
- // sort by name
- // pull blocks (name = "") up to top
- // in original order
- if ni, nj := p[i].Type.Name.Name, p[j].Type.Name.Name; ni != nj {
- return ni < nj
- }
- return p[i].order < p[j].order
-}
-
-// NOTE(rsc): This would appear not to be correct for type ( )
-// blocks, but the doc extractor above has split them into
-// individual declarations.
-func (doc *docReader) makeTypeDocs(m map[string]*typeDoc) []*TypeDoc {
- d := make([]*TypeDoc, len(m))
- i := 0
- for _, old := range m {
- // all typeDocs should have a declaration associated with
- // them after processing an entire package - be conservative
- // and check
- if decl := old.decl; decl != nil {
- typespec := decl.Specs[0].(*ast.TypeSpec)
- t := new(TypeDoc)
- doc := typespec.Doc
- typespec.Doc = nil // doc consumed - remove from ast.TypeSpec node
- if doc == nil {
- // no doc associated with the spec, use the declaration doc, if any
- doc = decl.Doc
- }
- decl.Doc = nil // doc consumed - remove from ast.Decl node
- t.Doc = doc.Text()
- t.Type = typespec
- t.Consts = makeValueDocs(old.values, token.CONST)
- t.Vars = makeValueDocs(old.values, token.VAR)
- t.Funcs = makeFuncDocs(old.factories)
- t.Methods = makeFuncDocs(old.methods)
- t.Decl = old.decl
- t.order = i
- d[i] = t
- i++
- } else {
- // no corresponding type declaration found - move any associated
- // values, factory functions, and methods back to the top-level
- // so that they are not lost (this should only happen if a package
- // file containing the explicit type declaration is missing or if
- // an unqualified type name was used after a "." import)
- // 1) move values
- doc.values = append(doc.values, old.values...)
- // 2) move factory functions
- for name, f := range old.factories {
- doc.funcs[name] = f
- }
- // 3) move methods
- for name, f := range old.methods {
- // don't overwrite functions with the same name
- if _, found := doc.funcs[name]; !found {
- doc.funcs[name] = f
- }
- }
- }
- }
- d = d[0:i] // some types may have been ignored
- sort.Sort(sortTypeDoc(d))
- return d
-}
-
-func makeBugDocs(list []*ast.CommentGroup) []string {
- d := make([]string, len(list))
- for i, g := range list {
- d[i] = g.Text()
- }
- return d
-}
-
-// PackageDoc is the documentation for an entire package.
-//
-type PackageDoc struct {
- PackageName string
- ImportPath string
- Imports []string
- Filenames []string
- Doc string
- Consts []*ValueDoc
- Types []*TypeDoc
- Vars []*ValueDoc
- Funcs []*FuncDoc
- Bugs []string
-}
-
-// newDoc returns the accumulated documentation for the package.
-//
-func (doc *docReader) newDoc(importpath string, filenames []string) *PackageDoc {
- p := new(PackageDoc)
- p.PackageName = doc.pkgName
- p.ImportPath = importpath
- sort.Strings(filenames)
- p.Filenames = filenames
- p.Doc = doc.doc.Text()
- p.Imports = sortedKeys(doc.imports)
- // makeTypeDocs may extend the list of doc.values and
- // doc.funcs and thus must be called before any other
- // function consuming those lists
- p.Types = doc.makeTypeDocs(doc.types)
- p.Consts = makeValueDocs(doc.values, token.CONST)
- p.Vars = makeValueDocs(doc.values, token.VAR)
- p.Funcs = makeFuncDocs(doc.funcs)
- p.Bugs = makeBugDocs(doc.bugs)
- return p
-}
-
-func sortedKeys(m map[string]int) []string {
- list := make([]string, len(m))
- i := 0
- for key := range m {
- list[i] = key
- i++
- }
- sort.Strings(list)
- return list
-}
-
-// ----------------------------------------------------------------------------
-// Filtering by name
-
-type Filter func(string) bool
-
-func matchFields(fields *ast.FieldList, f Filter) bool {
- if fields != nil {
- for _, field := range fields.List {
- for _, name := range field.Names {
- if f(name.Name) {
- return true
- }
- }
- }
- }
- return false
-}
-
-func matchDecl(d *ast.GenDecl, f Filter) bool {
- for _, d := range d.Specs {
- switch v := d.(type) {
- case *ast.ValueSpec:
- for _, name := range v.Names {
- if f(name.Name) {
- return true
- }
- }
- case *ast.TypeSpec:
- if f(v.Name.Name) {
- return true
- }
- switch t := v.Type.(type) {
- case *ast.StructType:
- if matchFields(t.Fields, f) {
- return true
- }
- case *ast.InterfaceType:
- if matchFields(t.Methods, f) {
- return true
- }
- }
- }
- }
- return false
-}
-
-func filterValueDocs(a []*ValueDoc, f Filter) []*ValueDoc {
- w := 0
- for _, vd := range a {
- if matchDecl(vd.Decl, f) {
- a[w] = vd
- w++
- }
- }
- return a[0:w]
-}
-
-func filterFuncDocs(a []*FuncDoc, f Filter) []*FuncDoc {
- w := 0
- for _, fd := range a {
- if f(fd.Name) {
- a[w] = fd
- w++
- }
- }
- return a[0:w]
-}
-
-func filterTypeDocs(a []*TypeDoc, f Filter) []*TypeDoc {
- w := 0
- for _, td := range a {
- n := 0 // number of matches
- if matchDecl(td.Decl, f) {
- n = 1
- } else {
- // type name doesn't match, but we may have matching consts, vars, factories or methods
- td.Consts = filterValueDocs(td.Consts, f)
- td.Vars = filterValueDocs(td.Vars, f)
- td.Funcs = filterFuncDocs(td.Funcs, f)
- td.Methods = filterFuncDocs(td.Methods, f)
- n += len(td.Consts) + len(td.Vars) + len(td.Funcs) + len(td.Methods)
- }
- if n > 0 {
- a[w] = td
- w++
- }
- }
- return a[0:w]
-}
-
-// Filter eliminates documentation for names that don't pass through the filter f.
-// TODO: Recognize "Type.Method" as a name.
-//
-func (p *PackageDoc) Filter(f Filter) {
- p.Consts = filterValueDocs(p.Consts, f)
- p.Vars = filterValueDocs(p.Vars, f)
- p.Types = filterTypeDocs(p.Types, f)
- p.Funcs = filterFuncDocs(p.Funcs, f)
- p.Doc = "" // don't show top-level package doc
-}
diff --git a/vendor/github.com/visualfc/gotools/docview/filesystem.go b/vendor/github.com/visualfc/gotools/docview/filesystem.go
deleted file mode 100644
index dc60649..0000000
--- a/vendor/github.com/visualfc/gotools/docview/filesystem.go
+++ /dev/null
@@ -1,70 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// This file defines types for abstract file system access and
-// provides an implementation accessing the file system of the
-// underlying OS.
-
-package docview
-
-import (
- "fmt"
- "io"
- "io/ioutil"
- "os"
-)
-
-// The FileSystem interface specifies the methods godoc is using
-// to access the file system for which it serves documentation.
-type FileSystem interface {
- Open(path string) (io.ReadCloser, error)
- Lstat(path string) (os.FileInfo, error)
- Stat(path string) (os.FileInfo, error)
- ReadDir(path string) ([]os.FileInfo, error)
-}
-
-// ReadFile reads the file named by path from fs and returns the contents.
-func ReadFile(fs FileSystem, path string) ([]byte, error) {
- rc, err := fs.Open(path)
- if err != nil {
- return nil, err
- }
- defer rc.Close()
- return ioutil.ReadAll(rc)
-}
-
-// ----------------------------------------------------------------------------
-// OS-specific FileSystem implementation
-
-var OS FileSystem = osFS{}
-
-// osFS is the OS-specific implementation of FileSystem
-type osFS struct{}
-
-func (osFS) Open(path string) (io.ReadCloser, error) {
- f, err := os.Open(path)
- if err != nil {
- return nil, err
- }
- fi, err := f.Stat()
- if err != nil {
- return nil, err
- }
- if fi.IsDir() {
- return nil, fmt.Errorf("Open: %s is a directory", path)
- }
- return f, nil
-}
-
-func (osFS) Lstat(path string) (os.FileInfo, error) {
- return os.Lstat(path)
-}
-
-func (osFS) Stat(path string) (os.FileInfo, error) {
- return os.Stat(path)
-}
-
-func (osFS) ReadDir(path string) ([]os.FileInfo, error) {
- return ioutil.ReadDir(path) // is sorted
-}
diff --git a/vendor/github.com/visualfc/gotools/finddecl/finddecl.go b/vendor/github.com/visualfc/gotools/finddecl/finddecl.go
deleted file mode 100644
index b9f3f9c..0000000
--- a/vendor/github.com/visualfc/gotools/finddecl/finddecl.go
+++ /dev/null
@@ -1,135 +0,0 @@
-// Copyright 2011-2015 visualfc . All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package finddecl
-
-import (
- "errors"
- "fmt"
- "go/ast"
- "go/parser"
- "go/token"
- "os"
- "path/filepath"
- "strconv"
-
- "github.com/visualfc/gotools/command"
-)
-
-var Command = &command.Command{
- Run: runFindDecl,
- UsageLine: "finddecl",
- Short: "golang finddecl util",
- Long: `golang finddecl util.`,
-}
-var (
- filePath string
- fileLine int
-)
-
-func init() {
- Command.Flag.StringVar(&filePath, "file", "", "file path")
- Command.Flag.IntVar(&fileLine, "line", -1, "file line")
-}
-
-func runFindDecl(cmd *command.Command, args []string) error {
- if len(filePath) == 0 || fileLine == -1 {
- cmd.Usage()
- return os.ErrInvalid
- }
- if !filepath.IsAbs(filePath) {
- dir, err := os.Getwd()
- if err != nil {
- return err
- }
- filePath = filepath.Join(dir, filePath)
- }
-
- fset := token.NewFileSet()
- f, err := parser.ParseFile(fset, filePath, nil, 0)
- if err != nil {
- return err
- }
- decl := findDecl(fset, f, fileLine)
- if decl == nil {
- fmt.Println("-")
- return errors.New("error find decl")
- }
- printDecl(fset, decl, fileLine)
- return nil
-}
-
-type Info struct {
- Type string
- Name string
- BeginLine int
- EndLine int
-}
-
-func printDecl(fset *token.FileSet, decl ast.Decl, line int) {
- var tag string
- var name string
-
- tag = "-"
- name = "-"
- switch d := decl.(type) {
- case *ast.GenDecl:
- switch d.Tok {
- case token.IMPORT:
- tag = "import"
- if len(d.Specs) > 0 {
- if ts := d.Specs[0].(*ast.ImportSpec); ts != nil {
- name, _ = strconv.Unquote(ts.Path.Value)
- }
- }
- case token.TYPE:
- tag = "type"
- if len(d.Specs) > 0 {
- if ts := d.Specs[0].(*ast.TypeSpec); ts != nil {
- name = ts.Name.Name
- switch ts.Type.(type) {
- case *ast.StructType:
- tag = "struct"
- case *ast.InterfaceType:
- tag = "interface"
- default:
- tag = "type"
- }
- }
- }
- case token.VAR, token.CONST:
- tag = d.Tok.String()
- var testName string
- for _, ds := range d.Specs {
- if ts := ds.(*ast.ValueSpec); ts != nil {
- name = ts.Names[0].Name
- for _, n := range ts.Names {
- if line >= fset.Position(n.Pos()).Line && line <= fset.Position(n.End()).Line {
- testName = n.Name
- break
- }
- }
- }
- }
- if testName != "" {
- name = testName
- }
- default:
- tag = d.Tok.String()
- }
- case *ast.FuncDecl:
- tag = "func"
- name = d.Name.Name
- }
- fmt.Println(tag, name, fset.Position(decl.Pos()).Line, fset.Position(decl.End()).Line)
-}
-
-func findDecl(fset *token.FileSet, file *ast.File, line int) ast.Decl {
- for _, decl := range file.Decls {
- if line >= fset.Position(decl.Pos()).Line && line <= fset.Position(decl.End()).Line {
- return decl
- }
- }
- return nil
-}
diff --git a/vendor/github.com/visualfc/gotools/finddoc/finddoc.go b/vendor/github.com/visualfc/gotools/finddoc/finddoc.go
deleted file mode 100644
index 0cd67b2..0000000
--- a/vendor/github.com/visualfc/gotools/finddoc/finddoc.go
+++ /dev/null
@@ -1,608 +0,0 @@
-// Copyright 2013 The rspace Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Doc is a simple document printer that produces the doc comments for its
-// argument symbols, plus a link to the full documentation and a pointer to
-// the source. It has a more Go-like UI than godoc. It can also search for
-// symbols by looking in all packages, and case is ignored. For instance:
-// doc isupper
-// will find unicode.IsUpper.
-//
-// The -pkg flag retrieves package-level doc comments only.
-//
-// Usage:
-// doc pkg.name # "doc io.Writer"
-// doc pkg name # "doc fmt Printf"
-// doc name # "doc isupper" (finds unicode.IsUpper)
-// doc -pkg pkg # "doc fmt"
-//
-// The pkg is the last element of the package path;
-// no slashes (ast.Node not go/ast.Node).
-//
-// Flags
-// -c(onst) -f(unc) -i(nterface) -m(ethod) -s(truct) -t(ype) -v(ar)
-// restrict hits to declarations of the corresponding kind.
-// Flags
-// -doc -src -url
-// restrict printing to the documentation, source path, or godoc URL.
-package finddoc
-
-import (
- "bytes"
- "fmt"
- "go/ast"
- "go/parser"
- "go/printer"
- "go/token"
- "go/types"
- "os"
- "path"
- "path/filepath"
- "regexp"
- "runtime"
- "strings"
-
- "github.com/visualfc/gotools/command"
-)
-
-const usageDoc = `Find documentation for names.
-usage:
- doc pkg.name # "doc io.Writer"
- doc pkg name # "doc fmt Printf"
- doc name # "doc isupper" finds unicode.IsUpper
- doc -pkg pkg # "doc fmt"
- doc -r expr # "doc -r '.*exported'"
-pkg is the last component of any package, e.g. fmt, parser
-name is the name of an exported symbol; case is ignored in matches.
-
-The name may also be a regular expression to select which names
-to match. In regular expression searches, case is ignored and
-the pattern must match the entire name, so ".?print" will match
-Print, Fprint and Sprint but not Fprintf.
-
-Flags
- -c(onst) -f(unc) -i(nterface) -m(ethod) -s(truct) -t(ype) -v(ar)
-restrict hits to declarations of the corresponding kind.
-Flags
- -doc -src -url
-restrict printing to the documentation, source path, or godoc URL.
-Flag
- -r
-takes a single argument (no package), a name or regular expression
-to search for in all packages.
-`
-
-var Command = &command.Command{
- Run: runDoc,
- UsageLine: "finddoc [pkg.name|pkg name|-pkg name]",
- Short: "golang doc lookup",
- Long: usageDoc,
-}
-
-var (
- // If none is set, all are set.
- docFlag bool
- srcFlag bool
- urlFlag bool
- regexpFlag bool
- matchWordFlag bool
- matchCaseFlag bool
- constantFlag bool
- functionFlag bool
- interfaceFlag bool
- methodFlag bool
- packageFlag bool
- structFlag bool
- typeFlag bool
- variableFlag bool
- urlHeadTag string
-)
-
-func init() {
- Command.Flag.BoolVar(&docFlag, "doc", false, "restrict output to documentation only")
- Command.Flag.BoolVar(&srcFlag, "src", false, "restrict output to source file only")
- Command.Flag.BoolVar(&urlFlag, "url", false, "restrict output to godoc URL only")
- Command.Flag.BoolVar(®expFlag, "r", false, "single argument is a regular expression for a name")
- Command.Flag.BoolVar(&matchWordFlag, "word", false, "search match whole word")
- Command.Flag.BoolVar(&matchCaseFlag, "case", false, "search match case")
-
- Command.Flag.BoolVar(&constantFlag, "const", false, "show doc for consts only")
- Command.Flag.BoolVar(&functionFlag, "func", false, "show doc for funcs only")
- Command.Flag.BoolVar(&interfaceFlag, "interface", false, "show doc for interfaces only")
- Command.Flag.BoolVar(&methodFlag, "method", false, "show doc for methods only")
- Command.Flag.BoolVar(&packageFlag, "package", false, "show top-level package doc only")
- Command.Flag.BoolVar(&structFlag, "struct", false, "show doc for structs only")
- Command.Flag.BoolVar(&typeFlag, "type", false, "show doc for types only")
- Command.Flag.BoolVar(&variableFlag, "var", false, "show doc for vars only")
-
- Command.Flag.BoolVar(&constantFlag, "c", false, "alias for -const")
- Command.Flag.BoolVar(&functionFlag, "f", false, "alias for -func")
- Command.Flag.BoolVar(&interfaceFlag, "i", false, "alias for -interface")
- Command.Flag.BoolVar(&methodFlag, "m", false, "alias for -method")
- Command.Flag.BoolVar(&packageFlag, "pkg", false, "alias for -package")
- Command.Flag.BoolVar(&structFlag, "s", false, "alias for -struct")
- Command.Flag.BoolVar(&typeFlag, "t", false, "alias for -type")
- Command.Flag.BoolVar(&variableFlag, "v", false, "alias for -var")
-
- Command.Flag.StringVar(&urlHeadTag, "urltag", "", "url head tag, liteide provate")
-}
-
-func runDoc(cmd *command.Command, args []string) error {
- if !(constantFlag || functionFlag || interfaceFlag || methodFlag || packageFlag || structFlag || typeFlag || variableFlag) { // none set
- constantFlag = true
- functionFlag = true
- methodFlag = true
- // Not package! It's special.
- typeFlag = true
- variableFlag = true
- }
- if !(docFlag || srcFlag || urlFlag) {
- docFlag = true
- srcFlag = true
- urlFlag = true
- }
- var pkg, name string
- switch len(args) {
- case 1:
- if packageFlag {
- pkg = args[0]
- } else if regexpFlag {
- name = args[0]
- } else if strings.Contains(args[0], ".") {
- pkg, name = split(args[0])
- } else {
- name = args[0]
- }
- case 2:
- if packageFlag {
- cmd.Usage()
- }
- pkg, name = args[0], args[1]
- default:
- cmd.Usage()
- return os.ErrInvalid
- }
- if strings.Contains(pkg, "/") {
- fmt.Fprintf(os.Stderr, "doc: package name cannot contain slash (TODO)\n")
- os.Exit(2)
- }
- for _, path := range Paths(pkg) {
- lookInDirectory(path, name)
- }
- return nil
-}
-
-var slash = string(filepath.Separator)
-var slashDot = string(filepath.Separator) + "."
-var goRootSrcPkg = filepath.Join(runtime.GOROOT(), "src", "pkg")
-var goRootSrcCmd = filepath.Join(runtime.GOROOT(), "src", "cmd")
-var goPaths = SplitGopath()
-
-func split(arg string) (pkg, name string) {
- dot := strings.IndexRune(arg, '.') // We know there's one there.
- return arg[0:dot], arg[dot+1:]
-}
-
-func Paths(pkg string) []string {
- pkgs := pathsFor(runtime.GOROOT(), pkg)
- for _, root := range goPaths {
- pkgs = append(pkgs, pathsFor(root, pkg)...)
- }
- return pkgs
-}
-
-func SplitGopath() []string {
- gopath := os.Getenv("GOPATH")
- if gopath == "" {
- return nil
- }
- return strings.Split(gopath, string(os.PathListSeparator))
-}
-
-// pathsFor recursively walks the tree looking for possible directories for the package:
-// those whose basename is pkg.
-func pathsFor(root, pkg string) []string {
- root = path.Join(root, "src")
- pkgPaths := make([]string, 0, 10)
- visit := func(pathName string, f os.FileInfo, err error) error {
- if err != nil {
- return nil
- }
- // One package per directory. Ignore the files themselves.
- if !f.IsDir() {
- return nil
- }
- // No .hg or other dot nonsense please.
- if strings.Contains(pathName, slashDot) {
- return filepath.SkipDir
- }
- // Is the last element of the path correct
- if pkg == "" || filepath.Base(pathName) == pkg {
- pkgPaths = append(pkgPaths, pathName)
- }
- return nil
- }
-
- filepath.Walk(root, visit)
- return pkgPaths
-}
-
-// lookInDirectory looks in the package (if any) in the directory for the named exported identifier.
-func lookInDirectory(directory, name string) {
- fset := token.NewFileSet()
- pkgs, _ := parser.ParseDir(fset, directory, nil, parser.ParseComments) // Ignore the error.
- for _, pkg := range pkgs {
- if pkg.Name == "main" || strings.HasSuffix(pkg.Name, "_test") {
- continue
- }
- doPackage(pkg, fset, name)
- }
-}
-
-// prefixDirectory places the directory name on the beginning of each name in the list.
-func prefixDirectory(directory string, names []string) {
- if directory != "." {
- for i, name := range names {
- names[i] = filepath.Join(directory, name)
- }
- }
-}
-
-// File is a wrapper for the state of a file used in the parser.
-// The parse tree walkers are all methods of this type.
-type File struct {
- fset *token.FileSet
- name string // Name of file.
- ident string // Identifier we are searching for.
- lowerIdent string // lower ident
- regexp *regexp.Regexp
- pathPrefix string // Prefix from GOROOT/GOPATH.
- urlPrefix string // Start of corresponding URL for golang.org or godoc.org.
- file *ast.File
- comments ast.CommentMap
- defs map[*ast.Ident]types.Object
- doPrint bool
- found bool
- allFiles []*File // All files in the package.
-}
-
-// doPackage analyzes the single package constructed from the named files, looking for
-// the definition of ident.
-func doPackage(pkg *ast.Package, fset *token.FileSet, ident string) {
- var files []*File
- found := false
- for name, astFile := range pkg.Files {
- if packageFlag && astFile.Doc == nil {
- continue
- }
- file := &File{
- fset: fset,
- name: name,
- ident: ident,
- lowerIdent: strings.ToLower(ident),
- file: astFile,
- comments: ast.NewCommentMap(fset, astFile, astFile.Comments),
- }
- if regexpFlag && regexp.QuoteMeta(ident) != ident {
- // It's a regular expression.
- var err error
- file.regexp, err = regexp.Compile("^(?i:" + ident + ")$")
- if err != nil {
- fmt.Fprintf(os.Stderr, "regular expression `%s`:", err)
- os.Exit(2)
- }
- }
- switch {
- case strings.HasPrefix(name, goRootSrcPkg):
- file.urlPrefix = "http://golang.org/pkg"
- file.pathPrefix = goRootSrcPkg
- case strings.HasPrefix(name, goRootSrcCmd):
- file.urlPrefix = "http://golang.org/cmd"
- file.pathPrefix = goRootSrcCmd
- default:
- file.urlPrefix = "http://godoc.org"
- for _, path := range goPaths {
- p := filepath.Join(path, "src")
- if strings.HasPrefix(name, p) {
- file.pathPrefix = p
- break
- }
- }
- }
- file.urlPrefix = urlHeadTag + file.urlPrefix
- files = append(files, file)
- if found {
- continue
- }
- file.doPrint = false
- if packageFlag {
- file.pkgComments()
- } else {
- ast.Walk(file, file.file)
- if file.found {
- found = true
- }
- }
- }
-
- if !found {
- return
- }
-
- // By providing the Context with our own error function, it will continue
- // past the first error. There is no need for that function to do anything.
- config := types.Config{
- Error: func(error) {},
- }
- info := &types.Info{
- Defs: make(map[*ast.Ident]types.Object),
- }
- path := ""
- var astFiles []*ast.File
- for name, astFile := range pkg.Files {
- if path == "" {
- path = name
- }
- astFiles = append(astFiles, astFile)
- }
- config.Check(path, fset, astFiles, info) // Ignore errors.
-
- // We need to search all files for methods, so record the full list in each file.
- for _, file := range files {
- file.allFiles = files
- }
- for _, file := range files {
- file.doPrint = true
- file.defs = info.Defs
- if packageFlag {
- file.pkgComments()
- } else {
- ast.Walk(file, file.file)
- }
- }
-}
-
-// Visit implements the ast.Visitor interface.
-func (f *File) Visit(node ast.Node) ast.Visitor {
- switch n := node.(type) {
- case *ast.GenDecl:
- // Variables, constants, types.
- for _, spec := range n.Specs {
- switch spec := spec.(type) {
- case *ast.ValueSpec:
- if constantFlag && n.Tok == token.CONST || variableFlag && n.Tok == token.VAR {
- for _, ident := range spec.Names {
- if f.match(ident.Name) {
- f.printNode(n, ident, f.nameURL(ident.Name))
- break
- }
- }
- }
- case *ast.TypeSpec:
- // If there is only one Spec, there are probably no parens and the
- // comment we want appears before the type keyword, bound to
- // the GenDecl. If the Specs are parenthesized, the comment we want
- // is bound to the Spec. Hence we dig into the GenDecl to the Spec,
- // but only if there are no parens.
- node := ast.Node(n)
- if n.Lparen.IsValid() {
- node = spec
- }
- if f.match(spec.Name.Name) {
- if typeFlag {
- f.printNode(node, spec.Name, f.nameURL(spec.Name.Name))
- } else {
- switch spec.Type.(type) {
- case *ast.InterfaceType:
- if interfaceFlag {
- f.printNode(node, spec.Name, f.nameURL(spec.Name.Name))
- }
- case *ast.StructType:
- if structFlag {
- f.printNode(node, spec.Name, f.nameURL(spec.Name.Name))
- }
- }
- }
- if f.doPrint && f.defs[spec.Name] != nil && f.defs[spec.Name].Type() != nil {
- ms := types.NewMethodSet(f.defs[spec.Name].Type()) //.Type().MethodSet()
- if ms.Len() == 0 {
- ms = types.NewMethodSet(types.NewPointer(f.defs[spec.Name].Type())) //.MethodSet()
- }
- f.methodSet(ms)
- }
- }
- case *ast.ImportSpec:
- continue // Don't care.
- }
- }
- case *ast.FuncDecl:
- // Methods, top-level functions.
- if f.match(n.Name.Name) {
- n.Body = nil // Do not print the function body.
- if methodFlag && n.Recv != nil {
- f.printNode(n, n.Name, f.methodURL(n.Recv.List[0].Type, n.Name.Name))
- } else if functionFlag && n.Recv == nil {
- f.printNode(n, n.Name, f.nameURL(n.Name.Name))
- }
- }
- }
- return f
-}
-
-func (f *File) match(name string) bool {
- // name must be exported.
- if !ast.IsExported(name) {
- return false
- }
- if f.regexp == nil {
- if matchWordFlag {
- if matchCaseFlag {
- return name == f.ident
- }
- return strings.ToLower(name) == f.lowerIdent
- } else {
- if matchCaseFlag {
- return strings.Contains(name, f.ident)
- }
- return strings.Contains(strings.ToLower(name), f.lowerIdent)
- }
- }
- return f.regexp.MatchString(name)
-}
-
-func (f *File) printNode(node, ident ast.Node, url string) {
- if !f.doPrint {
- f.found = true
- return
- }
- fmt.Printf("%s%s%s", url, f.sourcePos(f.fset.Position(ident.Pos())), f.docs(node))
-}
-
-func (f *File) docs(node ast.Node) []byte {
- if !docFlag {
- return nil
- }
- commentedNode := printer.CommentedNode{Node: node}
- if comments := f.comments.Filter(node).Comments(); comments != nil {
- commentedNode.Comments = comments
- }
- var b bytes.Buffer
- printer.Fprint(&b, f.fset, &commentedNode)
- b.Write([]byte("\n\n")) // Add a blank line between entries if we print documentation.
- return b.Bytes()
-}
-
-func (f *File) pkgComments() {
- doc := f.file.Doc
- if doc == nil {
- return
- }
- url := ""
- if urlFlag {
- url = f.packageURL() + "\n"
- }
- docText := ""
- if docFlag {
- docText = fmt.Sprintf("package %s\n%s\n\n", f.file.Name.Name, doc.Text())
- }
- fmt.Printf("%s%s%s", url, f.sourcePos(f.fset.Position(doc.Pos())), docText)
-}
-
-func (f *File) packageURL() string {
- s := strings.TrimPrefix(f.name, f.pathPrefix)
- // Now we have a path with a final file name. Drop it.
- if i := strings.LastIndex(s, slash); i > 0 {
- s = s[:i+1]
- }
- return f.urlPrefix + s
-}
-
-func (f *File) packageName() string {
- s := strings.TrimPrefix(f.name, f.pathPrefix)
- // Now we have a path with a final file name. Drop it.
- if i := strings.LastIndex(s, slash); i > 0 {
- s = s[:i+1]
- }
- s = strings.Trim(s, slash)
- return filepath.ToSlash(s)
-}
-
-func (f *File) sourcePos(posn token.Position) string {
- if !srcFlag {
- return ""
- }
- return fmt.Sprintf("%s:%d:\n", posn.Filename, posn.Line)
-}
-
-func (f *File) nameURL(name string) string {
- if !urlFlag {
- return ""
- }
- return fmt.Sprintf("%s#%s\n", f.packageURL(), name)
-}
-
-func (f *File) methodURL(typ ast.Expr, name string) string {
- if !urlFlag {
- return ""
- }
- var b bytes.Buffer
- printer.Fprint(&b, f.fset, typ)
- typeName := b.Bytes()
- if len(typeName) > 0 && typeName[0] == '*' {
- typeName = typeName[1:]
- }
- return fmt.Sprintf("%s#%s.%s\n", f.packageURL(), typeName, name)
-}
-
-// Here follows the code to find and print a method (actually a method set, because
-// we want to do only one redundant tree walk, not one per method).
-// It should be much easier than walking the whole tree again, but that's what we must do.
-// TODO.
-
-type method struct {
- index int // Which doc to write. (Keeps the results sorted)
- *types.Selection
-}
-
-type methodVisitor struct {
- *File
- methods []method
- docs []string
-}
-
-func (f *File) methodSet(set *types.MethodSet) {
- // Build the set of things we're looking for.
- methods := make([]method, 0, set.Len())
- docs := make([]string, set.Len())
- for i := 0; i < set.Len(); i++ {
- if ast.IsExported(set.At(i).Obj().Name()) {
- m := method{
- i,
- set.At(i),
- }
- methods = append(methods, m)
- }
- }
- if len(methods) == 0 {
- return
- }
- // Collect the docs.
- for _, file := range f.allFiles {
- visitor := &methodVisitor{
- File: file,
- methods: methods,
- docs: docs,
- }
- ast.Walk(visitor, file.file)
- methods = visitor.methods
- }
- // Print them in order. The incoming method set is sorted by name.
- for _, doc := range docs {
- if doc != "" {
- fmt.Print(doc)
- }
- }
-}
-
-// Visit implements the ast.Visitor interface.
-func (visitor *methodVisitor) Visit(node ast.Node) ast.Visitor {
- switch n := node.(type) {
- case *ast.FuncDecl:
- for i, method := range visitor.methods {
- // If this is the right one, the position of the name of its identifier will match.
- if method.Obj().Pos() == n.Name.Pos() {
- n.Body = nil // TODO. Ugly - don't print the function body.
- visitor.docs[method.index] = fmt.Sprintf("%s", visitor.File.docs(n))
- // If this was the last method, we're done.
- if len(visitor.methods) == 1 {
- return nil
- }
- // Drop this one from the list.
- visitor.methods = append(visitor.methods[:i], visitor.methods[i+1:]...)
- return visitor
- }
- }
- }
- return visitor
-}
diff --git a/vendor/github.com/visualfc/gotools/goapi/goapi.go b/vendor/github.com/visualfc/gotools/goapi/goapi.go
deleted file mode 100644
index 92721cc..0000000
--- a/vendor/github.com/visualfc/gotools/goapi/goapi.go
+++ /dev/null
@@ -1,3774 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Api computes the exported API of a set of Go packages.
-
-//modify 2013-2014 visualfc
-
-package goapi
-
-import (
- "bufio"
- "bytes"
- "fmt"
- "go/ast"
- "go/build"
- "go/doc"
- "go/parser"
- "go/printer"
- "go/token"
- "io"
- "io/ioutil"
- "log"
- "os"
- "os/exec"
- "path"
- "path/filepath"
- "regexp"
- "sort"
- "strconv"
- "strings"
- "time"
-
- "github.com/visualfc/gotools/command"
-)
-
-var Command = &command.Command{
- Run: runApi,
- UsageLine: "goapi",
- Short: "golang api util",
- Long: `golang api util`,
-}
-
-var apiVerbose bool
-var apiAllmethods bool
-var apiAlldecls bool
-var apiShowpos bool
-var apiSeparate string
-var apiImportParser bool
-var apiDefaultCtx bool
-var apiCustomCtx string
-var apiLookupInfo string
-var apiLookupStdin bool
-var apiOutput string
-
-func init() {
- Command.Flag.BoolVar(&apiVerbose, "v", false, "verbose debugging")
- Command.Flag.BoolVar(&apiAllmethods, "e", true, "extract for all embedded methods")
- Command.Flag.BoolVar(&apiAlldecls, "a", false, "extract for all declarations")
- Command.Flag.BoolVar(&apiShowpos, "pos", false, "addition token position")
- Command.Flag.StringVar(&apiSeparate, "sep", ", ", "setup separators")
- Command.Flag.BoolVar(&apiImportParser, "dep", true, "parser package imports")
- Command.Flag.BoolVar(&apiDefaultCtx, "default_ctx", true, "extract for default context")
- Command.Flag.StringVar(&apiCustomCtx, "custom_ctx", "", "optional comma-separated list of -[-cgo] to override default contexts.")
- Command.Flag.StringVar(&apiLookupInfo, "cursor_info", "", "lookup cursor node info\"file.go:pos\"")
- Command.Flag.BoolVar(&apiLookupStdin, "cursor_std", false, "cursor_info use stdin")
- Command.Flag.StringVar(&apiOutput, "o", "", "output file")
-}
-
-func runApi(cmd *command.Command, args []string) error {
- if len(args) == 0 && apiLookupInfo == "" {
- cmd.Usage()
- return os.ErrInvalid
- }
- if apiVerbose {
- now := time.Now()
- defer func() {
- log.Println("time", time.Now().Sub(now))
- }()
- }
-
- var pkgs []string
- if len(args) > 0 {
- if args[0] == "std" || args[0] == "all" {
- out, err := exec.Command("go", "list", "-e", args[0]).Output()
- if err != nil {
- log.Fatal(err)
- }
- pkgs = strings.Fields(string(out))
- } else {
- pkgs = args
- }
- }
- var curinfo CursorInfo
- if apiLookupInfo != "" {
- pos := strings.Index(apiLookupInfo, ":")
- if pos != -1 {
- curinfo.file = (apiLookupInfo)[:pos]
- if i, err := strconv.Atoi((apiLookupInfo)[pos+1:]); err == nil {
- curinfo.pos = token.Pos(i)
- }
- }
- }
-
- if len(pkgs) == 1 && curinfo.pos != token.NoPos {
- curinfo.pkg = pkgs[0]
- }
-
- if apiLookupStdin {
- src, err := ioutil.ReadAll(os.Stdin)
- if err == nil {
- curinfo.src = src
- curinfo.std = true
- }
- }
-
- if apiCustomCtx != "" {
- apiDefaultCtx = false
- setCustomContexts()
- }
-
- var features []string
- w := NewWalker()
- if curinfo.pkg != "" {
- w.cursorInfo = &curinfo
- }
- w.sep = apiSeparate
-
- if apiDefaultCtx {
- w.context = &build.Default
-
- for _, pkg := range pkgs {
- w.wantedPkg[pkg] = true
- }
-
- for _, pkg := range pkgs {
- w.WalkPackage(pkg)
- }
- if w.cursorInfo != nil {
- goto lookup
- } else {
- var file io.Writer
- if apiOutput != "" {
- var err error
- file, err = os.Create(apiOutput)
- if err != nil {
- log.Fatal(err)
- }
- } else {
- file = os.Stdout
- }
- bw := bufio.NewWriter(file)
- defer bw.Flush()
- for _, p := range w.packageMap {
- if w.wantedPkg[p.name] {
- for _, f := range p.Features() {
- fmt.Fprintf(bw, "%s\n", f)
- }
- }
- }
- return nil
- }
- features = w.Features("")
- } else {
- for _, c := range contexts {
- c.Compiler = build.Default.Compiler
- }
-
- for _, pkg := range pkgs {
- w.wantedPkg[pkg] = true
- }
-
- var featureCtx = make(map[string]map[string]bool) // feature -> context name -> true
- for _, context := range contexts {
- w.context = context
- w.ctxName = contextName(w.context) + ":"
-
- for _, pkg := range pkgs {
- w.WalkPackage(pkg)
- }
- if w.cursorInfo != nil && w.cursorInfo.info != nil {
- goto lookup
- }
- }
-
- for pkg, p := range w.packageMap {
- if w.wantedPkg[p.name] {
- pos := strings.Index(pkg, ":")
- if pos == -1 {
- continue
- }
- ctxName := pkg[:pos]
- for _, f := range p.Features() {
- if featureCtx[f] == nil {
- featureCtx[f] = make(map[string]bool)
- }
- featureCtx[f][ctxName] = true
- }
- }
- }
-
- for f, cmap := range featureCtx {
- if len(cmap) == len(contexts) {
- features = append(features, f)
- continue
- }
- comma := strings.Index(f, ",")
- for cname := range cmap {
- f2 := fmt.Sprintf("%s (%s)%s", f[:comma], cname, f[comma:])
- features = append(features, f2)
- }
- }
- sort.Strings(features)
- }
-
-lookup:
- if w.cursorInfo != nil {
- info := w.cursorInfo.info
- if info == nil {
- os.Exit(1)
- return os.ErrInvalid
- }
- // fmt.Println("kind,", info.Kind)
- // fmt.Println("name,", info.Name)
- // if info.Type != "" {
- // fmt.Println("type,", strings.TrimLeft(info.Type, "*"))
- // }
- if info.Name == info.Type || info.Type == "" {
- fmt.Printf("info, %s, %s\n", info.Kind, info.Name)
- } else {
- fmt.Printf("info, %s, %s, %s\n", info.Kind, info.Name, info.Type)
- }
- if info.Kind == KindImport || info.Kind == KindPackage {
- if p := w.findPackage(info.Name); p != nil {
- fmt.Println("help,", p.name)
- }
- }
- if info.T != nil {
- for _, text := range []string{info.Name, info.Type} {
- typ := strings.TrimLeft(text, "*")
- pos := strings.Index(typ, ".")
- if pos != -1 {
- if p := w.findPackage(typ[:pos]); p != nil {
- fmt.Println("help,", p.name+typ[pos:])
- break
- }
- }
- }
- fmt.Println("pos,", w.fset.Position(info.T.Pos()))
- }
- return nil
- }
-
- fail := false
- defer func() {
- if fail {
- os.Exit(1)
- }
- }()
-
- bw := bufio.NewWriter(os.Stdout)
- defer bw.Flush()
-
- for _, f := range features {
- fmt.Fprintf(bw, "%s\n", f)
- }
- return nil
-}
-
-type CursorInfo struct {
- pkg string
- file string
- pos token.Pos
- src []byte
- std bool
- info *TypeInfo
-}
-
-// contexts are the default contexts which are scanned, unless
-// overridden by the -contexts flag.
-var contexts = []*build.Context{
- {GOOS: "linux", GOARCH: "386", CgoEnabled: true},
- {GOOS: "linux", GOARCH: "386"},
- {GOOS: "linux", GOARCH: "amd64", CgoEnabled: true},
- {GOOS: "linux", GOARCH: "amd64"},
- {GOOS: "linux", GOARCH: "arm"},
- {GOOS: "darwin", GOARCH: "386", CgoEnabled: true},
- {GOOS: "darwin", GOARCH: "386"},
- {GOOS: "darwin", GOARCH: "amd64", CgoEnabled: true},
- {GOOS: "darwin", GOARCH: "amd64"},
- {GOOS: "windows", GOARCH: "amd64"},
- {GOOS: "windows", GOARCH: "386"},
- {GOOS: "freebsd", GOARCH: "amd64"},
- {GOOS: "freebsd", GOARCH: "386"},
-}
-
-func contextName(c *build.Context) string {
- s := c.GOOS + "-" + c.GOARCH
- if c.CgoEnabled {
- return s + "-cgo"
- }
- return s
-}
-
-func osArchName(c *build.Context) string {
- return c.GOOS + "-" + c.GOARCH
-}
-
-func parseContext(c string) *build.Context {
- parts := strings.Split(c, "-")
- if len(parts) < 2 {
- log.Fatalf("bad context: %q", c)
- }
- bc := &build.Context{
- GOOS: parts[0],
- GOARCH: parts[1],
- }
- if len(parts) == 3 {
- if parts[2] == "cgo" {
- bc.CgoEnabled = true
- } else {
- log.Fatalf("bad context: %q", c)
- }
- }
- return bc
-}
-
-func setCustomContexts() {
- contexts = []*build.Context{}
- for _, c := range strings.Split(apiCustomCtx, ",") {
- contexts = append(contexts, parseContext(c))
- }
-}
-
-func set(items []string) map[string]bool {
- s := make(map[string]bool)
- for _, v := range items {
- s[v] = true
- }
- return s
-}
-
-var spaceParensRx = regexp.MustCompile(` \(\S+?\)`)
-
-func featureWithoutContext(f string) string {
- if !strings.Contains(f, "(") {
- return f
- }
- return spaceParensRx.ReplaceAllString(f, "")
-}
-
-func compareAPI(w io.Writer, features, required, optional, exception []string, allowNew bool) (ok bool) {
- ok = true
-
- optionalSet := set(optional)
- exceptionSet := set(exception)
- featureSet := set(features)
-
- sort.Strings(features)
- sort.Strings(required)
-
- take := func(sl *[]string) string {
- s := (*sl)[0]
- *sl = (*sl)[1:]
- return s
- }
-
- for len(required) > 0 || len(features) > 0 {
- switch {
- case len(features) == 0 || (len(required) > 0 && required[0] < features[0]):
- feature := take(&required)
- if exceptionSet[feature] {
- fmt.Fprintf(w, "~%s\n", feature)
- } else if featureSet[featureWithoutContext(feature)] {
- // okay.
- } else {
- fmt.Fprintf(w, "-%s\n", feature)
- ok = false // broke compatibility
- }
- case len(required) == 0 || (len(features) > 0 && required[0] > features[0]):
- newFeature := take(&features)
- if optionalSet[newFeature] {
- // Known added feature to the upcoming release.
- // Delete it from the map so we can detect any upcoming features
- // which were never seen. (so we can clean up the nextFile)
- delete(optionalSet, newFeature)
- } else {
- fmt.Fprintf(w, "+%s\n", newFeature)
- if !allowNew {
- ok = false // we're in lock-down mode for next release
- }
- }
- default:
- take(&required)
- take(&features)
- }
- }
-
- // In next file, but not in API.
- var missing []string
- for feature := range optionalSet {
- missing = append(missing, feature)
- }
- sort.Strings(missing)
- for _, feature := range missing {
- fmt.Fprintf(w, "±%s\n", feature)
- }
- return
-}
-
-func fileFeatures(filename string) []string {
- bs, err := ioutil.ReadFile(filename)
- if err != nil {
- log.Fatalf("Error reading file %s: %v", filename, err)
- }
- text := strings.TrimSpace(string(bs))
- if text == "" {
- return nil
- }
- return strings.Split(text, "\n")
-}
-
-func isExtract(name string) bool {
- if apiAlldecls {
- return true
- }
- return ast.IsExported(name)
-}
-
-// pkgSymbol represents a symbol in a package
-type pkgSymbol struct {
- pkg string // "net/http"
- symbol string // "RoundTripper"
-}
-
-//expression kind
-type Kind int
-
-const (
- KindBuiltin Kind = iota
- KindPackage
- KindImport
- KindVar
- KindConst
- KindInterface
- KindParam
- KindStruct
- KindMethod
- KindField
- KindType
- KindFunc
- KindChan
- KindArray
- KindMap
- KindSlice
- KindLabel
- KindBranch
-)
-
-func (k Kind) String() string {
- switch k {
- case KindBuiltin:
- return "builtin"
- case KindPackage:
- return "package"
- case KindImport:
- return "import"
- case KindVar:
- return "var"
- case KindConst:
- return "const"
- case KindParam:
- return "param"
- case KindInterface:
- return "interface"
- case KindStruct:
- return "struct"
- case KindMethod:
- return "method"
- case KindField:
- return "field"
- case KindType:
- return "type"
- case KindFunc:
- return "func"
- case KindChan:
- return "chan"
- case KindMap:
- return "map"
- case KindArray:
- return "array"
- case KindSlice:
- return "slice"
- case KindLabel:
- return "label"
- case KindBranch:
- return "branch"
- }
- return fmt.Sprint("unknown-kind")
-}
-
-//expression type
-type TypeInfo struct {
- Kind Kind
- Name string
- Type string
- X ast.Expr
- T ast.Expr
-}
-
-type ExprType struct {
- X ast.Expr
- T string
-}
-
-type Package struct {
- dpkg *doc.Package
- apkg *ast.Package
- interfaceMethods map[string]([]typeMethod)
- interfaces map[string]*ast.InterfaceType //interface
- structs map[string]*ast.StructType //struct
- types map[string]ast.Expr //type
- functions map[string]typeMethod //function
- consts map[string]*ExprType //const => type
- vars map[string]*ExprType //var => type
- name string
- dir string
- sep string
- deps []string
- features map[string](token.Pos) // set
-}
-
-func NewPackage() *Package {
- return &Package{
- interfaceMethods: make(map[string]([]typeMethod)),
- interfaces: make(map[string]*ast.InterfaceType),
- structs: make(map[string]*ast.StructType),
- types: make(map[string]ast.Expr),
- functions: make(map[string]typeMethod),
- consts: make(map[string]*ExprType),
- vars: make(map[string]*ExprType),
- features: make(map[string](token.Pos)),
- sep: ", ",
- }
-}
-
-func (p *Package) Features() (fs []string) {
- for f, ps := range p.features {
- if apiShowpos {
- fs = append(fs, f+p.sep+strconv.Itoa(int(ps)))
- } else {
- fs = append(fs, f)
- }
- }
- sort.Strings(fs)
- return
-}
-
-func (p *Package) findType(name string) ast.Expr {
- for k, v := range p.interfaces {
- if k == name {
- return v
- }
- }
- for k, v := range p.structs {
- if k == name {
- return v
- }
- }
- for k, v := range p.types {
- if k == name {
- return v
- }
- }
- return nil
-}
-
-func funcRetType(ft *ast.FuncType, index int) ast.Expr {
- if ft.Results != nil {
- pos := 0
- for _, fi := range ft.Results.List {
- if fi.Names == nil {
- if pos == index {
- return fi.Type
- }
- pos++
- } else {
- for _ = range fi.Names {
- if pos == index {
- return fi.Type
- }
- pos++
- }
- }
- }
- }
- return nil
-}
-
-func findFunction(funcs []*doc.Func, name string) (*ast.Ident, *ast.FuncType) {
- for _, f := range funcs {
- if f.Name == name {
- return &ast.Ident{Name: name, NamePos: f.Decl.Pos()}, f.Decl.Type
- }
- }
- return nil, nil
-}
-
-func (p *Package) findSelectorType(name string) ast.Expr {
- if t, ok := p.vars[name]; ok {
- return &ast.Ident{
- NamePos: t.X.Pos(),
- Name: t.T,
- }
- }
- if t, ok := p.consts[name]; ok {
- return &ast.Ident{
- NamePos: t.X.Pos(),
- Name: t.T,
- }
- }
- if t, ok := p.functions[name]; ok {
- return t.ft
- }
- for k, v := range p.structs {
- if k == name {
- return &ast.Ident{
- NamePos: v.Pos(),
- Name: name,
- }
- }
- }
- for k, v := range p.interfaces {
- if k == name {
- return &ast.Ident{
- NamePos: v.Pos(),
- Name: name,
- }
- }
- }
- for k, v := range p.types {
- if k == name {
- return v
- }
- }
- return nil
-}
-
-func (p *Package) findCallFunc(name string) ast.Expr {
- if fn, ok := p.functions[name]; ok {
- return fn.ft
- }
- if s, ok := p.structs[name]; ok {
- return s
- }
- if t, ok := p.types[name]; ok {
- return t
- }
- if v, ok := p.vars[name]; ok {
- if strings.HasPrefix(v.T, "func(") {
- e, err := parser.ParseExpr(v.T + "{}")
- if err == nil {
- return e
- }
- }
- }
- return nil
-}
-
-func (p *Package) findCallType(name string, index int) ast.Expr {
- if fn, ok := p.functions[name]; ok {
- return funcRetType(fn.ft, index)
- }
- if s, ok := p.structs[name]; ok {
- return &ast.Ident{
- NamePos: s.Pos(),
- Name: name,
- }
- }
- if t, ok := p.types[name]; ok {
- return &ast.Ident{
- NamePos: t.Pos(),
- Name: name,
- }
- }
- return nil
-}
-
-func (p *Package) findMethod(typ, name string) (*ast.Ident, *ast.FuncType) {
- if t, ok := p.interfaces[typ]; ok && t.Methods != nil {
- for _, fd := range t.Methods.List {
- switch ft := fd.Type.(type) {
- case *ast.FuncType:
- for _, ident := range fd.Names {
- if ident.Name == name {
- return ident, ft
- }
- }
- }
- }
- }
- for k, v := range p.interfaceMethods {
- if k == typ {
- for _, m := range v {
- if m.name == name {
- return &ast.Ident{Name: name, NamePos: m.pos}, m.ft
- }
- }
- }
- }
- if p.dpkg == nil {
- return nil, nil
- }
- for _, t := range p.dpkg.Types {
- if t.Name == typ {
- return findFunction(t.Methods, name)
- }
- }
- return nil, nil
-}
-
-type Walker struct {
- context *build.Context
- fset *token.FileSet
- scope []string
- // features map[string](token.Pos) // set
- lastConstType string
- curPackageName string
- sep string
- ctxName string
- curPackage *Package
- constDep map[string]*ExprType // key's const identifier has type of future value const identifier
- packageState map[string]loadState
- packageMap map[string]*Package
- interfaces map[pkgSymbol]*ast.InterfaceType
- selectorFullPkg map[string]string // "http" => "net/http", updated by imports
- wantedPkg map[string]bool // packages requested on the command line
- cursorInfo *CursorInfo
- localvar map[string]*ExprType
-}
-
-func NewWalker() *Walker {
- return &Walker{
- fset: token.NewFileSet(),
- // features: make(map[string]token.Pos),
- packageState: make(map[string]loadState),
- interfaces: make(map[pkgSymbol]*ast.InterfaceType),
- packageMap: make(map[string]*Package),
- selectorFullPkg: make(map[string]string),
- wantedPkg: make(map[string]bool),
- localvar: make(map[string]*ExprType),
- sep: ", ",
- }
-}
-
-// loadState is the state of a package's parsing.
-type loadState int
-
-const (
- notLoaded loadState = iota
- loading
- loaded
-)
-
-func (w *Walker) Features(ctx string) (fs []string) {
- for pkg, p := range w.packageMap {
- if w.wantedPkg[p.name] {
- if ctx == "" || strings.HasPrefix(pkg, ctx) {
- fs = append(fs, p.Features()...)
- }
- }
- }
- sort.Strings(fs)
- return
-}
-
-// fileDeps returns the imports in a file.
-func fileDeps(f *ast.File) (pkgs []string) {
- for _, is := range f.Imports {
- fpkg, err := strconv.Unquote(is.Path.Value)
- if err != nil {
- log.Fatalf("error unquoting import string %q: %v", is.Path.Value, err)
- }
- if fpkg != "C" {
- pkgs = append(pkgs, fpkg)
- }
- }
- return
-}
-
-func (w *Walker) findPackage(pkg string) *Package {
- if full, ok := w.selectorFullPkg[pkg]; ok {
- if w.ctxName != "" {
- ctxName := w.ctxName + full
- for k, v := range w.packageMap {
- if k == ctxName {
- return v
- }
- }
- }
- for k, v := range w.packageMap {
- if k == full {
- return v
- }
- }
- }
- return nil
-}
-
-func (w *Walker) findPackageOSArch(pkg string) *Package {
- if full, ok := w.selectorFullPkg[pkg]; ok {
- ctxName := osArchName(w.context) + ":" + full
- for k, v := range w.packageMap {
- if k == ctxName {
- return v
- }
- }
- }
- return nil
-}
-
-// WalkPackage walks all files in package `name'.
-// WalkPackage does nothing if the package has already been loaded.
-
-func (w *Walker) WalkPackage(pkg string) {
- if build.IsLocalImport(pkg) {
- wd, err := os.Getwd()
- if err != nil {
- if apiVerbose {
- log.Println(err)
- }
- return
- }
- dir := filepath.Clean(filepath.Join(wd, pkg))
- bp, err := w.context.ImportDir(dir, 0)
- if err != nil {
- if apiVerbose {
- log.Println(err)
- }
- return
- }
- if w.wantedPkg[pkg] == true {
- w.wantedPkg[bp.Name] = true
- delete(w.wantedPkg, pkg)
- }
- if w.cursorInfo != nil && w.cursorInfo.pkg == pkg {
- w.cursorInfo.pkg = bp.Name
- }
- w.WalkPackageDir(bp.Name, bp.Dir, bp)
- } else if filepath.IsAbs(pkg) {
- bp, err := build.ImportDir(pkg, 0)
- if err != nil {
- if apiVerbose {
- log.Println(err)
- }
- }
- if w.wantedPkg[pkg] == true {
- w.wantedPkg[bp.Name] = true
- delete(w.wantedPkg, pkg)
- }
- if w.cursorInfo != nil && w.cursorInfo.pkg == pkg {
- w.cursorInfo.pkg = bp.Name
- }
-
- w.WalkPackageDir(bp.Name, bp.Dir, bp)
- } else {
- bp, err := build.Import(pkg, "", build.FindOnly)
- if err != nil {
- if apiVerbose {
- log.Println(err)
- }
- return
- }
- w.WalkPackageDir(pkg, bp.Dir, nil)
- }
-}
-
-func (w *Walker) WalkPackageDir(name string, dir string, bp *build.Package) {
- ctxName := w.ctxName + name
- curName := name
- switch w.packageState[ctxName] {
- case loading:
- log.Fatalf("import cycle loading package %q?", name)
- return
- case loaded:
- return
- }
- w.packageState[ctxName] = loading
- w.selectorFullPkg[name] = name
-
- defer func() {
- w.packageState[ctxName] = loaded
- }()
-
- sname := name[strings.LastIndexAny(name, ".-/\\")+1:]
-
- apkg := &ast.Package{
- Files: make(map[string]*ast.File),
- }
- if bp == nil {
- bp, _ = w.context.ImportDir(dir, 0)
- }
- if bp == nil {
- return
- }
- if w.ctxName != "" {
- isCgo := (len(bp.CgoFiles) > 0) && w.context.CgoEnabled
- if isCgo {
- curName = ctxName
- } else {
- isOSArch := false
- for _, file := range bp.GoFiles {
- if isOSArchFile(w.context, file) {
- isOSArch = true
- break
- }
- }
- var p *Package
- if isOSArch {
- curName = osArchName(w.context) + ":" + name
- p = w.findPackageOSArch(name)
- } else {
- curName = name
- p = w.findPackage(name)
- }
- if p != nil {
- if apiImportParser {
- for _, dep := range p.deps {
- if _, ok := w.packageState[dep]; ok {
- continue
- }
- w.WalkPackage(dep)
- }
- }
- w.packageMap[ctxName] = p
- return
- }
- }
- }
-
- files := append(append([]string{}, bp.GoFiles...), bp.CgoFiles...)
-
- if w.cursorInfo != nil && w.cursorInfo.pkg == name {
- files = append(files, bp.TestGoFiles...)
- for _, v := range bp.XTestGoFiles {
- if v == w.cursorInfo.file {
- var xbp build.Package
- xbp.Name = name + "_test"
- xbp.GoFiles = append(xbp.GoFiles, bp.XTestGoFiles...)
- w.cursorInfo.pkg = xbp.Name
- w.WalkPackageDir(xbp.Name, dir, &xbp)
- break
- }
- }
- }
-
- if len(files) == 0 {
- if apiVerbose {
- log.Println("no Go source files in", bp.Dir)
- }
- return
- }
- var deps []string
-
- for _, file := range files {
- var src interface{} = nil
- if w.cursorInfo != nil &&
- w.cursorInfo.pkg == name &&
- w.cursorInfo.file == file &&
- w.cursorInfo.std {
- src = w.cursorInfo.src
- }
- f, err := parser.ParseFile(w.fset, filepath.Join(dir, file), src, 0)
- if err != nil {
- if apiVerbose {
- log.Printf("error parsing package %s, file %s: %v", name, file, err)
- }
- }
-
- if sname != f.Name.Name {
- continue
- }
- apkg.Files[file] = f
- if apiImportParser {
- deps = fileDeps(f)
- for _, dep := range deps {
- if _, ok := w.packageState[dep]; ok {
- continue
- }
- w.WalkPackage(dep)
- }
- }
- if apiShowpos && w.wantedPkg[name] {
- tf := w.fset.File(f.Pos())
- if tf != nil {
- fmt.Printf("pos %s%s%s%s%d%s%d\n", name, w.sep, filepath.Join(dir, file), w.sep, tf.Base(), w.sep, tf.Size())
- }
- }
- }
- /* else {
- fdir, err := os.Open(dir)
- if err != nil {
- log.Fatalln(err)
- }
- infos, err := fdir.Readdir(-1)
- fdir.Close()
- if err != nil {
- log.Fatalln(err)
- }
-
- for _, info := range infos {
- if info.IsDir() {
- continue
- }
- file := info.Name()
- if strings.HasPrefix(file, "_") || strings.HasSuffix(file, "_test.go") {
- continue
- }
- if strings.HasSuffix(file, ".go") {
- f, err := parser.ParseFile(w.fset, filepath.Join(dir, file), nil, 0)
- if err != nil {
- if apiVerbose {
- log.Printf("error parsing package %s, file %s: %v", name, file, err)
- }
- continue
- }
- if f.Name.Name != sname {
- continue
- }
-
- apkg.Files[file] = f
- if apiImportParser {
- for _, dep := range fileDeps(f) {
- w.WalkPackage(dep)
- }
- }
- if apiShowpos && w.wantedPkg[name] {
- tf := w.fset.File(f.Pos())
- if tf != nil {
- fmt.Printf("pos %s%s%s%s%d:%d\n", name, w.sep, filepath.Join(dir, file), w.sep, tf.Base(), tf.Base()+tf.Size())
- }
- }
- }
- }
- }*/
- if curName != ctxName {
- w.packageState[curName] = loading
-
- defer func() {
- w.packageState[curName] = loaded
- }()
- }
-
- if apiVerbose {
- log.Printf("package %s => %s, %v", ctxName, curName, w.wantedPkg[curName])
- }
- pop := w.pushScope("pkg " + name)
- defer pop()
-
- w.curPackageName = curName
- w.constDep = map[string]*ExprType{}
- w.curPackage = NewPackage()
- w.curPackage.apkg = apkg
- w.curPackage.name = name
- w.curPackage.dir = dir
- w.curPackage.deps = deps
- w.curPackage.sep = w.sep
- w.packageMap[curName] = w.curPackage
- w.packageMap[ctxName] = w.curPackage
-
- for _, afile := range apkg.Files {
- w.recordTypes(afile)
- }
-
- // Register all function declarations first.
- for _, afile := range apkg.Files {
- for _, di := range afile.Decls {
- if d, ok := di.(*ast.FuncDecl); ok {
- if !w.isExtract(d.Name.Name) {
- continue
- }
- w.peekFuncDecl(d)
- }
- }
- }
-
- for _, afile := range apkg.Files {
- w.walkFile(afile)
- }
-
- w.resolveConstantDeps()
-
- if w.cursorInfo != nil && w.cursorInfo.pkg == name {
- for k, v := range apkg.Files {
- if k == w.cursorInfo.file {
- f := w.fset.File(v.Pos())
- if f == nil {
- log.Fatalf("error fset postion %v", v.Pos())
- }
- info, err := w.lookupFile(v, token.Pos(f.Base())+w.cursorInfo.pos-1)
- if err != nil {
- log.Fatalln("lookup error,", err)
- } else {
- if info != nil && info.Kind == KindImport {
- for _, is := range v.Imports {
- fpath, err := strconv.Unquote(is.Path.Value)
- if err == nil {
- if info.Name == path.Base(fpath) {
- info.T = is.Path
- }
- }
- }
- }
- w.cursorInfo.info = info
- }
- break
- }
- }
- return
- }
-
- // Now that we're done walking types, vars and consts
- // in the *ast.Package, use go/doc to do the rest
- // (functions and methods). This is done here because
- // go/doc is destructive. We can't use the
- // *ast.Package after this.
- var mode doc.Mode
- if apiAllmethods {
- mode |= doc.AllMethods
- }
- if apiAlldecls && w.wantedPkg[w.ctxName] {
- mode |= doc.AllDecls
- }
-
- dpkg := doc.New(apkg, name, mode)
- w.curPackage.dpkg = dpkg
-
- if w.wantedPkg[name] != true {
- return
- }
-
- for _, t := range dpkg.Types {
- // Move funcs up to the top-level, not hiding in the Types.
- dpkg.Funcs = append(dpkg.Funcs, t.Funcs...)
-
- for _, m := range t.Methods {
- w.walkFuncDecl(m.Decl)
- }
- }
-
- for _, f := range dpkg.Funcs {
- w.walkFuncDecl(f.Decl)
- }
-}
-
-// pushScope enters a new scope (walking a package, type, node, etc)
-// and returns a function that will leave the scope (with sanity checking
-// for mismatched pushes & pops)
-func (w *Walker) pushScope(name string) (popFunc func()) {
- w.scope = append(w.scope, name)
- return func() {
- if len(w.scope) == 0 {
- log.Fatalf("attempt to leave scope %q with empty scope list", name)
- }
- if w.scope[len(w.scope)-1] != name {
- log.Fatalf("attempt to leave scope %q, but scope is currently %#v", name, w.scope)
- }
- w.scope = w.scope[:len(w.scope)-1]
- }
-}
-
-func (w *Walker) recordTypes(file *ast.File) {
- cur := w.curPackage
- for _, di := range file.Decls {
- switch d := di.(type) {
- case *ast.GenDecl:
- switch d.Tok {
- case token.TYPE:
- for _, sp := range d.Specs {
- ts := sp.(*ast.TypeSpec)
- name := ts.Name.Name
- switch t := ts.Type.(type) {
- case *ast.InterfaceType:
- if isExtract(name) {
- w.noteInterface(name, t)
- }
- cur.interfaces[name] = t
- case *ast.StructType:
- cur.structs[name] = t
- default:
- cur.types[name] = ts.Type
- }
- }
- }
- }
- }
-}
-
-func inRange(node ast.Node, p token.Pos) bool {
- if node == nil {
- return false
- }
- return p >= node.Pos() && p <= node.End()
-}
-
-func (w *Walker) lookupLabel(body *ast.BlockStmt, name string) (*TypeInfo, error) {
- for _, stmt := range body.List {
- switch v := stmt.(type) {
- case *ast.BlockStmt:
- return w.lookupLabel(v, name)
- case *ast.LabeledStmt:
- return &TypeInfo{Kind: KindLabel, Name: v.Label.Name, Type: "branch", T: v.Label}, nil
- }
- }
- return nil, nil
-}
-
-func (w *Walker) lookupFile(file *ast.File, p token.Pos) (*TypeInfo, error) {
- if inRange(file.Name, p) {
- return &TypeInfo{Kind: KindPackage, X: file.Name, Name: file.Name.Name, Type: file.Name.Name, T: file.Name}, nil
- }
- for _, di := range file.Decls {
- switch d := di.(type) {
- case *ast.GenDecl:
- if inRange(d, p) {
- return w.lookupDecl(d, p, false)
- }
- case *ast.FuncDecl:
- if inRange(d, p) {
- info, err := w.lookupDecl(d, p, false)
- if info != nil && info.Kind == KindBranch {
- return w.lookupLabel(d.Body, info.Name)
- }
- return info, err
- }
- if d.Body != nil && inRange(d.Body, p) {
- return w.lookupStmt(d.Body, p)
- }
- default:
- return nil, fmt.Errorf("un parser decl %T", di)
- }
- }
- return nil, fmt.Errorf("un find cursor %v", w.fset.Position(p))
-}
-
-func (w *Walker) isExtract(name string) bool {
- if w.wantedPkg[w.curPackageName] || apiAlldecls {
- return true
- }
- return ast.IsExported(name)
-}
-
-func (w *Walker) isType(typ string) *ExprType {
- pos := strings.Index(typ, ".")
- if pos != -1 {
- pkg := typ[:pos]
- typ = typ[pos+1:]
- if p := w.findPackage(pkg); p != nil {
- if t, ok := p.types[typ]; ok {
- if r := w.isType(typ); r != nil {
- return r
- }
- return &ExprType{X: t, T: w.pkgRetType(pkg, w.nodeString(t))}
- }
- }
- return nil
- }
- if t, ok := w.curPackage.types[typ]; ok {
- if r := w.isType(w.nodeString(t)); r != nil {
- return r
- }
- return &ExprType{X: t, T: w.nodeString(t)}
- }
- return nil
-}
-
-func (w *Walker) lookupStmt(vi ast.Stmt, p token.Pos) (*TypeInfo, error) {
- if vi == nil {
- return nil, nil
- }
- switch v := vi.(type) {
- case *ast.BadStmt:
- //
- case *ast.EmptyStmt:
- //
- case *ast.LabeledStmt:
- if inRange(v.Label, p) {
- return &TypeInfo{Kind: KindLabel, Name: v.Label.Name}, nil
- }
- return w.lookupStmt(v.Stmt, p)
- //
- case *ast.DeclStmt:
- return w.lookupDecl(v.Decl, p, true)
- case *ast.AssignStmt:
- if len(v.Lhs) == len(v.Rhs) {
- for i := 0; i < len(v.Lhs); i++ {
- switch lt := v.Lhs[i].(type) {
- case *ast.Ident:
- typ, err := w.varValueType(v.Rhs[i], 0)
- if err == nil && v.Tok == token.DEFINE {
- w.localvar[lt.Name] = &ExprType{T: typ, X: lt}
- } else if apiVerbose {
- log.Println(err)
- }
- }
- if inRange(v.Lhs[i], p) {
- return w.lookupExprInfo(v.Lhs[i], p)
- } else if inRange(v.Rhs[i], p) {
- return w.lookupExprInfo(v.Rhs[i], p)
- }
- if fl, ok := v.Rhs[i].(*ast.FuncLit); ok {
- if inRange(fl, p) {
- return w.lookupStmt(fl.Body, p)
- }
- }
- }
- } else if len(v.Rhs) == 1 {
- for i := 0; i < len(v.Lhs); i++ {
- switch lt := v.Lhs[i].(type) {
- case *ast.Ident:
- typ, err := w.varValueType(v.Rhs[0], i)
- if err == nil && v.Tok == token.DEFINE {
- w.localvar[lt.Name] = &ExprType{T: typ, X: lt}
- } else if apiVerbose {
- log.Println(err)
- }
- }
- if inRange(v.Lhs[i], p) {
- return w.lookupExprInfo(v.Lhs[i], p)
- } else if inRange(v.Rhs[0], p) {
- return w.lookupExprInfo(v.Rhs[0], p)
- }
- if fl, ok := v.Rhs[0].(*ast.FuncLit); ok {
- if inRange(fl, p) {
- return w.lookupStmt(fl.Body, p)
- }
- }
- }
- }
- return nil, nil
- case *ast.ExprStmt:
- return w.lookupExprInfo(v.X, p)
- case *ast.BlockStmt:
- for _, st := range v.List {
- if inRange(st, p) {
- return w.lookupStmt(st, p)
- }
- _, err := w.lookupStmt(st, p)
- if err != nil {
- log.Println(err)
- }
- }
- case *ast.IfStmt:
- if inRange(v.Init, p) {
- return w.lookupStmt(v.Init, p)
- } else {
- w.lookupStmt(v.Init, p)
- }
- if inRange(v.Cond, p) {
- return w.lookupExprInfo(v.Cond, p)
- } else if inRange(v.Body, p) {
- return w.lookupStmt(v.Body, p)
- } else if inRange(v.Else, p) {
- return w.lookupStmt(v.Else, p)
- }
- case *ast.SendStmt:
- if inRange(v.Chan, p) {
- return w.lookupExprInfo(v.Chan, p)
- } else if inRange(v.Value, p) {
- return w.lookupExprInfo(v.Value, p)
- }
- case *ast.IncDecStmt:
- return w.lookupExprInfo(v.X, p)
- case *ast.GoStmt:
- return w.lookupExprInfo(v.Call, p)
- case *ast.DeferStmt:
- return w.lookupExprInfo(v.Call, p)
- case *ast.ReturnStmt:
- for _, r := range v.Results {
- if inRange(r, p) {
- return w.lookupExprInfo(r, p)
- }
- }
- case *ast.BranchStmt:
- if inRange(v.Label, p) {
- return &TypeInfo{Kind: KindBranch, Name: v.Label.Name, Type: "label", T: v.Label}, nil
- }
- //
- case *ast.CaseClause:
- for _, r := range v.List {
- if inRange(r, p) {
- return w.lookupExprInfo(r, p)
- }
- }
- for _, body := range v.Body {
- if inRange(body, p) {
- return w.lookupStmt(body, p)
- } else {
- w.lookupStmt(body, p)
- }
- }
- case *ast.SwitchStmt:
- if inRange(v.Init, p) {
- return w.lookupStmt(v.Init, p)
- } else {
- w.lookupStmt(v.Init, p)
- }
- if inRange(v.Tag, p) {
- return w.lookupExprInfo(v.Tag, p)
- } else if inRange(v.Body, p) {
- return w.lookupStmt(v.Body, p)
- }
- case *ast.TypeSwitchStmt:
- if inRange(v.Assign, p) {
- return w.lookupStmt(v.Assign, p)
- } else {
- w.lookupStmt(v.Assign, p)
- }
- if inRange(v.Init, p) {
- return w.lookupStmt(v.Init, p)
- } else {
- w.lookupStmt(v.Init, p)
- }
- var vs string
- if as, ok := v.Assign.(*ast.AssignStmt); ok {
- if len(as.Lhs) == 1 {
- vs = w.nodeString(as.Lhs[0])
- }
- }
- if inRange(v.Body, p) {
- for _, s := range v.Body.List {
- if inRange(s, p) {
- switch cs := s.(type) {
- case *ast.CaseClause:
- for _, r := range cs.List {
- if inRange(r, p) {
- return w.lookupExprInfo(r, p)
- } else if vs != "" {
- typ, err := w.varValueType(r, 0)
- if err == nil {
- w.localvar[vs] = &ExprType{T: typ, X: r}
- }
- }
- }
- for _, body := range cs.Body {
- if inRange(body, p) {
- return w.lookupStmt(body, p)
- } else {
- w.lookupStmt(body, p)
- }
- }
- default:
- return w.lookupStmt(cs, p)
- }
- }
- }
- }
- case *ast.CommClause:
- if inRange(v.Comm, p) {
- return w.lookupStmt(v.Comm, p)
- }
- for _, body := range v.Body {
- if inRange(body, p) {
- return w.lookupStmt(body, p)
- }
- }
- case *ast.SelectStmt:
- if inRange(v.Body, p) {
- return w.lookupStmt(v.Body, p)
- }
- case *ast.ForStmt:
- if inRange(v.Init, p) {
- return w.lookupStmt(v.Init, p)
- } else {
- w.lookupStmt(v.Init, p)
- }
- if inRange(v.Cond, p) {
- return w.lookupExprInfo(v.Cond, p)
- } else if inRange(v.Body, p) {
- return w.lookupStmt(v.Body, p)
- } else if inRange(v.Post, p) {
- return w.lookupStmt(v.Post, p)
- }
- case *ast.RangeStmt:
- if inRange(v.X, p) {
- return w.lookupExprInfo(v.X, p)
- } else if inRange(v.Key, p) {
- return &TypeInfo{Kind: KindBuiltin, Name: w.nodeString(v.Key), Type: "int"}, nil
- } else if inRange(v.Value, p) {
- typ, err := w.lookupExprInfo(v.X, p)
- if typ != nil {
- typ.Name = w.nodeString(v.Value)
- return typ, err
- }
- } else {
- typ, err := w.varValueType(v.X, 0)
- //check is type
- if t := w.isType(typ); t != nil {
- typ = t.T
- }
- if err == nil {
- var kt, vt string
- if strings.HasPrefix(typ, "[]") {
- kt = "int"
- vt = typ[2:]
- } else if strings.HasPrefix(typ, "map[") {
- node, err := parser.ParseExpr(typ + "{}")
- if err == nil {
- if cl, ok := node.(*ast.CompositeLit); ok {
- if m, ok := cl.Type.(*ast.MapType); ok {
- kt = w.nodeString(w.namelessType(m.Key))
- vt = w.nodeString(w.namelessType(m.Value))
- }
- }
- }
- }
- if inRange(v.Key, p) {
- return &TypeInfo{Kind: KindVar, X: v.Key, Name: w.nodeString(v.Key), T: v.X, Type: kt}, nil
- } else if inRange(v.Value, p) {
- return &TypeInfo{Kind: KindVar, X: v.Value, Name: w.nodeString(v.Value), T: v.X, Type: vt}, nil
- }
- if key, ok := v.Key.(*ast.Ident); ok {
- w.localvar[key.Name] = &ExprType{T: kt, X: v.Key}
- }
- if value, ok := v.Value.(*ast.Ident); ok {
- w.localvar[value.Name] = &ExprType{T: vt, X: v.Value}
- }
- }
- }
- if inRange(v.Body, p) {
- return w.lookupStmt(v.Body, p)
- }
- }
- return nil, nil //fmt.Errorf("not lookup stmt %v %T", vi, vi)
-}
-
-func (w *Walker) lookupVar(vs *ast.ValueSpec, p token.Pos, local bool) (*TypeInfo, error) {
- if inRange(vs.Type, p) {
- return w.lookupExprInfo(vs.Type, p)
- }
- for _, v := range vs.Values {
- if inRange(v, p) {
- return w.lookupExprInfo(v, p)
- }
- }
- if vs.Type != nil {
- typ := w.nodeString(vs.Type)
- for _, ident := range vs.Names {
- if local {
- w.localvar[ident.Name] = &ExprType{T: typ, X: ident}
- }
- if inRange(ident, p) {
- return &TypeInfo{Kind: KindVar, X: ident, Name: ident.Name, T: vs.Type, Type: typ}, nil
- }
- }
- } else if len(vs.Names) == len(vs.Values) {
- for n, ident := range vs.Names {
- typ := ""
- if !local {
- if t, ok := w.curPackage.vars[ident.Name]; ok {
- typ = t.T
- }
- } else {
- typ, err := w.varValueType(vs.Values[n], n)
- if err != nil {
- if apiVerbose {
- log.Printf("unknown type of variable2 %q, type %T, error = %v, pos=%s",
- ident.Name, vs.Values[n], err, w.fset.Position(vs.Pos()))
- }
- typ = "unknown-type"
- }
- w.localvar[ident.Name] = &ExprType{T: typ, X: ident}
- }
- if inRange(ident, p) {
- return &TypeInfo{Kind: KindVar, X: ident, Name: ident.Name, T: ident, Type: typ}, nil
- }
- }
- } else if len(vs.Values) == 1 {
- for n, ident := range vs.Names {
- typ := ""
- if !local {
- if t, ok := w.curPackage.vars[ident.Name]; ok {
- typ = t.T
- }
- } else {
- typ, err := w.varValueType(vs.Values[0], n)
- if err != nil {
- if apiVerbose {
- log.Printf("unknown type of variable3 %q, type %T, error = %v, pos=%s",
- ident.Name, vs.Values[0], err, w.fset.Position(vs.Pos()))
- }
- typ = "unknown-type"
- }
- w.localvar[ident.Name] = &ExprType{T: typ, X: ident}
- }
- if inRange(ident, p) {
- return &TypeInfo{Kind: KindVar, X: ident, Name: ident.Name, T: ident, Type: typ}, nil
- }
- }
- }
- return nil, fmt.Errorf("not lookup var local:%v value:%v type:s%T", local, w.nodeString(vs), vs)
-}
-
-func (w *Walker) lookupConst(vs *ast.ValueSpec, p token.Pos, local bool) (*TypeInfo, error) {
- if inRange(vs.Type, p) {
- return w.lookupExprInfo(vs.Type, p)
- }
- for _, ident := range vs.Names {
- typ := ""
- if !local {
- if t, ok := w.curPackage.consts[ident.Name]; ok {
- typ = t.T
- }
- } else {
- litType := ""
- if vs.Type != nil {
- litType = w.nodeString(vs.Type)
- } else {
- litType = w.lastConstType
- if vs.Values != nil {
- if len(vs.Values) != 1 {
- if apiVerbose {
- log.Printf("const %q, values: %#v", ident.Name, vs.Values)
- }
- return nil, nil
- }
- var err error
- litType, err = w.constValueType(vs.Values[0])
- if err != nil {
- if apiVerbose {
- log.Printf("unknown kind in const %q (%T): %v", ident.Name, vs.Values[0], err)
- }
- litType = "unknown-type"
- }
- }
- }
- w.lastConstType = litType
- typ = litType
- w.localvar[ident.Name] = &ExprType{T: typ, X: ident}
- }
- if inRange(ident, p) {
- return &TypeInfo{Kind: KindConst, X: ident, Name: ident.Name, T: ident, Type: typ}, nil
- }
- }
- return nil, nil
-}
-
-func (w *Walker) lookupType(ts *ast.TypeSpec, p token.Pos, local bool) (*TypeInfo, error) {
- switch t := ts.Type.(type) {
- case *ast.StructType:
- if inRange(t.Fields, p) {
- for _, fd := range t.Fields.List {
- if inRange(fd.Type, p) {
- return w.lookupExprInfo(fd.Type, p)
- }
- for _, ident := range fd.Names {
- if inRange(ident, p) {
- return &TypeInfo{Kind: KindField, X: ident, Name: ts.Name.Name + "." + ident.Name, T: fd.Type, Type: w.nodeString(w.namelessType(fd.Type))}, nil
- }
- }
- }
- }
- return &TypeInfo{Kind: KindStruct, X: ts.Name, Name: ts.Name.Name, T: ts.Type, Type: "struct"}, nil
- case *ast.InterfaceType:
- if inRange(t.Methods, p) {
- for _, fd := range t.Methods.List {
- for _, ident := range fd.Names {
- if inRange(ident, p) {
- return &TypeInfo{Kind: KindMethod, X: ident, Name: ts.Name.Name + "." + ident.Name, T: ident, Type: w.nodeString(w.namelessType(fd.Type))}, nil
- }
- }
- if inRange(fd.Type, p) {
- return w.lookupExprInfo(fd.Type, p)
- }
- }
- }
- return &TypeInfo{Kind: KindInterface, X: ts.Name, Name: ts.Name.Name, T: ts.Type, Type: "interface"}, nil
- default:
- return &TypeInfo{Kind: KindType, X: ts.Name, Name: ts.Name.Name, T: ts.Type, Type: w.nodeString(w.namelessType(ts.Type))}, nil
- }
- return nil, nil
-}
-
-func (w *Walker) lookupDecl(di ast.Decl, p token.Pos, local bool) (*TypeInfo, error) {
- switch d := di.(type) {
- case *ast.GenDecl:
- switch d.Tok {
- case token.IMPORT:
- for _, sp := range d.Specs {
- is := sp.(*ast.ImportSpec)
- fpath, err := strconv.Unquote(is.Path.Value)
- if err != nil {
- return nil, err
- }
- name := path.Base(fpath)
- if is.Name != nil {
- name = is.Name.Name
- }
- if inRange(sp, p) {
- return &TypeInfo{Kind: KindImport, X: is.Name, Name: name, T: is.Name, Type: fpath}, nil
- }
- }
- case token.CONST:
- for _, sp := range d.Specs {
- if inRange(sp, p) {
- return w.lookupConst(sp.(*ast.ValueSpec), p, local)
- } else {
- w.lookupConst(sp.(*ast.ValueSpec), p, local)
- }
- }
- return nil, nil
- case token.TYPE:
- for _, sp := range d.Specs {
- if inRange(sp, p) {
- return w.lookupType(sp.(*ast.TypeSpec), p, local)
- } else {
- w.lookupType(sp.(*ast.TypeSpec), p, local)
- }
- }
- case token.VAR:
- for _, sp := range d.Specs {
- if inRange(sp, p) {
- return w.lookupVar(sp.(*ast.ValueSpec), p, local)
- } else {
- w.lookupVar(sp.(*ast.ValueSpec), p, local)
- }
- }
- return nil, nil
- default:
- return nil, fmt.Errorf("unknown token type %d %T in GenDecl", d.Tok, d)
- }
- case *ast.FuncDecl:
- if d.Type.Params != nil {
- for _, fd := range d.Type.Params.List {
- if inRange(fd, p) {
- return w.lookupExprInfo(fd.Type, p)
- }
- for _, ident := range fd.Names {
- if inRange(ident, p) {
- info, err := w.lookupExprInfo(fd.Type, p)
- if err == nil {
- return &TypeInfo{Kind: KindParam, X: ident, Name: ident.Name, T: info.T, Type: info.Type}, nil
- }
- }
- typ, err := w.varValueType(fd.Type, 0)
- if err == nil {
- w.localvar[ident.Name] = &ExprType{T: typ, X: ident}
- } else if apiVerbose {
- log.Println(err)
- }
- }
- }
- }
- if d.Type.Results != nil {
- for _, fd := range d.Type.Results.List {
- if inRange(fd, p) {
- return w.lookupExprInfo(fd.Type, p)
- }
- for _, ident := range fd.Names {
- typ, err := w.varValueType(fd.Type, 0)
- if err == nil {
- w.localvar[ident.Name] = &ExprType{T: typ, X: ident}
- }
- }
- }
- }
- if d.Recv != nil {
- for _, fd := range d.Recv.List {
- if inRange(fd, p) {
- return w.lookupExprInfo(fd.Type, p)
- }
- for _, ident := range fd.Names {
- w.localvar[ident.Name] = &ExprType{T: w.nodeString(fd.Type), X: ident}
- }
- }
- }
- if inRange(d.Body, p) {
- return w.lookupStmt(d.Body, p)
- }
- var fname = d.Name.Name
- kind := KindFunc
- if d.Recv != nil {
- recvTypeName, imp := baseTypeName(d.Recv.List[0].Type)
- if imp {
- return nil, nil
- }
- fname = recvTypeName + "." + d.Name.Name
- kind = KindMethod
- }
- return &TypeInfo{Kind: kind, X: d.Name, Name: fname, T: d.Type, Type: w.nodeString(w.namelessType(d.Type))}, nil
- default:
- return nil, fmt.Errorf("unhandled %T, %#v\n", di, di)
- }
- return nil, fmt.Errorf("not lookupDecl %v %T", w.nodeString(di), di)
-}
-
-func (w *Walker) lookupExprInfo(vi ast.Expr, p token.Pos) (*TypeInfo, error) {
- _, info, err := w.lookupExpr(vi, p)
- return info, err
-}
-
-// lookupExpr , return name,info,error
-func (w *Walker) lookupExpr(vi ast.Expr, p token.Pos) (string, *TypeInfo, error) {
- if apiVerbose {
- log.Printf("lookup expr %v %T", w.nodeString(vi), vi)
- }
- switch v := vi.(type) {
- case *ast.BasicLit:
- litType, ok := varType[v.Kind]
- if !ok {
- return "", nil, fmt.Errorf("unknown basic literal kind %#v", v)
- }
- name := v.Value
- if len(name) >= 128 {
- name = name[:128] + "..."
- }
- return litType, &TypeInfo{Kind: KindBuiltin, X: v, Name: name, T: v, Type: litType}, nil
- case *ast.StarExpr:
- s, info, err := w.lookupExpr(v.X, p)
- if err != nil {
- return "", nil, err
- }
- return "*" + s, &TypeInfo{Kind: info.Kind, X: v, Name: "*" + info.Name, T: info.T, Type: "*" + info.Type}, err
- case *ast.InterfaceType:
- return "interface{}", &TypeInfo{Kind: KindInterface, X: v, Name: w.nodeString(v), T: v, Type: "interface{}"}, nil
- case *ast.Ellipsis:
- s, info, err := w.lookupExpr(v.Elt, p)
- if err != nil {
- return "", nil, err
- }
- return "[]" + s, &TypeInfo{Kind: KindArray, X: v.Elt, Name: "..." + s, T: info.T, Type: "[]" + info.Type}, nil
- case *ast.KeyValueExpr:
- if inRange(v.Key, p) {
- return w.lookupExpr(v.Key, p)
- } else if inRange(v.Value, p) {
- return w.lookupExpr(v.Value, p)
- }
- case *ast.CompositeLit:
- typ, err := w.varValueType(v.Type, 0)
- if err == nil {
- typ = strings.TrimLeft(typ, "*")
- if strings.HasPrefix(typ, "[]") {
- typ = strings.TrimLeft(typ[2:], "*")
- }
- pos := strings.Index(typ, ".")
- var pt *Package = w.curPackage
- var pkgdot string
- if pos != -1 {
- pkg := typ[:pos]
- typ = typ[pos+1:]
- pt = w.findPackage(pkg)
- if pt != nil {
- pkgdot = pkg + "."
- }
- }
- if pt != nil {
- if ss, ok := pt.structs[typ]; ok {
- for _, elt := range v.Elts {
- if inRange(elt, p) {
- if cl, ok := elt.(*ast.CompositeLit); ok {
- for _, elt := range cl.Elts {
- if inRange(elt, p) {
- if kv, ok := elt.(*ast.KeyValueExpr); ok {
- if inRange(kv.Key, p) {
- n, t := w.findStructField(ss, w.nodeString(kv.Key))
- if n != nil {
- return pkgdot + typ + "." + w.nodeString(kv.Key), &TypeInfo{Kind: KindField, X: kv.Key, Name: pkgdot + typ + "." + w.nodeString(kv.Key), T: n, Type: w.nodeString(w.namelessType(t))}, nil
- }
- } else if inRange(kv.Value, p) {
- return w.lookupExpr(kv.Value, p)
- }
- }
- }
- }
- }
- if kv, ok := elt.(*ast.KeyValueExpr); ok {
- if inRange(kv.Key, p) {
- n, t := w.findStructField(ss, w.nodeString(kv.Key))
- if n != nil {
- return typ + "." + w.nodeString(kv.Key), &TypeInfo{Kind: KindField, X: kv.Key, Name: typ + "." + w.nodeString(kv.Key), T: n, Type: w.nodeString(w.namelessType(t))}, nil
- }
- } else if inRange(kv.Value, p) {
- return w.lookupExpr(kv.Value, p)
- }
- }
- }
- }
- }
- }
- }
- for _, elt := range v.Elts {
- if inRange(elt, p) {
- return w.lookupExpr(elt, p)
- }
- }
- return w.lookupExpr(v.Type, p)
- case *ast.UnaryExpr:
- s, info, err := w.lookupExpr(v.X, p)
- return v.Op.String() + s, info, err
- case *ast.TypeAssertExpr:
- if inRange(v.X, p) {
- return w.lookupExpr(v.X, p)
- }
- return w.lookupExpr(v.Type, p)
- case *ast.BinaryExpr:
- if inRange(v.X, p) {
- return w.lookupExpr(v.X, p)
- } else if inRange(v.Y, p) {
- return w.lookupExpr(v.Y, p)
- }
- return "", nil, nil
- case *ast.CallExpr:
- for _, arg := range v.Args {
- if inRange(arg, p) {
- return w.lookupExpr(arg, p)
- }
- }
- switch ft := v.Fun.(type) {
- case *ast.Ident:
- if typ, ok := w.localvar[ft.Name]; ok {
- return ft.Name, &TypeInfo{Kind: KindVar, X: ft, Name: ft.Name, T: typ.X, Type: typ.T}, nil
- }
- if typ, ok := w.curPackage.vars[ft.Name]; ok {
- return ft.Name, &TypeInfo{Kind: KindVar, X: v, Name: ft.Name, T: typ.X, Type: typ.T}, nil
- }
- if typ, ok := w.curPackage.functions[ft.Name]; ok {
- return ft.Name, &TypeInfo{Kind: KindFunc, X: ft, Name: ft.Name, T: typ.ft, Type: typ.sig}, nil
- }
- if typ, ok := w.curPackage.interfaces[ft.Name]; ok {
- return ft.Name, &TypeInfo{Kind: KindInterface, X: ft, Name: ft.Name, T: typ, Type: w.nodeString(w.namelessType(typ))}, nil
- }
- if typ, ok := w.curPackage.interfaces[ft.Name]; ok {
- return ft.Name, &TypeInfo{Kind: KindInterface, X: ft, Name: ft.Name, T: typ, Type: w.nodeString(w.namelessType(typ))}, nil
- }
- if typ, ok := w.curPackage.structs[ft.Name]; ok {
- return ft.Name, &TypeInfo{Kind: KindStruct, X: ft, Name: ft.Name, T: typ, Type: w.nodeString(w.namelessType(typ))}, nil
- }
- if typ, ok := w.curPackage.types[ft.Name]; ok {
- return ft.Name, &TypeInfo{Kind: KindType, X: ft, Name: ft.Name, T: typ, Type: w.nodeString(w.namelessType(typ))}, nil
- }
- if isBuiltinType(ft.Name) {
- return ft.Name, &TypeInfo{Kind: KindBuiltin, X: ft, Name: ft.Name}, nil
- }
- return "", nil, fmt.Errorf("lookup unknown ident %v", v)
- case *ast.FuncLit:
- if inRange(ft.Body, p) {
- info, err := w.lookupStmt(ft.Body, p)
- if err == nil {
- return "", info, nil
- }
- return "", nil, err
- }
- return w.lookupExpr(ft.Type, p)
- case *ast.ParenExpr:
- return w.lookupExpr(ft.X, p)
- case *ast.SelectorExpr:
- switch st := ft.X.(type) {
- case *ast.Ident:
- if inRange(st, p) {
- return w.lookupExpr(st, p)
- }
- s, info, err := w.lookupExpr(st, p)
- if err != nil {
- return "", nil, err
- }
- typ := info.Type
- if typ == "" {
- typ = s
- }
- fname := typ + "." + ft.Sel.Name
- typ = strings.TrimLeft(typ, "*")
- if fn, ok := w.curPackage.functions[fname]; ok {
- return fname, &TypeInfo{Kind: KindMethod, X: st, Name: fname, T: fn.ft, Type: w.nodeString(w.namelessType(fn.ft))}, nil
- }
- info, e := w.lookupFunction(typ, ft.Sel.Name)
- if e != nil {
- return "", nil, e
- }
- return fname, info, nil
- case *ast.SelectorExpr:
- if inRange(st.X, p) {
- return w.lookupExpr(st.X, p)
- }
- if inRange(st, p) {
- return w.lookupExpr(st, p)
- }
- typ, err := w.varValueType(st, 0)
- if err != nil {
- return "", nil, err
- }
- /*
- typ = strings.TrimLeft(typ, "*")
- if t := w.curPackage.findType(typ); t != nil {
- if ss, ok := t.(*ast.StructType); ok {
- for _, fi := range ss.Fields.List {
- for _, n := range fi.Names {
- if n.Name == st.Sel.Name {
- //return fname, &TypeInfo{Kind: KindField, X: n, Name: fname, T: fi.Type, Type: w.nodeString(w.namelessType(fi.Type))}, nil
- typ = w.nodeString(w.namelessType(fi.Type))
- }
- }
- }
- }
- }
- */
- info, e := w.lookupFunction(typ, ft.Sel.Name)
- if e != nil {
- return "", nil, e
- }
- return typ + "." + st.Sel.Name, info, nil
- case *ast.CallExpr:
- if inRange(st, p) {
- return w.lookupExpr(st, p)
- }
- if info, err := w.lookupExprInfo(st, p); err == nil {
- if fn, ok := info.X.(*ast.FuncType); ok {
- if fn.Results.NumFields() == 1 {
- info, err := w.lookupFunction(w.nodeString(fn.Results.List[0].Type), ft.Sel.Name)
- if err == nil {
- return info.Name, info, err
- }
- return "", nil, err
- }
- }
- }
- //w.lookupFunction(w.nodeString(info.X))
- typ, err := w.varValueType(st, 0)
- if err != nil {
- return "", nil, err
- }
- info, e := w.lookupFunction(typ, ft.Sel.Name)
- if e != nil {
- return "", nil, e
- }
- return typ + "." + ft.Sel.Name, info, nil
- case *ast.TypeAssertExpr:
- if inRange(st.X, p) {
- return w.lookupExpr(st.X, p)
- }
- typ := w.nodeString(w.namelessType(st.Type))
- info, e := w.lookupFunction(typ, ft.Sel.Name)
- if e != nil {
- return "", nil, e
- }
- return typ + "." + ft.Sel.Name, info, nil
- default:
- return "", nil, fmt.Errorf("not find select %v %T", v, st)
- }
- }
- return "", nil, fmt.Errorf("not find call %v %T", w.nodeString(v), v.Fun)
- case *ast.SelectorExpr:
- switch st := v.X.(type) {
- case *ast.Ident:
- if inRange(st, p) {
- return w.lookupExpr(st, p)
- }
- info, err := w.lookupSelector(st.Name, v.Sel.Name)
- if err != nil {
- return "", nil, err
- }
- return st.Name + "." + v.Sel.Name, info, nil
- // case *ast.CallExpr:
- // typ, err := w.varValueType(v.X, index)
- // if err == nil {
- // if strings.HasPrefix(typ, "*") {
- // typ = typ[1:]
- // }
- // t := w.curPackage.findType(typ)
- // if st, ok := t.(*ast.StructType); ok {
- // for _, fi := range st.Fields.List {
- // for _, n := range fi.Names {
- // if n.Name == v.Sel.Name {
- // return w.varValueType(fi.Type, index)
- // }
- // }
- // }
- // }
- // }
- case *ast.SelectorExpr:
- if inRange(st.X, p) {
- return w.lookupExpr(st.X, p)
- }
-
- if inRange(st, p) {
- return w.lookupExpr(st, p)
- }
-
- typ, err := w.varValueType(st, 0)
- if err == nil {
- info, err := w.lookupSelector(typ, v.Sel.Name)
- if err != nil {
- return "", nil, err
- }
- return typ + v.Sel.Name, info, nil
- }
- // case *ast.IndexExpr:
- // typ, err := w.varValueType(st.X, 0)
- // log.Println(typ, err)
- // if err == nil {
- // if strings.HasPrefix(typ, "[]") {
- // return w.varSelectorType(typ[2:], v.Sel.Name)
- // }
- // }
- }
- return "", nil, fmt.Errorf("unknown lookup selector expr: %T %s.%s", v.X, w.nodeString(v.X), v.Sel)
-
- // s, info, err := w.lookupExpr(v.X, p)
- // if err != nil {
- // return "", "", err
- // }
- // if strings.HasPrefix(s, "*") {
- // s = s[1:]
- // }
- // if inRange(v.X, p) {
- // return s, info, err
- // }
- // t := w.curPackage.findType(s)
- // fname := s + "." + v.Sel.Name
- // if st, ok := t.(*ast.StructType); ok {
- // for _, fi := range st.Fields.List {
- // for _, n := range fi.Names {
- // if n.Name == v.Sel.Name {
- // return fname, fmt.Sprintf("var,%s,%s,%s", fname, w.nodeString(w.namelessType(fi.Type)), w.fset.Position(n.Pos())), nil
- // }
- // }
- // }
- // }
- // log.Println(">>", s)
- // info, e := w.lookupSelector(s, v.Sel.Name)
- // return fname, info, e
- case *ast.Ident:
- if typ, ok := w.localvar[v.Name]; ok {
- return typ.T, &TypeInfo{Kind: KindVar, X: v, Name: v.Name, T: typ.X, Type: typ.T}, nil
- }
- if typ, ok := w.curPackage.interfaces[v.Name]; ok {
- return v.Name, &TypeInfo{Kind: KindInterface, X: v, Name: v.Name, T: typ, Type: "interface"}, nil
- }
- if typ, ok := w.curPackage.structs[v.Name]; ok {
- return v.Name, &TypeInfo{Kind: KindStruct, X: v, Name: v.Name, T: typ, Type: "struct"}, nil
- }
- if typ, ok := w.curPackage.types[v.Name]; ok {
- return v.Name, &TypeInfo{Kind: KindType, X: v, Name: v.Name, T: typ, Type: v.Name}, nil
- }
- if typ, ok := w.curPackage.vars[v.Name]; ok {
- return v.Name, &TypeInfo{Kind: KindVar, X: v, Name: v.Name, T: typ.X, Type: typ.T}, nil
- }
- if typ, ok := w.curPackage.consts[v.Name]; ok {
- return v.Name, &TypeInfo{Kind: KindConst, X: v, Name: v.Name, T: typ.X, Type: typ.T}, nil
- }
- if typ, ok := w.curPackage.functions[v.Name]; ok {
- return v.Name, &TypeInfo{Kind: KindFunc, X: typ.ft, Name: v.Name, T: typ.ft, Type: typ.sig}, nil
- }
- if p := w.findPackage(v.Name); p != nil {
- return v.Name, &TypeInfo{Kind: KindImport, X: v, Name: v.Name, Type: p.name}, nil
- }
- if isBuiltinType(v.Name) {
- return v.Name, &TypeInfo{Kind: KindBuiltin, Name: v.Name}, nil
- }
- return "", nil, fmt.Errorf("lookup unknown ident %v", v)
- //return v.Name, &TypeInfo{Kind: KindVar, X: v, Name: v.Name, T: v, Type: v.Name}, nil
- case *ast.IndexExpr:
- if inRange(v.Index, p) {
- return w.lookupExpr(v.Index, p)
- }
- return w.lookupExpr(v.X, p)
- case *ast.ParenExpr:
- return w.lookupExpr(v.X, p)
- case *ast.FuncLit:
- if inRange(v.Type, p) {
- return w.lookupExpr(v.Type, p)
- } else {
- w.lookupExpr(v.Type, p)
- }
- typ, err := w.varValueType(v.Type, 0)
- if err != nil {
- return "", nil, err
- }
- info, e := w.lookupStmt(v.Body, p)
- if e != nil {
- return "", nil, err
- }
- return typ, info, nil
- case *ast.FuncType:
- if v.Params != nil {
- for _, fd := range v.Params.List {
- if inRange(fd, p) {
- return w.lookupExpr(fd.Type, p)
- }
- for _, ident := range fd.Names {
- typ, err := w.varValueType(fd.Type, 0)
- if err == nil {
- w.localvar[ident.Name] = &ExprType{T: typ, X: ident}
- }
- }
- }
- }
- if v.Results != nil {
- for _, fd := range v.Results.List {
- if inRange(fd, p) {
- return w.lookupExpr(fd.Type, p)
- }
- for _, ident := range fd.Names {
- typ, err := w.varValueType(fd.Type, 0)
- if err == nil {
- w.localvar[ident.Name] = &ExprType{T: typ, X: ident}
- }
- }
- }
- }
- return "", nil, nil
- case *ast.ArrayType:
- s, info, err := w.lookupExpr(v.Elt, p)
- if err != nil {
- return "", nil, err
- }
- return "[]" + s, &TypeInfo{Kind: KindArray, Name: "[]" + info.Name, Type: "[]" + info.Type, T: info.T}, nil
- case *ast.SliceExpr:
- if inRange(v.High, p) {
- return w.lookupExpr(v.High, p)
- } else if inRange(v.Low, p) {
- return w.lookupExpr(v.Low, p)
- }
- return w.lookupExpr(v.X, p)
- case *ast.MapType:
- if inRange(v.Key, p) {
- return w.lookupExpr(v.Key, p)
- } else if inRange(v.Value, p) {
- return w.lookupExpr(v.Value, p)
- }
- typ, err := w.varValueType(v, 0)
- if err != nil {
- return "", nil, err
- }
- return typ, &TypeInfo{Kind: KindMap, X: v, Name: w.nodeString(v), T: v, Type: typ}, nil
- case *ast.ChanType:
- if inRange(v.Value, p) {
- return w.lookupExpr(v.Value, p)
- }
- typ, err := w.varValueType(v, 0)
- if err != nil {
- return "", nil, err
- }
- return typ, &TypeInfo{Kind: KindChan, X: v, Name: w.nodeString(v), T: v, Type: typ}, nil
- default:
- return "", nil, fmt.Errorf("not lookupExpr %v %T", w.nodeString(v), v)
- }
- return "", nil, fmt.Errorf("not lookupExpr %v %T", w.nodeString(vi), vi)
-}
-
-func (w *Walker) walkFile(file *ast.File) {
- // Not entering a scope here; file boundaries aren't interesting.
- for _, di := range file.Decls {
- switch d := di.(type) {
- case *ast.GenDecl:
- switch d.Tok {
- case token.IMPORT:
- for _, sp := range d.Specs {
- is := sp.(*ast.ImportSpec)
- fpath, err := strconv.Unquote(is.Path.Value)
- if err != nil {
- log.Fatal(err)
- }
- //name := path.Base(fpath)
- name := fpath
- if i := strings.LastIndexAny(name, ".-/\\"); i > 0 {
- name = name[i+1:]
- }
- if is.Name != nil {
- name = is.Name.Name
- }
- w.selectorFullPkg[name] = fpath
- }
- case token.CONST:
- for _, sp := range d.Specs {
- w.walkConst(sp.(*ast.ValueSpec))
- }
- case token.TYPE:
- for _, sp := range d.Specs {
- w.walkTypeSpec(sp.(*ast.TypeSpec))
- }
- case token.VAR:
- for _, sp := range d.Specs {
- w.walkVar(sp.(*ast.ValueSpec))
- }
- default:
- log.Fatalf("unknown token type %d in GenDecl", d.Tok)
- }
- case *ast.FuncDecl:
- // Ignore. Handled in subsequent pass, by go/doc.
- default:
- log.Printf("unhandled %T, %#v\n", di, di)
- printer.Fprint(os.Stderr, w.fset, di)
- os.Stderr.Write([]byte("\n"))
- }
- }
-}
-
-var constType = map[token.Token]string{
- token.INT: "ideal-int",
- token.FLOAT: "ideal-float",
- token.STRING: "ideal-string",
- token.CHAR: "ideal-char",
- token.IMAG: "ideal-imag",
-}
-
-var varType = map[token.Token]string{
- token.INT: "int",
- token.FLOAT: "float64",
- token.STRING: "string",
- token.CHAR: "rune",
- token.IMAG: "complex128",
-}
-
-var builtinTypes = []string{
- "bool", "byte", "complex64", "complex128", "error", "float32", "float64",
- "int", "int8", "int16", "int32", "int64", "rune", "string",
- "uint", "uint8", "uint16", "uint32", "uint64", "uintptr",
-}
-
-func isBuiltinType(typ string) bool {
- for _, v := range builtinTypes {
- if v == typ {
- return true
- }
- }
- return false
-}
-
-func constTypePriority(typ string) int {
- switch typ {
- case "complex128":
- return 100
- case "ideal-imag":
- return 99
- case "complex64":
- return 98
- case "float64":
- return 97
- case "ideal-float":
- return 96
- case "float32":
- return 95
- case "int64":
- return 94
- case "int", "uint", "uintptr":
- return 93
- case "ideal-int":
- return 92
- case "int16", "uint16", "int8", "uint8", "byte":
- return 91
- case "ideal-char":
- return 90
- }
- return 101
-}
-
-func (w *Walker) constRealType(typ string) string {
- pos := strings.Index(typ, ".")
- if pos >= 0 {
- pkg := typ[:pos]
- if pkg == "C" {
- return "int"
- }
- typ = typ[pos+1:]
- if p := w.findPackage(pkg); p != nil {
- ret := p.findType(typ)
- if ret != nil {
- return w.nodeString(w.namelessType(ret))
- }
- }
- } else {
- ret := w.curPackage.findType(typ)
- if ret != nil {
- return w.nodeString(w.namelessType(ret))
- }
- }
- return typ
-}
-
-func (w *Walker) constValueType(vi interface{}) (string, error) {
- switch v := vi.(type) {
- case *ast.BasicLit:
- litType, ok := constType[v.Kind]
- if !ok {
- return "", fmt.Errorf("unknown basic literal kind %#v", v)
- }
- return litType, nil
- case *ast.UnaryExpr:
- return w.constValueType(v.X)
- case *ast.SelectorExpr:
- lhs := w.nodeString(v.X)
- rhs := w.nodeString(v.Sel)
- //if CGO
- if lhs == "C" {
- return lhs + "." + rhs, nil
- }
- if p := w.findPackage(lhs); p != nil {
- if ret, ok := p.consts[rhs]; ok {
- return w.pkgRetType(p.name, ret.T), nil
- }
- }
- return "", fmt.Errorf("unknown constant reference to %s.%s", lhs, rhs)
- case *ast.Ident:
- if v.Name == "iota" {
- return "ideal-int", nil // hack.
- }
- if v.Name == "false" || v.Name == "true" {
- return "bool", nil
- }
- if t, ok := w.curPackage.consts[v.Name]; ok {
- return t.T, nil
- }
- return constDepPrefix + v.Name, nil
- case *ast.BinaryExpr:
- //== > < ! != >= <=
- if v.Op == token.EQL || v.Op == token.LSS || v.Op == token.GTR || v.Op == token.NOT ||
- v.Op == token.NEQ || v.Op == token.LEQ || v.Op == token.GEQ {
- return "bool", nil
- }
- left, err := w.constValueType(v.X)
- if err != nil {
- return "", err
- }
- if v.Op == token.SHL || v.Op == token.SHR {
- return left, err
- }
- right, err := w.constValueType(v.Y)
- if err != nil {
- return "", err
- }
- //const left != right , one or two is ideal-
- if left != right {
- if strings.HasPrefix(left, constDepPrefix) && strings.HasPrefix(right, constDepPrefix) {
- // Just pick one.
- // e.g. text/scanner GoTokens const-dependency:ScanIdents, const-dependency:ScanFloats
- return left, nil
- }
- lp := constTypePriority(w.constRealType(left))
- rp := constTypePriority(w.constRealType(right))
- if lp >= rp {
- return left, nil
- } else {
- return right, nil
- }
- return "", fmt.Errorf("in BinaryExpr, unhandled type mismatch; left=%q, right=%q", left, right)
- }
- return left, nil
- case *ast.CallExpr:
- // Not a call, but a type conversion.
- typ := w.nodeString(v.Fun)
- switch typ {
- case "complex":
- return "complex128", nil
- case "real", "imag":
- return "float64", nil
- }
- return typ, nil
- case *ast.ParenExpr:
- return w.constValueType(v.X)
- }
- return "", fmt.Errorf("unknown const value type %T", vi)
-}
-
-func (w *Walker) pkgRetType(pkg, ret string) string {
- pkg = pkg[strings.LastIndex(pkg, "/")+1:]
- if strings.HasPrefix(ret, "[]") {
- return "[]" + w.pkgRetType(pkg, ret[2:])
- }
- if strings.HasPrefix(ret, "*") {
- return "*" + w.pkgRetType(pkg, ret[1:])
- }
- if ast.IsExported(ret) {
- return pkg + "." + ret
- }
- return ret
-}
-
-func (w *Walker) findStructFieldType(st ast.Expr, name string) ast.Expr {
- _, expr := w.findStructField(st, name)
- return expr
-}
-
-func (w *Walker) findStructFieldFunction(st ast.Expr, name string) (*TypeInfo, error) {
- if s, ok := st.(*ast.StructType); ok {
- for _, fi := range s.Fields.List {
- typ := fi.Type
- if fi.Names == nil {
- switch v := typ.(type) {
- case *ast.Ident:
- if t := w.curPackage.findType(v.Name); t != nil {
- return w.lookupFunction(v.Name, name)
- }
- case *ast.SelectorExpr:
- pt := w.nodeString(typ)
- pos := strings.Index(pt, ".")
- if pos != -1 {
- if p := w.findPackage(pt[:pos]); p != nil {
- if t := p.findType(pt[pos+1:]); t != nil {
- return w.lookupFunction(pt, name)
- }
- }
- }
- case *ast.StarExpr:
- return w.findStructFieldFunction(v.X, name)
- default:
- if apiVerbose {
- log.Printf("unable to handle embedded %T", typ)
- }
- }
- }
- }
- }
- return nil, nil
-}
-
-func (w *Walker) findStructField(st ast.Expr, name string) (*ast.Ident, ast.Expr) {
- if s, ok := st.(*ast.StructType); ok {
- for _, fi := range s.Fields.List {
- typ := fi.Type
- for _, n := range fi.Names {
- if n.Name == name {
- return n, fi.Type
- }
- }
- if fi.Names == nil {
- switch v := typ.(type) {
- case *ast.Ident:
- if t := w.curPackage.findType(v.Name); t != nil {
- if v.Name == name {
- return v, v
- }
- id, expr := w.findStructField(t, name)
- if id != nil {
- return id, expr
- }
- }
- case *ast.StarExpr:
- switch vv := v.X.(type) {
- case *ast.Ident:
- if t := w.curPackage.findType(vv.Name); t != nil {
- if vv.Name == name {
- return vv, v.X
- }
- id, expr := w.findStructField(t, name)
- if id != nil {
- return id, expr
- }
- }
- case *ast.SelectorExpr:
- pt := w.nodeString(typ)
- pos := strings.Index(pt, ".")
- if pos != -1 {
- if p := w.findPackage(pt[:pos]); p != nil {
- if t := p.findType(pt[pos+1:]); t != nil {
- return w.findStructField(t, name)
- }
- }
- }
- default:
- if apiVerbose {
- log.Printf("unable to handle embedded starexpr before %T", typ)
- }
- }
- case *ast.SelectorExpr:
- pt := w.nodeString(typ)
- pos := strings.Index(pt, ".")
- if pos != -1 {
- if p := w.findPackage(pt[:pos]); p != nil {
- if t := p.findType(pt[pos+1:]); t != nil {
- return w.findStructField(t, name)
- }
- }
- }
- default:
- if apiVerbose {
- log.Printf("unable to handle embedded %T", typ)
- }
- }
- }
- }
- }
- return nil, nil
-}
-
-func (w *Walker) lookupFunction(name, sel string) (*TypeInfo, error) {
- name = strings.TrimLeft(name, "*")
- if p := w.findPackage(name); p != nil {
- fn := p.findCallFunc(sel)
- if fn != nil {
- return &TypeInfo{Kind: KindFunc, X: fn, Name: name + "." + sel, T: fn, Type: w.nodeString(w.namelessType(fn))}, nil
- }
- }
- pos := strings.Index(name, ".")
- if pos != -1 {
- pkg := name[:pos]
- typ := name[pos+1:]
- if p := w.findPackage(pkg); p != nil {
- if ident, fn := p.findMethod(typ, sel); fn != nil {
- return &TypeInfo{Kind: KindMethod, X: fn, Name: name + "." + sel, T: ident, Type: w.nodeString(w.namelessType(fn))}, nil
- }
- }
- return nil, fmt.Errorf("not lookup pkg type function pkg: %s, %s. %s. %s", name, pkg, typ, sel)
- }
-
- //find local var.func()
- if ns, nt, n := w.resolveName(name); n >= 0 {
- var vt string
- if nt != nil {
- vt = w.nodeString(w.namelessType(nt))
- } else if ns != nil {
- typ, err := w.varValueType(ns, n)
- if err == nil {
- vt = typ
- }
- } else {
- typ := w.curPackage.findSelectorType(name)
- if typ != nil {
- vt = w.nodeString(w.namelessType(typ))
- }
- }
- if strings.HasPrefix(vt, "*") {
- vt = vt[1:]
- }
- if vt == "error" && sel == "Error" {
- return &TypeInfo{Kind: KindBuiltin, Name: "error.Error", Type: "()string"}, nil
- }
- if fn, ok := w.curPackage.functions[vt+"."+sel]; ok {
- return &TypeInfo{Kind: KindMethod, X: fn.ft, Name: name + "." + sel, T: fn.ft, Type: w.nodeString(w.namelessType(fn))}, nil
- }
- }
- if typ, ok := w.curPackage.structs[name]; ok {
- if fn, ok := w.curPackage.functions[name+"."+sel]; ok {
- return &TypeInfo{Kind: KindMethod, X: fn.ft, Name: name + "." + sel, T: fn.ft, Type: w.nodeString(w.namelessType(fn.ft))}, nil
- }
- if info, err := w.findStructFieldFunction(typ, sel); err == nil {
- return info, nil
- }
- // struct field is type function
- if ft := w.findStructFieldType(typ, sel); ft != nil {
- typ, err := w.varValueType(ft, 0)
- if err != nil {
- typ = w.nodeString(ft)
- }
- return &TypeInfo{Kind: KindField, X: ft, Name: name + "." + sel, T: ft, Type: typ}, nil
- }
- }
-
- if ident, fn := w.curPackage.findMethod(name, sel); ident != nil && fn != nil {
- return &TypeInfo{Kind: KindMethod, X: fn, Name: name + "." + sel, T: ident, Type: w.nodeString(w.namelessType(fn))}, nil
- }
-
- if p := w.findPackage(name); p != nil {
- fn := p.findCallFunc(sel)
- if fn != nil {
- return &TypeInfo{Kind: KindFunc, X: fn, Name: name + "." + sel, T: fn, Type: w.nodeString(w.namelessType(fn))}, nil
- }
- return nil, fmt.Errorf("not find pkg func0 %v.%v", p.name, sel)
- }
- return nil, fmt.Errorf("not lookup func %v.%v", name, sel)
-}
-
-func (w *Walker) varFunctionType(name, sel string, index int) (string, error) {
- name = strings.TrimLeft(name, "*")
- pos := strings.Index(name, ".")
- if pos != -1 {
- pkg := name[:pos]
- typ := name[pos+1:]
-
- if p := w.findPackage(pkg); p != nil {
- _, fn := p.findMethod(typ, sel)
- if fn != nil {
- ret := funcRetType(fn, index)
- if ret != nil {
- return w.pkgRetType(p.name, w.nodeString(w.namelessType(ret))), nil
- }
- }
- }
- return "", fmt.Errorf("unknown pkg type function pkg: %s.%s.%s", pkg, typ, sel)
- }
- //find local var
- if v, ok := w.localvar[name]; ok {
- vt := v.T
- if strings.HasPrefix(vt, "*") {
- vt = vt[1:]
- }
- if vt == "error" && sel == "Error" {
- return "string", nil
- }
- typ, err := w.varFunctionType(vt, sel, 0)
- if err == nil {
- return typ, nil
- }
- }
- //find global var.func()
- if ns, nt, n := w.resolveName(name); n >= 0 {
- var vt string
- if nt != nil {
- vt = w.nodeString(w.namelessType(nt))
- } else if ns != nil {
- typ, err := w.varValueType(ns, n)
- if err == nil {
- vt = typ
- }
- } else {
- typ := w.curPackage.findSelectorType(name)
- if typ != nil {
- vt = w.nodeString(w.namelessType(typ))
- }
- }
- if strings.HasPrefix(vt, "*") {
- vt = vt[1:]
- }
- if vt == "error" && sel == "Error" {
- return "string", nil
- }
- if fn, ok := w.curPackage.functions[vt+"."+sel]; ok {
- return w.nodeString(w.namelessType(funcRetType(fn.ft, index))), nil
- }
- }
- if typ, ok := w.curPackage.structs[name]; ok {
- if ft := w.findStructFieldType(typ, sel); ft != nil {
- return w.varValueType(ft, index)
- }
- }
- //find pkg.func()
- if p := w.findPackage(name); p != nil {
- typ := p.findCallType(sel, index)
- if typ != nil {
- return w.pkgRetType(p.name, w.nodeString(w.namelessType(typ))), nil
- }
- //log.Println("->", p.functions)
- return "", fmt.Errorf("not find pkg func1 %v . %v", p.name, sel)
- }
- return "", fmt.Errorf("not find func %v.%v", name, sel)
-}
-
-func (w *Walker) lookupSelector(name string, sel string) (*TypeInfo, error) {
- name = strings.TrimLeft(name, "*")
- pos := strings.Index(name, ".")
- if pos != -1 {
- pkg := name[:pos]
- typ := name[pos+1:]
- if p := w.findPackage(pkg); p != nil {
- t := p.findType(typ)
- if t != nil {
- typ := w.findStructFieldType(t, sel)
- if typ != nil {
- return &TypeInfo{Kind: KindField, X: typ, Name: name + "." + sel, T: typ, Type: w.pkgRetType(p.name, w.nodeString(w.namelessType(typ)))}, nil
- }
- }
- }
- return nil, fmt.Errorf("lookup unknown pkg type selector pkg: %s.%s %s", pkg, typ, sel)
- }
-
- if lv, ok := w.localvar[name]; ok {
- return w.lookupSelector(lv.T, sel)
- }
-
- vs, vt, n := w.resolveName(name)
- if n >= 0 {
- var typ string
- if vt != nil {
- typ = w.nodeString(w.namelessType(vt))
- } else {
- typ, _ = w.varValueType(vs, n)
- }
- if strings.HasPrefix(typ, "*") {
- typ = typ[1:]
- }
- //typ is type, find real type
- for k, v := range w.curPackage.types {
- if k == typ {
- typ = w.nodeString(w.namelessType(v))
- }
- }
- pos := strings.Index(typ, ".")
- if pos == -1 {
- t := w.curPackage.findType(typ)
- if t != nil {
- typ := w.findStructFieldType(t, sel)
- if typ != nil {
- return &TypeInfo{Kind: KindField, X: typ, Name: name + "." + sel, T: typ, Type: w.nodeString(w.namelessType(typ))}, nil
- }
- }
- } else {
- name := typ[:pos]
- typ = typ[pos+1:]
- if p := w.findPackage(name); p != nil {
- t := p.findType(typ)
- if t != nil {
- typ := w.findStructFieldType(t, sel)
- if typ != nil {
- return &TypeInfo{Kind: KindField, X: typ, Name: name + "." + sel, T: typ, Type: w.nodeString(w.namelessType(typ))}, nil
- }
- }
- }
- }
- }
- if p := w.findPackage(name); p != nil {
- typ := p.findSelectorType(sel)
- if typ != nil {
- return &TypeInfo{Kind: KindType, X: typ, Name: name + "." + sel, T: typ, Type: w.pkgRetType(p.name, w.nodeString(w.namelessType(typ)))}, nil
- }
- }
- t := w.curPackage.findType(name)
- if t != nil {
- typ := w.findStructFieldType(t, sel)
- if typ != nil {
- return &TypeInfo{Kind: KindField, X: typ, Name: name + "." + sel, T: typ, Type: w.nodeString(w.namelessType(typ))}, nil
- }
- }
- if t, ok := w.curPackage.types[name]; ok {
- return w.lookupSelector(w.nodeString(t), sel)
- }
- return nil, fmt.Errorf("unknown selector expr ident: %s.%s", name, sel)
-}
-
-func (w *Walker) varSelectorType(name string, sel string) (string, error) {
- name = strings.TrimLeft(name, "*")
- pos := strings.Index(name, ".")
- if pos != -1 {
- pkg := name[:pos]
- typ := name[pos+1:]
- if p := w.findPackage(pkg); p != nil {
- t := p.findType(typ)
- if t != nil {
- typ := w.findStructFieldType(t, sel)
- if typ != nil {
- return w.pkgRetType(pkg, w.nodeString(w.namelessType(typ))), nil
- }
- }
- }
- return "", fmt.Errorf("unknown pkg type selector pkg: %s.%s.%s", pkg, typ, sel)
- }
- //check local
- if lv, ok := w.localvar[name]; ok {
- return w.varSelectorType(lv.T, sel)
- }
- //check struct
- if t := w.curPackage.findType(name); t != nil {
- typ := w.findStructFieldType(t, sel)
- if typ != nil {
- return w.nodeString(w.namelessType(typ)), nil
- }
- }
- //check var
- vs, vt, n := w.resolveName(name)
- if n >= 0 {
- var typ string
- if vt != nil {
- typ = w.nodeString(w.namelessType(vt))
- } else {
- typ, _ = w.varValueType(vs, n)
- }
- if strings.HasPrefix(typ, "*") {
- typ = typ[1:]
- }
- //typ is type, find real type
- for k, v := range w.curPackage.types {
- if k == typ {
- typ = w.nodeString(w.namelessType(v))
- }
- }
- pos := strings.Index(typ, ".")
- if pos == -1 {
- t := w.curPackage.findType(typ)
- if t != nil {
- typ := w.findStructFieldType(t, sel)
- if typ != nil {
- return w.nodeString(w.namelessType(typ)), nil
- }
- }
- } else {
- name := typ[:pos]
- typ = typ[pos+1:]
- if p := w.findPackage(name); p != nil {
- t := p.findType(typ)
- if t != nil {
- typ := w.findStructFieldType(t, sel)
- if typ != nil {
- return w.nodeString(w.namelessType(typ)), nil
- }
- }
- }
- }
- }
-
- if p := w.findPackage(name); p != nil {
- typ := p.findSelectorType(sel)
- if typ != nil {
- return w.pkgRetType(p.name, w.nodeString(w.namelessType(typ))), nil
- }
- }
- return "", fmt.Errorf("unknown var selector expr ident: %s.%s", name, sel)
-}
-
-func (w *Walker) varValueType(vi ast.Expr, index int) (string, error) {
- if vi == nil {
- return "", nil
- }
- switch v := vi.(type) {
- case *ast.BasicLit:
- litType, ok := varType[v.Kind]
- if !ok {
- return "", fmt.Errorf("unknown basic literal kind %#v", v)
- }
- return litType, nil
- case *ast.CompositeLit:
- return w.nodeString(v.Type), nil
- case *ast.FuncLit:
- return w.nodeString(w.namelessType(v.Type)), nil
- case *ast.InterfaceType:
- return w.nodeString(v), nil
- case *ast.Ellipsis:
- typ, err := w.varValueType(v.Elt, index)
- if err != nil {
- return "", err
- }
- return "[]" + typ, nil
- case *ast.StarExpr:
- typ, err := w.varValueType(v.X, index)
- if err != nil {
- return "", err
- }
- return "*" + typ, err
- case *ast.UnaryExpr:
- if v.Op == token.AND {
- typ, err := w.varValueType(v.X, index)
- return "*" + typ, err
- }
- return "", fmt.Errorf("unknown unary expr: %#v", v)
- case *ast.SelectorExpr:
- switch st := v.X.(type) {
- case *ast.Ident:
- return w.varSelectorType(st.Name, v.Sel.Name)
- case *ast.CallExpr:
- typ, err := w.varValueType(v.X, index)
- if err == nil {
- if strings.HasPrefix(typ, "*") {
- typ = typ[1:]
- }
- t := w.curPackage.findType(typ)
- if st, ok := t.(*ast.StructType); ok {
- for _, fi := range st.Fields.List {
- for _, n := range fi.Names {
- if n.Name == v.Sel.Name {
- return w.varValueType(fi.Type, index)
- }
- }
- }
- }
- }
- case *ast.SelectorExpr:
- typ, err := w.varValueType(v.X, index)
- if err == nil {
- return w.varSelectorType(typ, v.Sel.Name)
- }
- case *ast.IndexExpr:
- typ, err := w.varValueType(st.X, index)
- if err == nil {
- if strings.HasPrefix(typ, "[]") {
- return w.varSelectorType(typ[2:], v.Sel.Name)
- }
- }
- case *ast.CompositeLit:
- typ, err := w.varValueType(st.Type, 0)
- if err == nil {
- //log.Println(typ, v.Sel.Name)
- t, err := w.varSelectorType(typ, v.Sel.Name)
- if err == nil {
- return t, nil
- }
- }
- }
- return "", fmt.Errorf("var unknown selector expr: %T %s.%s", v.X, w.nodeString(v.X), v.Sel)
- case *ast.Ident:
- if v.Name == "true" || v.Name == "false" {
- return "bool", nil
- }
- if isBuiltinType(v.Name) {
- return v.Name, nil
- }
- if lv, ok := w.localvar[v.Name]; ok {
- return lv.T, nil
- }
- vt := w.curPackage.findType(v.Name)
- if vt != nil {
- if _, ok := vt.(*ast.StructType); ok {
- return v.Name, nil
- }
- return w.nodeString(vt), nil
- }
- vs, _, n := w.resolveName(v.Name)
- if n >= 0 {
- return w.varValueType(vs, n)
- }
- return "", fmt.Errorf("unresolved identifier: %q", v.Name)
- case *ast.BinaryExpr:
- //== > < ! != >= <=
- if v.Op == token.EQL || v.Op == token.LSS || v.Op == token.GTR || v.Op == token.NOT ||
- v.Op == token.NEQ || v.Op == token.LEQ || v.Op == token.GEQ {
- return "bool", nil
- }
- left, err := w.varValueType(v.X, index)
- if err != nil {
- return "", err
- }
- right, err := w.varValueType(v.Y, index)
- if err != nil {
- return "", err
- }
- if left != right {
- return "", fmt.Errorf("in BinaryExpr, unhandled type mismatch; left=%q, right=%q", left, right)
- }
- return left, nil
- case *ast.ParenExpr:
- return w.varValueType(v.X, index)
- case *ast.CallExpr:
- switch ft := v.Fun.(type) {
- case *ast.ArrayType:
- return w.nodeString(v.Fun), nil
- case *ast.Ident:
- switch ft.Name {
- case "make":
- return w.nodeString(w.namelessType(v.Args[0])), nil
- case "new":
- return "*" + w.nodeString(w.namelessType(v.Args[0])), nil
- case "append":
- return w.varValueType(v.Args[0], 0)
- case "recover":
- return "interface{}", nil
- case "len", "cap", "copy":
- return "int", nil
- case "complex":
- return "complex128", nil
- case "real":
- return "float64", nil
- case "imag":
- return "float64", nil
- }
- if isBuiltinType(ft.Name) {
- return ft.Name, nil
- }
- typ := w.curPackage.findCallType(ft.Name, index)
- if typ != nil {
- return w.nodeString(w.namelessType(typ)), nil
- }
- //if local var type
- if fn, ok := w.localvar[ft.Name]; ok {
- typ := fn.T
- if strings.HasPrefix(typ, "func(") {
- expr, err := parser.ParseExpr(typ + "{}")
- if err == nil {
- if fl, ok := expr.(*ast.FuncLit); ok {
- retType := funcRetType(fl.Type, index)
- if retType != nil {
- return w.nodeString(w.namelessType(retType)), nil
- }
- }
- }
- }
- }
- //if var is func() type
- vs, _, n := w.resolveName(ft.Name)
- if n >= 0 {
- if vs != nil {
- typ, err := w.varValueType(vs, n)
- if err == nil {
- if strings.HasPrefix(typ, "func(") {
- expr, err := parser.ParseExpr(typ + "{}")
- if err == nil {
- if fl, ok := expr.(*ast.FuncLit); ok {
- retType := funcRetType(fl.Type, index)
- if retType != nil {
- return w.nodeString(w.namelessType(retType)), nil
- }
- }
- }
- }
- }
- }
- }
- return "", fmt.Errorf("unknown funcion %s %s", w.curPackageName, ft.Name)
- case *ast.SelectorExpr:
- typ, err := w.varValueType(ft.X, index)
- if err == nil {
- if strings.HasPrefix(typ, "*") {
- typ = typ[1:]
- }
- retType := w.curPackage.findCallType(typ+"."+ft.Sel.Name, index)
- if retType != nil {
- return w.nodeString(w.namelessType(retType)), nil
- }
- }
- switch st := ft.X.(type) {
- case *ast.Ident:
- return w.varFunctionType(st.Name, ft.Sel.Name, index)
- case *ast.CallExpr:
- typ, err := w.varValueType(st, 0)
- if err != nil {
- return "", err
- }
- return w.varFunctionType(typ, ft.Sel.Name, index)
- case *ast.SelectorExpr:
- typ, err := w.varValueType(st, index)
- if err == nil {
- return w.varFunctionType(typ, ft.Sel.Name, index)
- }
- case *ast.IndexExpr:
- typ, err := w.varValueType(st.X, index)
- if err == nil {
- if strings.HasPrefix(typ, "[]") {
- return w.varFunctionType(typ[2:], ft.Sel.Name, index)
- }
- }
- case *ast.TypeAssertExpr:
- typ := w.nodeString(w.namelessType(st.Type))
- typ = strings.TrimLeft(typ, "*")
- return w.varFunctionType(typ, ft.Sel.Name, index)
- }
- return "", fmt.Errorf("unknown var function selector %v %T", w.nodeString(ft.X), ft.X)
- case *ast.FuncLit:
- retType := funcRetType(ft.Type, index)
- if retType != nil {
- return w.nodeString(w.namelessType(retType)), nil
- }
- case *ast.CallExpr:
- typ, err := w.varValueType(v.Fun, 0)
- if err == nil && strings.HasPrefix(typ, "func(") {
- expr, err := parser.ParseExpr(typ + "{}")
- if err == nil {
- if fl, ok := expr.(*ast.FuncLit); ok {
- retType := funcRetType(fl.Type, index)
- if retType != nil {
- return w.nodeString(w.namelessType(retType)), nil
- }
- }
- }
- }
- }
- return "", fmt.Errorf("not a known function %T %v", v.Fun, w.nodeString(v.Fun))
- case *ast.MapType:
- return fmt.Sprintf("map[%s](%s)", w.nodeString(w.namelessType(v.Key)), w.nodeString(w.namelessType(v.Value))), nil
- case *ast.ArrayType:
- return fmt.Sprintf("[]%s", w.nodeString(w.namelessType(v.Elt))), nil
- case *ast.FuncType:
- return w.nodeString(w.namelessType(v)), nil
- case *ast.IndexExpr:
- typ, err := w.varValueType(v.X, index)
- typ = strings.TrimLeft(typ, "*")
- if err == nil {
- if index == 0 {
- return typ, nil
- } else if index == 1 {
- return "bool", nil
- }
- if strings.HasPrefix(typ, "[]") {
- return typ[2:], nil
- } else if strings.HasPrefix(typ, "map[") {
- node, err := parser.ParseExpr(typ + "{}")
- if err == nil {
- if cl, ok := node.(*ast.CompositeLit); ok {
- if m, ok := cl.Type.(*ast.MapType); ok {
- return w.nodeString(w.namelessType(m.Value)), nil
- }
- }
- }
- }
- }
- return "", fmt.Errorf("unknown index %v %v %v %v", typ, v.X, index, err)
- case *ast.SliceExpr:
- return w.varValueType(v.X, index)
- case *ast.ChanType:
- typ, err := w.varValueType(v.Value, index)
- if err == nil {
- if v.Dir == ast.RECV {
- return "<-chan " + typ, nil
- } else if v.Dir == ast.SEND {
- return "chan<- " + typ, nil
- }
- return "chan " + typ, nil
- }
- case *ast.TypeAssertExpr:
- if index == 1 {
- return "bool", nil
- }
- return w.nodeString(w.namelessType(v.Type)), nil
- default:
- return "", fmt.Errorf("unknown value type %v %T", w.nodeString(vi), vi)
- }
- //panic("unreachable")
- return "", fmt.Errorf("unreachable value type %v %T", vi, vi)
-}
-
-// resolveName finds a top-level node named name and returns the node
-// v and its type t, if known.
-func (w *Walker) resolveName(name string) (v ast.Expr, t interface{}, n int) {
- for _, file := range w.curPackage.apkg.Files {
- for _, di := range file.Decls {
- switch d := di.(type) {
- case *ast.GenDecl:
- switch d.Tok {
- case token.VAR:
- for _, sp := range d.Specs {
- vs := sp.(*ast.ValueSpec)
- for i, vname := range vs.Names {
- if vname.Name == name {
- if len(vs.Values) == 1 {
- return vs.Values[0], vs.Type, i
- }
- return nil, vs.Type, i
- }
- }
- }
- }
- }
- }
- }
- return nil, nil, -1
-}
-
-// constDepPrefix is a magic prefix that is used by constValueType
-// and walkConst to signal that a type isn't known yet. These are
-// resolved at the end of walking of a package's files.
-const constDepPrefix = "const-dependency:"
-
-func (w *Walker) walkConst(vs *ast.ValueSpec) {
- for _, ident := range vs.Names {
- if !w.isExtract(ident.Name) {
- continue
- }
- litType := ""
- if vs.Type != nil {
- litType = w.nodeString(vs.Type)
- } else {
- litType = w.lastConstType
- if vs.Values != nil {
- if len(vs.Values) != 1 {
- log.Fatalf("const %q, values: %#v", ident.Name, vs.Values)
- }
- var err error
- litType, err = w.constValueType(vs.Values[0])
- if err != nil {
- if apiVerbose {
- log.Printf("unknown kind in const %q (%T): %v", ident.Name, vs.Values[0], err)
- }
- litType = "unknown-type"
- }
- }
- }
- if strings.HasPrefix(litType, constDepPrefix) {
- dep := litType[len(constDepPrefix):]
- w.constDep[ident.Name] = &ExprType{T: dep, X: ident}
- continue
- }
- if litType == "" {
- if apiVerbose {
- log.Printf("unknown kind in const %q", ident.Name)
- }
- continue
- }
- w.lastConstType = litType
-
- w.curPackage.consts[ident.Name] = &ExprType{T: litType, X: ident}
-
- if isExtract(ident.Name) {
- w.emitFeature(fmt.Sprintf("const %s %s", ident, litType), ident.Pos())
- }
- }
-}
-
-func (w *Walker) resolveConstantDeps() {
- var findConstType func(string) string
- findConstType = func(ident string) string {
- if dep, ok := w.constDep[ident]; ok {
- return findConstType(dep.T)
- }
- if t, ok := w.curPackage.consts[ident]; ok {
- return t.T
- }
- return ""
- }
- for ident, info := range w.constDep {
- if !isExtract(ident) {
- continue
- }
- t := findConstType(ident)
- if t == "" {
- if apiVerbose {
- log.Printf("failed to resolve constant %q", ident)
- }
- continue
- }
- w.curPackage.consts[ident] = &ExprType{T: t, X: info.X}
- w.emitFeature(fmt.Sprintf("const %s %s", ident, t), info.X.Pos())
- }
-}
-
-func (w *Walker) walkVar(vs *ast.ValueSpec) {
- if vs.Type != nil {
- typ := w.nodeString(vs.Type)
- for _, ident := range vs.Names {
- w.curPackage.vars[ident.Name] = &ExprType{T: typ, X: ident}
- if isExtract(ident.Name) {
- w.emitFeature(fmt.Sprintf("var %s %s", ident, typ), ident.Pos())
- }
- }
- } else if len(vs.Names) == len(vs.Values) {
- for n, ident := range vs.Names {
- if !w.isExtract(ident.Name) {
- continue
- }
- typ, err := w.varValueType(vs.Values[n], n)
- if err != nil {
- if apiVerbose {
- log.Printf("unknown type of variable0 %q, type %T, error = %v, pos=%s",
- ident.Name, vs.Values[n], err, w.fset.Position(vs.Pos()))
- }
- typ = "unknown-type"
- }
- w.curPackage.vars[ident.Name] = &ExprType{T: typ, X: ident}
- if isExtract(ident.Name) {
- w.emitFeature(fmt.Sprintf("var %s %s", ident, typ), ident.Pos())
- }
- }
- } else if len(vs.Values) == 1 {
- for n, ident := range vs.Names {
- if !w.isExtract(ident.Name) {
- continue
- }
- typ, err := w.varValueType(vs.Values[0], n)
- if err != nil {
- if apiVerbose {
- log.Printf("unknown type of variable1 %q, type %T, error = %v, pos=%s",
- ident.Name, vs.Values[0], err, w.fset.Position(vs.Pos()))
- }
- typ = "unknown-type"
- }
- w.curPackage.vars[ident.Name] = &ExprType{T: typ, X: ident}
- if isExtract(ident.Name) {
- w.emitFeature(fmt.Sprintf("var %s %s", ident, typ), ident.Pos())
- }
- }
- }
-}
-
-func (w *Walker) nodeString(node interface{}) string {
- if node == nil {
- return ""
- }
- var b bytes.Buffer
- printer.Fprint(&b, w.fset, node)
- return b.String()
-}
-
-func (w *Walker) nodeDebug(node interface{}) string {
- if node == nil {
- return ""
- }
- var b bytes.Buffer
- ast.Fprint(&b, w.fset, node, nil)
- return b.String()
-}
-
-func (w *Walker) noteInterface(name string, it *ast.InterfaceType) {
- w.interfaces[pkgSymbol{w.curPackageName, name}] = it
-}
-
-func (w *Walker) walkTypeSpec(ts *ast.TypeSpec) {
- name := ts.Name.Name
- if !isExtract(name) {
- return
- }
- switch t := ts.Type.(type) {
- case *ast.StructType:
- w.walkStructType(name, t)
- case *ast.InterfaceType:
- w.walkInterfaceType(name, t)
- default:
- w.emitFeature(fmt.Sprintf("type %s %s", name, w.nodeString(ts.Type)), t.Pos()-token.Pos(len(name)+1))
- }
-}
-
-func (w *Walker) walkStructType(name string, t *ast.StructType) {
- typeStruct := fmt.Sprintf("type %s struct", name)
- w.emitFeature(typeStruct, t.Pos()-token.Pos(len(name)+1))
- pop := w.pushScope(typeStruct)
- defer pop()
- for _, f := range t.Fields.List {
- typ := f.Type
- for _, name := range f.Names {
- if isExtract(name.Name) {
- w.emitFeature(fmt.Sprintf("%s %s", name, w.nodeString(w.namelessType(typ))), name.Pos())
- }
- }
- if f.Names == nil {
- switch v := typ.(type) {
- case *ast.Ident:
- if isExtract(v.Name) {
- w.emitFeature(fmt.Sprintf("embedded %s", v.Name), v.Pos())
- }
- case *ast.StarExpr:
- switch vv := v.X.(type) {
- case *ast.Ident:
- if isExtract(vv.Name) {
- w.emitFeature(fmt.Sprintf("embedded *%s", vv.Name), vv.Pos())
- }
- case *ast.SelectorExpr:
- w.emitFeature(fmt.Sprintf("embedded %s", w.nodeString(typ)), v.Pos())
- default:
- log.Fatalf("unable to handle embedded starexpr before %T", typ)
- }
- case *ast.SelectorExpr:
- w.emitFeature(fmt.Sprintf("embedded %s", w.nodeString(typ)), v.Pos())
- default:
- if apiVerbose {
- log.Printf("unable to handle embedded %T", typ)
- }
- }
- }
- }
-}
-
-// typeMethod is a method of an interface.
-type typeMethod struct {
- name string // "Read"
- sig string // "([]byte) (int, error)", from funcSigString
- ft *ast.FuncType
- pos token.Pos
- recv ast.Expr
-}
-
-// interfaceMethods returns the expanded list of exported methods for an interface.
-// The boolean complete reports whether the list contains all methods (that is, the
-// interface has no unexported methods).
-// pkg is the complete package name ("net/http")
-// iname is the interface name.
-func (w *Walker) interfaceMethods(pkg, iname string) (methods []typeMethod, complete bool) {
- t, ok := w.interfaces[pkgSymbol{pkg, iname}]
- if !ok {
- if apiVerbose {
- log.Printf("failed to find interface %s.%s", pkg, iname)
- }
- return
- }
-
- complete = true
- for _, f := range t.Methods.List {
- typ := f.Type
- switch tv := typ.(type) {
- case *ast.FuncType:
- for _, mname := range f.Names {
- if isExtract(mname.Name) {
- ft := typ.(*ast.FuncType)
- methods = append(methods, typeMethod{
- name: mname.Name,
- sig: w.funcSigString(ft),
- ft: ft,
- pos: f.Pos(),
- })
- } else {
- complete = false
- }
- }
- case *ast.Ident:
- embedded := typ.(*ast.Ident).Name
- if embedded == "error" {
- methods = append(methods, typeMethod{
- name: "Error",
- sig: "() string",
- ft: &ast.FuncType{
- Params: nil,
- Results: &ast.FieldList{
- List: []*ast.Field{
- &ast.Field{
- Type: &ast.Ident{
- Name: "string",
- },
- },
- },
- },
- },
- pos: f.Pos(),
- })
- continue
- }
- if !isExtract(embedded) {
- log.Fatalf("unexported embedded interface %q in exported interface %s.%s; confused",
- embedded, pkg, iname)
- }
- m, c := w.interfaceMethods(pkg, embedded)
- methods = append(methods, m...)
- complete = complete && c
- case *ast.SelectorExpr:
- lhs := w.nodeString(tv.X)
- rhs := w.nodeString(tv.Sel)
- fpkg, ok := w.selectorFullPkg[lhs]
- if !ok {
- log.Fatalf("can't resolve selector %q in interface %s.%s", lhs, pkg, iname)
- }
- m, c := w.interfaceMethods(fpkg, rhs)
- methods = append(methods, m...)
- complete = complete && c
- default:
- log.Fatalf("unknown type %T in interface field", typ)
- }
- }
- return
-}
-
-func (w *Walker) walkInterfaceType(name string, t *ast.InterfaceType) {
- methNames := []string{}
- pop := w.pushScope("type " + name + " interface")
- methods, complete := w.interfaceMethods(w.curPackageName, name)
- w.packageMap[w.curPackageName].interfaceMethods[name] = methods
- for _, m := range methods {
- methNames = append(methNames, m.name)
- w.emitFeature(fmt.Sprintf("%s%s", m.name, m.sig), m.pos)
- }
- if !complete {
- // The method set has unexported methods, so all the
- // implementations are provided by the same package,
- // so the method set can be extended. Instead of recording
- // the full set of names (below), record only that there were
- // unexported methods. (If the interface shrinks, we will notice
- // because a method signature emitted during the last loop,
- // will disappear.)
- w.emitFeature("unexported methods", 0)
- }
- pop()
-
- if !complete {
- return
- }
-
- sort.Strings(methNames)
- if len(methNames) == 0 {
- w.emitFeature(fmt.Sprintf("type %s interface {}", name), t.Pos()-token.Pos(len(name)+1))
- } else {
- w.emitFeature(fmt.Sprintf("type %s interface { %s }", name, strings.Join(methNames, ", ")), t.Pos()-token.Pos(len(name)+1))
- }
-}
-
-func baseTypeName(x ast.Expr) (name string, imported bool) {
- switch t := x.(type) {
- case *ast.Ident:
- return t.Name, false
- case *ast.SelectorExpr:
- if _, ok := t.X.(*ast.Ident); ok {
- // only possible for qualified type names;
- // assume type is imported
- return t.Sel.Name, true
- }
- case *ast.StarExpr:
- return baseTypeName(t.X)
- }
- return
-}
-
-func (w *Walker) peekFuncDecl(f *ast.FuncDecl) {
- var fname = f.Name.Name
- var recv ast.Expr
- if f.Recv != nil {
- recvTypeName, imp := baseTypeName(f.Recv.List[0].Type)
- if imp {
- return
- }
- fname = recvTypeName + "." + f.Name.Name
- recv = f.Recv.List[0].Type
- }
- // Record return type for later use.
- //if f.Type.Results != nil && len(f.Type.Results.List) >= 1 {
- // record all function
- w.curPackage.functions[fname] = typeMethod{
- name: fname,
- sig: w.funcSigString(f.Type),
- ft: f.Type,
- pos: f.Pos(),
- recv: recv,
- }
- //}
-}
-
-func (w *Walker) walkFuncDecl(f *ast.FuncDecl) {
- if !w.isExtract(f.Name.Name) {
- return
- }
- if f.Recv != nil {
- // Method.
- recvType := w.nodeString(f.Recv.List[0].Type)
- keep := isExtract(recvType) ||
- (strings.HasPrefix(recvType, "*") &&
- isExtract(recvType[1:]))
- if !keep {
- return
- }
- w.emitFeature(fmt.Sprintf("method (%s) %s%s", recvType, f.Name.Name, w.funcSigString(f.Type)), f.Name.Pos())
- return
- }
- // Else, a function
- w.emitFeature(fmt.Sprintf("func %s%s", f.Name.Name, w.funcSigString(f.Type)), f.Name.Pos())
-}
-
-func (w *Walker) funcSigString(ft *ast.FuncType) string {
- var b bytes.Buffer
- writeField := func(b *bytes.Buffer, f *ast.Field) {
- if n := len(f.Names); n > 1 {
- for i := 0; i < n; i++ {
- if i > 0 {
- b.WriteString(", ")
- }
- b.WriteString(w.nodeString(w.namelessType(f.Type)))
- }
- } else {
- b.WriteString(w.nodeString(w.namelessType(f.Type)))
- }
- }
- b.WriteByte('(')
- if ft.Params != nil {
- for i, f := range ft.Params.List {
- if i > 0 {
- b.WriteString(", ")
- }
- writeField(&b, f)
- }
- }
- b.WriteByte(')')
- if ft.Results != nil {
- nr := 0
- for _, f := range ft.Results.List {
- if n := len(f.Names); n > 1 {
- nr += n
- } else {
- nr++
- }
- }
- if nr > 0 {
- b.WriteByte(' ')
- if nr > 1 {
- b.WriteByte('(')
- }
- for i, f := range ft.Results.List {
- if i > 0 {
- b.WriteString(", ")
- }
- writeField(&b, f)
- }
- if nr > 1 {
- b.WriteByte(')')
- }
- }
- }
- return b.String()
-}
-
-// namelessType returns a type node that lacks any variable names.
-func (w *Walker) namelessType(t interface{}) interface{} {
- ft, ok := t.(*ast.FuncType)
- if !ok {
- return t
- }
- return &ast.FuncType{
- Params: w.namelessFieldList(ft.Params),
- Results: w.namelessFieldList(ft.Results),
- }
-}
-
-// namelessFieldList returns a deep clone of fl, with the cloned fields
-// lacking names.
-func (w *Walker) namelessFieldList(fl *ast.FieldList) *ast.FieldList {
- fl2 := &ast.FieldList{}
- if fl != nil {
- for _, f := range fl.List {
- n := len(f.Names)
- if n >= 1 {
- for i := 0; i < n; i++ {
- fl2.List = append(fl2.List, w.namelessField(f))
- }
- } else {
- fl2.List = append(fl2.List, w.namelessField(f))
- }
- }
- }
- return fl2
-}
-
-// namelessField clones f, but not preserving the names of fields.
-// (comments and tags are also ignored)
-func (w *Walker) namelessField(f *ast.Field) *ast.Field {
- return &ast.Field{
- Type: f.Type,
- }
-}
-
-func (w *Walker) emitFeature(feature string, pos token.Pos) {
- if !w.wantedPkg[w.curPackage.name] {
- return
- }
- more := strings.Index(feature, "\n")
- if more != -1 {
- if len(feature) <= 1024 {
- feature = strings.Replace(feature, "\n", " ", 1)
- feature = strings.Replace(feature, "\n", ";", -1)
- feature = strings.Replace(feature, "\t", " ", -1)
- } else {
- feature = feature[:more] + " ...more"
- if apiVerbose {
- log.Printf("feature contains newlines: %v, %s", feature, w.fset.Position(pos))
- }
- }
- }
- f := strings.Join(w.scope, w.sep) + w.sep + feature
-
- if _, dup := w.curPackage.features[f]; dup {
- return
- }
- w.curPackage.features[f] = pos
-}
-
-func strListContains(l []string, s string) bool {
- for _, v := range l {
- if v == s {
- return true
- }
- }
- return false
-}
-
-const goosList = "darwin freebsd linux netbsd openbsd plan9 windows "
-const goarchList = "386 amd64 arm "
-
-// goodOSArchFile returns false if the name contains a $GOOS or $GOARCH
-// suffix which does not match the current system.
-// The recognized name formats are:
-//
-// name_$(GOOS).*
-// name_$(GOARCH).*
-// name_$(GOOS)_$(GOARCH).*
-// name_$(GOOS)_test.*
-// name_$(GOARCH)_test.*
-// name_$(GOOS)_$(GOARCH)_test.*
-//
-func isOSArchFile(ctxt *build.Context, name string) bool {
- if dot := strings.Index(name, "."); dot != -1 {
- name = name[:dot]
- }
- l := strings.Split(name, "_")
- if n := len(l); n > 0 && l[n-1] == "test" {
- l = l[:n-1]
- }
- n := len(l)
- if n >= 2 && knownOS[l[n-2]] && knownArch[l[n-1]] {
- return l[n-2] == ctxt.GOOS && l[n-1] == ctxt.GOARCH
- }
- if n >= 1 && knownOS[l[n-1]] {
- return l[n-1] == ctxt.GOOS
- }
- if n >= 1 && knownArch[l[n-1]] {
- return l[n-1] == ctxt.GOARCH
- }
- return false
-}
-
-var knownOS = make(map[string]bool)
-var knownArch = make(map[string]bool)
-
-func init() {
- for _, v := range strings.Fields(goosList) {
- knownOS[v] = true
- }
- for _, v := range strings.Fields(goarchList) {
- knownArch[v] = true
- }
-}
diff --git a/vendor/github.com/visualfc/gotools/godiff/godiff.go b/vendor/github.com/visualfc/gotools/godiff/godiff.go
deleted file mode 100644
index f4169aa..0000000
--- a/vendor/github.com/visualfc/gotools/godiff/godiff.go
+++ /dev/null
@@ -1,64 +0,0 @@
-// Copyright 2011-2015 visualfc . All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package godiff
-
-import (
- "io/ioutil"
- "os"
- "os/exec"
-
- "github.com/pmezard/go-difflib/difflib"
-)
-
-func UnifiedDiffLines(a []string, b []string) (string, error) {
- diff := difflib.UnifiedDiff{
- A: a,
- B: b,
- FromFile: "Original",
- ToFile: "Current",
- Context: 3,
- Eol: "\n",
- }
- return difflib.GetUnifiedDiffString(diff)
-}
-
-func UnifiedDiffString(a string, b string) (string, error) {
- diff := difflib.UnifiedDiff{
- A: difflib.SplitLines(a),
- B: difflib.SplitLines(b),
- FromFile: "Original",
- ToFile: "Current",
- Context: 3,
- Eol: "\n",
- }
- return difflib.GetUnifiedDiffString(diff)
-}
-
-func UnifiedDiffBytesByCmd(b1, b2 []byte) (data []byte, err error) {
- f1, err := ioutil.TempFile("", "godiff")
- if err != nil {
- return
- }
- defer os.Remove(f1.Name())
- defer f1.Close()
-
- f2, err := ioutil.TempFile("", "godiff")
- if err != nil {
- return
- }
- defer os.Remove(f2.Name())
- defer f2.Close()
-
- f1.Write(b1)
- f2.Write(b2)
-
- data, err = exec.Command("diff", "-u", f1.Name(), f2.Name()).CombinedOutput()
- if len(data) > 0 {
- // diff exits with a non-zero status when the files don't match.
- // Ignore that failure as long as we get output.
- err = nil
- }
- return
-}
diff --git a/vendor/github.com/visualfc/gotools/gofmt/gofmt.go b/vendor/github.com/visualfc/gotools/gofmt/gofmt.go
deleted file mode 100644
index af10755..0000000
--- a/vendor/github.com/visualfc/gotools/gofmt/gofmt.go
+++ /dev/null
@@ -1,198 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package gofmt
-
-import (
- "bytes"
- "fmt"
- "go/scanner"
- "go/token"
- "io"
- "io/ioutil"
- "os"
- "path/filepath"
- "runtime"
- "strings"
- "sync"
-
- "github.com/visualfc/gotools/command"
- "github.com/visualfc/gotools/godiff"
- "golang.org/x/tools/imports"
-)
-
-var Command = &command.Command{
- Run: runGofmt,
- UsageLine: "gofmt [flags] [path ...]",
- Short: "gofmt formats Go source.",
- Long: `gofmt formats Go source`,
-}
-
-var (
- gofmtList bool
- gofmtWrite bool
- gofmtDiff bool
- gofmtAllErrors bool
- gofmtFixImports bool
- gofmtSortImports bool
- gofmtUseGodiffLib bool
-
- // layout control
- gofmtComments bool
- gofmtTabWidth int
- gofmtTabIndent bool
-)
-
-//func init
-func init() {
- Command.Flag.BoolVar(&gofmtList, "l", false, "list files whose formatting differs from goimport's")
- Command.Flag.BoolVar(&gofmtWrite, "w", false, "write result to (source) file instead of stdout")
- Command.Flag.BoolVar(&gofmtDiff, "d", false, "display diffs instead of rewriting files")
- Command.Flag.BoolVar(&gofmtAllErrors, "e", false, "report all errors (not just the first 10 on different lines)")
- Command.Flag.BoolVar(&gofmtFixImports, "fiximports", false, "updates Go import lines, adding missing ones and removing unreferenced ones")
- Command.Flag.BoolVar(&gofmtSortImports, "sortimports", false, "sort Go import lines use goimports style")
- Command.Flag.BoolVar(&gofmtUseGodiffLib, "godiff", true, "diff use godiff library")
-
- // layout control
- Command.Flag.BoolVar(&gofmtComments, "comments", true, "print comments")
- Command.Flag.IntVar(&gofmtTabWidth, "tabwidth", 8, "tab width")
- Command.Flag.BoolVar(&gofmtTabIndent, "tabs", true, "indent with tabs")
-}
-
-var (
- fileSet = token.NewFileSet() // per process FileSet
- exitCode = 0
-
- initModesOnce sync.Once // guards calling initModes
- //parserMode parser.Mode
- //printerMode printer.Mode
- options *imports.Options
-)
-
-func report(err error) {
- scanner.PrintError(os.Stderr, err)
- exitCode = 2
-}
-
-func runGofmt(cmd *command.Command, args []string) error {
- runtime.GOMAXPROCS(runtime.NumCPU())
-
- if gofmtTabWidth < 0 {
- fmt.Fprintf(os.Stderr, "negative tabwidth %d\n", gofmtTabWidth)
- exitCode = 2
- os.Exit(exitCode)
- return os.ErrInvalid
- }
-
- if gofmtFixImports {
- gofmtSortImports = true
- }
-
- options = &imports.Options{
- FormatOnly: !gofmtFixImports,
- TabWidth: gofmtTabWidth,
- TabIndent: gofmtTabIndent,
- Comments: gofmtComments,
- AllErrors: gofmtAllErrors,
- Fragment: true,
- }
-
- if len(args) == 0 {
- if err := processFile("", os.Stdin, os.Stdout, true); err != nil {
- report(err)
- }
- } else {
- for _, path := range args {
- switch dir, err := os.Stat(path); {
- case err != nil:
- report(err)
- case dir.IsDir():
- walkDir(path)
- default:
- if err := processFile(path, nil, os.Stdout, false); err != nil {
- report(err)
- }
- }
- }
- }
- os.Exit(exitCode)
- return nil
-}
-
-func isGoFile(f os.FileInfo) bool {
- // ignore non-Go files
- name := f.Name()
- return !f.IsDir() && !strings.HasPrefix(name, ".") && strings.HasSuffix(name, ".go")
-}
-
-func processFile(filename string, in io.Reader, out io.Writer, stdin bool) error {
- if in == nil {
- f, err := os.Open(filename)
- if err != nil {
- return err
- }
- defer f.Close()
- in = f
- }
-
- src, err := ioutil.ReadAll(in)
- if err != nil {
- return err
- }
-
- res, err := imports.Process(filename, src, options)
- if err != nil {
- return err
- }
-
- if !bytes.Equal(src, res) {
- // formatting has changed
- if gofmtList {
- fmt.Fprintln(out, filename)
- }
- if gofmtWrite {
- err = ioutil.WriteFile(filename, res, 0)
- if err != nil {
- return err
- }
- }
- if gofmtDiff {
- if gofmtUseGodiffLib {
- data, err := godiff.UnifiedDiffString(string(src), string(res))
- if err != nil {
- return fmt.Errorf("computing diff: %s", err)
- }
- fmt.Printf("diff %s gofmt/%s\n", filename, filename)
- out.Write([]byte(data))
- } else {
- data, err := godiff.UnifiedDiffBytesByCmd(src, res)
- if err != nil {
- return fmt.Errorf("computing diff: %s", err)
- }
- fmt.Printf("diff %s gofmt/%s\n", filename, filename)
- out.Write(data)
- }
- }
- }
-
- if !gofmtList && !gofmtWrite && !gofmtDiff {
- _, err = out.Write(res)
- }
-
- return err
-}
-
-func visitFile(path string, f os.FileInfo, err error) error {
- if err == nil && isGoFile(f) {
- err = processFile(path, nil, os.Stdout, false)
- }
- if err != nil {
- report(err)
- }
- return nil
-}
-
-func walkDir(path string) {
- filepath.Walk(path, visitFile)
-}
diff --git a/vendor/github.com/visualfc/gotools/gopresent/gopresent.go b/vendor/github.com/visualfc/gotools/gopresent/gopresent.go
deleted file mode 100644
index e0242a2..0000000
--- a/vendor/github.com/visualfc/gotools/gopresent/gopresent.go
+++ /dev/null
@@ -1,383 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-//modify 2013-2014 visualfc
-
-package gopresent
-
-import (
- "fmt"
- "html/template"
- "io"
- "os"
- "path/filepath"
-
- "github.com/visualfc/gotools/command"
- "golang.org/x/tools/present"
-)
-
-var Command = &command.Command{
- Run: runPresent,
- UsageLine: "gopresent",
- Short: "golang present util",
- Long: `golang present util`,
-}
-
-var presentVerifyOnly bool
-var presentInput string
-var presentStdout bool
-var presentOutput string
-
-func init() {
- Command.Flag.BoolVar(&presentVerifyOnly, "v", false, "verify present only")
- Command.Flag.BoolVar(&presentStdout, "stdout", false, "output use std output")
- Command.Flag.StringVar(&presentInput, "i", "", "input golang present file")
- Command.Flag.StringVar(&presentOutput, "o", "", "output html file name")
-}
-
-func runPresent(cmd *command.Command, args []string) error {
- if presentInput == "" || !isDoc(presentInput) {
- cmd.Usage()
- return os.ErrInvalid
- }
-
- if presentVerifyOnly {
- err := VerifyDoc(presentInput)
- if err != nil {
- fmt.Fprintf(os.Stderr, "present:%s", err)
- command.SetExitStatus(3)
- command.Exit()
- }
- return nil
- }
- w := os.Stdout
- if !presentStdout {
- if presentOutput == "" {
- presentOutput = presentInput + ".html"
- }
- ext := filepath.Ext(presentOutput)
- if ext != ".htm" && ext != ".html" {
- presentOutput += ".html"
- }
- var err error
- w, err = os.Create(presentOutput)
- if err != nil {
- fmt.Fprintf(os.Stderr, "present:%s", err)
- command.SetExitStatus(3)
- command.Exit()
- }
- }
- err := RenderDoc(w, presentInput)
- if err != nil {
- fmt.Fprintf(os.Stderr, "present:%s", err)
- command.SetExitStatus(3)
- command.Exit()
- }
- return nil
-}
-
-var extensions = map[string]string{
- ".slide": "slides.tmpl",
- ".article": "article.tmpl",
-}
-
-var extensions_tmpl = map[string]string{
- ".slide": slides_tmpl,
- ".article": article_tmpl,
-}
-
-func isDoc(path string) bool {
- _, ok := extensions[filepath.Ext(path)]
- return ok
-}
-
-func VerifyDoc(docFile string) error {
- doc, err := parse(docFile, 0)
- if err != nil {
- return err
- }
- dir := filepath.Dir(docFile)
- return verify_doc(dir, doc)
-}
-
-// renderDoc reads the present file, builds its template representation,
-// and executes the template, sending output to w.
-func renderDoc(w io.Writer, base, docFile string) error {
- // Read the input and build the doc structure.
- doc, err := parse(docFile, 0)
- if err != nil {
- return err
- }
-
- // Find which template should be executed.
- ext := filepath.Ext(docFile)
- contentTmpl, ok := extensions[ext]
- if !ok {
- return fmt.Errorf("no template for extension %v", ext)
- }
-
- // Locate the template file.
- actionTmpl := filepath.Join(base, "templates/action.tmpl")
- contentTmpl = filepath.Join(base, "templates", contentTmpl)
-
- // Read and parse the input.
- tmpl := present.Template()
- tmpl = tmpl.Funcs(template.FuncMap{"playable": playable})
- if _, err := tmpl.ParseFiles(actionTmpl, contentTmpl); err != nil {
- return err
- }
- // Execute the template.
- return doc.Render(w, tmpl)
-}
-
-func RenderDoc(w io.Writer, docFile string) error {
- // Read the input and build the doc structure.
- doc, err := parse(docFile, 0)
- if err != nil {
- return err
- }
-
- // Find which template should be executed.
- ext := filepath.Ext(docFile)
- contentTmpl, ok := extensions_tmpl[ext]
- if !ok {
- return fmt.Errorf("no template for extension %v", ext)
- }
-
- // Locate the template file.
- actionTmpl := action_tmpl //filepath.Join(base, "templates/action.tmpl")
- // Read and parse the input.
- tmpl := present.Template()
- tmpl = tmpl.Funcs(template.FuncMap{"playable": playable})
- if tmpl, err = tmpl.New("action").Parse(actionTmpl); err != nil {
- return err
- }
- if tmpl, err = tmpl.New("content").Parse(contentTmpl); err != nil {
- return err
- }
-
- // Execute the template.
- return doc.Render(w, tmpl)
-}
-
-func parse(name string, mode present.ParseMode) (*present.Doc, error) {
- f, err := os.Open(name)
- if err != nil {
- return nil, err
- }
- defer f.Close()
- return present.Parse(f, name, 0)
-}
-
-func playable(c present.Code) bool {
- return present.PlayEnabled && c.Play
-}
-
-func isSkipURL(url string) bool {
- if filepath.HasPrefix(url, "http://") {
- return true
- }
- if filepath.HasPrefix(url, "https://") {
- return true
- }
- return false
-}
-
-func verify_path(root string, url string) error {
- if isSkipURL(url) {
- return nil
- }
- path := url
- if !filepath.IsAbs(url) {
- path = filepath.Join(root, path)
- }
- _, err := os.Stat(path)
- if err != nil {
- return err
- }
- return nil
-}
-
-func verify_doc(root string, doc *present.Doc) error {
- for _, section := range doc.Sections {
- for _, elem := range section.Elem {
- switch i := elem.(type) {
- case present.Image:
- if err := verify_path(root, i.URL); err != nil {
- return fmt.Errorf("! .image %s not exist", i.URL)
- }
- }
- }
- }
- return nil
-}
-
-var action_tmpl = `
-{/*
-This is the action template.
-It determines how the formatting actions are rendered.
-*/}
-
-{{define "section"}}
- {{.FormattedNumber}} {{.Title}}
- {{range .Elem}}{{elem $.Template .}}{{end}}
-{{end}}
-
-{{define "list"}}
-
- {{range .Bullet}}
- {{style .}}
- {{end}}
-
-{{end}}
-
-{{define "text"}}
- {{if .Pre}}
- {{range .Lines}}{{.}}{{end}}
- {{else}}
-
- {{range $i, $l := .Lines}}{{if $i}}{{template "newline"}}
- {{end}}{{style $l}}{{end}}
-
- {{end}}
-{{end}}
-
-{{define "code"}}
- {{.Text}}
-{{end}}
-
-{{define "image"}}
-
-
-
-{{end}}
-
-{{define "iframe"}}
-
-{{end}}
-
-{{define "link"}}{{style .Label}}
{{end}}
-
-{{define "html"}}{{.HTML}}{{end}}
-`
-
-var article_tmpl = `
-{/* This is the article template. It defines how articles are formatted. */}
-
-{{define "root"}}
-
-
-
- {{.Title}}
-
-
-
-
-
-
-
-
{{.Title}}
- {{with .Subtitle}}{{.}}{{end}}
-
-
-
-
-
- {{with .Sections}}
-
- {{template "TOC" .}}
-
- {{end}}
-
- {{range .Sections}}
- {{elem $.Template .}}
- {{end}}{{/* of Section block */}}
-
-
Authors
- {{range .Authors}}
-
- {{range .Elem}}{{elem $.Template .}}{{end}}
-
- {{end}}
-
-
-
-
-
-{{end}}
-
-{{define "TOC"}}
-
- {{range .}}
- {{.Title}}
- {{with .Sections}}{{template "TOC" .}}{{end}}
- {{end}}
-
-{{end}}
-
-{{define "newline"}}
-{{/* No automatic line break. Paragraphs are free-form. */}}
-{{end}}
-`
-
-var slides_tmpl = `
-{/* This is the slide template. It defines how presentations are formatted. */}
-
-{{define "root"}}
-
-
-
- {{.Title}}
-
-
-
-
-
-
-
-
-
- {{.Title}}
- {{with .Subtitle}}{{.}} {{end}}
- {{if not .Time.IsZero}}{{.Time.Format "2 January 2006"}} {{end}}
- {{range .Authors}}
-
- {{range .TextElem}}{{elem $.Template .}}{{end}}
-
- {{end}}
-
-
- {{range $i, $s := .Sections}}
-
-
- {{if $s.Elem}}
- {{$s.Title}}
- {{range $s.Elem}}{{elem $.Template .}}{{end}}
- {{else}}
- {{$s.Title}}
- {{end}}
-
-
- {{end}}{{/* of Slide block */}}
-
-
- Thank you
- {{range .Authors}}
-
- {{range .Elem}}{{elem $.Template .}}{{end}}
-
- {{end}}
-
-
-
- {{if .PlayEnabled}}
-
- {{end}}
-
-{{end}}
-
-{{define "newline"}}
-
-{{end}}
-`
diff --git a/vendor/github.com/visualfc/gotools/gotest/gotest.go b/vendor/github.com/visualfc/gotools/gotest/gotest.go
deleted file mode 100644
index 5098686..0000000
--- a/vendor/github.com/visualfc/gotools/gotest/gotest.go
+++ /dev/null
@@ -1,99 +0,0 @@
-// Copyright 2011-2015 visualfc . All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package gotest
-
-import (
- "fmt"
- "go/build"
- "os"
- "os/exec"
- "strings"
-
- "github.com/visualfc/gotools/command"
-)
-
-var Command = &command.Command{
- Run: runGotest,
- UsageLine: "gotest -f filename [build/test flags]",
- Short: "go test go filename",
- Long: `go test go filename`,
- CustomFlags: true,
-}
-
-var testFileName string
-var testFileArgs string
-
-//func init() {
-// Command.Flag.StringVar(&testFileName, "f", "", "test go filename")
-//}
-
-func runGotest(cmd *command.Command, args []string) error {
- index := -1
- for n, arg := range args {
- if arg == "-f" {
- index = n
- break
- }
- }
- if index >= 0 && index < len(args) {
- testFileName = args[index+1]
- var r []string
- r = append(r, args[0:index]...)
- r = append(r, args[index+2:]...)
- args = r
- }
-
- if testFileName == "" {
- cmd.Usage()
- return os.ErrInvalid
- }
- if !strings.HasSuffix(testFileName, "_test.go") {
- fmt.Println("The test filename must xxx_test.go")
- return os.ErrInvalid
- }
-
- pkg, err := build.ImportDir(".", 0)
- if err != nil {
- fmt.Println("import dir error", err)
- return err
- }
-
- var testFiles []string
-
- for _, file := range pkg.XTestGoFiles {
- if file == testFileName {
- testFiles = append(testFiles, file)
- break
- }
- }
- for _, file := range pkg.TestGoFiles {
- if file == testFileName {
- testFiles = append(testFiles, pkg.GoFiles...)
- testFiles = append(testFiles, file)
- break
- }
- }
-
- gobin, err := exec.LookPath("go")
- if err != nil {
- fmt.Println("error look go", err)
- return err
- }
-
- var testArgs []string
- testArgs = append(testArgs, "test")
- if len(args) > 0 {
- testArgs = append(testArgs, args...)
- }
- testArgs = append(testArgs, testFiles...)
-
- command := exec.Command(gobin, testArgs...)
- command.Dir = pkg.Dir
- command.Stdin = os.Stdin
- command.Stdout = os.Stdout
- command.Stderr = os.Stderr
-
- return command.Run()
-}
diff --git a/vendor/github.com/visualfc/gotools/jsonfmt/jsonfmt.go b/vendor/github.com/visualfc/gotools/jsonfmt/jsonfmt.go
deleted file mode 100644
index f9657ef..0000000
--- a/vendor/github.com/visualfc/gotools/jsonfmt/jsonfmt.go
+++ /dev/null
@@ -1,206 +0,0 @@
-// Copyright 2011-2015 visualfc . All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package jsonfmt
-
-import (
- "bytes"
- "encoding/json"
- "fmt"
- "io"
- "io/ioutil"
- "os"
- "os/exec"
- "path/filepath"
- "strings"
-
- "github.com/visualfc/gotools/command"
-)
-
-var Command = &command.Command{
- Run: runJsonFmt,
- UsageLine: "jsonfmt",
- Short: "json format util",
- Long: `json format util.`,
-}
-
-var (
- jsonFmtList bool
- jsonFmtCompact bool
- jsonFmtWrite bool
- jsonFmtDiff bool
- jsonTabWidth int
- jsonTabIndent bool
-)
-
-func init() {
- Command.Flag.BoolVar(&jsonFmtList, "l", false, "list files whose formatting differs")
- Command.Flag.BoolVar(&jsonFmtCompact, "c", false, "compact json")
- Command.Flag.BoolVar(&jsonFmtWrite, "w", false, "write result to (source) file instead of stdout")
- Command.Flag.BoolVar(&jsonFmtDiff, "d", false, "display diffs instead of rewriting files")
- Command.Flag.IntVar(&jsonTabWidth, "tabwidth", 4, "tab width")
- Command.Flag.BoolVar(&jsonTabIndent, "tabs", false, "indent with tabs")
-}
-
-func runJsonFmt(cmd *command.Command, args []string) error {
- opt := &JsonFmtOption{}
- opt.List = jsonFmtList
- opt.Compact = jsonFmtCompact
- opt.IndentTab = jsonTabIndent
- opt.TabWidth = jsonTabWidth
- opt.Write = jsonFmtWrite
- opt.Diff = jsonFmtDiff
-
- if len(args) == 0 {
- if err := processJsonFile("", os.Stdin, os.Stdout, true, opt); err != nil {
- reportJsonError(err)
- }
- } else {
- for _, path := range args {
- switch dir, err := os.Stat(path); {
- case err != nil:
- reportJsonError(err)
- case dir.IsDir():
- filepath.Walk(path, func(path string, f os.FileInfo, err error) error {
- if err == nil && isJsonFile(f) {
- err = processJsonFile(path, nil, os.Stdout, false, opt)
- }
- if err != nil {
- reportJsonError(err)
- }
- return nil
- })
- default:
- if err := processJsonFile(path, nil, os.Stdout, false, opt); err != nil {
- reportJsonError(err)
- }
- }
- }
- }
- return nil
-}
-
-type JsonFmtOption struct {
- List bool
- Compact bool
- Format bool
- Write bool
- Diff bool
- IndentTab bool
- TabWidth int
-}
-
-func isJsonFile(f os.FileInfo) bool {
- // ignore non-Go files
- name := f.Name()
- return !f.IsDir() && !strings.HasPrefix(name, ".") && strings.HasSuffix(name, ".json")
-}
-
-func reportJsonError(err error) {
- fmt.Fprintf(os.Stderr, "%s\n", err)
- os.Exit(2)
-}
-
-func processJson(filename string, src []byte, opt *JsonFmtOption) ([]byte, error) {
- if opt.Compact {
- var out bytes.Buffer
- err := json.Compact(&out, src)
- if err != nil {
- return nil, err
- }
- return out.Bytes(), nil
- } else {
- var out bytes.Buffer
- var err error
- if opt.IndentTab {
- err = json.Indent(&out, src, "", "\t")
- } else {
- var indent string
- for i := 0; i < opt.TabWidth; i++ {
- indent += " "
- }
- err = json.Indent(&out, src, "", indent)
- }
- if err != nil {
- return nil, err
- }
- return out.Bytes(), nil
- }
- return src, nil
-}
-
-func processJsonFile(filename string, in io.Reader, out io.Writer, stdin bool, opt *JsonFmtOption) error {
- if in == nil {
- f, err := os.Open(filename)
- if err != nil {
- return err
- }
- defer f.Close()
- in = f
- }
-
- src, err := ioutil.ReadAll(in)
- if err != nil {
- return err
- }
-
- res, err := processJson(filename, src, opt)
- if err != nil {
- return err
- }
-
- if !bytes.Equal(src, res) {
- // formatting has changed
- if opt.List {
- fmt.Fprintln(out, filename)
- }
- if opt.Write {
- err = ioutil.WriteFile(filename, res, 0)
- if err != nil {
- return err
- }
- }
- if opt.Diff {
- data, err := diffJson(src, res)
- if err != nil {
- return fmt.Errorf("computing diff: %s", err)
- }
- fmt.Printf("diff %s json/%s\n", filename, filename)
- out.Write(data)
- }
- }
-
- if !opt.List && !opt.Write && !opt.Diff {
- _, err = out.Write(res)
- }
-
- return err
-}
-
-func diffJson(b1, b2 []byte) (data []byte, err error) {
- f1, err := ioutil.TempFile("", "json")
- if err != nil {
- return
- }
- defer os.Remove(f1.Name())
- defer f1.Close()
-
- f2, err := ioutil.TempFile("", "json")
- if err != nil {
- return
- }
- defer os.Remove(f2.Name())
- defer f2.Close()
-
- f1.Write(b1)
- f2.Write(b2)
-
- data, err = exec.Command("diff", "-u", f1.Name(), f2.Name()).CombinedOutput()
- if len(data) > 0 {
- // diff exits with a non-zero status when the files don't match.
- // Ignore that failure as long as we get output.
- err = nil
- }
- return
-}
diff --git a/vendor/github.com/visualfc/gotools/main.go b/vendor/github.com/visualfc/gotools/main.go
deleted file mode 100644
index eb0d28c..0000000
--- a/vendor/github.com/visualfc/gotools/main.go
+++ /dev/null
@@ -1,47 +0,0 @@
-// Copyright 2011-2017 visualfc . All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-import (
- "github.com/visualfc/gotools/astview"
- "github.com/visualfc/gotools/command"
- "github.com/visualfc/gotools/docview"
- "github.com/visualfc/gotools/finddecl"
- "github.com/visualfc/gotools/finddoc"
- "github.com/visualfc/gotools/goapi"
- "github.com/visualfc/gotools/gofmt"
- "github.com/visualfc/gotools/gopresent"
- "github.com/visualfc/gotools/gotest"
- "github.com/visualfc/gotools/jsonfmt"
- "github.com/visualfc/gotools/oracle"
- "github.com/visualfc/gotools/pkgs"
- "github.com/visualfc/gotools/runcmd"
- "github.com/visualfc/gotools/terminal"
- "github.com/visualfc/gotools/types"
-)
-
-func init() {
- command.Register(types.Command)
- command.Register(jsonfmt.Command)
- command.Register(finddoc.Command)
- command.Register(runcmd.Command)
- command.Register(docview.Command)
- command.Register(astview.Command)
- command.Register(gopresent.Command)
- command.Register(goapi.Command)
- command.Register(pkgs.Command)
- command.Register(oracle.Command)
- command.Register(gofmt.Command)
- command.Register(gotest.Command)
- command.Register(finddecl.Command)
- command.Register(terminal.Command)
-}
-
-func main() {
- command.AppName = "gotools"
- command.AppVersion = "1.9"
- command.AppInfo = "Go tools for liteide."
- command.Main()
-}
diff --git a/vendor/github.com/visualfc/gotools/oracle/oracle.go b/vendor/github.com/visualfc/gotools/oracle/oracle.go
deleted file mode 100644
index adb237e..0000000
--- a/vendor/github.com/visualfc/gotools/oracle/oracle.go
+++ /dev/null
@@ -1,103 +0,0 @@
-// Copyright 2011-2015 visualfc . All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package oracle
-
-import (
- "fmt"
- "go/build"
- "os"
- "runtime"
-
- "github.com/visualfc/gotools/command"
- "github.com/visualfc/gotools/oracle/oracle"
-)
-
-//The mode argument determines the query to perform:
-
-// callees show possible targets of selected function call
-// callers show possible callers of selected function
-// callgraph show complete callgraph of program
-// callstack show path from callgraph root to selected function
-// describe describe selected syntax: definition, methods, etc
-// freevars show free variables of selection
-// implements show 'implements' relation for selected type
-// peers show send/receive corresponding to selected channel op
-// referrers show all refs to entity denoted by selected identifier
-// what show basic information about the selected syntax node
-
-var Command = &command.Command{
- Run: runOracle,
- UsageLine: "oracle",
- Short: "golang oracle util",
- Long: `golang oracle util.`,
-}
-
-var (
- oraclePos string
- oracleReflect bool
-)
-
-func init() {
- Command.Flag.StringVar(&oraclePos, "pos", "", "filename:#offset")
- Command.Flag.BoolVar(&oracleReflect, "reflect", false, "Analyze reflection soundly (slow).")
-}
-
-func runOracle(cmd *command.Command, args []string) error {
- if len(args) < 2 {
- cmd.Usage()
- return os.ErrInvalid
- }
- if os.Getenv("GOMAXPROCS") == "" {
- n := runtime.NumCPU()
- if n < 4 {
- n = 4
- }
- runtime.GOMAXPROCS(n)
- }
- mode := args[0]
- args = args[1:]
- // if args[0] == "." {
- // pkgPath, err := os.Getwd()
- // if err != nil {
- // log.Fatalln(err)
- // }
- // pkg, err := build.Default.ImportDir(pkgPath, 0)
- // if err != nil {
- // log.Fatalln(err)
- // }
- // args = pkg.GoFiles
- // //log.Println(pkg.ImportPath)
- // if pkg.ImportPath != "." && pkg.ImportPath != "" {
- // args = []string{pkg.ImportPath}
- // }
- // }
- query := oracle.Query{
- Mode: mode,
- Pos: oraclePos,
- Build: &build.Default,
- Scope: args,
- PTALog: nil,
- Reflection: oracleReflect,
- }
-
- if err := oracle.Run(&query); err != nil {
- fmt.Fprintf(os.Stderr, "oracle: %s.\n", err)
- return err
- }
-
- if mode == "referrers" {
- ref := query.Serial().Referrers
- if ref != nil {
- fmt.Fprintln(os.Stdout, ref.Desc)
- fmt.Fprintln(os.Stdout, ref.ObjPos)
- for _, v := range ref.Refs {
- fmt.Fprintln(os.Stdout, v)
- }
- }
- } else {
- query.WriteTo(os.Stdout)
- }
- return nil
-}
diff --git a/vendor/github.com/visualfc/gotools/oracle/oracle/TODO b/vendor/github.com/visualfc/gotools/oracle/oracle/TODO
deleted file mode 100644
index 8fbf5e8..0000000
--- a/vendor/github.com/visualfc/gotools/oracle/oracle/TODO
+++ /dev/null
@@ -1,83 +0,0 @@
-
-
-ORACLE TODO
-===========
-
-General
-=======
-
-Save unsaved editor buffers into an archive and provide that to the
-tools, which should act as if they were saved.
-
-Include complete pos/end information Serial output.
- But beware that sometimes a single token (e.g. +) is more helpful
- than the pos/end of the containing expression (e.g. x \n + \n y).
-
-Specific queries
-================
-
-callers, callees
-
- Use a type-based (e.g. RTA) callgraph when a callers/callees query is
- outside the analysis scope.
-
-implements
-
- Make it require that the selection is a type, and show only the
- implements relation as it applies to that type.
-
-definition, referrers
-
- definition: Make it work with qualified identifiers (SelectorExpr) too.
-
- references: Make it work on things that are implicit idents, like
- import specs, perhaps?
-
-what
-
- Report def/ref info if available.
- Editors could use it to highlight all idents of the same local var.
-
- More tests.
-
-pointsto
-
- When invoked on a function Ident, we get an error.
-
- When invoked on a named return parameter, we get an error.
-
-describe
-
- When invoked on a var, we want to see the type and its methods.
-
- Split "show type" and "describe syntax" into separate commands?
-
-peers
-
- Permit querying from a makechan, for...range, or reflective op.
-
- Report aliasing reflect.{Send,Recv,Close} and close() operations.
-
-New queries
-
-"updaters": show all statements that may update the selected lvalue
- (local, global, field, etc).
-
-"creators": show all places where an object of type T is created
- (&T{}, var t T, new(T), new(struct{array [3]T}), etc.
- (Useful for datatypes whose zero value is not safe)
-
-
-Editor-specific
-===============
-
-Add support for "what" to .el; clean up.
-
-Emacs: use JSON to get the raw information from the oracle. Don't
- open an editor buffer for simpler queries, just jump to the result
- and/or display it in the modeline.
-
-Emacs: go-root-and-paths depends on the current buffer, so be sure to
- call it from within the source file, not the *go-oracle* buffer:
- the user may have switched workspaces and the oracle should run in
- the new one.
diff --git a/vendor/github.com/visualfc/gotools/oracle/oracle/callees.go b/vendor/github.com/visualfc/gotools/oracle/oracle/callees.go
deleted file mode 100644
index a2fdd7e..0000000
--- a/vendor/github.com/visualfc/gotools/oracle/oracle/callees.go
+++ /dev/null
@@ -1,260 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build go1.5
-
-package oracle
-
-import (
- "fmt"
- "go/ast"
- "go/token"
- "go/types"
- "sort"
-
- "github.com/visualfc/gotools/oracle/oracle/serial"
- "golang.org/x/tools/go/loader"
- "golang.org/x/tools/go/pointer"
- "golang.org/x/tools/go/ssa"
- "golang.org/x/tools/go/ssa/ssautil"
-)
-
-// Callees reports the possible callees of the function call site
-// identified by the specified source location.
-func callees(q *Query) error {
- lconf := loader.Config{Build: q.Build}
-
- if err := setPTAScope(&lconf, q.Scope); err != nil {
- return err
- }
-
- // Load/parse/type-check the program.
- lprog, err := lconf.Load()
- if err != nil {
- return err
- }
- q.Fset = lprog.Fset
-
- qpos, err := parseQueryPos(lprog, q.Pos, true) // needs exact pos
- if err != nil {
- return err
- }
-
- // Determine the enclosing call for the specified position.
- var e *ast.CallExpr
- for _, n := range qpos.path {
- if e, _ = n.(*ast.CallExpr); e != nil {
- break
- }
- }
- if e == nil {
- return fmt.Errorf("there is no function call here")
- }
- // TODO(adonovan): issue an error if the call is "too far
- // away" from the current selection, as this most likely is
- // not what the user intended.
-
- // Reject type conversions.
- if qpos.info.Types[e.Fun].IsType() {
- return fmt.Errorf("this is a type conversion, not a function call")
- }
-
- // Deal with obviously static calls before constructing SSA form.
- // Some static calls may yet require SSA construction,
- // e.g. f := func(){}; f().
- switch funexpr := unparen(e.Fun).(type) {
- case *ast.Ident:
- switch obj := qpos.info.Uses[funexpr].(type) {
- case *types.Builtin:
- // Reject calls to built-ins.
- return fmt.Errorf("this is a call to the built-in '%s' operator", obj.Name())
- case *types.Func:
- // This is a static function call
- q.result = &calleesTypesResult{
- site: e,
- callee: obj,
- }
- return nil
- }
- case *ast.SelectorExpr:
- sel := qpos.info.Selections[funexpr]
- if sel == nil {
- // qualified identifier.
- // May refer to top level function variable
- // or to top level function.
- callee := qpos.info.Uses[funexpr.Sel]
- if obj, ok := callee.(*types.Func); ok {
- q.result = &calleesTypesResult{
- site: e,
- callee: obj,
- }
- return nil
- }
- } else if sel.Kind() == types.MethodVal {
- // Inspect the receiver type of the selected method.
- // If it is concrete, the call is statically dispatched.
- // (Due to implicit field selections, it is not enough to look
- // at sel.Recv(), the type of the actual receiver expression.)
- method := sel.Obj().(*types.Func)
- recvtype := method.Type().(*types.Signature).Recv().Type()
- if !types.IsInterface(recvtype) {
- // static method call
- q.result = &calleesTypesResult{
- site: e,
- callee: method,
- }
- return nil
- }
- }
- }
-
- prog := ssautil.CreateProgram(lprog, ssa.GlobalDebug)
-
- ptaConfig, err := setupPTA(prog, lprog, q.PTALog, q.Reflection)
- if err != nil {
- return err
- }
-
- pkg := prog.Package(qpos.info.Pkg)
- if pkg == nil {
- return fmt.Errorf("no SSA package")
- }
-
- // Defer SSA construction till after errors are reported.
- prog.Build()
-
- // Ascertain calling function and call site.
- callerFn := ssa.EnclosingFunction(pkg, qpos.path)
- if callerFn == nil {
- return fmt.Errorf("no SSA function built for this location (dead code?)")
- }
-
- // Find the call site.
- site, err := findCallSite(callerFn, e)
- if err != nil {
- return err
- }
-
- funcs, err := findCallees(ptaConfig, site)
- if err != nil {
- return err
- }
-
- q.result = &calleesSSAResult{
- site: site,
- funcs: funcs,
- }
- return nil
-}
-
-func findCallSite(fn *ssa.Function, call *ast.CallExpr) (ssa.CallInstruction, error) {
- instr, _ := fn.ValueForExpr(call)
- callInstr, _ := instr.(ssa.CallInstruction)
- if instr == nil {
- return nil, fmt.Errorf("this call site is unreachable in this analysis")
- }
- return callInstr, nil
-}
-
-func findCallees(conf *pointer.Config, site ssa.CallInstruction) ([]*ssa.Function, error) {
- // Avoid running the pointer analysis for static calls.
- if callee := site.Common().StaticCallee(); callee != nil {
- switch callee.String() {
- case "runtime.SetFinalizer", "(reflect.Value).Call":
- // The PTA treats calls to these intrinsics as dynamic.
- // TODO(adonovan): avoid reliance on PTA internals.
-
- default:
- return []*ssa.Function{callee}, nil // singleton
- }
- }
-
- // Dynamic call: use pointer analysis.
- conf.BuildCallGraph = true
- cg := ptrAnalysis(conf).CallGraph
- cg.DeleteSyntheticNodes()
-
- // Find all call edges from the site.
- n := cg.Nodes[site.Parent()]
- if n == nil {
- return nil, fmt.Errorf("this call site is unreachable in this analysis")
- }
- calleesMap := make(map[*ssa.Function]bool)
- for _, edge := range n.Out {
- if edge.Site == site {
- calleesMap[edge.Callee.Func] = true
- }
- }
-
- // De-duplicate and sort.
- funcs := make([]*ssa.Function, 0, len(calleesMap))
- for f := range calleesMap {
- funcs = append(funcs, f)
- }
- sort.Sort(byFuncPos(funcs))
- return funcs, nil
-}
-
-type calleesSSAResult struct {
- site ssa.CallInstruction
- funcs []*ssa.Function
-}
-
-type calleesTypesResult struct {
- site *ast.CallExpr
- callee *types.Func
-}
-
-func (r *calleesSSAResult) display(printf printfFunc) {
- if len(r.funcs) == 0 {
- // dynamic call on a provably nil func/interface
- printf(r.site, "%s on nil value", r.site.Common().Description())
- } else {
- printf(r.site, "this %s dispatches to:", r.site.Common().Description())
- for _, callee := range r.funcs {
- printf(callee, "\t%s", callee)
- }
- }
-}
-
-func (r *calleesSSAResult) toSerial(res *serial.Result, fset *token.FileSet) {
- j := &serial.Callees{
- Pos: fset.Position(r.site.Pos()).String(),
- Desc: r.site.Common().Description(),
- }
- for _, callee := range r.funcs {
- j.Callees = append(j.Callees, &serial.CalleesItem{
- Name: callee.String(),
- Pos: fset.Position(callee.Pos()).String(),
- })
- }
- res.Callees = j
-}
-
-func (r *calleesTypesResult) display(printf printfFunc) {
- printf(r.site, "this static function call dispatches to:")
- printf(r.callee, "\t%s", r.callee.FullName())
-}
-
-func (r *calleesTypesResult) toSerial(res *serial.Result, fset *token.FileSet) {
- j := &serial.Callees{
- Pos: fset.Position(r.site.Pos()).String(),
- Desc: "static function call",
- }
- j.Callees = []*serial.CalleesItem{
- &serial.CalleesItem{
- Name: r.callee.FullName(),
- Pos: fset.Position(r.callee.Pos()).String(),
- },
- }
- res.Callees = j
-}
-
-// NB: byFuncPos is not deterministic across packages since it depends on load order.
-// Use lessPos if the tests need it.
-type byFuncPos []*ssa.Function
-
-func (a byFuncPos) Len() int { return len(a) }
-func (a byFuncPos) Less(i, j int) bool { return a[i].Pos() < a[j].Pos() }
-func (a byFuncPos) Swap(i, j int) { a[i], a[j] = a[j], a[i] }
diff --git a/vendor/github.com/visualfc/gotools/oracle/oracle/callers.go b/vendor/github.com/visualfc/gotools/oracle/oracle/callers.go
deleted file mode 100644
index 8807360..0000000
--- a/vendor/github.com/visualfc/gotools/oracle/oracle/callers.go
+++ /dev/null
@@ -1,115 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package oracle
-
-import (
- "fmt"
- "go/token"
-
- "github.com/visualfc/gotools/oracle/oracle/serial"
- "golang.org/x/tools/go/callgraph"
- "golang.org/x/tools/go/loader"
- "golang.org/x/tools/go/ssa"
- "golang.org/x/tools/go/ssa/ssautil"
-)
-
-// Callers reports the possible callers of the function
-// immediately enclosing the specified source location.
-//
-func callers(q *Query) error {
- lconf := loader.Config{Build: q.Build}
-
- if err := setPTAScope(&lconf, q.Scope); err != nil {
- return err
- }
-
- // Load/parse/type-check the program.
- lprog, err := lconf.Load()
- if err != nil {
- return err
- }
- q.Fset = lprog.Fset
-
- qpos, err := parseQueryPos(lprog, q.Pos, false)
- if err != nil {
- return err
- }
-
- prog := ssautil.CreateProgram(lprog, 0)
-
- ptaConfig, err := setupPTA(prog, lprog, q.PTALog, q.Reflection)
- if err != nil {
- return err
- }
-
- pkg := prog.Package(qpos.info.Pkg)
- if pkg == nil {
- return fmt.Errorf("no SSA package")
- }
- if !ssa.HasEnclosingFunction(pkg, qpos.path) {
- return fmt.Errorf("this position is not inside a function")
- }
-
- // Defer SSA construction till after errors are reported.
- prog.Build()
-
- target := ssa.EnclosingFunction(pkg, qpos.path)
- if target == nil {
- return fmt.Errorf("no SSA function built for this location (dead code?)")
- }
-
- // TODO(adonovan): opt: if function is never address-taken, skip
- // the pointer analysis. Just look for direct calls. This can
- // be done in a single pass over the SSA.
-
- // Run the pointer analysis, recording each
- // call found to originate from target.
- ptaConfig.BuildCallGraph = true
- cg := ptrAnalysis(ptaConfig).CallGraph
- cg.DeleteSyntheticNodes()
- edges := cg.CreateNode(target).In
- // TODO(adonovan): sort + dedup calls to ensure test determinism.
-
- q.result = &callersResult{
- target: target,
- callgraph: cg,
- edges: edges,
- }
- return nil
-}
-
-type callersResult struct {
- target *ssa.Function
- callgraph *callgraph.Graph
- edges []*callgraph.Edge
-}
-
-func (r *callersResult) display(printf printfFunc) {
- root := r.callgraph.Root
- if r.edges == nil {
- printf(r.target, "%s is not reachable in this program.", r.target)
- } else {
- printf(r.target, "%s is called from these %d sites:", r.target, len(r.edges))
- for _, edge := range r.edges {
- if edge.Caller == root {
- printf(r.target, "the root of the call graph")
- } else {
- printf(edge, "\t%s from %s", edge.Description(), edge.Caller.Func)
- }
- }
- }
-}
-
-func (r *callersResult) toSerial(res *serial.Result, fset *token.FileSet) {
- var callers []serial.Caller
- for _, edge := range r.edges {
- callers = append(callers, serial.Caller{
- Caller: edge.Caller.Func.String(),
- Pos: fset.Position(edge.Pos()).String(),
- Desc: edge.Description(),
- })
- }
- res.Callers = callers
-}
diff --git a/vendor/github.com/visualfc/gotools/oracle/oracle/callstack.go b/vendor/github.com/visualfc/gotools/oracle/oracle/callstack.go
deleted file mode 100644
index afebdf7..0000000
--- a/vendor/github.com/visualfc/gotools/oracle/oracle/callstack.go
+++ /dev/null
@@ -1,126 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package oracle
-
-import (
- "fmt"
- "go/token"
-
- "github.com/visualfc/gotools/oracle/oracle/serial"
- "golang.org/x/tools/go/callgraph"
- "golang.org/x/tools/go/loader"
- "golang.org/x/tools/go/ssa"
- "golang.org/x/tools/go/ssa/ssautil"
-)
-
-// Callstack displays an arbitrary path from a root of the callgraph
-// to the function at the current position.
-//
-// The information may be misleading in a context-insensitive
-// analysis. e.g. the call path X->Y->Z might be infeasible if Y never
-// calls Z when it is called from X. TODO(adonovan): think about UI.
-//
-// TODO(adonovan): permit user to specify a starting point other than
-// the analysis root.
-//
-func callstack(q *Query) error {
- fset := token.NewFileSet()
- lconf := loader.Config{Fset: fset, Build: q.Build}
-
- if err := setPTAScope(&lconf, q.Scope); err != nil {
- return err
- }
-
- // Load/parse/type-check the program.
- lprog, err := lconf.Load()
- if err != nil {
- return err
- }
-
- qpos, err := parseQueryPos(lprog, q.Pos, false)
- if err != nil {
- return err
- }
-
- prog := ssautil.CreateProgram(lprog, 0)
-
- ptaConfig, err := setupPTA(prog, lprog, q.PTALog, q.Reflection)
- if err != nil {
- return err
- }
-
- pkg := prog.Package(qpos.info.Pkg)
- if pkg == nil {
- return fmt.Errorf("no SSA package")
- }
-
- if !ssa.HasEnclosingFunction(pkg, qpos.path) {
- return fmt.Errorf("this position is not inside a function")
- }
-
- // Defer SSA construction till after errors are reported.
- prog.Build()
-
- target := ssa.EnclosingFunction(pkg, qpos.path)
- if target == nil {
- return fmt.Errorf("no SSA function built for this location (dead code?)")
- }
-
- // Run the pointer analysis and build the complete call graph.
- ptaConfig.BuildCallGraph = true
- cg := ptrAnalysis(ptaConfig).CallGraph
- cg.DeleteSyntheticNodes()
-
- // Search for an arbitrary path from a root to the target function.
- isEnd := func(n *callgraph.Node) bool { return n.Func == target }
- callpath := callgraph.PathSearch(cg.Root, isEnd)
- if callpath != nil {
- callpath = callpath[1:] // remove synthetic edge from
- }
-
- q.Fset = fset
- q.result = &callstackResult{
- qpos: qpos,
- target: target,
- callpath: callpath,
- }
- return nil
-}
-
-type callstackResult struct {
- qpos *queryPos
- target *ssa.Function
- callpath []*callgraph.Edge
-}
-
-func (r *callstackResult) display(printf printfFunc) {
- if r.callpath != nil {
- printf(r.qpos, "Found a call path from root to %s", r.target)
- printf(r.target, "%s", r.target)
- for i := len(r.callpath) - 1; i >= 0; i-- {
- edge := r.callpath[i]
- printf(edge, "%s from %s", edge.Description(), edge.Caller.Func)
- }
- } else {
- printf(r.target, "%s is unreachable in this analysis scope", r.target)
- }
-}
-
-func (r *callstackResult) toSerial(res *serial.Result, fset *token.FileSet) {
- var callers []serial.Caller
- for i := len(r.callpath) - 1; i >= 0; i-- { // (innermost first)
- edge := r.callpath[i]
- callers = append(callers, serial.Caller{
- Pos: fset.Position(edge.Pos()).String(),
- Caller: edge.Caller.Func.String(),
- Desc: edge.Description(),
- })
- }
- res.Callstack = &serial.CallStack{
- Pos: fset.Position(r.target.Pos()).String(),
- Target: r.target.String(),
- Callers: callers,
- }
-}
diff --git a/vendor/github.com/visualfc/gotools/oracle/oracle/definition.go b/vendor/github.com/visualfc/gotools/oracle/oracle/definition.go
deleted file mode 100644
index 2a0cbec..0000000
--- a/vendor/github.com/visualfc/gotools/oracle/oracle/definition.go
+++ /dev/null
@@ -1,78 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build go1.5
-
-package oracle
-
-import (
- "fmt"
- "go/ast"
- "go/token"
- "go/types"
-
- "github.com/visualfc/gotools/oracle/oracle/serial"
- "golang.org/x/tools/go/loader"
-)
-
-// definition reports the location of the definition of an identifier.
-//
-// TODO(adonovan): opt: for intra-file references, the parser's
-// resolution might be enough; we should start with that.
-//
-func definition(q *Query) error {
- lconf := loader.Config{Build: q.Build}
- allowErrors(&lconf)
-
- if _, err := importQueryPackage(q.Pos, &lconf); err != nil {
- return err
- }
-
- // Load/parse/type-check the program.
- lprog, err := lconf.Load()
- if err != nil {
- return err
- }
- q.Fset = lprog.Fset
-
- qpos, err := parseQueryPos(lprog, q.Pos, false)
- if err != nil {
- return err
- }
-
- id, _ := qpos.path[0].(*ast.Ident)
- if id == nil {
- return fmt.Errorf("no identifier here")
- }
-
- obj := qpos.info.ObjectOf(id)
- if obj == nil {
- // Happens for y in "switch y := x.(type)",
- // and the package declaration,
- // but I think that's all.
- return fmt.Errorf("no object for identifier")
- }
-
- q.result = &definitionResult{qpos, obj}
- return nil
-}
-
-type definitionResult struct {
- qpos *queryPos
- obj types.Object // object it denotes
-}
-
-func (r *definitionResult) display(printf printfFunc) {
- printf(r.obj, "defined here as %s", r.qpos.objectString(r.obj))
-}
-
-func (r *definitionResult) toSerial(res *serial.Result, fset *token.FileSet) {
- definition := &serial.Definition{
- Desc: r.obj.String(),
- }
- if pos := r.obj.Pos(); pos != token.NoPos { // Package objects have no Pos()
- definition.ObjPos = fset.Position(pos).String()
- }
- res.Definition = definition
-}
diff --git a/vendor/github.com/visualfc/gotools/oracle/oracle/describe.go b/vendor/github.com/visualfc/gotools/oracle/oracle/describe.go
deleted file mode 100644
index d445b52..0000000
--- a/vendor/github.com/visualfc/gotools/oracle/oracle/describe.go
+++ /dev/null
@@ -1,775 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build go1.6
-
-package oracle
-
-import (
- "bytes"
- "fmt"
- "go/ast"
- exact "go/constant"
- "go/token"
- "go/types"
- "log"
- "os"
- "strings"
-
- "github.com/visualfc/gotools/oracle/oracle/serial"
- "golang.org/x/tools/go/ast/astutil"
- "golang.org/x/tools/go/loader"
- "golang.org/x/tools/go/types/typeutil"
-)
-
-// describe describes the syntax node denoted by the query position,
-// including:
-// - its syntactic category
-// - the definition of its referent (for identifiers) [now redundant]
-// - its type and method set (for an expression or type expression)
-//
-func describe(q *Query) error {
- lconf := loader.Config{Build: q.Build}
- allowErrors(&lconf)
-
- if _, err := importQueryPackage(q.Pos, &lconf); err != nil {
- return err
- }
-
- // Load/parse/type-check the program.
- lprog, err := lconf.Load()
- if err != nil {
- return err
- }
- q.Fset = lprog.Fset
-
- qpos, err := parseQueryPos(lprog, q.Pos, true) // (need exact pos)
- if err != nil {
- return err
- }
-
- if false { // debugging
- fprintf(os.Stderr, lprog.Fset, qpos.path[0], "you selected: %s %s",
- astutil.NodeDescription(qpos.path[0]), pathToString(qpos.path))
- }
-
- path, action := findInterestingNode(qpos.info, qpos.path)
- switch action {
- case actionExpr:
- q.result, err = describeValue(qpos, path)
-
- case actionType:
- q.result, err = describeType(qpos, path)
-
- case actionPackage:
- q.result, err = describePackage(qpos, path)
-
- case actionStmt:
- q.result, err = describeStmt(qpos, path)
-
- case actionUnknown:
- q.result = &describeUnknownResult{path[0]}
-
- default:
- panic(action) // unreachable
- }
- return err
-}
-
-type describeUnknownResult struct {
- node ast.Node
-}
-
-func (r *describeUnknownResult) display(printf printfFunc) {
- // Nothing much to say about misc syntax.
- printf(r.node, "%s", astutil.NodeDescription(r.node))
-}
-
-func (r *describeUnknownResult) toSerial(res *serial.Result, fset *token.FileSet) {
- res.Describe = &serial.Describe{
- Desc: astutil.NodeDescription(r.node),
- Pos: fset.Position(r.node.Pos()).String(),
- }
-}
-
-type action int
-
-const (
- actionUnknown action = iota // None of the below
- actionExpr // FuncDecl, true Expr or Ident(types.{Const,Var})
- actionType // type Expr or Ident(types.TypeName).
- actionStmt // Stmt or Ident(types.Label)
- actionPackage // Ident(types.Package) or ImportSpec
-)
-
-// findInterestingNode classifies the syntax node denoted by path as one of:
-// - an expression, part of an expression or a reference to a constant
-// or variable;
-// - a type, part of a type, or a reference to a named type;
-// - a statement, part of a statement, or a label referring to a statement;
-// - part of a package declaration or import spec.
-// - none of the above.
-// and returns the most "interesting" associated node, which may be
-// the same node, an ancestor or a descendent.
-//
-func findInterestingNode(pkginfo *loader.PackageInfo, path []ast.Node) ([]ast.Node, action) {
- // TODO(adonovan): integrate with go/types/stdlib_test.go and
- // apply this to every AST node we can find to make sure it
- // doesn't crash.
-
- // TODO(adonovan): audit for ParenExpr safety, esp. since we
- // traverse up and down.
-
- // TODO(adonovan): if the users selects the "." in
- // "fmt.Fprintf()", they'll get an ambiguous selection error;
- // we won't even reach here. Can we do better?
-
- // TODO(adonovan): describing a field within 'type T struct {...}'
- // describes the (anonymous) struct type and concludes "no methods".
- // We should ascend to the enclosing type decl, if any.
-
- for len(path) > 0 {
- switch n := path[0].(type) {
- case *ast.GenDecl:
- if len(n.Specs) == 1 {
- // Descend to sole {Import,Type,Value}Spec child.
- path = append([]ast.Node{n.Specs[0]}, path...)
- continue
- }
- return path, actionUnknown // uninteresting
-
- case *ast.FuncDecl:
- // Descend to function name.
- path = append([]ast.Node{n.Name}, path...)
- continue
-
- case *ast.ImportSpec:
- return path, actionPackage
-
- case *ast.ValueSpec:
- if len(n.Names) == 1 {
- // Descend to sole Ident child.
- path = append([]ast.Node{n.Names[0]}, path...)
- continue
- }
- return path, actionUnknown // uninteresting
-
- case *ast.TypeSpec:
- // Descend to type name.
- path = append([]ast.Node{n.Name}, path...)
- continue
-
- case ast.Stmt:
- return path, actionStmt
-
- case *ast.ArrayType,
- *ast.StructType,
- *ast.FuncType,
- *ast.InterfaceType,
- *ast.MapType,
- *ast.ChanType:
- return path, actionType
-
- case *ast.Comment, *ast.CommentGroup, *ast.File, *ast.KeyValueExpr, *ast.CommClause:
- return path, actionUnknown // uninteresting
-
- case *ast.Ellipsis:
- // Continue to enclosing node.
- // e.g. [...]T in ArrayType
- // f(x...) in CallExpr
- // f(x...T) in FuncType
-
- case *ast.Field:
- // TODO(adonovan): this needs more thought,
- // since fields can be so many things.
- if len(n.Names) == 1 {
- // Descend to sole Ident child.
- path = append([]ast.Node{n.Names[0]}, path...)
- continue
- }
- // Zero names (e.g. anon field in struct)
- // or multiple field or param names:
- // continue to enclosing field list.
-
- case *ast.FieldList:
- // Continue to enclosing node:
- // {Struct,Func,Interface}Type or FuncDecl.
-
- case *ast.BasicLit:
- if _, ok := path[1].(*ast.ImportSpec); ok {
- return path[1:], actionPackage
- }
- return path, actionExpr
-
- case *ast.SelectorExpr:
- // TODO(adonovan): use Selections info directly.
- if pkginfo.Uses[n.Sel] == nil {
- // TODO(adonovan): is this reachable?
- return path, actionUnknown
- }
- // Descend to .Sel child.
- path = append([]ast.Node{n.Sel}, path...)
- continue
-
- case *ast.Ident:
- switch pkginfo.ObjectOf(n).(type) {
- case *types.PkgName:
- return path, actionPackage
-
- case *types.Const:
- return path, actionExpr
-
- case *types.Label:
- return path, actionStmt
-
- case *types.TypeName:
- return path, actionType
-
- case *types.Var:
- // For x in 'struct {x T}', return struct type, for now.
- if _, ok := path[1].(*ast.Field); ok {
- _ = path[2].(*ast.FieldList) // assertion
- if _, ok := path[3].(*ast.StructType); ok {
- return path[3:], actionType
- }
- }
- return path, actionExpr
-
- case *types.Func:
- return path, actionExpr
-
- case *types.Builtin:
- // For reference to built-in function, return enclosing call.
- path = path[1:] // ascend to enclosing function call
- continue
-
- case *types.Nil:
- return path, actionExpr
- }
-
- // No object.
- switch path[1].(type) {
- case *ast.SelectorExpr:
- // Return enclosing selector expression.
- return path[1:], actionExpr
-
- case *ast.Field:
- // TODO(adonovan): test this.
- // e.g. all f in:
- // struct { f, g int }
- // interface { f() }
- // func (f T) method(f, g int) (f, g bool)
- //
- // switch path[3].(type) {
- // case *ast.FuncDecl:
- // case *ast.StructType:
- // case *ast.InterfaceType:
- // }
- //
- // return path[1:], actionExpr
- //
- // Unclear what to do with these.
- // Struct.Fields -- field
- // Interface.Methods -- field
- // FuncType.{Params.Results} -- actionExpr
- // FuncDecl.Recv -- actionExpr
-
- case *ast.File:
- // 'package foo'
- return path, actionPackage
-
- case *ast.ImportSpec:
- // TODO(adonovan): fix: why no package object? go/types bug?
- return path[1:], actionPackage
-
- default:
- // e.g. blank identifier
- // or y in "switch y := x.(type)"
- // or code in a _test.go file that's not part of the package.
- log.Printf("unknown reference %s in %T\n", n, path[1])
- return path, actionUnknown
- }
-
- case *ast.StarExpr:
- if pkginfo.Types[n].IsType() {
- return path, actionType
- }
- return path, actionExpr
-
- case ast.Expr:
- // All Expr but {BasicLit,Ident,StarExpr} are
- // "true" expressions that evaluate to a value.
- return path, actionExpr
- }
-
- // Ascend to parent.
- path = path[1:]
- }
-
- return nil, actionUnknown // unreachable
-}
-
-func describeValue(qpos *queryPos, path []ast.Node) (*describeValueResult, error) {
- var expr ast.Expr
- var obj types.Object
- switch n := path[0].(type) {
- case *ast.ValueSpec:
- // ambiguous ValueSpec containing multiple names
- return nil, fmt.Errorf("multiple value specification")
- case *ast.Ident:
- obj = qpos.info.ObjectOf(n)
- expr = n
- case ast.Expr:
- expr = n
- default:
- // TODO(adonovan): is this reachable?
- return nil, fmt.Errorf("unexpected AST for expr: %T", n)
- }
-
- typ := qpos.info.TypeOf(expr)
- constVal := qpos.info.Types[expr].Value
-
- return &describeValueResult{
- qpos: qpos,
- expr: expr,
- typ: typ,
- constVal: constVal,
- obj: obj,
- }, nil
-}
-
-type describeValueResult struct {
- qpos *queryPos
- expr ast.Expr // query node
- typ types.Type // type of expression
- constVal exact.Value // value of expression, if constant
- obj types.Object // var/func/const object, if expr was Ident
-}
-
-func (r *describeValueResult) display(printf printfFunc) {
- var prefix, suffix string
- if r.constVal != nil {
- suffix = fmt.Sprintf(" of constant value %s", r.constVal)
- }
- switch obj := r.obj.(type) {
- case *types.Func:
- if recv := obj.Type().(*types.Signature).Recv(); recv != nil {
- if _, ok := recv.Type().Underlying().(*types.Interface); ok {
- prefix = "interface method "
- } else {
- prefix = "method "
- }
- }
- }
-
- // Describe the expression.
- if r.obj != nil {
- if r.obj.Pos() == r.expr.Pos() {
- // defining ident
- printf(r.expr, "definition of %s%s%s", prefix, r.qpos.objectString(r.obj), suffix)
- } else {
- // referring ident
- printf(r.expr, "reference to %s%s%s", prefix, r.qpos.objectString(r.obj), suffix)
- if def := r.obj.Pos(); def != token.NoPos {
- printf(def, "defined here")
- }
- }
- } else {
- desc := astutil.NodeDescription(r.expr)
- if suffix != "" {
- // constant expression
- printf(r.expr, "%s%s", desc, suffix)
- } else {
- // non-constant expression
- printf(r.expr, "%s of type %s", desc, r.qpos.typeString(r.typ))
- }
- }
-}
-
-func (r *describeValueResult) toSerial(res *serial.Result, fset *token.FileSet) {
- var value, objpos string
- if r.constVal != nil {
- value = r.constVal.String()
- }
- if r.obj != nil {
- objpos = fset.Position(r.obj.Pos()).String()
- }
-
- res.Describe = &serial.Describe{
- Desc: astutil.NodeDescription(r.expr),
- Pos: fset.Position(r.expr.Pos()).String(),
- Detail: "value",
- Value: &serial.DescribeValue{
- Type: r.qpos.typeString(r.typ),
- Value: value,
- ObjPos: objpos,
- },
- }
-}
-
-// ---- TYPE ------------------------------------------------------------
-
-func describeType(qpos *queryPos, path []ast.Node) (*describeTypeResult, error) {
- var description string
- var t types.Type
- switch n := path[0].(type) {
- case *ast.Ident:
- t = qpos.info.TypeOf(n)
- switch t := t.(type) {
- case *types.Basic:
- description = "reference to built-in "
-
- case *types.Named:
- isDef := t.Obj().Pos() == n.Pos() // see caveats at isDef above
- if isDef {
- description = "definition of "
- } else {
- description = "reference to "
- }
- }
-
- case ast.Expr:
- t = qpos.info.TypeOf(n)
-
- default:
- // Unreachable?
- return nil, fmt.Errorf("unexpected AST for type: %T", n)
- }
-
- description = description + "type " + qpos.typeString(t)
-
- // Show sizes for structs and named types (it's fairly obvious for others).
- switch t.(type) {
- case *types.Named, *types.Struct:
- szs := types.StdSizes{WordSize: 8, MaxAlign: 8} // assume amd64
- description = fmt.Sprintf("%s (size %d, align %d)", description,
- szs.Sizeof(t), szs.Alignof(t))
- }
-
- return &describeTypeResult{
- qpos: qpos,
- node: path[0],
- description: description,
- typ: t,
- methods: accessibleMethods(t, qpos.info.Pkg),
- }, nil
-}
-
-type describeTypeResult struct {
- qpos *queryPos
- node ast.Node
- description string
- typ types.Type
- methods []*types.Selection
-}
-
-func (r *describeTypeResult) display(printf printfFunc) {
- printf(r.node, "%s", r.description)
-
- // Show the underlying type for a reference to a named type.
- if nt, ok := r.typ.(*types.Named); ok && r.node.Pos() != nt.Obj().Pos() {
- printf(nt.Obj(), "defined as %s", r.qpos.typeString(nt.Underlying()))
- }
-
- // Print the method set, if the type kind is capable of bearing methods.
- switch r.typ.(type) {
- case *types.Interface, *types.Struct, *types.Named:
- if len(r.methods) > 0 {
- printf(r.node, "Method set:")
- for _, meth := range r.methods {
- // TODO(adonovan): print these relative
- // to the owning package, not the
- // query package.
- printf(meth.Obj(), "\t%s", r.qpos.selectionString(meth))
- }
- } else {
- printf(r.node, "No methods.")
- }
- }
-}
-
-func (r *describeTypeResult) toSerial(res *serial.Result, fset *token.FileSet) {
- var namePos, nameDef string
- if nt, ok := r.typ.(*types.Named); ok {
- namePos = fset.Position(nt.Obj().Pos()).String()
- nameDef = nt.Underlying().String()
- }
- res.Describe = &serial.Describe{
- Desc: r.description,
- Pos: fset.Position(r.node.Pos()).String(),
- Detail: "type",
- Type: &serial.DescribeType{
- Type: r.qpos.typeString(r.typ),
- NamePos: namePos,
- NameDef: nameDef,
- Methods: methodsToSerial(r.qpos.info.Pkg, r.methods, fset),
- },
- }
-}
-
-// ---- PACKAGE ------------------------------------------------------------
-
-func describePackage(qpos *queryPos, path []ast.Node) (*describePackageResult, error) {
- var description string
- var pkg *types.Package
- switch n := path[0].(type) {
- case *ast.ImportSpec:
- var obj types.Object
- if n.Name != nil {
- obj = qpos.info.Defs[n.Name]
- } else {
- obj = qpos.info.Implicits[n]
- }
- pkgname, _ := obj.(*types.PkgName)
- if pkgname == nil {
- return nil, fmt.Errorf("can't import package %s", n.Path.Value)
- }
- pkg = pkgname.Imported()
- description = fmt.Sprintf("import of package %q", pkg.Path())
-
- case *ast.Ident:
- if _, isDef := path[1].(*ast.File); isDef {
- // e.g. package id
- pkg = qpos.info.Pkg
- description = fmt.Sprintf("definition of package %q", pkg.Path())
- } else {
- // e.g. import id "..."
- // or id.F()
- pkg = qpos.info.ObjectOf(n).(*types.PkgName).Imported()
- description = fmt.Sprintf("reference to package %q", pkg.Path())
- }
-
- default:
- // Unreachable?
- return nil, fmt.Errorf("unexpected AST for package: %T", n)
- }
-
- var members []*describeMember
- // NB: "unsafe" has no types.Package
- if pkg != nil {
- // Enumerate the accessible package members
- // in lexicographic order.
- for _, name := range pkg.Scope().Names() {
- if pkg == qpos.info.Pkg || ast.IsExported(name) {
- mem := pkg.Scope().Lookup(name)
- var methods []*types.Selection
- if mem, ok := mem.(*types.TypeName); ok {
- methods = accessibleMethods(mem.Type(), qpos.info.Pkg)
- }
- members = append(members, &describeMember{
- mem,
- methods,
- })
-
- }
- }
- }
-
- return &describePackageResult{qpos.fset, path[0], description, pkg, members}, nil
-}
-
-type describePackageResult struct {
- fset *token.FileSet
- node ast.Node
- description string
- pkg *types.Package
- members []*describeMember // in lexicographic name order
-}
-
-type describeMember struct {
- obj types.Object
- methods []*types.Selection // in types.MethodSet order
-}
-
-func (r *describePackageResult) display(printf printfFunc) {
- printf(r.node, "%s", r.description)
-
- // Compute max width of name "column".
- maxname := 0
- for _, mem := range r.members {
- if l := len(mem.obj.Name()); l > maxname {
- maxname = l
- }
- }
-
- for _, mem := range r.members {
- printf(mem.obj, "\t%s", formatMember(mem.obj, maxname))
- for _, meth := range mem.methods {
- printf(meth.Obj(), "\t\t%s", types.SelectionString(meth, types.RelativeTo(r.pkg)))
- }
- }
-}
-
-func formatMember(obj types.Object, maxname int) string {
- qualifier := types.RelativeTo(obj.Pkg())
- var buf bytes.Buffer
- fmt.Fprintf(&buf, "%-5s %-*s", tokenOf(obj), maxname, obj.Name())
- switch obj := obj.(type) {
- case *types.Const:
- fmt.Fprintf(&buf, " %s = %s", types.TypeString(obj.Type(), qualifier), obj.Val().String())
-
- case *types.Func:
- fmt.Fprintf(&buf, " %s", types.TypeString(obj.Type(), qualifier))
-
- case *types.TypeName:
- // Abbreviate long aggregate type names.
- var abbrev string
- switch t := obj.Type().Underlying().(type) {
- case *types.Interface:
- if t.NumMethods() > 1 {
- abbrev = "interface{...}"
- }
- case *types.Struct:
- if t.NumFields() > 1 {
- abbrev = "struct{...}"
- }
- }
- if abbrev == "" {
- fmt.Fprintf(&buf, " %s", types.TypeString(obj.Type().Underlying(), qualifier))
- } else {
- fmt.Fprintf(&buf, " %s", abbrev)
- }
-
- case *types.Var:
- fmt.Fprintf(&buf, " %s", types.TypeString(obj.Type(), qualifier))
- }
- return buf.String()
-}
-
-func (r *describePackageResult) toSerial(res *serial.Result, fset *token.FileSet) {
- var members []*serial.DescribeMember
- for _, mem := range r.members {
- typ := mem.obj.Type()
- var val string
- switch mem := mem.obj.(type) {
- case *types.Const:
- val = mem.Val().String()
- case *types.TypeName:
- typ = typ.Underlying()
- }
- members = append(members, &serial.DescribeMember{
- Name: mem.obj.Name(),
- Type: typ.String(),
- Value: val,
- Pos: fset.Position(mem.obj.Pos()).String(),
- Kind: tokenOf(mem.obj),
- Methods: methodsToSerial(r.pkg, mem.methods, fset),
- })
- }
- res.Describe = &serial.Describe{
- Desc: r.description,
- Pos: fset.Position(r.node.Pos()).String(),
- Detail: "package",
- Package: &serial.DescribePackage{
- Path: r.pkg.Path(),
- Members: members,
- },
- }
-}
-
-func tokenOf(o types.Object) string {
- switch o.(type) {
- case *types.Func:
- return "func"
- case *types.Var:
- return "var"
- case *types.TypeName:
- return "type"
- case *types.Const:
- return "const"
- case *types.PkgName:
- return "package"
- case *types.Builtin:
- return "builtin" // e.g. when describing package "unsafe"
- case *types.Nil:
- return "nil"
- case *types.Label:
- return "label"
- }
- panic(o)
-}
-
-// ---- STATEMENT ------------------------------------------------------------
-
-func describeStmt(qpos *queryPos, path []ast.Node) (*describeStmtResult, error) {
- var description string
- switch n := path[0].(type) {
- case *ast.Ident:
- if qpos.info.Defs[n] != nil {
- description = "labelled statement"
- } else {
- description = "reference to labelled statement"
- }
-
- default:
- // Nothing much to say about statements.
- description = astutil.NodeDescription(n)
- }
- return &describeStmtResult{qpos.fset, path[0], description}, nil
-}
-
-type describeStmtResult struct {
- fset *token.FileSet
- node ast.Node
- description string
-}
-
-func (r *describeStmtResult) display(printf printfFunc) {
- printf(r.node, "%s", r.description)
-}
-
-func (r *describeStmtResult) toSerial(res *serial.Result, fset *token.FileSet) {
- res.Describe = &serial.Describe{
- Desc: r.description,
- Pos: fset.Position(r.node.Pos()).String(),
- Detail: "unknown",
- }
-}
-
-// ------------------- Utilities -------------------
-
-// pathToString returns a string containing the concrete types of the
-// nodes in path.
-func pathToString(path []ast.Node) string {
- var buf bytes.Buffer
- fmt.Fprint(&buf, "[")
- for i, n := range path {
- if i > 0 {
- fmt.Fprint(&buf, " ")
- }
- fmt.Fprint(&buf, strings.TrimPrefix(fmt.Sprintf("%T", n), "*ast."))
- }
- fmt.Fprint(&buf, "]")
- return buf.String()
-}
-
-func accessibleMethods(t types.Type, from *types.Package) []*types.Selection {
- var methods []*types.Selection
- for _, meth := range typeutil.IntuitiveMethodSet(t, nil) {
- if isAccessibleFrom(meth.Obj(), from) {
- methods = append(methods, meth)
- }
- }
- return methods
-}
-
-func isAccessibleFrom(obj types.Object, pkg *types.Package) bool {
- return ast.IsExported(obj.Name()) || obj.Pkg() == pkg
-}
-
-func methodsToSerial(this *types.Package, methods []*types.Selection, fset *token.FileSet) []serial.DescribeMethod {
- qualifier := types.RelativeTo(this)
- var jmethods []serial.DescribeMethod
- for _, meth := range methods {
- var ser serial.DescribeMethod
- if meth != nil { // may contain nils when called by implements (on a method)
- ser = serial.DescribeMethod{
- Name: types.SelectionString(meth, qualifier),
- Pos: fset.Position(meth.Obj().Pos()).String(),
- }
- }
- jmethods = append(jmethods, ser)
- }
- return jmethods
-}
diff --git a/vendor/github.com/visualfc/gotools/oracle/oracle/describe15.go b/vendor/github.com/visualfc/gotools/oracle/oracle/describe15.go
deleted file mode 100644
index 5069e40..0000000
--- a/vendor/github.com/visualfc/gotools/oracle/oracle/describe15.go
+++ /dev/null
@@ -1,786 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build go1.5,!go1.6
-
-package oracle
-
-import (
- "bytes"
- "fmt"
- "go/ast"
- exact "go/constant"
- "go/token"
- "go/types"
- "log"
- "os"
- "strings"
-
- "github.com/visualfc/gotools/oracle/oracle/serial"
- "golang.org/x/tools/go/ast/astutil"
- "golang.org/x/tools/go/loader"
- "golang.org/x/tools/go/types/typeutil"
-)
-
-// describe describes the syntax node denoted by the query position,
-// including:
-// - its syntactic category
-// - the definition of its referent (for identifiers) [now redundant]
-// - its type and method set (for an expression or type expression)
-//
-func describe(q *Query) error {
- lconf := loader.Config{Build: q.Build}
- allowErrors(&lconf)
-
- if _, err := importQueryPackage(q.Pos, &lconf); err != nil {
- return err
- }
-
- // Load/parse/type-check the program.
- lprog, err := lconf.Load()
- if err != nil {
- return err
- }
- q.Fset = lprog.Fset
-
- qpos, err := parseQueryPos(lprog, q.Pos, true) // (need exact pos)
- if err != nil {
- return err
- }
-
- if false { // debugging
- fprintf(os.Stderr, lprog.Fset, qpos.path[0], "you selected: %s %s",
- astutil.NodeDescription(qpos.path[0]), pathToString(qpos.path))
- }
-
- path, action := findInterestingNode(qpos.info, qpos.path)
- switch action {
- case actionExpr:
- q.result, err = describeValue(qpos, path)
-
- case actionType:
- q.result, err = describeType(qpos, path)
-
- case actionPackage:
- q.result, err = describePackage(qpos, path)
-
- case actionStmt:
- q.result, err = describeStmt(qpos, path)
-
- case actionUnknown:
- q.result = &describeUnknownResult{path[0]}
-
- default:
- panic(action) // unreachable
- }
- return err
-}
-
-type describeUnknownResult struct {
- node ast.Node
-}
-
-func (r *describeUnknownResult) display(printf printfFunc) {
- // Nothing much to say about misc syntax.
- printf(r.node, "%s", astutil.NodeDescription(r.node))
-}
-
-func (r *describeUnknownResult) toSerial(res *serial.Result, fset *token.FileSet) {
- res.Describe = &serial.Describe{
- Desc: astutil.NodeDescription(r.node),
- Pos: fset.Position(r.node.Pos()).String(),
- }
-}
-
-type action int
-
-const (
- actionUnknown action = iota // None of the below
- actionExpr // FuncDecl, true Expr or Ident(types.{Const,Var})
- actionType // type Expr or Ident(types.TypeName).
- actionStmt // Stmt or Ident(types.Label)
- actionPackage // Ident(types.Package) or ImportSpec
-)
-
-// findInterestingNode classifies the syntax node denoted by path as one of:
-// - an expression, part of an expression or a reference to a constant
-// or variable;
-// - a type, part of a type, or a reference to a named type;
-// - a statement, part of a statement, or a label referring to a statement;
-// - part of a package declaration or import spec.
-// - none of the above.
-// and returns the most "interesting" associated node, which may be
-// the same node, an ancestor or a descendent.
-//
-func findInterestingNode(pkginfo *loader.PackageInfo, path []ast.Node) ([]ast.Node, action) {
- // TODO(adonovan): integrate with go/types/stdlib_test.go and
- // apply this to every AST node we can find to make sure it
- // doesn't crash.
-
- // TODO(adonovan): audit for ParenExpr safety, esp. since we
- // traverse up and down.
-
- // TODO(adonovan): if the users selects the "." in
- // "fmt.Fprintf()", they'll get an ambiguous selection error;
- // we won't even reach here. Can we do better?
-
- // TODO(adonovan): describing a field within 'type T struct {...}'
- // describes the (anonymous) struct type and concludes "no methods".
- // We should ascend to the enclosing type decl, if any.
-
- for len(path) > 0 {
- switch n := path[0].(type) {
- case *ast.GenDecl:
- if len(n.Specs) == 1 {
- // Descend to sole {Import,Type,Value}Spec child.
- path = append([]ast.Node{n.Specs[0]}, path...)
- continue
- }
- return path, actionUnknown // uninteresting
-
- case *ast.FuncDecl:
- // Descend to function name.
- path = append([]ast.Node{n.Name}, path...)
- continue
-
- case *ast.ImportSpec:
- return path, actionPackage
-
- case *ast.ValueSpec:
- if len(n.Names) == 1 {
- // Descend to sole Ident child.
- path = append([]ast.Node{n.Names[0]}, path...)
- continue
- }
- return path, actionUnknown // uninteresting
-
- case *ast.TypeSpec:
- // Descend to type name.
- path = append([]ast.Node{n.Name}, path...)
- continue
-
- case ast.Stmt:
- return path, actionStmt
-
- case *ast.ArrayType,
- *ast.StructType,
- *ast.FuncType,
- *ast.InterfaceType,
- *ast.MapType,
- *ast.ChanType:
- return path, actionType
-
- case *ast.Comment, *ast.CommentGroup, *ast.File, *ast.KeyValueExpr, *ast.CommClause:
- return path, actionUnknown // uninteresting
-
- case *ast.Ellipsis:
- // Continue to enclosing node.
- // e.g. [...]T in ArrayType
- // f(x...) in CallExpr
- // f(x...T) in FuncType
-
- case *ast.Field:
- // TODO(adonovan): this needs more thought,
- // since fields can be so many things.
- if len(n.Names) == 1 {
- // Descend to sole Ident child.
- path = append([]ast.Node{n.Names[0]}, path...)
- continue
- }
- // Zero names (e.g. anon field in struct)
- // or multiple field or param names:
- // continue to enclosing field list.
-
- case *ast.FieldList:
- // Continue to enclosing node:
- // {Struct,Func,Interface}Type or FuncDecl.
-
- case *ast.BasicLit:
- if _, ok := path[1].(*ast.ImportSpec); ok {
- return path[1:], actionPackage
- }
- return path, actionExpr
-
- case *ast.SelectorExpr:
- // TODO(adonovan): use Selections info directly.
- if pkginfo.Uses[n.Sel] == nil {
- // TODO(adonovan): is this reachable?
- return path, actionUnknown
- }
- // Descend to .Sel child.
- path = append([]ast.Node{n.Sel}, path...)
- continue
-
- case *ast.Ident:
- switch pkginfo.ObjectOf(n).(type) {
- case *types.PkgName:
- return path, actionPackage
-
- case *types.Const:
- return path, actionExpr
-
- case *types.Label:
- return path, actionStmt
-
- case *types.TypeName:
- return path, actionType
-
- case *types.Var:
- // For x in 'struct {x T}', return struct type, for now.
- if _, ok := path[1].(*ast.Field); ok {
- _ = path[2].(*ast.FieldList) // assertion
- if _, ok := path[3].(*ast.StructType); ok {
- return path[3:], actionType
- }
- }
- return path, actionExpr
-
- case *types.Func:
- return path, actionExpr
-
- case *types.Builtin:
- // For reference to built-in function, return enclosing call.
- path = path[1:] // ascend to enclosing function call
- continue
-
- case *types.Nil:
- return path, actionExpr
- }
-
- // No object.
- switch path[1].(type) {
- case *ast.SelectorExpr:
- // Return enclosing selector expression.
- return path[1:], actionExpr
-
- case *ast.Field:
- // TODO(adonovan): test this.
- // e.g. all f in:
- // struct { f, g int }
- // interface { f() }
- // func (f T) method(f, g int) (f, g bool)
- //
- // switch path[3].(type) {
- // case *ast.FuncDecl:
- // case *ast.StructType:
- // case *ast.InterfaceType:
- // }
- //
- // return path[1:], actionExpr
- //
- // Unclear what to do with these.
- // Struct.Fields -- field
- // Interface.Methods -- field
- // FuncType.{Params.Results} -- actionExpr
- // FuncDecl.Recv -- actionExpr
-
- case *ast.File:
- // 'package foo'
- return path, actionPackage
-
- case *ast.ImportSpec:
- // TODO(adonovan): fix: why no package object? go/types bug?
- return path[1:], actionPackage
-
- default:
- // e.g. blank identifier
- // or y in "switch y := x.(type)"
- // or code in a _test.go file that's not part of the package.
- log.Printf("unknown reference %s in %T\n", n, path[1])
- return path, actionUnknown
- }
-
- case *ast.StarExpr:
- if pkginfo.Types[n].IsType() {
- return path, actionType
- }
- return path, actionExpr
-
- case ast.Expr:
- // All Expr but {BasicLit,Ident,StarExpr} are
- // "true" expressions that evaluate to a value.
- return path, actionExpr
- }
-
- // Ascend to parent.
- path = path[1:]
- }
-
- return nil, actionUnknown // unreachable
-}
-
-func describeValue(qpos *queryPos, path []ast.Node) (*describeValueResult, error) {
- var expr ast.Expr
- var obj types.Object
- switch n := path[0].(type) {
- case *ast.ValueSpec:
- // ambiguous ValueSpec containing multiple names
- return nil, fmt.Errorf("multiple value specification")
- case *ast.Ident:
- obj = qpos.info.ObjectOf(n)
- expr = n
- case ast.Expr:
- expr = n
- default:
- // TODO(adonovan): is this reachable?
- return nil, fmt.Errorf("unexpected AST for expr: %T", n)
- }
-
- typ := qpos.info.TypeOf(expr)
- constVal := qpos.info.Types[expr].Value
-
- return &describeValueResult{
- qpos: qpos,
- expr: expr,
- typ: typ,
- constVal: constVal,
- obj: obj,
- }, nil
-}
-
-type describeValueResult struct {
- qpos *queryPos
- expr ast.Expr // query node
- typ types.Type // type of expression
- constVal exact.Value // value of expression, if constant
- obj types.Object // var/func/const object, if expr was Ident
-}
-
-func (r *describeValueResult) display(printf printfFunc) {
- var prefix, suffix string
- if r.constVal != nil {
- suffix = fmt.Sprintf(" of constant value %s", constValString(r.constVal))
- }
- switch obj := r.obj.(type) {
- case *types.Func:
- if recv := obj.Type().(*types.Signature).Recv(); recv != nil {
- if _, ok := recv.Type().Underlying().(*types.Interface); ok {
- prefix = "interface method "
- } else {
- prefix = "method "
- }
- }
- }
-
- // Describe the expression.
- if r.obj != nil {
- if r.obj.Pos() == r.expr.Pos() {
- // defining ident
- printf(r.expr, "definition of %s%s%s", prefix, r.qpos.objectString(r.obj), suffix)
- } else {
- // referring ident
- printf(r.expr, "reference to %s%s%s", prefix, r.qpos.objectString(r.obj), suffix)
- if def := r.obj.Pos(); def != token.NoPos {
- printf(def, "defined here")
- }
- }
- } else {
- desc := astutil.NodeDescription(r.expr)
- if suffix != "" {
- // constant expression
- printf(r.expr, "%s%s", desc, suffix)
- } else {
- // non-constant expression
- printf(r.expr, "%s of type %s", desc, r.qpos.typeString(r.typ))
- }
- }
-}
-
-func (r *describeValueResult) toSerial(res *serial.Result, fset *token.FileSet) {
- var value, objpos string
- if r.constVal != nil {
- value = r.constVal.String()
- }
- if r.obj != nil {
- objpos = fset.Position(r.obj.Pos()).String()
- }
-
- res.Describe = &serial.Describe{
- Desc: astutil.NodeDescription(r.expr),
- Pos: fset.Position(r.expr.Pos()).String(),
- Detail: "value",
- Value: &serial.DescribeValue{
- Type: r.qpos.typeString(r.typ),
- Value: value,
- ObjPos: objpos,
- },
- }
-}
-
-// ---- TYPE ------------------------------------------------------------
-
-func describeType(qpos *queryPos, path []ast.Node) (*describeTypeResult, error) {
- var description string
- var t types.Type
- switch n := path[0].(type) {
- case *ast.Ident:
- t = qpos.info.TypeOf(n)
- switch t := t.(type) {
- case *types.Basic:
- description = "reference to built-in "
-
- case *types.Named:
- isDef := t.Obj().Pos() == n.Pos() // see caveats at isDef above
- if isDef {
- description = "definition of "
- } else {
- description = "reference to "
- }
- }
-
- case ast.Expr:
- t = qpos.info.TypeOf(n)
-
- default:
- // Unreachable?
- return nil, fmt.Errorf("unexpected AST for type: %T", n)
- }
-
- description = description + "type " + qpos.typeString(t)
-
- // Show sizes for structs and named types (it's fairly obvious for others).
- switch t.(type) {
- case *types.Named, *types.Struct:
- szs := types.StdSizes{8, 8} // assume amd64
- description = fmt.Sprintf("%s (size %d, align %d)", description,
- szs.Sizeof(t), szs.Alignof(t))
- }
-
- return &describeTypeResult{
- qpos: qpos,
- node: path[0],
- description: description,
- typ: t,
- methods: accessibleMethods(t, qpos.info.Pkg),
- }, nil
-}
-
-type describeTypeResult struct {
- qpos *queryPos
- node ast.Node
- description string
- typ types.Type
- methods []*types.Selection
-}
-
-func (r *describeTypeResult) display(printf printfFunc) {
- printf(r.node, "%s", r.description)
-
- // Show the underlying type for a reference to a named type.
- if nt, ok := r.typ.(*types.Named); ok && r.node.Pos() != nt.Obj().Pos() {
- printf(nt.Obj(), "defined as %s", r.qpos.typeString(nt.Underlying()))
- }
-
- // Print the method set, if the type kind is capable of bearing methods.
- switch r.typ.(type) {
- case *types.Interface, *types.Struct, *types.Named:
- if len(r.methods) > 0 {
- printf(r.node, "Method set:")
- for _, meth := range r.methods {
- // TODO(adonovan): print these relative
- // to the owning package, not the
- // query package.
- printf(meth.Obj(), "\t%s", r.qpos.selectionString(meth))
- }
- } else {
- printf(r.node, "No methods.")
- }
- }
-}
-
-func (r *describeTypeResult) toSerial(res *serial.Result, fset *token.FileSet) {
- var namePos, nameDef string
- if nt, ok := r.typ.(*types.Named); ok {
- namePos = fset.Position(nt.Obj().Pos()).String()
- nameDef = nt.Underlying().String()
- }
- res.Describe = &serial.Describe{
- Desc: r.description,
- Pos: fset.Position(r.node.Pos()).String(),
- Detail: "type",
- Type: &serial.DescribeType{
- Type: r.qpos.typeString(r.typ),
- NamePos: namePos,
- NameDef: nameDef,
- Methods: methodsToSerial(r.qpos.info.Pkg, r.methods, fset),
- },
- }
-}
-
-// ---- PACKAGE ------------------------------------------------------------
-
-func describePackage(qpos *queryPos, path []ast.Node) (*describePackageResult, error) {
- var description string
- var pkg *types.Package
- switch n := path[0].(type) {
- case *ast.ImportSpec:
- var obj types.Object
- if n.Name != nil {
- obj = qpos.info.Defs[n.Name]
- } else {
- obj = qpos.info.Implicits[n]
- }
- pkgname, _ := obj.(*types.PkgName)
- if pkgname == nil {
- return nil, fmt.Errorf("can't import package %s", n.Path.Value)
- }
- pkg = pkgname.Imported()
- description = fmt.Sprintf("import of package %q", pkg.Path())
-
- case *ast.Ident:
- if _, isDef := path[1].(*ast.File); isDef {
- // e.g. package id
- pkg = qpos.info.Pkg
- description = fmt.Sprintf("definition of package %q", pkg.Path())
- } else {
- // e.g. import id "..."
- // or id.F()
- pkg = qpos.info.ObjectOf(n).(*types.PkgName).Imported()
- description = fmt.Sprintf("reference to package %q", pkg.Path())
- }
-
- default:
- // Unreachable?
- return nil, fmt.Errorf("unexpected AST for package: %T", n)
- }
-
- var members []*describeMember
- // NB: "unsafe" has no types.Package
- if pkg != nil {
- // Enumerate the accessible package members
- // in lexicographic order.
- for _, name := range pkg.Scope().Names() {
- if pkg == qpos.info.Pkg || ast.IsExported(name) {
- mem := pkg.Scope().Lookup(name)
- var methods []*types.Selection
- if mem, ok := mem.(*types.TypeName); ok {
- methods = accessibleMethods(mem.Type(), qpos.info.Pkg)
- }
- members = append(members, &describeMember{
- mem,
- methods,
- })
-
- }
- }
- }
-
- return &describePackageResult{qpos.fset, path[0], description, pkg, members}, nil
-}
-
-type describePackageResult struct {
- fset *token.FileSet
- node ast.Node
- description string
- pkg *types.Package
- members []*describeMember // in lexicographic name order
-}
-
-type describeMember struct {
- obj types.Object
- methods []*types.Selection // in types.MethodSet order
-}
-
-func (r *describePackageResult) display(printf printfFunc) {
- printf(r.node, "%s", r.description)
-
- // Compute max width of name "column".
- maxname := 0
- for _, mem := range r.members {
- if l := len(mem.obj.Name()); l > maxname {
- maxname = l
- }
- }
-
- for _, mem := range r.members {
- printf(mem.obj, "\t%s", formatMember(mem.obj, maxname))
- for _, meth := range mem.methods {
- printf(meth.Obj(), "\t\t%s", types.SelectionString(meth, types.RelativeTo(r.pkg)))
- }
- }
-}
-
-func formatMember(obj types.Object, maxname int) string {
- qualifier := types.RelativeTo(obj.Pkg())
- var buf bytes.Buffer
- fmt.Fprintf(&buf, "%-5s %-*s", tokenOf(obj), maxname, obj.Name())
- switch obj := obj.(type) {
- case *types.Const:
- fmt.Fprintf(&buf, " %s = %s", types.TypeString(obj.Type(), qualifier), constValString(obj.Val()))
-
- case *types.Func:
- fmt.Fprintf(&buf, " %s", types.TypeString(obj.Type(), qualifier))
-
- case *types.TypeName:
- // Abbreviate long aggregate type names.
- var abbrev string
- switch t := obj.Type().Underlying().(type) {
- case *types.Interface:
- if t.NumMethods() > 1 {
- abbrev = "interface{...}"
- }
- case *types.Struct:
- if t.NumFields() > 1 {
- abbrev = "struct{...}"
- }
- }
- if abbrev == "" {
- fmt.Fprintf(&buf, " %s", types.TypeString(obj.Type().Underlying(), qualifier))
- } else {
- fmt.Fprintf(&buf, " %s", abbrev)
- }
-
- case *types.Var:
- fmt.Fprintf(&buf, " %s", types.TypeString(obj.Type(), qualifier))
- }
- return buf.String()
-}
-
-func (r *describePackageResult) toSerial(res *serial.Result, fset *token.FileSet) {
- var members []*serial.DescribeMember
- for _, mem := range r.members {
- typ := mem.obj.Type()
- var val string
- switch mem := mem.obj.(type) {
- case *types.Const:
- val = constValString(mem.Val())
- case *types.TypeName:
- typ = typ.Underlying()
- }
- members = append(members, &serial.DescribeMember{
- Name: mem.obj.Name(),
- Type: typ.String(),
- Value: val,
- Pos: fset.Position(mem.obj.Pos()).String(),
- Kind: tokenOf(mem.obj),
- Methods: methodsToSerial(r.pkg, mem.methods, fset),
- })
- }
- res.Describe = &serial.Describe{
- Desc: r.description,
- Pos: fset.Position(r.node.Pos()).String(),
- Detail: "package",
- Package: &serial.DescribePackage{
- Path: r.pkg.Path(),
- Members: members,
- },
- }
-}
-
-func tokenOf(o types.Object) string {
- switch o.(type) {
- case *types.Func:
- return "func"
- case *types.Var:
- return "var"
- case *types.TypeName:
- return "type"
- case *types.Const:
- return "const"
- case *types.PkgName:
- return "package"
- case *types.Builtin:
- return "builtin" // e.g. when describing package "unsafe"
- case *types.Nil:
- return "nil"
- case *types.Label:
- return "label"
- }
- panic(o)
-}
-
-// ---- STATEMENT ------------------------------------------------------------
-
-func describeStmt(qpos *queryPos, path []ast.Node) (*describeStmtResult, error) {
- var description string
- switch n := path[0].(type) {
- case *ast.Ident:
- if qpos.info.Defs[n] != nil {
- description = "labelled statement"
- } else {
- description = "reference to labelled statement"
- }
-
- default:
- // Nothing much to say about statements.
- description = astutil.NodeDescription(n)
- }
- return &describeStmtResult{qpos.fset, path[0], description}, nil
-}
-
-type describeStmtResult struct {
- fset *token.FileSet
- node ast.Node
- description string
-}
-
-func (r *describeStmtResult) display(printf printfFunc) {
- printf(r.node, "%s", r.description)
-}
-
-func (r *describeStmtResult) toSerial(res *serial.Result, fset *token.FileSet) {
- res.Describe = &serial.Describe{
- Desc: r.description,
- Pos: fset.Position(r.node.Pos()).String(),
- Detail: "unknown",
- }
-}
-
-// ------------------- Utilities -------------------
-
-// pathToString returns a string containing the concrete types of the
-// nodes in path.
-func pathToString(path []ast.Node) string {
- var buf bytes.Buffer
- fmt.Fprint(&buf, "[")
- for i, n := range path {
- if i > 0 {
- fmt.Fprint(&buf, " ")
- }
- fmt.Fprint(&buf, strings.TrimPrefix(fmt.Sprintf("%T", n), "*ast."))
- }
- fmt.Fprint(&buf, "]")
- return buf.String()
-}
-
-func accessibleMethods(t types.Type, from *types.Package) []*types.Selection {
- var methods []*types.Selection
- for _, meth := range typeutil.IntuitiveMethodSet(t, nil) {
- if isAccessibleFrom(meth.Obj(), from) {
- methods = append(methods, meth)
- }
- }
- return methods
-}
-
-func isAccessibleFrom(obj types.Object, pkg *types.Package) bool {
- return ast.IsExported(obj.Name()) || obj.Pkg() == pkg
-}
-
-func methodsToSerial(this *types.Package, methods []*types.Selection, fset *token.FileSet) []serial.DescribeMethod {
- qualifier := types.RelativeTo(this)
- var jmethods []serial.DescribeMethod
- for _, meth := range methods {
- var ser serial.DescribeMethod
- if meth != nil { // may contain nils when called by implements (on a method)
- ser = serial.DescribeMethod{
- Name: types.SelectionString(meth, qualifier),
- Pos: fset.Position(meth.Obj().Pos()).String(),
- }
- }
- jmethods = append(jmethods, ser)
- }
- return jmethods
-}
-
-// constValString emulates Go 1.6's go/constant.ExactString well enough
-// to make the tests pass. This is just a stopgap until we throw away
-// all the *15.go files.
-func constValString(v exact.Value) string {
- if v.Kind() == exact.Float {
- f, _ := exact.Float64Val(v)
- return fmt.Sprintf("%g", f)
- }
- return v.String()
-}
diff --git a/vendor/github.com/visualfc/gotools/oracle/oracle/freevars.go b/vendor/github.com/visualfc/gotools/oracle/oracle/freevars.go
deleted file mode 100644
index 3d7f2bf..0000000
--- a/vendor/github.com/visualfc/gotools/oracle/oracle/freevars.go
+++ /dev/null
@@ -1,224 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build go1.5
-
-package oracle
-
-import (
- "bytes"
- "go/ast"
- "go/printer"
- "go/token"
- "go/types"
- "sort"
-
- "github.com/visualfc/gotools/oracle/oracle/serial"
- "golang.org/x/tools/go/loader"
-)
-
-// freevars displays the lexical (not package-level) free variables of
-// the selection.
-//
-// It treats A.B.C as a separate variable from A to reveal the parts
-// of an aggregate type that are actually needed.
-// This aids refactoring.
-//
-// TODO(adonovan): optionally display the free references to
-// file/package scope objects, and to objects from other packages.
-// Depending on where the resulting function abstraction will go,
-// these might be interesting. Perhaps group the results into three
-// bands.
-//
-func freevars(q *Query) error {
- lconf := loader.Config{Build: q.Build}
- allowErrors(&lconf)
-
- if _, err := importQueryPackage(q.Pos, &lconf); err != nil {
- return err
- }
-
- // Load/parse/type-check the program.
- lprog, err := lconf.Load()
- if err != nil {
- return err
- }
- q.Fset = lprog.Fset
-
- qpos, err := parseQueryPos(lprog, q.Pos, false)
- if err != nil {
- return err
- }
-
- file := qpos.path[len(qpos.path)-1] // the enclosing file
- fileScope := qpos.info.Scopes[file]
- pkgScope := fileScope.Parent()
-
- // The id and sel functions return non-nil if they denote an
- // object o or selection o.x.y that is referenced by the
- // selection but defined neither within the selection nor at
- // file scope, i.e. it is in the lexical environment.
- var id func(n *ast.Ident) types.Object
- var sel func(n *ast.SelectorExpr) types.Object
-
- sel = func(n *ast.SelectorExpr) types.Object {
- switch x := unparen(n.X).(type) {
- case *ast.SelectorExpr:
- return sel(x)
- case *ast.Ident:
- return id(x)
- }
- return nil
- }
-
- id = func(n *ast.Ident) types.Object {
- obj := qpos.info.Uses[n]
- if obj == nil {
- return nil // not a reference
- }
- if _, ok := obj.(*types.PkgName); ok {
- return nil // imported package
- }
- if !(file.Pos() <= obj.Pos() && obj.Pos() <= file.End()) {
- return nil // not defined in this file
- }
- scope := obj.Parent()
- if scope == nil {
- return nil // e.g. interface method, struct field
- }
- if scope == fileScope || scope == pkgScope {
- return nil // defined at file or package scope
- }
- if qpos.start <= obj.Pos() && obj.Pos() <= qpos.end {
- return nil // defined within selection => not free
- }
- return obj
- }
-
- // Maps each reference that is free in the selection
- // to the object it refers to.
- // The map de-duplicates repeated references.
- refsMap := make(map[string]freevarsRef)
-
- // Visit all the identifiers in the selected ASTs.
- ast.Inspect(qpos.path[0], func(n ast.Node) bool {
- if n == nil {
- return true // popping DFS stack
- }
-
- // Is this node contained within the selection?
- // (freevars permits inexact selections,
- // like two stmts in a block.)
- if qpos.start <= n.Pos() && n.End() <= qpos.end {
- var obj types.Object
- var prune bool
- switch n := n.(type) {
- case *ast.Ident:
- obj = id(n)
-
- case *ast.SelectorExpr:
- obj = sel(n)
- prune = true
- }
-
- if obj != nil {
- var kind string
- switch obj.(type) {
- case *types.Var:
- kind = "var"
- case *types.Func:
- kind = "func"
- case *types.TypeName:
- kind = "type"
- case *types.Const:
- kind = "const"
- case *types.Label:
- kind = "label"
- default:
- panic(obj)
- }
-
- typ := qpos.info.TypeOf(n.(ast.Expr))
- ref := freevarsRef{kind, printNode(lprog.Fset, n), typ, obj}
- refsMap[ref.ref] = ref
-
- if prune {
- return false // don't descend
- }
- }
- }
-
- return true // descend
- })
-
- refs := make([]freevarsRef, 0, len(refsMap))
- for _, ref := range refsMap {
- refs = append(refs, ref)
- }
- sort.Sort(byRef(refs))
-
- q.result = &freevarsResult{
- qpos: qpos,
- refs: refs,
- }
- return nil
-}
-
-type freevarsResult struct {
- qpos *queryPos
- refs []freevarsRef
-}
-
-type freevarsRef struct {
- kind string
- ref string
- typ types.Type
- obj types.Object
-}
-
-func (r *freevarsResult) display(printf printfFunc) {
- if len(r.refs) == 0 {
- printf(r.qpos, "No free identifiers.")
- } else {
- printf(r.qpos, "Free identifiers:")
- qualifier := types.RelativeTo(r.qpos.info.Pkg)
- for _, ref := range r.refs {
- // Avoid printing "type T T".
- var typstr string
- if ref.kind != "type" {
- typstr = " " + types.TypeString(ref.typ, qualifier)
- }
- printf(ref.obj, "%s %s%s", ref.kind, ref.ref, typstr)
- }
- }
-}
-
-func (r *freevarsResult) toSerial(res *serial.Result, fset *token.FileSet) {
- var refs []*serial.FreeVar
- for _, ref := range r.refs {
- refs = append(refs,
- &serial.FreeVar{
- Pos: fset.Position(ref.obj.Pos()).String(),
- Kind: ref.kind,
- Ref: ref.ref,
- Type: ref.typ.String(),
- })
- }
- res.Freevars = refs
-}
-
-// -------- utils --------
-
-type byRef []freevarsRef
-
-func (p byRef) Len() int { return len(p) }
-func (p byRef) Less(i, j int) bool { return p[i].ref < p[j].ref }
-func (p byRef) Swap(i, j int) { p[i], p[j] = p[j], p[i] }
-
-// printNode returns the pretty-printed syntax of n.
-func printNode(fset *token.FileSet, n ast.Node) string {
- var buf bytes.Buffer
- printer.Fprint(&buf, fset, n)
- return buf.String()
-}
diff --git a/vendor/github.com/visualfc/gotools/oracle/oracle/implements.go b/vendor/github.com/visualfc/gotools/oracle/oracle/implements.go
deleted file mode 100644
index aafa536..0000000
--- a/vendor/github.com/visualfc/gotools/oracle/oracle/implements.go
+++ /dev/null
@@ -1,354 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build go1.5
-
-package oracle
-
-import (
- "fmt"
- "go/ast"
- "go/token"
- "go/types"
- "reflect"
- "sort"
- "strings"
-
- "github.com/visualfc/gotools/oracle/oracle/serial"
- "golang.org/x/tools/go/loader"
- "golang.org/x/tools/go/types/typeutil"
- "golang.org/x/tools/refactor/importgraph"
-)
-
-// Implements displays the "implements" relation as it pertains to the
-// selected type.
-// If the selection is a method, 'implements' displays
-// the corresponding methods of the types that would have been reported
-// by an implements query on the receiver type.
-//
-func implements(q *Query) error {
- lconf := loader.Config{Build: q.Build}
- allowErrors(&lconf)
-
- qpkg, err := importQueryPackage(q.Pos, &lconf)
- if err != nil {
- return err
- }
-
- // Set the packages to search.
- if len(q.Scope) > 0 {
- // Inspect all packages in the analysis scope, if specified.
- if err := setPTAScope(&lconf, q.Scope); err != nil {
- return err
- }
- } else {
- // Otherwise inspect the forward and reverse
- // transitive closure of the selected package.
- // (In theory even this is incomplete.)
- _, rev, _ := importgraph.Build(q.Build)
- for path := range rev.Search(qpkg) {
- lconf.ImportWithTests(path)
- }
-
- // TODO(adonovan): for completeness, we should also
- // type-check and inspect function bodies in all
- // imported packages. This would be expensive, but we
- // could optimize by skipping functions that do not
- // contain type declarations. This would require
- // changing the loader's TypeCheckFuncBodies hook to
- // provide the []*ast.File.
- }
-
- // Load/parse/type-check the program.
- lprog, err := lconf.Load()
- if err != nil {
- return err
- }
- q.Fset = lprog.Fset
-
- qpos, err := parseQueryPos(lprog, q.Pos, false)
- if err != nil {
- return err
- }
-
- // Find the selected type.
- path, action := findInterestingNode(qpos.info, qpos.path)
-
- var method *types.Func
- var T types.Type // selected type (receiver if method != nil)
-
- switch action {
- case actionExpr:
- // method?
- if id, ok := path[0].(*ast.Ident); ok {
- if obj, ok := qpos.info.ObjectOf(id).(*types.Func); ok {
- recv := obj.Type().(*types.Signature).Recv()
- if recv == nil {
- return fmt.Errorf("this function is not a method")
- }
- method = obj
- T = recv.Type()
- }
- }
- case actionType:
- T = qpos.info.TypeOf(path[0].(ast.Expr))
- }
- if T == nil {
- return fmt.Errorf("no type or method here")
- }
-
- // Find all named types, even local types (which can have
- // methods via promotion) and the built-in "error".
- var allNamed []types.Type
- for _, info := range lprog.AllPackages {
- for _, obj := range info.Defs {
- if obj, ok := obj.(*types.TypeName); ok {
- allNamed = append(allNamed, obj.Type())
- }
- }
- }
- allNamed = append(allNamed, types.Universe.Lookup("error").Type())
-
- var msets typeutil.MethodSetCache
-
- // Test each named type.
- var to, from, fromPtr []types.Type
- for _, U := range allNamed {
- if isInterface(T) {
- if msets.MethodSet(T).Len() == 0 {
- continue // empty interface
- }
- if isInterface(U) {
- if msets.MethodSet(U).Len() == 0 {
- continue // empty interface
- }
-
- // T interface, U interface
- if !types.Identical(T, U) {
- if types.AssignableTo(U, T) {
- to = append(to, U)
- }
- if types.AssignableTo(T, U) {
- from = append(from, U)
- }
- }
- } else {
- // T interface, U concrete
- if types.AssignableTo(U, T) {
- to = append(to, U)
- } else if pU := types.NewPointer(U); types.AssignableTo(pU, T) {
- to = append(to, pU)
- }
- }
- } else if isInterface(U) {
- if msets.MethodSet(U).Len() == 0 {
- continue // empty interface
- }
-
- // T concrete, U interface
- if types.AssignableTo(T, U) {
- from = append(from, U)
- } else if pT := types.NewPointer(T); types.AssignableTo(pT, U) {
- fromPtr = append(fromPtr, U)
- }
- }
- }
-
- var pos interface{} = qpos
- if nt, ok := deref(T).(*types.Named); ok {
- pos = nt.Obj()
- }
-
- // Sort types (arbitrarily) to ensure test determinism.
- sort.Sort(typesByString(to))
- sort.Sort(typesByString(from))
- sort.Sort(typesByString(fromPtr))
-
- var toMethod, fromMethod, fromPtrMethod []*types.Selection // contain nils
- if method != nil {
- for _, t := range to {
- toMethod = append(toMethod,
- types.NewMethodSet(t).Lookup(method.Pkg(), method.Name()))
- }
- for _, t := range from {
- fromMethod = append(fromMethod,
- types.NewMethodSet(t).Lookup(method.Pkg(), method.Name()))
- }
- for _, t := range fromPtr {
- fromPtrMethod = append(fromPtrMethod,
- types.NewMethodSet(t).Lookup(method.Pkg(), method.Name()))
- }
- }
-
- q.result = &implementsResult{
- qpos, T, pos, to, from, fromPtr, method, toMethod, fromMethod, fromPtrMethod,
- }
- return nil
-}
-
-type implementsResult struct {
- qpos *queryPos
-
- t types.Type // queried type (not necessarily named)
- pos interface{} // pos of t (*types.Name or *QueryPos)
- to []types.Type // named or ptr-to-named types assignable to interface T
- from []types.Type // named interfaces assignable from T
- fromPtr []types.Type // named interfaces assignable only from *T
-
- // if a method was queried:
- method *types.Func // queried method
- toMethod []*types.Selection // method of type to[i], if any
- fromMethod []*types.Selection // method of type from[i], if any
- fromPtrMethod []*types.Selection // method of type fromPtrMethod[i], if any
-}
-
-func (r *implementsResult) display(printf printfFunc) {
- relation := "is implemented by"
-
- meth := func(sel *types.Selection) {
- if sel != nil {
- printf(sel.Obj(), "\t%s method (%s).%s",
- relation, r.qpos.typeString(sel.Recv()), sel.Obj().Name())
- }
- }
-
- if isInterface(r.t) {
- if types.NewMethodSet(r.t).Len() == 0 { // TODO(adonovan): cache mset
- printf(r.pos, "empty interface type %s", r.qpos.typeString(r.t))
- return
- }
-
- if r.method == nil {
- printf(r.pos, "interface type %s", r.qpos.typeString(r.t))
- } else {
- printf(r.method, "abstract method %s", r.qpos.objectString(r.method))
- }
-
- // Show concrete types (or methods) first; use two passes.
- for i, sub := range r.to {
- if !isInterface(sub) {
- if r.method == nil {
- printf(deref(sub).(*types.Named).Obj(), "\t%s %s type %s",
- relation, typeKind(sub), r.qpos.typeString(sub))
- } else {
- meth(r.toMethod[i])
- }
- }
- }
- for i, sub := range r.to {
- if isInterface(sub) {
- if r.method == nil {
- printf(sub.(*types.Named).Obj(), "\t%s %s type %s",
- relation, typeKind(sub), r.qpos.typeString(sub))
- } else {
- meth(r.toMethod[i])
- }
- }
- }
-
- relation = "implements"
- for i, super := range r.from {
- if r.method == nil {
- printf(super.(*types.Named).Obj(), "\t%s %s",
- relation, r.qpos.typeString(super))
- } else {
- meth(r.fromMethod[i])
- }
- }
- } else {
- relation = "implements"
-
- if r.from != nil {
- if r.method == nil {
- printf(r.pos, "%s type %s",
- typeKind(r.t), r.qpos.typeString(r.t))
- } else {
- printf(r.method, "concrete method %s",
- r.qpos.objectString(r.method))
- }
- for i, super := range r.from {
- if r.method == nil {
- printf(super.(*types.Named).Obj(), "\t%s %s",
- relation, r.qpos.typeString(super))
- } else {
- meth(r.fromMethod[i])
- }
- }
- }
- if r.fromPtr != nil {
- if r.method == nil {
- printf(r.pos, "pointer type *%s", r.qpos.typeString(r.t))
- } else {
- // TODO(adonovan): de-dup (C).f and (*C).f implementing (I).f.
- printf(r.method, "concrete method %s",
- r.qpos.objectString(r.method))
- }
-
- for i, psuper := range r.fromPtr {
- if r.method == nil {
- printf(psuper.(*types.Named).Obj(), "\t%s %s",
- relation, r.qpos.typeString(psuper))
- } else {
- meth(r.fromPtrMethod[i])
- }
- }
- } else if r.from == nil {
- printf(r.pos, "%s type %s implements only interface{}",
- typeKind(r.t), r.qpos.typeString(r.t))
- }
- }
-}
-
-func (r *implementsResult) toSerial(res *serial.Result, fset *token.FileSet) {
- res.Implements = &serial.Implements{
- T: makeImplementsType(r.t, fset),
- AssignableTo: makeImplementsTypes(r.to, fset),
- AssignableFrom: makeImplementsTypes(r.from, fset),
- AssignableFromPtr: makeImplementsTypes(r.fromPtr, fset),
- AssignableToMethod: methodsToSerial(r.qpos.info.Pkg, r.toMethod, fset),
- AssignableFromMethod: methodsToSerial(r.qpos.info.Pkg, r.fromMethod, fset),
- AssignableFromPtrMethod: methodsToSerial(r.qpos.info.Pkg, r.fromPtrMethod, fset),
- }
- if r.method != nil {
- res.Implements.Method = &serial.DescribeMethod{
- Name: r.qpos.objectString(r.method),
- Pos: fset.Position(r.method.Pos()).String(),
- }
- }
-}
-
-func makeImplementsTypes(tt []types.Type, fset *token.FileSet) []serial.ImplementsType {
- var r []serial.ImplementsType
- for _, t := range tt {
- r = append(r, makeImplementsType(t, fset))
- }
- return r
-}
-
-func makeImplementsType(T types.Type, fset *token.FileSet) serial.ImplementsType {
- var pos token.Pos
- if nt, ok := deref(T).(*types.Named); ok { // implementsResult.t may be non-named
- pos = nt.Obj().Pos()
- }
- return serial.ImplementsType{
- Name: T.String(),
- Pos: fset.Position(pos).String(),
- Kind: typeKind(T),
- }
-}
-
-// typeKind returns a string describing the underlying kind of type,
-// e.g. "slice", "array", "struct".
-func typeKind(T types.Type) string {
- s := reflect.TypeOf(T.Underlying()).String()
- return strings.ToLower(strings.TrimPrefix(s, "*types."))
-}
-
-func isInterface(T types.Type) bool { return types.IsInterface(T) }
-
-type typesByString []types.Type
-
-func (p typesByString) Len() int { return len(p) }
-func (p typesByString) Less(i, j int) bool { return p[i].String() < p[j].String() }
-func (p typesByString) Swap(i, j int) { p[i], p[j] = p[j], p[i] }
diff --git a/vendor/github.com/visualfc/gotools/oracle/oracle/oracle.go b/vendor/github.com/visualfc/gotools/oracle/oracle/oracle.go
deleted file mode 100644
index cffaa2d..0000000
--- a/vendor/github.com/visualfc/gotools/oracle/oracle/oracle.go
+++ /dev/null
@@ -1,381 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build go1.5
-
-// Package oracle contains the implementation of the oracle tool whose
-// command-line is provided by golang.org/x/tools/cmd/oracle.
-//
-// http://golang.org/s/oracle-design
-// http://golang.org/s/oracle-user-manual
-//
-package oracle
-
-// This file defines oracle.Query, the entry point for the oracle tool.
-// The actual executable is defined in cmd/oracle.
-
-// TODO(adonovan): new queries
-// - show all statements that may update the selected lvalue
-// (local, global, field, etc).
-// - show all places where an object of type T is created
-// (&T{}, var t T, new(T), new(struct{array [3]T}), etc.
-
-import (
- "fmt"
- "go/ast"
- "go/build"
- "go/parser"
- "go/token"
- "go/types"
- "io"
- "path/filepath"
-
- "github.com/visualfc/gotools/oracle/oracle/serial"
- "golang.org/x/tools/go/ast/astutil"
- "golang.org/x/tools/go/buildutil"
- "golang.org/x/tools/go/loader"
- "golang.org/x/tools/go/pointer"
- "golang.org/x/tools/go/ssa"
-)
-
-type printfFunc func(pos interface{}, format string, args ...interface{})
-
-// queryResult is the interface of each query-specific result type.
-type queryResult interface {
- toSerial(res *serial.Result, fset *token.FileSet)
- display(printf printfFunc)
-}
-
-// A QueryPos represents the position provided as input to a query:
-// a textual extent in the program's source code, the AST node it
-// corresponds to, and the package to which it belongs.
-// Instances are created by parseQueryPos.
-type queryPos struct {
- fset *token.FileSet
- start, end token.Pos // source extent of query
- path []ast.Node // AST path from query node to root of ast.File
- exact bool // 2nd result of PathEnclosingInterval
- info *loader.PackageInfo // type info for the queried package (nil for fastQueryPos)
-}
-
-// TypeString prints type T relative to the query position.
-func (qpos *queryPos) typeString(T types.Type) string {
- return types.TypeString(T, types.RelativeTo(qpos.info.Pkg))
-}
-
-// ObjectString prints object obj relative to the query position.
-func (qpos *queryPos) objectString(obj types.Object) string {
- return types.ObjectString(obj, types.RelativeTo(qpos.info.Pkg))
-}
-
-// SelectionString prints selection sel relative to the query position.
-func (qpos *queryPos) selectionString(sel *types.Selection) string {
- return types.SelectionString(sel, types.RelativeTo(qpos.info.Pkg))
-}
-
-// A Query specifies a single oracle query.
-type Query struct {
- Mode string // query mode ("callers", etc)
- Pos string // query position
- Build *build.Context // package loading configuration
-
- // pointer analysis options
- Scope []string // main packages in (*loader.Config).FromArgs syntax
- PTALog io.Writer // (optional) pointer-analysis log file
- Reflection bool // model reflection soundly (currently slow).
-
- // Populated during Run()
- Fset *token.FileSet
- result queryResult
-}
-
-// Serial returns an instance of serial.Result, which implements the
-// {xml,json}.Marshaler interfaces so that query results can be
-// serialized as JSON or XML.
-//
-func (q *Query) Serial() *serial.Result {
- resj := &serial.Result{Mode: q.Mode}
- q.result.toSerial(resj, q.Fset)
- return resj
-}
-
-// WriteTo writes the oracle query result res to out in a compiler diagnostic format.
-func (q *Query) WriteTo(out io.Writer) {
- printf := func(pos interface{}, format string, args ...interface{}) {
- fprintf(out, q.Fset, pos, format, args...)
- }
- q.result.display(printf)
-}
-
-// Run runs an oracle query and populates its Fset and Result.
-func Run(q *Query) error {
- switch q.Mode {
- case "callees":
- return callees(q)
- case "callers":
- return callers(q)
- case "callstack":
- return callstack(q)
- case "peers":
- return peers(q)
- case "pointsto":
- return pointsto(q)
- case "whicherrs":
- return whicherrs(q)
- case "definition":
- return definition(q)
- case "describe":
- return describe(q)
- case "freevars":
- return freevars(q)
- case "implements":
- return implements(q)
- case "referrers":
- return referrers(q)
- case "what":
- return what(q)
- default:
- return fmt.Errorf("invalid mode: %q", q.Mode)
- }
-}
-
-func setPTAScope(lconf *loader.Config, scope []string) error {
- pkgs := buildutil.ExpandPatterns(lconf.Build, scope)
- if len(pkgs) == 0 {
- return fmt.Errorf("no packages specified for pointer analysis scope")
- }
- // The value of each entry in pkgs is true,
- // giving ImportWithTests (not Import) semantics.
- lconf.ImportPkgs = pkgs
- return nil
-}
-
-//func setPTAScope(lconf *loader.Config, scope []string) error {
-// if len(scope) == 0 {
-// return fmt.Errorf("no packages specified for pointer analysis scope")
-// }
-
-// // Determine initial packages for PTA.
-// args, err := lconf.FromArgs(scope, true)
-// if err != nil {
-// return err
-// }
-// if len(args) > 0 {
-// return fmt.Errorf("surplus arguments: %q", args)
-// }
-// return nil
-//}
-
-// Create a pointer.Config whose scope is the initial packages of lprog
-// and their dependencies.
-func setupPTA(prog *ssa.Program, lprog *loader.Program, ptaLog io.Writer, reflection bool) (*pointer.Config, error) {
- // TODO(adonovan): the body of this function is essentially
- // duplicated in all go/pointer clients. Refactor.
-
- // For each initial package (specified on the command line),
- // if it has a main function, analyze that,
- // otherwise analyze its tests, if any.
- var testPkgs, mains []*ssa.Package
- for _, info := range lprog.InitialPackages() {
- initialPkg := prog.Package(info.Pkg)
-
- // Add package to the pointer analysis scope.
- if initialPkg.Func("main") != nil {
- mains = append(mains, initialPkg)
- } else {
- testPkgs = append(testPkgs, initialPkg)
- }
- }
- if testPkgs != nil {
- for _, testPkg := range testPkgs {
- if p := prog.CreateTestMainPackage(testPkg); p != nil {
- mains = append(mains, p)
- }
- }
- }
- if mains == nil {
- return nil, fmt.Errorf("analysis scope has no main and no tests")
- }
- return &pointer.Config{
- Log: ptaLog,
- Reflection: reflection,
- Mains: mains,
- }, nil
-}
-
-// importQueryPackage finds the package P containing the
-// query position and tells conf to import it.
-// It returns the package's path.
-func importQueryPackage(pos string, conf *loader.Config) (string, error) {
- fqpos, err := fastQueryPos(pos)
- if err != nil {
- return "", err // bad query
- }
- filename := fqpos.fset.File(fqpos.start).Name()
-
- // This will not work for ad-hoc packages
- // such as $GOROOT/src/net/http/triv.go.
- // TODO(adonovan): ensure we report a clear error.
- _, importPath, err := guessImportPath(filename, conf.Build)
- if err != nil {
- return "", err // can't find GOPATH dir
- }
- if importPath == "" {
- return "", fmt.Errorf("can't guess import path from %s", filename)
- }
-
- // Check that it's possible to load the queried package.
- // (e.g. oracle tests contain different 'package' decls in same dir.)
- // Keep consistent with logic in loader/util.go!
- cfg2 := *conf.Build
- cfg2.CgoEnabled = false
- bp, err := cfg2.Import(importPath, "", 0)
- if err != nil {
- return "", err // no files for package
- }
-
- switch pkgContainsFile(bp, filename) {
- case 'T':
- conf.ImportWithTests(importPath)
- case 'X':
- conf.ImportWithTests(importPath)
- importPath += "_test" // for TypeCheckFuncBodies
- case 'G':
- conf.Import(importPath)
- default:
- return "", fmt.Errorf("package %q doesn't contain file %s",
- importPath, filename)
- }
-
- conf.TypeCheckFuncBodies = func(p string) bool { return p == importPath }
-
- return importPath, nil
-}
-
-// pkgContainsFile reports whether file was among the packages Go
-// files, Test files, eXternal test files, or not found.
-func pkgContainsFile(bp *build.Package, filename string) byte {
- for i, files := range [][]string{bp.GoFiles, bp.TestGoFiles, bp.XTestGoFiles} {
- for _, file := range files {
- if sameFile(filepath.Join(bp.Dir, file), filename) {
- return "GTX"[i]
- }
- }
- }
- return 0 // not found
-}
-
-// ParseQueryPos parses the source query position pos and returns the
-// AST node of the loaded program lprog that it identifies.
-// If needExact, it must identify a single AST subtree;
-// this is appropriate for queries that allow fairly arbitrary syntax,
-// e.g. "describe".
-//
-func parseQueryPos(lprog *loader.Program, posFlag string, needExact bool) (*queryPos, error) {
- filename, startOffset, endOffset, err := parsePosFlag(posFlag)
- if err != nil {
- return nil, err
- }
- start, end, err := findQueryPos(lprog.Fset, filename, startOffset, endOffset)
- if err != nil {
- return nil, err
- }
- info, path, exact := lprog.PathEnclosingInterval(start, end)
- if path == nil {
- return nil, fmt.Errorf("no syntax here")
- }
- if needExact && !exact {
- return nil, fmt.Errorf("ambiguous selection within %s", astutil.NodeDescription(path[0]))
- }
- return &queryPos{lprog.Fset, start, end, path, exact, info}, nil
-}
-
-// ---------- Utilities ----------
-
-// allowErrors causes type errors to be silently ignored.
-// (Not suitable if SSA construction follows.)
-func allowErrors(lconf *loader.Config) {
- ctxt := *lconf.Build // copy
- ctxt.CgoEnabled = false
- lconf.Build = &ctxt
- lconf.AllowErrors = true
- // AllErrors makes the parser always return an AST instead of
- // bailing out after 10 errors and returning an empty ast.File.
- lconf.ParserMode = parser.AllErrors
- lconf.TypeChecker.Error = func(err error) {}
-}
-
-// ptrAnalysis runs the pointer analysis and returns its result.
-func ptrAnalysis(conf *pointer.Config) *pointer.Result {
- result, err := pointer.Analyze(conf)
- if err != nil {
- panic(err) // pointer analysis internal error
- }
- return result
-}
-
-func unparen(e ast.Expr) ast.Expr { return astutil.Unparen(e) }
-
-// deref returns a pointer's element type; otherwise it returns typ.
-func deref(typ types.Type) types.Type {
- if p, ok := typ.Underlying().(*types.Pointer); ok {
- return p.Elem()
- }
- return typ
-}
-
-// fprintf prints to w a message of the form "location: message\n"
-// where location is derived from pos.
-//
-// pos must be one of:
-// - a token.Pos, denoting a position
-// - an ast.Node, denoting an interval
-// - anything with a Pos() method:
-// ssa.Member, ssa.Value, ssa.Instruction, types.Object, pointer.Label, etc.
-// - a QueryPos, denoting the extent of the user's query.
-// - nil, meaning no position at all.
-//
-// The output format is is compatible with the 'gnu'
-// compilation-error-regexp in Emacs' compilation mode.
-// TODO(adonovan): support other editors.
-//
-func fprintf(w io.Writer, fset *token.FileSet, pos interface{}, format string, args ...interface{}) {
- var start, end token.Pos
- switch pos := pos.(type) {
- case ast.Node:
- start = pos.Pos()
- end = pos.End()
- case token.Pos:
- start = pos
- end = start
- case interface {
- Pos() token.Pos
- }:
- start = pos.Pos()
- end = start
- case *queryPos:
- start = pos.start
- end = pos.end
- case nil:
- // no-op
- default:
- panic(fmt.Sprintf("invalid pos: %T", pos))
- }
-
- if sp := fset.Position(start); start == end {
- // (prints "-: " for token.NoPos)
- fmt.Fprintf(w, "%s: ", sp)
- } else {
- ep := fset.Position(end)
- // The -1 below is a concession to Emacs's broken use of
- // inclusive (not half-open) intervals.
- // Other editors may not want it.
- // TODO(adonovan): add an -editor=vim|emacs|acme|auto
- // flag; auto uses EMACS=t / VIM=... / etc env vars.
- fmt.Fprintf(w, "%s:%d.%d-%d.%d: ",
- sp.Filename, sp.Line, sp.Column, ep.Line, ep.Column-1)
- }
- fmt.Fprintf(w, format, args...)
- io.WriteString(w, "\n")
-}
diff --git a/vendor/github.com/visualfc/gotools/oracle/oracle/peers.go b/vendor/github.com/visualfc/gotools/oracle/oracle/peers.go
deleted file mode 100644
index 70f455a..0000000
--- a/vendor/github.com/visualfc/gotools/oracle/oracle/peers.go
+++ /dev/null
@@ -1,254 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build go1.5
-
-package oracle
-
-import (
- "fmt"
- "go/ast"
- "go/token"
- "go/types"
- "sort"
-
- "github.com/visualfc/gotools/oracle/oracle/serial"
- "golang.org/x/tools/go/loader"
- "golang.org/x/tools/go/ssa"
- "golang.org/x/tools/go/ssa/ssautil"
-)
-
-// peers enumerates, for a given channel send (or receive) operation,
-// the set of possible receives (or sends) that correspond to it.
-//
-// TODO(adonovan): support reflect.{Select,Recv,Send,Close}.
-// TODO(adonovan): permit the user to query based on a MakeChan (not send/recv),
-// or the implicit receive in "for v := range ch".
-func peers(q *Query) error {
- lconf := loader.Config{Build: q.Build}
-
- if err := setPTAScope(&lconf, q.Scope); err != nil {
- return err
- }
-
- // Load/parse/type-check the program.
- lprog, err := lconf.Load()
- if err != nil {
- return err
- }
- q.Fset = lprog.Fset
-
- qpos, err := parseQueryPos(lprog, q.Pos, false)
- if err != nil {
- return err
- }
-
- prog := ssautil.CreateProgram(lprog, ssa.GlobalDebug)
-
- ptaConfig, err := setupPTA(prog, lprog, q.PTALog, q.Reflection)
- if err != nil {
- return err
- }
-
- opPos := findOp(qpos)
- if opPos == token.NoPos {
- return fmt.Errorf("there is no channel operation here")
- }
-
- // Defer SSA construction till after errors are reported.
- prog.Build()
-
- var queryOp chanOp // the originating send or receive operation
- var ops []chanOp // all sends/receives of opposite direction
-
- // Look at all channel operations in the whole ssa.Program.
- // Build a list of those of same type as the query.
- allFuncs := ssautil.AllFunctions(prog)
- for fn := range allFuncs {
- for _, b := range fn.Blocks {
- for _, instr := range b.Instrs {
- for _, op := range chanOps(instr) {
- ops = append(ops, op)
- if op.pos == opPos {
- queryOp = op // we found the query op
- }
- }
- }
- }
- }
- if queryOp.ch == nil {
- return fmt.Errorf("ssa.Instruction for send/receive not found")
- }
-
- // Discard operations of wrong channel element type.
- // Build set of channel ssa.Values as query to pointer analysis.
- // We compare channels by element types, not channel types, to
- // ignore both directionality and type names.
- queryType := queryOp.ch.Type()
- queryElemType := queryType.Underlying().(*types.Chan).Elem()
- ptaConfig.AddQuery(queryOp.ch)
- i := 0
- for _, op := range ops {
- if types.Identical(op.ch.Type().Underlying().(*types.Chan).Elem(), queryElemType) {
- ptaConfig.AddQuery(op.ch)
- ops[i] = op
- i++
- }
- }
- ops = ops[:i]
-
- // Run the pointer analysis.
- ptares := ptrAnalysis(ptaConfig)
-
- // Find the points-to set.
- queryChanPtr := ptares.Queries[queryOp.ch]
-
- // Ascertain which make(chan) labels the query's channel can alias.
- var makes []token.Pos
- for _, label := range queryChanPtr.PointsTo().Labels() {
- makes = append(makes, label.Pos())
- }
- sort.Sort(byPos(makes))
-
- // Ascertain which channel operations can alias the same make(chan) labels.
- var sends, receives, closes []token.Pos
- for _, op := range ops {
- if ptr, ok := ptares.Queries[op.ch]; ok && ptr.MayAlias(queryChanPtr) {
- switch op.dir {
- case types.SendOnly:
- sends = append(sends, op.pos)
- case types.RecvOnly:
- receives = append(receives, op.pos)
- case types.SendRecv:
- closes = append(closes, op.pos)
- }
- }
- }
- sort.Sort(byPos(sends))
- sort.Sort(byPos(receives))
- sort.Sort(byPos(closes))
-
- q.result = &peersResult{
- queryPos: opPos,
- queryType: queryType,
- makes: makes,
- sends: sends,
- receives: receives,
- closes: closes,
- }
- return nil
-}
-
-// findOp returns the position of the enclosing send/receive/close op.
-// For send and receive operations, this is the position of the <- token;
-// for close operations, it's the Lparen of the function call.
-//
-// TODO(adonovan): handle implicit receive operations from 'for...range chan' statements.
-func findOp(qpos *queryPos) token.Pos {
- for _, n := range qpos.path {
- switch n := n.(type) {
- case *ast.UnaryExpr:
- if n.Op == token.ARROW {
- return n.OpPos
- }
- case *ast.SendStmt:
- return n.Arrow
- case *ast.CallExpr:
- // close function call can only exist as a direct identifier
- if close, ok := unparen(n.Fun).(*ast.Ident); ok {
- if b, ok := qpos.info.Info.Uses[close].(*types.Builtin); ok && b.Name() == "close" {
- return n.Lparen
- }
- }
- }
- }
- return token.NoPos
-}
-
-// chanOp abstracts an ssa.Send, ssa.Unop(ARROW), or a SelectState.
-type chanOp struct {
- ch ssa.Value
- dir types.ChanDir // SendOnly=send, RecvOnly=recv, SendRecv=close
- pos token.Pos
-}
-
-// chanOps returns a slice of all the channel operations in the instruction.
-func chanOps(instr ssa.Instruction) []chanOp {
- // TODO(adonovan): handle calls to reflect.{Select,Recv,Send,Close} too.
- var ops []chanOp
- switch instr := instr.(type) {
- case *ssa.UnOp:
- if instr.Op == token.ARROW {
- ops = append(ops, chanOp{instr.X, types.RecvOnly, instr.Pos()})
- }
- case *ssa.Send:
- ops = append(ops, chanOp{instr.Chan, types.SendOnly, instr.Pos()})
- case *ssa.Select:
- for _, st := range instr.States {
- ops = append(ops, chanOp{st.Chan, st.Dir, st.Pos})
- }
- case ssa.CallInstruction:
- cc := instr.Common()
- if b, ok := cc.Value.(*ssa.Builtin); ok && b.Name() == "close" {
- ops = append(ops, chanOp{cc.Args[0], types.SendRecv, cc.Pos()})
- }
- }
- return ops
-}
-
-type peersResult struct {
- queryPos token.Pos // of queried channel op
- queryType types.Type // type of queried channel
- makes, sends, receives, closes []token.Pos // positions of aliased makechan/send/receive/close instrs
-}
-
-func (r *peersResult) display(printf printfFunc) {
- if len(r.makes) == 0 {
- printf(r.queryPos, "This channel can't point to anything.")
- return
- }
- printf(r.queryPos, "This channel of type %s may be:", r.queryType)
- for _, alloc := range r.makes {
- printf(alloc, "\tallocated here")
- }
- for _, send := range r.sends {
- printf(send, "\tsent to, here")
- }
- for _, receive := range r.receives {
- printf(receive, "\treceived from, here")
- }
- for _, clos := range r.closes {
- printf(clos, "\tclosed, here")
- }
-}
-
-func (r *peersResult) toSerial(res *serial.Result, fset *token.FileSet) {
- peers := &serial.Peers{
- Pos: fset.Position(r.queryPos).String(),
- Type: r.queryType.String(),
- }
- for _, alloc := range r.makes {
- peers.Allocs = append(peers.Allocs, fset.Position(alloc).String())
- }
- for _, send := range r.sends {
- peers.Sends = append(peers.Sends, fset.Position(send).String())
- }
- for _, receive := range r.receives {
- peers.Receives = append(peers.Receives, fset.Position(receive).String())
- }
- for _, clos := range r.closes {
- peers.Closes = append(peers.Closes, fset.Position(clos).String())
- }
- res.Peers = peers
-}
-
-// -------- utils --------
-
-// NB: byPos is not deterministic across packages since it depends on load order.
-// Use lessPos if the tests need it.
-type byPos []token.Pos
-
-func (p byPos) Len() int { return len(p) }
-func (p byPos) Less(i, j int) bool { return p[i] < p[j] }
-func (p byPos) Swap(i, j int) { p[i], p[j] = p[j], p[i] }
diff --git a/vendor/github.com/visualfc/gotools/oracle/oracle/pointsto.go b/vendor/github.com/visualfc/gotools/oracle/oracle/pointsto.go
deleted file mode 100644
index 64e21ea..0000000
--- a/vendor/github.com/visualfc/gotools/oracle/oracle/pointsto.go
+++ /dev/null
@@ -1,293 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build go1.5
-
-package oracle
-
-import (
- "fmt"
- "go/ast"
- "go/token"
- "go/types"
- "sort"
-
- "github.com/visualfc/gotools/oracle/oracle/serial"
- "golang.org/x/tools/go/ast/astutil"
- "golang.org/x/tools/go/loader"
- "golang.org/x/tools/go/pointer"
- "golang.org/x/tools/go/ssa"
- "golang.org/x/tools/go/ssa/ssautil"
-)
-
-// pointsto runs the pointer analysis on the selected expression,
-// and reports its points-to set (for a pointer-like expression)
-// or its dynamic types (for an interface, reflect.Value, or
-// reflect.Type expression) and their points-to sets.
-//
-// All printed sets are sorted to ensure determinism.
-//
-func pointsto(q *Query) error {
- lconf := loader.Config{Build: q.Build}
-
- if err := setPTAScope(&lconf, q.Scope); err != nil {
- return err
- }
-
- // Load/parse/type-check the program.
- lprog, err := lconf.Load()
- if err != nil {
- return err
- }
- q.Fset = lprog.Fset
-
- qpos, err := parseQueryPos(lprog, q.Pos, true) // needs exact pos
- if err != nil {
- return err
- }
-
- prog := ssautil.CreateProgram(lprog, ssa.GlobalDebug)
-
- ptaConfig, err := setupPTA(prog, lprog, q.PTALog, q.Reflection)
- if err != nil {
- return err
- }
-
- path, action := findInterestingNode(qpos.info, qpos.path)
- if action != actionExpr {
- return fmt.Errorf("pointer analysis wants an expression; got %s",
- astutil.NodeDescription(qpos.path[0]))
- }
-
- var expr ast.Expr
- var obj types.Object
- switch n := path[0].(type) {
- case *ast.ValueSpec:
- // ambiguous ValueSpec containing multiple names
- return fmt.Errorf("multiple value specification")
- case *ast.Ident:
- obj = qpos.info.ObjectOf(n)
- expr = n
- case ast.Expr:
- expr = n
- default:
- // TODO(adonovan): is this reachable?
- return fmt.Errorf("unexpected AST for expr: %T", n)
- }
-
- // Reject non-pointerlike types (includes all constants---except nil).
- // TODO(adonovan): reject nil too.
- typ := qpos.info.TypeOf(expr)
- if !pointer.CanPoint(typ) {
- return fmt.Errorf("pointer analysis wants an expression of reference type; got %s", typ)
- }
-
- // Determine the ssa.Value for the expression.
- var value ssa.Value
- var isAddr bool
- if obj != nil {
- // def/ref of func/var object
- value, isAddr, err = ssaValueForIdent(prog, qpos.info, obj, path)
- } else {
- value, isAddr, err = ssaValueForExpr(prog, qpos.info, path)
- }
- if err != nil {
- return err // e.g. trivially dead code
- }
-
- // Defer SSA construction till after errors are reported.
- prog.Build()
-
- // Run the pointer analysis.
- ptrs, err := runPTA(ptaConfig, value, isAddr)
- if err != nil {
- return err // e.g. analytically unreachable
- }
-
- q.result = &pointstoResult{
- qpos: qpos,
- typ: typ,
- ptrs: ptrs,
- }
- return nil
-}
-
-// ssaValueForIdent returns the ssa.Value for the ast.Ident whose path
-// to the root of the AST is path. isAddr reports whether the
-// ssa.Value is the address denoted by the ast.Ident, not its value.
-//
-func ssaValueForIdent(prog *ssa.Program, qinfo *loader.PackageInfo, obj types.Object, path []ast.Node) (value ssa.Value, isAddr bool, err error) {
- switch obj := obj.(type) {
- case *types.Var:
- pkg := prog.Package(qinfo.Pkg)
- pkg.Build()
- if v, addr := prog.VarValue(obj, pkg, path); v != nil {
- return v, addr, nil
- }
- return nil, false, fmt.Errorf("can't locate SSA Value for var %s", obj.Name())
-
- case *types.Func:
- fn := prog.FuncValue(obj)
- if fn == nil {
- return nil, false, fmt.Errorf("%s is an interface method", obj)
- }
- // TODO(adonovan): there's no point running PTA on a *Func ident.
- // Eliminate this feature.
- return fn, false, nil
- }
- panic(obj)
-}
-
-// ssaValueForExpr returns the ssa.Value of the non-ast.Ident
-// expression whose path to the root of the AST is path.
-//
-func ssaValueForExpr(prog *ssa.Program, qinfo *loader.PackageInfo, path []ast.Node) (value ssa.Value, isAddr bool, err error) {
- pkg := prog.Package(qinfo.Pkg)
- pkg.SetDebugMode(true)
- pkg.Build()
-
- fn := ssa.EnclosingFunction(pkg, path)
- if fn == nil {
- return nil, false, fmt.Errorf("no SSA function built for this location (dead code?)")
- }
-
- if v, addr := fn.ValueForExpr(path[0].(ast.Expr)); v != nil {
- return v, addr, nil
- }
-
- return nil, false, fmt.Errorf("can't locate SSA Value for expression in %s", fn)
-}
-
-// runPTA runs the pointer analysis of the selected SSA value or address.
-func runPTA(conf *pointer.Config, v ssa.Value, isAddr bool) (ptrs []pointerResult, err error) {
- T := v.Type()
- if isAddr {
- conf.AddIndirectQuery(v)
- T = deref(T)
- } else {
- conf.AddQuery(v)
- }
- ptares := ptrAnalysis(conf)
-
- var ptr pointer.Pointer
- if isAddr {
- ptr = ptares.IndirectQueries[v]
- } else {
- ptr = ptares.Queries[v]
- }
- if ptr == (pointer.Pointer{}) {
- return nil, fmt.Errorf("pointer analysis did not find expression (dead code?)")
- }
- pts := ptr.PointsTo()
-
- if pointer.CanHaveDynamicTypes(T) {
- // Show concrete types for interface/reflect.Value expression.
- if concs := pts.DynamicTypes(); concs.Len() > 0 {
- concs.Iterate(func(conc types.Type, pta interface{}) {
- labels := pta.(pointer.PointsToSet).Labels()
- sort.Sort(byPosAndString(labels)) // to ensure determinism
- ptrs = append(ptrs, pointerResult{conc, labels})
- })
- }
- } else {
- // Show labels for other expressions.
- labels := pts.Labels()
- sort.Sort(byPosAndString(labels)) // to ensure determinism
- ptrs = append(ptrs, pointerResult{T, labels})
- }
- sort.Sort(byTypeString(ptrs)) // to ensure determinism
- return ptrs, nil
-}
-
-type pointerResult struct {
- typ types.Type // type of the pointer (always concrete)
- labels []*pointer.Label // set of labels
-}
-
-type pointstoResult struct {
- qpos *queryPos
- typ types.Type // type of expression
- ptrs []pointerResult // pointer info (typ is concrete => len==1)
-}
-
-func (r *pointstoResult) display(printf printfFunc) {
- if pointer.CanHaveDynamicTypes(r.typ) {
- // Show concrete types for interface, reflect.Type or
- // reflect.Value expression.
-
- if len(r.ptrs) > 0 {
- printf(r.qpos, "this %s may contain these dynamic types:", r.qpos.typeString(r.typ))
- for _, ptr := range r.ptrs {
- var obj types.Object
- if nt, ok := deref(ptr.typ).(*types.Named); ok {
- obj = nt.Obj()
- }
- if len(ptr.labels) > 0 {
- printf(obj, "\t%s, may point to:", r.qpos.typeString(ptr.typ))
- printLabels(printf, ptr.labels, "\t\t")
- } else {
- printf(obj, "\t%s", r.qpos.typeString(ptr.typ))
- }
- }
- } else {
- printf(r.qpos, "this %s cannot contain any dynamic types.", r.typ)
- }
- } else {
- // Show labels for other expressions.
- if ptr := r.ptrs[0]; len(ptr.labels) > 0 {
- printf(r.qpos, "this %s may point to these objects:",
- r.qpos.typeString(r.typ))
- printLabels(printf, ptr.labels, "\t")
- } else {
- printf(r.qpos, "this %s may not point to anything.",
- r.qpos.typeString(r.typ))
- }
- }
-}
-
-func (r *pointstoResult) toSerial(res *serial.Result, fset *token.FileSet) {
- var pts []serial.PointsTo
- for _, ptr := range r.ptrs {
- var namePos string
- if nt, ok := deref(ptr.typ).(*types.Named); ok {
- namePos = fset.Position(nt.Obj().Pos()).String()
- }
- var labels []serial.PointsToLabel
- for _, l := range ptr.labels {
- labels = append(labels, serial.PointsToLabel{
- Pos: fset.Position(l.Pos()).String(),
- Desc: l.String(),
- })
- }
- pts = append(pts, serial.PointsTo{
- Type: r.qpos.typeString(ptr.typ),
- NamePos: namePos,
- Labels: labels,
- })
- }
- res.PointsTo = pts
-}
-
-type byTypeString []pointerResult
-
-func (a byTypeString) Len() int { return len(a) }
-func (a byTypeString) Less(i, j int) bool { return a[i].typ.String() < a[j].typ.String() }
-func (a byTypeString) Swap(i, j int) { a[i], a[j] = a[j], a[i] }
-
-type byPosAndString []*pointer.Label
-
-func (a byPosAndString) Len() int { return len(a) }
-func (a byPosAndString) Less(i, j int) bool {
- cmp := a[i].Pos() - a[j].Pos()
- return cmp < 0 || (cmp == 0 && a[i].String() < a[j].String())
-}
-func (a byPosAndString) Swap(i, j int) { a[i], a[j] = a[j], a[i] }
-
-func printLabels(printf printfFunc, labels []*pointer.Label, prefix string) {
- // TODO(adonovan): due to context-sensitivity, many of these
- // labels may differ only by context, which isn't apparent.
- for _, label := range labels {
- printf(label, "%s%s", prefix, label)
- }
-}
diff --git a/vendor/github.com/visualfc/gotools/oracle/oracle/pos.go b/vendor/github.com/visualfc/gotools/oracle/oracle/pos.go
deleted file mode 100644
index 3c706f3..0000000
--- a/vendor/github.com/visualfc/gotools/oracle/oracle/pos.go
+++ /dev/null
@@ -1,143 +0,0 @@
-package oracle
-
-// This file defines utilities for working with file positions.
-
-import (
- "fmt"
- "go/parser"
- "go/token"
- "os"
- "path/filepath"
- "strconv"
- "strings"
-
- "golang.org/x/tools/go/ast/astutil"
-)
-
-// parseOctothorpDecimal returns the numeric value if s matches "#%d",
-// otherwise -1.
-func parseOctothorpDecimal(s string) int {
- if s != "" && s[0] == '#' {
- if s, err := strconv.ParseInt(s[1:], 10, 32); err == nil {
- return int(s)
- }
- }
- return -1
-}
-
-// parsePosFlag parses a string of the form "file:pos" or
-// file:start,end" where pos, start, end match #%d and represent byte
-// offsets, and returns its components.
-//
-// (Numbers without a '#' prefix are reserved for future use,
-// e.g. to indicate line/column positions.)
-//
-func parsePosFlag(posFlag string) (filename string, startOffset, endOffset int, err error) {
- if posFlag == "" {
- err = fmt.Errorf("no source position specified (-pos flag)")
- return
- }
-
- colon := strings.LastIndex(posFlag, ":")
- if colon < 0 {
- err = fmt.Errorf("invalid source position -pos=%q", posFlag)
- return
- }
- filename, offset := posFlag[:colon], posFlag[colon+1:]
- startOffset = -1
- endOffset = -1
- if hyphen := strings.Index(offset, ","); hyphen < 0 {
- // e.g. "foo.go:#123"
- startOffset = parseOctothorpDecimal(offset)
- endOffset = startOffset
- } else {
- // e.g. "foo.go:#123,#456"
- startOffset = parseOctothorpDecimal(offset[:hyphen])
- endOffset = parseOctothorpDecimal(offset[hyphen+1:])
- }
- if startOffset < 0 || endOffset < 0 {
- err = fmt.Errorf("invalid -pos offset %q", offset)
- return
- }
- return
-}
-
-// findQueryPos searches fset for filename and translates the
-// specified file-relative byte offsets into token.Pos form. It
-// returns an error if the file was not found or the offsets were out
-// of bounds.
-//
-func findQueryPos(fset *token.FileSet, filename string, startOffset, endOffset int) (start, end token.Pos, err error) {
- var file *token.File
- fset.Iterate(func(f *token.File) bool {
- if sameFile(filename, f.Name()) {
- // (f.Name() is absolute)
- file = f
- return false // done
- }
- return true // continue
- })
- if file == nil {
- err = fmt.Errorf("couldn't find file containing position")
- return
- }
-
- // Range check [start..end], inclusive of both end-points.
-
- if 0 <= startOffset && startOffset <= file.Size() {
- start = file.Pos(int(startOffset))
- } else {
- err = fmt.Errorf("start position is beyond end of file")
- return
- }
-
- if 0 <= endOffset && endOffset <= file.Size() {
- end = file.Pos(int(endOffset))
- } else {
- err = fmt.Errorf("end position is beyond end of file")
- return
- }
-
- return
-}
-
-// sameFile returns true if x and y have the same basename and denote
-// the same file.
-//
-func sameFile(x, y string) bool {
- if filepath.Base(x) == filepath.Base(y) { // (optimisation)
- if xi, err := os.Stat(x); err == nil {
- if yi, err := os.Stat(y); err == nil {
- return os.SameFile(xi, yi)
- }
- }
- }
- return false
-}
-
-// fastQueryPos parses the -pos flag and returns a QueryPos.
-// It parses only a single file, and does not run the type checker.
-func fastQueryPos(posFlag string) (*queryPos, error) {
- filename, startOffset, endOffset, err := parsePosFlag(posFlag)
- if err != nil {
- return nil, err
- }
-
- fset := token.NewFileSet()
- f, err := parser.ParseFile(fset, filename, nil, 0)
- if err != nil {
- return nil, err
- }
-
- start, end, err := findQueryPos(fset, filename, startOffset, endOffset)
- if err != nil {
- return nil, err
- }
-
- path, exact := astutil.PathEnclosingInterval(f, start, end)
- if path == nil {
- return nil, fmt.Errorf("no syntax here")
- }
-
- return &queryPos{fset, start, end, path, exact, nil}, nil
-}
diff --git a/vendor/github.com/visualfc/gotools/oracle/oracle/referrers.go b/vendor/github.com/visualfc/gotools/oracle/oracle/referrers.go
deleted file mode 100644
index e86bf3f..0000000
--- a/vendor/github.com/visualfc/gotools/oracle/oracle/referrers.go
+++ /dev/null
@@ -1,243 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build go1.5
-
-package oracle
-
-import (
- "bytes"
- "fmt"
- "go/ast"
- "go/token"
- "go/types"
- "io/ioutil"
- "sort"
-
- "github.com/visualfc/gotools/oracle/oracle/serial"
- "golang.org/x/tools/go/loader"
- "golang.org/x/tools/refactor/importgraph"
-)
-
-// Referrers reports all identifiers that resolve to the same object
-// as the queried identifier, within any package in the analysis scope.
-func referrers(q *Query) error {
- lconf := loader.Config{Build: q.Build}
- allowErrors(&lconf)
-
- if _, err := importQueryPackage(q.Pos, &lconf); err != nil {
- return err
- }
-
- var id *ast.Ident
- var obj types.Object
- var lprog *loader.Program
- var pass2 bool
- var qpos *queryPos
- for {
- // Load/parse/type-check the program.
- var err error
- lprog, err = lconf.Load()
- if err != nil {
- return err
- }
- q.Fset = lprog.Fset
-
- qpos, err = parseQueryPos(lprog, q.Pos, false)
- if err != nil {
- return err
- }
-
- id, _ = qpos.path[0].(*ast.Ident)
- if id == nil {
- return fmt.Errorf("no identifier here")
- }
-
- obj = qpos.info.ObjectOf(id)
- if obj == nil {
- // Happens for y in "switch y := x.(type)",
- // the package declaration,
- // and unresolved identifiers.
- if _, ok := qpos.path[1].(*ast.File); ok { // package decl?
- pkg := qpos.info.Pkg
- obj = types.NewPkgName(id.Pos(), pkg, pkg.Name(), pkg)
- } else {
- return fmt.Errorf("no object for identifier: %T", qpos.path[1])
- }
- }
-
- if pass2 {
- break
- }
-
- // If the identifier is exported, we must load all packages that
- // depend transitively upon the package that defines it.
- // Treat PkgNames as exported, even though they're lowercase.
- if _, isPkg := obj.(*types.PkgName); !(isPkg || obj.Exported()) {
- break // not exported
- }
-
- // Scan the workspace and build the import graph.
- // Ignore broken packages.
- _, rev, _ := importgraph.Build(q.Build)
-
- // Re-load the larger program.
- // Create a new file set so that ...
- // External test packages are never imported,
- // so they will never appear in the graph.
- // (We must reset the Config here, not just reset the Fset field.)
- lconf = loader.Config{
- Fset: token.NewFileSet(),
- Build: q.Build,
- }
- allowErrors(&lconf)
- for path := range rev.Search(obj.Pkg().Path()) {
- lconf.ImportWithTests(path)
- }
- pass2 = true
- }
-
- // Iterate over all go/types' Uses facts for the entire program.
- var refs []*ast.Ident
- for _, info := range lprog.AllPackages {
- for id2, obj2 := range info.Uses {
- if sameObj(obj, obj2) {
- refs = append(refs, id2)
- }
- }
- }
- sort.Sort(byNamePos{q.Fset, refs})
-
- q.result = &referrersResult{
- qpos: qpos,
- query: id,
- obj: obj,
- refs: refs,
- }
- return nil
-}
-
-// same reports whether x and y are identical, or both are PkgNames
-// that import the same Package.
-//
-func sameObj(x, y types.Object) bool {
- if x == y {
- return true
- }
- if x, ok := x.(*types.PkgName); ok {
- if y, ok := y.(*types.PkgName); ok {
- return x.Imported() == y.Imported()
- }
- }
- return false
-}
-
-// -------- utils --------
-
-// An deterministic ordering for token.Pos that doesn't
-// depend on the order in which packages were loaded.
-func lessPos(fset *token.FileSet, x, y token.Pos) bool {
- fx := fset.File(x)
- fy := fset.File(y)
- if fx != fy {
- return fx.Name() < fy.Name()
- }
- return x < y
-}
-
-type byNamePos struct {
- fset *token.FileSet
- ids []*ast.Ident
-}
-
-func (p byNamePos) Len() int { return len(p.ids) }
-func (p byNamePos) Swap(i, j int) { p.ids[i], p.ids[j] = p.ids[j], p.ids[i] }
-func (p byNamePos) Less(i, j int) bool {
- return lessPos(p.fset, p.ids[i].NamePos, p.ids[j].NamePos)
-}
-
-type referrersResult struct {
- qpos *queryPos
- query *ast.Ident // identifier of query
- obj types.Object // object it denotes
- refs []*ast.Ident // set of all other references to it
-}
-
-func (r *referrersResult) display(printf printfFunc) {
- printf(r.obj, "%d references to %s", len(r.refs), r.qpos.objectString(r.obj))
-
- // Show referring lines, like grep.
- type fileinfo struct {
- refs []*ast.Ident
- linenums []int // line number of refs[i]
- data chan interface{} // file contents or error
- }
- var fileinfos []*fileinfo
- fileinfosByName := make(map[string]*fileinfo)
-
- // First pass: start the file reads concurrently.
- sema := make(chan struct{}, 20) // counting semaphore to limit I/O concurrency
- for _, ref := range r.refs {
- posn := r.qpos.fset.Position(ref.Pos())
- fi := fileinfosByName[posn.Filename]
- if fi == nil {
- fi = &fileinfo{data: make(chan interface{})}
- fileinfosByName[posn.Filename] = fi
- fileinfos = append(fileinfos, fi)
-
- // First request for this file:
- // start asynchronous read.
- go func() {
- sema <- struct{}{} // acquire token
- content, err := ioutil.ReadFile(posn.Filename)
- <-sema // release token
- if err != nil {
- fi.data <- err
- } else {
- fi.data <- content
- }
- }()
- }
- fi.refs = append(fi.refs, ref)
- fi.linenums = append(fi.linenums, posn.Line)
- }
-
- // Second pass: print refs in original order.
- // One line may have several refs at different columns.
- for _, fi := range fileinfos {
- v := <-fi.data // wait for I/O completion
-
- // Print one item for all refs in a file that could not
- // be loaded (perhaps due to //line directives).
- if err, ok := v.(error); ok {
- var suffix string
- if more := len(fi.refs) - 1; more > 0 {
- suffix = fmt.Sprintf(" (+ %d more refs in this file)", more)
- }
- printf(fi.refs[0], "%v%s", err, suffix)
- continue
- }
-
- lines := bytes.Split(v.([]byte), []byte("\n"))
- for i, ref := range fi.refs {
- printf(ref, "%s", lines[fi.linenums[i]-1])
- }
- }
-}
-
-// TODO(adonovan): encode extent, not just Pos info, in Serial form.
-
-func (r *referrersResult) toSerial(res *serial.Result, fset *token.FileSet) {
- referrers := &serial.Referrers{
- Pos: fset.Position(r.query.Pos()).String(),
- Desc: r.obj.String(),
- }
- if pos := r.obj.Pos(); pos != token.NoPos { // Package objects have no Pos()
- referrers.ObjPos = fset.Position(pos).String()
- }
- for _, ref := range r.refs {
- referrers.Refs = append(referrers.Refs, fset.Position(ref.NamePos).String())
- }
- res.Referrers = referrers
-}
diff --git a/vendor/github.com/visualfc/gotools/oracle/oracle/serial/serial.go b/vendor/github.com/visualfc/gotools/oracle/oracle/serial/serial.go
deleted file mode 100644
index 65f0822..0000000
--- a/vendor/github.com/visualfc/gotools/oracle/oracle/serial/serial.go
+++ /dev/null
@@ -1,258 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Package serial defines the oracle's schema for structured data
-// serialization using JSON, XML, etc.
-package serial
-
-// All 'pos' strings are of the form "file:line:col".
-// TODO(adonovan): improve performance by sharing filename strings.
-// TODO(adonovan): improve precision by providing the start/end
-// interval when available.
-//
-// TODO(adonovan): consider richer encodings of types, functions,
-// methods, etc.
-
-// A Peers is the result of a 'peers' query.
-// If Allocs is empty, the selected channel can't point to anything.
-type Peers struct {
- Pos string `json:"pos"` // location of the selected channel op (<-)
- Type string `json:"type"` // type of the selected channel
- Allocs []string `json:"allocs,omitempty"` // locations of aliased make(chan) ops
- Sends []string `json:"sends,omitempty"` // locations of aliased ch<-x ops
- Receives []string `json:"receives,omitempty"` // locations of aliased <-ch ops
- Closes []string `json:"closes,omitempty"` // locations of aliased close(ch) ops
-}
-
-// A Referrers is the result of a 'referrers' query.
-type Referrers struct {
- Pos string `json:"pos"` // location of the query reference
- ObjPos string `json:"objpos,omitempty"` // location of the definition
- Desc string `json:"desc"` // description of the denoted object
- Refs []string `json:"refs,omitempty"` // locations of all references
-}
-
-// A Definition is the result of a 'definition' query.
-type Definition struct {
- ObjPos string `json:"objpos,omitempty"` // location of the definition
- Desc string `json:"desc"` // description of the denoted object
-}
-
-type CalleesItem struct {
- Name string `json:"name"` // full name of called function
- Pos string `json:"pos"` // location of called function
-}
-
-// A Callees is the result of a 'callees' query.
-//
-// Callees is nonempty unless the call was a dynamic call on a
-// provably nil func or interface value.
-type Callees struct {
- Pos string `json:"pos"` // location of selected call site
- Desc string `json:"desc"` // description of call site
- Callees []*CalleesItem `json:"callees,omitempty"` // set of possible call targets
-}
-
-// A Caller is one element of the slice returned by a 'callers' query.
-// (Callstack also contains a similar slice.)
-//
-// The root of the callgraph has an unspecified "Caller" string.
-type Caller struct {
- Pos string `json:"pos,omitempty"` // location of the calling function
- Desc string `json:"desc"` // description of call site
- Caller string `json:"caller"` // full name of calling function
-}
-
-// A CallStack is the result of a 'callstack' query.
-// It indicates an arbitrary path from the root of the callgraph to
-// the query function.
-//
-// If the Callers slice is empty, the function was unreachable in this
-// analysis scope.
-type CallStack struct {
- Pos string `json:"pos"` // location of the selected function
- Target string `json:"target"` // the selected function
- Callers []Caller `json:"callers"` // enclosing calls, innermost first.
-}
-
-// A FreeVar is one element of the slice returned by a 'freevars'
-// query. Each one identifies an expression referencing a local
-// identifier defined outside the selected region.
-type FreeVar struct {
- Pos string `json:"pos"` // location of the identifier's definition
- Kind string `json:"kind"` // one of {var,func,type,const,label}
- Ref string `json:"ref"` // referring expression (e.g. "x" or "x.y.z")
- Type string `json:"type"` // type of the expression
-}
-
-// An Implements contains the result of an 'implements' query.
-// It describes the queried type, the set of named non-empty interface
-// types to which it is assignable, and the set of named/*named types
-// (concrete or non-empty interface) which may be assigned to it.
-//
-type Implements struct {
- T ImplementsType `json:"type,omitempty"` // the queried type
- AssignableTo []ImplementsType `json:"to,omitempty"` // types assignable to T
- AssignableFrom []ImplementsType `json:"from,omitempty"` // interface types assignable from T
- AssignableFromPtr []ImplementsType `json:"fromptr,omitempty"` // interface types assignable only from *T
-
- // The following fields are set only if the query was a method.
- // Assignable{To,From,FromPtr}Method[i] is the corresponding
- // method of type Assignable{To,From,FromPtr}[i], or blank
- // {"",""} if that type lacks the method.
- Method *DescribeMethod `json:"method,omitempty"` // the queried method
- AssignableToMethod []DescribeMethod `json:"to_method,omitempty"`
- AssignableFromMethod []DescribeMethod `json:"from_method,omitempty"`
- AssignableFromPtrMethod []DescribeMethod `json:"fromptr_method,omitempty"`
-}
-
-// An ImplementsType describes a single type as part of an 'implements' query.
-type ImplementsType struct {
- Name string `json:"name"` // full name of the type
- Pos string `json:"pos"` // location of its definition
- Kind string `json:"kind"` // "basic", "array", etc
-}
-
-// A SyntaxNode is one element of a stack of enclosing syntax nodes in
-// a "what" query.
-type SyntaxNode struct {
- Description string `json:"desc"` // description of syntax tree
- Start int `json:"start"` // start byte offset, 0-based
- End int `json:"end"` // end byte offset
-}
-
-// A What is the result of the "what" query, which quickly identifies
-// the selection, parsing only a single file. It is intended for use
-// in low-latency GUIs.
-type What struct {
- Enclosing []SyntaxNode `json:"enclosing"` // enclosing nodes of syntax tree
- Modes []string `json:"modes"` // query modes enabled for this selection.
- SrcDir string `json:"srcdir,omitempty"` // $GOROOT src directory containing queried package
- ImportPath string `json:"importpath,omitempty"` // import path of queried package
-}
-
-// A PointsToLabel describes a pointer analysis label.
-//
-// A "label" is an object that may be pointed to by a pointer, map,
-// channel, 'func', slice or interface. Labels include:
-// - functions
-// - globals
-// - arrays created by literals (e.g. []byte("foo")) and conversions ([]byte(s))
-// - stack- and heap-allocated variables (including composite literals)
-// - arrays allocated by append()
-// - channels, maps and arrays created by make()
-// - and their subelements, e.g. "alloc.y[*].z"
-//
-type PointsToLabel struct {
- Pos string `json:"pos"` // location of syntax that allocated the object
- Desc string `json:"desc"` // description of the label
-}
-
-// A PointsTo is one element of the result of a 'pointsto' query on an
-// expression. It describes a single pointer: its type and the set of
-// "labels" it points to.
-//
-// If the pointer is of interface type, it will have one PTS entry
-// describing each concrete type that it may contain. For each
-// concrete type that is a pointer, the PTS entry describes the labels
-// it may point to. The same is true for reflect.Values, except the
-// dynamic types needn't be concrete.
-//
-type PointsTo struct {
- Type string `json:"type"` // (concrete) type of the pointer
- NamePos string `json:"namepos,omitempty"` // location of type defn, if Named
- Labels []PointsToLabel `json:"labels,omitempty"` // pointed-to objects
-}
-
-// A DescribeValue is the additional result of a 'describe' query
-// if the selection indicates a value or expression.
-type DescribeValue struct {
- Type string `json:"type"` // type of the expression
- Value string `json:"value,omitempty"` // value of the expression, if constant
- ObjPos string `json:"objpos,omitempty"` // location of the definition, if an Ident
-}
-
-type DescribeMethod struct {
- Name string `json:"name"` // method name, as defined by types.Selection.String()
- Pos string `json:"pos"` // location of the method's definition
-}
-
-// A DescribeType is the additional result of a 'describe' query
-// if the selection indicates a type.
-type DescribeType struct {
- Type string `json:"type"` // the string form of the type
- NamePos string `json:"namepos,omitempty"` // location of definition of type, if named
- NameDef string `json:"namedef,omitempty"` // underlying definition of type, if named
- Methods []DescribeMethod `json:"methods,omitempty"` // methods of the type
-}
-
-type DescribeMember struct {
- Name string `json:"name"` // name of member
- Type string `json:"type,omitempty"` // type of member (underlying, if 'type')
- Value string `json:"value,omitempty"` // value of member (if 'const')
- Pos string `json:"pos"` // location of definition of member
- Kind string `json:"kind"` // one of {var,const,func,type}
- Methods []DescribeMethod `json:"methods,omitempty"` // methods (if member is a type)
-}
-
-// A DescribePackage is the additional result of a 'describe' if
-// the selection indicates a package.
-type DescribePackage struct {
- Path string `json:"path"` // import path of the package
- Members []*DescribeMember `json:"members,omitempty"` // accessible members of the package
-}
-
-// A Describe is the result of a 'describe' query.
-// It may contain an element describing the selected semantic entity
-// in detail.
-type Describe struct {
- Desc string `json:"desc"` // description of the selected syntax node
- Pos string `json:"pos"` // location of the selected syntax node
- Detail string `json:"detail,omitempty"` // one of {package, type, value}, or "".
-
- // At most one of the following fields is populated:
- // the one specified by 'detail'.
- Package *DescribePackage `json:"package,omitempty"`
- Type *DescribeType `json:"type,omitempty"`
- Value *DescribeValue `json:"value,omitempty"`
-}
-
-// A WhichErrs is the result of a 'whicherrs' query.
-// It contains the position of the queried error and the possible globals,
-// constants, and types it may point to.
-type WhichErrs struct {
- ErrPos string `json:"errpos,omitempty"` // location of queried error
- Globals []string `json:"globals,omitempty"` // locations of globals
- Constants []string `json:"constants,omitempty"` // locations of constants
- Types []WhichErrsType `json:"types,omitempty"` // Types
-}
-
-type WhichErrsType struct {
- Type string `json:"type,omitempty"`
- Position string `json:"position,omitempty"`
-}
-
-// A Result is the common result of any oracle query.
-// It contains a query-specific result element.
-//
-// TODO(adonovan): perhaps include other info such as: analysis scope,
-// raw query position, stack of ast nodes, query package, etc.
-type Result struct {
- Mode string `json:"mode"` // mode of the query
-
- // Exactly one of the following fields is populated:
- // the one specified by 'mode'.
- Callees *Callees `json:"callees,omitempty"`
- Callers []Caller `json:"callers,omitempty"`
- Callstack *CallStack `json:"callstack,omitempty"`
- Definition *Definition `json:"definition,omitempty"`
- Describe *Describe `json:"describe,omitempty"`
- Freevars []*FreeVar `json:"freevars,omitempty"`
- Implements *Implements `json:"implements,omitempty"`
- Peers *Peers `json:"peers,omitempty"`
- PointsTo []PointsTo `json:"pointsto,omitempty"`
- Referrers *Referrers `json:"referrers,omitempty"`
- What *What `json:"what,omitempty"`
- WhichErrs *WhichErrs `json:"whicherrs,omitempty"`
-}
diff --git a/vendor/github.com/visualfc/gotools/oracle/oracle/what.go b/vendor/github.com/visualfc/gotools/oracle/oracle/what.go
deleted file mode 100644
index c5355cc..0000000
--- a/vendor/github.com/visualfc/gotools/oracle/oracle/what.go
+++ /dev/null
@@ -1,210 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package oracle
-
-import (
- "fmt"
- "go/ast"
- "go/build"
- "go/token"
- "os"
- "path/filepath"
- "sort"
- "strings"
-
- "github.com/visualfc/gotools/oracle/oracle/serial"
- "golang.org/x/tools/go/ast/astutil"
-)
-
-// what reports all the information about the query selection that can be
-// obtained from parsing only its containing source file.
-// It is intended to be a very low-latency query callable from GUI
-// tools, e.g. to populate a menu of options of slower queries about
-// the selected location.
-//
-func what(q *Query) error {
- qpos, err := fastQueryPos(q.Pos)
- if err != nil {
- return err
- }
- q.Fset = qpos.fset
-
- // (ignore errors)
- srcdir, importPath, _ := guessImportPath(q.Fset.File(qpos.start).Name(), q.Build)
-
- // Determine which query modes are applicable to the selection.
- enable := map[string]bool{
- "describe": true, // any syntax; always enabled
- }
-
- if qpos.end > qpos.start {
- enable["freevars"] = true // nonempty selection?
- }
-
- for _, n := range qpos.path {
- switch n := n.(type) {
- case *ast.Ident:
- enable["definition"] = true
- enable["referrers"] = true
- enable["implements"] = true
- case *ast.CallExpr:
- enable["callees"] = true
- case *ast.FuncDecl:
- enable["callers"] = true
- enable["callstack"] = true
- case *ast.SendStmt:
- enable["peers"] = true
- case *ast.UnaryExpr:
- if n.Op == token.ARROW {
- enable["peers"] = true
- }
- }
-
- // For implements, we approximate findInterestingNode.
- if _, ok := enable["implements"]; !ok {
- switch n.(type) {
- case *ast.ArrayType,
- *ast.StructType,
- *ast.FuncType,
- *ast.InterfaceType,
- *ast.MapType,
- *ast.ChanType:
- enable["implements"] = true
- }
- }
-
- // For pointsto, we approximate findInterestingNode.
- if _, ok := enable["pointsto"]; !ok {
- switch n.(type) {
- case ast.Stmt,
- *ast.ArrayType,
- *ast.StructType,
- *ast.FuncType,
- *ast.InterfaceType,
- *ast.MapType,
- *ast.ChanType:
- enable["pointsto"] = false // not an expr
-
- case ast.Expr, ast.Decl, *ast.ValueSpec:
- enable["pointsto"] = true // an expr, maybe
-
- default:
- // Comment, Field, KeyValueExpr, etc: ascend.
- }
- }
- }
-
- // If we don't have an exact selection, disable modes that need one.
- if !qpos.exact {
- enable["callees"] = false
- enable["pointsto"] = false
- enable["whicherrs"] = false
- enable["describe"] = false
- }
-
- var modes []string
- for mode := range enable {
- modes = append(modes, mode)
- }
- sort.Strings(modes)
-
- q.result = &whatResult{
- path: qpos.path,
- srcdir: srcdir,
- importPath: importPath,
- modes: modes,
- }
- return nil
-}
-
-// guessImportPath finds the package containing filename, and returns
-// its source directory (an element of $GOPATH) and its import path
-// relative to it.
-//
-// TODO(adonovan): what about _test.go files that are not part of the
-// package?
-//
-func guessImportPath(filename string, buildContext *build.Context) (srcdir, importPath string, err error) {
- absFile, err := filepath.Abs(filename)
- if err != nil {
- err = fmt.Errorf("can't form absolute path of %s", filename)
- return
- }
- absFileDir := segments(filepath.Dir(absFile))
-
- // Find the innermost directory in $GOPATH that encloses filename.
- minD := 1024
- for _, gopathDir := range buildContext.SrcDirs() {
- absDir, err := filepath.Abs(gopathDir)
- if err != nil {
- continue // e.g. non-existent dir on $GOPATH
- }
- d := prefixLen(segments(absDir), absFileDir)
- // If there are multiple matches,
- // prefer the innermost enclosing directory
- // (smallest d).
- if d >= 0 && d < minD {
- minD = d
- srcdir = gopathDir
- importPath = strings.Join(absFileDir[len(absFileDir)-minD:], string(os.PathSeparator))
- }
- }
- if srcdir == "" {
- err = fmt.Errorf("directory %s is not beneath any of these GOROOT/GOPATH directories: %s",
- filepath.Dir(absFile), strings.Join(buildContext.SrcDirs(), ", "))
- }
- return
-}
-
-func segments(path string) []string {
- return strings.Split(path, string(os.PathSeparator))
-}
-
-// prefixLen returns the length of the remainder of y if x is a prefix
-// of y, a negative number otherwise.
-func prefixLen(x, y []string) int {
- d := len(y) - len(x)
- if d >= 0 {
- for i := range x {
- if y[i] != x[i] {
- return -1 // not a prefix
- }
- }
- }
- return d
-}
-
-type whatResult struct {
- path []ast.Node
- modes []string
- srcdir string
- importPath string
-}
-
-func (r *whatResult) display(printf printfFunc) {
- for _, n := range r.path {
- printf(n, "%s", astutil.NodeDescription(n))
- }
- printf(nil, "modes: %s", r.modes)
- printf(nil, "srcdir: %s", r.srcdir)
- printf(nil, "import path: %s", r.importPath)
-}
-
-func (r *whatResult) toSerial(res *serial.Result, fset *token.FileSet) {
- var enclosing []serial.SyntaxNode
- for _, n := range r.path {
- enclosing = append(enclosing, serial.SyntaxNode{
- Description: astutil.NodeDescription(n),
- Start: fset.Position(n.Pos()).Offset,
- End: fset.Position(n.End()).Offset,
- })
- }
- res.What = &serial.What{
- Modes: r.modes,
- SrcDir: r.srcdir,
- ImportPath: r.importPath,
- Enclosing: enclosing,
- }
-}
diff --git a/vendor/github.com/visualfc/gotools/oracle/oracle/whicherrs.go b/vendor/github.com/visualfc/gotools/oracle/oracle/whicherrs.go
deleted file mode 100644
index 35581ca..0000000
--- a/vendor/github.com/visualfc/gotools/oracle/oracle/whicherrs.go
+++ /dev/null
@@ -1,328 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build go1.5
-
-package oracle
-
-import (
- "fmt"
- "go/ast"
- "go/token"
- "go/types"
- "sort"
-
- "github.com/visualfc/gotools/oracle/oracle/serial"
- "golang.org/x/tools/go/ast/astutil"
- "golang.org/x/tools/go/loader"
- "golang.org/x/tools/go/ssa"
- "golang.org/x/tools/go/ssa/ssautil"
-)
-
-var builtinErrorType = types.Universe.Lookup("error").Type()
-
-// whicherrs takes an position to an error and tries to find all types, constants
-// and global value which a given error can point to and which can be checked from the
-// scope where the error lives.
-// In short, it returns a list of things that can be checked against in order to handle
-// an error properly.
-//
-// TODO(dmorsing): figure out if fields in errors like *os.PathError.Err
-// can be queried recursively somehow.
-func whicherrs(q *Query) error {
- lconf := loader.Config{Build: q.Build}
-
- if err := setPTAScope(&lconf, q.Scope); err != nil {
- return err
- }
-
- // Load/parse/type-check the program.
- lprog, err := lconf.Load()
- if err != nil {
- return err
- }
- q.Fset = lprog.Fset
-
- qpos, err := parseQueryPos(lprog, q.Pos, true) // needs exact pos
- if err != nil {
- return err
- }
-
- prog := ssautil.CreateProgram(lprog, ssa.GlobalDebug)
-
- ptaConfig, err := setupPTA(prog, lprog, q.PTALog, q.Reflection)
- if err != nil {
- return err
- }
-
- path, action := findInterestingNode(qpos.info, qpos.path)
- if action != actionExpr {
- return fmt.Errorf("whicherrs wants an expression; got %s",
- astutil.NodeDescription(qpos.path[0]))
- }
- var expr ast.Expr
- var obj types.Object
- switch n := path[0].(type) {
- case *ast.ValueSpec:
- // ambiguous ValueSpec containing multiple names
- return fmt.Errorf("multiple value specification")
- case *ast.Ident:
- obj = qpos.info.ObjectOf(n)
- expr = n
- case ast.Expr:
- expr = n
- default:
- return fmt.Errorf("unexpected AST for expr: %T", n)
- }
-
- typ := qpos.info.TypeOf(expr)
- if !types.Identical(typ, builtinErrorType) {
- return fmt.Errorf("selection is not an expression of type 'error'")
- }
- // Determine the ssa.Value for the expression.
- var value ssa.Value
- if obj != nil {
- // def/ref of func/var object
- value, _, err = ssaValueForIdent(prog, qpos.info, obj, path)
- } else {
- value, _, err = ssaValueForExpr(prog, qpos.info, path)
- }
- if err != nil {
- return err // e.g. trivially dead code
- }
-
- // Defer SSA construction till after errors are reported.
- prog.Build()
-
- globals := findVisibleErrs(prog, qpos)
- constants := findVisibleConsts(prog, qpos)
-
- res := &whicherrsResult{
- qpos: qpos,
- errpos: expr.Pos(),
- }
-
- // TODO(adonovan): the following code is heavily duplicated
- // w.r.t. "pointsto". Refactor?
-
- // Find the instruction which initialized the
- // global error. If more than one instruction has stored to the global
- // remove the global from the set of values that we want to query.
- allFuncs := ssautil.AllFunctions(prog)
- for fn := range allFuncs {
- for _, b := range fn.Blocks {
- for _, instr := range b.Instrs {
- store, ok := instr.(*ssa.Store)
- if !ok {
- continue
- }
- gval, ok := store.Addr.(*ssa.Global)
- if !ok {
- continue
- }
- gbl, ok := globals[gval]
- if !ok {
- continue
- }
- // we already found a store to this global
- // The normal error define is just one store in the init
- // so we just remove this global from the set we want to query
- if gbl != nil {
- delete(globals, gval)
- }
- globals[gval] = store.Val
- }
- }
- }
-
- ptaConfig.AddQuery(value)
- for _, v := range globals {
- ptaConfig.AddQuery(v)
- }
-
- ptares := ptrAnalysis(ptaConfig)
- valueptr := ptares.Queries[value]
- for g, v := range globals {
- ptr, ok := ptares.Queries[v]
- if !ok {
- continue
- }
- if !ptr.MayAlias(valueptr) {
- continue
- }
- res.globals = append(res.globals, g)
- }
- pts := valueptr.PointsTo()
- dedup := make(map[*ssa.NamedConst]bool)
- for _, label := range pts.Labels() {
- // These values are either MakeInterfaces or reflect
- // generated interfaces. For the purposes of this
- // analysis, we don't care about reflect generated ones
- makeiface, ok := label.Value().(*ssa.MakeInterface)
- if !ok {
- continue
- }
- constval, ok := makeiface.X.(*ssa.Const)
- if !ok {
- continue
- }
- c := constants[*constval]
- if c != nil && !dedup[c] {
- dedup[c] = true
- res.consts = append(res.consts, c)
- }
- }
- concs := pts.DynamicTypes()
- concs.Iterate(func(conc types.Type, _ interface{}) {
- // go/types is a bit annoying here.
- // We want to find all the types that we can
- // typeswitch or assert to. This means finding out
- // if the type pointed to can be seen by us.
- //
- // For the purposes of this analysis, the type is always
- // either a Named type or a pointer to one.
- // There are cases where error can be implemented
- // by unnamed types, but in that case, we can't assert to
- // it, so we don't care about it for this analysis.
- var name *types.TypeName
- switch t := conc.(type) {
- case *types.Pointer:
- named, ok := t.Elem().(*types.Named)
- if !ok {
- return
- }
- name = named.Obj()
- case *types.Named:
- name = t.Obj()
- default:
- return
- }
- if !isAccessibleFrom(name, qpos.info.Pkg) {
- return
- }
- res.types = append(res.types, &errorType{conc, name})
- })
- sort.Sort(membersByPosAndString(res.globals))
- sort.Sort(membersByPosAndString(res.consts))
- sort.Sort(sorterrorType(res.types))
-
- q.result = res
- return nil
-}
-
-// findVisibleErrs returns a mapping from each package-level variable of type "error" to nil.
-func findVisibleErrs(prog *ssa.Program, qpos *queryPos) map[*ssa.Global]ssa.Value {
- globals := make(map[*ssa.Global]ssa.Value)
- for _, pkg := range prog.AllPackages() {
- for _, mem := range pkg.Members {
- gbl, ok := mem.(*ssa.Global)
- if !ok {
- continue
- }
- gbltype := gbl.Type()
- // globals are always pointers
- if !types.Identical(deref(gbltype), builtinErrorType) {
- continue
- }
- if !isAccessibleFrom(gbl.Object(), qpos.info.Pkg) {
- continue
- }
- globals[gbl] = nil
- }
- }
- return globals
-}
-
-// findVisibleConsts returns a mapping from each package-level constant assignable to type "error", to nil.
-func findVisibleConsts(prog *ssa.Program, qpos *queryPos) map[ssa.Const]*ssa.NamedConst {
- constants := make(map[ssa.Const]*ssa.NamedConst)
- for _, pkg := range prog.AllPackages() {
- for _, mem := range pkg.Members {
- obj, ok := mem.(*ssa.NamedConst)
- if !ok {
- continue
- }
- consttype := obj.Type()
- if !types.AssignableTo(consttype, builtinErrorType) {
- continue
- }
- if !isAccessibleFrom(obj.Object(), qpos.info.Pkg) {
- continue
- }
- constants[*obj.Value] = obj
- }
- }
-
- return constants
-}
-
-type membersByPosAndString []ssa.Member
-
-func (a membersByPosAndString) Len() int { return len(a) }
-func (a membersByPosAndString) Less(i, j int) bool {
- cmp := a[i].Pos() - a[j].Pos()
- return cmp < 0 || cmp == 0 && a[i].String() < a[j].String()
-}
-func (a membersByPosAndString) Swap(i, j int) { a[i], a[j] = a[j], a[i] }
-
-type sorterrorType []*errorType
-
-func (a sorterrorType) Len() int { return len(a) }
-func (a sorterrorType) Less(i, j int) bool {
- cmp := a[i].obj.Pos() - a[j].obj.Pos()
- return cmp < 0 || cmp == 0 && a[i].typ.String() < a[j].typ.String()
-}
-func (a sorterrorType) Swap(i, j int) { a[i], a[j] = a[j], a[i] }
-
-type errorType struct {
- typ types.Type // concrete type N or *N that implements error
- obj *types.TypeName // the named type N
-}
-
-type whicherrsResult struct {
- qpos *queryPos
- errpos token.Pos
- globals []ssa.Member
- consts []ssa.Member
- types []*errorType
-}
-
-func (r *whicherrsResult) display(printf printfFunc) {
- if len(r.globals) > 0 {
- printf(r.qpos, "this error may point to these globals:")
- for _, g := range r.globals {
- printf(g.Pos(), "\t%s", g.RelString(r.qpos.info.Pkg))
- }
- }
- if len(r.consts) > 0 {
- printf(r.qpos, "this error may contain these constants:")
- for _, c := range r.consts {
- printf(c.Pos(), "\t%s", c.RelString(r.qpos.info.Pkg))
- }
- }
- if len(r.types) > 0 {
- printf(r.qpos, "this error may contain these dynamic types:")
- for _, t := range r.types {
- printf(t.obj.Pos(), "\t%s", r.qpos.typeString(t.typ))
- }
- }
-}
-
-func (r *whicherrsResult) toSerial(res *serial.Result, fset *token.FileSet) {
- we := &serial.WhichErrs{}
- we.ErrPos = fset.Position(r.errpos).String()
- for _, g := range r.globals {
- we.Globals = append(we.Globals, fset.Position(g.Pos()).String())
- }
- for _, c := range r.consts {
- we.Constants = append(we.Constants, fset.Position(c.Pos()).String())
- }
- for _, t := range r.types {
- var et serial.WhichErrsType
- et.Type = r.qpos.typeString(t.typ)
- et.Position = fset.Position(t.obj.Pos()).String()
- we.Types = append(we.Types, et)
- }
- res.WhichErrs = we
-}
diff --git a/vendor/github.com/visualfc/gotools/pkgs/pkgs.go b/vendor/github.com/visualfc/gotools/pkgs/pkgs.go
deleted file mode 100644
index 8bd4a23..0000000
--- a/vendor/github.com/visualfc/gotools/pkgs/pkgs.go
+++ /dev/null
@@ -1,379 +0,0 @@
-// Copyright 2011-2015 visualfc . All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package pkgs
-
-import (
- "encoding/json"
- "fmt"
- "go/build"
- "os"
- "path/filepath"
- "runtime"
- "sort"
- "strings"
- "sync"
-
- "github.com/visualfc/gotools/command"
- "github.com/visualfc/gotools/goapi"
-)
-
-var Command = &command.Command{
- Run: runPkgs,
- UsageLine: "pkgs [-list|-json] [-std]",
- Short: "print go package",
- Long: `print go package.`,
-}
-
-var (
- pkgsList bool
- pkgsJson bool
- pkgsFind string
- pkgsStd bool
- pkgsPkgOnly bool
- pkgsSkipGoroot bool
-)
-
-func init() {
- Command.Flag.BoolVar(&pkgsList, "list", false, "list all package")
- Command.Flag.BoolVar(&pkgsJson, "json", false, "json format")
- Command.Flag.BoolVar(&pkgsStd, "std", false, "std library")
- Command.Flag.BoolVar(&pkgsPkgOnly, "pkg", false, "pkg only")
- Command.Flag.BoolVar(&pkgsSkipGoroot, "skip_goroot", false, "skip goroot")
- Command.Flag.StringVar(&pkgsFind, "find", "", "find package by name")
-}
-
-func runPkgs(cmd *command.Command, args []string) error {
- runtime.GOMAXPROCS(runtime.NumCPU())
- if len(args) != 0 {
- cmd.Usage()
- return os.ErrInvalid
- }
- //pkgIndexOnce.Do(loadPkgsList)
- var pp PathPkgsIndex
- pp.LoadIndex()
- pp.Sort()
- if pkgsList {
- for _, pi := range pp.indexs {
- for _, pkg := range pi.pkgs {
- if pkgsPkgOnly && pkg.IsCommand() {
- continue
- }
- if pkgsJson {
- var p GoPackage
- p.copyBuild(pkg)
- b, err := json.MarshalIndent(&p, "", "\t")
- if err == nil {
- cmd.Stdout.Write(b)
- cmd.Stdout.Write([]byte{'\n'})
- }
- } else {
- cmd.Println(pkg.ImportPath)
- }
- }
- }
- } else if pkgsFind != "" {
- for _, pi := range pp.indexs {
- for _, pkg := range pi.pkgs {
- if pkg.Name == pkgsFind {
- if pkgsPkgOnly && pkg.IsCommand() {
- continue
- }
- if pkgsJson {
- var p GoPackage
- p.copyBuild(pkg)
- b, err := json.MarshalIndent(p, "", "\t")
- if err == nil {
- cmd.Stdout.Write(b)
- cmd.Stdout.Write([]byte{'\n'})
- }
- } else {
- cmd.Println(pkg.Name)
- }
- break
- }
- }
- }
- }
- return nil
-}
-
-// A Package describes a single package found in a directory.
-type GoPackage struct {
- // Note: These fields are part of the go command's public API.
- // See list.go. It is okay to add fields, but not to change or
- // remove existing ones. Keep in sync with list.go
- Dir string `json:",omitempty"` // directory containing package sources
- ImportPath string `json:",omitempty"` // import path of package in dir
- Name string `json:",omitempty"` // package name
- Doc string `json:",omitempty"` // package documentation string
- Target string `json:",omitempty"` // install path
- Goroot bool `json:",omitempty"` // is this package found in the Go root?
- Standard bool `json:",omitempty"` // is this package part of the standard Go library?
- Stale bool `json:",omitempty"` // would 'go install' do anything for this package?
- Root string `json:",omitempty"` // Go root or Go path dir containing this package
- ConflictDir string `json:",omitempty"` // Dir is hidden by this other directory
-
- // Source files
- GoFiles []string `json:",omitempty"` // .go source files (excluding CgoFiles, TestGoFiles, XTestGoFiles)
- CgoFiles []string `json:",omitempty"` // .go sources files that import "C"
- IgnoredGoFiles []string `json:",omitempty"` // .go sources ignored due to build constraints
- CFiles []string `json:",omitempty"` // .c source files
- CXXFiles []string `json:",omitempty"` // .cc, .cpp and .cxx source files
- MFiles []string `json:",omitempty"` // .m source files
- HFiles []string `json:",omitempty"` // .h, .hh, .hpp and .hxx source files
- SFiles []string `json:",omitempty"` // .s source files
- SwigFiles []string `json:",omitempty"` // .swig files
- SwigCXXFiles []string `json:",omitempty"` // .swigcxx files
- SysoFiles []string `json:",omitempty"` // .syso system object files added to package
-
- // Cgo directives
- CgoCFLAGS []string `json:",omitempty"` // cgo: flags for C compiler
- CgoCPPFLAGS []string `json:",omitempty"` // cgo: flags for C preprocessor
- CgoCXXFLAGS []string `json:",omitempty"` // cgo: flags for C++ compiler
- CgoLDFLAGS []string `json:",omitempty"` // cgo: flags for linker
- CgoPkgConfig []string `json:",omitempty"` // cgo: pkg-config names
-
- // Dependency information
- Imports []string `json:",omitempty"` // import paths used by this package
- Deps []string `json:",omitempty"` // all (recursively) imported dependencies
-
- // Error information
- Incomplete bool `json:",omitempty"` // was there an error loading this package or dependencies?
-
- // Test information
- TestGoFiles []string `json:",omitempty"` // _test.go files in package
- TestImports []string `json:",omitempty"` // imports from TestGoFiles
- XTestGoFiles []string `json:",omitempty"` // _test.go files outside package
- XTestImports []string `json:",omitempty"` // imports from XTestGoFiles
-
- // Unexported fields are not part of the public API.
- build *build.Package
- pkgdir string // overrides build.PkgDir
- imports []*goapi.Package
- deps []*goapi.Package
- gofiles []string // GoFiles+CgoFiles+TestGoFiles+XTestGoFiles files, absolute paths
- sfiles []string
- allgofiles []string // gofiles + IgnoredGoFiles, absolute paths
- target string // installed file for this package (may be executable)
- fake bool // synthesized package
- forceBuild bool // this package must be rebuilt
- forceLibrary bool // this package is a library (even if named "main")
- cmdline bool // defined by files listed on command line
- local bool // imported via local path (./ or ../)
- localPrefix string // interpret ./ and ../ imports relative to this prefix
- exeName string // desired name for temporary executable
- coverMode string // preprocess Go source files with the coverage tool in this mode
- coverVars map[string]*CoverVar // variables created by coverage analysis
- omitDWARF bool // tell linker not to write DWARF information
-}
-
-// CoverVar holds the name of the generated coverage variables targeting the named file.
-type CoverVar struct {
- File string // local file name
- Var string // name of count struct
-}
-
-func (p *GoPackage) copyBuild(pp *build.Package) {
- p.build = pp
-
- p.Dir = pp.Dir
- p.ImportPath = pp.ImportPath
- p.Name = pp.Name
- p.Doc = pp.Doc
- p.Root = pp.Root
- p.ConflictDir = pp.ConflictDir
- // TODO? Target
- p.Goroot = pp.Goroot
- p.Standard = p.Goroot && p.ImportPath != "" && !strings.Contains(p.ImportPath, ".")
- p.GoFiles = pp.GoFiles
- p.CgoFiles = pp.CgoFiles
- p.IgnoredGoFiles = pp.IgnoredGoFiles
- p.CFiles = pp.CFiles
- p.CXXFiles = pp.CXXFiles
- p.MFiles = pp.MFiles
- p.HFiles = pp.HFiles
- p.SFiles = pp.SFiles
- p.SwigFiles = pp.SwigFiles
- p.SwigCXXFiles = pp.SwigCXXFiles
- p.SysoFiles = pp.SysoFiles
- p.CgoCFLAGS = pp.CgoCFLAGS
- p.CgoCPPFLAGS = pp.CgoCPPFLAGS
- p.CgoCXXFLAGS = pp.CgoCXXFLAGS
- p.CgoLDFLAGS = pp.CgoLDFLAGS
- p.CgoPkgConfig = pp.CgoPkgConfig
- p.Imports = pp.Imports
- p.TestGoFiles = pp.TestGoFiles
- p.TestImports = pp.TestImports
- p.XTestGoFiles = pp.XTestGoFiles
- p.XTestImports = pp.XTestImports
-}
-
-type PathPkgsIndex struct {
- indexs []*PkgsIndex
-}
-
-func (p *PathPkgsIndex) LoadIndex() {
- var wg sync.WaitGroup
- var context = build.Default
- if pkgsStd {
- context.GOPATH = ""
- }
- var srcDirs []string
- goroot := context.GOROOT
- gopath := context.GOPATH
- context.GOPATH = ""
-
- if !pkgsSkipGoroot {
- //go1.4 go/src/
- //go1.3 go/src/pkg; go/src/cmd
- _, err := os.Stat(filepath.Join(goroot, "src/pkg/runtime"))
- if err == nil {
- for _, v := range context.SrcDirs() {
- if strings.HasSuffix(v, "pkg") {
- srcDirs = append(srcDirs, v[:len(v)-3]+"cmd")
- }
- srcDirs = append(srcDirs, v)
- }
- } else {
- srcDirs = append(srcDirs, filepath.Join(goroot, "src"))
- }
- }
-
- context.GOPATH = gopath
- context.GOROOT = ""
- for _, v := range context.SrcDirs() {
- srcDirs = append(srcDirs, v)
- }
- context.GOROOT = goroot
- for _, path := range srcDirs {
- pi := &PkgsIndex{}
- p.indexs = append(p.indexs, pi)
- pkgsGate.enter()
- f, err := os.Open(path)
- if err != nil {
- pkgsGate.leave()
- fmt.Fprint(os.Stderr, err)
- continue
- }
- children, err := f.Readdir(-1)
- f.Close()
- pkgsGate.leave()
- if err != nil {
- fmt.Fprint(os.Stderr, err)
- continue
- }
- for _, child := range children {
- if child.IsDir() {
- wg.Add(1)
- go func(path, name string) {
- defer wg.Done()
- pi.loadPkgsPath(&wg, path, name)
- }(path, child.Name())
- }
- }
- }
- wg.Wait()
-}
-
-func (p *PathPkgsIndex) Sort() {
- for _, v := range p.indexs {
- v.sort()
- }
-}
-
-type PkgsIndex struct {
- sync.Mutex
- pkgs []*build.Package
-}
-
-func (p *PkgsIndex) sort() {
- sort.Sort(PkgSlice(p.pkgs))
-}
-
-type PkgSlice []*build.Package
-
-func (p PkgSlice) Len() int {
- return len([]*build.Package(p))
-}
-
-func (p PkgSlice) Less(i, j int) bool {
- if p[i].IsCommand() && !p[j].IsCommand() {
- return true
- } else if !p[i].IsCommand() && p[j].IsCommand() {
- return false
- }
- return p[i].ImportPath < p[j].ImportPath
-}
-
-func (p PkgSlice) Swap(i, j int) {
- p[i], p[j] = p[j], p[i]
-}
-
-// pkgsgate protects the OS & filesystem from too much concurrency.
-// Too much disk I/O -> too many threads -> swapping and bad scheduling.
-// gate is a semaphore for limiting concurrency.
-type gate chan struct{}
-
-func (g gate) enter() { g <- struct{}{} }
-func (g gate) leave() { <-g }
-
-var pkgsGate = make(gate, 8)
-
-func (p *PkgsIndex) loadPkgsPath(wg *sync.WaitGroup, root, pkgrelpath string) {
- importpath := filepath.ToSlash(pkgrelpath)
- dir := filepath.Join(root, importpath)
-
- pkgsGate.enter()
- defer pkgsGate.leave()
- pkgDir, err := os.Open(dir)
- if err != nil {
- return
- }
- children, err := pkgDir.Readdir(-1)
- pkgDir.Close()
- if err != nil {
- return
- }
- // hasGo tracks whether a directory actually appears to be a
- // Go source code directory. If $GOPATH == $HOME, and
- // $HOME/src has lots of other large non-Go projects in it,
- // then the calls to importPathToName below can be expensive.
- hasGo := false
- for _, child := range children {
- name := child.Name()
- if name == "" {
- continue
- }
- if c := name[0]; c == '.' || ('0' <= c && c <= '9') {
- continue
- }
- if strings.HasSuffix(name, ".go") {
- hasGo = true
- }
- if child.IsDir() {
- if strings.HasPrefix(name, ".") || strings.HasPrefix(name, "_") || name == "testdata" {
- continue
- }
- wg.Add(1)
- go func(root, name string) {
- defer wg.Done()
- p.loadPkgsPath(wg, root, name)
- }(root, filepath.Join(importpath, name))
- }
- }
- if hasGo {
- buildPkg, err := build.ImportDir(dir, 0)
- if err == nil {
- if buildPkg.ImportPath == "." {
- buildPkg.ImportPath = filepath.ToSlash(pkgrelpath)
- buildPkg.Root = root
- buildPkg.Goroot = true
- }
- p.Lock()
- p.pkgs = append(p.pkgs, buildPkg)
- p.Unlock()
- }
- }
-}
diff --git a/vendor/github.com/visualfc/gotools/pkgutil/pkgutil.go b/vendor/github.com/visualfc/gotools/pkgutil/pkgutil.go
deleted file mode 100644
index e5f7a39..0000000
--- a/vendor/github.com/visualfc/gotools/pkgutil/pkgutil.go
+++ /dev/null
@@ -1,233 +0,0 @@
-package pkgutil
-
-import (
- "go/build"
- "io/ioutil"
- "log"
- "os"
- "path/filepath"
- "regexp"
- "strings"
-)
-
-//var go15VendorExperiment = os.Getenv("GO15VENDOREXPERIMENT") == "1"
-
-func IsVendorExperiment() bool {
- return true
-}
-
-// matchPattern(pattern)(name) reports whether
-// name matches pattern. Pattern is a limited glob
-// pattern in which '...' means 'any string' and there
-// is no other special syntax.
-func matchPattern(pattern string) func(name string) bool {
- re := regexp.QuoteMeta(pattern)
- re = strings.Replace(re, `\.\.\.`, `.*`, -1)
- // Special case: foo/... matches foo too.
- if strings.HasSuffix(re, `/.*`) {
- re = re[:len(re)-len(`/.*`)] + `(/.*)?`
- }
- reg := regexp.MustCompile(`^` + re + `$`)
- return func(name string) bool {
- return reg.MatchString(name)
- }
-}
-
-// hasPathPrefix reports whether the path s begins with the
-// elements in prefix.
-func hasPathPrefix(s, prefix string) bool {
- switch {
- default:
- return false
- case len(s) == len(prefix):
- return s == prefix
- case len(s) > len(prefix):
- if prefix != "" && prefix[len(prefix)-1] == '/' {
- return strings.HasPrefix(s, prefix)
- }
- return s[len(prefix)] == '/' && s[:len(prefix)] == prefix
- }
-}
-
-// hasFilePathPrefix reports whether the filesystem path s begins with the
-// elements in prefix.
-func hasFilePathPrefix(s, prefix string) bool {
- sv := strings.ToUpper(filepath.VolumeName(s))
- pv := strings.ToUpper(filepath.VolumeName(prefix))
- s = s[len(sv):]
- prefix = prefix[len(pv):]
- switch {
- default:
- return false
- case sv != pv:
- return false
- case len(s) == len(prefix):
- return s == prefix
- case len(s) > len(prefix):
- if prefix != "" && prefix[len(prefix)-1] == filepath.Separator {
- return strings.HasPrefix(s, prefix)
- }
- return s[len(prefix)] == filepath.Separator && s[:len(prefix)] == prefix
- }
-}
-
-// treeCanMatchPattern(pattern)(name) reports whether
-// name or children of name can possibly match pattern.
-// Pattern is the same limited glob accepted by matchPattern.
-func treeCanMatchPattern(pattern string) func(name string) bool {
- wildCard := false
- if i := strings.Index(pattern, "..."); i >= 0 {
- wildCard = true
- pattern = pattern[:i]
- }
- return func(name string) bool {
- return len(name) <= len(pattern) && hasPathPrefix(pattern, name) ||
- wildCard && strings.HasPrefix(name, pattern)
- }
-}
-
-var isDirCache = map[string]bool{}
-
-func isDir(path string) bool {
- result, ok := isDirCache[path]
- if ok {
- return result
- }
-
- fi, err := os.Stat(path)
- result = err == nil && fi.IsDir()
- isDirCache[path] = result
- return result
-}
-
-type Package struct {
- Root string
- Dir string
- ImportPath string
-}
-
-func ImportFile(fileName string) *Package {
- return ImportDir(filepath.Dir(fileName))
-}
-
-func ImportDir(dir string) *Package {
- pkg, err := build.ImportDir(dir, build.FindOnly)
- if err != nil {
- return &Package{"", dir, ""}
- }
- return &Package{pkg.Root, pkg.Dir, pkg.ImportPath}
-}
-
-// expandPath returns the symlink-expanded form of path.
-func expandPath(p string) string {
- x, err := filepath.EvalSymlinks(p)
- if err == nil {
- return x
- }
- return p
-}
-
-// vendoredImportPath returns the expansion of path when it appears in parent.
-// If parent is x/y/z, then path might expand to x/y/z/vendor/path, x/y/vendor/path,
-// x/vendor/path, vendor/path, or else stay path if none of those exist.
-// vendoredImportPath returns the expanded path or, if no expansion is found, the original.
-func VendoredImportPath(parent *Package, path string) (found string) {
- if parent == nil || parent.Root == "" {
- return path
- }
-
- dir := filepath.Clean(parent.Dir)
- root := filepath.Join(parent.Root, "src")
- if !hasFilePathPrefix(dir, root) {
- // Look for symlinks before reporting error.
- dir = expandPath(dir)
- root = expandPath(root)
- }
- if !hasFilePathPrefix(dir, root) || len(dir) <= len(root) || dir[len(root)] != filepath.Separator {
- log.Println("invalid vendoredImportPath: dir=%q root=%q separator=%q", dir, root, string(filepath.Separator))
- return ""
- }
-
- vpath := "vendor/" + path
- for i := len(dir); i >= len(root); i-- {
- if i < len(dir) && dir[i] != filepath.Separator {
- continue
- }
- // Note: checking for the vendor directory before checking
- // for the vendor/path directory helps us hit the
- // isDir cache more often. It also helps us prepare a more useful
- // list of places we looked, to report when an import is not found.
- if !isDir(filepath.Join(dir[:i], "vendor")) {
- continue
- }
- targ := filepath.Join(dir[:i], vpath)
- if isDir(targ) && hasGoFiles(targ) {
- importPath := parent.ImportPath
- if importPath == "command-line-arguments" {
- // If parent.ImportPath is 'command-line-arguments'.
- // set to relative directory to root (also chopped root directory)
- importPath = dir[len(root)+1:]
- }
- // We started with parent's dir c:\gopath\src\foo\bar\baz\quux\xyzzy.
- // We know the import path for parent's dir.
- // We chopped off some number of path elements and
- // added vendor\path to produce c:\gopath\src\foo\bar\baz\vendor\path.
- // Now we want to know the import path for that directory.
- // Construct it by chopping the same number of path elements
- // (actually the same number of bytes) from parent's import path
- // and then append /vendor/path.
- chopped := len(dir) - i
- if chopped == len(importPath)+1 {
- // We walked up from c:\gopath\src\foo\bar
- // and found c:\gopath\src\vendor\path.
- // We chopped \foo\bar (length 8) but the import path is "foo/bar" (length 7).
- // Use "vendor/path" without any prefix.
- return vpath
- }
- return importPath[:len(importPath)-chopped] + "/" + vpath
- }
- }
- return path
-}
-
-// hasGoFiles reports whether dir contains any files with names ending in .go.
-// For a vendor check we must exclude directories that contain no .go files.
-// Otherwise it is not possible to vendor just a/b/c and still import the
-// non-vendored a/b. See golang.org/issue/13832.
-func hasGoFiles(dir string) bool {
- fis, _ := ioutil.ReadDir(dir)
- for _, fi := range fis {
- if !fi.IsDir() && strings.HasSuffix(fi.Name(), ".go") {
- return true
- }
- }
- return false
-}
-
-// findVendor looks for the last non-terminating "vendor" path element in the given import path.
-// If there isn't one, findVendor returns ok=false.
-// Otherwise, findVendor returns ok=true and the index of the "vendor".
-//
-// Note that terminating "vendor" elements don't count: "x/vendor" is its own package,
-// not the vendored copy of an import "" (the empty import path).
-// This will allow people to have packages or commands named vendor.
-// This may help reduce breakage, or it may just be confusing. We'll see.
-func findVendor(path string) (index int, ok bool) {
- // Two cases, depending on internal at start of string or not.
- // The order matters: we must return the index of the final element,
- // because the final one is where the effective import path starts.
- switch {
- case strings.Contains(path, "/vendor/"):
- return strings.LastIndex(path, "/vendor/") + 1, true
- case strings.HasPrefix(path, "vendor/"):
- return 0, true
- }
- return 0, false
-}
-
-func VendorPathToImportPath(path string) string {
- if i, ok := findVendor(path); ok {
- return path[i+len("vendor/"):]
- }
- return path
-}
diff --git a/vendor/github.com/visualfc/gotools/runcmd/runcmd.go b/vendor/github.com/visualfc/gotools/runcmd/runcmd.go
deleted file mode 100644
index 6560d62..0000000
--- a/vendor/github.com/visualfc/gotools/runcmd/runcmd.go
+++ /dev/null
@@ -1,87 +0,0 @@
-// Copyright 2011-2015 visualfc . All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package runcmd
-
-import (
- "fmt"
- "os"
- "os/exec"
- "strings"
-
- "github.com/visualfc/gotools/command"
-)
-
-var Command = &command.Command{
- Run: runCmd,
- UsageLine: "runcmd [-w work_path] [arguments...]",
- Short: "run program",
- Long: `run program and arguments`,
-}
-
-var execWorkPath string
-var execWaitEnter bool
-
-func init() {
- Command.Flag.StringVar(&execWorkPath, "w", "", "work path")
- Command.Flag.BoolVar(&execWaitEnter, "e", true, "wait enter and continue")
-}
-
-func runCmd(cmd *command.Command, args []string) error {
- if len(args) == 0 {
- cmd.Usage()
- return os.ErrInvalid
- }
- if execWorkPath == "" {
- var err error
- execWorkPath, err = os.Getwd()
- if err != nil {
- fmt.Fprintf(os.Stderr, "liteide_stub exec: os.Getwd() false\n")
- command.SetExitStatus(3)
- command.Exit()
- return err
- }
- }
- fileName := args[0]
-
- filePath, err := exec.LookPath(fileName)
- if err != nil {
- filePath, err = exec.LookPath("./" + fileName)
- }
- if err != nil {
- fmt.Fprintf(os.Stderr, "liteide_stub exec: file %s not found\n", fileName)
- command.SetExitStatus(3)
- command.Exit()
- }
-
- fmt.Println("Starting Process", filePath, strings.Join(args[1:], " "), "...")
-
- command := exec.Command(filePath, args[1:]...)
- command.Dir = execWorkPath
- command.Stdin = os.Stdin
- command.Stdout = os.Stdout
- command.Stderr = os.Stderr
-
- err = command.Run()
-
- if err != nil {
- fmt.Println("\nEnd Process", err)
- } else {
- fmt.Println("\nEnd Process", "exit status 0")
- }
-
- exitWaitEnter()
- return nil
-}
-
-func exitWaitEnter() {
- if !execWaitEnter {
- return
- }
- fmt.Println("\nPress enter key to continue")
- var s = [256]byte{}
- os.Stdin.Read(s[:])
- command.SetExitStatus(0)
- command.Exit()
-}
diff --git a/vendor/github.com/visualfc/gotools/stdlib/go13.go b/vendor/github.com/visualfc/gotools/stdlib/go13.go
deleted file mode 100644
index d81ad91..0000000
--- a/vendor/github.com/visualfc/gotools/stdlib/go13.go
+++ /dev/null
@@ -1,19 +0,0 @@
-// +build !go1.4
-
-package stdlib
-
-import (
- "go/build"
- "os"
- "path/filepath"
-)
-
-func ImportStdPkg(context *build.Context, path string, mode build.ImportMode) (*build.Package, error) {
- realpath := filepath.Join(context.GOROOT, "src", "pkg", path)
- if _, err := os.Stat(realpath); err != nil {
- realpath = filepath.Join(context.GOROOT, "src", path)
- }
- pkg, err := context.ImportDir(realpath, 0)
- pkg.ImportPath = path
- return pkg, err
-}
diff --git a/vendor/github.com/visualfc/gotools/stdlib/go14.go b/vendor/github.com/visualfc/gotools/stdlib/go14.go
deleted file mode 100644
index 9bd79d2..0000000
--- a/vendor/github.com/visualfc/gotools/stdlib/go14.go
+++ /dev/null
@@ -1,19 +0,0 @@
-// +build go1.4
-
-package stdlib
-
-import (
- "go/build"
- "os"
- "path/filepath"
-)
-
-func ImportStdPkg(context *build.Context, path string, mode build.ImportMode) (*build.Package, error) {
- realpath := filepath.Join(context.GOROOT, "src", path)
- if _, err := os.Stat(realpath); err != nil {
- realpath = filepath.Join(context.GOROOT, "src/pkg", path)
- }
- pkg, err := context.ImportDir(realpath, 0)
- pkg.ImportPath = path
- return pkg, err
-}
diff --git a/vendor/github.com/visualfc/gotools/stdlib/mkpkglist.go b/vendor/github.com/visualfc/gotools/stdlib/mkpkglist.go
deleted file mode 100644
index efe7a92..0000000
--- a/vendor/github.com/visualfc/gotools/stdlib/mkpkglist.go
+++ /dev/null
@@ -1,173 +0,0 @@
-// +build ignore
-
-package main
-
-import (
- "fmt"
- "strings"
-)
-
-var pkgList = `
-archive/tar
-archive/zip
-bufio
-bytes
-compress/bzip2
-compress/flate
-compress/gzip
-compress/lzw
-compress/zlib
-container/heap
-container/list
-container/ring
-context
-crypto
-crypto/aes
-crypto/cipher
-crypto/des
-crypto/dsa
-crypto/ecdsa
-crypto/elliptic
-crypto/hmac
-crypto/md5
-crypto/rand
-crypto/rc4
-crypto/rsa
-crypto/sha1
-crypto/sha256
-crypto/sha512
-crypto/subtle
-crypto/tls
-crypto/x509
-crypto/x509/pkix
-database/sql
-database/sql/driver
-debug/dwarf
-debug/elf
-debug/gosym
-debug/macho
-debug/pe
-debug/plan9obj
-encoding
-encoding/ascii85
-encoding/asn1
-encoding/base32
-encoding/base64
-encoding/binary
-encoding/csv
-encoding/gob
-encoding/hex
-encoding/json
-encoding/pem
-encoding/xml
-errors
-expvar
-flag
-fmt
-go/ast
-go/build
-go/constant
-go/doc
-go/format
-go/importer
-go/parser
-go/printer
-go/scanner
-go/token
-go/types
-hash
-hash/adler32
-hash/crc32
-hash/crc64
-hash/fnv
-html
-html/template
-image
-image/color
-image/color/palette
-image/draw
-image/gif
-image/jpeg
-image/png
-index/suffixarray
-io
-io/ioutil
-log
-log/syslog
-math
-math/big
-math/bits
-math/cmplx
-math/rand
-mime
-mime/multipart
-mime/quotedprintable
-net
-net/http
-net/http/cgi
-net/http/cookiejar
-net/http/fcgi
-net/http/httptest
-net/http/httptrace
-net/http/httputil
-net/http/pprof
-net/mail
-net/rpc
-net/rpc/jsonrpc
-net/smtp
-net/textproto
-net/url
-os
-os/exec
-os/signal
-os/user
-path
-path/filepath
-plugin
-reflect
-regexp
-regexp/syntax
-runtime
-runtime/cgo
-runtime/debug
-runtime/pprof
-runtime/race
-runtime/trace
-sort
-strconv
-strings
-sync
-sync/atomic
-syscall
-testing
-testing/iotest
-testing/quick
-text/scanner
-text/tabwriter
-text/template
-text/template/parse
-time
-unicode
-unicode/utf16
-unicode/utf8
-unsafe
-`
-
-func main() {
- //fmt.Println(pkgList)
- var list []string
- index := 0
- for _, v := range strings.Split(pkgList, "\n") {
- v = strings.TrimSpace(v)
- if v == "" {
- continue
- }
- v = "\"" + v + "\""
- if index%4 == 0 && index != 0 {
- v = "\n" + v
- }
- list = append(list, v)
- index++
- }
- fmt.Println(strings.Join(list, ","))
-}
diff --git a/vendor/github.com/visualfc/gotools/stdlib/mkstdlib.go b/vendor/github.com/visualfc/gotools/stdlib/mkstdlib.go
deleted file mode 100644
index 2191f8d..0000000
--- a/vendor/github.com/visualfc/gotools/stdlib/mkstdlib.go
+++ /dev/null
@@ -1,99 +0,0 @@
-// +build ignore
-
-// mkstdlib generates the zstdlib.go file, containing the Go standard
-// library API symbols. It's baked into the binary to avoid scanning
-// GOPATH in the common case.
-package main
-
-import (
- "bufio"
- "bytes"
- "fmt"
- "go/format"
- "io"
- "io/ioutil"
- "log"
- "os"
- "path"
- "path/filepath"
- "regexp"
- "sort"
- "strings"
-)
-
-func mustOpen(name string) io.Reader {
- f, err := os.Open(name)
- if err != nil {
- log.Fatal(err)
- }
- return f
-}
-
-func api(base string) string {
- return filepath.Join(os.Getenv("GOROOT"), "api", base)
-}
-
-var sym = regexp.MustCompile(`^pkg (\S+).*?, (?:var|func|type|const) ([A-Z]\w*)`)
-
-func main() {
- var buf bytes.Buffer
- outf := func(format string, args ...interface{}) {
- fmt.Fprintf(&buf, format, args...)
- }
- outf("// AUTO-GENERATED BY mkstdlib.go\n\n")
- outf("package stdlib\n")
- outf("var Symbols = map[string]string{\n")
- f := io.MultiReader(
- mustOpen(api("go1.txt")),
- mustOpen(api("go1.1.txt")),
- mustOpen(api("go1.2.txt")),
- mustOpen(api("go1.3.txt")),
- mustOpen(api("go1.4.txt")),
- mustOpen(api("go1.5.txt")),
- mustOpen(api("go1.6.txt")),
- mustOpen(api("go1.7.txt")),
- mustOpen(api("go1.8.txt")),
- mustOpen(api("go1.9.txt")),
- )
- sc := bufio.NewScanner(f)
- fullImport := map[string]string{} // "zip.NewReader" => "archive/zip"
- ambiguous := map[string]bool{}
- var keys []string
- for sc.Scan() {
- l := sc.Text()
- has := func(v string) bool { return strings.Contains(l, v) }
- if has("struct, ") || has("interface, ") || has(", method (") {
- continue
- }
- if m := sym.FindStringSubmatch(l); m != nil {
- full := m[1]
- key := path.Base(full) + "." + m[2]
- if exist, ok := fullImport[key]; ok {
- if exist != full {
- ambiguous[key] = true
- }
- } else {
- fullImport[key] = full
- keys = append(keys, key)
- }
- }
- }
- if err := sc.Err(); err != nil {
- log.Fatal(err)
- }
- sort.Strings(keys)
- for _, key := range keys {
- if ambiguous[key] {
- outf("\t// %q is ambiguous\n", key)
- } else {
- outf("\t%q: %q,\n", key, fullImport[key])
- }
- }
- outf("}\n")
- fmtbuf, err := format.Source(buf.Bytes())
- if err != nil {
- log.Fatal(err)
- }
- //os.Stdout.Write(fmtbuf)
- ioutil.WriteFile("./zstdlib.go", fmtbuf, 0777)
-}
diff --git a/vendor/github.com/visualfc/gotools/stdlib/pkglist.go b/vendor/github.com/visualfc/gotools/stdlib/pkglist.go
deleted file mode 100644
index da5e579..0000000
--- a/vendor/github.com/visualfc/gotools/stdlib/pkglist.go
+++ /dev/null
@@ -1,49 +0,0 @@
-package stdlib
-
-var Packages = []string{
- "archive/tar", "archive/zip", "bufio", "bytes",
- "compress/bzip2", "compress/flate", "compress/gzip", "compress/lzw",
- "compress/zlib", "container/heap", "container/list", "container/ring",
- "context", "crypto", "crypto/aes", "crypto/cipher",
- "crypto/des", "crypto/dsa", "crypto/ecdsa", "crypto/elliptic",
- "crypto/hmac", "crypto/md5", "crypto/rand", "crypto/rc4",
- "crypto/rsa", "crypto/sha1", "crypto/sha256", "crypto/sha512",
- "crypto/subtle", "crypto/tls", "crypto/x509", "crypto/x509/pkix",
- "database/sql", "database/sql/driver", "debug/dwarf", "debug/elf",
- "debug/gosym", "debug/macho", "debug/pe", "debug/plan9obj",
- "encoding", "encoding/ascii85", "encoding/asn1", "encoding/base32",
- "encoding/base64", "encoding/binary", "encoding/csv", "encoding/gob",
- "encoding/hex", "encoding/json", "encoding/pem", "encoding/xml",
- "errors", "expvar", "flag", "fmt",
- "go/ast", "go/build", "go/constant", "go/doc",
- "go/format", "go/importer", "go/parser", "go/printer",
- "go/scanner", "go/token", "go/types", "hash",
- "hash/adler32", "hash/crc32", "hash/crc64", "hash/fnv",
- "html", "html/template", "image", "image/color",
- "image/color/palette", "image/draw", "image/gif", "image/jpeg",
- "image/png", "index/suffixarray", "io", "io/ioutil",
- "log", "log/syslog", "math", "math/big",
- "math/bits", "math/cmplx", "math/rand", "mime",
- "mime/multipart", "mime/quotedprintable", "net", "net/http",
- "net/http/cgi", "net/http/cookiejar", "net/http/fcgi", "net/http/httptest",
- "net/http/httptrace", "net/http/httputil", "net/http/pprof", "net/mail",
- "net/rpc", "net/rpc/jsonrpc", "net/smtp", "net/textproto",
- "net/url", "os", "os/exec", "os/signal",
- "os/user", "path", "path/filepath", "plugin",
- "reflect", "regexp", "regexp/syntax", "runtime",
- "runtime/cgo", "runtime/debug", "runtime/pprof", "runtime/race",
- "runtime/trace", "sort", "strconv", "strings",
- "sync", "sync/atomic", "syscall", "testing",
- "testing/iotest", "testing/quick", "text/scanner", "text/tabwriter",
- "text/template", "text/template/parse", "time", "unicode",
- "unicode/utf16", "unicode/utf8", "unsafe",
-}
-
-func IsStdPkg(pkg string) bool {
- for _, v := range Packages {
- if v == pkg {
- return true
- }
- }
- return false
-}
diff --git a/vendor/github.com/visualfc/gotools/stdlib/zstdlib.go b/vendor/github.com/visualfc/gotools/stdlib/zstdlib.go
deleted file mode 100644
index 633fb43..0000000
--- a/vendor/github.com/visualfc/gotools/stdlib/zstdlib.go
+++ /dev/null
@@ -1,9442 +0,0 @@
-// AUTO-GENERATED BY mkstdlib.go
-
-package stdlib
-
-var Symbols = map[string]string{
- "adler32.Checksum": "hash/adler32",
- "adler32.New": "hash/adler32",
- "adler32.Size": "hash/adler32",
- "aes.BlockSize": "crypto/aes",
- "aes.KeySizeError": "crypto/aes",
- "aes.NewCipher": "crypto/aes",
- "ascii85.CorruptInputError": "encoding/ascii85",
- "ascii85.Decode": "encoding/ascii85",
- "ascii85.Encode": "encoding/ascii85",
- "ascii85.MaxEncodedLen": "encoding/ascii85",
- "ascii85.NewDecoder": "encoding/ascii85",
- "ascii85.NewEncoder": "encoding/ascii85",
- "asn1.BitString": "encoding/asn1",
- "asn1.ClassApplication": "encoding/asn1",
- "asn1.ClassContextSpecific": "encoding/asn1",
- "asn1.ClassPrivate": "encoding/asn1",
- "asn1.ClassUniversal": "encoding/asn1",
- "asn1.Enumerated": "encoding/asn1",
- "asn1.Flag": "encoding/asn1",
- "asn1.Marshal": "encoding/asn1",
- "asn1.NullBytes": "encoding/asn1",
- "asn1.NullRawValue": "encoding/asn1",
- "asn1.ObjectIdentifier": "encoding/asn1",
- "asn1.RawContent": "encoding/asn1",
- "asn1.RawValue": "encoding/asn1",
- "asn1.StructuralError": "encoding/asn1",
- "asn1.SyntaxError": "encoding/asn1",
- "asn1.TagBitString": "encoding/asn1",
- "asn1.TagBoolean": "encoding/asn1",
- "asn1.TagEnum": "encoding/asn1",
- "asn1.TagGeneralString": "encoding/asn1",
- "asn1.TagGeneralizedTime": "encoding/asn1",
- "asn1.TagIA5String": "encoding/asn1",
- "asn1.TagInteger": "encoding/asn1",
- "asn1.TagNull": "encoding/asn1",
- "asn1.TagOID": "encoding/asn1",
- "asn1.TagOctetString": "encoding/asn1",
- "asn1.TagPrintableString": "encoding/asn1",
- "asn1.TagSequence": "encoding/asn1",
- "asn1.TagSet": "encoding/asn1",
- "asn1.TagT61String": "encoding/asn1",
- "asn1.TagUTCTime": "encoding/asn1",
- "asn1.TagUTF8String": "encoding/asn1",
- "asn1.Unmarshal": "encoding/asn1",
- "asn1.UnmarshalWithParams": "encoding/asn1",
- "ast.ArrayType": "go/ast",
- "ast.AssignStmt": "go/ast",
- "ast.Bad": "go/ast",
- "ast.BadDecl": "go/ast",
- "ast.BadExpr": "go/ast",
- "ast.BadStmt": "go/ast",
- "ast.BasicLit": "go/ast",
- "ast.BinaryExpr": "go/ast",
- "ast.BlockStmt": "go/ast",
- "ast.BranchStmt": "go/ast",
- "ast.CallExpr": "go/ast",
- "ast.CaseClause": "go/ast",
- "ast.ChanDir": "go/ast",
- "ast.ChanType": "go/ast",
- "ast.CommClause": "go/ast",
- "ast.Comment": "go/ast",
- "ast.CommentGroup": "go/ast",
- "ast.CommentMap": "go/ast",
- "ast.CompositeLit": "go/ast",
- "ast.Con": "go/ast",
- "ast.DeclStmt": "go/ast",
- "ast.DeferStmt": "go/ast",
- "ast.Ellipsis": "go/ast",
- "ast.EmptyStmt": "go/ast",
- "ast.ExprStmt": "go/ast",
- "ast.Field": "go/ast",
- "ast.FieldFilter": "go/ast",
- "ast.FieldList": "go/ast",
- "ast.File": "go/ast",
- "ast.FileExports": "go/ast",
- "ast.Filter": "go/ast",
- "ast.FilterDecl": "go/ast",
- "ast.FilterFile": "go/ast",
- "ast.FilterFuncDuplicates": "go/ast",
- "ast.FilterImportDuplicates": "go/ast",
- "ast.FilterPackage": "go/ast",
- "ast.FilterUnassociatedComments": "go/ast",
- "ast.ForStmt": "go/ast",
- "ast.Fprint": "go/ast",
- "ast.Fun": "go/ast",
- "ast.FuncDecl": "go/ast",
- "ast.FuncLit": "go/ast",
- "ast.FuncType": "go/ast",
- "ast.GenDecl": "go/ast",
- "ast.GoStmt": "go/ast",
- "ast.Ident": "go/ast",
- "ast.IfStmt": "go/ast",
- "ast.ImportSpec": "go/ast",
- "ast.Importer": "go/ast",
- "ast.IncDecStmt": "go/ast",
- "ast.IndexExpr": "go/ast",
- "ast.Inspect": "go/ast",
- "ast.InterfaceType": "go/ast",
- "ast.IsExported": "go/ast",
- "ast.KeyValueExpr": "go/ast",
- "ast.LabeledStmt": "go/ast",
- "ast.Lbl": "go/ast",
- "ast.MapType": "go/ast",
- "ast.MergeMode": "go/ast",
- "ast.MergePackageFiles": "go/ast",
- "ast.NewCommentMap": "go/ast",
- "ast.NewIdent": "go/ast",
- "ast.NewObj": "go/ast",
- "ast.NewPackage": "go/ast",
- "ast.NewScope": "go/ast",
- "ast.Node": "go/ast",
- "ast.NotNilFilter": "go/ast",
- "ast.ObjKind": "go/ast",
- "ast.Object": "go/ast",
- "ast.Package": "go/ast",
- "ast.PackageExports": "go/ast",
- "ast.ParenExpr": "go/ast",
- "ast.Pkg": "go/ast",
- "ast.Print": "go/ast",
- "ast.RECV": "go/ast",
- "ast.RangeStmt": "go/ast",
- "ast.ReturnStmt": "go/ast",
- "ast.SEND": "go/ast",
- "ast.Scope": "go/ast",
- "ast.SelectStmt": "go/ast",
- "ast.SelectorExpr": "go/ast",
- "ast.SendStmt": "go/ast",
- "ast.SliceExpr": "go/ast",
- "ast.SortImports": "go/ast",
- "ast.StarExpr": "go/ast",
- "ast.StructType": "go/ast",
- "ast.SwitchStmt": "go/ast",
- "ast.Typ": "go/ast",
- "ast.TypeAssertExpr": "go/ast",
- "ast.TypeSpec": "go/ast",
- "ast.TypeSwitchStmt": "go/ast",
- "ast.UnaryExpr": "go/ast",
- "ast.ValueSpec": "go/ast",
- "ast.Var": "go/ast",
- "ast.Visitor": "go/ast",
- "ast.Walk": "go/ast",
- "atomic.AddInt32": "sync/atomic",
- "atomic.AddInt64": "sync/atomic",
- "atomic.AddUint32": "sync/atomic",
- "atomic.AddUint64": "sync/atomic",
- "atomic.AddUintptr": "sync/atomic",
- "atomic.CompareAndSwapInt32": "sync/atomic",
- "atomic.CompareAndSwapInt64": "sync/atomic",
- "atomic.CompareAndSwapPointer": "sync/atomic",
- "atomic.CompareAndSwapUint32": "sync/atomic",
- "atomic.CompareAndSwapUint64": "sync/atomic",
- "atomic.CompareAndSwapUintptr": "sync/atomic",
- "atomic.LoadInt32": "sync/atomic",
- "atomic.LoadInt64": "sync/atomic",
- "atomic.LoadPointer": "sync/atomic",
- "atomic.LoadUint32": "sync/atomic",
- "atomic.LoadUint64": "sync/atomic",
- "atomic.LoadUintptr": "sync/atomic",
- "atomic.StoreInt32": "sync/atomic",
- "atomic.StoreInt64": "sync/atomic",
- "atomic.StorePointer": "sync/atomic",
- "atomic.StoreUint32": "sync/atomic",
- "atomic.StoreUint64": "sync/atomic",
- "atomic.StoreUintptr": "sync/atomic",
- "atomic.SwapInt32": "sync/atomic",
- "atomic.SwapInt64": "sync/atomic",
- "atomic.SwapPointer": "sync/atomic",
- "atomic.SwapUint32": "sync/atomic",
- "atomic.SwapUint64": "sync/atomic",
- "atomic.SwapUintptr": "sync/atomic",
- "atomic.Value": "sync/atomic",
- "base32.CorruptInputError": "encoding/base32",
- "base32.Encoding": "encoding/base32",
- "base32.HexEncoding": "encoding/base32",
- "base32.NewDecoder": "encoding/base32",
- "base32.NewEncoder": "encoding/base32",
- "base32.NewEncoding": "encoding/base32",
- "base32.NoPadding": "encoding/base32",
- "base32.StdEncoding": "encoding/base32",
- "base32.StdPadding": "encoding/base32",
- "base64.CorruptInputError": "encoding/base64",
- "base64.Encoding": "encoding/base64",
- "base64.NewDecoder": "encoding/base64",
- "base64.NewEncoder": "encoding/base64",
- "base64.NewEncoding": "encoding/base64",
- "base64.NoPadding": "encoding/base64",
- "base64.RawStdEncoding": "encoding/base64",
- "base64.RawURLEncoding": "encoding/base64",
- "base64.StdEncoding": "encoding/base64",
- "base64.StdPadding": "encoding/base64",
- "base64.URLEncoding": "encoding/base64",
- "big.Above": "math/big",
- "big.Accuracy": "math/big",
- "big.AwayFromZero": "math/big",
- "big.Below": "math/big",
- "big.ErrNaN": "math/big",
- "big.Exact": "math/big",
- "big.Float": "math/big",
- "big.Int": "math/big",
- "big.Jacobi": "math/big",
- "big.MaxBase": "math/big",
- "big.MaxExp": "math/big",
- "big.MaxPrec": "math/big",
- "big.MinExp": "math/big",
- "big.NewFloat": "math/big",
- "big.NewInt": "math/big",
- "big.NewRat": "math/big",
- "big.ParseFloat": "math/big",
- "big.Rat": "math/big",
- "big.RoundingMode": "math/big",
- "big.ToNearestAway": "math/big",
- "big.ToNearestEven": "math/big",
- "big.ToNegativeInf": "math/big",
- "big.ToPositiveInf": "math/big",
- "big.ToZero": "math/big",
- "big.Word": "math/big",
- "binary.BigEndian": "encoding/binary",
- "binary.ByteOrder": "encoding/binary",
- "binary.LittleEndian": "encoding/binary",
- "binary.MaxVarintLen16": "encoding/binary",
- "binary.MaxVarintLen32": "encoding/binary",
- "binary.MaxVarintLen64": "encoding/binary",
- "binary.PutUvarint": "encoding/binary",
- "binary.PutVarint": "encoding/binary",
- "binary.Read": "encoding/binary",
- "binary.ReadUvarint": "encoding/binary",
- "binary.ReadVarint": "encoding/binary",
- "binary.Size": "encoding/binary",
- "binary.Uvarint": "encoding/binary",
- "binary.Varint": "encoding/binary",
- "binary.Write": "encoding/binary",
- "bits.LeadingZeros": "math/bits",
- "bits.LeadingZeros16": "math/bits",
- "bits.LeadingZeros32": "math/bits",
- "bits.LeadingZeros64": "math/bits",
- "bits.LeadingZeros8": "math/bits",
- "bits.Len": "math/bits",
- "bits.Len16": "math/bits",
- "bits.Len32": "math/bits",
- "bits.Len64": "math/bits",
- "bits.Len8": "math/bits",
- "bits.OnesCount": "math/bits",
- "bits.OnesCount16": "math/bits",
- "bits.OnesCount32": "math/bits",
- "bits.OnesCount64": "math/bits",
- "bits.OnesCount8": "math/bits",
- "bits.Reverse": "math/bits",
- "bits.Reverse16": "math/bits",
- "bits.Reverse32": "math/bits",
- "bits.Reverse64": "math/bits",
- "bits.Reverse8": "math/bits",
- "bits.ReverseBytes": "math/bits",
- "bits.ReverseBytes16": "math/bits",
- "bits.ReverseBytes32": "math/bits",
- "bits.ReverseBytes64": "math/bits",
- "bits.RotateLeft": "math/bits",
- "bits.RotateLeft16": "math/bits",
- "bits.RotateLeft32": "math/bits",
- "bits.RotateLeft64": "math/bits",
- "bits.RotateLeft8": "math/bits",
- "bits.TrailingZeros": "math/bits",
- "bits.TrailingZeros16": "math/bits",
- "bits.TrailingZeros32": "math/bits",
- "bits.TrailingZeros64": "math/bits",
- "bits.TrailingZeros8": "math/bits",
- "bits.UintSize": "math/bits",
- "bufio.ErrAdvanceTooFar": "bufio",
- "bufio.ErrBufferFull": "bufio",
- "bufio.ErrFinalToken": "bufio",
- "bufio.ErrInvalidUnreadByte": "bufio",
- "bufio.ErrInvalidUnreadRune": "bufio",
- "bufio.ErrNegativeAdvance": "bufio",
- "bufio.ErrNegativeCount": "bufio",
- "bufio.ErrTooLong": "bufio",
- "bufio.MaxScanTokenSize": "bufio",
- "bufio.NewReadWriter": "bufio",
- "bufio.NewReader": "bufio",
- "bufio.NewReaderSize": "bufio",
- "bufio.NewScanner": "bufio",
- "bufio.NewWriter": "bufio",
- "bufio.NewWriterSize": "bufio",
- "bufio.ReadWriter": "bufio",
- "bufio.Reader": "bufio",
- "bufio.ScanBytes": "bufio",
- "bufio.ScanLines": "bufio",
- "bufio.ScanRunes": "bufio",
- "bufio.ScanWords": "bufio",
- "bufio.Scanner": "bufio",
- "bufio.SplitFunc": "bufio",
- "bufio.Writer": "bufio",
- "build.AllowBinary": "go/build",
- "build.ArchChar": "go/build",
- "build.Context": "go/build",
- "build.Default": "go/build",
- "build.FindOnly": "go/build",
- "build.IgnoreVendor": "go/build",
- "build.Import": "go/build",
- "build.ImportComment": "go/build",
- "build.ImportDir": "go/build",
- "build.ImportMode": "go/build",
- "build.IsLocalImport": "go/build",
- "build.MultiplePackageError": "go/build",
- "build.NoGoError": "go/build",
- "build.Package": "go/build",
- "build.ToolDir": "go/build",
- "bytes.Buffer": "bytes",
- "bytes.Compare": "bytes",
- "bytes.Contains": "bytes",
- "bytes.ContainsAny": "bytes",
- "bytes.ContainsRune": "bytes",
- "bytes.Count": "bytes",
- "bytes.Equal": "bytes",
- "bytes.EqualFold": "bytes",
- "bytes.ErrTooLarge": "bytes",
- "bytes.Fields": "bytes",
- "bytes.FieldsFunc": "bytes",
- "bytes.HasPrefix": "bytes",
- "bytes.HasSuffix": "bytes",
- "bytes.Index": "bytes",
- "bytes.IndexAny": "bytes",
- "bytes.IndexByte": "bytes",
- "bytes.IndexFunc": "bytes",
- "bytes.IndexRune": "bytes",
- "bytes.Join": "bytes",
- "bytes.LastIndex": "bytes",
- "bytes.LastIndexAny": "bytes",
- "bytes.LastIndexByte": "bytes",
- "bytes.LastIndexFunc": "bytes",
- "bytes.Map": "bytes",
- "bytes.MinRead": "bytes",
- "bytes.NewBuffer": "bytes",
- "bytes.NewBufferString": "bytes",
- "bytes.NewReader": "bytes",
- "bytes.Reader": "bytes",
- "bytes.Repeat": "bytes",
- "bytes.Replace": "bytes",
- "bytes.Runes": "bytes",
- "bytes.Split": "bytes",
- "bytes.SplitAfter": "bytes",
- "bytes.SplitAfterN": "bytes",
- "bytes.SplitN": "bytes",
- "bytes.Title": "bytes",
- "bytes.ToLower": "bytes",
- "bytes.ToLowerSpecial": "bytes",
- "bytes.ToTitle": "bytes",
- "bytes.ToTitleSpecial": "bytes",
- "bytes.ToUpper": "bytes",
- "bytes.ToUpperSpecial": "bytes",
- "bytes.Trim": "bytes",
- "bytes.TrimFunc": "bytes",
- "bytes.TrimLeft": "bytes",
- "bytes.TrimLeftFunc": "bytes",
- "bytes.TrimPrefix": "bytes",
- "bytes.TrimRight": "bytes",
- "bytes.TrimRightFunc": "bytes",
- "bytes.TrimSpace": "bytes",
- "bytes.TrimSuffix": "bytes",
- "bzip2.NewReader": "compress/bzip2",
- "bzip2.StructuralError": "compress/bzip2",
- "cgi.Handler": "net/http/cgi",
- "cgi.Request": "net/http/cgi",
- "cgi.RequestFromMap": "net/http/cgi",
- "cgi.Serve": "net/http/cgi",
- "cipher.AEAD": "crypto/cipher",
- "cipher.Block": "crypto/cipher",
- "cipher.BlockMode": "crypto/cipher",
- "cipher.NewCBCDecrypter": "crypto/cipher",
- "cipher.NewCBCEncrypter": "crypto/cipher",
- "cipher.NewCFBDecrypter": "crypto/cipher",
- "cipher.NewCFBEncrypter": "crypto/cipher",
- "cipher.NewCTR": "crypto/cipher",
- "cipher.NewGCM": "crypto/cipher",
- "cipher.NewGCMWithNonceSize": "crypto/cipher",
- "cipher.NewOFB": "crypto/cipher",
- "cipher.Stream": "crypto/cipher",
- "cipher.StreamReader": "crypto/cipher",
- "cipher.StreamWriter": "crypto/cipher",
- "cmplx.Abs": "math/cmplx",
- "cmplx.Acos": "math/cmplx",
- "cmplx.Acosh": "math/cmplx",
- "cmplx.Asin": "math/cmplx",
- "cmplx.Asinh": "math/cmplx",
- "cmplx.Atan": "math/cmplx",
- "cmplx.Atanh": "math/cmplx",
- "cmplx.Conj": "math/cmplx",
- "cmplx.Cos": "math/cmplx",
- "cmplx.Cosh": "math/cmplx",
- "cmplx.Cot": "math/cmplx",
- "cmplx.Exp": "math/cmplx",
- "cmplx.Inf": "math/cmplx",
- "cmplx.IsInf": "math/cmplx",
- "cmplx.IsNaN": "math/cmplx",
- "cmplx.Log": "math/cmplx",
- "cmplx.Log10": "math/cmplx",
- "cmplx.NaN": "math/cmplx",
- "cmplx.Phase": "math/cmplx",
- "cmplx.Polar": "math/cmplx",
- "cmplx.Pow": "math/cmplx",
- "cmplx.Rect": "math/cmplx",
- "cmplx.Sin": "math/cmplx",
- "cmplx.Sinh": "math/cmplx",
- "cmplx.Sqrt": "math/cmplx",
- "cmplx.Tan": "math/cmplx",
- "cmplx.Tanh": "math/cmplx",
- "color.Alpha": "image/color",
- "color.Alpha16": "image/color",
- "color.Alpha16Model": "image/color",
- "color.AlphaModel": "image/color",
- "color.Black": "image/color",
- "color.CMYK": "image/color",
- "color.CMYKModel": "image/color",
- "color.CMYKToRGB": "image/color",
- "color.Color": "image/color",
- "color.Gray": "image/color",
- "color.Gray16": "image/color",
- "color.Gray16Model": "image/color",
- "color.GrayModel": "image/color",
- "color.Model": "image/color",
- "color.ModelFunc": "image/color",
- "color.NRGBA": "image/color",
- "color.NRGBA64": "image/color",
- "color.NRGBA64Model": "image/color",
- "color.NRGBAModel": "image/color",
- "color.NYCbCrA": "image/color",
- "color.NYCbCrAModel": "image/color",
- "color.Opaque": "image/color",
- "color.Palette": "image/color",
- "color.RGBA": "image/color",
- "color.RGBA64": "image/color",
- "color.RGBA64Model": "image/color",
- "color.RGBAModel": "image/color",
- "color.RGBToCMYK": "image/color",
- "color.RGBToYCbCr": "image/color",
- "color.Transparent": "image/color",
- "color.White": "image/color",
- "color.YCbCr": "image/color",
- "color.YCbCrModel": "image/color",
- "color.YCbCrToRGB": "image/color",
- "constant.BinaryOp": "go/constant",
- "constant.BitLen": "go/constant",
- "constant.Bool": "go/constant",
- "constant.BoolVal": "go/constant",
- "constant.Bytes": "go/constant",
- "constant.Compare": "go/constant",
- "constant.Complex": "go/constant",
- "constant.Denom": "go/constant",
- "constant.Float": "go/constant",
- "constant.Float32Val": "go/constant",
- "constant.Float64Val": "go/constant",
- "constant.Imag": "go/constant",
- "constant.Int": "go/constant",
- "constant.Int64Val": "go/constant",
- "constant.Kind": "go/constant",
- "constant.MakeBool": "go/constant",
- "constant.MakeFloat64": "go/constant",
- "constant.MakeFromBytes": "go/constant",
- "constant.MakeFromLiteral": "go/constant",
- "constant.MakeImag": "go/constant",
- "constant.MakeInt64": "go/constant",
- "constant.MakeString": "go/constant",
- "constant.MakeUint64": "go/constant",
- "constant.MakeUnknown": "go/constant",
- "constant.Num": "go/constant",
- "constant.Real": "go/constant",
- "constant.Shift": "go/constant",
- "constant.Sign": "go/constant",
- "constant.String": "go/constant",
- "constant.StringVal": "go/constant",
- "constant.ToComplex": "go/constant",
- "constant.ToFloat": "go/constant",
- "constant.ToInt": "go/constant",
- "constant.Uint64Val": "go/constant",
- "constant.UnaryOp": "go/constant",
- "constant.Unknown": "go/constant",
- "context.Background": "context",
- "context.CancelFunc": "context",
- "context.Canceled": "context",
- "context.Context": "context",
- "context.DeadlineExceeded": "context",
- "context.TODO": "context",
- "context.WithCancel": "context",
- "context.WithDeadline": "context",
- "context.WithTimeout": "context",
- "context.WithValue": "context",
- "cookiejar.Jar": "net/http/cookiejar",
- "cookiejar.New": "net/http/cookiejar",
- "cookiejar.Options": "net/http/cookiejar",
- "cookiejar.PublicSuffixList": "net/http/cookiejar",
- "crc32.Castagnoli": "hash/crc32",
- "crc32.Checksum": "hash/crc32",
- "crc32.ChecksumIEEE": "hash/crc32",
- "crc32.IEEE": "hash/crc32",
- "crc32.IEEETable": "hash/crc32",
- "crc32.Koopman": "hash/crc32",
- "crc32.MakeTable": "hash/crc32",
- "crc32.New": "hash/crc32",
- "crc32.NewIEEE": "hash/crc32",
- "crc32.Size": "hash/crc32",
- "crc32.Table": "hash/crc32",
- "crc32.Update": "hash/crc32",
- "crc64.Checksum": "hash/crc64",
- "crc64.ECMA": "hash/crc64",
- "crc64.ISO": "hash/crc64",
- "crc64.MakeTable": "hash/crc64",
- "crc64.New": "hash/crc64",
- "crc64.Size": "hash/crc64",
- "crc64.Table": "hash/crc64",
- "crc64.Update": "hash/crc64",
- "crypto.BLAKE2b_256": "crypto",
- "crypto.BLAKE2b_384": "crypto",
- "crypto.BLAKE2b_512": "crypto",
- "crypto.BLAKE2s_256": "crypto",
- "crypto.Decrypter": "crypto",
- "crypto.DecrypterOpts": "crypto",
- "crypto.Hash": "crypto",
- "crypto.MD4": "crypto",
- "crypto.MD5": "crypto",
- "crypto.MD5SHA1": "crypto",
- "crypto.PrivateKey": "crypto",
- "crypto.PublicKey": "crypto",
- "crypto.RIPEMD160": "crypto",
- "crypto.RegisterHash": "crypto",
- "crypto.SHA1": "crypto",
- "crypto.SHA224": "crypto",
- "crypto.SHA256": "crypto",
- "crypto.SHA384": "crypto",
- "crypto.SHA3_224": "crypto",
- "crypto.SHA3_256": "crypto",
- "crypto.SHA3_384": "crypto",
- "crypto.SHA3_512": "crypto",
- "crypto.SHA512": "crypto",
- "crypto.SHA512_224": "crypto",
- "crypto.SHA512_256": "crypto",
- "crypto.Signer": "crypto",
- "crypto.SignerOpts": "crypto",
- "csv.ErrBareQuote": "encoding/csv",
- "csv.ErrFieldCount": "encoding/csv",
- "csv.ErrQuote": "encoding/csv",
- "csv.ErrTrailingComma": "encoding/csv",
- "csv.NewReader": "encoding/csv",
- "csv.NewWriter": "encoding/csv",
- "csv.ParseError": "encoding/csv",
- "csv.Reader": "encoding/csv",
- "csv.Writer": "encoding/csv",
- "debug.FreeOSMemory": "runtime/debug",
- "debug.GCStats": "runtime/debug",
- "debug.PrintStack": "runtime/debug",
- "debug.ReadGCStats": "runtime/debug",
- "debug.SetGCPercent": "runtime/debug",
- "debug.SetMaxStack": "runtime/debug",
- "debug.SetMaxThreads": "runtime/debug",
- "debug.SetPanicOnFault": "runtime/debug",
- "debug.SetTraceback": "runtime/debug",
- "debug.Stack": "runtime/debug",
- "debug.WriteHeapDump": "runtime/debug",
- "des.BlockSize": "crypto/des",
- "des.KeySizeError": "crypto/des",
- "des.NewCipher": "crypto/des",
- "des.NewTripleDESCipher": "crypto/des",
- "doc.AllDecls": "go/doc",
- "doc.AllMethods": "go/doc",
- "doc.Example": "go/doc",
- "doc.Examples": "go/doc",
- "doc.Filter": "go/doc",
- "doc.Func": "go/doc",
- "doc.IllegalPrefixes": "go/doc",
- "doc.IsPredeclared": "go/doc",
- "doc.Mode": "go/doc",
- "doc.New": "go/doc",
- "doc.Note": "go/doc",
- "doc.Package": "go/doc",
- "doc.Synopsis": "go/doc",
- "doc.ToHTML": "go/doc",
- "doc.ToText": "go/doc",
- "doc.Type": "go/doc",
- "doc.Value": "go/doc",
- "draw.Draw": "image/draw",
- "draw.DrawMask": "image/draw",
- "draw.Drawer": "image/draw",
- "draw.FloydSteinberg": "image/draw",
- "draw.Image": "image/draw",
- "draw.Op": "image/draw",
- "draw.Over": "image/draw",
- "draw.Quantizer": "image/draw",
- "draw.Src": "image/draw",
- "driver.Bool": "database/sql/driver",
- "driver.ColumnConverter": "database/sql/driver",
- "driver.Conn": "database/sql/driver",
- "driver.ConnBeginTx": "database/sql/driver",
- "driver.ConnPrepareContext": "database/sql/driver",
- "driver.DefaultParameterConverter": "database/sql/driver",
- "driver.Driver": "database/sql/driver",
- "driver.ErrBadConn": "database/sql/driver",
- "driver.ErrRemoveArgument": "database/sql/driver",
- "driver.ErrSkip": "database/sql/driver",
- "driver.Execer": "database/sql/driver",
- "driver.ExecerContext": "database/sql/driver",
- "driver.Int32": "database/sql/driver",
- "driver.IsScanValue": "database/sql/driver",
- "driver.IsValue": "database/sql/driver",
- "driver.IsolationLevel": "database/sql/driver",
- "driver.NamedValue": "database/sql/driver",
- "driver.NamedValueChecker": "database/sql/driver",
- "driver.NotNull": "database/sql/driver",
- "driver.Null": "database/sql/driver",
- "driver.Pinger": "database/sql/driver",
- "driver.Queryer": "database/sql/driver",
- "driver.QueryerContext": "database/sql/driver",
- "driver.Result": "database/sql/driver",
- "driver.ResultNoRows": "database/sql/driver",
- "driver.Rows": "database/sql/driver",
- "driver.RowsAffected": "database/sql/driver",
- "driver.RowsColumnTypeDatabaseTypeName": "database/sql/driver",
- "driver.RowsColumnTypeLength": "database/sql/driver",
- "driver.RowsColumnTypeNullable": "database/sql/driver",
- "driver.RowsColumnTypePrecisionScale": "database/sql/driver",
- "driver.RowsColumnTypeScanType": "database/sql/driver",
- "driver.RowsNextResultSet": "database/sql/driver",
- "driver.Stmt": "database/sql/driver",
- "driver.StmtExecContext": "database/sql/driver",
- "driver.StmtQueryContext": "database/sql/driver",
- "driver.String": "database/sql/driver",
- "driver.Tx": "database/sql/driver",
- "driver.TxOptions": "database/sql/driver",
- "driver.Value": "database/sql/driver",
- "driver.ValueConverter": "database/sql/driver",
- "driver.Valuer": "database/sql/driver",
- "dsa.ErrInvalidPublicKey": "crypto/dsa",
- "dsa.GenerateKey": "crypto/dsa",
- "dsa.GenerateParameters": "crypto/dsa",
- "dsa.L1024N160": "crypto/dsa",
- "dsa.L2048N224": "crypto/dsa",
- "dsa.L2048N256": "crypto/dsa",
- "dsa.L3072N256": "crypto/dsa",
- "dsa.ParameterSizes": "crypto/dsa",
- "dsa.Parameters": "crypto/dsa",
- "dsa.PrivateKey": "crypto/dsa",
- "dsa.PublicKey": "crypto/dsa",
- "dsa.Sign": "crypto/dsa",
- "dsa.Verify": "crypto/dsa",
- "dwarf.AddrType": "debug/dwarf",
- "dwarf.ArrayType": "debug/dwarf",
- "dwarf.Attr": "debug/dwarf",
- "dwarf.AttrAbstractOrigin": "debug/dwarf",
- "dwarf.AttrAccessibility": "debug/dwarf",
- "dwarf.AttrAddrClass": "debug/dwarf",
- "dwarf.AttrAllocated": "debug/dwarf",
- "dwarf.AttrArtificial": "debug/dwarf",
- "dwarf.AttrAssociated": "debug/dwarf",
- "dwarf.AttrBaseTypes": "debug/dwarf",
- "dwarf.AttrBitOffset": "debug/dwarf",
- "dwarf.AttrBitSize": "debug/dwarf",
- "dwarf.AttrByteSize": "debug/dwarf",
- "dwarf.AttrCallColumn": "debug/dwarf",
- "dwarf.AttrCallFile": "debug/dwarf",
- "dwarf.AttrCallLine": "debug/dwarf",
- "dwarf.AttrCalling": "debug/dwarf",
- "dwarf.AttrCommonRef": "debug/dwarf",
- "dwarf.AttrCompDir": "debug/dwarf",
- "dwarf.AttrConstValue": "debug/dwarf",
- "dwarf.AttrContainingType": "debug/dwarf",
- "dwarf.AttrCount": "debug/dwarf",
- "dwarf.AttrDataLocation": "debug/dwarf",
- "dwarf.AttrDataMemberLoc": "debug/dwarf",
- "dwarf.AttrDeclColumn": "debug/dwarf",
- "dwarf.AttrDeclFile": "debug/dwarf",
- "dwarf.AttrDeclLine": "debug/dwarf",
- "dwarf.AttrDeclaration": "debug/dwarf",
- "dwarf.AttrDefaultValue": "debug/dwarf",
- "dwarf.AttrDescription": "debug/dwarf",
- "dwarf.AttrDiscr": "debug/dwarf",
- "dwarf.AttrDiscrList": "debug/dwarf",
- "dwarf.AttrDiscrValue": "debug/dwarf",
- "dwarf.AttrEncoding": "debug/dwarf",
- "dwarf.AttrEntrypc": "debug/dwarf",
- "dwarf.AttrExtension": "debug/dwarf",
- "dwarf.AttrExternal": "debug/dwarf",
- "dwarf.AttrFrameBase": "debug/dwarf",
- "dwarf.AttrFriend": "debug/dwarf",
- "dwarf.AttrHighpc": "debug/dwarf",
- "dwarf.AttrIdentifierCase": "debug/dwarf",
- "dwarf.AttrImport": "debug/dwarf",
- "dwarf.AttrInline": "debug/dwarf",
- "dwarf.AttrIsOptional": "debug/dwarf",
- "dwarf.AttrLanguage": "debug/dwarf",
- "dwarf.AttrLocation": "debug/dwarf",
- "dwarf.AttrLowerBound": "debug/dwarf",
- "dwarf.AttrLowpc": "debug/dwarf",
- "dwarf.AttrMacroInfo": "debug/dwarf",
- "dwarf.AttrName": "debug/dwarf",
- "dwarf.AttrNamelistItem": "debug/dwarf",
- "dwarf.AttrOrdering": "debug/dwarf",
- "dwarf.AttrPriority": "debug/dwarf",
- "dwarf.AttrProducer": "debug/dwarf",
- "dwarf.AttrPrototyped": "debug/dwarf",
- "dwarf.AttrRanges": "debug/dwarf",
- "dwarf.AttrReturnAddr": "debug/dwarf",
- "dwarf.AttrSegment": "debug/dwarf",
- "dwarf.AttrSibling": "debug/dwarf",
- "dwarf.AttrSpecification": "debug/dwarf",
- "dwarf.AttrStartScope": "debug/dwarf",
- "dwarf.AttrStaticLink": "debug/dwarf",
- "dwarf.AttrStmtList": "debug/dwarf",
- "dwarf.AttrStride": "debug/dwarf",
- "dwarf.AttrStrideSize": "debug/dwarf",
- "dwarf.AttrStringLength": "debug/dwarf",
- "dwarf.AttrTrampoline": "debug/dwarf",
- "dwarf.AttrType": "debug/dwarf",
- "dwarf.AttrUpperBound": "debug/dwarf",
- "dwarf.AttrUseLocation": "debug/dwarf",
- "dwarf.AttrUseUTF8": "debug/dwarf",
- "dwarf.AttrVarParam": "debug/dwarf",
- "dwarf.AttrVirtuality": "debug/dwarf",
- "dwarf.AttrVisibility": "debug/dwarf",
- "dwarf.AttrVtableElemLoc": "debug/dwarf",
- "dwarf.BasicType": "debug/dwarf",
- "dwarf.BoolType": "debug/dwarf",
- "dwarf.CharType": "debug/dwarf",
- "dwarf.Class": "debug/dwarf",
- "dwarf.ClassAddress": "debug/dwarf",
- "dwarf.ClassBlock": "debug/dwarf",
- "dwarf.ClassConstant": "debug/dwarf",
- "dwarf.ClassExprLoc": "debug/dwarf",
- "dwarf.ClassFlag": "debug/dwarf",
- "dwarf.ClassLinePtr": "debug/dwarf",
- "dwarf.ClassLocListPtr": "debug/dwarf",
- "dwarf.ClassMacPtr": "debug/dwarf",
- "dwarf.ClassRangeListPtr": "debug/dwarf",
- "dwarf.ClassReference": "debug/dwarf",
- "dwarf.ClassReferenceAlt": "debug/dwarf",
- "dwarf.ClassReferenceSig": "debug/dwarf",
- "dwarf.ClassString": "debug/dwarf",
- "dwarf.ClassStringAlt": "debug/dwarf",
- "dwarf.ClassUnknown": "debug/dwarf",
- "dwarf.CommonType": "debug/dwarf",
- "dwarf.ComplexType": "debug/dwarf",
- "dwarf.Data": "debug/dwarf",
- "dwarf.DecodeError": "debug/dwarf",
- "dwarf.DotDotDotType": "debug/dwarf",
- "dwarf.Entry": "debug/dwarf",
- "dwarf.EnumType": "debug/dwarf",
- "dwarf.EnumValue": "debug/dwarf",
- "dwarf.ErrUnknownPC": "debug/dwarf",
- "dwarf.Field": "debug/dwarf",
- "dwarf.FloatType": "debug/dwarf",
- "dwarf.FuncType": "debug/dwarf",
- "dwarf.IntType": "debug/dwarf",
- "dwarf.LineEntry": "debug/dwarf",
- "dwarf.LineFile": "debug/dwarf",
- "dwarf.LineReader": "debug/dwarf",
- "dwarf.LineReaderPos": "debug/dwarf",
- "dwarf.New": "debug/dwarf",
- "dwarf.Offset": "debug/dwarf",
- "dwarf.PtrType": "debug/dwarf",
- "dwarf.QualType": "debug/dwarf",
- "dwarf.Reader": "debug/dwarf",
- "dwarf.StructField": "debug/dwarf",
- "dwarf.StructType": "debug/dwarf",
- "dwarf.Tag": "debug/dwarf",
- "dwarf.TagAccessDeclaration": "debug/dwarf",
- "dwarf.TagArrayType": "debug/dwarf",
- "dwarf.TagBaseType": "debug/dwarf",
- "dwarf.TagCatchDwarfBlock": "debug/dwarf",
- "dwarf.TagClassType": "debug/dwarf",
- "dwarf.TagCommonDwarfBlock": "debug/dwarf",
- "dwarf.TagCommonInclusion": "debug/dwarf",
- "dwarf.TagCompileUnit": "debug/dwarf",
- "dwarf.TagCondition": "debug/dwarf",
- "dwarf.TagConstType": "debug/dwarf",
- "dwarf.TagConstant": "debug/dwarf",
- "dwarf.TagDwarfProcedure": "debug/dwarf",
- "dwarf.TagEntryPoint": "debug/dwarf",
- "dwarf.TagEnumerationType": "debug/dwarf",
- "dwarf.TagEnumerator": "debug/dwarf",
- "dwarf.TagFileType": "debug/dwarf",
- "dwarf.TagFormalParameter": "debug/dwarf",
- "dwarf.TagFriend": "debug/dwarf",
- "dwarf.TagImportedDeclaration": "debug/dwarf",
- "dwarf.TagImportedModule": "debug/dwarf",
- "dwarf.TagImportedUnit": "debug/dwarf",
- "dwarf.TagInheritance": "debug/dwarf",
- "dwarf.TagInlinedSubroutine": "debug/dwarf",
- "dwarf.TagInterfaceType": "debug/dwarf",
- "dwarf.TagLabel": "debug/dwarf",
- "dwarf.TagLexDwarfBlock": "debug/dwarf",
- "dwarf.TagMember": "debug/dwarf",
- "dwarf.TagModule": "debug/dwarf",
- "dwarf.TagMutableType": "debug/dwarf",
- "dwarf.TagNamelist": "debug/dwarf",
- "dwarf.TagNamelistItem": "debug/dwarf",
- "dwarf.TagNamespace": "debug/dwarf",
- "dwarf.TagPackedType": "debug/dwarf",
- "dwarf.TagPartialUnit": "debug/dwarf",
- "dwarf.TagPointerType": "debug/dwarf",
- "dwarf.TagPtrToMemberType": "debug/dwarf",
- "dwarf.TagReferenceType": "debug/dwarf",
- "dwarf.TagRestrictType": "debug/dwarf",
- "dwarf.TagRvalueReferenceType": "debug/dwarf",
- "dwarf.TagSetType": "debug/dwarf",
- "dwarf.TagSharedType": "debug/dwarf",
- "dwarf.TagStringType": "debug/dwarf",
- "dwarf.TagStructType": "debug/dwarf",
- "dwarf.TagSubprogram": "debug/dwarf",
- "dwarf.TagSubrangeType": "debug/dwarf",
- "dwarf.TagSubroutineType": "debug/dwarf",
- "dwarf.TagTemplateAlias": "debug/dwarf",
- "dwarf.TagTemplateTypeParameter": "debug/dwarf",
- "dwarf.TagTemplateValueParameter": "debug/dwarf",
- "dwarf.TagThrownType": "debug/dwarf",
- "dwarf.TagTryDwarfBlock": "debug/dwarf",
- "dwarf.TagTypeUnit": "debug/dwarf",
- "dwarf.TagTypedef": "debug/dwarf",
- "dwarf.TagUnionType": "debug/dwarf",
- "dwarf.TagUnspecifiedParameters": "debug/dwarf",
- "dwarf.TagUnspecifiedType": "debug/dwarf",
- "dwarf.TagVariable": "debug/dwarf",
- "dwarf.TagVariant": "debug/dwarf",
- "dwarf.TagVariantPart": "debug/dwarf",
- "dwarf.TagVolatileType": "debug/dwarf",
- "dwarf.TagWithStmt": "debug/dwarf",
- "dwarf.Type": "debug/dwarf",
- "dwarf.TypedefType": "debug/dwarf",
- "dwarf.UcharType": "debug/dwarf",
- "dwarf.UintType": "debug/dwarf",
- "dwarf.UnspecifiedType": "debug/dwarf",
- "dwarf.VoidType": "debug/dwarf",
- "ecdsa.GenerateKey": "crypto/ecdsa",
- "ecdsa.PrivateKey": "crypto/ecdsa",
- "ecdsa.PublicKey": "crypto/ecdsa",
- "ecdsa.Sign": "crypto/ecdsa",
- "ecdsa.Verify": "crypto/ecdsa",
- "elf.ARM_MAGIC_TRAMP_NUMBER": "debug/elf",
- "elf.COMPRESS_HIOS": "debug/elf",
- "elf.COMPRESS_HIPROC": "debug/elf",
- "elf.COMPRESS_LOOS": "debug/elf",
- "elf.COMPRESS_LOPROC": "debug/elf",
- "elf.COMPRESS_ZLIB": "debug/elf",
- "elf.Chdr32": "debug/elf",
- "elf.Chdr64": "debug/elf",
- "elf.Class": "debug/elf",
- "elf.CompressionType": "debug/elf",
- "elf.DF_BIND_NOW": "debug/elf",
- "elf.DF_ORIGIN": "debug/elf",
- "elf.DF_STATIC_TLS": "debug/elf",
- "elf.DF_SYMBOLIC": "debug/elf",
- "elf.DF_TEXTREL": "debug/elf",
- "elf.DT_BIND_NOW": "debug/elf",
- "elf.DT_DEBUG": "debug/elf",
- "elf.DT_ENCODING": "debug/elf",
- "elf.DT_FINI": "debug/elf",
- "elf.DT_FINI_ARRAY": "debug/elf",
- "elf.DT_FINI_ARRAYSZ": "debug/elf",
- "elf.DT_FLAGS": "debug/elf",
- "elf.DT_HASH": "debug/elf",
- "elf.DT_HIOS": "debug/elf",
- "elf.DT_HIPROC": "debug/elf",
- "elf.DT_INIT": "debug/elf",
- "elf.DT_INIT_ARRAY": "debug/elf",
- "elf.DT_INIT_ARRAYSZ": "debug/elf",
- "elf.DT_JMPREL": "debug/elf",
- "elf.DT_LOOS": "debug/elf",
- "elf.DT_LOPROC": "debug/elf",
- "elf.DT_NEEDED": "debug/elf",
- "elf.DT_NULL": "debug/elf",
- "elf.DT_PLTGOT": "debug/elf",
- "elf.DT_PLTREL": "debug/elf",
- "elf.DT_PLTRELSZ": "debug/elf",
- "elf.DT_PREINIT_ARRAY": "debug/elf",
- "elf.DT_PREINIT_ARRAYSZ": "debug/elf",
- "elf.DT_REL": "debug/elf",
- "elf.DT_RELA": "debug/elf",
- "elf.DT_RELAENT": "debug/elf",
- "elf.DT_RELASZ": "debug/elf",
- "elf.DT_RELENT": "debug/elf",
- "elf.DT_RELSZ": "debug/elf",
- "elf.DT_RPATH": "debug/elf",
- "elf.DT_RUNPATH": "debug/elf",
- "elf.DT_SONAME": "debug/elf",
- "elf.DT_STRSZ": "debug/elf",
- "elf.DT_STRTAB": "debug/elf",
- "elf.DT_SYMBOLIC": "debug/elf",
- "elf.DT_SYMENT": "debug/elf",
- "elf.DT_SYMTAB": "debug/elf",
- "elf.DT_TEXTREL": "debug/elf",
- "elf.DT_VERNEED": "debug/elf",
- "elf.DT_VERNEEDNUM": "debug/elf",
- "elf.DT_VERSYM": "debug/elf",
- "elf.Data": "debug/elf",
- "elf.Dyn32": "debug/elf",
- "elf.Dyn64": "debug/elf",
- "elf.DynFlag": "debug/elf",
- "elf.DynTag": "debug/elf",
- "elf.EI_ABIVERSION": "debug/elf",
- "elf.EI_CLASS": "debug/elf",
- "elf.EI_DATA": "debug/elf",
- "elf.EI_NIDENT": "debug/elf",
- "elf.EI_OSABI": "debug/elf",
- "elf.EI_PAD": "debug/elf",
- "elf.EI_VERSION": "debug/elf",
- "elf.ELFCLASS32": "debug/elf",
- "elf.ELFCLASS64": "debug/elf",
- "elf.ELFCLASSNONE": "debug/elf",
- "elf.ELFDATA2LSB": "debug/elf",
- "elf.ELFDATA2MSB": "debug/elf",
- "elf.ELFDATANONE": "debug/elf",
- "elf.ELFMAG": "debug/elf",
- "elf.ELFOSABI_86OPEN": "debug/elf",
- "elf.ELFOSABI_AIX": "debug/elf",
- "elf.ELFOSABI_ARM": "debug/elf",
- "elf.ELFOSABI_FREEBSD": "debug/elf",
- "elf.ELFOSABI_HPUX": "debug/elf",
- "elf.ELFOSABI_HURD": "debug/elf",
- "elf.ELFOSABI_IRIX": "debug/elf",
- "elf.ELFOSABI_LINUX": "debug/elf",
- "elf.ELFOSABI_MODESTO": "debug/elf",
- "elf.ELFOSABI_NETBSD": "debug/elf",
- "elf.ELFOSABI_NONE": "debug/elf",
- "elf.ELFOSABI_NSK": "debug/elf",
- "elf.ELFOSABI_OPENBSD": "debug/elf",
- "elf.ELFOSABI_OPENVMS": "debug/elf",
- "elf.ELFOSABI_SOLARIS": "debug/elf",
- "elf.ELFOSABI_STANDALONE": "debug/elf",
- "elf.ELFOSABI_TRU64": "debug/elf",
- "elf.EM_386": "debug/elf",
- "elf.EM_486": "debug/elf",
- "elf.EM_68HC12": "debug/elf",
- "elf.EM_68K": "debug/elf",
- "elf.EM_860": "debug/elf",
- "elf.EM_88K": "debug/elf",
- "elf.EM_960": "debug/elf",
- "elf.EM_AARCH64": "debug/elf",
- "elf.EM_ALPHA": "debug/elf",
- "elf.EM_ALPHA_STD": "debug/elf",
- "elf.EM_ARC": "debug/elf",
- "elf.EM_ARM": "debug/elf",
- "elf.EM_COLDFIRE": "debug/elf",
- "elf.EM_FR20": "debug/elf",
- "elf.EM_H8S": "debug/elf",
- "elf.EM_H8_300": "debug/elf",
- "elf.EM_H8_300H": "debug/elf",
- "elf.EM_H8_500": "debug/elf",
- "elf.EM_IA_64": "debug/elf",
- "elf.EM_M32": "debug/elf",
- "elf.EM_ME16": "debug/elf",
- "elf.EM_MIPS": "debug/elf",
- "elf.EM_MIPS_RS3_LE": "debug/elf",
- "elf.EM_MIPS_RS4_BE": "debug/elf",
- "elf.EM_MIPS_X": "debug/elf",
- "elf.EM_MMA": "debug/elf",
- "elf.EM_NCPU": "debug/elf",
- "elf.EM_NDR1": "debug/elf",
- "elf.EM_NONE": "debug/elf",
- "elf.EM_PARISC": "debug/elf",
- "elf.EM_PCP": "debug/elf",
- "elf.EM_PPC": "debug/elf",
- "elf.EM_PPC64": "debug/elf",
- "elf.EM_RCE": "debug/elf",
- "elf.EM_RH32": "debug/elf",
- "elf.EM_S370": "debug/elf",
- "elf.EM_S390": "debug/elf",
- "elf.EM_SH": "debug/elf",
- "elf.EM_SPARC": "debug/elf",
- "elf.EM_SPARC32PLUS": "debug/elf",
- "elf.EM_SPARCV9": "debug/elf",
- "elf.EM_ST100": "debug/elf",
- "elf.EM_STARCORE": "debug/elf",
- "elf.EM_TINYJ": "debug/elf",
- "elf.EM_TRICORE": "debug/elf",
- "elf.EM_V800": "debug/elf",
- "elf.EM_VPP500": "debug/elf",
- "elf.EM_X86_64": "debug/elf",
- "elf.ET_CORE": "debug/elf",
- "elf.ET_DYN": "debug/elf",
- "elf.ET_EXEC": "debug/elf",
- "elf.ET_HIOS": "debug/elf",
- "elf.ET_HIPROC": "debug/elf",
- "elf.ET_LOOS": "debug/elf",
- "elf.ET_LOPROC": "debug/elf",
- "elf.ET_NONE": "debug/elf",
- "elf.ET_REL": "debug/elf",
- "elf.EV_CURRENT": "debug/elf",
- "elf.EV_NONE": "debug/elf",
- "elf.ErrNoSymbols": "debug/elf",
- "elf.File": "debug/elf",
- "elf.FileHeader": "debug/elf",
- "elf.FormatError": "debug/elf",
- "elf.Header32": "debug/elf",
- "elf.Header64": "debug/elf",
- "elf.ImportedSymbol": "debug/elf",
- "elf.Machine": "debug/elf",
- "elf.NT_FPREGSET": "debug/elf",
- "elf.NT_PRPSINFO": "debug/elf",
- "elf.NT_PRSTATUS": "debug/elf",
- "elf.NType": "debug/elf",
- "elf.NewFile": "debug/elf",
- "elf.OSABI": "debug/elf",
- "elf.Open": "debug/elf",
- "elf.PF_MASKOS": "debug/elf",
- "elf.PF_MASKPROC": "debug/elf",
- "elf.PF_R": "debug/elf",
- "elf.PF_W": "debug/elf",
- "elf.PF_X": "debug/elf",
- "elf.PT_DYNAMIC": "debug/elf",
- "elf.PT_HIOS": "debug/elf",
- "elf.PT_HIPROC": "debug/elf",
- "elf.PT_INTERP": "debug/elf",
- "elf.PT_LOAD": "debug/elf",
- "elf.PT_LOOS": "debug/elf",
- "elf.PT_LOPROC": "debug/elf",
- "elf.PT_NOTE": "debug/elf",
- "elf.PT_NULL": "debug/elf",
- "elf.PT_PHDR": "debug/elf",
- "elf.PT_SHLIB": "debug/elf",
- "elf.PT_TLS": "debug/elf",
- "elf.Prog": "debug/elf",
- "elf.Prog32": "debug/elf",
- "elf.Prog64": "debug/elf",
- "elf.ProgFlag": "debug/elf",
- "elf.ProgHeader": "debug/elf",
- "elf.ProgType": "debug/elf",
- "elf.R_386": "debug/elf",
- "elf.R_386_32": "debug/elf",
- "elf.R_386_COPY": "debug/elf",
- "elf.R_386_GLOB_DAT": "debug/elf",
- "elf.R_386_GOT32": "debug/elf",
- "elf.R_386_GOTOFF": "debug/elf",
- "elf.R_386_GOTPC": "debug/elf",
- "elf.R_386_JMP_SLOT": "debug/elf",
- "elf.R_386_NONE": "debug/elf",
- "elf.R_386_PC32": "debug/elf",
- "elf.R_386_PLT32": "debug/elf",
- "elf.R_386_RELATIVE": "debug/elf",
- "elf.R_386_TLS_DTPMOD32": "debug/elf",
- "elf.R_386_TLS_DTPOFF32": "debug/elf",
- "elf.R_386_TLS_GD": "debug/elf",
- "elf.R_386_TLS_GD_32": "debug/elf",
- "elf.R_386_TLS_GD_CALL": "debug/elf",
- "elf.R_386_TLS_GD_POP": "debug/elf",
- "elf.R_386_TLS_GD_PUSH": "debug/elf",
- "elf.R_386_TLS_GOTIE": "debug/elf",
- "elf.R_386_TLS_IE": "debug/elf",
- "elf.R_386_TLS_IE_32": "debug/elf",
- "elf.R_386_TLS_LDM": "debug/elf",
- "elf.R_386_TLS_LDM_32": "debug/elf",
- "elf.R_386_TLS_LDM_CALL": "debug/elf",
- "elf.R_386_TLS_LDM_POP": "debug/elf",
- "elf.R_386_TLS_LDM_PUSH": "debug/elf",
- "elf.R_386_TLS_LDO_32": "debug/elf",
- "elf.R_386_TLS_LE": "debug/elf",
- "elf.R_386_TLS_LE_32": "debug/elf",
- "elf.R_386_TLS_TPOFF": "debug/elf",
- "elf.R_386_TLS_TPOFF32": "debug/elf",
- "elf.R_390": "debug/elf",
- "elf.R_390_12": "debug/elf",
- "elf.R_390_16": "debug/elf",
- "elf.R_390_20": "debug/elf",
- "elf.R_390_32": "debug/elf",
- "elf.R_390_64": "debug/elf",
- "elf.R_390_8": "debug/elf",
- "elf.R_390_COPY": "debug/elf",
- "elf.R_390_GLOB_DAT": "debug/elf",
- "elf.R_390_GOT12": "debug/elf",
- "elf.R_390_GOT16": "debug/elf",
- "elf.R_390_GOT20": "debug/elf",
- "elf.R_390_GOT32": "debug/elf",
- "elf.R_390_GOT64": "debug/elf",
- "elf.R_390_GOTENT": "debug/elf",
- "elf.R_390_GOTOFF": "debug/elf",
- "elf.R_390_GOTOFF16": "debug/elf",
- "elf.R_390_GOTOFF64": "debug/elf",
- "elf.R_390_GOTPC": "debug/elf",
- "elf.R_390_GOTPCDBL": "debug/elf",
- "elf.R_390_GOTPLT12": "debug/elf",
- "elf.R_390_GOTPLT16": "debug/elf",
- "elf.R_390_GOTPLT20": "debug/elf",
- "elf.R_390_GOTPLT32": "debug/elf",
- "elf.R_390_GOTPLT64": "debug/elf",
- "elf.R_390_GOTPLTENT": "debug/elf",
- "elf.R_390_GOTPLTOFF16": "debug/elf",
- "elf.R_390_GOTPLTOFF32": "debug/elf",
- "elf.R_390_GOTPLTOFF64": "debug/elf",
- "elf.R_390_JMP_SLOT": "debug/elf",
- "elf.R_390_NONE": "debug/elf",
- "elf.R_390_PC16": "debug/elf",
- "elf.R_390_PC16DBL": "debug/elf",
- "elf.R_390_PC32": "debug/elf",
- "elf.R_390_PC32DBL": "debug/elf",
- "elf.R_390_PC64": "debug/elf",
- "elf.R_390_PLT16DBL": "debug/elf",
- "elf.R_390_PLT32": "debug/elf",
- "elf.R_390_PLT32DBL": "debug/elf",
- "elf.R_390_PLT64": "debug/elf",
- "elf.R_390_RELATIVE": "debug/elf",
- "elf.R_390_TLS_DTPMOD": "debug/elf",
- "elf.R_390_TLS_DTPOFF": "debug/elf",
- "elf.R_390_TLS_GD32": "debug/elf",
- "elf.R_390_TLS_GD64": "debug/elf",
- "elf.R_390_TLS_GDCALL": "debug/elf",
- "elf.R_390_TLS_GOTIE12": "debug/elf",
- "elf.R_390_TLS_GOTIE20": "debug/elf",
- "elf.R_390_TLS_GOTIE32": "debug/elf",
- "elf.R_390_TLS_GOTIE64": "debug/elf",
- "elf.R_390_TLS_IE32": "debug/elf",
- "elf.R_390_TLS_IE64": "debug/elf",
- "elf.R_390_TLS_IEENT": "debug/elf",
- "elf.R_390_TLS_LDCALL": "debug/elf",
- "elf.R_390_TLS_LDM32": "debug/elf",
- "elf.R_390_TLS_LDM64": "debug/elf",
- "elf.R_390_TLS_LDO32": "debug/elf",
- "elf.R_390_TLS_LDO64": "debug/elf",
- "elf.R_390_TLS_LE32": "debug/elf",
- "elf.R_390_TLS_LE64": "debug/elf",
- "elf.R_390_TLS_LOAD": "debug/elf",
- "elf.R_390_TLS_TPOFF": "debug/elf",
- "elf.R_AARCH64": "debug/elf",
- "elf.R_AARCH64_ABS16": "debug/elf",
- "elf.R_AARCH64_ABS32": "debug/elf",
- "elf.R_AARCH64_ABS64": "debug/elf",
- "elf.R_AARCH64_ADD_ABS_LO12_NC": "debug/elf",
- "elf.R_AARCH64_ADR_GOT_PAGE": "debug/elf",
- "elf.R_AARCH64_ADR_PREL_LO21": "debug/elf",
- "elf.R_AARCH64_ADR_PREL_PG_HI21": "debug/elf",
- "elf.R_AARCH64_ADR_PREL_PG_HI21_NC": "debug/elf",
- "elf.R_AARCH64_CALL26": "debug/elf",
- "elf.R_AARCH64_CONDBR19": "debug/elf",
- "elf.R_AARCH64_COPY": "debug/elf",
- "elf.R_AARCH64_GLOB_DAT": "debug/elf",
- "elf.R_AARCH64_GOT_LD_PREL19": "debug/elf",
- "elf.R_AARCH64_IRELATIVE": "debug/elf",
- "elf.R_AARCH64_JUMP26": "debug/elf",
- "elf.R_AARCH64_JUMP_SLOT": "debug/elf",
- "elf.R_AARCH64_LD64_GOT_LO12_NC": "debug/elf",
- "elf.R_AARCH64_LDST128_ABS_LO12_NC": "debug/elf",
- "elf.R_AARCH64_LDST16_ABS_LO12_NC": "debug/elf",
- "elf.R_AARCH64_LDST32_ABS_LO12_NC": "debug/elf",
- "elf.R_AARCH64_LDST64_ABS_LO12_NC": "debug/elf",
- "elf.R_AARCH64_LDST8_ABS_LO12_NC": "debug/elf",
- "elf.R_AARCH64_LD_PREL_LO19": "debug/elf",
- "elf.R_AARCH64_MOVW_SABS_G0": "debug/elf",
- "elf.R_AARCH64_MOVW_SABS_G1": "debug/elf",
- "elf.R_AARCH64_MOVW_SABS_G2": "debug/elf",
- "elf.R_AARCH64_MOVW_UABS_G0": "debug/elf",
- "elf.R_AARCH64_MOVW_UABS_G0_NC": "debug/elf",
- "elf.R_AARCH64_MOVW_UABS_G1": "debug/elf",
- "elf.R_AARCH64_MOVW_UABS_G1_NC": "debug/elf",
- "elf.R_AARCH64_MOVW_UABS_G2": "debug/elf",
- "elf.R_AARCH64_MOVW_UABS_G2_NC": "debug/elf",
- "elf.R_AARCH64_MOVW_UABS_G3": "debug/elf",
- "elf.R_AARCH64_NONE": "debug/elf",
- "elf.R_AARCH64_NULL": "debug/elf",
- "elf.R_AARCH64_P32_ABS16": "debug/elf",
- "elf.R_AARCH64_P32_ABS32": "debug/elf",
- "elf.R_AARCH64_P32_ADD_ABS_LO12_NC": "debug/elf",
- "elf.R_AARCH64_P32_ADR_GOT_PAGE": "debug/elf",
- "elf.R_AARCH64_P32_ADR_PREL_LO21": "debug/elf",
- "elf.R_AARCH64_P32_ADR_PREL_PG_HI21": "debug/elf",
- "elf.R_AARCH64_P32_CALL26": "debug/elf",
- "elf.R_AARCH64_P32_CONDBR19": "debug/elf",
- "elf.R_AARCH64_P32_COPY": "debug/elf",
- "elf.R_AARCH64_P32_GLOB_DAT": "debug/elf",
- "elf.R_AARCH64_P32_GOT_LD_PREL19": "debug/elf",
- "elf.R_AARCH64_P32_IRELATIVE": "debug/elf",
- "elf.R_AARCH64_P32_JUMP26": "debug/elf",
- "elf.R_AARCH64_P32_JUMP_SLOT": "debug/elf",
- "elf.R_AARCH64_P32_LD32_GOT_LO12_NC": "debug/elf",
- "elf.R_AARCH64_P32_LDST128_ABS_LO12_NC": "debug/elf",
- "elf.R_AARCH64_P32_LDST16_ABS_LO12_NC": "debug/elf",
- "elf.R_AARCH64_P32_LDST32_ABS_LO12_NC": "debug/elf",
- "elf.R_AARCH64_P32_LDST64_ABS_LO12_NC": "debug/elf",
- "elf.R_AARCH64_P32_LDST8_ABS_LO12_NC": "debug/elf",
- "elf.R_AARCH64_P32_LD_PREL_LO19": "debug/elf",
- "elf.R_AARCH64_P32_MOVW_SABS_G0": "debug/elf",
- "elf.R_AARCH64_P32_MOVW_UABS_G0": "debug/elf",
- "elf.R_AARCH64_P32_MOVW_UABS_G0_NC": "debug/elf",
- "elf.R_AARCH64_P32_MOVW_UABS_G1": "debug/elf",
- "elf.R_AARCH64_P32_PREL16": "debug/elf",
- "elf.R_AARCH64_P32_PREL32": "debug/elf",
- "elf.R_AARCH64_P32_RELATIVE": "debug/elf",
- "elf.R_AARCH64_P32_TLSDESC": "debug/elf",
- "elf.R_AARCH64_P32_TLSDESC_ADD_LO12_NC": "debug/elf",
- "elf.R_AARCH64_P32_TLSDESC_ADR_PAGE21": "debug/elf",
- "elf.R_AARCH64_P32_TLSDESC_ADR_PREL21": "debug/elf",
- "elf.R_AARCH64_P32_TLSDESC_CALL": "debug/elf",
- "elf.R_AARCH64_P32_TLSDESC_LD32_LO12_NC": "debug/elf",
- "elf.R_AARCH64_P32_TLSDESC_LD_PREL19": "debug/elf",
- "elf.R_AARCH64_P32_TLSGD_ADD_LO12_NC": "debug/elf",
- "elf.R_AARCH64_P32_TLSGD_ADR_PAGE21": "debug/elf",
- "elf.R_AARCH64_P32_TLSIE_ADR_GOTTPREL_PAGE21": "debug/elf",
- "elf.R_AARCH64_P32_TLSIE_LD32_GOTTPREL_LO12_NC": "debug/elf",
- "elf.R_AARCH64_P32_TLSIE_LD_GOTTPREL_PREL19": "debug/elf",
- "elf.R_AARCH64_P32_TLSLE_ADD_TPREL_HI12": "debug/elf",
- "elf.R_AARCH64_P32_TLSLE_ADD_TPREL_LO12": "debug/elf",
- "elf.R_AARCH64_P32_TLSLE_ADD_TPREL_LO12_NC": "debug/elf",
- "elf.R_AARCH64_P32_TLSLE_MOVW_TPREL_G0": "debug/elf",
- "elf.R_AARCH64_P32_TLSLE_MOVW_TPREL_G0_NC": "debug/elf",
- "elf.R_AARCH64_P32_TLSLE_MOVW_TPREL_G1": "debug/elf",
- "elf.R_AARCH64_P32_TLS_DTPMOD": "debug/elf",
- "elf.R_AARCH64_P32_TLS_DTPREL": "debug/elf",
- "elf.R_AARCH64_P32_TLS_TPREL": "debug/elf",
- "elf.R_AARCH64_P32_TSTBR14": "debug/elf",
- "elf.R_AARCH64_PREL16": "debug/elf",
- "elf.R_AARCH64_PREL32": "debug/elf",
- "elf.R_AARCH64_PREL64": "debug/elf",
- "elf.R_AARCH64_RELATIVE": "debug/elf",
- "elf.R_AARCH64_TLSDESC": "debug/elf",
- "elf.R_AARCH64_TLSDESC_ADD": "debug/elf",
- "elf.R_AARCH64_TLSDESC_ADD_LO12_NC": "debug/elf",
- "elf.R_AARCH64_TLSDESC_ADR_PAGE21": "debug/elf",
- "elf.R_AARCH64_TLSDESC_ADR_PREL21": "debug/elf",
- "elf.R_AARCH64_TLSDESC_CALL": "debug/elf",
- "elf.R_AARCH64_TLSDESC_LD64_LO12_NC": "debug/elf",
- "elf.R_AARCH64_TLSDESC_LDR": "debug/elf",
- "elf.R_AARCH64_TLSDESC_LD_PREL19": "debug/elf",
- "elf.R_AARCH64_TLSDESC_OFF_G0_NC": "debug/elf",
- "elf.R_AARCH64_TLSDESC_OFF_G1": "debug/elf",
- "elf.R_AARCH64_TLSGD_ADD_LO12_NC": "debug/elf",
- "elf.R_AARCH64_TLSGD_ADR_PAGE21": "debug/elf",
- "elf.R_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21": "debug/elf",
- "elf.R_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC": "debug/elf",
- "elf.R_AARCH64_TLSIE_LD_GOTTPREL_PREL19": "debug/elf",
- "elf.R_AARCH64_TLSIE_MOVW_GOTTPREL_G0_NC": "debug/elf",
- "elf.R_AARCH64_TLSIE_MOVW_GOTTPREL_G1": "debug/elf",
- "elf.R_AARCH64_TLSLE_ADD_TPREL_HI12": "debug/elf",
- "elf.R_AARCH64_TLSLE_ADD_TPREL_LO12": "debug/elf",
- "elf.R_AARCH64_TLSLE_ADD_TPREL_LO12_NC": "debug/elf",
- "elf.R_AARCH64_TLSLE_MOVW_TPREL_G0": "debug/elf",
- "elf.R_AARCH64_TLSLE_MOVW_TPREL_G0_NC": "debug/elf",
- "elf.R_AARCH64_TLSLE_MOVW_TPREL_G1": "debug/elf",
- "elf.R_AARCH64_TLSLE_MOVW_TPREL_G1_NC": "debug/elf",
- "elf.R_AARCH64_TLSLE_MOVW_TPREL_G2": "debug/elf",
- "elf.R_AARCH64_TLS_DTPMOD64": "debug/elf",
- "elf.R_AARCH64_TLS_DTPREL64": "debug/elf",
- "elf.R_AARCH64_TLS_TPREL64": "debug/elf",
- "elf.R_AARCH64_TSTBR14": "debug/elf",
- "elf.R_ALPHA": "debug/elf",
- "elf.R_ALPHA_BRADDR": "debug/elf",
- "elf.R_ALPHA_COPY": "debug/elf",
- "elf.R_ALPHA_GLOB_DAT": "debug/elf",
- "elf.R_ALPHA_GPDISP": "debug/elf",
- "elf.R_ALPHA_GPREL32": "debug/elf",
- "elf.R_ALPHA_GPRELHIGH": "debug/elf",
- "elf.R_ALPHA_GPRELLOW": "debug/elf",
- "elf.R_ALPHA_GPVALUE": "debug/elf",
- "elf.R_ALPHA_HINT": "debug/elf",
- "elf.R_ALPHA_IMMED_BR_HI32": "debug/elf",
- "elf.R_ALPHA_IMMED_GP_16": "debug/elf",
- "elf.R_ALPHA_IMMED_GP_HI32": "debug/elf",
- "elf.R_ALPHA_IMMED_LO32": "debug/elf",
- "elf.R_ALPHA_IMMED_SCN_HI32": "debug/elf",
- "elf.R_ALPHA_JMP_SLOT": "debug/elf",
- "elf.R_ALPHA_LITERAL": "debug/elf",
- "elf.R_ALPHA_LITUSE": "debug/elf",
- "elf.R_ALPHA_NONE": "debug/elf",
- "elf.R_ALPHA_OP_PRSHIFT": "debug/elf",
- "elf.R_ALPHA_OP_PSUB": "debug/elf",
- "elf.R_ALPHA_OP_PUSH": "debug/elf",
- "elf.R_ALPHA_OP_STORE": "debug/elf",
- "elf.R_ALPHA_REFLONG": "debug/elf",
- "elf.R_ALPHA_REFQUAD": "debug/elf",
- "elf.R_ALPHA_RELATIVE": "debug/elf",
- "elf.R_ALPHA_SREL16": "debug/elf",
- "elf.R_ALPHA_SREL32": "debug/elf",
- "elf.R_ALPHA_SREL64": "debug/elf",
- "elf.R_ARM": "debug/elf",
- "elf.R_ARM_ABS12": "debug/elf",
- "elf.R_ARM_ABS16": "debug/elf",
- "elf.R_ARM_ABS32": "debug/elf",
- "elf.R_ARM_ABS8": "debug/elf",
- "elf.R_ARM_AMP_VCALL9": "debug/elf",
- "elf.R_ARM_COPY": "debug/elf",
- "elf.R_ARM_GLOB_DAT": "debug/elf",
- "elf.R_ARM_GNU_VTENTRY": "debug/elf",
- "elf.R_ARM_GNU_VTINHERIT": "debug/elf",
- "elf.R_ARM_GOT32": "debug/elf",
- "elf.R_ARM_GOTOFF": "debug/elf",
- "elf.R_ARM_GOTPC": "debug/elf",
- "elf.R_ARM_JUMP_SLOT": "debug/elf",
- "elf.R_ARM_NONE": "debug/elf",
- "elf.R_ARM_PC13": "debug/elf",
- "elf.R_ARM_PC24": "debug/elf",
- "elf.R_ARM_PLT32": "debug/elf",
- "elf.R_ARM_RABS32": "debug/elf",
- "elf.R_ARM_RBASE": "debug/elf",
- "elf.R_ARM_REL32": "debug/elf",
- "elf.R_ARM_RELATIVE": "debug/elf",
- "elf.R_ARM_RPC24": "debug/elf",
- "elf.R_ARM_RREL32": "debug/elf",
- "elf.R_ARM_RSBREL32": "debug/elf",
- "elf.R_ARM_SBREL32": "debug/elf",
- "elf.R_ARM_SWI24": "debug/elf",
- "elf.R_ARM_THM_ABS5": "debug/elf",
- "elf.R_ARM_THM_PC22": "debug/elf",
- "elf.R_ARM_THM_PC8": "debug/elf",
- "elf.R_ARM_THM_RPC22": "debug/elf",
- "elf.R_ARM_THM_SWI8": "debug/elf",
- "elf.R_ARM_THM_XPC22": "debug/elf",
- "elf.R_ARM_XPC25": "debug/elf",
- "elf.R_INFO": "debug/elf",
- "elf.R_INFO32": "debug/elf",
- "elf.R_MIPS": "debug/elf",
- "elf.R_MIPS_16": "debug/elf",
- "elf.R_MIPS_26": "debug/elf",
- "elf.R_MIPS_32": "debug/elf",
- "elf.R_MIPS_64": "debug/elf",
- "elf.R_MIPS_ADD_IMMEDIATE": "debug/elf",
- "elf.R_MIPS_CALL16": "debug/elf",
- "elf.R_MIPS_CALL_HI16": "debug/elf",
- "elf.R_MIPS_CALL_LO16": "debug/elf",
- "elf.R_MIPS_DELETE": "debug/elf",
- "elf.R_MIPS_GOT16": "debug/elf",
- "elf.R_MIPS_GOT_DISP": "debug/elf",
- "elf.R_MIPS_GOT_HI16": "debug/elf",
- "elf.R_MIPS_GOT_LO16": "debug/elf",
- "elf.R_MIPS_GOT_OFST": "debug/elf",
- "elf.R_MIPS_GOT_PAGE": "debug/elf",
- "elf.R_MIPS_GPREL16": "debug/elf",
- "elf.R_MIPS_GPREL32": "debug/elf",
- "elf.R_MIPS_HI16": "debug/elf",
- "elf.R_MIPS_HIGHER": "debug/elf",
- "elf.R_MIPS_HIGHEST": "debug/elf",
- "elf.R_MIPS_INSERT_A": "debug/elf",
- "elf.R_MIPS_INSERT_B": "debug/elf",
- "elf.R_MIPS_JALR": "debug/elf",
- "elf.R_MIPS_LITERAL": "debug/elf",
- "elf.R_MIPS_LO16": "debug/elf",
- "elf.R_MIPS_NONE": "debug/elf",
- "elf.R_MIPS_PC16": "debug/elf",
- "elf.R_MIPS_PJUMP": "debug/elf",
- "elf.R_MIPS_REL16": "debug/elf",
- "elf.R_MIPS_REL32": "debug/elf",
- "elf.R_MIPS_RELGOT": "debug/elf",
- "elf.R_MIPS_SCN_DISP": "debug/elf",
- "elf.R_MIPS_SHIFT5": "debug/elf",
- "elf.R_MIPS_SHIFT6": "debug/elf",
- "elf.R_MIPS_SUB": "debug/elf",
- "elf.R_MIPS_TLS_DTPMOD32": "debug/elf",
- "elf.R_MIPS_TLS_DTPMOD64": "debug/elf",
- "elf.R_MIPS_TLS_DTPREL32": "debug/elf",
- "elf.R_MIPS_TLS_DTPREL64": "debug/elf",
- "elf.R_MIPS_TLS_DTPREL_HI16": "debug/elf",
- "elf.R_MIPS_TLS_DTPREL_LO16": "debug/elf",
- "elf.R_MIPS_TLS_GD": "debug/elf",
- "elf.R_MIPS_TLS_GOTTPREL": "debug/elf",
- "elf.R_MIPS_TLS_LDM": "debug/elf",
- "elf.R_MIPS_TLS_TPREL32": "debug/elf",
- "elf.R_MIPS_TLS_TPREL64": "debug/elf",
- "elf.R_MIPS_TLS_TPREL_HI16": "debug/elf",
- "elf.R_MIPS_TLS_TPREL_LO16": "debug/elf",
- "elf.R_PPC": "debug/elf",
- "elf.R_PPC64": "debug/elf",
- "elf.R_PPC64_ADDR14": "debug/elf",
- "elf.R_PPC64_ADDR14_BRNTAKEN": "debug/elf",
- "elf.R_PPC64_ADDR14_BRTAKEN": "debug/elf",
- "elf.R_PPC64_ADDR16": "debug/elf",
- "elf.R_PPC64_ADDR16_DS": "debug/elf",
- "elf.R_PPC64_ADDR16_HA": "debug/elf",
- "elf.R_PPC64_ADDR16_HI": "debug/elf",
- "elf.R_PPC64_ADDR16_HIGHER": "debug/elf",
- "elf.R_PPC64_ADDR16_HIGHERA": "debug/elf",
- "elf.R_PPC64_ADDR16_HIGHEST": "debug/elf",
- "elf.R_PPC64_ADDR16_HIGHESTA": "debug/elf",
- "elf.R_PPC64_ADDR16_LO": "debug/elf",
- "elf.R_PPC64_ADDR16_LO_DS": "debug/elf",
- "elf.R_PPC64_ADDR24": "debug/elf",
- "elf.R_PPC64_ADDR32": "debug/elf",
- "elf.R_PPC64_ADDR64": "debug/elf",
- "elf.R_PPC64_DTPMOD64": "debug/elf",
- "elf.R_PPC64_DTPREL16": "debug/elf",
- "elf.R_PPC64_DTPREL16_DS": "debug/elf",
- "elf.R_PPC64_DTPREL16_HA": "debug/elf",
- "elf.R_PPC64_DTPREL16_HI": "debug/elf",
- "elf.R_PPC64_DTPREL16_HIGHER": "debug/elf",
- "elf.R_PPC64_DTPREL16_HIGHERA": "debug/elf",
- "elf.R_PPC64_DTPREL16_HIGHEST": "debug/elf",
- "elf.R_PPC64_DTPREL16_HIGHESTA": "debug/elf",
- "elf.R_PPC64_DTPREL16_LO": "debug/elf",
- "elf.R_PPC64_DTPREL16_LO_DS": "debug/elf",
- "elf.R_PPC64_DTPREL64": "debug/elf",
- "elf.R_PPC64_GOT16": "debug/elf",
- "elf.R_PPC64_GOT16_DS": "debug/elf",
- "elf.R_PPC64_GOT16_HA": "debug/elf",
- "elf.R_PPC64_GOT16_HI": "debug/elf",
- "elf.R_PPC64_GOT16_LO": "debug/elf",
- "elf.R_PPC64_GOT16_LO_DS": "debug/elf",
- "elf.R_PPC64_GOT_DTPREL16_DS": "debug/elf",
- "elf.R_PPC64_GOT_DTPREL16_HA": "debug/elf",
- "elf.R_PPC64_GOT_DTPREL16_HI": "debug/elf",
- "elf.R_PPC64_GOT_DTPREL16_LO_DS": "debug/elf",
- "elf.R_PPC64_GOT_TLSGD16": "debug/elf",
- "elf.R_PPC64_GOT_TLSGD16_HA": "debug/elf",
- "elf.R_PPC64_GOT_TLSGD16_HI": "debug/elf",
- "elf.R_PPC64_GOT_TLSGD16_LO": "debug/elf",
- "elf.R_PPC64_GOT_TLSLD16": "debug/elf",
- "elf.R_PPC64_GOT_TLSLD16_HA": "debug/elf",
- "elf.R_PPC64_GOT_TLSLD16_HI": "debug/elf",
- "elf.R_PPC64_GOT_TLSLD16_LO": "debug/elf",
- "elf.R_PPC64_GOT_TPREL16_DS": "debug/elf",
- "elf.R_PPC64_GOT_TPREL16_HA": "debug/elf",
- "elf.R_PPC64_GOT_TPREL16_HI": "debug/elf",
- "elf.R_PPC64_GOT_TPREL16_LO_DS": "debug/elf",
- "elf.R_PPC64_JMP_SLOT": "debug/elf",
- "elf.R_PPC64_NONE": "debug/elf",
- "elf.R_PPC64_REL14": "debug/elf",
- "elf.R_PPC64_REL14_BRNTAKEN": "debug/elf",
- "elf.R_PPC64_REL14_BRTAKEN": "debug/elf",
- "elf.R_PPC64_REL16": "debug/elf",
- "elf.R_PPC64_REL16_HA": "debug/elf",
- "elf.R_PPC64_REL16_HI": "debug/elf",
- "elf.R_PPC64_REL16_LO": "debug/elf",
- "elf.R_PPC64_REL24": "debug/elf",
- "elf.R_PPC64_REL32": "debug/elf",
- "elf.R_PPC64_REL64": "debug/elf",
- "elf.R_PPC64_TLS": "debug/elf",
- "elf.R_PPC64_TLSGD": "debug/elf",
- "elf.R_PPC64_TLSLD": "debug/elf",
- "elf.R_PPC64_TOC": "debug/elf",
- "elf.R_PPC64_TOC16": "debug/elf",
- "elf.R_PPC64_TOC16_DS": "debug/elf",
- "elf.R_PPC64_TOC16_HA": "debug/elf",
- "elf.R_PPC64_TOC16_HI": "debug/elf",
- "elf.R_PPC64_TOC16_LO": "debug/elf",
- "elf.R_PPC64_TOC16_LO_DS": "debug/elf",
- "elf.R_PPC64_TPREL16": "debug/elf",
- "elf.R_PPC64_TPREL16_DS": "debug/elf",
- "elf.R_PPC64_TPREL16_HA": "debug/elf",
- "elf.R_PPC64_TPREL16_HI": "debug/elf",
- "elf.R_PPC64_TPREL16_HIGHER": "debug/elf",
- "elf.R_PPC64_TPREL16_HIGHERA": "debug/elf",
- "elf.R_PPC64_TPREL16_HIGHEST": "debug/elf",
- "elf.R_PPC64_TPREL16_HIGHESTA": "debug/elf",
- "elf.R_PPC64_TPREL16_LO": "debug/elf",
- "elf.R_PPC64_TPREL16_LO_DS": "debug/elf",
- "elf.R_PPC64_TPREL64": "debug/elf",
- "elf.R_PPC_ADDR14": "debug/elf",
- "elf.R_PPC_ADDR14_BRNTAKEN": "debug/elf",
- "elf.R_PPC_ADDR14_BRTAKEN": "debug/elf",
- "elf.R_PPC_ADDR16": "debug/elf",
- "elf.R_PPC_ADDR16_HA": "debug/elf",
- "elf.R_PPC_ADDR16_HI": "debug/elf",
- "elf.R_PPC_ADDR16_LO": "debug/elf",
- "elf.R_PPC_ADDR24": "debug/elf",
- "elf.R_PPC_ADDR32": "debug/elf",
- "elf.R_PPC_COPY": "debug/elf",
- "elf.R_PPC_DTPMOD32": "debug/elf",
- "elf.R_PPC_DTPREL16": "debug/elf",
- "elf.R_PPC_DTPREL16_HA": "debug/elf",
- "elf.R_PPC_DTPREL16_HI": "debug/elf",
- "elf.R_PPC_DTPREL16_LO": "debug/elf",
- "elf.R_PPC_DTPREL32": "debug/elf",
- "elf.R_PPC_EMB_BIT_FLD": "debug/elf",
- "elf.R_PPC_EMB_MRKREF": "debug/elf",
- "elf.R_PPC_EMB_NADDR16": "debug/elf",
- "elf.R_PPC_EMB_NADDR16_HA": "debug/elf",
- "elf.R_PPC_EMB_NADDR16_HI": "debug/elf",
- "elf.R_PPC_EMB_NADDR16_LO": "debug/elf",
- "elf.R_PPC_EMB_NADDR32": "debug/elf",
- "elf.R_PPC_EMB_RELSDA": "debug/elf",
- "elf.R_PPC_EMB_RELSEC16": "debug/elf",
- "elf.R_PPC_EMB_RELST_HA": "debug/elf",
- "elf.R_PPC_EMB_RELST_HI": "debug/elf",
- "elf.R_PPC_EMB_RELST_LO": "debug/elf",
- "elf.R_PPC_EMB_SDA21": "debug/elf",
- "elf.R_PPC_EMB_SDA2I16": "debug/elf",
- "elf.R_PPC_EMB_SDA2REL": "debug/elf",
- "elf.R_PPC_EMB_SDAI16": "debug/elf",
- "elf.R_PPC_GLOB_DAT": "debug/elf",
- "elf.R_PPC_GOT16": "debug/elf",
- "elf.R_PPC_GOT16_HA": "debug/elf",
- "elf.R_PPC_GOT16_HI": "debug/elf",
- "elf.R_PPC_GOT16_LO": "debug/elf",
- "elf.R_PPC_GOT_TLSGD16": "debug/elf",
- "elf.R_PPC_GOT_TLSGD16_HA": "debug/elf",
- "elf.R_PPC_GOT_TLSGD16_HI": "debug/elf",
- "elf.R_PPC_GOT_TLSGD16_LO": "debug/elf",
- "elf.R_PPC_GOT_TLSLD16": "debug/elf",
- "elf.R_PPC_GOT_TLSLD16_HA": "debug/elf",
- "elf.R_PPC_GOT_TLSLD16_HI": "debug/elf",
- "elf.R_PPC_GOT_TLSLD16_LO": "debug/elf",
- "elf.R_PPC_GOT_TPREL16": "debug/elf",
- "elf.R_PPC_GOT_TPREL16_HA": "debug/elf",
- "elf.R_PPC_GOT_TPREL16_HI": "debug/elf",
- "elf.R_PPC_GOT_TPREL16_LO": "debug/elf",
- "elf.R_PPC_JMP_SLOT": "debug/elf",
- "elf.R_PPC_LOCAL24PC": "debug/elf",
- "elf.R_PPC_NONE": "debug/elf",
- "elf.R_PPC_PLT16_HA": "debug/elf",
- "elf.R_PPC_PLT16_HI": "debug/elf",
- "elf.R_PPC_PLT16_LO": "debug/elf",
- "elf.R_PPC_PLT32": "debug/elf",
- "elf.R_PPC_PLTREL24": "debug/elf",
- "elf.R_PPC_PLTREL32": "debug/elf",
- "elf.R_PPC_REL14": "debug/elf",
- "elf.R_PPC_REL14_BRNTAKEN": "debug/elf",
- "elf.R_PPC_REL14_BRTAKEN": "debug/elf",
- "elf.R_PPC_REL24": "debug/elf",
- "elf.R_PPC_REL32": "debug/elf",
- "elf.R_PPC_RELATIVE": "debug/elf",
- "elf.R_PPC_SDAREL16": "debug/elf",
- "elf.R_PPC_SECTOFF": "debug/elf",
- "elf.R_PPC_SECTOFF_HA": "debug/elf",
- "elf.R_PPC_SECTOFF_HI": "debug/elf",
- "elf.R_PPC_SECTOFF_LO": "debug/elf",
- "elf.R_PPC_TLS": "debug/elf",
- "elf.R_PPC_TPREL16": "debug/elf",
- "elf.R_PPC_TPREL16_HA": "debug/elf",
- "elf.R_PPC_TPREL16_HI": "debug/elf",
- "elf.R_PPC_TPREL16_LO": "debug/elf",
- "elf.R_PPC_TPREL32": "debug/elf",
- "elf.R_PPC_UADDR16": "debug/elf",
- "elf.R_PPC_UADDR32": "debug/elf",
- "elf.R_SPARC": "debug/elf",
- "elf.R_SPARC_10": "debug/elf",
- "elf.R_SPARC_11": "debug/elf",
- "elf.R_SPARC_13": "debug/elf",
- "elf.R_SPARC_16": "debug/elf",
- "elf.R_SPARC_22": "debug/elf",
- "elf.R_SPARC_32": "debug/elf",
- "elf.R_SPARC_5": "debug/elf",
- "elf.R_SPARC_6": "debug/elf",
- "elf.R_SPARC_64": "debug/elf",
- "elf.R_SPARC_7": "debug/elf",
- "elf.R_SPARC_8": "debug/elf",
- "elf.R_SPARC_COPY": "debug/elf",
- "elf.R_SPARC_DISP16": "debug/elf",
- "elf.R_SPARC_DISP32": "debug/elf",
- "elf.R_SPARC_DISP64": "debug/elf",
- "elf.R_SPARC_DISP8": "debug/elf",
- "elf.R_SPARC_GLOB_DAT": "debug/elf",
- "elf.R_SPARC_GLOB_JMP": "debug/elf",
- "elf.R_SPARC_GOT10": "debug/elf",
- "elf.R_SPARC_GOT13": "debug/elf",
- "elf.R_SPARC_GOT22": "debug/elf",
- "elf.R_SPARC_H44": "debug/elf",
- "elf.R_SPARC_HH22": "debug/elf",
- "elf.R_SPARC_HI22": "debug/elf",
- "elf.R_SPARC_HIPLT22": "debug/elf",
- "elf.R_SPARC_HIX22": "debug/elf",
- "elf.R_SPARC_HM10": "debug/elf",
- "elf.R_SPARC_JMP_SLOT": "debug/elf",
- "elf.R_SPARC_L44": "debug/elf",
- "elf.R_SPARC_LM22": "debug/elf",
- "elf.R_SPARC_LO10": "debug/elf",
- "elf.R_SPARC_LOPLT10": "debug/elf",
- "elf.R_SPARC_LOX10": "debug/elf",
- "elf.R_SPARC_M44": "debug/elf",
- "elf.R_SPARC_NONE": "debug/elf",
- "elf.R_SPARC_OLO10": "debug/elf",
- "elf.R_SPARC_PC10": "debug/elf",
- "elf.R_SPARC_PC22": "debug/elf",
- "elf.R_SPARC_PCPLT10": "debug/elf",
- "elf.R_SPARC_PCPLT22": "debug/elf",
- "elf.R_SPARC_PCPLT32": "debug/elf",
- "elf.R_SPARC_PC_HH22": "debug/elf",
- "elf.R_SPARC_PC_HM10": "debug/elf",
- "elf.R_SPARC_PC_LM22": "debug/elf",
- "elf.R_SPARC_PLT32": "debug/elf",
- "elf.R_SPARC_PLT64": "debug/elf",
- "elf.R_SPARC_REGISTER": "debug/elf",
- "elf.R_SPARC_RELATIVE": "debug/elf",
- "elf.R_SPARC_UA16": "debug/elf",
- "elf.R_SPARC_UA32": "debug/elf",
- "elf.R_SPARC_UA64": "debug/elf",
- "elf.R_SPARC_WDISP16": "debug/elf",
- "elf.R_SPARC_WDISP19": "debug/elf",
- "elf.R_SPARC_WDISP22": "debug/elf",
- "elf.R_SPARC_WDISP30": "debug/elf",
- "elf.R_SPARC_WPLT30": "debug/elf",
- "elf.R_SYM32": "debug/elf",
- "elf.R_SYM64": "debug/elf",
- "elf.R_TYPE32": "debug/elf",
- "elf.R_TYPE64": "debug/elf",
- "elf.R_X86_64": "debug/elf",
- "elf.R_X86_64_16": "debug/elf",
- "elf.R_X86_64_32": "debug/elf",
- "elf.R_X86_64_32S": "debug/elf",
- "elf.R_X86_64_64": "debug/elf",
- "elf.R_X86_64_8": "debug/elf",
- "elf.R_X86_64_COPY": "debug/elf",
- "elf.R_X86_64_DTPMOD64": "debug/elf",
- "elf.R_X86_64_DTPOFF32": "debug/elf",
- "elf.R_X86_64_DTPOFF64": "debug/elf",
- "elf.R_X86_64_GLOB_DAT": "debug/elf",
- "elf.R_X86_64_GOT32": "debug/elf",
- "elf.R_X86_64_GOTPCREL": "debug/elf",
- "elf.R_X86_64_GOTTPOFF": "debug/elf",
- "elf.R_X86_64_JMP_SLOT": "debug/elf",
- "elf.R_X86_64_NONE": "debug/elf",
- "elf.R_X86_64_PC16": "debug/elf",
- "elf.R_X86_64_PC32": "debug/elf",
- "elf.R_X86_64_PC8": "debug/elf",
- "elf.R_X86_64_PLT32": "debug/elf",
- "elf.R_X86_64_RELATIVE": "debug/elf",
- "elf.R_X86_64_TLSGD": "debug/elf",
- "elf.R_X86_64_TLSLD": "debug/elf",
- "elf.R_X86_64_TPOFF32": "debug/elf",
- "elf.R_X86_64_TPOFF64": "debug/elf",
- "elf.Rel32": "debug/elf",
- "elf.Rel64": "debug/elf",
- "elf.Rela32": "debug/elf",
- "elf.Rela64": "debug/elf",
- "elf.SHF_ALLOC": "debug/elf",
- "elf.SHF_COMPRESSED": "debug/elf",
- "elf.SHF_EXECINSTR": "debug/elf",
- "elf.SHF_GROUP": "debug/elf",
- "elf.SHF_INFO_LINK": "debug/elf",
- "elf.SHF_LINK_ORDER": "debug/elf",
- "elf.SHF_MASKOS": "debug/elf",
- "elf.SHF_MASKPROC": "debug/elf",
- "elf.SHF_MERGE": "debug/elf",
- "elf.SHF_OS_NONCONFORMING": "debug/elf",
- "elf.SHF_STRINGS": "debug/elf",
- "elf.SHF_TLS": "debug/elf",
- "elf.SHF_WRITE": "debug/elf",
- "elf.SHN_ABS": "debug/elf",
- "elf.SHN_COMMON": "debug/elf",
- "elf.SHN_HIOS": "debug/elf",
- "elf.SHN_HIPROC": "debug/elf",
- "elf.SHN_HIRESERVE": "debug/elf",
- "elf.SHN_LOOS": "debug/elf",
- "elf.SHN_LOPROC": "debug/elf",
- "elf.SHN_LORESERVE": "debug/elf",
- "elf.SHN_UNDEF": "debug/elf",
- "elf.SHN_XINDEX": "debug/elf",
- "elf.SHT_DYNAMIC": "debug/elf",
- "elf.SHT_DYNSYM": "debug/elf",
- "elf.SHT_FINI_ARRAY": "debug/elf",
- "elf.SHT_GNU_ATTRIBUTES": "debug/elf",
- "elf.SHT_GNU_HASH": "debug/elf",
- "elf.SHT_GNU_LIBLIST": "debug/elf",
- "elf.SHT_GNU_VERDEF": "debug/elf",
- "elf.SHT_GNU_VERNEED": "debug/elf",
- "elf.SHT_GNU_VERSYM": "debug/elf",
- "elf.SHT_GROUP": "debug/elf",
- "elf.SHT_HASH": "debug/elf",
- "elf.SHT_HIOS": "debug/elf",
- "elf.SHT_HIPROC": "debug/elf",
- "elf.SHT_HIUSER": "debug/elf",
- "elf.SHT_INIT_ARRAY": "debug/elf",
- "elf.SHT_LOOS": "debug/elf",
- "elf.SHT_LOPROC": "debug/elf",
- "elf.SHT_LOUSER": "debug/elf",
- "elf.SHT_NOBITS": "debug/elf",
- "elf.SHT_NOTE": "debug/elf",
- "elf.SHT_NULL": "debug/elf",
- "elf.SHT_PREINIT_ARRAY": "debug/elf",
- "elf.SHT_PROGBITS": "debug/elf",
- "elf.SHT_REL": "debug/elf",
- "elf.SHT_RELA": "debug/elf",
- "elf.SHT_SHLIB": "debug/elf",
- "elf.SHT_STRTAB": "debug/elf",
- "elf.SHT_SYMTAB": "debug/elf",
- "elf.SHT_SYMTAB_SHNDX": "debug/elf",
- "elf.STB_GLOBAL": "debug/elf",
- "elf.STB_HIOS": "debug/elf",
- "elf.STB_HIPROC": "debug/elf",
- "elf.STB_LOCAL": "debug/elf",
- "elf.STB_LOOS": "debug/elf",
- "elf.STB_LOPROC": "debug/elf",
- "elf.STB_WEAK": "debug/elf",
- "elf.STT_COMMON": "debug/elf",
- "elf.STT_FILE": "debug/elf",
- "elf.STT_FUNC": "debug/elf",
- "elf.STT_HIOS": "debug/elf",
- "elf.STT_HIPROC": "debug/elf",
- "elf.STT_LOOS": "debug/elf",
- "elf.STT_LOPROC": "debug/elf",
- "elf.STT_NOTYPE": "debug/elf",
- "elf.STT_OBJECT": "debug/elf",
- "elf.STT_SECTION": "debug/elf",
- "elf.STT_TLS": "debug/elf",
- "elf.STV_DEFAULT": "debug/elf",
- "elf.STV_HIDDEN": "debug/elf",
- "elf.STV_INTERNAL": "debug/elf",
- "elf.STV_PROTECTED": "debug/elf",
- "elf.ST_BIND": "debug/elf",
- "elf.ST_INFO": "debug/elf",
- "elf.ST_TYPE": "debug/elf",
- "elf.ST_VISIBILITY": "debug/elf",
- "elf.Section": "debug/elf",
- "elf.Section32": "debug/elf",
- "elf.Section64": "debug/elf",
- "elf.SectionFlag": "debug/elf",
- "elf.SectionHeader": "debug/elf",
- "elf.SectionIndex": "debug/elf",
- "elf.SectionType": "debug/elf",
- "elf.Sym32": "debug/elf",
- "elf.Sym32Size": "debug/elf",
- "elf.Sym64": "debug/elf",
- "elf.Sym64Size": "debug/elf",
- "elf.SymBind": "debug/elf",
- "elf.SymType": "debug/elf",
- "elf.SymVis": "debug/elf",
- "elf.Symbol": "debug/elf",
- "elf.Type": "debug/elf",
- "elf.Version": "debug/elf",
- "elliptic.Curve": "crypto/elliptic",
- "elliptic.CurveParams": "crypto/elliptic",
- "elliptic.GenerateKey": "crypto/elliptic",
- "elliptic.Marshal": "crypto/elliptic",
- "elliptic.P224": "crypto/elliptic",
- "elliptic.P256": "crypto/elliptic",
- "elliptic.P384": "crypto/elliptic",
- "elliptic.P521": "crypto/elliptic",
- "elliptic.Unmarshal": "crypto/elliptic",
- "encoding.BinaryMarshaler": "encoding",
- "encoding.BinaryUnmarshaler": "encoding",
- "encoding.TextMarshaler": "encoding",
- "encoding.TextUnmarshaler": "encoding",
- "errors.New": "errors",
- "exec.Cmd": "os/exec",
- "exec.Command": "os/exec",
- "exec.CommandContext": "os/exec",
- "exec.ErrNotFound": "os/exec",
- "exec.Error": "os/exec",
- "exec.ExitError": "os/exec",
- "exec.LookPath": "os/exec",
- "expvar.Do": "expvar",
- "expvar.Float": "expvar",
- "expvar.Func": "expvar",
- "expvar.Get": "expvar",
- "expvar.Handler": "expvar",
- "expvar.Int": "expvar",
- "expvar.KeyValue": "expvar",
- "expvar.Map": "expvar",
- "expvar.NewFloat": "expvar",
- "expvar.NewInt": "expvar",
- "expvar.NewMap": "expvar",
- "expvar.NewString": "expvar",
- "expvar.Publish": "expvar",
- "expvar.String": "expvar",
- "expvar.Var": "expvar",
- "fcgi.ErrConnClosed": "net/http/fcgi",
- "fcgi.ErrRequestAborted": "net/http/fcgi",
- "fcgi.ProcessEnv": "net/http/fcgi",
- "fcgi.Serve": "net/http/fcgi",
- "filepath.Abs": "path/filepath",
- "filepath.Base": "path/filepath",
- "filepath.Clean": "path/filepath",
- "filepath.Dir": "path/filepath",
- "filepath.ErrBadPattern": "path/filepath",
- "filepath.EvalSymlinks": "path/filepath",
- "filepath.Ext": "path/filepath",
- "filepath.FromSlash": "path/filepath",
- "filepath.Glob": "path/filepath",
- "filepath.HasPrefix": "path/filepath",
- "filepath.IsAbs": "path/filepath",
- "filepath.Join": "path/filepath",
- "filepath.ListSeparator": "path/filepath",
- "filepath.Match": "path/filepath",
- "filepath.Rel": "path/filepath",
- "filepath.Separator": "path/filepath",
- "filepath.SkipDir": "path/filepath",
- "filepath.Split": "path/filepath",
- "filepath.SplitList": "path/filepath",
- "filepath.ToSlash": "path/filepath",
- "filepath.VolumeName": "path/filepath",
- "filepath.Walk": "path/filepath",
- "filepath.WalkFunc": "path/filepath",
- "flag.Arg": "flag",
- "flag.Args": "flag",
- "flag.Bool": "flag",
- "flag.BoolVar": "flag",
- "flag.CommandLine": "flag",
- "flag.ContinueOnError": "flag",
- "flag.Duration": "flag",
- "flag.DurationVar": "flag",
- "flag.ErrHelp": "flag",
- "flag.ErrorHandling": "flag",
- "flag.ExitOnError": "flag",
- "flag.Flag": "flag",
- "flag.FlagSet": "flag",
- "flag.Float64": "flag",
- "flag.Float64Var": "flag",
- "flag.Getter": "flag",
- "flag.Int": "flag",
- "flag.Int64": "flag",
- "flag.Int64Var": "flag",
- "flag.IntVar": "flag",
- "flag.Lookup": "flag",
- "flag.NArg": "flag",
- "flag.NFlag": "flag",
- "flag.NewFlagSet": "flag",
- "flag.PanicOnError": "flag",
- "flag.Parse": "flag",
- "flag.Parsed": "flag",
- "flag.PrintDefaults": "flag",
- "flag.Set": "flag",
- "flag.String": "flag",
- "flag.StringVar": "flag",
- "flag.Uint": "flag",
- "flag.Uint64": "flag",
- "flag.Uint64Var": "flag",
- "flag.UintVar": "flag",
- "flag.UnquoteUsage": "flag",
- "flag.Usage": "flag",
- "flag.Value": "flag",
- "flag.Var": "flag",
- "flag.Visit": "flag",
- "flag.VisitAll": "flag",
- "flate.BestCompression": "compress/flate",
- "flate.BestSpeed": "compress/flate",
- "flate.CorruptInputError": "compress/flate",
- "flate.DefaultCompression": "compress/flate",
- "flate.HuffmanOnly": "compress/flate",
- "flate.InternalError": "compress/flate",
- "flate.NewReader": "compress/flate",
- "flate.NewReaderDict": "compress/flate",
- "flate.NewWriter": "compress/flate",
- "flate.NewWriterDict": "compress/flate",
- "flate.NoCompression": "compress/flate",
- "flate.ReadError": "compress/flate",
- "flate.Reader": "compress/flate",
- "flate.Resetter": "compress/flate",
- "flate.WriteError": "compress/flate",
- "flate.Writer": "compress/flate",
- "fmt.Errorf": "fmt",
- "fmt.Formatter": "fmt",
- "fmt.Fprint": "fmt",
- "fmt.Fprintf": "fmt",
- "fmt.Fprintln": "fmt",
- "fmt.Fscan": "fmt",
- "fmt.Fscanf": "fmt",
- "fmt.Fscanln": "fmt",
- "fmt.GoStringer": "fmt",
- "fmt.Print": "fmt",
- "fmt.Printf": "fmt",
- "fmt.Println": "fmt",
- "fmt.Scan": "fmt",
- "fmt.ScanState": "fmt",
- "fmt.Scanf": "fmt",
- "fmt.Scanln": "fmt",
- "fmt.Scanner": "fmt",
- "fmt.Sprint": "fmt",
- "fmt.Sprintf": "fmt",
- "fmt.Sprintln": "fmt",
- "fmt.Sscan": "fmt",
- "fmt.Sscanf": "fmt",
- "fmt.Sscanln": "fmt",
- "fmt.State": "fmt",
- "fmt.Stringer": "fmt",
- "fnv.New128": "hash/fnv",
- "fnv.New128a": "hash/fnv",
- "fnv.New32": "hash/fnv",
- "fnv.New32a": "hash/fnv",
- "fnv.New64": "hash/fnv",
- "fnv.New64a": "hash/fnv",
- "format.Node": "go/format",
- "format.Source": "go/format",
- "gif.Decode": "image/gif",
- "gif.DecodeAll": "image/gif",
- "gif.DecodeConfig": "image/gif",
- "gif.DisposalBackground": "image/gif",
- "gif.DisposalNone": "image/gif",
- "gif.DisposalPrevious": "image/gif",
- "gif.Encode": "image/gif",
- "gif.EncodeAll": "image/gif",
- "gif.GIF": "image/gif",
- "gif.Options": "image/gif",
- "gob.CommonType": "encoding/gob",
- "gob.Decoder": "encoding/gob",
- "gob.Encoder": "encoding/gob",
- "gob.GobDecoder": "encoding/gob",
- "gob.GobEncoder": "encoding/gob",
- "gob.NewDecoder": "encoding/gob",
- "gob.NewEncoder": "encoding/gob",
- "gob.Register": "encoding/gob",
- "gob.RegisterName": "encoding/gob",
- "gosym.DecodingError": "debug/gosym",
- "gosym.Func": "debug/gosym",
- "gosym.LineTable": "debug/gosym",
- "gosym.NewLineTable": "debug/gosym",
- "gosym.NewTable": "debug/gosym",
- "gosym.Obj": "debug/gosym",
- "gosym.Sym": "debug/gosym",
- "gosym.Table": "debug/gosym",
- "gosym.UnknownFileError": "debug/gosym",
- "gosym.UnknownLineError": "debug/gosym",
- "gzip.BestCompression": "compress/gzip",
- "gzip.BestSpeed": "compress/gzip",
- "gzip.DefaultCompression": "compress/gzip",
- "gzip.ErrChecksum": "compress/gzip",
- "gzip.ErrHeader": "compress/gzip",
- "gzip.Header": "compress/gzip",
- "gzip.HuffmanOnly": "compress/gzip",
- "gzip.NewReader": "compress/gzip",
- "gzip.NewWriter": "compress/gzip",
- "gzip.NewWriterLevel": "compress/gzip",
- "gzip.NoCompression": "compress/gzip",
- "gzip.Reader": "compress/gzip",
- "gzip.Writer": "compress/gzip",
- "hash.Hash": "hash",
- "hash.Hash32": "hash",
- "hash.Hash64": "hash",
- "heap.Fix": "container/heap",
- "heap.Init": "container/heap",
- "heap.Interface": "container/heap",
- "heap.Pop": "container/heap",
- "heap.Push": "container/heap",
- "heap.Remove": "container/heap",
- "hex.Decode": "encoding/hex",
- "hex.DecodeString": "encoding/hex",
- "hex.DecodedLen": "encoding/hex",
- "hex.Dump": "encoding/hex",
- "hex.Dumper": "encoding/hex",
- "hex.Encode": "encoding/hex",
- "hex.EncodeToString": "encoding/hex",
- "hex.EncodedLen": "encoding/hex",
- "hex.ErrLength": "encoding/hex",
- "hex.InvalidByteError": "encoding/hex",
- "hmac.Equal": "crypto/hmac",
- "hmac.New": "crypto/hmac",
- "html.EscapeString": "html",
- "html.UnescapeString": "html",
- "http.CanonicalHeaderKey": "net/http",
- "http.Client": "net/http",
- "http.CloseNotifier": "net/http",
- "http.ConnState": "net/http",
- "http.Cookie": "net/http",
- "http.CookieJar": "net/http",
- "http.DefaultClient": "net/http",
- "http.DefaultMaxHeaderBytes": "net/http",
- "http.DefaultMaxIdleConnsPerHost": "net/http",
- "http.DefaultServeMux": "net/http",
- "http.DefaultTransport": "net/http",
- "http.DetectContentType": "net/http",
- "http.Dir": "net/http",
- "http.ErrAbortHandler": "net/http",
- "http.ErrBodyNotAllowed": "net/http",
- "http.ErrBodyReadAfterClose": "net/http",
- "http.ErrContentLength": "net/http",
- "http.ErrHandlerTimeout": "net/http",
- "http.ErrHeaderTooLong": "net/http",
- "http.ErrHijacked": "net/http",
- "http.ErrLineTooLong": "net/http",
- "http.ErrMissingBoundary": "net/http",
- "http.ErrMissingContentLength": "net/http",
- "http.ErrMissingFile": "net/http",
- "http.ErrNoCookie": "net/http",
- "http.ErrNoLocation": "net/http",
- "http.ErrNotMultipart": "net/http",
- "http.ErrNotSupported": "net/http",
- "http.ErrServerClosed": "net/http",
- "http.ErrShortBody": "net/http",
- "http.ErrSkipAltProtocol": "net/http",
- "http.ErrUnexpectedTrailer": "net/http",
- "http.ErrUseLastResponse": "net/http",
- "http.ErrWriteAfterFlush": "net/http",
- "http.Error": "net/http",
- "http.File": "net/http",
- "http.FileServer": "net/http",
- "http.FileSystem": "net/http",
- "http.Flusher": "net/http",
- "http.Get": "net/http",
- "http.Handle": "net/http",
- "http.HandleFunc": "net/http",
- "http.Handler": "net/http",
- "http.HandlerFunc": "net/http",
- "http.Head": "net/http",
- "http.Header": "net/http",
- "http.Hijacker": "net/http",
- "http.ListenAndServe": "net/http",
- "http.ListenAndServeTLS": "net/http",
- "http.LocalAddrContextKey": "net/http",
- "http.MaxBytesReader": "net/http",
- "http.MethodConnect": "net/http",
- "http.MethodDelete": "net/http",
- "http.MethodGet": "net/http",
- "http.MethodHead": "net/http",
- "http.MethodOptions": "net/http",
- "http.MethodPatch": "net/http",
- "http.MethodPost": "net/http",
- "http.MethodPut": "net/http",
- "http.MethodTrace": "net/http",
- "http.NewFileTransport": "net/http",
- "http.NewRequest": "net/http",
- "http.NewServeMux": "net/http",
- "http.NoBody": "net/http",
- "http.NotFound": "net/http",
- "http.NotFoundHandler": "net/http",
- "http.ParseHTTPVersion": "net/http",
- "http.ParseTime": "net/http",
- "http.Post": "net/http",
- "http.PostForm": "net/http",
- "http.ProtocolError": "net/http",
- "http.ProxyFromEnvironment": "net/http",
- "http.ProxyURL": "net/http",
- "http.PushOptions": "net/http",
- "http.Pusher": "net/http",
- "http.ReadRequest": "net/http",
- "http.ReadResponse": "net/http",
- "http.Redirect": "net/http",
- "http.RedirectHandler": "net/http",
- "http.Request": "net/http",
- "http.Response": "net/http",
- "http.ResponseWriter": "net/http",
- "http.RoundTripper": "net/http",
- "http.Serve": "net/http",
- "http.ServeContent": "net/http",
- "http.ServeFile": "net/http",
- "http.ServeMux": "net/http",
- "http.ServeTLS": "net/http",
- "http.Server": "net/http",
- "http.ServerContextKey": "net/http",
- "http.SetCookie": "net/http",
- "http.StateActive": "net/http",
- "http.StateClosed": "net/http",
- "http.StateHijacked": "net/http",
- "http.StateIdle": "net/http",
- "http.StateNew": "net/http",
- "http.StatusAccepted": "net/http",
- "http.StatusAlreadyReported": "net/http",
- "http.StatusBadGateway": "net/http",
- "http.StatusBadRequest": "net/http",
- "http.StatusConflict": "net/http",
- "http.StatusContinue": "net/http",
- "http.StatusCreated": "net/http",
- "http.StatusExpectationFailed": "net/http",
- "http.StatusFailedDependency": "net/http",
- "http.StatusForbidden": "net/http",
- "http.StatusFound": "net/http",
- "http.StatusGatewayTimeout": "net/http",
- "http.StatusGone": "net/http",
- "http.StatusHTTPVersionNotSupported": "net/http",
- "http.StatusIMUsed": "net/http",
- "http.StatusInsufficientStorage": "net/http",
- "http.StatusInternalServerError": "net/http",
- "http.StatusLengthRequired": "net/http",
- "http.StatusLocked": "net/http",
- "http.StatusLoopDetected": "net/http",
- "http.StatusMethodNotAllowed": "net/http",
- "http.StatusMovedPermanently": "net/http",
- "http.StatusMultiStatus": "net/http",
- "http.StatusMultipleChoices": "net/http",
- "http.StatusNetworkAuthenticationRequired": "net/http",
- "http.StatusNoContent": "net/http",
- "http.StatusNonAuthoritativeInfo": "net/http",
- "http.StatusNotAcceptable": "net/http",
- "http.StatusNotExtended": "net/http",
- "http.StatusNotFound": "net/http",
- "http.StatusNotImplemented": "net/http",
- "http.StatusNotModified": "net/http",
- "http.StatusOK": "net/http",
- "http.StatusPartialContent": "net/http",
- "http.StatusPaymentRequired": "net/http",
- "http.StatusPermanentRedirect": "net/http",
- "http.StatusPreconditionFailed": "net/http",
- "http.StatusPreconditionRequired": "net/http",
- "http.StatusProcessing": "net/http",
- "http.StatusProxyAuthRequired": "net/http",
- "http.StatusRequestEntityTooLarge": "net/http",
- "http.StatusRequestHeaderFieldsTooLarge": "net/http",
- "http.StatusRequestTimeout": "net/http",
- "http.StatusRequestURITooLong": "net/http",
- "http.StatusRequestedRangeNotSatisfiable": "net/http",
- "http.StatusResetContent": "net/http",
- "http.StatusSeeOther": "net/http",
- "http.StatusServiceUnavailable": "net/http",
- "http.StatusSwitchingProtocols": "net/http",
- "http.StatusTeapot": "net/http",
- "http.StatusTemporaryRedirect": "net/http",
- "http.StatusText": "net/http",
- "http.StatusTooManyRequests": "net/http",
- "http.StatusUnauthorized": "net/http",
- "http.StatusUnavailableForLegalReasons": "net/http",
- "http.StatusUnprocessableEntity": "net/http",
- "http.StatusUnsupportedMediaType": "net/http",
- "http.StatusUpgradeRequired": "net/http",
- "http.StatusUseProxy": "net/http",
- "http.StatusVariantAlsoNegotiates": "net/http",
- "http.StripPrefix": "net/http",
- "http.TimeFormat": "net/http",
- "http.TimeoutHandler": "net/http",
- "http.TrailerPrefix": "net/http",
- "http.Transport": "net/http",
- "httptest.DefaultRemoteAddr": "net/http/httptest",
- "httptest.NewRecorder": "net/http/httptest",
- "httptest.NewRequest": "net/http/httptest",
- "httptest.NewServer": "net/http/httptest",
- "httptest.NewTLSServer": "net/http/httptest",
- "httptest.NewUnstartedServer": "net/http/httptest",
- "httptest.ResponseRecorder": "net/http/httptest",
- "httptest.Server": "net/http/httptest",
- "httptrace.ClientTrace": "net/http/httptrace",
- "httptrace.ContextClientTrace": "net/http/httptrace",
- "httptrace.DNSDoneInfo": "net/http/httptrace",
- "httptrace.DNSStartInfo": "net/http/httptrace",
- "httptrace.GotConnInfo": "net/http/httptrace",
- "httptrace.WithClientTrace": "net/http/httptrace",
- "httptrace.WroteRequestInfo": "net/http/httptrace",
- "httputil.BufferPool": "net/http/httputil",
- "httputil.ClientConn": "net/http/httputil",
- "httputil.DumpRequest": "net/http/httputil",
- "httputil.DumpRequestOut": "net/http/httputil",
- "httputil.DumpResponse": "net/http/httputil",
- "httputil.ErrClosed": "net/http/httputil",
- "httputil.ErrLineTooLong": "net/http/httputil",
- "httputil.ErrPersistEOF": "net/http/httputil",
- "httputil.ErrPipeline": "net/http/httputil",
- "httputil.NewChunkedReader": "net/http/httputil",
- "httputil.NewChunkedWriter": "net/http/httputil",
- "httputil.NewClientConn": "net/http/httputil",
- "httputil.NewProxyClientConn": "net/http/httputil",
- "httputil.NewServerConn": "net/http/httputil",
- "httputil.NewSingleHostReverseProxy": "net/http/httputil",
- "httputil.ReverseProxy": "net/http/httputil",
- "httputil.ServerConn": "net/http/httputil",
- "image.Alpha": "image",
- "image.Alpha16": "image",
- "image.Black": "image",
- "image.CMYK": "image",
- "image.Config": "image",
- "image.Decode": "image",
- "image.DecodeConfig": "image",
- "image.ErrFormat": "image",
- "image.Gray": "image",
- "image.Gray16": "image",
- "image.Image": "image",
- "image.NRGBA": "image",
- "image.NRGBA64": "image",
- "image.NYCbCrA": "image",
- "image.NewAlpha": "image",
- "image.NewAlpha16": "image",
- "image.NewCMYK": "image",
- "image.NewGray": "image",
- "image.NewGray16": "image",
- "image.NewNRGBA": "image",
- "image.NewNRGBA64": "image",
- "image.NewNYCbCrA": "image",
- "image.NewPaletted": "image",
- "image.NewRGBA": "image",
- "image.NewRGBA64": "image",
- "image.NewUniform": "image",
- "image.NewYCbCr": "image",
- "image.Opaque": "image",
- "image.Paletted": "image",
- "image.PalettedImage": "image",
- "image.Point": "image",
- "image.Pt": "image",
- "image.RGBA": "image",
- "image.RGBA64": "image",
- "image.Rect": "image",
- "image.Rectangle": "image",
- "image.RegisterFormat": "image",
- "image.Transparent": "image",
- "image.Uniform": "image",
- "image.White": "image",
- "image.YCbCr": "image",
- "image.YCbCrSubsampleRatio": "image",
- "image.YCbCrSubsampleRatio410": "image",
- "image.YCbCrSubsampleRatio411": "image",
- "image.YCbCrSubsampleRatio420": "image",
- "image.YCbCrSubsampleRatio422": "image",
- "image.YCbCrSubsampleRatio440": "image",
- "image.YCbCrSubsampleRatio444": "image",
- "image.ZP": "image",
- "image.ZR": "image",
- "importer.Default": "go/importer",
- "importer.For": "go/importer",
- "importer.Lookup": "go/importer",
- "io.ByteReader": "io",
- "io.ByteScanner": "io",
- "io.ByteWriter": "io",
- "io.Closer": "io",
- "io.Copy": "io",
- "io.CopyBuffer": "io",
- "io.CopyN": "io",
- "io.EOF": "io",
- "io.ErrClosedPipe": "io",
- "io.ErrNoProgress": "io",
- "io.ErrShortBuffer": "io",
- "io.ErrShortWrite": "io",
- "io.ErrUnexpectedEOF": "io",
- "io.LimitReader": "io",
- "io.LimitedReader": "io",
- "io.MultiReader": "io",
- "io.MultiWriter": "io",
- "io.NewSectionReader": "io",
- "io.Pipe": "io",
- "io.PipeReader": "io",
- "io.PipeWriter": "io",
- "io.ReadAtLeast": "io",
- "io.ReadCloser": "io",
- "io.ReadFull": "io",
- "io.ReadSeeker": "io",
- "io.ReadWriteCloser": "io",
- "io.ReadWriteSeeker": "io",
- "io.ReadWriter": "io",
- "io.Reader": "io",
- "io.ReaderAt": "io",
- "io.ReaderFrom": "io",
- "io.RuneReader": "io",
- "io.RuneScanner": "io",
- "io.SectionReader": "io",
- "io.SeekCurrent": "io",
- "io.SeekEnd": "io",
- "io.SeekStart": "io",
- "io.Seeker": "io",
- "io.TeeReader": "io",
- "io.WriteCloser": "io",
- "io.WriteSeeker": "io",
- "io.WriteString": "io",
- "io.Writer": "io",
- "io.WriterAt": "io",
- "io.WriterTo": "io",
- "iotest.DataErrReader": "testing/iotest",
- "iotest.ErrTimeout": "testing/iotest",
- "iotest.HalfReader": "testing/iotest",
- "iotest.NewReadLogger": "testing/iotest",
- "iotest.NewWriteLogger": "testing/iotest",
- "iotest.OneByteReader": "testing/iotest",
- "iotest.TimeoutReader": "testing/iotest",
- "iotest.TruncateWriter": "testing/iotest",
- "ioutil.Discard": "io/ioutil",
- "ioutil.NopCloser": "io/ioutil",
- "ioutil.ReadAll": "io/ioutil",
- "ioutil.ReadDir": "io/ioutil",
- "ioutil.ReadFile": "io/ioutil",
- "ioutil.TempDir": "io/ioutil",
- "ioutil.TempFile": "io/ioutil",
- "ioutil.WriteFile": "io/ioutil",
- "jpeg.Decode": "image/jpeg",
- "jpeg.DecodeConfig": "image/jpeg",
- "jpeg.DefaultQuality": "image/jpeg",
- "jpeg.Encode": "image/jpeg",
- "jpeg.FormatError": "image/jpeg",
- "jpeg.Options": "image/jpeg",
- "jpeg.Reader": "image/jpeg",
- "jpeg.UnsupportedError": "image/jpeg",
- "json.Compact": "encoding/json",
- "json.Decoder": "encoding/json",
- "json.Delim": "encoding/json",
- "json.Encoder": "encoding/json",
- "json.HTMLEscape": "encoding/json",
- "json.Indent": "encoding/json",
- "json.InvalidUTF8Error": "encoding/json",
- "json.InvalidUnmarshalError": "encoding/json",
- "json.Marshal": "encoding/json",
- "json.MarshalIndent": "encoding/json",
- "json.Marshaler": "encoding/json",
- "json.MarshalerError": "encoding/json",
- "json.NewDecoder": "encoding/json",
- "json.NewEncoder": "encoding/json",
- "json.Number": "encoding/json",
- "json.RawMessage": "encoding/json",
- "json.SyntaxError": "encoding/json",
- "json.Token": "encoding/json",
- "json.Unmarshal": "encoding/json",
- "json.UnmarshalFieldError": "encoding/json",
- "json.UnmarshalTypeError": "encoding/json",
- "json.Unmarshaler": "encoding/json",
- "json.UnsupportedTypeError": "encoding/json",
- "json.UnsupportedValueError": "encoding/json",
- "json.Valid": "encoding/json",
- "jsonrpc.Dial": "net/rpc/jsonrpc",
- "jsonrpc.NewClient": "net/rpc/jsonrpc",
- "jsonrpc.NewClientCodec": "net/rpc/jsonrpc",
- "jsonrpc.NewServerCodec": "net/rpc/jsonrpc",
- "jsonrpc.ServeConn": "net/rpc/jsonrpc",
- "list.Element": "container/list",
- "list.List": "container/list",
- "list.New": "container/list",
- "log.Fatal": "log",
- "log.Fatalf": "log",
- "log.Fatalln": "log",
- "log.Flags": "log",
- "log.LUTC": "log",
- "log.Ldate": "log",
- "log.Llongfile": "log",
- "log.Lmicroseconds": "log",
- "log.Logger": "log",
- "log.Lshortfile": "log",
- "log.LstdFlags": "log",
- "log.Ltime": "log",
- "log.New": "log",
- "log.Output": "log",
- "log.Panic": "log",
- "log.Panicf": "log",
- "log.Panicln": "log",
- "log.Prefix": "log",
- "log.Print": "log",
- "log.Printf": "log",
- "log.Println": "log",
- "log.SetFlags": "log",
- "log.SetOutput": "log",
- "log.SetPrefix": "log",
- "lzw.LSB": "compress/lzw",
- "lzw.MSB": "compress/lzw",
- "lzw.NewReader": "compress/lzw",
- "lzw.NewWriter": "compress/lzw",
- "lzw.Order": "compress/lzw",
- "macho.Cpu": "debug/macho",
- "macho.Cpu386": "debug/macho",
- "macho.CpuAmd64": "debug/macho",
- "macho.CpuArm": "debug/macho",
- "macho.CpuPpc": "debug/macho",
- "macho.CpuPpc64": "debug/macho",
- "macho.Dylib": "debug/macho",
- "macho.DylibCmd": "debug/macho",
- "macho.Dysymtab": "debug/macho",
- "macho.DysymtabCmd": "debug/macho",
- "macho.ErrNotFat": "debug/macho",
- "macho.FatArch": "debug/macho",
- "macho.FatArchHeader": "debug/macho",
- "macho.FatFile": "debug/macho",
- "macho.File": "debug/macho",
- "macho.FileHeader": "debug/macho",
- "macho.FormatError": "debug/macho",
- "macho.Load": "debug/macho",
- "macho.LoadBytes": "debug/macho",
- "macho.LoadCmd": "debug/macho",
- "macho.LoadCmdDylib": "debug/macho",
- "macho.LoadCmdDylinker": "debug/macho",
- "macho.LoadCmdDysymtab": "debug/macho",
- "macho.LoadCmdSegment": "debug/macho",
- "macho.LoadCmdSegment64": "debug/macho",
- "macho.LoadCmdSymtab": "debug/macho",
- "macho.LoadCmdThread": "debug/macho",
- "macho.LoadCmdUnixThread": "debug/macho",
- "macho.Magic32": "debug/macho",
- "macho.Magic64": "debug/macho",
- "macho.MagicFat": "debug/macho",
- "macho.NewFatFile": "debug/macho",
- "macho.NewFile": "debug/macho",
- "macho.Nlist32": "debug/macho",
- "macho.Nlist64": "debug/macho",
- "macho.Open": "debug/macho",
- "macho.OpenFat": "debug/macho",
- "macho.Regs386": "debug/macho",
- "macho.RegsAMD64": "debug/macho",
- "macho.Section": "debug/macho",
- "macho.Section32": "debug/macho",
- "macho.Section64": "debug/macho",
- "macho.SectionHeader": "debug/macho",
- "macho.Segment": "debug/macho",
- "macho.Segment32": "debug/macho",
- "macho.Segment64": "debug/macho",
- "macho.SegmentHeader": "debug/macho",
- "macho.Symbol": "debug/macho",
- "macho.Symtab": "debug/macho",
- "macho.SymtabCmd": "debug/macho",
- "macho.Thread": "debug/macho",
- "macho.Type": "debug/macho",
- "macho.TypeBundle": "debug/macho",
- "macho.TypeDylib": "debug/macho",
- "macho.TypeExec": "debug/macho",
- "macho.TypeObj": "debug/macho",
- "mail.Address": "net/mail",
- "mail.AddressParser": "net/mail",
- "mail.ErrHeaderNotPresent": "net/mail",
- "mail.Header": "net/mail",
- "mail.Message": "net/mail",
- "mail.ParseAddress": "net/mail",
- "mail.ParseAddressList": "net/mail",
- "mail.ParseDate": "net/mail",
- "mail.ReadMessage": "net/mail",
- "math.Abs": "math",
- "math.Acos": "math",
- "math.Acosh": "math",
- "math.Asin": "math",
- "math.Asinh": "math",
- "math.Atan": "math",
- "math.Atan2": "math",
- "math.Atanh": "math",
- "math.Cbrt": "math",
- "math.Ceil": "math",
- "math.Copysign": "math",
- "math.Cos": "math",
- "math.Cosh": "math",
- "math.Dim": "math",
- "math.E": "math",
- "math.Erf": "math",
- "math.Erfc": "math",
- "math.Exp": "math",
- "math.Exp2": "math",
- "math.Expm1": "math",
- "math.Float32bits": "math",
- "math.Float32frombits": "math",
- "math.Float64bits": "math",
- "math.Float64frombits": "math",
- "math.Floor": "math",
- "math.Frexp": "math",
- "math.Gamma": "math",
- "math.Hypot": "math",
- "math.Ilogb": "math",
- "math.Inf": "math",
- "math.IsInf": "math",
- "math.IsNaN": "math",
- "math.J0": "math",
- "math.J1": "math",
- "math.Jn": "math",
- "math.Ldexp": "math",
- "math.Lgamma": "math",
- "math.Ln10": "math",
- "math.Ln2": "math",
- "math.Log": "math",
- "math.Log10": "math",
- "math.Log10E": "math",
- "math.Log1p": "math",
- "math.Log2": "math",
- "math.Log2E": "math",
- "math.Logb": "math",
- "math.Max": "math",
- "math.MaxFloat32": "math",
- "math.MaxFloat64": "math",
- "math.MaxInt16": "math",
- "math.MaxInt32": "math",
- "math.MaxInt64": "math",
- "math.MaxInt8": "math",
- "math.MaxUint16": "math",
- "math.MaxUint32": "math",
- "math.MaxUint64": "math",
- "math.MaxUint8": "math",
- "math.Min": "math",
- "math.MinInt16": "math",
- "math.MinInt32": "math",
- "math.MinInt64": "math",
- "math.MinInt8": "math",
- "math.Mod": "math",
- "math.Modf": "math",
- "math.NaN": "math",
- "math.Nextafter": "math",
- "math.Nextafter32": "math",
- "math.Phi": "math",
- "math.Pi": "math",
- "math.Pow": "math",
- "math.Pow10": "math",
- "math.Remainder": "math",
- "math.Signbit": "math",
- "math.Sin": "math",
- "math.Sincos": "math",
- "math.Sinh": "math",
- "math.SmallestNonzeroFloat32": "math",
- "math.SmallestNonzeroFloat64": "math",
- "math.Sqrt": "math",
- "math.Sqrt2": "math",
- "math.SqrtE": "math",
- "math.SqrtPhi": "math",
- "math.SqrtPi": "math",
- "math.Tan": "math",
- "math.Tanh": "math",
- "math.Trunc": "math",
- "math.Y0": "math",
- "math.Y1": "math",
- "math.Yn": "math",
- "md5.BlockSize": "crypto/md5",
- "md5.New": "crypto/md5",
- "md5.Size": "crypto/md5",
- "md5.Sum": "crypto/md5",
- "mime.AddExtensionType": "mime",
- "mime.BEncoding": "mime",
- "mime.ErrInvalidMediaParameter": "mime",
- "mime.ExtensionsByType": "mime",
- "mime.FormatMediaType": "mime",
- "mime.ParseMediaType": "mime",
- "mime.QEncoding": "mime",
- "mime.TypeByExtension": "mime",
- "mime.WordDecoder": "mime",
- "mime.WordEncoder": "mime",
- "multipart.ErrMessageTooLarge": "mime/multipart",
- "multipart.File": "mime/multipart",
- "multipart.FileHeader": "mime/multipart",
- "multipart.Form": "mime/multipart",
- "multipart.NewReader": "mime/multipart",
- "multipart.NewWriter": "mime/multipart",
- "multipart.Part": "mime/multipart",
- "multipart.Reader": "mime/multipart",
- "multipart.Writer": "mime/multipart",
- "net.Addr": "net",
- "net.AddrError": "net",
- "net.Buffers": "net",
- "net.CIDRMask": "net",
- "net.Conn": "net",
- "net.DNSConfigError": "net",
- "net.DNSError": "net",
- "net.DefaultResolver": "net",
- "net.Dial": "net",
- "net.DialIP": "net",
- "net.DialTCP": "net",
- "net.DialTimeout": "net",
- "net.DialUDP": "net",
- "net.DialUnix": "net",
- "net.Dialer": "net",
- "net.ErrWriteToConnected": "net",
- "net.Error": "net",
- "net.FileConn": "net",
- "net.FileListener": "net",
- "net.FilePacketConn": "net",
- "net.FlagBroadcast": "net",
- "net.FlagLoopback": "net",
- "net.FlagMulticast": "net",
- "net.FlagPointToPoint": "net",
- "net.FlagUp": "net",
- "net.Flags": "net",
- "net.HardwareAddr": "net",
- "net.IP": "net",
- "net.IPAddr": "net",
- "net.IPConn": "net",
- "net.IPMask": "net",
- "net.IPNet": "net",
- "net.IPv4": "net",
- "net.IPv4Mask": "net",
- "net.IPv4allrouter": "net",
- "net.IPv4allsys": "net",
- "net.IPv4bcast": "net",
- "net.IPv4len": "net",
- "net.IPv4zero": "net",
- "net.IPv6interfacelocalallnodes": "net",
- "net.IPv6len": "net",
- "net.IPv6linklocalallnodes": "net",
- "net.IPv6linklocalallrouters": "net",
- "net.IPv6loopback": "net",
- "net.IPv6unspecified": "net",
- "net.IPv6zero": "net",
- "net.Interface": "net",
- "net.InterfaceAddrs": "net",
- "net.InterfaceByIndex": "net",
- "net.InterfaceByName": "net",
- "net.Interfaces": "net",
- "net.InvalidAddrError": "net",
- "net.JoinHostPort": "net",
- "net.Listen": "net",
- "net.ListenIP": "net",
- "net.ListenMulticastUDP": "net",
- "net.ListenPacket": "net",
- "net.ListenTCP": "net",
- "net.ListenUDP": "net",
- "net.ListenUnix": "net",
- "net.ListenUnixgram": "net",
- "net.Listener": "net",
- "net.LookupAddr": "net",
- "net.LookupCNAME": "net",
- "net.LookupHost": "net",
- "net.LookupIP": "net",
- "net.LookupMX": "net",
- "net.LookupNS": "net",
- "net.LookupPort": "net",
- "net.LookupSRV": "net",
- "net.LookupTXT": "net",
- "net.MX": "net",
- "net.NS": "net",
- "net.OpError": "net",
- "net.PacketConn": "net",
- "net.ParseCIDR": "net",
- "net.ParseError": "net",
- "net.ParseIP": "net",
- "net.ParseMAC": "net",
- "net.Pipe": "net",
- "net.ResolveIPAddr": "net",
- "net.ResolveTCPAddr": "net",
- "net.ResolveUDPAddr": "net",
- "net.ResolveUnixAddr": "net",
- "net.Resolver": "net",
- "net.SRV": "net",
- "net.SplitHostPort": "net",
- "net.TCPAddr": "net",
- "net.TCPConn": "net",
- "net.TCPListener": "net",
- "net.UDPAddr": "net",
- "net.UDPConn": "net",
- "net.UnixAddr": "net",
- "net.UnixConn": "net",
- "net.UnixListener": "net",
- "net.UnknownNetworkError": "net",
- "os.Args": "os",
- "os.Chdir": "os",
- "os.Chmod": "os",
- "os.Chown": "os",
- "os.Chtimes": "os",
- "os.Clearenv": "os",
- "os.Create": "os",
- "os.DevNull": "os",
- "os.Environ": "os",
- "os.ErrClosed": "os",
- "os.ErrExist": "os",
- "os.ErrInvalid": "os",
- "os.ErrNotExist": "os",
- "os.ErrPermission": "os",
- "os.Executable": "os",
- "os.Exit": "os",
- "os.Expand": "os",
- "os.ExpandEnv": "os",
- "os.File": "os",
- "os.FileInfo": "os",
- "os.FileMode": "os",
- "os.FindProcess": "os",
- "os.Getegid": "os",
- "os.Getenv": "os",
- "os.Geteuid": "os",
- "os.Getgid": "os",
- "os.Getgroups": "os",
- "os.Getpagesize": "os",
- "os.Getpid": "os",
- "os.Getppid": "os",
- "os.Getuid": "os",
- "os.Getwd": "os",
- "os.Hostname": "os",
- "os.Interrupt": "os",
- "os.IsExist": "os",
- "os.IsNotExist": "os",
- "os.IsPathSeparator": "os",
- "os.IsPermission": "os",
- "os.Kill": "os",
- "os.Lchown": "os",
- "os.Link": "os",
- "os.LinkError": "os",
- "os.LookupEnv": "os",
- "os.Lstat": "os",
- "os.Mkdir": "os",
- "os.MkdirAll": "os",
- "os.ModeAppend": "os",
- "os.ModeCharDevice": "os",
- "os.ModeDevice": "os",
- "os.ModeDir": "os",
- "os.ModeExclusive": "os",
- "os.ModeNamedPipe": "os",
- "os.ModePerm": "os",
- "os.ModeSetgid": "os",
- "os.ModeSetuid": "os",
- "os.ModeSocket": "os",
- "os.ModeSticky": "os",
- "os.ModeSymlink": "os",
- "os.ModeTemporary": "os",
- "os.ModeType": "os",
- "os.NewFile": "os",
- "os.NewSyscallError": "os",
- "os.O_APPEND": "os",
- "os.O_CREATE": "os",
- "os.O_EXCL": "os",
- "os.O_RDONLY": "os",
- "os.O_RDWR": "os",
- "os.O_SYNC": "os",
- "os.O_TRUNC": "os",
- "os.O_WRONLY": "os",
- "os.Open": "os",
- "os.OpenFile": "os",
- "os.PathError": "os",
- "os.PathListSeparator": "os",
- "os.PathSeparator": "os",
- "os.Pipe": "os",
- "os.ProcAttr": "os",
- "os.Process": "os",
- "os.ProcessState": "os",
- "os.Readlink": "os",
- "os.Remove": "os",
- "os.RemoveAll": "os",
- "os.Rename": "os",
- "os.SEEK_CUR": "os",
- "os.SEEK_END": "os",
- "os.SEEK_SET": "os",
- "os.SameFile": "os",
- "os.Setenv": "os",
- "os.Signal": "os",
- "os.StartProcess": "os",
- "os.Stat": "os",
- "os.Stderr": "os",
- "os.Stdin": "os",
- "os.Stdout": "os",
- "os.Symlink": "os",
- "os.SyscallError": "os",
- "os.TempDir": "os",
- "os.Truncate": "os",
- "os.Unsetenv": "os",
- "palette.Plan9": "image/color/palette",
- "palette.WebSafe": "image/color/palette",
- "parse.ActionNode": "text/template/parse",
- "parse.BoolNode": "text/template/parse",
- "parse.BranchNode": "text/template/parse",
- "parse.ChainNode": "text/template/parse",
- "parse.CommandNode": "text/template/parse",
- "parse.DotNode": "text/template/parse",
- "parse.FieldNode": "text/template/parse",
- "parse.IdentifierNode": "text/template/parse",
- "parse.IfNode": "text/template/parse",
- "parse.IsEmptyTree": "text/template/parse",
- "parse.ListNode": "text/template/parse",
- "parse.New": "text/template/parse",
- "parse.NewIdentifier": "text/template/parse",
- "parse.NilNode": "text/template/parse",
- "parse.Node": "text/template/parse",
- "parse.NodeAction": "text/template/parse",
- "parse.NodeBool": "text/template/parse",
- "parse.NodeChain": "text/template/parse",
- "parse.NodeCommand": "text/template/parse",
- "parse.NodeDot": "text/template/parse",
- "parse.NodeField": "text/template/parse",
- "parse.NodeIdentifier": "text/template/parse",
- "parse.NodeIf": "text/template/parse",
- "parse.NodeList": "text/template/parse",
- "parse.NodeNil": "text/template/parse",
- "parse.NodeNumber": "text/template/parse",
- "parse.NodePipe": "text/template/parse",
- "parse.NodeRange": "text/template/parse",
- "parse.NodeString": "text/template/parse",
- "parse.NodeTemplate": "text/template/parse",
- "parse.NodeText": "text/template/parse",
- "parse.NodeType": "text/template/parse",
- "parse.NodeVariable": "text/template/parse",
- "parse.NodeWith": "text/template/parse",
- "parse.NumberNode": "text/template/parse",
- "parse.Parse": "text/template/parse",
- "parse.PipeNode": "text/template/parse",
- "parse.Pos": "text/template/parse",
- "parse.RangeNode": "text/template/parse",
- "parse.StringNode": "text/template/parse",
- "parse.TemplateNode": "text/template/parse",
- "parse.TextNode": "text/template/parse",
- "parse.Tree": "text/template/parse",
- "parse.VariableNode": "text/template/parse",
- "parse.WithNode": "text/template/parse",
- "parser.AllErrors": "go/parser",
- "parser.DeclarationErrors": "go/parser",
- "parser.ImportsOnly": "go/parser",
- "parser.Mode": "go/parser",
- "parser.PackageClauseOnly": "go/parser",
- "parser.ParseComments": "go/parser",
- "parser.ParseDir": "go/parser",
- "parser.ParseExpr": "go/parser",
- "parser.ParseExprFrom": "go/parser",
- "parser.ParseFile": "go/parser",
- "parser.SpuriousErrors": "go/parser",
- "parser.Trace": "go/parser",
- "path.Base": "path",
- "path.Clean": "path",
- "path.Dir": "path",
- "path.ErrBadPattern": "path",
- "path.Ext": "path",
- "path.IsAbs": "path",
- "path.Join": "path",
- "path.Match": "path",
- "path.Split": "path",
- "pe.COFFSymbol": "debug/pe",
- "pe.COFFSymbolSize": "debug/pe",
- "pe.DataDirectory": "debug/pe",
- "pe.File": "debug/pe",
- "pe.FileHeader": "debug/pe",
- "pe.FormatError": "debug/pe",
- "pe.IMAGE_FILE_MACHINE_AM33": "debug/pe",
- "pe.IMAGE_FILE_MACHINE_AMD64": "debug/pe",
- "pe.IMAGE_FILE_MACHINE_ARM": "debug/pe",
- "pe.IMAGE_FILE_MACHINE_EBC": "debug/pe",
- "pe.IMAGE_FILE_MACHINE_I386": "debug/pe",
- "pe.IMAGE_FILE_MACHINE_IA64": "debug/pe",
- "pe.IMAGE_FILE_MACHINE_M32R": "debug/pe",
- "pe.IMAGE_FILE_MACHINE_MIPS16": "debug/pe",
- "pe.IMAGE_FILE_MACHINE_MIPSFPU": "debug/pe",
- "pe.IMAGE_FILE_MACHINE_MIPSFPU16": "debug/pe",
- "pe.IMAGE_FILE_MACHINE_POWERPC": "debug/pe",
- "pe.IMAGE_FILE_MACHINE_POWERPCFP": "debug/pe",
- "pe.IMAGE_FILE_MACHINE_R4000": "debug/pe",
- "pe.IMAGE_FILE_MACHINE_SH3": "debug/pe",
- "pe.IMAGE_FILE_MACHINE_SH3DSP": "debug/pe",
- "pe.IMAGE_FILE_MACHINE_SH4": "debug/pe",
- "pe.IMAGE_FILE_MACHINE_SH5": "debug/pe",
- "pe.IMAGE_FILE_MACHINE_THUMB": "debug/pe",
- "pe.IMAGE_FILE_MACHINE_UNKNOWN": "debug/pe",
- "pe.IMAGE_FILE_MACHINE_WCEMIPSV2": "debug/pe",
- "pe.ImportDirectory": "debug/pe",
- "pe.NewFile": "debug/pe",
- "pe.Open": "debug/pe",
- "pe.OptionalHeader32": "debug/pe",
- "pe.OptionalHeader64": "debug/pe",
- "pe.Reloc": "debug/pe",
- "pe.Section": "debug/pe",
- "pe.SectionHeader": "debug/pe",
- "pe.SectionHeader32": "debug/pe",
- "pe.StringTable": "debug/pe",
- "pe.Symbol": "debug/pe",
- "pem.Block": "encoding/pem",
- "pem.Decode": "encoding/pem",
- "pem.Encode": "encoding/pem",
- "pem.EncodeToMemory": "encoding/pem",
- "pkix.AlgorithmIdentifier": "crypto/x509/pkix",
- "pkix.AttributeTypeAndValue": "crypto/x509/pkix",
- "pkix.AttributeTypeAndValueSET": "crypto/x509/pkix",
- "pkix.CertificateList": "crypto/x509/pkix",
- "pkix.Extension": "crypto/x509/pkix",
- "pkix.Name": "crypto/x509/pkix",
- "pkix.RDNSequence": "crypto/x509/pkix",
- "pkix.RelativeDistinguishedNameSET": "crypto/x509/pkix",
- "pkix.RevokedCertificate": "crypto/x509/pkix",
- "pkix.TBSCertificateList": "crypto/x509/pkix",
- "plan9obj.File": "debug/plan9obj",
- "plan9obj.FileHeader": "debug/plan9obj",
- "plan9obj.Magic386": "debug/plan9obj",
- "plan9obj.Magic64": "debug/plan9obj",
- "plan9obj.MagicAMD64": "debug/plan9obj",
- "plan9obj.MagicARM": "debug/plan9obj",
- "plan9obj.NewFile": "debug/plan9obj",
- "plan9obj.Open": "debug/plan9obj",
- "plan9obj.Section": "debug/plan9obj",
- "plan9obj.SectionHeader": "debug/plan9obj",
- "plan9obj.Sym": "debug/plan9obj",
- "plugin.Open": "plugin",
- "plugin.Plugin": "plugin",
- "plugin.Symbol": "plugin",
- "png.BestCompression": "image/png",
- "png.BestSpeed": "image/png",
- "png.CompressionLevel": "image/png",
- "png.Decode": "image/png",
- "png.DecodeConfig": "image/png",
- "png.DefaultCompression": "image/png",
- "png.Encode": "image/png",
- "png.Encoder": "image/png",
- "png.EncoderBuffer": "image/png",
- "png.EncoderBufferPool": "image/png",
- "png.FormatError": "image/png",
- "png.NoCompression": "image/png",
- "png.UnsupportedError": "image/png",
- "pprof.Cmdline": "net/http/pprof",
- "pprof.Do": "runtime/pprof",
- "pprof.ForLabels": "runtime/pprof",
- "pprof.Handler": "net/http/pprof",
- "pprof.Index": "net/http/pprof",
- "pprof.Label": "runtime/pprof",
- "pprof.LabelSet": "runtime/pprof",
- "pprof.Labels": "runtime/pprof",
- "pprof.Lookup": "runtime/pprof",
- "pprof.NewProfile": "runtime/pprof",
- // "pprof.Profile" is ambiguous
- "pprof.Profiles": "runtime/pprof",
- "pprof.SetGoroutineLabels": "runtime/pprof",
- "pprof.StartCPUProfile": "runtime/pprof",
- "pprof.StopCPUProfile": "runtime/pprof",
- "pprof.Symbol": "net/http/pprof",
- "pprof.Trace": "net/http/pprof",
- "pprof.WithLabels": "runtime/pprof",
- "pprof.WriteHeapProfile": "runtime/pprof",
- "printer.CommentedNode": "go/printer",
- "printer.Config": "go/printer",
- "printer.Fprint": "go/printer",
- "printer.Mode": "go/printer",
- "printer.RawFormat": "go/printer",
- "printer.SourcePos": "go/printer",
- "printer.TabIndent": "go/printer",
- "printer.UseSpaces": "go/printer",
- "quick.Check": "testing/quick",
- "quick.CheckEqual": "testing/quick",
- "quick.CheckEqualError": "testing/quick",
- "quick.CheckError": "testing/quick",
- "quick.Config": "testing/quick",
- "quick.Generator": "testing/quick",
- "quick.SetupError": "testing/quick",
- "quick.Value": "testing/quick",
- "quotedprintable.NewReader": "mime/quotedprintable",
- "quotedprintable.NewWriter": "mime/quotedprintable",
- "quotedprintable.Reader": "mime/quotedprintable",
- "quotedprintable.Writer": "mime/quotedprintable",
- "rand.ExpFloat64": "math/rand",
- "rand.Float32": "math/rand",
- "rand.Float64": "math/rand",
- // "rand.Int" is ambiguous
- "rand.Int31": "math/rand",
- "rand.Int31n": "math/rand",
- "rand.Int63": "math/rand",
- "rand.Int63n": "math/rand",
- "rand.Intn": "math/rand",
- "rand.New": "math/rand",
- "rand.NewSource": "math/rand",
- "rand.NewZipf": "math/rand",
- "rand.NormFloat64": "math/rand",
- "rand.Perm": "math/rand",
- "rand.Prime": "crypto/rand",
- "rand.Rand": "math/rand",
- // "rand.Read" is ambiguous
- "rand.Reader": "crypto/rand",
- "rand.Seed": "math/rand",
- "rand.Source": "math/rand",
- "rand.Source64": "math/rand",
- "rand.Uint32": "math/rand",
- "rand.Uint64": "math/rand",
- "rand.Zipf": "math/rand",
- "rc4.Cipher": "crypto/rc4",
- "rc4.KeySizeError": "crypto/rc4",
- "rc4.NewCipher": "crypto/rc4",
- "reflect.Append": "reflect",
- "reflect.AppendSlice": "reflect",
- "reflect.Array": "reflect",
- "reflect.ArrayOf": "reflect",
- "reflect.Bool": "reflect",
- "reflect.BothDir": "reflect",
- "reflect.Chan": "reflect",
- "reflect.ChanDir": "reflect",
- "reflect.ChanOf": "reflect",
- "reflect.Complex128": "reflect",
- "reflect.Complex64": "reflect",
- "reflect.Copy": "reflect",
- "reflect.DeepEqual": "reflect",
- "reflect.Float32": "reflect",
- "reflect.Float64": "reflect",
- "reflect.Func": "reflect",
- "reflect.FuncOf": "reflect",
- "reflect.Indirect": "reflect",
- "reflect.Int": "reflect",
- "reflect.Int16": "reflect",
- "reflect.Int32": "reflect",
- "reflect.Int64": "reflect",
- "reflect.Int8": "reflect",
- "reflect.Interface": "reflect",
- "reflect.Invalid": "reflect",
- "reflect.Kind": "reflect",
- "reflect.MakeChan": "reflect",
- "reflect.MakeFunc": "reflect",
- "reflect.MakeMap": "reflect",
- "reflect.MakeMapWithSize": "reflect",
- "reflect.MakeSlice": "reflect",
- "reflect.Map": "reflect",
- "reflect.MapOf": "reflect",
- "reflect.Method": "reflect",
- "reflect.New": "reflect",
- "reflect.NewAt": "reflect",
- "reflect.Ptr": "reflect",
- "reflect.PtrTo": "reflect",
- "reflect.RecvDir": "reflect",
- "reflect.Select": "reflect",
- "reflect.SelectCase": "reflect",
- "reflect.SelectDefault": "reflect",
- "reflect.SelectDir": "reflect",
- "reflect.SelectRecv": "reflect",
- "reflect.SelectSend": "reflect",
- "reflect.SendDir": "reflect",
- "reflect.Slice": "reflect",
- "reflect.SliceHeader": "reflect",
- "reflect.SliceOf": "reflect",
- "reflect.String": "reflect",
- "reflect.StringHeader": "reflect",
- "reflect.Struct": "reflect",
- "reflect.StructField": "reflect",
- "reflect.StructOf": "reflect",
- "reflect.StructTag": "reflect",
- "reflect.Swapper": "reflect",
- "reflect.TypeOf": "reflect",
- "reflect.Uint": "reflect",
- "reflect.Uint16": "reflect",
- "reflect.Uint32": "reflect",
- "reflect.Uint64": "reflect",
- "reflect.Uint8": "reflect",
- "reflect.Uintptr": "reflect",
- "reflect.UnsafePointer": "reflect",
- "reflect.Value": "reflect",
- "reflect.ValueError": "reflect",
- "reflect.ValueOf": "reflect",
- "reflect.Zero": "reflect",
- "regexp.Compile": "regexp",
- "regexp.CompilePOSIX": "regexp",
- "regexp.Match": "regexp",
- "regexp.MatchReader": "regexp",
- "regexp.MatchString": "regexp",
- "regexp.MustCompile": "regexp",
- "regexp.MustCompilePOSIX": "regexp",
- "regexp.QuoteMeta": "regexp",
- "regexp.Regexp": "regexp",
- "ring.New": "container/ring",
- "ring.Ring": "container/ring",
- "rpc.Accept": "net/rpc",
- "rpc.Call": "net/rpc",
- "rpc.Client": "net/rpc",
- "rpc.ClientCodec": "net/rpc",
- "rpc.DefaultDebugPath": "net/rpc",
- "rpc.DefaultRPCPath": "net/rpc",
- "rpc.DefaultServer": "net/rpc",
- "rpc.Dial": "net/rpc",
- "rpc.DialHTTP": "net/rpc",
- "rpc.DialHTTPPath": "net/rpc",
- "rpc.ErrShutdown": "net/rpc",
- "rpc.HandleHTTP": "net/rpc",
- "rpc.NewClient": "net/rpc",
- "rpc.NewClientWithCodec": "net/rpc",
- "rpc.NewServer": "net/rpc",
- "rpc.Register": "net/rpc",
- "rpc.RegisterName": "net/rpc",
- "rpc.Request": "net/rpc",
- "rpc.Response": "net/rpc",
- "rpc.ServeCodec": "net/rpc",
- "rpc.ServeConn": "net/rpc",
- "rpc.ServeRequest": "net/rpc",
- "rpc.Server": "net/rpc",
- "rpc.ServerCodec": "net/rpc",
- "rpc.ServerError": "net/rpc",
- "rsa.CRTValue": "crypto/rsa",
- "rsa.DecryptOAEP": "crypto/rsa",
- "rsa.DecryptPKCS1v15": "crypto/rsa",
- "rsa.DecryptPKCS1v15SessionKey": "crypto/rsa",
- "rsa.EncryptOAEP": "crypto/rsa",
- "rsa.EncryptPKCS1v15": "crypto/rsa",
- "rsa.ErrDecryption": "crypto/rsa",
- "rsa.ErrMessageTooLong": "crypto/rsa",
- "rsa.ErrVerification": "crypto/rsa",
- "rsa.GenerateKey": "crypto/rsa",
- "rsa.GenerateMultiPrimeKey": "crypto/rsa",
- "rsa.OAEPOptions": "crypto/rsa",
- "rsa.PKCS1v15DecryptOptions": "crypto/rsa",
- "rsa.PSSOptions": "crypto/rsa",
- "rsa.PSSSaltLengthAuto": "crypto/rsa",
- "rsa.PSSSaltLengthEqualsHash": "crypto/rsa",
- "rsa.PrecomputedValues": "crypto/rsa",
- "rsa.PrivateKey": "crypto/rsa",
- "rsa.PublicKey": "crypto/rsa",
- "rsa.SignPKCS1v15": "crypto/rsa",
- "rsa.SignPSS": "crypto/rsa",
- "rsa.VerifyPKCS1v15": "crypto/rsa",
- "rsa.VerifyPSS": "crypto/rsa",
- "runtime.BlockProfile": "runtime",
- "runtime.BlockProfileRecord": "runtime",
- "runtime.Breakpoint": "runtime",
- "runtime.CPUProfile": "runtime",
- "runtime.Caller": "runtime",
- "runtime.Callers": "runtime",
- "runtime.CallersFrames": "runtime",
- "runtime.Compiler": "runtime",
- "runtime.Error": "runtime",
- "runtime.Frame": "runtime",
- "runtime.Frames": "runtime",
- "runtime.Func": "runtime",
- "runtime.FuncForPC": "runtime",
- "runtime.GC": "runtime",
- "runtime.GOARCH": "runtime",
- "runtime.GOMAXPROCS": "runtime",
- "runtime.GOOS": "runtime",
- "runtime.GOROOT": "runtime",
- "runtime.Goexit": "runtime",
- "runtime.GoroutineProfile": "runtime",
- "runtime.Gosched": "runtime",
- "runtime.KeepAlive": "runtime",
- "runtime.LockOSThread": "runtime",
- "runtime.MemProfile": "runtime",
- "runtime.MemProfileRate": "runtime",
- "runtime.MemProfileRecord": "runtime",
- "runtime.MemStats": "runtime",
- "runtime.MutexProfile": "runtime",
- "runtime.NumCPU": "runtime",
- "runtime.NumCgoCall": "runtime",
- "runtime.NumGoroutine": "runtime",
- "runtime.ReadMemStats": "runtime",
- "runtime.ReadTrace": "runtime",
- "runtime.SetBlockProfileRate": "runtime",
- "runtime.SetCPUProfileRate": "runtime",
- "runtime.SetCgoTraceback": "runtime",
- "runtime.SetFinalizer": "runtime",
- "runtime.SetMutexProfileFraction": "runtime",
- "runtime.Stack": "runtime",
- "runtime.StackRecord": "runtime",
- "runtime.StartTrace": "runtime",
- "runtime.StopTrace": "runtime",
- "runtime.ThreadCreateProfile": "runtime",
- "runtime.TypeAssertionError": "runtime",
- "runtime.UnlockOSThread": "runtime",
- "runtime.Version": "runtime",
- "scanner.Char": "text/scanner",
- "scanner.Comment": "text/scanner",
- "scanner.EOF": "text/scanner",
- "scanner.Error": "go/scanner",
- "scanner.ErrorHandler": "go/scanner",
- "scanner.ErrorList": "go/scanner",
- "scanner.Float": "text/scanner",
- "scanner.GoTokens": "text/scanner",
- "scanner.GoWhitespace": "text/scanner",
- "scanner.Ident": "text/scanner",
- "scanner.Int": "text/scanner",
- "scanner.Mode": "go/scanner",
- "scanner.Position": "text/scanner",
- "scanner.PrintError": "go/scanner",
- "scanner.RawString": "text/scanner",
- "scanner.ScanChars": "text/scanner",
- // "scanner.ScanComments" is ambiguous
- "scanner.ScanFloats": "text/scanner",
- "scanner.ScanIdents": "text/scanner",
- "scanner.ScanInts": "text/scanner",
- "scanner.ScanRawStrings": "text/scanner",
- "scanner.ScanStrings": "text/scanner",
- // "scanner.Scanner" is ambiguous
- "scanner.SkipComments": "text/scanner",
- "scanner.String": "text/scanner",
- "scanner.TokenString": "text/scanner",
- "sha1.BlockSize": "crypto/sha1",
- "sha1.New": "crypto/sha1",
- "sha1.Size": "crypto/sha1",
- "sha1.Sum": "crypto/sha1",
- "sha256.BlockSize": "crypto/sha256",
- "sha256.New": "crypto/sha256",
- "sha256.New224": "crypto/sha256",
- "sha256.Size": "crypto/sha256",
- "sha256.Size224": "crypto/sha256",
- "sha256.Sum224": "crypto/sha256",
- "sha256.Sum256": "crypto/sha256",
- "sha512.BlockSize": "crypto/sha512",
- "sha512.New": "crypto/sha512",
- "sha512.New384": "crypto/sha512",
- "sha512.New512_224": "crypto/sha512",
- "sha512.New512_256": "crypto/sha512",
- "sha512.Size": "crypto/sha512",
- "sha512.Size224": "crypto/sha512",
- "sha512.Size256": "crypto/sha512",
- "sha512.Size384": "crypto/sha512",
- "sha512.Sum384": "crypto/sha512",
- "sha512.Sum512": "crypto/sha512",
- "sha512.Sum512_224": "crypto/sha512",
- "sha512.Sum512_256": "crypto/sha512",
- "signal.Ignore": "os/signal",
- "signal.Notify": "os/signal",
- "signal.Reset": "os/signal",
- "signal.Stop": "os/signal",
- "smtp.Auth": "net/smtp",
- "smtp.CRAMMD5Auth": "net/smtp",
- "smtp.Client": "net/smtp",
- "smtp.Dial": "net/smtp",
- "smtp.NewClient": "net/smtp",
- "smtp.PlainAuth": "net/smtp",
- "smtp.SendMail": "net/smtp",
- "smtp.ServerInfo": "net/smtp",
- "sort.Float64Slice": "sort",
- "sort.Float64s": "sort",
- "sort.Float64sAreSorted": "sort",
- "sort.IntSlice": "sort",
- "sort.Interface": "sort",
- "sort.Ints": "sort",
- "sort.IntsAreSorted": "sort",
- "sort.IsSorted": "sort",
- "sort.Reverse": "sort",
- "sort.Search": "sort",
- "sort.SearchFloat64s": "sort",
- "sort.SearchInts": "sort",
- "sort.SearchStrings": "sort",
- "sort.Slice": "sort",
- "sort.SliceIsSorted": "sort",
- "sort.SliceStable": "sort",
- "sort.Sort": "sort",
- "sort.Stable": "sort",
- "sort.StringSlice": "sort",
- "sort.Strings": "sort",
- "sort.StringsAreSorted": "sort",
- "sql.ColumnType": "database/sql",
- "sql.Conn": "database/sql",
- "sql.DB": "database/sql",
- "sql.DBStats": "database/sql",
- "sql.Drivers": "database/sql",
- "sql.ErrConnDone": "database/sql",
- "sql.ErrNoRows": "database/sql",
- "sql.ErrTxDone": "database/sql",
- "sql.IsolationLevel": "database/sql",
- "sql.LevelDefault": "database/sql",
- "sql.LevelLinearizable": "database/sql",
- "sql.LevelReadCommitted": "database/sql",
- "sql.LevelReadUncommitted": "database/sql",
- "sql.LevelRepeatableRead": "database/sql",
- "sql.LevelSerializable": "database/sql",
- "sql.LevelSnapshot": "database/sql",
- "sql.LevelWriteCommitted": "database/sql",
- "sql.Named": "database/sql",
- "sql.NamedArg": "database/sql",
- "sql.NullBool": "database/sql",
- "sql.NullFloat64": "database/sql",
- "sql.NullInt64": "database/sql",
- "sql.NullString": "database/sql",
- "sql.Open": "database/sql",
- "sql.Out": "database/sql",
- "sql.RawBytes": "database/sql",
- "sql.Register": "database/sql",
- "sql.Result": "database/sql",
- "sql.Row": "database/sql",
- "sql.Rows": "database/sql",
- "sql.Scanner": "database/sql",
- "sql.Stmt": "database/sql",
- "sql.Tx": "database/sql",
- "sql.TxOptions": "database/sql",
- "strconv.AppendBool": "strconv",
- "strconv.AppendFloat": "strconv",
- "strconv.AppendInt": "strconv",
- "strconv.AppendQuote": "strconv",
- "strconv.AppendQuoteRune": "strconv",
- "strconv.AppendQuoteRuneToASCII": "strconv",
- "strconv.AppendQuoteRuneToGraphic": "strconv",
- "strconv.AppendQuoteToASCII": "strconv",
- "strconv.AppendQuoteToGraphic": "strconv",
- "strconv.AppendUint": "strconv",
- "strconv.Atoi": "strconv",
- "strconv.CanBackquote": "strconv",
- "strconv.ErrRange": "strconv",
- "strconv.ErrSyntax": "strconv",
- "strconv.FormatBool": "strconv",
- "strconv.FormatFloat": "strconv",
- "strconv.FormatInt": "strconv",
- "strconv.FormatUint": "strconv",
- "strconv.IntSize": "strconv",
- "strconv.IsGraphic": "strconv",
- "strconv.IsPrint": "strconv",
- "strconv.Itoa": "strconv",
- "strconv.NumError": "strconv",
- "strconv.ParseBool": "strconv",
- "strconv.ParseFloat": "strconv",
- "strconv.ParseInt": "strconv",
- "strconv.ParseUint": "strconv",
- "strconv.Quote": "strconv",
- "strconv.QuoteRune": "strconv",
- "strconv.QuoteRuneToASCII": "strconv",
- "strconv.QuoteRuneToGraphic": "strconv",
- "strconv.QuoteToASCII": "strconv",
- "strconv.QuoteToGraphic": "strconv",
- "strconv.Unquote": "strconv",
- "strconv.UnquoteChar": "strconv",
- "strings.Compare": "strings",
- "strings.Contains": "strings",
- "strings.ContainsAny": "strings",
- "strings.ContainsRune": "strings",
- "strings.Count": "strings",
- "strings.EqualFold": "strings",
- "strings.Fields": "strings",
- "strings.FieldsFunc": "strings",
- "strings.HasPrefix": "strings",
- "strings.HasSuffix": "strings",
- "strings.Index": "strings",
- "strings.IndexAny": "strings",
- "strings.IndexByte": "strings",
- "strings.IndexFunc": "strings",
- "strings.IndexRune": "strings",
- "strings.Join": "strings",
- "strings.LastIndex": "strings",
- "strings.LastIndexAny": "strings",
- "strings.LastIndexByte": "strings",
- "strings.LastIndexFunc": "strings",
- "strings.Map": "strings",
- "strings.NewReader": "strings",
- "strings.NewReplacer": "strings",
- "strings.Reader": "strings",
- "strings.Repeat": "strings",
- "strings.Replace": "strings",
- "strings.Replacer": "strings",
- "strings.Split": "strings",
- "strings.SplitAfter": "strings",
- "strings.SplitAfterN": "strings",
- "strings.SplitN": "strings",
- "strings.Title": "strings",
- "strings.ToLower": "strings",
- "strings.ToLowerSpecial": "strings",
- "strings.ToTitle": "strings",
- "strings.ToTitleSpecial": "strings",
- "strings.ToUpper": "strings",
- "strings.ToUpperSpecial": "strings",
- "strings.Trim": "strings",
- "strings.TrimFunc": "strings",
- "strings.TrimLeft": "strings",
- "strings.TrimLeftFunc": "strings",
- "strings.TrimPrefix": "strings",
- "strings.TrimRight": "strings",
- "strings.TrimRightFunc": "strings",
- "strings.TrimSpace": "strings",
- "strings.TrimSuffix": "strings",
- "subtle.ConstantTimeByteEq": "crypto/subtle",
- "subtle.ConstantTimeCompare": "crypto/subtle",
- "subtle.ConstantTimeCopy": "crypto/subtle",
- "subtle.ConstantTimeEq": "crypto/subtle",
- "subtle.ConstantTimeLessOrEq": "crypto/subtle",
- "subtle.ConstantTimeSelect": "crypto/subtle",
- "suffixarray.Index": "index/suffixarray",
- "suffixarray.New": "index/suffixarray",
- "sync.Cond": "sync",
- "sync.Locker": "sync",
- "sync.Map": "sync",
- "sync.Mutex": "sync",
- "sync.NewCond": "sync",
- "sync.Once": "sync",
- "sync.Pool": "sync",
- "sync.RWMutex": "sync",
- "sync.WaitGroup": "sync",
- "syntax.ClassNL": "regexp/syntax",
- "syntax.Compile": "regexp/syntax",
- "syntax.DotNL": "regexp/syntax",
- "syntax.EmptyBeginLine": "regexp/syntax",
- "syntax.EmptyBeginText": "regexp/syntax",
- "syntax.EmptyEndLine": "regexp/syntax",
- "syntax.EmptyEndText": "regexp/syntax",
- "syntax.EmptyNoWordBoundary": "regexp/syntax",
- "syntax.EmptyOp": "regexp/syntax",
- "syntax.EmptyOpContext": "regexp/syntax",
- "syntax.EmptyWordBoundary": "regexp/syntax",
- "syntax.ErrInternalError": "regexp/syntax",
- "syntax.ErrInvalidCharClass": "regexp/syntax",
- "syntax.ErrInvalidCharRange": "regexp/syntax",
- "syntax.ErrInvalidEscape": "regexp/syntax",
- "syntax.ErrInvalidNamedCapture": "regexp/syntax",
- "syntax.ErrInvalidPerlOp": "regexp/syntax",
- "syntax.ErrInvalidRepeatOp": "regexp/syntax",
- "syntax.ErrInvalidRepeatSize": "regexp/syntax",
- "syntax.ErrInvalidUTF8": "regexp/syntax",
- "syntax.ErrMissingBracket": "regexp/syntax",
- "syntax.ErrMissingParen": "regexp/syntax",
- "syntax.ErrMissingRepeatArgument": "regexp/syntax",
- "syntax.ErrTrailingBackslash": "regexp/syntax",
- "syntax.ErrUnexpectedParen": "regexp/syntax",
- "syntax.Error": "regexp/syntax",
- "syntax.ErrorCode": "regexp/syntax",
- "syntax.Flags": "regexp/syntax",
- "syntax.FoldCase": "regexp/syntax",
- "syntax.Inst": "regexp/syntax",
- "syntax.InstAlt": "regexp/syntax",
- "syntax.InstAltMatch": "regexp/syntax",
- "syntax.InstCapture": "regexp/syntax",
- "syntax.InstEmptyWidth": "regexp/syntax",
- "syntax.InstFail": "regexp/syntax",
- "syntax.InstMatch": "regexp/syntax",
- "syntax.InstNop": "regexp/syntax",
- "syntax.InstOp": "regexp/syntax",
- "syntax.InstRune": "regexp/syntax",
- "syntax.InstRune1": "regexp/syntax",
- "syntax.InstRuneAny": "regexp/syntax",
- "syntax.InstRuneAnyNotNL": "regexp/syntax",
- "syntax.IsWordChar": "regexp/syntax",
- "syntax.Literal": "regexp/syntax",
- "syntax.MatchNL": "regexp/syntax",
- "syntax.NonGreedy": "regexp/syntax",
- "syntax.OneLine": "regexp/syntax",
- "syntax.Op": "regexp/syntax",
- "syntax.OpAlternate": "regexp/syntax",
- "syntax.OpAnyChar": "regexp/syntax",
- "syntax.OpAnyCharNotNL": "regexp/syntax",
- "syntax.OpBeginLine": "regexp/syntax",
- "syntax.OpBeginText": "regexp/syntax",
- "syntax.OpCapture": "regexp/syntax",
- "syntax.OpCharClass": "regexp/syntax",
- "syntax.OpConcat": "regexp/syntax",
- "syntax.OpEmptyMatch": "regexp/syntax",
- "syntax.OpEndLine": "regexp/syntax",
- "syntax.OpEndText": "regexp/syntax",
- "syntax.OpLiteral": "regexp/syntax",
- "syntax.OpNoMatch": "regexp/syntax",
- "syntax.OpNoWordBoundary": "regexp/syntax",
- "syntax.OpPlus": "regexp/syntax",
- "syntax.OpQuest": "regexp/syntax",
- "syntax.OpRepeat": "regexp/syntax",
- "syntax.OpStar": "regexp/syntax",
- "syntax.OpWordBoundary": "regexp/syntax",
- "syntax.POSIX": "regexp/syntax",
- "syntax.Parse": "regexp/syntax",
- "syntax.Perl": "regexp/syntax",
- "syntax.PerlX": "regexp/syntax",
- "syntax.Prog": "regexp/syntax",
- "syntax.Regexp": "regexp/syntax",
- "syntax.Simple": "regexp/syntax",
- "syntax.UnicodeGroups": "regexp/syntax",
- "syntax.WasDollar": "regexp/syntax",
- "syscall.AF_ALG": "syscall",
- "syscall.AF_APPLETALK": "syscall",
- "syscall.AF_ARP": "syscall",
- "syscall.AF_ASH": "syscall",
- "syscall.AF_ATM": "syscall",
- "syscall.AF_ATMPVC": "syscall",
- "syscall.AF_ATMSVC": "syscall",
- "syscall.AF_AX25": "syscall",
- "syscall.AF_BLUETOOTH": "syscall",
- "syscall.AF_BRIDGE": "syscall",
- "syscall.AF_CAIF": "syscall",
- "syscall.AF_CAN": "syscall",
- "syscall.AF_CCITT": "syscall",
- "syscall.AF_CHAOS": "syscall",
- "syscall.AF_CNT": "syscall",
- "syscall.AF_COIP": "syscall",
- "syscall.AF_DATAKIT": "syscall",
- "syscall.AF_DECnet": "syscall",
- "syscall.AF_DLI": "syscall",
- "syscall.AF_E164": "syscall",
- "syscall.AF_ECMA": "syscall",
- "syscall.AF_ECONET": "syscall",
- "syscall.AF_ENCAP": "syscall",
- "syscall.AF_FILE": "syscall",
- "syscall.AF_HYLINK": "syscall",
- "syscall.AF_IEEE80211": "syscall",
- "syscall.AF_IEEE802154": "syscall",
- "syscall.AF_IMPLINK": "syscall",
- "syscall.AF_INET": "syscall",
- "syscall.AF_INET6": "syscall",
- "syscall.AF_INET6_SDP": "syscall",
- "syscall.AF_INET_SDP": "syscall",
- "syscall.AF_IPX": "syscall",
- "syscall.AF_IRDA": "syscall",
- "syscall.AF_ISDN": "syscall",
- "syscall.AF_ISO": "syscall",
- "syscall.AF_IUCV": "syscall",
- "syscall.AF_KEY": "syscall",
- "syscall.AF_LAT": "syscall",
- "syscall.AF_LINK": "syscall",
- "syscall.AF_LLC": "syscall",
- "syscall.AF_LOCAL": "syscall",
- "syscall.AF_MAX": "syscall",
- "syscall.AF_MPLS": "syscall",
- "syscall.AF_NATM": "syscall",
- "syscall.AF_NDRV": "syscall",
- "syscall.AF_NETBEUI": "syscall",
- "syscall.AF_NETBIOS": "syscall",
- "syscall.AF_NETGRAPH": "syscall",
- "syscall.AF_NETLINK": "syscall",
- "syscall.AF_NETROM": "syscall",
- "syscall.AF_NS": "syscall",
- "syscall.AF_OROUTE": "syscall",
- "syscall.AF_OSI": "syscall",
- "syscall.AF_PACKET": "syscall",
- "syscall.AF_PHONET": "syscall",
- "syscall.AF_PPP": "syscall",
- "syscall.AF_PPPOX": "syscall",
- "syscall.AF_PUP": "syscall",
- "syscall.AF_RDS": "syscall",
- "syscall.AF_RESERVED_36": "syscall",
- "syscall.AF_ROSE": "syscall",
- "syscall.AF_ROUTE": "syscall",
- "syscall.AF_RXRPC": "syscall",
- "syscall.AF_SCLUSTER": "syscall",
- "syscall.AF_SECURITY": "syscall",
- "syscall.AF_SIP": "syscall",
- "syscall.AF_SLOW": "syscall",
- "syscall.AF_SNA": "syscall",
- "syscall.AF_SYSTEM": "syscall",
- "syscall.AF_TIPC": "syscall",
- "syscall.AF_UNIX": "syscall",
- "syscall.AF_UNSPEC": "syscall",
- "syscall.AF_VENDOR00": "syscall",
- "syscall.AF_VENDOR01": "syscall",
- "syscall.AF_VENDOR02": "syscall",
- "syscall.AF_VENDOR03": "syscall",
- "syscall.AF_VENDOR04": "syscall",
- "syscall.AF_VENDOR05": "syscall",
- "syscall.AF_VENDOR06": "syscall",
- "syscall.AF_VENDOR07": "syscall",
- "syscall.AF_VENDOR08": "syscall",
- "syscall.AF_VENDOR09": "syscall",
- "syscall.AF_VENDOR10": "syscall",
- "syscall.AF_VENDOR11": "syscall",
- "syscall.AF_VENDOR12": "syscall",
- "syscall.AF_VENDOR13": "syscall",
- "syscall.AF_VENDOR14": "syscall",
- "syscall.AF_VENDOR15": "syscall",
- "syscall.AF_VENDOR16": "syscall",
- "syscall.AF_VENDOR17": "syscall",
- "syscall.AF_VENDOR18": "syscall",
- "syscall.AF_VENDOR19": "syscall",
- "syscall.AF_VENDOR20": "syscall",
- "syscall.AF_VENDOR21": "syscall",
- "syscall.AF_VENDOR22": "syscall",
- "syscall.AF_VENDOR23": "syscall",
- "syscall.AF_VENDOR24": "syscall",
- "syscall.AF_VENDOR25": "syscall",
- "syscall.AF_VENDOR26": "syscall",
- "syscall.AF_VENDOR27": "syscall",
- "syscall.AF_VENDOR28": "syscall",
- "syscall.AF_VENDOR29": "syscall",
- "syscall.AF_VENDOR30": "syscall",
- "syscall.AF_VENDOR31": "syscall",
- "syscall.AF_VENDOR32": "syscall",
- "syscall.AF_VENDOR33": "syscall",
- "syscall.AF_VENDOR34": "syscall",
- "syscall.AF_VENDOR35": "syscall",
- "syscall.AF_VENDOR36": "syscall",
- "syscall.AF_VENDOR37": "syscall",
- "syscall.AF_VENDOR38": "syscall",
- "syscall.AF_VENDOR39": "syscall",
- "syscall.AF_VENDOR40": "syscall",
- "syscall.AF_VENDOR41": "syscall",
- "syscall.AF_VENDOR42": "syscall",
- "syscall.AF_VENDOR43": "syscall",
- "syscall.AF_VENDOR44": "syscall",
- "syscall.AF_VENDOR45": "syscall",
- "syscall.AF_VENDOR46": "syscall",
- "syscall.AF_VENDOR47": "syscall",
- "syscall.AF_WANPIPE": "syscall",
- "syscall.AF_X25": "syscall",
- "syscall.AI_CANONNAME": "syscall",
- "syscall.AI_NUMERICHOST": "syscall",
- "syscall.AI_PASSIVE": "syscall",
- "syscall.APPLICATION_ERROR": "syscall",
- "syscall.ARPHRD_ADAPT": "syscall",
- "syscall.ARPHRD_APPLETLK": "syscall",
- "syscall.ARPHRD_ARCNET": "syscall",
- "syscall.ARPHRD_ASH": "syscall",
- "syscall.ARPHRD_ATM": "syscall",
- "syscall.ARPHRD_AX25": "syscall",
- "syscall.ARPHRD_BIF": "syscall",
- "syscall.ARPHRD_CHAOS": "syscall",
- "syscall.ARPHRD_CISCO": "syscall",
- "syscall.ARPHRD_CSLIP": "syscall",
- "syscall.ARPHRD_CSLIP6": "syscall",
- "syscall.ARPHRD_DDCMP": "syscall",
- "syscall.ARPHRD_DLCI": "syscall",
- "syscall.ARPHRD_ECONET": "syscall",
- "syscall.ARPHRD_EETHER": "syscall",
- "syscall.ARPHRD_ETHER": "syscall",
- "syscall.ARPHRD_EUI64": "syscall",
- "syscall.ARPHRD_FCAL": "syscall",
- "syscall.ARPHRD_FCFABRIC": "syscall",
- "syscall.ARPHRD_FCPL": "syscall",
- "syscall.ARPHRD_FCPP": "syscall",
- "syscall.ARPHRD_FDDI": "syscall",
- "syscall.ARPHRD_FRAD": "syscall",
- "syscall.ARPHRD_FRELAY": "syscall",
- "syscall.ARPHRD_HDLC": "syscall",
- "syscall.ARPHRD_HIPPI": "syscall",
- "syscall.ARPHRD_HWX25": "syscall",
- "syscall.ARPHRD_IEEE1394": "syscall",
- "syscall.ARPHRD_IEEE802": "syscall",
- "syscall.ARPHRD_IEEE80211": "syscall",
- "syscall.ARPHRD_IEEE80211_PRISM": "syscall",
- "syscall.ARPHRD_IEEE80211_RADIOTAP": "syscall",
- "syscall.ARPHRD_IEEE802154": "syscall",
- "syscall.ARPHRD_IEEE802154_PHY": "syscall",
- "syscall.ARPHRD_IEEE802_TR": "syscall",
- "syscall.ARPHRD_INFINIBAND": "syscall",
- "syscall.ARPHRD_IPDDP": "syscall",
- "syscall.ARPHRD_IPGRE": "syscall",
- "syscall.ARPHRD_IRDA": "syscall",
- "syscall.ARPHRD_LAPB": "syscall",
- "syscall.ARPHRD_LOCALTLK": "syscall",
- "syscall.ARPHRD_LOOPBACK": "syscall",
- "syscall.ARPHRD_METRICOM": "syscall",
- "syscall.ARPHRD_NETROM": "syscall",
- "syscall.ARPHRD_NONE": "syscall",
- "syscall.ARPHRD_PIMREG": "syscall",
- "syscall.ARPHRD_PPP": "syscall",
- "syscall.ARPHRD_PRONET": "syscall",
- "syscall.ARPHRD_RAWHDLC": "syscall",
- "syscall.ARPHRD_ROSE": "syscall",
- "syscall.ARPHRD_RSRVD": "syscall",
- "syscall.ARPHRD_SIT": "syscall",
- "syscall.ARPHRD_SKIP": "syscall",
- "syscall.ARPHRD_SLIP": "syscall",
- "syscall.ARPHRD_SLIP6": "syscall",
- "syscall.ARPHRD_STRIP": "syscall",
- "syscall.ARPHRD_TUNNEL": "syscall",
- "syscall.ARPHRD_TUNNEL6": "syscall",
- "syscall.ARPHRD_VOID": "syscall",
- "syscall.ARPHRD_X25": "syscall",
- "syscall.AUTHTYPE_CLIENT": "syscall",
- "syscall.AUTHTYPE_SERVER": "syscall",
- "syscall.Accept": "syscall",
- "syscall.Accept4": "syscall",
- "syscall.AcceptEx": "syscall",
- "syscall.Access": "syscall",
- "syscall.Acct": "syscall",
- "syscall.AddrinfoW": "syscall",
- "syscall.Adjtime": "syscall",
- "syscall.Adjtimex": "syscall",
- "syscall.AttachLsf": "syscall",
- "syscall.B0": "syscall",
- "syscall.B1000000": "syscall",
- "syscall.B110": "syscall",
- "syscall.B115200": "syscall",
- "syscall.B1152000": "syscall",
- "syscall.B1200": "syscall",
- "syscall.B134": "syscall",
- "syscall.B14400": "syscall",
- "syscall.B150": "syscall",
- "syscall.B1500000": "syscall",
- "syscall.B1800": "syscall",
- "syscall.B19200": "syscall",
- "syscall.B200": "syscall",
- "syscall.B2000000": "syscall",
- "syscall.B230400": "syscall",
- "syscall.B2400": "syscall",
- "syscall.B2500000": "syscall",
- "syscall.B28800": "syscall",
- "syscall.B300": "syscall",
- "syscall.B3000000": "syscall",
- "syscall.B3500000": "syscall",
- "syscall.B38400": "syscall",
- "syscall.B4000000": "syscall",
- "syscall.B460800": "syscall",
- "syscall.B4800": "syscall",
- "syscall.B50": "syscall",
- "syscall.B500000": "syscall",
- "syscall.B57600": "syscall",
- "syscall.B576000": "syscall",
- "syscall.B600": "syscall",
- "syscall.B7200": "syscall",
- "syscall.B75": "syscall",
- "syscall.B76800": "syscall",
- "syscall.B921600": "syscall",
- "syscall.B9600": "syscall",
- "syscall.BASE_PROTOCOL": "syscall",
- "syscall.BIOCFEEDBACK": "syscall",
- "syscall.BIOCFLUSH": "syscall",
- "syscall.BIOCGBLEN": "syscall",
- "syscall.BIOCGDIRECTION": "syscall",
- "syscall.BIOCGDIRFILT": "syscall",
- "syscall.BIOCGDLT": "syscall",
- "syscall.BIOCGDLTLIST": "syscall",
- "syscall.BIOCGETBUFMODE": "syscall",
- "syscall.BIOCGETIF": "syscall",
- "syscall.BIOCGETZMAX": "syscall",
- "syscall.BIOCGFEEDBACK": "syscall",
- "syscall.BIOCGFILDROP": "syscall",
- "syscall.BIOCGHDRCMPLT": "syscall",
- "syscall.BIOCGRSIG": "syscall",
- "syscall.BIOCGRTIMEOUT": "syscall",
- "syscall.BIOCGSEESENT": "syscall",
- "syscall.BIOCGSTATS": "syscall",
- "syscall.BIOCGSTATSOLD": "syscall",
- "syscall.BIOCGTSTAMP": "syscall",
- "syscall.BIOCIMMEDIATE": "syscall",
- "syscall.BIOCLOCK": "syscall",
- "syscall.BIOCPROMISC": "syscall",
- "syscall.BIOCROTZBUF": "syscall",
- "syscall.BIOCSBLEN": "syscall",
- "syscall.BIOCSDIRECTION": "syscall",
- "syscall.BIOCSDIRFILT": "syscall",
- "syscall.BIOCSDLT": "syscall",
- "syscall.BIOCSETBUFMODE": "syscall",
- "syscall.BIOCSETF": "syscall",
- "syscall.BIOCSETFNR": "syscall",
- "syscall.BIOCSETIF": "syscall",
- "syscall.BIOCSETWF": "syscall",
- "syscall.BIOCSETZBUF": "syscall",
- "syscall.BIOCSFEEDBACK": "syscall",
- "syscall.BIOCSFILDROP": "syscall",
- "syscall.BIOCSHDRCMPLT": "syscall",
- "syscall.BIOCSRSIG": "syscall",
- "syscall.BIOCSRTIMEOUT": "syscall",
- "syscall.BIOCSSEESENT": "syscall",
- "syscall.BIOCSTCPF": "syscall",
- "syscall.BIOCSTSTAMP": "syscall",
- "syscall.BIOCSUDPF": "syscall",
- "syscall.BIOCVERSION": "syscall",
- "syscall.BPF_A": "syscall",
- "syscall.BPF_ABS": "syscall",
- "syscall.BPF_ADD": "syscall",
- "syscall.BPF_ALIGNMENT": "syscall",
- "syscall.BPF_ALIGNMENT32": "syscall",
- "syscall.BPF_ALU": "syscall",
- "syscall.BPF_AND": "syscall",
- "syscall.BPF_B": "syscall",
- "syscall.BPF_BUFMODE_BUFFER": "syscall",
- "syscall.BPF_BUFMODE_ZBUF": "syscall",
- "syscall.BPF_DFLTBUFSIZE": "syscall",
- "syscall.BPF_DIRECTION_IN": "syscall",
- "syscall.BPF_DIRECTION_OUT": "syscall",
- "syscall.BPF_DIV": "syscall",
- "syscall.BPF_H": "syscall",
- "syscall.BPF_IMM": "syscall",
- "syscall.BPF_IND": "syscall",
- "syscall.BPF_JA": "syscall",
- "syscall.BPF_JEQ": "syscall",
- "syscall.BPF_JGE": "syscall",
- "syscall.BPF_JGT": "syscall",
- "syscall.BPF_JMP": "syscall",
- "syscall.BPF_JSET": "syscall",
- "syscall.BPF_K": "syscall",
- "syscall.BPF_LD": "syscall",
- "syscall.BPF_LDX": "syscall",
- "syscall.BPF_LEN": "syscall",
- "syscall.BPF_LSH": "syscall",
- "syscall.BPF_MAJOR_VERSION": "syscall",
- "syscall.BPF_MAXBUFSIZE": "syscall",
- "syscall.BPF_MAXINSNS": "syscall",
- "syscall.BPF_MEM": "syscall",
- "syscall.BPF_MEMWORDS": "syscall",
- "syscall.BPF_MINBUFSIZE": "syscall",
- "syscall.BPF_MINOR_VERSION": "syscall",
- "syscall.BPF_MISC": "syscall",
- "syscall.BPF_MSH": "syscall",
- "syscall.BPF_MUL": "syscall",
- "syscall.BPF_NEG": "syscall",
- "syscall.BPF_OR": "syscall",
- "syscall.BPF_RELEASE": "syscall",
- "syscall.BPF_RET": "syscall",
- "syscall.BPF_RSH": "syscall",
- "syscall.BPF_ST": "syscall",
- "syscall.BPF_STX": "syscall",
- "syscall.BPF_SUB": "syscall",
- "syscall.BPF_TAX": "syscall",
- "syscall.BPF_TXA": "syscall",
- "syscall.BPF_T_BINTIME": "syscall",
- "syscall.BPF_T_BINTIME_FAST": "syscall",
- "syscall.BPF_T_BINTIME_MONOTONIC": "syscall",
- "syscall.BPF_T_BINTIME_MONOTONIC_FAST": "syscall",
- "syscall.BPF_T_FAST": "syscall",
- "syscall.BPF_T_FLAG_MASK": "syscall",
- "syscall.BPF_T_FORMAT_MASK": "syscall",
- "syscall.BPF_T_MICROTIME": "syscall",
- "syscall.BPF_T_MICROTIME_FAST": "syscall",
- "syscall.BPF_T_MICROTIME_MONOTONIC": "syscall",
- "syscall.BPF_T_MICROTIME_MONOTONIC_FAST": "syscall",
- "syscall.BPF_T_MONOTONIC": "syscall",
- "syscall.BPF_T_MONOTONIC_FAST": "syscall",
- "syscall.BPF_T_NANOTIME": "syscall",
- "syscall.BPF_T_NANOTIME_FAST": "syscall",
- "syscall.BPF_T_NANOTIME_MONOTONIC": "syscall",
- "syscall.BPF_T_NANOTIME_MONOTONIC_FAST": "syscall",
- "syscall.BPF_T_NONE": "syscall",
- "syscall.BPF_T_NORMAL": "syscall",
- "syscall.BPF_W": "syscall",
- "syscall.BPF_X": "syscall",
- "syscall.BRKINT": "syscall",
- "syscall.Bind": "syscall",
- "syscall.BindToDevice": "syscall",
- "syscall.BpfBuflen": "syscall",
- "syscall.BpfDatalink": "syscall",
- "syscall.BpfHdr": "syscall",
- "syscall.BpfHeadercmpl": "syscall",
- "syscall.BpfInsn": "syscall",
- "syscall.BpfInterface": "syscall",
- "syscall.BpfJump": "syscall",
- "syscall.BpfProgram": "syscall",
- "syscall.BpfStat": "syscall",
- "syscall.BpfStats": "syscall",
- "syscall.BpfStmt": "syscall",
- "syscall.BpfTimeout": "syscall",
- "syscall.BpfTimeval": "syscall",
- "syscall.BpfVersion": "syscall",
- "syscall.BpfZbuf": "syscall",
- "syscall.BpfZbufHeader": "syscall",
- "syscall.ByHandleFileInformation": "syscall",
- "syscall.BytePtrFromString": "syscall",
- "syscall.ByteSliceFromString": "syscall",
- "syscall.CCR0_FLUSH": "syscall",
- "syscall.CERT_CHAIN_POLICY_AUTHENTICODE": "syscall",
- "syscall.CERT_CHAIN_POLICY_AUTHENTICODE_TS": "syscall",
- "syscall.CERT_CHAIN_POLICY_BASE": "syscall",
- "syscall.CERT_CHAIN_POLICY_BASIC_CONSTRAINTS": "syscall",
- "syscall.CERT_CHAIN_POLICY_EV": "syscall",
- "syscall.CERT_CHAIN_POLICY_MICROSOFT_ROOT": "syscall",
- "syscall.CERT_CHAIN_POLICY_NT_AUTH": "syscall",
- "syscall.CERT_CHAIN_POLICY_SSL": "syscall",
- "syscall.CERT_E_CN_NO_MATCH": "syscall",
- "syscall.CERT_E_EXPIRED": "syscall",
- "syscall.CERT_E_PURPOSE": "syscall",
- "syscall.CERT_E_ROLE": "syscall",
- "syscall.CERT_E_UNTRUSTEDROOT": "syscall",
- "syscall.CERT_STORE_ADD_ALWAYS": "syscall",
- "syscall.CERT_STORE_DEFER_CLOSE_UNTIL_LAST_FREE_FLAG": "syscall",
- "syscall.CERT_STORE_PROV_MEMORY": "syscall",
- "syscall.CERT_TRUST_HAS_EXCLUDED_NAME_CONSTRAINT": "syscall",
- "syscall.CERT_TRUST_HAS_NOT_DEFINED_NAME_CONSTRAINT": "syscall",
- "syscall.CERT_TRUST_HAS_NOT_PERMITTED_NAME_CONSTRAINT": "syscall",
- "syscall.CERT_TRUST_HAS_NOT_SUPPORTED_CRITICAL_EXT": "syscall",
- "syscall.CERT_TRUST_HAS_NOT_SUPPORTED_NAME_CONSTRAINT": "syscall",
- "syscall.CERT_TRUST_INVALID_BASIC_CONSTRAINTS": "syscall",
- "syscall.CERT_TRUST_INVALID_EXTENSION": "syscall",
- "syscall.CERT_TRUST_INVALID_NAME_CONSTRAINTS": "syscall",
- "syscall.CERT_TRUST_INVALID_POLICY_CONSTRAINTS": "syscall",
- "syscall.CERT_TRUST_IS_CYCLIC": "syscall",
- "syscall.CERT_TRUST_IS_EXPLICIT_DISTRUST": "syscall",
- "syscall.CERT_TRUST_IS_NOT_SIGNATURE_VALID": "syscall",
- "syscall.CERT_TRUST_IS_NOT_TIME_VALID": "syscall",
- "syscall.CERT_TRUST_IS_NOT_VALID_FOR_USAGE": "syscall",
- "syscall.CERT_TRUST_IS_OFFLINE_REVOCATION": "syscall",
- "syscall.CERT_TRUST_IS_REVOKED": "syscall",
- "syscall.CERT_TRUST_IS_UNTRUSTED_ROOT": "syscall",
- "syscall.CERT_TRUST_NO_ERROR": "syscall",
- "syscall.CERT_TRUST_NO_ISSUANCE_CHAIN_POLICY": "syscall",
- "syscall.CERT_TRUST_REVOCATION_STATUS_UNKNOWN": "syscall",
- "syscall.CFLUSH": "syscall",
- "syscall.CLOCAL": "syscall",
- "syscall.CLONE_CHILD_CLEARTID": "syscall",
- "syscall.CLONE_CHILD_SETTID": "syscall",
- "syscall.CLONE_CSIGNAL": "syscall",
- "syscall.CLONE_DETACHED": "syscall",
- "syscall.CLONE_FILES": "syscall",
- "syscall.CLONE_FS": "syscall",
- "syscall.CLONE_IO": "syscall",
- "syscall.CLONE_NEWIPC": "syscall",
- "syscall.CLONE_NEWNET": "syscall",
- "syscall.CLONE_NEWNS": "syscall",
- "syscall.CLONE_NEWPID": "syscall",
- "syscall.CLONE_NEWUSER": "syscall",
- "syscall.CLONE_NEWUTS": "syscall",
- "syscall.CLONE_PARENT": "syscall",
- "syscall.CLONE_PARENT_SETTID": "syscall",
- "syscall.CLONE_PID": "syscall",
- "syscall.CLONE_PTRACE": "syscall",
- "syscall.CLONE_SETTLS": "syscall",
- "syscall.CLONE_SIGHAND": "syscall",
- "syscall.CLONE_SYSVSEM": "syscall",
- "syscall.CLONE_THREAD": "syscall",
- "syscall.CLONE_UNTRACED": "syscall",
- "syscall.CLONE_VFORK": "syscall",
- "syscall.CLONE_VM": "syscall",
- "syscall.CPUID_CFLUSH": "syscall",
- "syscall.CREAD": "syscall",
- "syscall.CREATE_ALWAYS": "syscall",
- "syscall.CREATE_NEW": "syscall",
- "syscall.CREATE_NEW_PROCESS_GROUP": "syscall",
- "syscall.CREATE_UNICODE_ENVIRONMENT": "syscall",
- "syscall.CRYPT_DEFAULT_CONTAINER_OPTIONAL": "syscall",
- "syscall.CRYPT_DELETEKEYSET": "syscall",
- "syscall.CRYPT_MACHINE_KEYSET": "syscall",
- "syscall.CRYPT_NEWKEYSET": "syscall",
- "syscall.CRYPT_SILENT": "syscall",
- "syscall.CRYPT_VERIFYCONTEXT": "syscall",
- "syscall.CS5": "syscall",
- "syscall.CS6": "syscall",
- "syscall.CS7": "syscall",
- "syscall.CS8": "syscall",
- "syscall.CSIZE": "syscall",
- "syscall.CSTART": "syscall",
- "syscall.CSTATUS": "syscall",
- "syscall.CSTOP": "syscall",
- "syscall.CSTOPB": "syscall",
- "syscall.CSUSP": "syscall",
- "syscall.CTL_MAXNAME": "syscall",
- "syscall.CTL_NET": "syscall",
- "syscall.CTL_QUERY": "syscall",
- "syscall.CTRL_BREAK_EVENT": "syscall",
- "syscall.CTRL_C_EVENT": "syscall",
- "syscall.CancelIo": "syscall",
- "syscall.CancelIoEx": "syscall",
- "syscall.CertAddCertificateContextToStore": "syscall",
- "syscall.CertChainContext": "syscall",
- "syscall.CertChainElement": "syscall",
- "syscall.CertChainPara": "syscall",
- "syscall.CertChainPolicyPara": "syscall",
- "syscall.CertChainPolicyStatus": "syscall",
- "syscall.CertCloseStore": "syscall",
- "syscall.CertContext": "syscall",
- "syscall.CertCreateCertificateContext": "syscall",
- "syscall.CertEnhKeyUsage": "syscall",
- "syscall.CertEnumCertificatesInStore": "syscall",
- "syscall.CertFreeCertificateChain": "syscall",
- "syscall.CertFreeCertificateContext": "syscall",
- "syscall.CertGetCertificateChain": "syscall",
- "syscall.CertOpenStore": "syscall",
- "syscall.CertOpenSystemStore": "syscall",
- "syscall.CertRevocationInfo": "syscall",
- "syscall.CertSimpleChain": "syscall",
- "syscall.CertTrustStatus": "syscall",
- "syscall.CertUsageMatch": "syscall",
- "syscall.CertVerifyCertificateChainPolicy": "syscall",
- "syscall.Chdir": "syscall",
- "syscall.CheckBpfVersion": "syscall",
- "syscall.Chflags": "syscall",
- "syscall.Chmod": "syscall",
- "syscall.Chown": "syscall",
- "syscall.Chroot": "syscall",
- "syscall.Clearenv": "syscall",
- "syscall.Close": "syscall",
- "syscall.CloseHandle": "syscall",
- "syscall.CloseOnExec": "syscall",
- "syscall.Closesocket": "syscall",
- "syscall.CmsgLen": "syscall",
- "syscall.CmsgSpace": "syscall",
- "syscall.Cmsghdr": "syscall",
- "syscall.CommandLineToArgv": "syscall",
- "syscall.ComputerName": "syscall",
- "syscall.Conn": "syscall",
- "syscall.Connect": "syscall",
- "syscall.ConnectEx": "syscall",
- "syscall.ConvertSidToStringSid": "syscall",
- "syscall.ConvertStringSidToSid": "syscall",
- "syscall.CopySid": "syscall",
- "syscall.Creat": "syscall",
- "syscall.CreateDirectory": "syscall",
- "syscall.CreateFile": "syscall",
- "syscall.CreateFileMapping": "syscall",
- "syscall.CreateHardLink": "syscall",
- "syscall.CreateIoCompletionPort": "syscall",
- "syscall.CreatePipe": "syscall",
- "syscall.CreateProcess": "syscall",
- "syscall.CreateSymbolicLink": "syscall",
- "syscall.CreateToolhelp32Snapshot": "syscall",
- "syscall.Credential": "syscall",
- "syscall.CryptAcquireContext": "syscall",
- "syscall.CryptGenRandom": "syscall",
- "syscall.CryptReleaseContext": "syscall",
- "syscall.DIOCBSFLUSH": "syscall",
- "syscall.DIOCOSFPFLUSH": "syscall",
- "syscall.DLL": "syscall",
- "syscall.DLLError": "syscall",
- "syscall.DLT_A429": "syscall",
- "syscall.DLT_A653_ICM": "syscall",
- "syscall.DLT_AIRONET_HEADER": "syscall",
- "syscall.DLT_AOS": "syscall",
- "syscall.DLT_APPLE_IP_OVER_IEEE1394": "syscall",
- "syscall.DLT_ARCNET": "syscall",
- "syscall.DLT_ARCNET_LINUX": "syscall",
- "syscall.DLT_ATM_CLIP": "syscall",
- "syscall.DLT_ATM_RFC1483": "syscall",
- "syscall.DLT_AURORA": "syscall",
- "syscall.DLT_AX25": "syscall",
- "syscall.DLT_AX25_KISS": "syscall",
- "syscall.DLT_BACNET_MS_TP": "syscall",
- "syscall.DLT_BLUETOOTH_HCI_H4": "syscall",
- "syscall.DLT_BLUETOOTH_HCI_H4_WITH_PHDR": "syscall",
- "syscall.DLT_CAN20B": "syscall",
- "syscall.DLT_CAN_SOCKETCAN": "syscall",
- "syscall.DLT_CHAOS": "syscall",
- "syscall.DLT_CHDLC": "syscall",
- "syscall.DLT_CISCO_IOS": "syscall",
- "syscall.DLT_C_HDLC": "syscall",
- "syscall.DLT_C_HDLC_WITH_DIR": "syscall",
- "syscall.DLT_DBUS": "syscall",
- "syscall.DLT_DECT": "syscall",
- "syscall.DLT_DOCSIS": "syscall",
- "syscall.DLT_DVB_CI": "syscall",
- "syscall.DLT_ECONET": "syscall",
- "syscall.DLT_EN10MB": "syscall",
- "syscall.DLT_EN3MB": "syscall",
- "syscall.DLT_ENC": "syscall",
- "syscall.DLT_ERF": "syscall",
- "syscall.DLT_ERF_ETH": "syscall",
- "syscall.DLT_ERF_POS": "syscall",
- "syscall.DLT_FC_2": "syscall",
- "syscall.DLT_FC_2_WITH_FRAME_DELIMS": "syscall",
- "syscall.DLT_FDDI": "syscall",
- "syscall.DLT_FLEXRAY": "syscall",
- "syscall.DLT_FRELAY": "syscall",
- "syscall.DLT_FRELAY_WITH_DIR": "syscall",
- "syscall.DLT_GCOM_SERIAL": "syscall",
- "syscall.DLT_GCOM_T1E1": "syscall",
- "syscall.DLT_GPF_F": "syscall",
- "syscall.DLT_GPF_T": "syscall",
- "syscall.DLT_GPRS_LLC": "syscall",
- "syscall.DLT_GSMTAP_ABIS": "syscall",
- "syscall.DLT_GSMTAP_UM": "syscall",
- "syscall.DLT_HDLC": "syscall",
- "syscall.DLT_HHDLC": "syscall",
- "syscall.DLT_HIPPI": "syscall",
- "syscall.DLT_IBM_SN": "syscall",
- "syscall.DLT_IBM_SP": "syscall",
- "syscall.DLT_IEEE802": "syscall",
- "syscall.DLT_IEEE802_11": "syscall",
- "syscall.DLT_IEEE802_11_RADIO": "syscall",
- "syscall.DLT_IEEE802_11_RADIO_AVS": "syscall",
- "syscall.DLT_IEEE802_15_4": "syscall",
- "syscall.DLT_IEEE802_15_4_LINUX": "syscall",
- "syscall.DLT_IEEE802_15_4_NOFCS": "syscall",
- "syscall.DLT_IEEE802_15_4_NONASK_PHY": "syscall",
- "syscall.DLT_IEEE802_16_MAC_CPS": "syscall",
- "syscall.DLT_IEEE802_16_MAC_CPS_RADIO": "syscall",
- "syscall.DLT_IPFILTER": "syscall",
- "syscall.DLT_IPMB": "syscall",
- "syscall.DLT_IPMB_LINUX": "syscall",
- "syscall.DLT_IPNET": "syscall",
- "syscall.DLT_IPOIB": "syscall",
- "syscall.DLT_IPV4": "syscall",
- "syscall.DLT_IPV6": "syscall",
- "syscall.DLT_IP_OVER_FC": "syscall",
- "syscall.DLT_JUNIPER_ATM1": "syscall",
- "syscall.DLT_JUNIPER_ATM2": "syscall",
- "syscall.DLT_JUNIPER_ATM_CEMIC": "syscall",
- "syscall.DLT_JUNIPER_CHDLC": "syscall",
- "syscall.DLT_JUNIPER_ES": "syscall",
- "syscall.DLT_JUNIPER_ETHER": "syscall",
- "syscall.DLT_JUNIPER_FIBRECHANNEL": "syscall",
- "syscall.DLT_JUNIPER_FRELAY": "syscall",
- "syscall.DLT_JUNIPER_GGSN": "syscall",
- "syscall.DLT_JUNIPER_ISM": "syscall",
- "syscall.DLT_JUNIPER_MFR": "syscall",
- "syscall.DLT_JUNIPER_MLFR": "syscall",
- "syscall.DLT_JUNIPER_MLPPP": "syscall",
- "syscall.DLT_JUNIPER_MONITOR": "syscall",
- "syscall.DLT_JUNIPER_PIC_PEER": "syscall",
- "syscall.DLT_JUNIPER_PPP": "syscall",
- "syscall.DLT_JUNIPER_PPPOE": "syscall",
- "syscall.DLT_JUNIPER_PPPOE_ATM": "syscall",
- "syscall.DLT_JUNIPER_SERVICES": "syscall",
- "syscall.DLT_JUNIPER_SRX_E2E": "syscall",
- "syscall.DLT_JUNIPER_ST": "syscall",
- "syscall.DLT_JUNIPER_VP": "syscall",
- "syscall.DLT_JUNIPER_VS": "syscall",
- "syscall.DLT_LAPB_WITH_DIR": "syscall",
- "syscall.DLT_LAPD": "syscall",
- "syscall.DLT_LIN": "syscall",
- "syscall.DLT_LINUX_EVDEV": "syscall",
- "syscall.DLT_LINUX_IRDA": "syscall",
- "syscall.DLT_LINUX_LAPD": "syscall",
- "syscall.DLT_LINUX_PPP_WITHDIRECTION": "syscall",
- "syscall.DLT_LINUX_SLL": "syscall",
- "syscall.DLT_LOOP": "syscall",
- "syscall.DLT_LTALK": "syscall",
- "syscall.DLT_MATCHING_MAX": "syscall",
- "syscall.DLT_MATCHING_MIN": "syscall",
- "syscall.DLT_MFR": "syscall",
- "syscall.DLT_MOST": "syscall",
- "syscall.DLT_MPEG_2_TS": "syscall",
- "syscall.DLT_MPLS": "syscall",
- "syscall.DLT_MTP2": "syscall",
- "syscall.DLT_MTP2_WITH_PHDR": "syscall",
- "syscall.DLT_MTP3": "syscall",
- "syscall.DLT_MUX27010": "syscall",
- "syscall.DLT_NETANALYZER": "syscall",
- "syscall.DLT_NETANALYZER_TRANSPARENT": "syscall",
- "syscall.DLT_NFC_LLCP": "syscall",
- "syscall.DLT_NFLOG": "syscall",
- "syscall.DLT_NG40": "syscall",
- "syscall.DLT_NULL": "syscall",
- "syscall.DLT_PCI_EXP": "syscall",
- "syscall.DLT_PFLOG": "syscall",
- "syscall.DLT_PFSYNC": "syscall",
- "syscall.DLT_PPI": "syscall",
- "syscall.DLT_PPP": "syscall",
- "syscall.DLT_PPP_BSDOS": "syscall",
- "syscall.DLT_PPP_ETHER": "syscall",
- "syscall.DLT_PPP_PPPD": "syscall",
- "syscall.DLT_PPP_SERIAL": "syscall",
- "syscall.DLT_PPP_WITH_DIR": "syscall",
- "syscall.DLT_PPP_WITH_DIRECTION": "syscall",
- "syscall.DLT_PRISM_HEADER": "syscall",
- "syscall.DLT_PRONET": "syscall",
- "syscall.DLT_RAIF1": "syscall",
- "syscall.DLT_RAW": "syscall",
- "syscall.DLT_RAWAF_MASK": "syscall",
- "syscall.DLT_RIO": "syscall",
- "syscall.DLT_SCCP": "syscall",
- "syscall.DLT_SITA": "syscall",
- "syscall.DLT_SLIP": "syscall",
- "syscall.DLT_SLIP_BSDOS": "syscall",
- "syscall.DLT_STANAG_5066_D_PDU": "syscall",
- "syscall.DLT_SUNATM": "syscall",
- "syscall.DLT_SYMANTEC_FIREWALL": "syscall",
- "syscall.DLT_TZSP": "syscall",
- "syscall.DLT_USB": "syscall",
- "syscall.DLT_USB_LINUX": "syscall",
- "syscall.DLT_USB_LINUX_MMAPPED": "syscall",
- "syscall.DLT_USER0": "syscall",
- "syscall.DLT_USER1": "syscall",
- "syscall.DLT_USER10": "syscall",
- "syscall.DLT_USER11": "syscall",
- "syscall.DLT_USER12": "syscall",
- "syscall.DLT_USER13": "syscall",
- "syscall.DLT_USER14": "syscall",
- "syscall.DLT_USER15": "syscall",
- "syscall.DLT_USER2": "syscall",
- "syscall.DLT_USER3": "syscall",
- "syscall.DLT_USER4": "syscall",
- "syscall.DLT_USER5": "syscall",
- "syscall.DLT_USER6": "syscall",
- "syscall.DLT_USER7": "syscall",
- "syscall.DLT_USER8": "syscall",
- "syscall.DLT_USER9": "syscall",
- "syscall.DLT_WIHART": "syscall",
- "syscall.DLT_X2E_SERIAL": "syscall",
- "syscall.DLT_X2E_XORAYA": "syscall",
- "syscall.DNSMXData": "syscall",
- "syscall.DNSPTRData": "syscall",
- "syscall.DNSRecord": "syscall",
- "syscall.DNSSRVData": "syscall",
- "syscall.DNSTXTData": "syscall",
- "syscall.DNS_INFO_NO_RECORDS": "syscall",
- "syscall.DNS_TYPE_A": "syscall",
- "syscall.DNS_TYPE_A6": "syscall",
- "syscall.DNS_TYPE_AAAA": "syscall",
- "syscall.DNS_TYPE_ADDRS": "syscall",
- "syscall.DNS_TYPE_AFSDB": "syscall",
- "syscall.DNS_TYPE_ALL": "syscall",
- "syscall.DNS_TYPE_ANY": "syscall",
- "syscall.DNS_TYPE_ATMA": "syscall",
- "syscall.DNS_TYPE_AXFR": "syscall",
- "syscall.DNS_TYPE_CERT": "syscall",
- "syscall.DNS_TYPE_CNAME": "syscall",
- "syscall.DNS_TYPE_DHCID": "syscall",
- "syscall.DNS_TYPE_DNAME": "syscall",
- "syscall.DNS_TYPE_DNSKEY": "syscall",
- "syscall.DNS_TYPE_DS": "syscall",
- "syscall.DNS_TYPE_EID": "syscall",
- "syscall.DNS_TYPE_GID": "syscall",
- "syscall.DNS_TYPE_GPOS": "syscall",
- "syscall.DNS_TYPE_HINFO": "syscall",
- "syscall.DNS_TYPE_ISDN": "syscall",
- "syscall.DNS_TYPE_IXFR": "syscall",
- "syscall.DNS_TYPE_KEY": "syscall",
- "syscall.DNS_TYPE_KX": "syscall",
- "syscall.DNS_TYPE_LOC": "syscall",
- "syscall.DNS_TYPE_MAILA": "syscall",
- "syscall.DNS_TYPE_MAILB": "syscall",
- "syscall.DNS_TYPE_MB": "syscall",
- "syscall.DNS_TYPE_MD": "syscall",
- "syscall.DNS_TYPE_MF": "syscall",
- "syscall.DNS_TYPE_MG": "syscall",
- "syscall.DNS_TYPE_MINFO": "syscall",
- "syscall.DNS_TYPE_MR": "syscall",
- "syscall.DNS_TYPE_MX": "syscall",
- "syscall.DNS_TYPE_NAPTR": "syscall",
- "syscall.DNS_TYPE_NBSTAT": "syscall",
- "syscall.DNS_TYPE_NIMLOC": "syscall",
- "syscall.DNS_TYPE_NS": "syscall",
- "syscall.DNS_TYPE_NSAP": "syscall",
- "syscall.DNS_TYPE_NSAPPTR": "syscall",
- "syscall.DNS_TYPE_NSEC": "syscall",
- "syscall.DNS_TYPE_NULL": "syscall",
- "syscall.DNS_TYPE_NXT": "syscall",
- "syscall.DNS_TYPE_OPT": "syscall",
- "syscall.DNS_TYPE_PTR": "syscall",
- "syscall.DNS_TYPE_PX": "syscall",
- "syscall.DNS_TYPE_RP": "syscall",
- "syscall.DNS_TYPE_RRSIG": "syscall",
- "syscall.DNS_TYPE_RT": "syscall",
- "syscall.DNS_TYPE_SIG": "syscall",
- "syscall.DNS_TYPE_SINK": "syscall",
- "syscall.DNS_TYPE_SOA": "syscall",
- "syscall.DNS_TYPE_SRV": "syscall",
- "syscall.DNS_TYPE_TEXT": "syscall",
- "syscall.DNS_TYPE_TKEY": "syscall",
- "syscall.DNS_TYPE_TSIG": "syscall",
- "syscall.DNS_TYPE_UID": "syscall",
- "syscall.DNS_TYPE_UINFO": "syscall",
- "syscall.DNS_TYPE_UNSPEC": "syscall",
- "syscall.DNS_TYPE_WINS": "syscall",
- "syscall.DNS_TYPE_WINSR": "syscall",
- "syscall.DNS_TYPE_WKS": "syscall",
- "syscall.DNS_TYPE_X25": "syscall",
- "syscall.DT_BLK": "syscall",
- "syscall.DT_CHR": "syscall",
- "syscall.DT_DIR": "syscall",
- "syscall.DT_FIFO": "syscall",
- "syscall.DT_LNK": "syscall",
- "syscall.DT_REG": "syscall",
- "syscall.DT_SOCK": "syscall",
- "syscall.DT_UNKNOWN": "syscall",
- "syscall.DT_WHT": "syscall",
- "syscall.DUPLICATE_CLOSE_SOURCE": "syscall",
- "syscall.DUPLICATE_SAME_ACCESS": "syscall",
- "syscall.DeleteFile": "syscall",
- "syscall.DetachLsf": "syscall",
- "syscall.DeviceIoControl": "syscall",
- "syscall.Dirent": "syscall",
- "syscall.DnsNameCompare": "syscall",
- "syscall.DnsQuery": "syscall",
- "syscall.DnsRecordListFree": "syscall",
- "syscall.DnsSectionAdditional": "syscall",
- "syscall.DnsSectionAnswer": "syscall",
- "syscall.DnsSectionAuthority": "syscall",
- "syscall.DnsSectionQuestion": "syscall",
- "syscall.Dup": "syscall",
- "syscall.Dup2": "syscall",
- "syscall.Dup3": "syscall",
- "syscall.DuplicateHandle": "syscall",
- "syscall.E2BIG": "syscall",
- "syscall.EACCES": "syscall",
- "syscall.EADDRINUSE": "syscall",
- "syscall.EADDRNOTAVAIL": "syscall",
- "syscall.EADV": "syscall",
- "syscall.EAFNOSUPPORT": "syscall",
- "syscall.EAGAIN": "syscall",
- "syscall.EALREADY": "syscall",
- "syscall.EAUTH": "syscall",
- "syscall.EBADARCH": "syscall",
- "syscall.EBADE": "syscall",
- "syscall.EBADEXEC": "syscall",
- "syscall.EBADF": "syscall",
- "syscall.EBADFD": "syscall",
- "syscall.EBADMACHO": "syscall",
- "syscall.EBADMSG": "syscall",
- "syscall.EBADR": "syscall",
- "syscall.EBADRPC": "syscall",
- "syscall.EBADRQC": "syscall",
- "syscall.EBADSLT": "syscall",
- "syscall.EBFONT": "syscall",
- "syscall.EBUSY": "syscall",
- "syscall.ECANCELED": "syscall",
- "syscall.ECAPMODE": "syscall",
- "syscall.ECHILD": "syscall",
- "syscall.ECHO": "syscall",
- "syscall.ECHOCTL": "syscall",
- "syscall.ECHOE": "syscall",
- "syscall.ECHOK": "syscall",
- "syscall.ECHOKE": "syscall",
- "syscall.ECHONL": "syscall",
- "syscall.ECHOPRT": "syscall",
- "syscall.ECHRNG": "syscall",
- "syscall.ECOMM": "syscall",
- "syscall.ECONNABORTED": "syscall",
- "syscall.ECONNREFUSED": "syscall",
- "syscall.ECONNRESET": "syscall",
- "syscall.EDEADLK": "syscall",
- "syscall.EDEADLOCK": "syscall",
- "syscall.EDESTADDRREQ": "syscall",
- "syscall.EDEVERR": "syscall",
- "syscall.EDOM": "syscall",
- "syscall.EDOOFUS": "syscall",
- "syscall.EDOTDOT": "syscall",
- "syscall.EDQUOT": "syscall",
- "syscall.EEXIST": "syscall",
- "syscall.EFAULT": "syscall",
- "syscall.EFBIG": "syscall",
- "syscall.EFER_LMA": "syscall",
- "syscall.EFER_LME": "syscall",
- "syscall.EFER_NXE": "syscall",
- "syscall.EFER_SCE": "syscall",
- "syscall.EFTYPE": "syscall",
- "syscall.EHOSTDOWN": "syscall",
- "syscall.EHOSTUNREACH": "syscall",
- "syscall.EHWPOISON": "syscall",
- "syscall.EIDRM": "syscall",
- "syscall.EILSEQ": "syscall",
- "syscall.EINPROGRESS": "syscall",
- "syscall.EINTR": "syscall",
- "syscall.EINVAL": "syscall",
- "syscall.EIO": "syscall",
- "syscall.EIPSEC": "syscall",
- "syscall.EISCONN": "syscall",
- "syscall.EISDIR": "syscall",
- "syscall.EISNAM": "syscall",
- "syscall.EKEYEXPIRED": "syscall",
- "syscall.EKEYREJECTED": "syscall",
- "syscall.EKEYREVOKED": "syscall",
- "syscall.EL2HLT": "syscall",
- "syscall.EL2NSYNC": "syscall",
- "syscall.EL3HLT": "syscall",
- "syscall.EL3RST": "syscall",
- "syscall.ELAST": "syscall",
- "syscall.ELF_NGREG": "syscall",
- "syscall.ELF_PRARGSZ": "syscall",
- "syscall.ELIBACC": "syscall",
- "syscall.ELIBBAD": "syscall",
- "syscall.ELIBEXEC": "syscall",
- "syscall.ELIBMAX": "syscall",
- "syscall.ELIBSCN": "syscall",
- "syscall.ELNRNG": "syscall",
- "syscall.ELOOP": "syscall",
- "syscall.EMEDIUMTYPE": "syscall",
- "syscall.EMFILE": "syscall",
- "syscall.EMLINK": "syscall",
- "syscall.EMSGSIZE": "syscall",
- "syscall.EMT_TAGOVF": "syscall",
- "syscall.EMULTIHOP": "syscall",
- "syscall.EMUL_ENABLED": "syscall",
- "syscall.EMUL_LINUX": "syscall",
- "syscall.EMUL_LINUX32": "syscall",
- "syscall.EMUL_MAXID": "syscall",
- "syscall.EMUL_NATIVE": "syscall",
- "syscall.ENAMETOOLONG": "syscall",
- "syscall.ENAVAIL": "syscall",
- "syscall.ENDRUNDISC": "syscall",
- "syscall.ENEEDAUTH": "syscall",
- "syscall.ENETDOWN": "syscall",
- "syscall.ENETRESET": "syscall",
- "syscall.ENETUNREACH": "syscall",
- "syscall.ENFILE": "syscall",
- "syscall.ENOANO": "syscall",
- "syscall.ENOATTR": "syscall",
- "syscall.ENOBUFS": "syscall",
- "syscall.ENOCSI": "syscall",
- "syscall.ENODATA": "syscall",
- "syscall.ENODEV": "syscall",
- "syscall.ENOENT": "syscall",
- "syscall.ENOEXEC": "syscall",
- "syscall.ENOKEY": "syscall",
- "syscall.ENOLCK": "syscall",
- "syscall.ENOLINK": "syscall",
- "syscall.ENOMEDIUM": "syscall",
- "syscall.ENOMEM": "syscall",
- "syscall.ENOMSG": "syscall",
- "syscall.ENONET": "syscall",
- "syscall.ENOPKG": "syscall",
- "syscall.ENOPOLICY": "syscall",
- "syscall.ENOPROTOOPT": "syscall",
- "syscall.ENOSPC": "syscall",
- "syscall.ENOSR": "syscall",
- "syscall.ENOSTR": "syscall",
- "syscall.ENOSYS": "syscall",
- "syscall.ENOTBLK": "syscall",
- "syscall.ENOTCAPABLE": "syscall",
- "syscall.ENOTCONN": "syscall",
- "syscall.ENOTDIR": "syscall",
- "syscall.ENOTEMPTY": "syscall",
- "syscall.ENOTNAM": "syscall",
- "syscall.ENOTRECOVERABLE": "syscall",
- "syscall.ENOTSOCK": "syscall",
- "syscall.ENOTSUP": "syscall",
- "syscall.ENOTTY": "syscall",
- "syscall.ENOTUNIQ": "syscall",
- "syscall.ENXIO": "syscall",
- "syscall.EN_SW_CTL_INF": "syscall",
- "syscall.EN_SW_CTL_PREC": "syscall",
- "syscall.EN_SW_CTL_ROUND": "syscall",
- "syscall.EN_SW_DATACHAIN": "syscall",
- "syscall.EN_SW_DENORM": "syscall",
- "syscall.EN_SW_INVOP": "syscall",
- "syscall.EN_SW_OVERFLOW": "syscall",
- "syscall.EN_SW_PRECLOSS": "syscall",
- "syscall.EN_SW_UNDERFLOW": "syscall",
- "syscall.EN_SW_ZERODIV": "syscall",
- "syscall.EOPNOTSUPP": "syscall",
- "syscall.EOVERFLOW": "syscall",
- "syscall.EOWNERDEAD": "syscall",
- "syscall.EPERM": "syscall",
- "syscall.EPFNOSUPPORT": "syscall",
- "syscall.EPIPE": "syscall",
- "syscall.EPOLLERR": "syscall",
- "syscall.EPOLLET": "syscall",
- "syscall.EPOLLHUP": "syscall",
- "syscall.EPOLLIN": "syscall",
- "syscall.EPOLLMSG": "syscall",
- "syscall.EPOLLONESHOT": "syscall",
- "syscall.EPOLLOUT": "syscall",
- "syscall.EPOLLPRI": "syscall",
- "syscall.EPOLLRDBAND": "syscall",
- "syscall.EPOLLRDHUP": "syscall",
- "syscall.EPOLLRDNORM": "syscall",
- "syscall.EPOLLWRBAND": "syscall",
- "syscall.EPOLLWRNORM": "syscall",
- "syscall.EPOLL_CLOEXEC": "syscall",
- "syscall.EPOLL_CTL_ADD": "syscall",
- "syscall.EPOLL_CTL_DEL": "syscall",
- "syscall.EPOLL_CTL_MOD": "syscall",
- "syscall.EPOLL_NONBLOCK": "syscall",
- "syscall.EPROCLIM": "syscall",
- "syscall.EPROCUNAVAIL": "syscall",
- "syscall.EPROGMISMATCH": "syscall",
- "syscall.EPROGUNAVAIL": "syscall",
- "syscall.EPROTO": "syscall",
- "syscall.EPROTONOSUPPORT": "syscall",
- "syscall.EPROTOTYPE": "syscall",
- "syscall.EPWROFF": "syscall",
- "syscall.ERANGE": "syscall",
- "syscall.EREMCHG": "syscall",
- "syscall.EREMOTE": "syscall",
- "syscall.EREMOTEIO": "syscall",
- "syscall.ERESTART": "syscall",
- "syscall.ERFKILL": "syscall",
- "syscall.EROFS": "syscall",
- "syscall.ERPCMISMATCH": "syscall",
- "syscall.ERROR_ACCESS_DENIED": "syscall",
- "syscall.ERROR_ALREADY_EXISTS": "syscall",
- "syscall.ERROR_BROKEN_PIPE": "syscall",
- "syscall.ERROR_BUFFER_OVERFLOW": "syscall",
- "syscall.ERROR_DIR_NOT_EMPTY": "syscall",
- "syscall.ERROR_ENVVAR_NOT_FOUND": "syscall",
- "syscall.ERROR_FILE_EXISTS": "syscall",
- "syscall.ERROR_FILE_NOT_FOUND": "syscall",
- "syscall.ERROR_HANDLE_EOF": "syscall",
- "syscall.ERROR_INSUFFICIENT_BUFFER": "syscall",
- "syscall.ERROR_IO_PENDING": "syscall",
- "syscall.ERROR_MOD_NOT_FOUND": "syscall",
- "syscall.ERROR_MORE_DATA": "syscall",
- "syscall.ERROR_NETNAME_DELETED": "syscall",
- "syscall.ERROR_NOT_FOUND": "syscall",
- "syscall.ERROR_NO_MORE_FILES": "syscall",
- "syscall.ERROR_OPERATION_ABORTED": "syscall",
- "syscall.ERROR_PATH_NOT_FOUND": "syscall",
- "syscall.ERROR_PRIVILEGE_NOT_HELD": "syscall",
- "syscall.ERROR_PROC_NOT_FOUND": "syscall",
- "syscall.ESHLIBVERS": "syscall",
- "syscall.ESHUTDOWN": "syscall",
- "syscall.ESOCKTNOSUPPORT": "syscall",
- "syscall.ESPIPE": "syscall",
- "syscall.ESRCH": "syscall",
- "syscall.ESRMNT": "syscall",
- "syscall.ESTALE": "syscall",
- "syscall.ESTRPIPE": "syscall",
- "syscall.ETHERCAP_JUMBO_MTU": "syscall",
- "syscall.ETHERCAP_VLAN_HWTAGGING": "syscall",
- "syscall.ETHERCAP_VLAN_MTU": "syscall",
- "syscall.ETHERMIN": "syscall",
- "syscall.ETHERMTU": "syscall",
- "syscall.ETHERMTU_JUMBO": "syscall",
- "syscall.ETHERTYPE_8023": "syscall",
- "syscall.ETHERTYPE_AARP": "syscall",
- "syscall.ETHERTYPE_ACCTON": "syscall",
- "syscall.ETHERTYPE_AEONIC": "syscall",
- "syscall.ETHERTYPE_ALPHA": "syscall",
- "syscall.ETHERTYPE_AMBER": "syscall",
- "syscall.ETHERTYPE_AMOEBA": "syscall",
- "syscall.ETHERTYPE_AOE": "syscall",
- "syscall.ETHERTYPE_APOLLO": "syscall",
- "syscall.ETHERTYPE_APOLLODOMAIN": "syscall",
- "syscall.ETHERTYPE_APPLETALK": "syscall",
- "syscall.ETHERTYPE_APPLITEK": "syscall",
- "syscall.ETHERTYPE_ARGONAUT": "syscall",
- "syscall.ETHERTYPE_ARP": "syscall",
- "syscall.ETHERTYPE_AT": "syscall",
- "syscall.ETHERTYPE_ATALK": "syscall",
- "syscall.ETHERTYPE_ATOMIC": "syscall",
- "syscall.ETHERTYPE_ATT": "syscall",
- "syscall.ETHERTYPE_ATTSTANFORD": "syscall",
- "syscall.ETHERTYPE_AUTOPHON": "syscall",
- "syscall.ETHERTYPE_AXIS": "syscall",
- "syscall.ETHERTYPE_BCLOOP": "syscall",
- "syscall.ETHERTYPE_BOFL": "syscall",
- "syscall.ETHERTYPE_CABLETRON": "syscall",
- "syscall.ETHERTYPE_CHAOS": "syscall",
- "syscall.ETHERTYPE_COMDESIGN": "syscall",
- "syscall.ETHERTYPE_COMPUGRAPHIC": "syscall",
- "syscall.ETHERTYPE_COUNTERPOINT": "syscall",
- "syscall.ETHERTYPE_CRONUS": "syscall",
- "syscall.ETHERTYPE_CRONUSVLN": "syscall",
- "syscall.ETHERTYPE_DCA": "syscall",
- "syscall.ETHERTYPE_DDE": "syscall",
- "syscall.ETHERTYPE_DEBNI": "syscall",
- "syscall.ETHERTYPE_DECAM": "syscall",
- "syscall.ETHERTYPE_DECCUST": "syscall",
- "syscall.ETHERTYPE_DECDIAG": "syscall",
- "syscall.ETHERTYPE_DECDNS": "syscall",
- "syscall.ETHERTYPE_DECDTS": "syscall",
- "syscall.ETHERTYPE_DECEXPER": "syscall",
- "syscall.ETHERTYPE_DECLAST": "syscall",
- "syscall.ETHERTYPE_DECLTM": "syscall",
- "syscall.ETHERTYPE_DECMUMPS": "syscall",
- "syscall.ETHERTYPE_DECNETBIOS": "syscall",
- "syscall.ETHERTYPE_DELTACON": "syscall",
- "syscall.ETHERTYPE_DIDDLE": "syscall",
- "syscall.ETHERTYPE_DLOG1": "syscall",
- "syscall.ETHERTYPE_DLOG2": "syscall",
- "syscall.ETHERTYPE_DN": "syscall",
- "syscall.ETHERTYPE_DOGFIGHT": "syscall",
- "syscall.ETHERTYPE_DSMD": "syscall",
- "syscall.ETHERTYPE_ECMA": "syscall",
- "syscall.ETHERTYPE_ENCRYPT": "syscall",
- "syscall.ETHERTYPE_ES": "syscall",
- "syscall.ETHERTYPE_EXCELAN": "syscall",
- "syscall.ETHERTYPE_EXPERDATA": "syscall",
- "syscall.ETHERTYPE_FLIP": "syscall",
- "syscall.ETHERTYPE_FLOWCONTROL": "syscall",
- "syscall.ETHERTYPE_FRARP": "syscall",
- "syscall.ETHERTYPE_GENDYN": "syscall",
- "syscall.ETHERTYPE_HAYES": "syscall",
- "syscall.ETHERTYPE_HIPPI_FP": "syscall",
- "syscall.ETHERTYPE_HITACHI": "syscall",
- "syscall.ETHERTYPE_HP": "syscall",
- "syscall.ETHERTYPE_IEEEPUP": "syscall",
- "syscall.ETHERTYPE_IEEEPUPAT": "syscall",
- "syscall.ETHERTYPE_IMLBL": "syscall",
- "syscall.ETHERTYPE_IMLBLDIAG": "syscall",
- "syscall.ETHERTYPE_IP": "syscall",
- "syscall.ETHERTYPE_IPAS": "syscall",
- "syscall.ETHERTYPE_IPV6": "syscall",
- "syscall.ETHERTYPE_IPX": "syscall",
- "syscall.ETHERTYPE_IPXNEW": "syscall",
- "syscall.ETHERTYPE_KALPANA": "syscall",
- "syscall.ETHERTYPE_LANBRIDGE": "syscall",
- "syscall.ETHERTYPE_LANPROBE": "syscall",
- "syscall.ETHERTYPE_LAT": "syscall",
- "syscall.ETHERTYPE_LBACK": "syscall",
- "syscall.ETHERTYPE_LITTLE": "syscall",
- "syscall.ETHERTYPE_LLDP": "syscall",
- "syscall.ETHERTYPE_LOGICRAFT": "syscall",
- "syscall.ETHERTYPE_LOOPBACK": "syscall",
- "syscall.ETHERTYPE_MATRA": "syscall",
- "syscall.ETHERTYPE_MAX": "syscall",
- "syscall.ETHERTYPE_MERIT": "syscall",
- "syscall.ETHERTYPE_MICP": "syscall",
- "syscall.ETHERTYPE_MOPDL": "syscall",
- "syscall.ETHERTYPE_MOPRC": "syscall",
- "syscall.ETHERTYPE_MOTOROLA": "syscall",
- "syscall.ETHERTYPE_MPLS": "syscall",
- "syscall.ETHERTYPE_MPLS_MCAST": "syscall",
- "syscall.ETHERTYPE_MUMPS": "syscall",
- "syscall.ETHERTYPE_NBPCC": "syscall",
- "syscall.ETHERTYPE_NBPCLAIM": "syscall",
- "syscall.ETHERTYPE_NBPCLREQ": "syscall",
- "syscall.ETHERTYPE_NBPCLRSP": "syscall",
- "syscall.ETHERTYPE_NBPCREQ": "syscall",
- "syscall.ETHERTYPE_NBPCRSP": "syscall",
- "syscall.ETHERTYPE_NBPDG": "syscall",
- "syscall.ETHERTYPE_NBPDGB": "syscall",
- "syscall.ETHERTYPE_NBPDLTE": "syscall",
- "syscall.ETHERTYPE_NBPRAR": "syscall",
- "syscall.ETHERTYPE_NBPRAS": "syscall",
- "syscall.ETHERTYPE_NBPRST": "syscall",
- "syscall.ETHERTYPE_NBPSCD": "syscall",
- "syscall.ETHERTYPE_NBPVCD": "syscall",
- "syscall.ETHERTYPE_NBS": "syscall",
- "syscall.ETHERTYPE_NCD": "syscall",
- "syscall.ETHERTYPE_NESTAR": "syscall",
- "syscall.ETHERTYPE_NETBEUI": "syscall",
- "syscall.ETHERTYPE_NOVELL": "syscall",
- "syscall.ETHERTYPE_NS": "syscall",
- "syscall.ETHERTYPE_NSAT": "syscall",
- "syscall.ETHERTYPE_NSCOMPAT": "syscall",
- "syscall.ETHERTYPE_NTRAILER": "syscall",
- "syscall.ETHERTYPE_OS9": "syscall",
- "syscall.ETHERTYPE_OS9NET": "syscall",
- "syscall.ETHERTYPE_PACER": "syscall",
- "syscall.ETHERTYPE_PAE": "syscall",
- "syscall.ETHERTYPE_PCS": "syscall",
- "syscall.ETHERTYPE_PLANNING": "syscall",
- "syscall.ETHERTYPE_PPP": "syscall",
- "syscall.ETHERTYPE_PPPOE": "syscall",
- "syscall.ETHERTYPE_PPPOEDISC": "syscall",
- "syscall.ETHERTYPE_PRIMENTS": "syscall",
- "syscall.ETHERTYPE_PUP": "syscall",
- "syscall.ETHERTYPE_PUPAT": "syscall",
- "syscall.ETHERTYPE_QINQ": "syscall",
- "syscall.ETHERTYPE_RACAL": "syscall",
- "syscall.ETHERTYPE_RATIONAL": "syscall",
- "syscall.ETHERTYPE_RAWFR": "syscall",
- "syscall.ETHERTYPE_RCL": "syscall",
- "syscall.ETHERTYPE_RDP": "syscall",
- "syscall.ETHERTYPE_RETIX": "syscall",
- "syscall.ETHERTYPE_REVARP": "syscall",
- "syscall.ETHERTYPE_SCA": "syscall",
- "syscall.ETHERTYPE_SECTRA": "syscall",
- "syscall.ETHERTYPE_SECUREDATA": "syscall",
- "syscall.ETHERTYPE_SGITW": "syscall",
- "syscall.ETHERTYPE_SG_BOUNCE": "syscall",
- "syscall.ETHERTYPE_SG_DIAG": "syscall",
- "syscall.ETHERTYPE_SG_NETGAMES": "syscall",
- "syscall.ETHERTYPE_SG_RESV": "syscall",
- "syscall.ETHERTYPE_SIMNET": "syscall",
- "syscall.ETHERTYPE_SLOW": "syscall",
- "syscall.ETHERTYPE_SLOWPROTOCOLS": "syscall",
- "syscall.ETHERTYPE_SNA": "syscall",
- "syscall.ETHERTYPE_SNMP": "syscall",
- "syscall.ETHERTYPE_SONIX": "syscall",
- "syscall.ETHERTYPE_SPIDER": "syscall",
- "syscall.ETHERTYPE_SPRITE": "syscall",
- "syscall.ETHERTYPE_STP": "syscall",
- "syscall.ETHERTYPE_TALARIS": "syscall",
- "syscall.ETHERTYPE_TALARISMC": "syscall",
- "syscall.ETHERTYPE_TCPCOMP": "syscall",
- "syscall.ETHERTYPE_TCPSM": "syscall",
- "syscall.ETHERTYPE_TEC": "syscall",
- "syscall.ETHERTYPE_TIGAN": "syscall",
- "syscall.ETHERTYPE_TRAIL": "syscall",
- "syscall.ETHERTYPE_TRANSETHER": "syscall",
- "syscall.ETHERTYPE_TYMSHARE": "syscall",
- "syscall.ETHERTYPE_UBBST": "syscall",
- "syscall.ETHERTYPE_UBDEBUG": "syscall",
- "syscall.ETHERTYPE_UBDIAGLOOP": "syscall",
- "syscall.ETHERTYPE_UBDL": "syscall",
- "syscall.ETHERTYPE_UBNIU": "syscall",
- "syscall.ETHERTYPE_UBNMC": "syscall",
- "syscall.ETHERTYPE_VALID": "syscall",
- "syscall.ETHERTYPE_VARIAN": "syscall",
- "syscall.ETHERTYPE_VAXELN": "syscall",
- "syscall.ETHERTYPE_VEECO": "syscall",
- "syscall.ETHERTYPE_VEXP": "syscall",
- "syscall.ETHERTYPE_VGLAB": "syscall",
- "syscall.ETHERTYPE_VINES": "syscall",
- "syscall.ETHERTYPE_VINESECHO": "syscall",
- "syscall.ETHERTYPE_VINESLOOP": "syscall",
- "syscall.ETHERTYPE_VITAL": "syscall",
- "syscall.ETHERTYPE_VLAN": "syscall",
- "syscall.ETHERTYPE_VLTLMAN": "syscall",
- "syscall.ETHERTYPE_VPROD": "syscall",
- "syscall.ETHERTYPE_VURESERVED": "syscall",
- "syscall.ETHERTYPE_WATERLOO": "syscall",
- "syscall.ETHERTYPE_WELLFLEET": "syscall",
- "syscall.ETHERTYPE_X25": "syscall",
- "syscall.ETHERTYPE_X75": "syscall",
- "syscall.ETHERTYPE_XNSSM": "syscall",
- "syscall.ETHERTYPE_XTP": "syscall",
- "syscall.ETHER_ADDR_LEN": "syscall",
- "syscall.ETHER_ALIGN": "syscall",
- "syscall.ETHER_CRC_LEN": "syscall",
- "syscall.ETHER_CRC_POLY_BE": "syscall",
- "syscall.ETHER_CRC_POLY_LE": "syscall",
- "syscall.ETHER_HDR_LEN": "syscall",
- "syscall.ETHER_MAX_DIX_LEN": "syscall",
- "syscall.ETHER_MAX_LEN": "syscall",
- "syscall.ETHER_MAX_LEN_JUMBO": "syscall",
- "syscall.ETHER_MIN_LEN": "syscall",
- "syscall.ETHER_PPPOE_ENCAP_LEN": "syscall",
- "syscall.ETHER_TYPE_LEN": "syscall",
- "syscall.ETHER_VLAN_ENCAP_LEN": "syscall",
- "syscall.ETH_P_1588": "syscall",
- "syscall.ETH_P_8021Q": "syscall",
- "syscall.ETH_P_802_2": "syscall",
- "syscall.ETH_P_802_3": "syscall",
- "syscall.ETH_P_AARP": "syscall",
- "syscall.ETH_P_ALL": "syscall",
- "syscall.ETH_P_AOE": "syscall",
- "syscall.ETH_P_ARCNET": "syscall",
- "syscall.ETH_P_ARP": "syscall",
- "syscall.ETH_P_ATALK": "syscall",
- "syscall.ETH_P_ATMFATE": "syscall",
- "syscall.ETH_P_ATMMPOA": "syscall",
- "syscall.ETH_P_AX25": "syscall",
- "syscall.ETH_P_BPQ": "syscall",
- "syscall.ETH_P_CAIF": "syscall",
- "syscall.ETH_P_CAN": "syscall",
- "syscall.ETH_P_CONTROL": "syscall",
- "syscall.ETH_P_CUST": "syscall",
- "syscall.ETH_P_DDCMP": "syscall",
- "syscall.ETH_P_DEC": "syscall",
- "syscall.ETH_P_DIAG": "syscall",
- "syscall.ETH_P_DNA_DL": "syscall",
- "syscall.ETH_P_DNA_RC": "syscall",
- "syscall.ETH_P_DNA_RT": "syscall",
- "syscall.ETH_P_DSA": "syscall",
- "syscall.ETH_P_ECONET": "syscall",
- "syscall.ETH_P_EDSA": "syscall",
- "syscall.ETH_P_FCOE": "syscall",
- "syscall.ETH_P_FIP": "syscall",
- "syscall.ETH_P_HDLC": "syscall",
- "syscall.ETH_P_IEEE802154": "syscall",
- "syscall.ETH_P_IEEEPUP": "syscall",
- "syscall.ETH_P_IEEEPUPAT": "syscall",
- "syscall.ETH_P_IP": "syscall",
- "syscall.ETH_P_IPV6": "syscall",
- "syscall.ETH_P_IPX": "syscall",
- "syscall.ETH_P_IRDA": "syscall",
- "syscall.ETH_P_LAT": "syscall",
- "syscall.ETH_P_LINK_CTL": "syscall",
- "syscall.ETH_P_LOCALTALK": "syscall",
- "syscall.ETH_P_LOOP": "syscall",
- "syscall.ETH_P_MOBITEX": "syscall",
- "syscall.ETH_P_MPLS_MC": "syscall",
- "syscall.ETH_P_MPLS_UC": "syscall",
- "syscall.ETH_P_PAE": "syscall",
- "syscall.ETH_P_PAUSE": "syscall",
- "syscall.ETH_P_PHONET": "syscall",
- "syscall.ETH_P_PPPTALK": "syscall",
- "syscall.ETH_P_PPP_DISC": "syscall",
- "syscall.ETH_P_PPP_MP": "syscall",
- "syscall.ETH_P_PPP_SES": "syscall",
- "syscall.ETH_P_PUP": "syscall",
- "syscall.ETH_P_PUPAT": "syscall",
- "syscall.ETH_P_RARP": "syscall",
- "syscall.ETH_P_SCA": "syscall",
- "syscall.ETH_P_SLOW": "syscall",
- "syscall.ETH_P_SNAP": "syscall",
- "syscall.ETH_P_TEB": "syscall",
- "syscall.ETH_P_TIPC": "syscall",
- "syscall.ETH_P_TRAILER": "syscall",
- "syscall.ETH_P_TR_802_2": "syscall",
- "syscall.ETH_P_WAN_PPP": "syscall",
- "syscall.ETH_P_WCCP": "syscall",
- "syscall.ETH_P_X25": "syscall",
- "syscall.ETIME": "syscall",
- "syscall.ETIMEDOUT": "syscall",
- "syscall.ETOOMANYREFS": "syscall",
- "syscall.ETXTBSY": "syscall",
- "syscall.EUCLEAN": "syscall",
- "syscall.EUNATCH": "syscall",
- "syscall.EUSERS": "syscall",
- "syscall.EVFILT_AIO": "syscall",
- "syscall.EVFILT_FS": "syscall",
- "syscall.EVFILT_LIO": "syscall",
- "syscall.EVFILT_MACHPORT": "syscall",
- "syscall.EVFILT_PROC": "syscall",
- "syscall.EVFILT_READ": "syscall",
- "syscall.EVFILT_SIGNAL": "syscall",
- "syscall.EVFILT_SYSCOUNT": "syscall",
- "syscall.EVFILT_THREADMARKER": "syscall",
- "syscall.EVFILT_TIMER": "syscall",
- "syscall.EVFILT_USER": "syscall",
- "syscall.EVFILT_VM": "syscall",
- "syscall.EVFILT_VNODE": "syscall",
- "syscall.EVFILT_WRITE": "syscall",
- "syscall.EV_ADD": "syscall",
- "syscall.EV_CLEAR": "syscall",
- "syscall.EV_DELETE": "syscall",
- "syscall.EV_DISABLE": "syscall",
- "syscall.EV_DISPATCH": "syscall",
- "syscall.EV_DROP": "syscall",
- "syscall.EV_ENABLE": "syscall",
- "syscall.EV_EOF": "syscall",
- "syscall.EV_ERROR": "syscall",
- "syscall.EV_FLAG0": "syscall",
- "syscall.EV_FLAG1": "syscall",
- "syscall.EV_ONESHOT": "syscall",
- "syscall.EV_OOBAND": "syscall",
- "syscall.EV_POLL": "syscall",
- "syscall.EV_RECEIPT": "syscall",
- "syscall.EV_SYSFLAGS": "syscall",
- "syscall.EWINDOWS": "syscall",
- "syscall.EWOULDBLOCK": "syscall",
- "syscall.EXDEV": "syscall",
- "syscall.EXFULL": "syscall",
- "syscall.EXTA": "syscall",
- "syscall.EXTB": "syscall",
- "syscall.EXTPROC": "syscall",
- "syscall.Environ": "syscall",
- "syscall.EpollCreate": "syscall",
- "syscall.EpollCreate1": "syscall",
- "syscall.EpollCtl": "syscall",
- "syscall.EpollEvent": "syscall",
- "syscall.EpollWait": "syscall",
- "syscall.Errno": "syscall",
- "syscall.EscapeArg": "syscall",
- "syscall.Exchangedata": "syscall",
- "syscall.Exec": "syscall",
- "syscall.Exit": "syscall",
- "syscall.ExitProcess": "syscall",
- "syscall.FD_CLOEXEC": "syscall",
- "syscall.FD_SETSIZE": "syscall",
- "syscall.FILE_ACTION_ADDED": "syscall",
- "syscall.FILE_ACTION_MODIFIED": "syscall",
- "syscall.FILE_ACTION_REMOVED": "syscall",
- "syscall.FILE_ACTION_RENAMED_NEW_NAME": "syscall",
- "syscall.FILE_ACTION_RENAMED_OLD_NAME": "syscall",
- "syscall.FILE_APPEND_DATA": "syscall",
- "syscall.FILE_ATTRIBUTE_ARCHIVE": "syscall",
- "syscall.FILE_ATTRIBUTE_DIRECTORY": "syscall",
- "syscall.FILE_ATTRIBUTE_HIDDEN": "syscall",
- "syscall.FILE_ATTRIBUTE_NORMAL": "syscall",
- "syscall.FILE_ATTRIBUTE_READONLY": "syscall",
- "syscall.FILE_ATTRIBUTE_REPARSE_POINT": "syscall",
- "syscall.FILE_ATTRIBUTE_SYSTEM": "syscall",
- "syscall.FILE_BEGIN": "syscall",
- "syscall.FILE_CURRENT": "syscall",
- "syscall.FILE_END": "syscall",
- "syscall.FILE_FLAG_BACKUP_SEMANTICS": "syscall",
- "syscall.FILE_FLAG_OPEN_REPARSE_POINT": "syscall",
- "syscall.FILE_FLAG_OVERLAPPED": "syscall",
- "syscall.FILE_LIST_DIRECTORY": "syscall",
- "syscall.FILE_MAP_COPY": "syscall",
- "syscall.FILE_MAP_EXECUTE": "syscall",
- "syscall.FILE_MAP_READ": "syscall",
- "syscall.FILE_MAP_WRITE": "syscall",
- "syscall.FILE_NOTIFY_CHANGE_ATTRIBUTES": "syscall",
- "syscall.FILE_NOTIFY_CHANGE_CREATION": "syscall",
- "syscall.FILE_NOTIFY_CHANGE_DIR_NAME": "syscall",
- "syscall.FILE_NOTIFY_CHANGE_FILE_NAME": "syscall",
- "syscall.FILE_NOTIFY_CHANGE_LAST_ACCESS": "syscall",
- "syscall.FILE_NOTIFY_CHANGE_LAST_WRITE": "syscall",
- "syscall.FILE_NOTIFY_CHANGE_SIZE": "syscall",
- "syscall.FILE_SHARE_DELETE": "syscall",
- "syscall.FILE_SHARE_READ": "syscall",
- "syscall.FILE_SHARE_WRITE": "syscall",
- "syscall.FILE_SKIP_COMPLETION_PORT_ON_SUCCESS": "syscall",
- "syscall.FILE_SKIP_SET_EVENT_ON_HANDLE": "syscall",
- "syscall.FILE_TYPE_CHAR": "syscall",
- "syscall.FILE_TYPE_DISK": "syscall",
- "syscall.FILE_TYPE_PIPE": "syscall",
- "syscall.FILE_TYPE_REMOTE": "syscall",
- "syscall.FILE_TYPE_UNKNOWN": "syscall",
- "syscall.FILE_WRITE_ATTRIBUTES": "syscall",
- "syscall.FLUSHO": "syscall",
- "syscall.FORMAT_MESSAGE_ALLOCATE_BUFFER": "syscall",
- "syscall.FORMAT_MESSAGE_ARGUMENT_ARRAY": "syscall",
- "syscall.FORMAT_MESSAGE_FROM_HMODULE": "syscall",
- "syscall.FORMAT_MESSAGE_FROM_STRING": "syscall",
- "syscall.FORMAT_MESSAGE_FROM_SYSTEM": "syscall",
- "syscall.FORMAT_MESSAGE_IGNORE_INSERTS": "syscall",
- "syscall.FORMAT_MESSAGE_MAX_WIDTH_MASK": "syscall",
- "syscall.FSCTL_GET_REPARSE_POINT": "syscall",
- "syscall.F_ADDFILESIGS": "syscall",
- "syscall.F_ADDSIGS": "syscall",
- "syscall.F_ALLOCATEALL": "syscall",
- "syscall.F_ALLOCATECONTIG": "syscall",
- "syscall.F_CANCEL": "syscall",
- "syscall.F_CHKCLEAN": "syscall",
- "syscall.F_CLOSEM": "syscall",
- "syscall.F_DUP2FD": "syscall",
- "syscall.F_DUP2FD_CLOEXEC": "syscall",
- "syscall.F_DUPFD": "syscall",
- "syscall.F_DUPFD_CLOEXEC": "syscall",
- "syscall.F_EXLCK": "syscall",
- "syscall.F_FLUSH_DATA": "syscall",
- "syscall.F_FREEZE_FS": "syscall",
- "syscall.F_FSCTL": "syscall",
- "syscall.F_FSDIRMASK": "syscall",
- "syscall.F_FSIN": "syscall",
- "syscall.F_FSINOUT": "syscall",
- "syscall.F_FSOUT": "syscall",
- "syscall.F_FSPRIV": "syscall",
- "syscall.F_FSVOID": "syscall",
- "syscall.F_FULLFSYNC": "syscall",
- "syscall.F_GETFD": "syscall",
- "syscall.F_GETFL": "syscall",
- "syscall.F_GETLEASE": "syscall",
- "syscall.F_GETLK": "syscall",
- "syscall.F_GETLK64": "syscall",
- "syscall.F_GETLKPID": "syscall",
- "syscall.F_GETNOSIGPIPE": "syscall",
- "syscall.F_GETOWN": "syscall",
- "syscall.F_GETOWN_EX": "syscall",
- "syscall.F_GETPATH": "syscall",
- "syscall.F_GETPATH_MTMINFO": "syscall",
- "syscall.F_GETPIPE_SZ": "syscall",
- "syscall.F_GETPROTECTIONCLASS": "syscall",
- "syscall.F_GETSIG": "syscall",
- "syscall.F_GLOBAL_NOCACHE": "syscall",
- "syscall.F_LOCK": "syscall",
- "syscall.F_LOG2PHYS": "syscall",
- "syscall.F_LOG2PHYS_EXT": "syscall",
- "syscall.F_MARKDEPENDENCY": "syscall",
- "syscall.F_MAXFD": "syscall",
- "syscall.F_NOCACHE": "syscall",
- "syscall.F_NODIRECT": "syscall",
- "syscall.F_NOTIFY": "syscall",
- "syscall.F_OGETLK": "syscall",
- "syscall.F_OK": "syscall",
- "syscall.F_OSETLK": "syscall",
- "syscall.F_OSETLKW": "syscall",
- "syscall.F_PARAM_MASK": "syscall",
- "syscall.F_PARAM_MAX": "syscall",
- "syscall.F_PATHPKG_CHECK": "syscall",
- "syscall.F_PEOFPOSMODE": "syscall",
- "syscall.F_PREALLOCATE": "syscall",
- "syscall.F_RDADVISE": "syscall",
- "syscall.F_RDAHEAD": "syscall",
- "syscall.F_RDLCK": "syscall",
- "syscall.F_READAHEAD": "syscall",
- "syscall.F_READBOOTSTRAP": "syscall",
- "syscall.F_SETBACKINGSTORE": "syscall",
- "syscall.F_SETFD": "syscall",
- "syscall.F_SETFL": "syscall",
- "syscall.F_SETLEASE": "syscall",
- "syscall.F_SETLK": "syscall",
- "syscall.F_SETLK64": "syscall",
- "syscall.F_SETLKW": "syscall",
- "syscall.F_SETLKW64": "syscall",
- "syscall.F_SETLK_REMOTE": "syscall",
- "syscall.F_SETNOSIGPIPE": "syscall",
- "syscall.F_SETOWN": "syscall",
- "syscall.F_SETOWN_EX": "syscall",
- "syscall.F_SETPIPE_SZ": "syscall",
- "syscall.F_SETPROTECTIONCLASS": "syscall",
- "syscall.F_SETSIG": "syscall",
- "syscall.F_SETSIZE": "syscall",
- "syscall.F_SHLCK": "syscall",
- "syscall.F_TEST": "syscall",
- "syscall.F_THAW_FS": "syscall",
- "syscall.F_TLOCK": "syscall",
- "syscall.F_ULOCK": "syscall",
- "syscall.F_UNLCK": "syscall",
- "syscall.F_UNLCKSYS": "syscall",
- "syscall.F_VOLPOSMODE": "syscall",
- "syscall.F_WRITEBOOTSTRAP": "syscall",
- "syscall.F_WRLCK": "syscall",
- "syscall.Faccessat": "syscall",
- "syscall.Fallocate": "syscall",
- "syscall.Fbootstraptransfer_t": "syscall",
- "syscall.Fchdir": "syscall",
- "syscall.Fchflags": "syscall",
- "syscall.Fchmod": "syscall",
- "syscall.Fchmodat": "syscall",
- "syscall.Fchown": "syscall",
- "syscall.Fchownat": "syscall",
- "syscall.FcntlFlock": "syscall",
- "syscall.FdSet": "syscall",
- "syscall.Fdatasync": "syscall",
- "syscall.FileNotifyInformation": "syscall",
- "syscall.Filetime": "syscall",
- "syscall.FindClose": "syscall",
- "syscall.FindFirstFile": "syscall",
- "syscall.FindNextFile": "syscall",
- "syscall.Flock": "syscall",
- "syscall.Flock_t": "syscall",
- "syscall.FlushBpf": "syscall",
- "syscall.FlushFileBuffers": "syscall",
- "syscall.FlushViewOfFile": "syscall",
- "syscall.ForkExec": "syscall",
- "syscall.ForkLock": "syscall",
- "syscall.FormatMessage": "syscall",
- "syscall.Fpathconf": "syscall",
- "syscall.FreeAddrInfoW": "syscall",
- "syscall.FreeEnvironmentStrings": "syscall",
- "syscall.FreeLibrary": "syscall",
- "syscall.Fsid": "syscall",
- "syscall.Fstat": "syscall",
- "syscall.Fstatfs": "syscall",
- "syscall.Fstore_t": "syscall",
- "syscall.Fsync": "syscall",
- "syscall.Ftruncate": "syscall",
- "syscall.FullPath": "syscall",
- "syscall.Futimes": "syscall",
- "syscall.Futimesat": "syscall",
- "syscall.GENERIC_ALL": "syscall",
- "syscall.GENERIC_EXECUTE": "syscall",
- "syscall.GENERIC_READ": "syscall",
- "syscall.GENERIC_WRITE": "syscall",
- "syscall.GUID": "syscall",
- "syscall.GetAcceptExSockaddrs": "syscall",
- "syscall.GetAdaptersInfo": "syscall",
- "syscall.GetAddrInfoW": "syscall",
- "syscall.GetCommandLine": "syscall",
- "syscall.GetComputerName": "syscall",
- "syscall.GetConsoleMode": "syscall",
- "syscall.GetCurrentDirectory": "syscall",
- "syscall.GetCurrentProcess": "syscall",
- "syscall.GetEnvironmentStrings": "syscall",
- "syscall.GetEnvironmentVariable": "syscall",
- "syscall.GetExitCodeProcess": "syscall",
- "syscall.GetFileAttributes": "syscall",
- "syscall.GetFileAttributesEx": "syscall",
- "syscall.GetFileExInfoStandard": "syscall",
- "syscall.GetFileExMaxInfoLevel": "syscall",
- "syscall.GetFileInformationByHandle": "syscall",
- "syscall.GetFileType": "syscall",
- "syscall.GetFullPathName": "syscall",
- "syscall.GetHostByName": "syscall",
- "syscall.GetIfEntry": "syscall",
- "syscall.GetLastError": "syscall",
- "syscall.GetLengthSid": "syscall",
- "syscall.GetLongPathName": "syscall",
- "syscall.GetProcAddress": "syscall",
- "syscall.GetProcessTimes": "syscall",
- "syscall.GetProtoByName": "syscall",
- "syscall.GetQueuedCompletionStatus": "syscall",
- "syscall.GetServByName": "syscall",
- "syscall.GetShortPathName": "syscall",
- "syscall.GetStartupInfo": "syscall",
- "syscall.GetStdHandle": "syscall",
- "syscall.GetSystemTimeAsFileTime": "syscall",
- "syscall.GetTempPath": "syscall",
- "syscall.GetTimeZoneInformation": "syscall",
- "syscall.GetTokenInformation": "syscall",
- "syscall.GetUserNameEx": "syscall",
- "syscall.GetUserProfileDirectory": "syscall",
- "syscall.GetVersion": "syscall",
- "syscall.Getcwd": "syscall",
- "syscall.Getdents": "syscall",
- "syscall.Getdirentries": "syscall",
- "syscall.Getdtablesize": "syscall",
- "syscall.Getegid": "syscall",
- "syscall.Getenv": "syscall",
- "syscall.Geteuid": "syscall",
- "syscall.Getfsstat": "syscall",
- "syscall.Getgid": "syscall",
- "syscall.Getgroups": "syscall",
- "syscall.Getpagesize": "syscall",
- "syscall.Getpeername": "syscall",
- "syscall.Getpgid": "syscall",
- "syscall.Getpgrp": "syscall",
- "syscall.Getpid": "syscall",
- "syscall.Getppid": "syscall",
- "syscall.Getpriority": "syscall",
- "syscall.Getrlimit": "syscall",
- "syscall.Getrusage": "syscall",
- "syscall.Getsid": "syscall",
- "syscall.Getsockname": "syscall",
- "syscall.Getsockopt": "syscall",
- "syscall.GetsockoptByte": "syscall",
- "syscall.GetsockoptICMPv6Filter": "syscall",
- "syscall.GetsockoptIPMreq": "syscall",
- "syscall.GetsockoptIPMreqn": "syscall",
- "syscall.GetsockoptIPv6MTUInfo": "syscall",
- "syscall.GetsockoptIPv6Mreq": "syscall",
- "syscall.GetsockoptInet4Addr": "syscall",
- "syscall.GetsockoptInt": "syscall",
- "syscall.GetsockoptUcred": "syscall",
- "syscall.Gettid": "syscall",
- "syscall.Gettimeofday": "syscall",
- "syscall.Getuid": "syscall",
- "syscall.Getwd": "syscall",
- "syscall.Getxattr": "syscall",
- "syscall.HANDLE_FLAG_INHERIT": "syscall",
- "syscall.HKEY_CLASSES_ROOT": "syscall",
- "syscall.HKEY_CURRENT_CONFIG": "syscall",
- "syscall.HKEY_CURRENT_USER": "syscall",
- "syscall.HKEY_DYN_DATA": "syscall",
- "syscall.HKEY_LOCAL_MACHINE": "syscall",
- "syscall.HKEY_PERFORMANCE_DATA": "syscall",
- "syscall.HKEY_USERS": "syscall",
- "syscall.HUPCL": "syscall",
- "syscall.Handle": "syscall",
- "syscall.Hostent": "syscall",
- "syscall.ICANON": "syscall",
- "syscall.ICMP6_FILTER": "syscall",
- "syscall.ICMPV6_FILTER": "syscall",
- "syscall.ICMPv6Filter": "syscall",
- "syscall.ICRNL": "syscall",
- "syscall.IEXTEN": "syscall",
- "syscall.IFAN_ARRIVAL": "syscall",
- "syscall.IFAN_DEPARTURE": "syscall",
- "syscall.IFA_ADDRESS": "syscall",
- "syscall.IFA_ANYCAST": "syscall",
- "syscall.IFA_BROADCAST": "syscall",
- "syscall.IFA_CACHEINFO": "syscall",
- "syscall.IFA_F_DADFAILED": "syscall",
- "syscall.IFA_F_DEPRECATED": "syscall",
- "syscall.IFA_F_HOMEADDRESS": "syscall",
- "syscall.IFA_F_NODAD": "syscall",
- "syscall.IFA_F_OPTIMISTIC": "syscall",
- "syscall.IFA_F_PERMANENT": "syscall",
- "syscall.IFA_F_SECONDARY": "syscall",
- "syscall.IFA_F_TEMPORARY": "syscall",
- "syscall.IFA_F_TENTATIVE": "syscall",
- "syscall.IFA_LABEL": "syscall",
- "syscall.IFA_LOCAL": "syscall",
- "syscall.IFA_MAX": "syscall",
- "syscall.IFA_MULTICAST": "syscall",
- "syscall.IFA_ROUTE": "syscall",
- "syscall.IFA_UNSPEC": "syscall",
- "syscall.IFF_ALLMULTI": "syscall",
- "syscall.IFF_ALTPHYS": "syscall",
- "syscall.IFF_AUTOMEDIA": "syscall",
- "syscall.IFF_BROADCAST": "syscall",
- "syscall.IFF_CANTCHANGE": "syscall",
- "syscall.IFF_CANTCONFIG": "syscall",
- "syscall.IFF_DEBUG": "syscall",
- "syscall.IFF_DRV_OACTIVE": "syscall",
- "syscall.IFF_DRV_RUNNING": "syscall",
- "syscall.IFF_DYING": "syscall",
- "syscall.IFF_DYNAMIC": "syscall",
- "syscall.IFF_LINK0": "syscall",
- "syscall.IFF_LINK1": "syscall",
- "syscall.IFF_LINK2": "syscall",
- "syscall.IFF_LOOPBACK": "syscall",
- "syscall.IFF_MASTER": "syscall",
- "syscall.IFF_MONITOR": "syscall",
- "syscall.IFF_MULTICAST": "syscall",
- "syscall.IFF_NOARP": "syscall",
- "syscall.IFF_NOTRAILERS": "syscall",
- "syscall.IFF_NO_PI": "syscall",
- "syscall.IFF_OACTIVE": "syscall",
- "syscall.IFF_ONE_QUEUE": "syscall",
- "syscall.IFF_POINTOPOINT": "syscall",
- "syscall.IFF_POINTTOPOINT": "syscall",
- "syscall.IFF_PORTSEL": "syscall",
- "syscall.IFF_PPROMISC": "syscall",
- "syscall.IFF_PROMISC": "syscall",
- "syscall.IFF_RENAMING": "syscall",
- "syscall.IFF_RUNNING": "syscall",
- "syscall.IFF_SIMPLEX": "syscall",
- "syscall.IFF_SLAVE": "syscall",
- "syscall.IFF_SMART": "syscall",
- "syscall.IFF_STATICARP": "syscall",
- "syscall.IFF_TAP": "syscall",
- "syscall.IFF_TUN": "syscall",
- "syscall.IFF_TUN_EXCL": "syscall",
- "syscall.IFF_UP": "syscall",
- "syscall.IFF_VNET_HDR": "syscall",
- "syscall.IFLA_ADDRESS": "syscall",
- "syscall.IFLA_BROADCAST": "syscall",
- "syscall.IFLA_COST": "syscall",
- "syscall.IFLA_IFALIAS": "syscall",
- "syscall.IFLA_IFNAME": "syscall",
- "syscall.IFLA_LINK": "syscall",
- "syscall.IFLA_LINKINFO": "syscall",
- "syscall.IFLA_LINKMODE": "syscall",
- "syscall.IFLA_MAP": "syscall",
- "syscall.IFLA_MASTER": "syscall",
- "syscall.IFLA_MAX": "syscall",
- "syscall.IFLA_MTU": "syscall",
- "syscall.IFLA_NET_NS_PID": "syscall",
- "syscall.IFLA_OPERSTATE": "syscall",
- "syscall.IFLA_PRIORITY": "syscall",
- "syscall.IFLA_PROTINFO": "syscall",
- "syscall.IFLA_QDISC": "syscall",
- "syscall.IFLA_STATS": "syscall",
- "syscall.IFLA_TXQLEN": "syscall",
- "syscall.IFLA_UNSPEC": "syscall",
- "syscall.IFLA_WEIGHT": "syscall",
- "syscall.IFLA_WIRELESS": "syscall",
- "syscall.IFNAMSIZ": "syscall",
- "syscall.IFT_1822": "syscall",
- "syscall.IFT_A12MPPSWITCH": "syscall",
- "syscall.IFT_AAL2": "syscall",
- "syscall.IFT_AAL5": "syscall",
- "syscall.IFT_ADSL": "syscall",
- "syscall.IFT_AFLANE8023": "syscall",
- "syscall.IFT_AFLANE8025": "syscall",
- "syscall.IFT_ARAP": "syscall",
- "syscall.IFT_ARCNET": "syscall",
- "syscall.IFT_ARCNETPLUS": "syscall",
- "syscall.IFT_ASYNC": "syscall",
- "syscall.IFT_ATM": "syscall",
- "syscall.IFT_ATMDXI": "syscall",
- "syscall.IFT_ATMFUNI": "syscall",
- "syscall.IFT_ATMIMA": "syscall",
- "syscall.IFT_ATMLOGICAL": "syscall",
- "syscall.IFT_ATMRADIO": "syscall",
- "syscall.IFT_ATMSUBINTERFACE": "syscall",
- "syscall.IFT_ATMVCIENDPT": "syscall",
- "syscall.IFT_ATMVIRTUAL": "syscall",
- "syscall.IFT_BGPPOLICYACCOUNTING": "syscall",
- "syscall.IFT_BLUETOOTH": "syscall",
- "syscall.IFT_BRIDGE": "syscall",
- "syscall.IFT_BSC": "syscall",
- "syscall.IFT_CARP": "syscall",
- "syscall.IFT_CCTEMUL": "syscall",
- "syscall.IFT_CELLULAR": "syscall",
- "syscall.IFT_CEPT": "syscall",
- "syscall.IFT_CES": "syscall",
- "syscall.IFT_CHANNEL": "syscall",
- "syscall.IFT_CNR": "syscall",
- "syscall.IFT_COFFEE": "syscall",
- "syscall.IFT_COMPOSITELINK": "syscall",
- "syscall.IFT_DCN": "syscall",
- "syscall.IFT_DIGITALPOWERLINE": "syscall",
- "syscall.IFT_DIGITALWRAPPEROVERHEADCHANNEL": "syscall",
- "syscall.IFT_DLSW": "syscall",
- "syscall.IFT_DOCSCABLEDOWNSTREAM": "syscall",
- "syscall.IFT_DOCSCABLEMACLAYER": "syscall",
- "syscall.IFT_DOCSCABLEUPSTREAM": "syscall",
- "syscall.IFT_DOCSCABLEUPSTREAMCHANNEL": "syscall",
- "syscall.IFT_DS0": "syscall",
- "syscall.IFT_DS0BUNDLE": "syscall",
- "syscall.IFT_DS1FDL": "syscall",
- "syscall.IFT_DS3": "syscall",
- "syscall.IFT_DTM": "syscall",
- "syscall.IFT_DUMMY": "syscall",
- "syscall.IFT_DVBASILN": "syscall",
- "syscall.IFT_DVBASIOUT": "syscall",
- "syscall.IFT_DVBRCCDOWNSTREAM": "syscall",
- "syscall.IFT_DVBRCCMACLAYER": "syscall",
- "syscall.IFT_DVBRCCUPSTREAM": "syscall",
- "syscall.IFT_ECONET": "syscall",
- "syscall.IFT_ENC": "syscall",
- "syscall.IFT_EON": "syscall",
- "syscall.IFT_EPLRS": "syscall",
- "syscall.IFT_ESCON": "syscall",
- "syscall.IFT_ETHER": "syscall",
- "syscall.IFT_FAITH": "syscall",
- "syscall.IFT_FAST": "syscall",
- "syscall.IFT_FASTETHER": "syscall",
- "syscall.IFT_FASTETHERFX": "syscall",
- "syscall.IFT_FDDI": "syscall",
- "syscall.IFT_FIBRECHANNEL": "syscall",
- "syscall.IFT_FRAMERELAYINTERCONNECT": "syscall",
- "syscall.IFT_FRAMERELAYMPI": "syscall",
- "syscall.IFT_FRDLCIENDPT": "syscall",
- "syscall.IFT_FRELAY": "syscall",
- "syscall.IFT_FRELAYDCE": "syscall",
- "syscall.IFT_FRF16MFRBUNDLE": "syscall",
- "syscall.IFT_FRFORWARD": "syscall",
- "syscall.IFT_G703AT2MB": "syscall",
- "syscall.IFT_G703AT64K": "syscall",
- "syscall.IFT_GIF": "syscall",
- "syscall.IFT_GIGABITETHERNET": "syscall",
- "syscall.IFT_GR303IDT": "syscall",
- "syscall.IFT_GR303RDT": "syscall",
- "syscall.IFT_H323GATEKEEPER": "syscall",
- "syscall.IFT_H323PROXY": "syscall",
- "syscall.IFT_HDH1822": "syscall",
- "syscall.IFT_HDLC": "syscall",
- "syscall.IFT_HDSL2": "syscall",
- "syscall.IFT_HIPERLAN2": "syscall",
- "syscall.IFT_HIPPI": "syscall",
- "syscall.IFT_HIPPIINTERFACE": "syscall",
- "syscall.IFT_HOSTPAD": "syscall",
- "syscall.IFT_HSSI": "syscall",
- "syscall.IFT_HY": "syscall",
- "syscall.IFT_IBM370PARCHAN": "syscall",
- "syscall.IFT_IDSL": "syscall",
- "syscall.IFT_IEEE1394": "syscall",
- "syscall.IFT_IEEE80211": "syscall",
- "syscall.IFT_IEEE80212": "syscall",
- "syscall.IFT_IEEE8023ADLAG": "syscall",
- "syscall.IFT_IFGSN": "syscall",
- "syscall.IFT_IMT": "syscall",
- "syscall.IFT_INFINIBAND": "syscall",
- "syscall.IFT_INTERLEAVE": "syscall",
- "syscall.IFT_IP": "syscall",
- "syscall.IFT_IPFORWARD": "syscall",
- "syscall.IFT_IPOVERATM": "syscall",
- "syscall.IFT_IPOVERCDLC": "syscall",
- "syscall.IFT_IPOVERCLAW": "syscall",
- "syscall.IFT_IPSWITCH": "syscall",
- "syscall.IFT_IPXIP": "syscall",
- "syscall.IFT_ISDN": "syscall",
- "syscall.IFT_ISDNBASIC": "syscall",
- "syscall.IFT_ISDNPRIMARY": "syscall",
- "syscall.IFT_ISDNS": "syscall",
- "syscall.IFT_ISDNU": "syscall",
- "syscall.IFT_ISO88022LLC": "syscall",
- "syscall.IFT_ISO88023": "syscall",
- "syscall.IFT_ISO88024": "syscall",
- "syscall.IFT_ISO88025": "syscall",
- "syscall.IFT_ISO88025CRFPINT": "syscall",
- "syscall.IFT_ISO88025DTR": "syscall",
- "syscall.IFT_ISO88025FIBER": "syscall",
- "syscall.IFT_ISO88026": "syscall",
- "syscall.IFT_ISUP": "syscall",
- "syscall.IFT_L2VLAN": "syscall",
- "syscall.IFT_L3IPVLAN": "syscall",
- "syscall.IFT_L3IPXVLAN": "syscall",
- "syscall.IFT_LAPB": "syscall",
- "syscall.IFT_LAPD": "syscall",
- "syscall.IFT_LAPF": "syscall",
- "syscall.IFT_LINEGROUP": "syscall",
- "syscall.IFT_LOCALTALK": "syscall",
- "syscall.IFT_LOOP": "syscall",
- "syscall.IFT_MEDIAMAILOVERIP": "syscall",
- "syscall.IFT_MFSIGLINK": "syscall",
- "syscall.IFT_MIOX25": "syscall",
- "syscall.IFT_MODEM": "syscall",
- "syscall.IFT_MPC": "syscall",
- "syscall.IFT_MPLS": "syscall",
- "syscall.IFT_MPLSTUNNEL": "syscall",
- "syscall.IFT_MSDSL": "syscall",
- "syscall.IFT_MVL": "syscall",
- "syscall.IFT_MYRINET": "syscall",
- "syscall.IFT_NFAS": "syscall",
- "syscall.IFT_NSIP": "syscall",
- "syscall.IFT_OPTICALCHANNEL": "syscall",
- "syscall.IFT_OPTICALTRANSPORT": "syscall",
- "syscall.IFT_OTHER": "syscall",
- "syscall.IFT_P10": "syscall",
- "syscall.IFT_P80": "syscall",
- "syscall.IFT_PARA": "syscall",
- "syscall.IFT_PDP": "syscall",
- "syscall.IFT_PFLOG": "syscall",
- "syscall.IFT_PFLOW": "syscall",
- "syscall.IFT_PFSYNC": "syscall",
- "syscall.IFT_PLC": "syscall",
- "syscall.IFT_PON155": "syscall",
- "syscall.IFT_PON622": "syscall",
- "syscall.IFT_POS": "syscall",
- "syscall.IFT_PPP": "syscall",
- "syscall.IFT_PPPMULTILINKBUNDLE": "syscall",
- "syscall.IFT_PROPATM": "syscall",
- "syscall.IFT_PROPBWAP2MP": "syscall",
- "syscall.IFT_PROPCNLS": "syscall",
- "syscall.IFT_PROPDOCSWIRELESSDOWNSTREAM": "syscall",
- "syscall.IFT_PROPDOCSWIRELESSMACLAYER": "syscall",
- "syscall.IFT_PROPDOCSWIRELESSUPSTREAM": "syscall",
- "syscall.IFT_PROPMUX": "syscall",
- "syscall.IFT_PROPVIRTUAL": "syscall",
- "syscall.IFT_PROPWIRELESSP2P": "syscall",
- "syscall.IFT_PTPSERIAL": "syscall",
- "syscall.IFT_PVC": "syscall",
- "syscall.IFT_Q2931": "syscall",
- "syscall.IFT_QLLC": "syscall",
- "syscall.IFT_RADIOMAC": "syscall",
- "syscall.IFT_RADSL": "syscall",
- "syscall.IFT_REACHDSL": "syscall",
- "syscall.IFT_RFC1483": "syscall",
- "syscall.IFT_RS232": "syscall",
- "syscall.IFT_RSRB": "syscall",
- "syscall.IFT_SDLC": "syscall",
- "syscall.IFT_SDSL": "syscall",
- "syscall.IFT_SHDSL": "syscall",
- "syscall.IFT_SIP": "syscall",
- "syscall.IFT_SIPSIG": "syscall",
- "syscall.IFT_SIPTG": "syscall",
- "syscall.IFT_SLIP": "syscall",
- "syscall.IFT_SMDSDXI": "syscall",
- "syscall.IFT_SMDSICIP": "syscall",
- "syscall.IFT_SONET": "syscall",
- "syscall.IFT_SONETOVERHEADCHANNEL": "syscall",
- "syscall.IFT_SONETPATH": "syscall",
- "syscall.IFT_SONETVT": "syscall",
- "syscall.IFT_SRP": "syscall",
- "syscall.IFT_SS7SIGLINK": "syscall",
- "syscall.IFT_STACKTOSTACK": "syscall",
- "syscall.IFT_STARLAN": "syscall",
- "syscall.IFT_STF": "syscall",
- "syscall.IFT_T1": "syscall",
- "syscall.IFT_TDLC": "syscall",
- "syscall.IFT_TELINK": "syscall",
- "syscall.IFT_TERMPAD": "syscall",
- "syscall.IFT_TR008": "syscall",
- "syscall.IFT_TRANSPHDLC": "syscall",
- "syscall.IFT_TUNNEL": "syscall",
- "syscall.IFT_ULTRA": "syscall",
- "syscall.IFT_USB": "syscall",
- "syscall.IFT_V11": "syscall",
- "syscall.IFT_V35": "syscall",
- "syscall.IFT_V36": "syscall",
- "syscall.IFT_V37": "syscall",
- "syscall.IFT_VDSL": "syscall",
- "syscall.IFT_VIRTUALIPADDRESS": "syscall",
- "syscall.IFT_VIRTUALTG": "syscall",
- "syscall.IFT_VOICEDID": "syscall",
- "syscall.IFT_VOICEEM": "syscall",
- "syscall.IFT_VOICEEMFGD": "syscall",
- "syscall.IFT_VOICEENCAP": "syscall",
- "syscall.IFT_VOICEFGDEANA": "syscall",
- "syscall.IFT_VOICEFXO": "syscall",
- "syscall.IFT_VOICEFXS": "syscall",
- "syscall.IFT_VOICEOVERATM": "syscall",
- "syscall.IFT_VOICEOVERCABLE": "syscall",
- "syscall.IFT_VOICEOVERFRAMERELAY": "syscall",
- "syscall.IFT_VOICEOVERIP": "syscall",
- "syscall.IFT_X213": "syscall",
- "syscall.IFT_X25": "syscall",
- "syscall.IFT_X25DDN": "syscall",
- "syscall.IFT_X25HUNTGROUP": "syscall",
- "syscall.IFT_X25MLP": "syscall",
- "syscall.IFT_X25PLE": "syscall",
- "syscall.IFT_XETHER": "syscall",
- "syscall.IGNBRK": "syscall",
- "syscall.IGNCR": "syscall",
- "syscall.IGNORE": "syscall",
- "syscall.IGNPAR": "syscall",
- "syscall.IMAXBEL": "syscall",
- "syscall.INFINITE": "syscall",
- "syscall.INLCR": "syscall",
- "syscall.INPCK": "syscall",
- "syscall.INVALID_FILE_ATTRIBUTES": "syscall",
- "syscall.IN_ACCESS": "syscall",
- "syscall.IN_ALL_EVENTS": "syscall",
- "syscall.IN_ATTRIB": "syscall",
- "syscall.IN_CLASSA_HOST": "syscall",
- "syscall.IN_CLASSA_MAX": "syscall",
- "syscall.IN_CLASSA_NET": "syscall",
- "syscall.IN_CLASSA_NSHIFT": "syscall",
- "syscall.IN_CLASSB_HOST": "syscall",
- "syscall.IN_CLASSB_MAX": "syscall",
- "syscall.IN_CLASSB_NET": "syscall",
- "syscall.IN_CLASSB_NSHIFT": "syscall",
- "syscall.IN_CLASSC_HOST": "syscall",
- "syscall.IN_CLASSC_NET": "syscall",
- "syscall.IN_CLASSC_NSHIFT": "syscall",
- "syscall.IN_CLASSD_HOST": "syscall",
- "syscall.IN_CLASSD_NET": "syscall",
- "syscall.IN_CLASSD_NSHIFT": "syscall",
- "syscall.IN_CLOEXEC": "syscall",
- "syscall.IN_CLOSE": "syscall",
- "syscall.IN_CLOSE_NOWRITE": "syscall",
- "syscall.IN_CLOSE_WRITE": "syscall",
- "syscall.IN_CREATE": "syscall",
- "syscall.IN_DELETE": "syscall",
- "syscall.IN_DELETE_SELF": "syscall",
- "syscall.IN_DONT_FOLLOW": "syscall",
- "syscall.IN_EXCL_UNLINK": "syscall",
- "syscall.IN_IGNORED": "syscall",
- "syscall.IN_ISDIR": "syscall",
- "syscall.IN_LINKLOCALNETNUM": "syscall",
- "syscall.IN_LOOPBACKNET": "syscall",
- "syscall.IN_MASK_ADD": "syscall",
- "syscall.IN_MODIFY": "syscall",
- "syscall.IN_MOVE": "syscall",
- "syscall.IN_MOVED_FROM": "syscall",
- "syscall.IN_MOVED_TO": "syscall",
- "syscall.IN_MOVE_SELF": "syscall",
- "syscall.IN_NONBLOCK": "syscall",
- "syscall.IN_ONESHOT": "syscall",
- "syscall.IN_ONLYDIR": "syscall",
- "syscall.IN_OPEN": "syscall",
- "syscall.IN_Q_OVERFLOW": "syscall",
- "syscall.IN_RFC3021_HOST": "syscall",
- "syscall.IN_RFC3021_MASK": "syscall",
- "syscall.IN_RFC3021_NET": "syscall",
- "syscall.IN_RFC3021_NSHIFT": "syscall",
- "syscall.IN_UNMOUNT": "syscall",
- "syscall.IOC_IN": "syscall",
- "syscall.IOC_INOUT": "syscall",
- "syscall.IOC_OUT": "syscall",
- "syscall.IOC_VENDOR": "syscall",
- "syscall.IOC_WS2": "syscall",
- "syscall.IO_REPARSE_TAG_SYMLINK": "syscall",
- "syscall.IPMreq": "syscall",
- "syscall.IPMreqn": "syscall",
- "syscall.IPPROTO_3PC": "syscall",
- "syscall.IPPROTO_ADFS": "syscall",
- "syscall.IPPROTO_AH": "syscall",
- "syscall.IPPROTO_AHIP": "syscall",
- "syscall.IPPROTO_APES": "syscall",
- "syscall.IPPROTO_ARGUS": "syscall",
- "syscall.IPPROTO_AX25": "syscall",
- "syscall.IPPROTO_BHA": "syscall",
- "syscall.IPPROTO_BLT": "syscall",
- "syscall.IPPROTO_BRSATMON": "syscall",
- "syscall.IPPROTO_CARP": "syscall",
- "syscall.IPPROTO_CFTP": "syscall",
- "syscall.IPPROTO_CHAOS": "syscall",
- "syscall.IPPROTO_CMTP": "syscall",
- "syscall.IPPROTO_COMP": "syscall",
- "syscall.IPPROTO_CPHB": "syscall",
- "syscall.IPPROTO_CPNX": "syscall",
- "syscall.IPPROTO_DCCP": "syscall",
- "syscall.IPPROTO_DDP": "syscall",
- "syscall.IPPROTO_DGP": "syscall",
- "syscall.IPPROTO_DIVERT": "syscall",
- "syscall.IPPROTO_DIVERT_INIT": "syscall",
- "syscall.IPPROTO_DIVERT_RESP": "syscall",
- "syscall.IPPROTO_DONE": "syscall",
- "syscall.IPPROTO_DSTOPTS": "syscall",
- "syscall.IPPROTO_EGP": "syscall",
- "syscall.IPPROTO_EMCON": "syscall",
- "syscall.IPPROTO_ENCAP": "syscall",
- "syscall.IPPROTO_EON": "syscall",
- "syscall.IPPROTO_ESP": "syscall",
- "syscall.IPPROTO_ETHERIP": "syscall",
- "syscall.IPPROTO_FRAGMENT": "syscall",
- "syscall.IPPROTO_GGP": "syscall",
- "syscall.IPPROTO_GMTP": "syscall",
- "syscall.IPPROTO_GRE": "syscall",
- "syscall.IPPROTO_HELLO": "syscall",
- "syscall.IPPROTO_HMP": "syscall",
- "syscall.IPPROTO_HOPOPTS": "syscall",
- "syscall.IPPROTO_ICMP": "syscall",
- "syscall.IPPROTO_ICMPV6": "syscall",
- "syscall.IPPROTO_IDP": "syscall",
- "syscall.IPPROTO_IDPR": "syscall",
- "syscall.IPPROTO_IDRP": "syscall",
- "syscall.IPPROTO_IGMP": "syscall",
- "syscall.IPPROTO_IGP": "syscall",
- "syscall.IPPROTO_IGRP": "syscall",
- "syscall.IPPROTO_IL": "syscall",
- "syscall.IPPROTO_INLSP": "syscall",
- "syscall.IPPROTO_INP": "syscall",
- "syscall.IPPROTO_IP": "syscall",
- "syscall.IPPROTO_IPCOMP": "syscall",
- "syscall.IPPROTO_IPCV": "syscall",
- "syscall.IPPROTO_IPEIP": "syscall",
- "syscall.IPPROTO_IPIP": "syscall",
- "syscall.IPPROTO_IPPC": "syscall",
- "syscall.IPPROTO_IPV4": "syscall",
- "syscall.IPPROTO_IPV6": "syscall",
- "syscall.IPPROTO_IPV6_ICMP": "syscall",
- "syscall.IPPROTO_IRTP": "syscall",
- "syscall.IPPROTO_KRYPTOLAN": "syscall",
- "syscall.IPPROTO_LARP": "syscall",
- "syscall.IPPROTO_LEAF1": "syscall",
- "syscall.IPPROTO_LEAF2": "syscall",
- "syscall.IPPROTO_MAX": "syscall",
- "syscall.IPPROTO_MAXID": "syscall",
- "syscall.IPPROTO_MEAS": "syscall",
- "syscall.IPPROTO_MH": "syscall",
- "syscall.IPPROTO_MHRP": "syscall",
- "syscall.IPPROTO_MICP": "syscall",
- "syscall.IPPROTO_MOBILE": "syscall",
- "syscall.IPPROTO_MPLS": "syscall",
- "syscall.IPPROTO_MTP": "syscall",
- "syscall.IPPROTO_MUX": "syscall",
- "syscall.IPPROTO_ND": "syscall",
- "syscall.IPPROTO_NHRP": "syscall",
- "syscall.IPPROTO_NONE": "syscall",
- "syscall.IPPROTO_NSP": "syscall",
- "syscall.IPPROTO_NVPII": "syscall",
- "syscall.IPPROTO_OLD_DIVERT": "syscall",
- "syscall.IPPROTO_OSPFIGP": "syscall",
- "syscall.IPPROTO_PFSYNC": "syscall",
- "syscall.IPPROTO_PGM": "syscall",
- "syscall.IPPROTO_PIGP": "syscall",
- "syscall.IPPROTO_PIM": "syscall",
- "syscall.IPPROTO_PRM": "syscall",
- "syscall.IPPROTO_PUP": "syscall",
- "syscall.IPPROTO_PVP": "syscall",
- "syscall.IPPROTO_RAW": "syscall",
- "syscall.IPPROTO_RCCMON": "syscall",
- "syscall.IPPROTO_RDP": "syscall",
- "syscall.IPPROTO_ROUTING": "syscall",
- "syscall.IPPROTO_RSVP": "syscall",
- "syscall.IPPROTO_RVD": "syscall",
- "syscall.IPPROTO_SATEXPAK": "syscall",
- "syscall.IPPROTO_SATMON": "syscall",
- "syscall.IPPROTO_SCCSP": "syscall",
- "syscall.IPPROTO_SCTP": "syscall",
- "syscall.IPPROTO_SDRP": "syscall",
- "syscall.IPPROTO_SEND": "syscall",
- "syscall.IPPROTO_SEP": "syscall",
- "syscall.IPPROTO_SKIP": "syscall",
- "syscall.IPPROTO_SPACER": "syscall",
- "syscall.IPPROTO_SRPC": "syscall",
- "syscall.IPPROTO_ST": "syscall",
- "syscall.IPPROTO_SVMTP": "syscall",
- "syscall.IPPROTO_SWIPE": "syscall",
- "syscall.IPPROTO_TCF": "syscall",
- "syscall.IPPROTO_TCP": "syscall",
- "syscall.IPPROTO_TLSP": "syscall",
- "syscall.IPPROTO_TP": "syscall",
- "syscall.IPPROTO_TPXX": "syscall",
- "syscall.IPPROTO_TRUNK1": "syscall",
- "syscall.IPPROTO_TRUNK2": "syscall",
- "syscall.IPPROTO_TTP": "syscall",
- "syscall.IPPROTO_UDP": "syscall",
- "syscall.IPPROTO_UDPLITE": "syscall",
- "syscall.IPPROTO_VINES": "syscall",
- "syscall.IPPROTO_VISA": "syscall",
- "syscall.IPPROTO_VMTP": "syscall",
- "syscall.IPPROTO_VRRP": "syscall",
- "syscall.IPPROTO_WBEXPAK": "syscall",
- "syscall.IPPROTO_WBMON": "syscall",
- "syscall.IPPROTO_WSN": "syscall",
- "syscall.IPPROTO_XNET": "syscall",
- "syscall.IPPROTO_XTP": "syscall",
- "syscall.IPV6_2292DSTOPTS": "syscall",
- "syscall.IPV6_2292HOPLIMIT": "syscall",
- "syscall.IPV6_2292HOPOPTS": "syscall",
- "syscall.IPV6_2292NEXTHOP": "syscall",
- "syscall.IPV6_2292PKTINFO": "syscall",
- "syscall.IPV6_2292PKTOPTIONS": "syscall",
- "syscall.IPV6_2292RTHDR": "syscall",
- "syscall.IPV6_ADDRFORM": "syscall",
- "syscall.IPV6_ADD_MEMBERSHIP": "syscall",
- "syscall.IPV6_AUTHHDR": "syscall",
- "syscall.IPV6_AUTH_LEVEL": "syscall",
- "syscall.IPV6_AUTOFLOWLABEL": "syscall",
- "syscall.IPV6_BINDANY": "syscall",
- "syscall.IPV6_BINDV6ONLY": "syscall",
- "syscall.IPV6_BOUND_IF": "syscall",
- "syscall.IPV6_CHECKSUM": "syscall",
- "syscall.IPV6_DEFAULT_MULTICAST_HOPS": "syscall",
- "syscall.IPV6_DEFAULT_MULTICAST_LOOP": "syscall",
- "syscall.IPV6_DEFHLIM": "syscall",
- "syscall.IPV6_DONTFRAG": "syscall",
- "syscall.IPV6_DROP_MEMBERSHIP": "syscall",
- "syscall.IPV6_DSTOPTS": "syscall",
- "syscall.IPV6_ESP_NETWORK_LEVEL": "syscall",
- "syscall.IPV6_ESP_TRANS_LEVEL": "syscall",
- "syscall.IPV6_FAITH": "syscall",
- "syscall.IPV6_FLOWINFO_MASK": "syscall",
- "syscall.IPV6_FLOWLABEL_MASK": "syscall",
- "syscall.IPV6_FRAGTTL": "syscall",
- "syscall.IPV6_FW_ADD": "syscall",
- "syscall.IPV6_FW_DEL": "syscall",
- "syscall.IPV6_FW_FLUSH": "syscall",
- "syscall.IPV6_FW_GET": "syscall",
- "syscall.IPV6_FW_ZERO": "syscall",
- "syscall.IPV6_HLIMDEC": "syscall",
- "syscall.IPV6_HOPLIMIT": "syscall",
- "syscall.IPV6_HOPOPTS": "syscall",
- "syscall.IPV6_IPCOMP_LEVEL": "syscall",
- "syscall.IPV6_IPSEC_POLICY": "syscall",
- "syscall.IPV6_JOIN_ANYCAST": "syscall",
- "syscall.IPV6_JOIN_GROUP": "syscall",
- "syscall.IPV6_LEAVE_ANYCAST": "syscall",
- "syscall.IPV6_LEAVE_GROUP": "syscall",
- "syscall.IPV6_MAXHLIM": "syscall",
- "syscall.IPV6_MAXOPTHDR": "syscall",
- "syscall.IPV6_MAXPACKET": "syscall",
- "syscall.IPV6_MAX_GROUP_SRC_FILTER": "syscall",
- "syscall.IPV6_MAX_MEMBERSHIPS": "syscall",
- "syscall.IPV6_MAX_SOCK_SRC_FILTER": "syscall",
- "syscall.IPV6_MIN_MEMBERSHIPS": "syscall",
- "syscall.IPV6_MMTU": "syscall",
- "syscall.IPV6_MSFILTER": "syscall",
- "syscall.IPV6_MTU": "syscall",
- "syscall.IPV6_MTU_DISCOVER": "syscall",
- "syscall.IPV6_MULTICAST_HOPS": "syscall",
- "syscall.IPV6_MULTICAST_IF": "syscall",
- "syscall.IPV6_MULTICAST_LOOP": "syscall",
- "syscall.IPV6_NEXTHOP": "syscall",
- "syscall.IPV6_OPTIONS": "syscall",
- "syscall.IPV6_PATHMTU": "syscall",
- "syscall.IPV6_PIPEX": "syscall",
- "syscall.IPV6_PKTINFO": "syscall",
- "syscall.IPV6_PMTUDISC_DO": "syscall",
- "syscall.IPV6_PMTUDISC_DONT": "syscall",
- "syscall.IPV6_PMTUDISC_PROBE": "syscall",
- "syscall.IPV6_PMTUDISC_WANT": "syscall",
- "syscall.IPV6_PORTRANGE": "syscall",
- "syscall.IPV6_PORTRANGE_DEFAULT": "syscall",
- "syscall.IPV6_PORTRANGE_HIGH": "syscall",
- "syscall.IPV6_PORTRANGE_LOW": "syscall",
- "syscall.IPV6_PREFER_TEMPADDR": "syscall",
- "syscall.IPV6_RECVDSTOPTS": "syscall",
- "syscall.IPV6_RECVDSTPORT": "syscall",
- "syscall.IPV6_RECVERR": "syscall",
- "syscall.IPV6_RECVHOPLIMIT": "syscall",
- "syscall.IPV6_RECVHOPOPTS": "syscall",
- "syscall.IPV6_RECVPATHMTU": "syscall",
- "syscall.IPV6_RECVPKTINFO": "syscall",
- "syscall.IPV6_RECVRTHDR": "syscall",
- "syscall.IPV6_RECVTCLASS": "syscall",
- "syscall.IPV6_ROUTER_ALERT": "syscall",
- "syscall.IPV6_RTABLE": "syscall",
- "syscall.IPV6_RTHDR": "syscall",
- "syscall.IPV6_RTHDRDSTOPTS": "syscall",
- "syscall.IPV6_RTHDR_LOOSE": "syscall",
- "syscall.IPV6_RTHDR_STRICT": "syscall",
- "syscall.IPV6_RTHDR_TYPE_0": "syscall",
- "syscall.IPV6_RXDSTOPTS": "syscall",
- "syscall.IPV6_RXHOPOPTS": "syscall",
- "syscall.IPV6_SOCKOPT_RESERVED1": "syscall",
- "syscall.IPV6_TCLASS": "syscall",
- "syscall.IPV6_UNICAST_HOPS": "syscall",
- "syscall.IPV6_USE_MIN_MTU": "syscall",
- "syscall.IPV6_V6ONLY": "syscall",
- "syscall.IPV6_VERSION": "syscall",
- "syscall.IPV6_VERSION_MASK": "syscall",
- "syscall.IPV6_XFRM_POLICY": "syscall",
- "syscall.IP_ADD_MEMBERSHIP": "syscall",
- "syscall.IP_ADD_SOURCE_MEMBERSHIP": "syscall",
- "syscall.IP_AUTH_LEVEL": "syscall",
- "syscall.IP_BINDANY": "syscall",
- "syscall.IP_BLOCK_SOURCE": "syscall",
- "syscall.IP_BOUND_IF": "syscall",
- "syscall.IP_DEFAULT_MULTICAST_LOOP": "syscall",
- "syscall.IP_DEFAULT_MULTICAST_TTL": "syscall",
- "syscall.IP_DF": "syscall",
- "syscall.IP_DIVERTFL": "syscall",
- "syscall.IP_DONTFRAG": "syscall",
- "syscall.IP_DROP_MEMBERSHIP": "syscall",
- "syscall.IP_DROP_SOURCE_MEMBERSHIP": "syscall",
- "syscall.IP_DUMMYNET3": "syscall",
- "syscall.IP_DUMMYNET_CONFIGURE": "syscall",
- "syscall.IP_DUMMYNET_DEL": "syscall",
- "syscall.IP_DUMMYNET_FLUSH": "syscall",
- "syscall.IP_DUMMYNET_GET": "syscall",
- "syscall.IP_EF": "syscall",
- "syscall.IP_ERRORMTU": "syscall",
- "syscall.IP_ESP_NETWORK_LEVEL": "syscall",
- "syscall.IP_ESP_TRANS_LEVEL": "syscall",
- "syscall.IP_FAITH": "syscall",
- "syscall.IP_FREEBIND": "syscall",
- "syscall.IP_FW3": "syscall",
- "syscall.IP_FW_ADD": "syscall",
- "syscall.IP_FW_DEL": "syscall",
- "syscall.IP_FW_FLUSH": "syscall",
- "syscall.IP_FW_GET": "syscall",
- "syscall.IP_FW_NAT_CFG": "syscall",
- "syscall.IP_FW_NAT_DEL": "syscall",
- "syscall.IP_FW_NAT_GET_CONFIG": "syscall",
- "syscall.IP_FW_NAT_GET_LOG": "syscall",
- "syscall.IP_FW_RESETLOG": "syscall",
- "syscall.IP_FW_TABLE_ADD": "syscall",
- "syscall.IP_FW_TABLE_DEL": "syscall",
- "syscall.IP_FW_TABLE_FLUSH": "syscall",
- "syscall.IP_FW_TABLE_GETSIZE": "syscall",
- "syscall.IP_FW_TABLE_LIST": "syscall",
- "syscall.IP_FW_ZERO": "syscall",
- "syscall.IP_HDRINCL": "syscall",
- "syscall.IP_IPCOMP_LEVEL": "syscall",
- "syscall.IP_IPSECFLOWINFO": "syscall",
- "syscall.IP_IPSEC_LOCAL_AUTH": "syscall",
- "syscall.IP_IPSEC_LOCAL_CRED": "syscall",
- "syscall.IP_IPSEC_LOCAL_ID": "syscall",
- "syscall.IP_IPSEC_POLICY": "syscall",
- "syscall.IP_IPSEC_REMOTE_AUTH": "syscall",
- "syscall.IP_IPSEC_REMOTE_CRED": "syscall",
- "syscall.IP_IPSEC_REMOTE_ID": "syscall",
- "syscall.IP_MAXPACKET": "syscall",
- "syscall.IP_MAX_GROUP_SRC_FILTER": "syscall",
- "syscall.IP_MAX_MEMBERSHIPS": "syscall",
- "syscall.IP_MAX_SOCK_MUTE_FILTER": "syscall",
- "syscall.IP_MAX_SOCK_SRC_FILTER": "syscall",
- "syscall.IP_MAX_SOURCE_FILTER": "syscall",
- "syscall.IP_MF": "syscall",
- "syscall.IP_MINFRAGSIZE": "syscall",
- "syscall.IP_MINTTL": "syscall",
- "syscall.IP_MIN_MEMBERSHIPS": "syscall",
- "syscall.IP_MSFILTER": "syscall",
- "syscall.IP_MSS": "syscall",
- "syscall.IP_MTU": "syscall",
- "syscall.IP_MTU_DISCOVER": "syscall",
- "syscall.IP_MULTICAST_IF": "syscall",
- "syscall.IP_MULTICAST_IFINDEX": "syscall",
- "syscall.IP_MULTICAST_LOOP": "syscall",
- "syscall.IP_MULTICAST_TTL": "syscall",
- "syscall.IP_MULTICAST_VIF": "syscall",
- "syscall.IP_NAT__XXX": "syscall",
- "syscall.IP_OFFMASK": "syscall",
- "syscall.IP_OLD_FW_ADD": "syscall",
- "syscall.IP_OLD_FW_DEL": "syscall",
- "syscall.IP_OLD_FW_FLUSH": "syscall",
- "syscall.IP_OLD_FW_GET": "syscall",
- "syscall.IP_OLD_FW_RESETLOG": "syscall",
- "syscall.IP_OLD_FW_ZERO": "syscall",
- "syscall.IP_ONESBCAST": "syscall",
- "syscall.IP_OPTIONS": "syscall",
- "syscall.IP_ORIGDSTADDR": "syscall",
- "syscall.IP_PASSSEC": "syscall",
- "syscall.IP_PIPEX": "syscall",
- "syscall.IP_PKTINFO": "syscall",
- "syscall.IP_PKTOPTIONS": "syscall",
- "syscall.IP_PMTUDISC": "syscall",
- "syscall.IP_PMTUDISC_DO": "syscall",
- "syscall.IP_PMTUDISC_DONT": "syscall",
- "syscall.IP_PMTUDISC_PROBE": "syscall",
- "syscall.IP_PMTUDISC_WANT": "syscall",
- "syscall.IP_PORTRANGE": "syscall",
- "syscall.IP_PORTRANGE_DEFAULT": "syscall",
- "syscall.IP_PORTRANGE_HIGH": "syscall",
- "syscall.IP_PORTRANGE_LOW": "syscall",
- "syscall.IP_RECVDSTADDR": "syscall",
- "syscall.IP_RECVDSTPORT": "syscall",
- "syscall.IP_RECVERR": "syscall",
- "syscall.IP_RECVIF": "syscall",
- "syscall.IP_RECVOPTS": "syscall",
- "syscall.IP_RECVORIGDSTADDR": "syscall",
- "syscall.IP_RECVPKTINFO": "syscall",
- "syscall.IP_RECVRETOPTS": "syscall",
- "syscall.IP_RECVRTABLE": "syscall",
- "syscall.IP_RECVTOS": "syscall",
- "syscall.IP_RECVTTL": "syscall",
- "syscall.IP_RETOPTS": "syscall",
- "syscall.IP_RF": "syscall",
- "syscall.IP_ROUTER_ALERT": "syscall",
- "syscall.IP_RSVP_OFF": "syscall",
- "syscall.IP_RSVP_ON": "syscall",
- "syscall.IP_RSVP_VIF_OFF": "syscall",
- "syscall.IP_RSVP_VIF_ON": "syscall",
- "syscall.IP_RTABLE": "syscall",
- "syscall.IP_SENDSRCADDR": "syscall",
- "syscall.IP_STRIPHDR": "syscall",
- "syscall.IP_TOS": "syscall",
- "syscall.IP_TRAFFIC_MGT_BACKGROUND": "syscall",
- "syscall.IP_TRANSPARENT": "syscall",
- "syscall.IP_TTL": "syscall",
- "syscall.IP_UNBLOCK_SOURCE": "syscall",
- "syscall.IP_XFRM_POLICY": "syscall",
- "syscall.IPv6MTUInfo": "syscall",
- "syscall.IPv6Mreq": "syscall",
- "syscall.ISIG": "syscall",
- "syscall.ISTRIP": "syscall",
- "syscall.IUCLC": "syscall",
- "syscall.IUTF8": "syscall",
- "syscall.IXANY": "syscall",
- "syscall.IXOFF": "syscall",
- "syscall.IXON": "syscall",
- "syscall.IfAddrmsg": "syscall",
- "syscall.IfAnnounceMsghdr": "syscall",
- "syscall.IfData": "syscall",
- "syscall.IfInfomsg": "syscall",
- "syscall.IfMsghdr": "syscall",
- "syscall.IfaMsghdr": "syscall",
- "syscall.IfmaMsghdr": "syscall",
- "syscall.IfmaMsghdr2": "syscall",
- "syscall.ImplementsGetwd": "syscall",
- "syscall.Inet4Pktinfo": "syscall",
- "syscall.Inet6Pktinfo": "syscall",
- "syscall.InotifyAddWatch": "syscall",
- "syscall.InotifyEvent": "syscall",
- "syscall.InotifyInit": "syscall",
- "syscall.InotifyInit1": "syscall",
- "syscall.InotifyRmWatch": "syscall",
- "syscall.InterfaceAddrMessage": "syscall",
- "syscall.InterfaceAnnounceMessage": "syscall",
- "syscall.InterfaceInfo": "syscall",
- "syscall.InterfaceMessage": "syscall",
- "syscall.InterfaceMulticastAddrMessage": "syscall",
- "syscall.InvalidHandle": "syscall",
- "syscall.Ioperm": "syscall",
- "syscall.Iopl": "syscall",
- "syscall.Iovec": "syscall",
- "syscall.IpAdapterInfo": "syscall",
- "syscall.IpAddrString": "syscall",
- "syscall.IpAddressString": "syscall",
- "syscall.IpMaskString": "syscall",
- "syscall.Issetugid": "syscall",
- "syscall.KEY_ALL_ACCESS": "syscall",
- "syscall.KEY_CREATE_LINK": "syscall",
- "syscall.KEY_CREATE_SUB_KEY": "syscall",
- "syscall.KEY_ENUMERATE_SUB_KEYS": "syscall",
- "syscall.KEY_EXECUTE": "syscall",
- "syscall.KEY_NOTIFY": "syscall",
- "syscall.KEY_QUERY_VALUE": "syscall",
- "syscall.KEY_READ": "syscall",
- "syscall.KEY_SET_VALUE": "syscall",
- "syscall.KEY_WOW64_32KEY": "syscall",
- "syscall.KEY_WOW64_64KEY": "syscall",
- "syscall.KEY_WRITE": "syscall",
- "syscall.Kevent": "syscall",
- "syscall.Kevent_t": "syscall",
- "syscall.Kill": "syscall",
- "syscall.Klogctl": "syscall",
- "syscall.Kqueue": "syscall",
- "syscall.LANG_ENGLISH": "syscall",
- "syscall.LAYERED_PROTOCOL": "syscall",
- "syscall.LCNT_OVERLOAD_FLUSH": "syscall",
- "syscall.LINUX_REBOOT_CMD_CAD_OFF": "syscall",
- "syscall.LINUX_REBOOT_CMD_CAD_ON": "syscall",
- "syscall.LINUX_REBOOT_CMD_HALT": "syscall",
- "syscall.LINUX_REBOOT_CMD_KEXEC": "syscall",
- "syscall.LINUX_REBOOT_CMD_POWER_OFF": "syscall",
- "syscall.LINUX_REBOOT_CMD_RESTART": "syscall",
- "syscall.LINUX_REBOOT_CMD_RESTART2": "syscall",
- "syscall.LINUX_REBOOT_CMD_SW_SUSPEND": "syscall",
- "syscall.LINUX_REBOOT_MAGIC1": "syscall",
- "syscall.LINUX_REBOOT_MAGIC2": "syscall",
- "syscall.LOCK_EX": "syscall",
- "syscall.LOCK_NB": "syscall",
- "syscall.LOCK_SH": "syscall",
- "syscall.LOCK_UN": "syscall",
- "syscall.LazyDLL": "syscall",
- "syscall.LazyProc": "syscall",
- "syscall.Lchown": "syscall",
- "syscall.Linger": "syscall",
- "syscall.Link": "syscall",
- "syscall.Listen": "syscall",
- "syscall.Listxattr": "syscall",
- "syscall.LoadCancelIoEx": "syscall",
- "syscall.LoadConnectEx": "syscall",
- "syscall.LoadCreateSymbolicLink": "syscall",
- "syscall.LoadDLL": "syscall",
- "syscall.LoadGetAddrInfo": "syscall",
- "syscall.LoadLibrary": "syscall",
- "syscall.LoadSetFileCompletionNotificationModes": "syscall",
- "syscall.LocalFree": "syscall",
- "syscall.Log2phys_t": "syscall",
- "syscall.LookupAccountName": "syscall",
- "syscall.LookupAccountSid": "syscall",
- "syscall.LookupSID": "syscall",
- "syscall.LsfJump": "syscall",
- "syscall.LsfSocket": "syscall",
- "syscall.LsfStmt": "syscall",
- "syscall.Lstat": "syscall",
- "syscall.MADV_AUTOSYNC": "syscall",
- "syscall.MADV_CAN_REUSE": "syscall",
- "syscall.MADV_CORE": "syscall",
- "syscall.MADV_DOFORK": "syscall",
- "syscall.MADV_DONTFORK": "syscall",
- "syscall.MADV_DONTNEED": "syscall",
- "syscall.MADV_FREE": "syscall",
- "syscall.MADV_FREE_REUSABLE": "syscall",
- "syscall.MADV_FREE_REUSE": "syscall",
- "syscall.MADV_HUGEPAGE": "syscall",
- "syscall.MADV_HWPOISON": "syscall",
- "syscall.MADV_MERGEABLE": "syscall",
- "syscall.MADV_NOCORE": "syscall",
- "syscall.MADV_NOHUGEPAGE": "syscall",
- "syscall.MADV_NORMAL": "syscall",
- "syscall.MADV_NOSYNC": "syscall",
- "syscall.MADV_PROTECT": "syscall",
- "syscall.MADV_RANDOM": "syscall",
- "syscall.MADV_REMOVE": "syscall",
- "syscall.MADV_SEQUENTIAL": "syscall",
- "syscall.MADV_SPACEAVAIL": "syscall",
- "syscall.MADV_UNMERGEABLE": "syscall",
- "syscall.MADV_WILLNEED": "syscall",
- "syscall.MADV_ZERO_WIRED_PAGES": "syscall",
- "syscall.MAP_32BIT": "syscall",
- "syscall.MAP_ALIGNED_SUPER": "syscall",
- "syscall.MAP_ALIGNMENT_16MB": "syscall",
- "syscall.MAP_ALIGNMENT_1TB": "syscall",
- "syscall.MAP_ALIGNMENT_256TB": "syscall",
- "syscall.MAP_ALIGNMENT_4GB": "syscall",
- "syscall.MAP_ALIGNMENT_64KB": "syscall",
- "syscall.MAP_ALIGNMENT_64PB": "syscall",
- "syscall.MAP_ALIGNMENT_MASK": "syscall",
- "syscall.MAP_ALIGNMENT_SHIFT": "syscall",
- "syscall.MAP_ANON": "syscall",
- "syscall.MAP_ANONYMOUS": "syscall",
- "syscall.MAP_COPY": "syscall",
- "syscall.MAP_DENYWRITE": "syscall",
- "syscall.MAP_EXECUTABLE": "syscall",
- "syscall.MAP_FILE": "syscall",
- "syscall.MAP_FIXED": "syscall",
- "syscall.MAP_FLAGMASK": "syscall",
- "syscall.MAP_GROWSDOWN": "syscall",
- "syscall.MAP_HASSEMAPHORE": "syscall",
- "syscall.MAP_HUGETLB": "syscall",
- "syscall.MAP_INHERIT": "syscall",
- "syscall.MAP_INHERIT_COPY": "syscall",
- "syscall.MAP_INHERIT_DEFAULT": "syscall",
- "syscall.MAP_INHERIT_DONATE_COPY": "syscall",
- "syscall.MAP_INHERIT_NONE": "syscall",
- "syscall.MAP_INHERIT_SHARE": "syscall",
- "syscall.MAP_JIT": "syscall",
- "syscall.MAP_LOCKED": "syscall",
- "syscall.MAP_NOCACHE": "syscall",
- "syscall.MAP_NOCORE": "syscall",
- "syscall.MAP_NOEXTEND": "syscall",
- "syscall.MAP_NONBLOCK": "syscall",
- "syscall.MAP_NORESERVE": "syscall",
- "syscall.MAP_NOSYNC": "syscall",
- "syscall.MAP_POPULATE": "syscall",
- "syscall.MAP_PREFAULT_READ": "syscall",
- "syscall.MAP_PRIVATE": "syscall",
- "syscall.MAP_RENAME": "syscall",
- "syscall.MAP_RESERVED0080": "syscall",
- "syscall.MAP_RESERVED0100": "syscall",
- "syscall.MAP_SHARED": "syscall",
- "syscall.MAP_STACK": "syscall",
- "syscall.MAP_TRYFIXED": "syscall",
- "syscall.MAP_TYPE": "syscall",
- "syscall.MAP_WIRED": "syscall",
- "syscall.MAXIMUM_REPARSE_DATA_BUFFER_SIZE": "syscall",
- "syscall.MAXLEN_IFDESCR": "syscall",
- "syscall.MAXLEN_PHYSADDR": "syscall",
- "syscall.MAX_ADAPTER_ADDRESS_LENGTH": "syscall",
- "syscall.MAX_ADAPTER_DESCRIPTION_LENGTH": "syscall",
- "syscall.MAX_ADAPTER_NAME_LENGTH": "syscall",
- "syscall.MAX_COMPUTERNAME_LENGTH": "syscall",
- "syscall.MAX_INTERFACE_NAME_LEN": "syscall",
- "syscall.MAX_LONG_PATH": "syscall",
- "syscall.MAX_PATH": "syscall",
- "syscall.MAX_PROTOCOL_CHAIN": "syscall",
- "syscall.MCL_CURRENT": "syscall",
- "syscall.MCL_FUTURE": "syscall",
- "syscall.MNT_DETACH": "syscall",
- "syscall.MNT_EXPIRE": "syscall",
- "syscall.MNT_FORCE": "syscall",
- "syscall.MSG_BCAST": "syscall",
- "syscall.MSG_CMSG_CLOEXEC": "syscall",
- "syscall.MSG_COMPAT": "syscall",
- "syscall.MSG_CONFIRM": "syscall",
- "syscall.MSG_CONTROLMBUF": "syscall",
- "syscall.MSG_CTRUNC": "syscall",
- "syscall.MSG_DONTROUTE": "syscall",
- "syscall.MSG_DONTWAIT": "syscall",
- "syscall.MSG_EOF": "syscall",
- "syscall.MSG_EOR": "syscall",
- "syscall.MSG_ERRQUEUE": "syscall",
- "syscall.MSG_FASTOPEN": "syscall",
- "syscall.MSG_FIN": "syscall",
- "syscall.MSG_FLUSH": "syscall",
- "syscall.MSG_HAVEMORE": "syscall",
- "syscall.MSG_HOLD": "syscall",
- "syscall.MSG_IOVUSRSPACE": "syscall",
- "syscall.MSG_LENUSRSPACE": "syscall",
- "syscall.MSG_MCAST": "syscall",
- "syscall.MSG_MORE": "syscall",
- "syscall.MSG_NAMEMBUF": "syscall",
- "syscall.MSG_NBIO": "syscall",
- "syscall.MSG_NEEDSA": "syscall",
- "syscall.MSG_NOSIGNAL": "syscall",
- "syscall.MSG_NOTIFICATION": "syscall",
- "syscall.MSG_OOB": "syscall",
- "syscall.MSG_PEEK": "syscall",
- "syscall.MSG_PROXY": "syscall",
- "syscall.MSG_RCVMORE": "syscall",
- "syscall.MSG_RST": "syscall",
- "syscall.MSG_SEND": "syscall",
- "syscall.MSG_SYN": "syscall",
- "syscall.MSG_TRUNC": "syscall",
- "syscall.MSG_TRYHARD": "syscall",
- "syscall.MSG_USERFLAGS": "syscall",
- "syscall.MSG_WAITALL": "syscall",
- "syscall.MSG_WAITFORONE": "syscall",
- "syscall.MSG_WAITSTREAM": "syscall",
- "syscall.MS_ACTIVE": "syscall",
- "syscall.MS_ASYNC": "syscall",
- "syscall.MS_BIND": "syscall",
- "syscall.MS_DEACTIVATE": "syscall",
- "syscall.MS_DIRSYNC": "syscall",
- "syscall.MS_INVALIDATE": "syscall",
- "syscall.MS_I_VERSION": "syscall",
- "syscall.MS_KERNMOUNT": "syscall",
- "syscall.MS_KILLPAGES": "syscall",
- "syscall.MS_MANDLOCK": "syscall",
- "syscall.MS_MGC_MSK": "syscall",
- "syscall.MS_MGC_VAL": "syscall",
- "syscall.MS_MOVE": "syscall",
- "syscall.MS_NOATIME": "syscall",
- "syscall.MS_NODEV": "syscall",
- "syscall.MS_NODIRATIME": "syscall",
- "syscall.MS_NOEXEC": "syscall",
- "syscall.MS_NOSUID": "syscall",
- "syscall.MS_NOUSER": "syscall",
- "syscall.MS_POSIXACL": "syscall",
- "syscall.MS_PRIVATE": "syscall",
- "syscall.MS_RDONLY": "syscall",
- "syscall.MS_REC": "syscall",
- "syscall.MS_RELATIME": "syscall",
- "syscall.MS_REMOUNT": "syscall",
- "syscall.MS_RMT_MASK": "syscall",
- "syscall.MS_SHARED": "syscall",
- "syscall.MS_SILENT": "syscall",
- "syscall.MS_SLAVE": "syscall",
- "syscall.MS_STRICTATIME": "syscall",
- "syscall.MS_SYNC": "syscall",
- "syscall.MS_SYNCHRONOUS": "syscall",
- "syscall.MS_UNBINDABLE": "syscall",
- "syscall.Madvise": "syscall",
- "syscall.MapViewOfFile": "syscall",
- "syscall.MaxTokenInfoClass": "syscall",
- "syscall.Mclpool": "syscall",
- "syscall.MibIfRow": "syscall",
- "syscall.Mkdir": "syscall",
- "syscall.Mkdirat": "syscall",
- "syscall.Mkfifo": "syscall",
- "syscall.Mknod": "syscall",
- "syscall.Mknodat": "syscall",
- "syscall.Mlock": "syscall",
- "syscall.Mlockall": "syscall",
- "syscall.Mmap": "syscall",
- "syscall.Mount": "syscall",
- "syscall.MoveFile": "syscall",
- "syscall.Mprotect": "syscall",
- "syscall.Msghdr": "syscall",
- "syscall.Munlock": "syscall",
- "syscall.Munlockall": "syscall",
- "syscall.Munmap": "syscall",
- "syscall.MustLoadDLL": "syscall",
- "syscall.NAME_MAX": "syscall",
- "syscall.NETLINK_ADD_MEMBERSHIP": "syscall",
- "syscall.NETLINK_AUDIT": "syscall",
- "syscall.NETLINK_BROADCAST_ERROR": "syscall",
- "syscall.NETLINK_CONNECTOR": "syscall",
- "syscall.NETLINK_DNRTMSG": "syscall",
- "syscall.NETLINK_DROP_MEMBERSHIP": "syscall",
- "syscall.NETLINK_ECRYPTFS": "syscall",
- "syscall.NETLINK_FIB_LOOKUP": "syscall",
- "syscall.NETLINK_FIREWALL": "syscall",
- "syscall.NETLINK_GENERIC": "syscall",
- "syscall.NETLINK_INET_DIAG": "syscall",
- "syscall.NETLINK_IP6_FW": "syscall",
- "syscall.NETLINK_ISCSI": "syscall",
- "syscall.NETLINK_KOBJECT_UEVENT": "syscall",
- "syscall.NETLINK_NETFILTER": "syscall",
- "syscall.NETLINK_NFLOG": "syscall",
- "syscall.NETLINK_NO_ENOBUFS": "syscall",
- "syscall.NETLINK_PKTINFO": "syscall",
- "syscall.NETLINK_RDMA": "syscall",
- "syscall.NETLINK_ROUTE": "syscall",
- "syscall.NETLINK_SCSITRANSPORT": "syscall",
- "syscall.NETLINK_SELINUX": "syscall",
- "syscall.NETLINK_UNUSED": "syscall",
- "syscall.NETLINK_USERSOCK": "syscall",
- "syscall.NETLINK_XFRM": "syscall",
- "syscall.NET_RT_DUMP": "syscall",
- "syscall.NET_RT_DUMP2": "syscall",
- "syscall.NET_RT_FLAGS": "syscall",
- "syscall.NET_RT_IFLIST": "syscall",
- "syscall.NET_RT_IFLIST2": "syscall",
- "syscall.NET_RT_IFLISTL": "syscall",
- "syscall.NET_RT_IFMALIST": "syscall",
- "syscall.NET_RT_MAXID": "syscall",
- "syscall.NET_RT_OIFLIST": "syscall",
- "syscall.NET_RT_OOIFLIST": "syscall",
- "syscall.NET_RT_STAT": "syscall",
- "syscall.NET_RT_STATS": "syscall",
- "syscall.NET_RT_TABLE": "syscall",
- "syscall.NET_RT_TRASH": "syscall",
- "syscall.NLA_ALIGNTO": "syscall",
- "syscall.NLA_F_NESTED": "syscall",
- "syscall.NLA_F_NET_BYTEORDER": "syscall",
- "syscall.NLA_HDRLEN": "syscall",
- "syscall.NLMSG_ALIGNTO": "syscall",
- "syscall.NLMSG_DONE": "syscall",
- "syscall.NLMSG_ERROR": "syscall",
- "syscall.NLMSG_HDRLEN": "syscall",
- "syscall.NLMSG_MIN_TYPE": "syscall",
- "syscall.NLMSG_NOOP": "syscall",
- "syscall.NLMSG_OVERRUN": "syscall",
- "syscall.NLM_F_ACK": "syscall",
- "syscall.NLM_F_APPEND": "syscall",
- "syscall.NLM_F_ATOMIC": "syscall",
- "syscall.NLM_F_CREATE": "syscall",
- "syscall.NLM_F_DUMP": "syscall",
- "syscall.NLM_F_ECHO": "syscall",
- "syscall.NLM_F_EXCL": "syscall",
- "syscall.NLM_F_MATCH": "syscall",
- "syscall.NLM_F_MULTI": "syscall",
- "syscall.NLM_F_REPLACE": "syscall",
- "syscall.NLM_F_REQUEST": "syscall",
- "syscall.NLM_F_ROOT": "syscall",
- "syscall.NOFLSH": "syscall",
- "syscall.NOTE_ABSOLUTE": "syscall",
- "syscall.NOTE_ATTRIB": "syscall",
- "syscall.NOTE_CHILD": "syscall",
- "syscall.NOTE_DELETE": "syscall",
- "syscall.NOTE_EOF": "syscall",
- "syscall.NOTE_EXEC": "syscall",
- "syscall.NOTE_EXIT": "syscall",
- "syscall.NOTE_EXITSTATUS": "syscall",
- "syscall.NOTE_EXTEND": "syscall",
- "syscall.NOTE_FFAND": "syscall",
- "syscall.NOTE_FFCOPY": "syscall",
- "syscall.NOTE_FFCTRLMASK": "syscall",
- "syscall.NOTE_FFLAGSMASK": "syscall",
- "syscall.NOTE_FFNOP": "syscall",
- "syscall.NOTE_FFOR": "syscall",
- "syscall.NOTE_FORK": "syscall",
- "syscall.NOTE_LINK": "syscall",
- "syscall.NOTE_LOWAT": "syscall",
- "syscall.NOTE_NONE": "syscall",
- "syscall.NOTE_NSECONDS": "syscall",
- "syscall.NOTE_PCTRLMASK": "syscall",
- "syscall.NOTE_PDATAMASK": "syscall",
- "syscall.NOTE_REAP": "syscall",
- "syscall.NOTE_RENAME": "syscall",
- "syscall.NOTE_RESOURCEEND": "syscall",
- "syscall.NOTE_REVOKE": "syscall",
- "syscall.NOTE_SECONDS": "syscall",
- "syscall.NOTE_SIGNAL": "syscall",
- "syscall.NOTE_TRACK": "syscall",
- "syscall.NOTE_TRACKERR": "syscall",
- "syscall.NOTE_TRIGGER": "syscall",
- "syscall.NOTE_TRUNCATE": "syscall",
- "syscall.NOTE_USECONDS": "syscall",
- "syscall.NOTE_VM_ERROR": "syscall",
- "syscall.NOTE_VM_PRESSURE": "syscall",
- "syscall.NOTE_VM_PRESSURE_SUDDEN_TERMINATE": "syscall",
- "syscall.NOTE_VM_PRESSURE_TERMINATE": "syscall",
- "syscall.NOTE_WRITE": "syscall",
- "syscall.NameCanonical": "syscall",
- "syscall.NameCanonicalEx": "syscall",
- "syscall.NameDisplay": "syscall",
- "syscall.NameDnsDomain": "syscall",
- "syscall.NameFullyQualifiedDN": "syscall",
- "syscall.NameSamCompatible": "syscall",
- "syscall.NameServicePrincipal": "syscall",
- "syscall.NameUniqueId": "syscall",
- "syscall.NameUnknown": "syscall",
- "syscall.NameUserPrincipal": "syscall",
- "syscall.Nanosleep": "syscall",
- "syscall.NetApiBufferFree": "syscall",
- "syscall.NetGetJoinInformation": "syscall",
- "syscall.NetSetupDomainName": "syscall",
- "syscall.NetSetupUnjoined": "syscall",
- "syscall.NetSetupUnknownStatus": "syscall",
- "syscall.NetSetupWorkgroupName": "syscall",
- "syscall.NetUserGetInfo": "syscall",
- "syscall.NetlinkMessage": "syscall",
- "syscall.NetlinkRIB": "syscall",
- "syscall.NetlinkRouteAttr": "syscall",
- "syscall.NetlinkRouteRequest": "syscall",
- "syscall.NewCallback": "syscall",
- "syscall.NewCallbackCDecl": "syscall",
- "syscall.NewLazyDLL": "syscall",
- "syscall.NlAttr": "syscall",
- "syscall.NlMsgerr": "syscall",
- "syscall.NlMsghdr": "syscall",
- "syscall.NsecToFiletime": "syscall",
- "syscall.NsecToTimespec": "syscall",
- "syscall.NsecToTimeval": "syscall",
- "syscall.Ntohs": "syscall",
- "syscall.OCRNL": "syscall",
- "syscall.OFDEL": "syscall",
- "syscall.OFILL": "syscall",
- "syscall.OFIOGETBMAP": "syscall",
- "syscall.OID_PKIX_KP_SERVER_AUTH": "syscall",
- "syscall.OID_SERVER_GATED_CRYPTO": "syscall",
- "syscall.OID_SGC_NETSCAPE": "syscall",
- "syscall.OLCUC": "syscall",
- "syscall.ONLCR": "syscall",
- "syscall.ONLRET": "syscall",
- "syscall.ONOCR": "syscall",
- "syscall.ONOEOT": "syscall",
- "syscall.OPEN_ALWAYS": "syscall",
- "syscall.OPEN_EXISTING": "syscall",
- "syscall.OPOST": "syscall",
- "syscall.O_ACCMODE": "syscall",
- "syscall.O_ALERT": "syscall",
- "syscall.O_ALT_IO": "syscall",
- "syscall.O_APPEND": "syscall",
- "syscall.O_ASYNC": "syscall",
- "syscall.O_CLOEXEC": "syscall",
- "syscall.O_CREAT": "syscall",
- "syscall.O_DIRECT": "syscall",
- "syscall.O_DIRECTORY": "syscall",
- "syscall.O_DSYNC": "syscall",
- "syscall.O_EVTONLY": "syscall",
- "syscall.O_EXCL": "syscall",
- "syscall.O_EXEC": "syscall",
- "syscall.O_EXLOCK": "syscall",
- "syscall.O_FSYNC": "syscall",
- "syscall.O_LARGEFILE": "syscall",
- "syscall.O_NDELAY": "syscall",
- "syscall.O_NOATIME": "syscall",
- "syscall.O_NOCTTY": "syscall",
- "syscall.O_NOFOLLOW": "syscall",
- "syscall.O_NONBLOCK": "syscall",
- "syscall.O_NOSIGPIPE": "syscall",
- "syscall.O_POPUP": "syscall",
- "syscall.O_RDONLY": "syscall",
- "syscall.O_RDWR": "syscall",
- "syscall.O_RSYNC": "syscall",
- "syscall.O_SHLOCK": "syscall",
- "syscall.O_SYMLINK": "syscall",
- "syscall.O_SYNC": "syscall",
- "syscall.O_TRUNC": "syscall",
- "syscall.O_TTY_INIT": "syscall",
- "syscall.O_WRONLY": "syscall",
- "syscall.Open": "syscall",
- "syscall.OpenCurrentProcessToken": "syscall",
- "syscall.OpenProcess": "syscall",
- "syscall.OpenProcessToken": "syscall",
- "syscall.Openat": "syscall",
- "syscall.Overlapped": "syscall",
- "syscall.PACKET_ADD_MEMBERSHIP": "syscall",
- "syscall.PACKET_BROADCAST": "syscall",
- "syscall.PACKET_DROP_MEMBERSHIP": "syscall",
- "syscall.PACKET_FASTROUTE": "syscall",
- "syscall.PACKET_HOST": "syscall",
- "syscall.PACKET_LOOPBACK": "syscall",
- "syscall.PACKET_MR_ALLMULTI": "syscall",
- "syscall.PACKET_MR_MULTICAST": "syscall",
- "syscall.PACKET_MR_PROMISC": "syscall",
- "syscall.PACKET_MULTICAST": "syscall",
- "syscall.PACKET_OTHERHOST": "syscall",
- "syscall.PACKET_OUTGOING": "syscall",
- "syscall.PACKET_RECV_OUTPUT": "syscall",
- "syscall.PACKET_RX_RING": "syscall",
- "syscall.PACKET_STATISTICS": "syscall",
- "syscall.PAGE_EXECUTE_READ": "syscall",
- "syscall.PAGE_EXECUTE_READWRITE": "syscall",
- "syscall.PAGE_EXECUTE_WRITECOPY": "syscall",
- "syscall.PAGE_READONLY": "syscall",
- "syscall.PAGE_READWRITE": "syscall",
- "syscall.PAGE_WRITECOPY": "syscall",
- "syscall.PARENB": "syscall",
- "syscall.PARMRK": "syscall",
- "syscall.PARODD": "syscall",
- "syscall.PENDIN": "syscall",
- "syscall.PFL_HIDDEN": "syscall",
- "syscall.PFL_MATCHES_PROTOCOL_ZERO": "syscall",
- "syscall.PFL_MULTIPLE_PROTO_ENTRIES": "syscall",
- "syscall.PFL_NETWORKDIRECT_PROVIDER": "syscall",
- "syscall.PFL_RECOMMENDED_PROTO_ENTRY": "syscall",
- "syscall.PF_FLUSH": "syscall",
- "syscall.PKCS_7_ASN_ENCODING": "syscall",
- "syscall.PMC5_PIPELINE_FLUSH": "syscall",
- "syscall.PRIO_PGRP": "syscall",
- "syscall.PRIO_PROCESS": "syscall",
- "syscall.PRIO_USER": "syscall",
- "syscall.PRI_IOFLUSH": "syscall",
- "syscall.PROCESS_QUERY_INFORMATION": "syscall",
- "syscall.PROCESS_TERMINATE": "syscall",
- "syscall.PROT_EXEC": "syscall",
- "syscall.PROT_GROWSDOWN": "syscall",
- "syscall.PROT_GROWSUP": "syscall",
- "syscall.PROT_NONE": "syscall",
- "syscall.PROT_READ": "syscall",
- "syscall.PROT_WRITE": "syscall",
- "syscall.PROV_DH_SCHANNEL": "syscall",
- "syscall.PROV_DSS": "syscall",
- "syscall.PROV_DSS_DH": "syscall",
- "syscall.PROV_EC_ECDSA_FULL": "syscall",
- "syscall.PROV_EC_ECDSA_SIG": "syscall",
- "syscall.PROV_EC_ECNRA_FULL": "syscall",
- "syscall.PROV_EC_ECNRA_SIG": "syscall",
- "syscall.PROV_FORTEZZA": "syscall",
- "syscall.PROV_INTEL_SEC": "syscall",
- "syscall.PROV_MS_EXCHANGE": "syscall",
- "syscall.PROV_REPLACE_OWF": "syscall",
- "syscall.PROV_RNG": "syscall",
- "syscall.PROV_RSA_AES": "syscall",
- "syscall.PROV_RSA_FULL": "syscall",
- "syscall.PROV_RSA_SCHANNEL": "syscall",
- "syscall.PROV_RSA_SIG": "syscall",
- "syscall.PROV_SPYRUS_LYNKS": "syscall",
- "syscall.PROV_SSL": "syscall",
- "syscall.PR_CAPBSET_DROP": "syscall",
- "syscall.PR_CAPBSET_READ": "syscall",
- "syscall.PR_CLEAR_SECCOMP_FILTER": "syscall",
- "syscall.PR_ENDIAN_BIG": "syscall",
- "syscall.PR_ENDIAN_LITTLE": "syscall",
- "syscall.PR_ENDIAN_PPC_LITTLE": "syscall",
- "syscall.PR_FPEMU_NOPRINT": "syscall",
- "syscall.PR_FPEMU_SIGFPE": "syscall",
- "syscall.PR_FP_EXC_ASYNC": "syscall",
- "syscall.PR_FP_EXC_DISABLED": "syscall",
- "syscall.PR_FP_EXC_DIV": "syscall",
- "syscall.PR_FP_EXC_INV": "syscall",
- "syscall.PR_FP_EXC_NONRECOV": "syscall",
- "syscall.PR_FP_EXC_OVF": "syscall",
- "syscall.PR_FP_EXC_PRECISE": "syscall",
- "syscall.PR_FP_EXC_RES": "syscall",
- "syscall.PR_FP_EXC_SW_ENABLE": "syscall",
- "syscall.PR_FP_EXC_UND": "syscall",
- "syscall.PR_GET_DUMPABLE": "syscall",
- "syscall.PR_GET_ENDIAN": "syscall",
- "syscall.PR_GET_FPEMU": "syscall",
- "syscall.PR_GET_FPEXC": "syscall",
- "syscall.PR_GET_KEEPCAPS": "syscall",
- "syscall.PR_GET_NAME": "syscall",
- "syscall.PR_GET_PDEATHSIG": "syscall",
- "syscall.PR_GET_SECCOMP": "syscall",
- "syscall.PR_GET_SECCOMP_FILTER": "syscall",
- "syscall.PR_GET_SECUREBITS": "syscall",
- "syscall.PR_GET_TIMERSLACK": "syscall",
- "syscall.PR_GET_TIMING": "syscall",
- "syscall.PR_GET_TSC": "syscall",
- "syscall.PR_GET_UNALIGN": "syscall",
- "syscall.PR_MCE_KILL": "syscall",
- "syscall.PR_MCE_KILL_CLEAR": "syscall",
- "syscall.PR_MCE_KILL_DEFAULT": "syscall",
- "syscall.PR_MCE_KILL_EARLY": "syscall",
- "syscall.PR_MCE_KILL_GET": "syscall",
- "syscall.PR_MCE_KILL_LATE": "syscall",
- "syscall.PR_MCE_KILL_SET": "syscall",
- "syscall.PR_SECCOMP_FILTER_EVENT": "syscall",
- "syscall.PR_SECCOMP_FILTER_SYSCALL": "syscall",
- "syscall.PR_SET_DUMPABLE": "syscall",
- "syscall.PR_SET_ENDIAN": "syscall",
- "syscall.PR_SET_FPEMU": "syscall",
- "syscall.PR_SET_FPEXC": "syscall",
- "syscall.PR_SET_KEEPCAPS": "syscall",
- "syscall.PR_SET_NAME": "syscall",
- "syscall.PR_SET_PDEATHSIG": "syscall",
- "syscall.PR_SET_PTRACER": "syscall",
- "syscall.PR_SET_SECCOMP": "syscall",
- "syscall.PR_SET_SECCOMP_FILTER": "syscall",
- "syscall.PR_SET_SECUREBITS": "syscall",
- "syscall.PR_SET_TIMERSLACK": "syscall",
- "syscall.PR_SET_TIMING": "syscall",
- "syscall.PR_SET_TSC": "syscall",
- "syscall.PR_SET_UNALIGN": "syscall",
- "syscall.PR_TASK_PERF_EVENTS_DISABLE": "syscall",
- "syscall.PR_TASK_PERF_EVENTS_ENABLE": "syscall",
- "syscall.PR_TIMING_STATISTICAL": "syscall",
- "syscall.PR_TIMING_TIMESTAMP": "syscall",
- "syscall.PR_TSC_ENABLE": "syscall",
- "syscall.PR_TSC_SIGSEGV": "syscall",
- "syscall.PR_UNALIGN_NOPRINT": "syscall",
- "syscall.PR_UNALIGN_SIGBUS": "syscall",
- "syscall.PTRACE_ARCH_PRCTL": "syscall",
- "syscall.PTRACE_ATTACH": "syscall",
- "syscall.PTRACE_CONT": "syscall",
- "syscall.PTRACE_DETACH": "syscall",
- "syscall.PTRACE_EVENT_CLONE": "syscall",
- "syscall.PTRACE_EVENT_EXEC": "syscall",
- "syscall.PTRACE_EVENT_EXIT": "syscall",
- "syscall.PTRACE_EVENT_FORK": "syscall",
- "syscall.PTRACE_EVENT_VFORK": "syscall",
- "syscall.PTRACE_EVENT_VFORK_DONE": "syscall",
- "syscall.PTRACE_GETCRUNCHREGS": "syscall",
- "syscall.PTRACE_GETEVENTMSG": "syscall",
- "syscall.PTRACE_GETFPREGS": "syscall",
- "syscall.PTRACE_GETFPXREGS": "syscall",
- "syscall.PTRACE_GETHBPREGS": "syscall",
- "syscall.PTRACE_GETREGS": "syscall",
- "syscall.PTRACE_GETREGSET": "syscall",
- "syscall.PTRACE_GETSIGINFO": "syscall",
- "syscall.PTRACE_GETVFPREGS": "syscall",
- "syscall.PTRACE_GETWMMXREGS": "syscall",
- "syscall.PTRACE_GET_THREAD_AREA": "syscall",
- "syscall.PTRACE_KILL": "syscall",
- "syscall.PTRACE_OLDSETOPTIONS": "syscall",
- "syscall.PTRACE_O_MASK": "syscall",
- "syscall.PTRACE_O_TRACECLONE": "syscall",
- "syscall.PTRACE_O_TRACEEXEC": "syscall",
- "syscall.PTRACE_O_TRACEEXIT": "syscall",
- "syscall.PTRACE_O_TRACEFORK": "syscall",
- "syscall.PTRACE_O_TRACESYSGOOD": "syscall",
- "syscall.PTRACE_O_TRACEVFORK": "syscall",
- "syscall.PTRACE_O_TRACEVFORKDONE": "syscall",
- "syscall.PTRACE_PEEKDATA": "syscall",
- "syscall.PTRACE_PEEKTEXT": "syscall",
- "syscall.PTRACE_PEEKUSR": "syscall",
- "syscall.PTRACE_POKEDATA": "syscall",
- "syscall.PTRACE_POKETEXT": "syscall",
- "syscall.PTRACE_POKEUSR": "syscall",
- "syscall.PTRACE_SETCRUNCHREGS": "syscall",
- "syscall.PTRACE_SETFPREGS": "syscall",
- "syscall.PTRACE_SETFPXREGS": "syscall",
- "syscall.PTRACE_SETHBPREGS": "syscall",
- "syscall.PTRACE_SETOPTIONS": "syscall",
- "syscall.PTRACE_SETREGS": "syscall",
- "syscall.PTRACE_SETREGSET": "syscall",
- "syscall.PTRACE_SETSIGINFO": "syscall",
- "syscall.PTRACE_SETVFPREGS": "syscall",
- "syscall.PTRACE_SETWMMXREGS": "syscall",
- "syscall.PTRACE_SET_SYSCALL": "syscall",
- "syscall.PTRACE_SET_THREAD_AREA": "syscall",
- "syscall.PTRACE_SINGLEBLOCK": "syscall",
- "syscall.PTRACE_SINGLESTEP": "syscall",
- "syscall.PTRACE_SYSCALL": "syscall",
- "syscall.PTRACE_SYSEMU": "syscall",
- "syscall.PTRACE_SYSEMU_SINGLESTEP": "syscall",
- "syscall.PTRACE_TRACEME": "syscall",
- "syscall.PT_ATTACH": "syscall",
- "syscall.PT_ATTACHEXC": "syscall",
- "syscall.PT_CONTINUE": "syscall",
- "syscall.PT_DATA_ADDR": "syscall",
- "syscall.PT_DENY_ATTACH": "syscall",
- "syscall.PT_DETACH": "syscall",
- "syscall.PT_FIRSTMACH": "syscall",
- "syscall.PT_FORCEQUOTA": "syscall",
- "syscall.PT_KILL": "syscall",
- "syscall.PT_MASK": "syscall",
- "syscall.PT_READ_D": "syscall",
- "syscall.PT_READ_I": "syscall",
- "syscall.PT_READ_U": "syscall",
- "syscall.PT_SIGEXC": "syscall",
- "syscall.PT_STEP": "syscall",
- "syscall.PT_TEXT_ADDR": "syscall",
- "syscall.PT_TEXT_END_ADDR": "syscall",
- "syscall.PT_THUPDATE": "syscall",
- "syscall.PT_TRACE_ME": "syscall",
- "syscall.PT_WRITE_D": "syscall",
- "syscall.PT_WRITE_I": "syscall",
- "syscall.PT_WRITE_U": "syscall",
- "syscall.ParseDirent": "syscall",
- "syscall.ParseNetlinkMessage": "syscall",
- "syscall.ParseNetlinkRouteAttr": "syscall",
- "syscall.ParseRoutingMessage": "syscall",
- "syscall.ParseRoutingSockaddr": "syscall",
- "syscall.ParseSocketControlMessage": "syscall",
- "syscall.ParseUnixCredentials": "syscall",
- "syscall.ParseUnixRights": "syscall",
- "syscall.PathMax": "syscall",
- "syscall.Pathconf": "syscall",
- "syscall.Pause": "syscall",
- "syscall.Pipe": "syscall",
- "syscall.Pipe2": "syscall",
- "syscall.PivotRoot": "syscall",
- "syscall.PostQueuedCompletionStatus": "syscall",
- "syscall.Pread": "syscall",
- "syscall.Proc": "syscall",
- "syscall.ProcAttr": "syscall",
- "syscall.Process32First": "syscall",
- "syscall.Process32Next": "syscall",
- "syscall.ProcessEntry32": "syscall",
- "syscall.ProcessInformation": "syscall",
- "syscall.Protoent": "syscall",
- "syscall.PtraceAttach": "syscall",
- "syscall.PtraceCont": "syscall",
- "syscall.PtraceDetach": "syscall",
- "syscall.PtraceGetEventMsg": "syscall",
- "syscall.PtraceGetRegs": "syscall",
- "syscall.PtracePeekData": "syscall",
- "syscall.PtracePeekText": "syscall",
- "syscall.PtracePokeData": "syscall",
- "syscall.PtracePokeText": "syscall",
- "syscall.PtraceRegs": "syscall",
- "syscall.PtraceSetOptions": "syscall",
- "syscall.PtraceSetRegs": "syscall",
- "syscall.PtraceSingleStep": "syscall",
- "syscall.PtraceSyscall": "syscall",
- "syscall.Pwrite": "syscall",
- "syscall.REG_BINARY": "syscall",
- "syscall.REG_DWORD": "syscall",
- "syscall.REG_DWORD_BIG_ENDIAN": "syscall",
- "syscall.REG_DWORD_LITTLE_ENDIAN": "syscall",
- "syscall.REG_EXPAND_SZ": "syscall",
- "syscall.REG_FULL_RESOURCE_DESCRIPTOR": "syscall",
- "syscall.REG_LINK": "syscall",
- "syscall.REG_MULTI_SZ": "syscall",
- "syscall.REG_NONE": "syscall",
- "syscall.REG_QWORD": "syscall",
- "syscall.REG_QWORD_LITTLE_ENDIAN": "syscall",
- "syscall.REG_RESOURCE_LIST": "syscall",
- "syscall.REG_RESOURCE_REQUIREMENTS_LIST": "syscall",
- "syscall.REG_SZ": "syscall",
- "syscall.RLIMIT_AS": "syscall",
- "syscall.RLIMIT_CORE": "syscall",
- "syscall.RLIMIT_CPU": "syscall",
- "syscall.RLIMIT_DATA": "syscall",
- "syscall.RLIMIT_FSIZE": "syscall",
- "syscall.RLIMIT_NOFILE": "syscall",
- "syscall.RLIMIT_STACK": "syscall",
- "syscall.RLIM_INFINITY": "syscall",
- "syscall.RTAX_ADVMSS": "syscall",
- "syscall.RTAX_AUTHOR": "syscall",
- "syscall.RTAX_BRD": "syscall",
- "syscall.RTAX_CWND": "syscall",
- "syscall.RTAX_DST": "syscall",
- "syscall.RTAX_FEATURES": "syscall",
- "syscall.RTAX_FEATURE_ALLFRAG": "syscall",
- "syscall.RTAX_FEATURE_ECN": "syscall",
- "syscall.RTAX_FEATURE_SACK": "syscall",
- "syscall.RTAX_FEATURE_TIMESTAMP": "syscall",
- "syscall.RTAX_GATEWAY": "syscall",
- "syscall.RTAX_GENMASK": "syscall",
- "syscall.RTAX_HOPLIMIT": "syscall",
- "syscall.RTAX_IFA": "syscall",
- "syscall.RTAX_IFP": "syscall",
- "syscall.RTAX_INITCWND": "syscall",
- "syscall.RTAX_INITRWND": "syscall",
- "syscall.RTAX_LABEL": "syscall",
- "syscall.RTAX_LOCK": "syscall",
- "syscall.RTAX_MAX": "syscall",
- "syscall.RTAX_MTU": "syscall",
- "syscall.RTAX_NETMASK": "syscall",
- "syscall.RTAX_REORDERING": "syscall",
- "syscall.RTAX_RTO_MIN": "syscall",
- "syscall.RTAX_RTT": "syscall",
- "syscall.RTAX_RTTVAR": "syscall",
- "syscall.RTAX_SRC": "syscall",
- "syscall.RTAX_SRCMASK": "syscall",
- "syscall.RTAX_SSTHRESH": "syscall",
- "syscall.RTAX_TAG": "syscall",
- "syscall.RTAX_UNSPEC": "syscall",
- "syscall.RTAX_WINDOW": "syscall",
- "syscall.RTA_ALIGNTO": "syscall",
- "syscall.RTA_AUTHOR": "syscall",
- "syscall.RTA_BRD": "syscall",
- "syscall.RTA_CACHEINFO": "syscall",
- "syscall.RTA_DST": "syscall",
- "syscall.RTA_FLOW": "syscall",
- "syscall.RTA_GATEWAY": "syscall",
- "syscall.RTA_GENMASK": "syscall",
- "syscall.RTA_IFA": "syscall",
- "syscall.RTA_IFP": "syscall",
- "syscall.RTA_IIF": "syscall",
- "syscall.RTA_LABEL": "syscall",
- "syscall.RTA_MAX": "syscall",
- "syscall.RTA_METRICS": "syscall",
- "syscall.RTA_MULTIPATH": "syscall",
- "syscall.RTA_NETMASK": "syscall",
- "syscall.RTA_OIF": "syscall",
- "syscall.RTA_PREFSRC": "syscall",
- "syscall.RTA_PRIORITY": "syscall",
- "syscall.RTA_SRC": "syscall",
- "syscall.RTA_SRCMASK": "syscall",
- "syscall.RTA_TABLE": "syscall",
- "syscall.RTA_TAG": "syscall",
- "syscall.RTA_UNSPEC": "syscall",
- "syscall.RTCF_DIRECTSRC": "syscall",
- "syscall.RTCF_DOREDIRECT": "syscall",
- "syscall.RTCF_LOG": "syscall",
- "syscall.RTCF_MASQ": "syscall",
- "syscall.RTCF_NAT": "syscall",
- "syscall.RTCF_VALVE": "syscall",
- "syscall.RTF_ADDRCLASSMASK": "syscall",
- "syscall.RTF_ADDRCONF": "syscall",
- "syscall.RTF_ALLONLINK": "syscall",
- "syscall.RTF_ANNOUNCE": "syscall",
- "syscall.RTF_BLACKHOLE": "syscall",
- "syscall.RTF_BROADCAST": "syscall",
- "syscall.RTF_CACHE": "syscall",
- "syscall.RTF_CLONED": "syscall",
- "syscall.RTF_CLONING": "syscall",
- "syscall.RTF_CONDEMNED": "syscall",
- "syscall.RTF_DEFAULT": "syscall",
- "syscall.RTF_DELCLONE": "syscall",
- "syscall.RTF_DONE": "syscall",
- "syscall.RTF_DYNAMIC": "syscall",
- "syscall.RTF_FLOW": "syscall",
- "syscall.RTF_FMASK": "syscall",
- "syscall.RTF_GATEWAY": "syscall",
- "syscall.RTF_GWFLAG_COMPAT": "syscall",
- "syscall.RTF_HOST": "syscall",
- "syscall.RTF_IFREF": "syscall",
- "syscall.RTF_IFSCOPE": "syscall",
- "syscall.RTF_INTERFACE": "syscall",
- "syscall.RTF_IRTT": "syscall",
- "syscall.RTF_LINKRT": "syscall",
- "syscall.RTF_LLDATA": "syscall",
- "syscall.RTF_LLINFO": "syscall",
- "syscall.RTF_LOCAL": "syscall",
- "syscall.RTF_MASK": "syscall",
- "syscall.RTF_MODIFIED": "syscall",
- "syscall.RTF_MPATH": "syscall",
- "syscall.RTF_MPLS": "syscall",
- "syscall.RTF_MSS": "syscall",
- "syscall.RTF_MTU": "syscall",
- "syscall.RTF_MULTICAST": "syscall",
- "syscall.RTF_NAT": "syscall",
- "syscall.RTF_NOFORWARD": "syscall",
- "syscall.RTF_NONEXTHOP": "syscall",
- "syscall.RTF_NOPMTUDISC": "syscall",
- "syscall.RTF_PERMANENT_ARP": "syscall",
- "syscall.RTF_PINNED": "syscall",
- "syscall.RTF_POLICY": "syscall",
- "syscall.RTF_PRCLONING": "syscall",
- "syscall.RTF_PROTO1": "syscall",
- "syscall.RTF_PROTO2": "syscall",
- "syscall.RTF_PROTO3": "syscall",
- "syscall.RTF_REINSTATE": "syscall",
- "syscall.RTF_REJECT": "syscall",
- "syscall.RTF_RNH_LOCKED": "syscall",
- "syscall.RTF_SOURCE": "syscall",
- "syscall.RTF_SRC": "syscall",
- "syscall.RTF_STATIC": "syscall",
- "syscall.RTF_STICKY": "syscall",
- "syscall.RTF_THROW": "syscall",
- "syscall.RTF_TUNNEL": "syscall",
- "syscall.RTF_UP": "syscall",
- "syscall.RTF_USETRAILERS": "syscall",
- "syscall.RTF_WASCLONED": "syscall",
- "syscall.RTF_WINDOW": "syscall",
- "syscall.RTF_XRESOLVE": "syscall",
- "syscall.RTM_ADD": "syscall",
- "syscall.RTM_BASE": "syscall",
- "syscall.RTM_CHANGE": "syscall",
- "syscall.RTM_CHGADDR": "syscall",
- "syscall.RTM_DELACTION": "syscall",
- "syscall.RTM_DELADDR": "syscall",
- "syscall.RTM_DELADDRLABEL": "syscall",
- "syscall.RTM_DELETE": "syscall",
- "syscall.RTM_DELLINK": "syscall",
- "syscall.RTM_DELMADDR": "syscall",
- "syscall.RTM_DELNEIGH": "syscall",
- "syscall.RTM_DELQDISC": "syscall",
- "syscall.RTM_DELROUTE": "syscall",
- "syscall.RTM_DELRULE": "syscall",
- "syscall.RTM_DELTCLASS": "syscall",
- "syscall.RTM_DELTFILTER": "syscall",
- "syscall.RTM_DESYNC": "syscall",
- "syscall.RTM_F_CLONED": "syscall",
- "syscall.RTM_F_EQUALIZE": "syscall",
- "syscall.RTM_F_NOTIFY": "syscall",
- "syscall.RTM_F_PREFIX": "syscall",
- "syscall.RTM_GET": "syscall",
- "syscall.RTM_GET2": "syscall",
- "syscall.RTM_GETACTION": "syscall",
- "syscall.RTM_GETADDR": "syscall",
- "syscall.RTM_GETADDRLABEL": "syscall",
- "syscall.RTM_GETANYCAST": "syscall",
- "syscall.RTM_GETDCB": "syscall",
- "syscall.RTM_GETLINK": "syscall",
- "syscall.RTM_GETMULTICAST": "syscall",
- "syscall.RTM_GETNEIGH": "syscall",
- "syscall.RTM_GETNEIGHTBL": "syscall",
- "syscall.RTM_GETQDISC": "syscall",
- "syscall.RTM_GETROUTE": "syscall",
- "syscall.RTM_GETRULE": "syscall",
- "syscall.RTM_GETTCLASS": "syscall",
- "syscall.RTM_GETTFILTER": "syscall",
- "syscall.RTM_IEEE80211": "syscall",
- "syscall.RTM_IFANNOUNCE": "syscall",
- "syscall.RTM_IFINFO": "syscall",
- "syscall.RTM_IFINFO2": "syscall",
- "syscall.RTM_LLINFO_UPD": "syscall",
- "syscall.RTM_LOCK": "syscall",
- "syscall.RTM_LOSING": "syscall",
- "syscall.RTM_MAX": "syscall",
- "syscall.RTM_MAXSIZE": "syscall",
- "syscall.RTM_MISS": "syscall",
- "syscall.RTM_NEWACTION": "syscall",
- "syscall.RTM_NEWADDR": "syscall",
- "syscall.RTM_NEWADDRLABEL": "syscall",
- "syscall.RTM_NEWLINK": "syscall",
- "syscall.RTM_NEWMADDR": "syscall",
- "syscall.RTM_NEWMADDR2": "syscall",
- "syscall.RTM_NEWNDUSEROPT": "syscall",
- "syscall.RTM_NEWNEIGH": "syscall",
- "syscall.RTM_NEWNEIGHTBL": "syscall",
- "syscall.RTM_NEWPREFIX": "syscall",
- "syscall.RTM_NEWQDISC": "syscall",
- "syscall.RTM_NEWROUTE": "syscall",
- "syscall.RTM_NEWRULE": "syscall",
- "syscall.RTM_NEWTCLASS": "syscall",
- "syscall.RTM_NEWTFILTER": "syscall",
- "syscall.RTM_NR_FAMILIES": "syscall",
- "syscall.RTM_NR_MSGTYPES": "syscall",
- "syscall.RTM_OIFINFO": "syscall",
- "syscall.RTM_OLDADD": "syscall",
- "syscall.RTM_OLDDEL": "syscall",
- "syscall.RTM_OOIFINFO": "syscall",
- "syscall.RTM_REDIRECT": "syscall",
- "syscall.RTM_RESOLVE": "syscall",
- "syscall.RTM_RTTUNIT": "syscall",
- "syscall.RTM_SETDCB": "syscall",
- "syscall.RTM_SETGATE": "syscall",
- "syscall.RTM_SETLINK": "syscall",
- "syscall.RTM_SETNEIGHTBL": "syscall",
- "syscall.RTM_VERSION": "syscall",
- "syscall.RTNH_ALIGNTO": "syscall",
- "syscall.RTNH_F_DEAD": "syscall",
- "syscall.RTNH_F_ONLINK": "syscall",
- "syscall.RTNH_F_PERVASIVE": "syscall",
- "syscall.RTNLGRP_IPV4_IFADDR": "syscall",
- "syscall.RTNLGRP_IPV4_MROUTE": "syscall",
- "syscall.RTNLGRP_IPV4_ROUTE": "syscall",
- "syscall.RTNLGRP_IPV4_RULE": "syscall",
- "syscall.RTNLGRP_IPV6_IFADDR": "syscall",
- "syscall.RTNLGRP_IPV6_IFINFO": "syscall",
- "syscall.RTNLGRP_IPV6_MROUTE": "syscall",
- "syscall.RTNLGRP_IPV6_PREFIX": "syscall",
- "syscall.RTNLGRP_IPV6_ROUTE": "syscall",
- "syscall.RTNLGRP_IPV6_RULE": "syscall",
- "syscall.RTNLGRP_LINK": "syscall",
- "syscall.RTNLGRP_ND_USEROPT": "syscall",
- "syscall.RTNLGRP_NEIGH": "syscall",
- "syscall.RTNLGRP_NONE": "syscall",
- "syscall.RTNLGRP_NOTIFY": "syscall",
- "syscall.RTNLGRP_TC": "syscall",
- "syscall.RTN_ANYCAST": "syscall",
- "syscall.RTN_BLACKHOLE": "syscall",
- "syscall.RTN_BROADCAST": "syscall",
- "syscall.RTN_LOCAL": "syscall",
- "syscall.RTN_MAX": "syscall",
- "syscall.RTN_MULTICAST": "syscall",
- "syscall.RTN_NAT": "syscall",
- "syscall.RTN_PROHIBIT": "syscall",
- "syscall.RTN_THROW": "syscall",
- "syscall.RTN_UNICAST": "syscall",
- "syscall.RTN_UNREACHABLE": "syscall",
- "syscall.RTN_UNSPEC": "syscall",
- "syscall.RTN_XRESOLVE": "syscall",
- "syscall.RTPROT_BIRD": "syscall",
- "syscall.RTPROT_BOOT": "syscall",
- "syscall.RTPROT_DHCP": "syscall",
- "syscall.RTPROT_DNROUTED": "syscall",
- "syscall.RTPROT_GATED": "syscall",
- "syscall.RTPROT_KERNEL": "syscall",
- "syscall.RTPROT_MRT": "syscall",
- "syscall.RTPROT_NTK": "syscall",
- "syscall.RTPROT_RA": "syscall",
- "syscall.RTPROT_REDIRECT": "syscall",
- "syscall.RTPROT_STATIC": "syscall",
- "syscall.RTPROT_UNSPEC": "syscall",
- "syscall.RTPROT_XORP": "syscall",
- "syscall.RTPROT_ZEBRA": "syscall",
- "syscall.RTV_EXPIRE": "syscall",
- "syscall.RTV_HOPCOUNT": "syscall",
- "syscall.RTV_MTU": "syscall",
- "syscall.RTV_RPIPE": "syscall",
- "syscall.RTV_RTT": "syscall",
- "syscall.RTV_RTTVAR": "syscall",
- "syscall.RTV_SPIPE": "syscall",
- "syscall.RTV_SSTHRESH": "syscall",
- "syscall.RTV_WEIGHT": "syscall",
- "syscall.RT_CACHING_CONTEXT": "syscall",
- "syscall.RT_CLASS_DEFAULT": "syscall",
- "syscall.RT_CLASS_LOCAL": "syscall",
- "syscall.RT_CLASS_MAIN": "syscall",
- "syscall.RT_CLASS_MAX": "syscall",
- "syscall.RT_CLASS_UNSPEC": "syscall",
- "syscall.RT_DEFAULT_FIB": "syscall",
- "syscall.RT_NORTREF": "syscall",
- "syscall.RT_SCOPE_HOST": "syscall",
- "syscall.RT_SCOPE_LINK": "syscall",
- "syscall.RT_SCOPE_NOWHERE": "syscall",
- "syscall.RT_SCOPE_SITE": "syscall",
- "syscall.RT_SCOPE_UNIVERSE": "syscall",
- "syscall.RT_TABLEID_MAX": "syscall",
- "syscall.RT_TABLE_COMPAT": "syscall",
- "syscall.RT_TABLE_DEFAULT": "syscall",
- "syscall.RT_TABLE_LOCAL": "syscall",
- "syscall.RT_TABLE_MAIN": "syscall",
- "syscall.RT_TABLE_MAX": "syscall",
- "syscall.RT_TABLE_UNSPEC": "syscall",
- "syscall.RUSAGE_CHILDREN": "syscall",
- "syscall.RUSAGE_SELF": "syscall",
- "syscall.RUSAGE_THREAD": "syscall",
- "syscall.Radvisory_t": "syscall",
- "syscall.RawConn": "syscall",
- "syscall.RawSockaddr": "syscall",
- "syscall.RawSockaddrAny": "syscall",
- "syscall.RawSockaddrDatalink": "syscall",
- "syscall.RawSockaddrInet4": "syscall",
- "syscall.RawSockaddrInet6": "syscall",
- "syscall.RawSockaddrLinklayer": "syscall",
- "syscall.RawSockaddrNetlink": "syscall",
- "syscall.RawSockaddrUnix": "syscall",
- "syscall.RawSyscall": "syscall",
- "syscall.RawSyscall6": "syscall",
- "syscall.Read": "syscall",
- "syscall.ReadConsole": "syscall",
- "syscall.ReadDirectoryChanges": "syscall",
- "syscall.ReadDirent": "syscall",
- "syscall.ReadFile": "syscall",
- "syscall.Readlink": "syscall",
- "syscall.Reboot": "syscall",
- "syscall.Recvfrom": "syscall",
- "syscall.Recvmsg": "syscall",
- "syscall.RegCloseKey": "syscall",
- "syscall.RegEnumKeyEx": "syscall",
- "syscall.RegOpenKeyEx": "syscall",
- "syscall.RegQueryInfoKey": "syscall",
- "syscall.RegQueryValueEx": "syscall",
- "syscall.RemoveDirectory": "syscall",
- "syscall.Removexattr": "syscall",
- "syscall.Rename": "syscall",
- "syscall.Renameat": "syscall",
- "syscall.Revoke": "syscall",
- "syscall.Rlimit": "syscall",
- "syscall.Rmdir": "syscall",
- "syscall.RouteMessage": "syscall",
- "syscall.RouteRIB": "syscall",
- "syscall.RtAttr": "syscall",
- "syscall.RtGenmsg": "syscall",
- "syscall.RtMetrics": "syscall",
- "syscall.RtMsg": "syscall",
- "syscall.RtMsghdr": "syscall",
- "syscall.RtNexthop": "syscall",
- "syscall.Rusage": "syscall",
- "syscall.SCM_BINTIME": "syscall",
- "syscall.SCM_CREDENTIALS": "syscall",
- "syscall.SCM_CREDS": "syscall",
- "syscall.SCM_RIGHTS": "syscall",
- "syscall.SCM_TIMESTAMP": "syscall",
- "syscall.SCM_TIMESTAMPING": "syscall",
- "syscall.SCM_TIMESTAMPNS": "syscall",
- "syscall.SCM_TIMESTAMP_MONOTONIC": "syscall",
- "syscall.SHUT_RD": "syscall",
- "syscall.SHUT_RDWR": "syscall",
- "syscall.SHUT_WR": "syscall",
- "syscall.SID": "syscall",
- "syscall.SIDAndAttributes": "syscall",
- "syscall.SIGABRT": "syscall",
- "syscall.SIGALRM": "syscall",
- "syscall.SIGBUS": "syscall",
- "syscall.SIGCHLD": "syscall",
- "syscall.SIGCLD": "syscall",
- "syscall.SIGCONT": "syscall",
- "syscall.SIGEMT": "syscall",
- "syscall.SIGFPE": "syscall",
- "syscall.SIGHUP": "syscall",
- "syscall.SIGILL": "syscall",
- "syscall.SIGINFO": "syscall",
- "syscall.SIGINT": "syscall",
- "syscall.SIGIO": "syscall",
- "syscall.SIGIOT": "syscall",
- "syscall.SIGKILL": "syscall",
- "syscall.SIGLIBRT": "syscall",
- "syscall.SIGLWP": "syscall",
- "syscall.SIGPIPE": "syscall",
- "syscall.SIGPOLL": "syscall",
- "syscall.SIGPROF": "syscall",
- "syscall.SIGPWR": "syscall",
- "syscall.SIGQUIT": "syscall",
- "syscall.SIGSEGV": "syscall",
- "syscall.SIGSTKFLT": "syscall",
- "syscall.SIGSTOP": "syscall",
- "syscall.SIGSYS": "syscall",
- "syscall.SIGTERM": "syscall",
- "syscall.SIGTHR": "syscall",
- "syscall.SIGTRAP": "syscall",
- "syscall.SIGTSTP": "syscall",
- "syscall.SIGTTIN": "syscall",
- "syscall.SIGTTOU": "syscall",
- "syscall.SIGUNUSED": "syscall",
- "syscall.SIGURG": "syscall",
- "syscall.SIGUSR1": "syscall",
- "syscall.SIGUSR2": "syscall",
- "syscall.SIGVTALRM": "syscall",
- "syscall.SIGWINCH": "syscall",
- "syscall.SIGXCPU": "syscall",
- "syscall.SIGXFSZ": "syscall",
- "syscall.SIOCADDDLCI": "syscall",
- "syscall.SIOCADDMULTI": "syscall",
- "syscall.SIOCADDRT": "syscall",
- "syscall.SIOCAIFADDR": "syscall",
- "syscall.SIOCAIFGROUP": "syscall",
- "syscall.SIOCALIFADDR": "syscall",
- "syscall.SIOCARPIPLL": "syscall",
- "syscall.SIOCATMARK": "syscall",
- "syscall.SIOCAUTOADDR": "syscall",
- "syscall.SIOCAUTONETMASK": "syscall",
- "syscall.SIOCBRDGADD": "syscall",
- "syscall.SIOCBRDGADDS": "syscall",
- "syscall.SIOCBRDGARL": "syscall",
- "syscall.SIOCBRDGDADDR": "syscall",
- "syscall.SIOCBRDGDEL": "syscall",
- "syscall.SIOCBRDGDELS": "syscall",
- "syscall.SIOCBRDGFLUSH": "syscall",
- "syscall.SIOCBRDGFRL": "syscall",
- "syscall.SIOCBRDGGCACHE": "syscall",
- "syscall.SIOCBRDGGFD": "syscall",
- "syscall.SIOCBRDGGHT": "syscall",
- "syscall.SIOCBRDGGIFFLGS": "syscall",
- "syscall.SIOCBRDGGMA": "syscall",
- "syscall.SIOCBRDGGPARAM": "syscall",
- "syscall.SIOCBRDGGPRI": "syscall",
- "syscall.SIOCBRDGGRL": "syscall",
- "syscall.SIOCBRDGGSIFS": "syscall",
- "syscall.SIOCBRDGGTO": "syscall",
- "syscall.SIOCBRDGIFS": "syscall",
- "syscall.SIOCBRDGRTS": "syscall",
- "syscall.SIOCBRDGSADDR": "syscall",
- "syscall.SIOCBRDGSCACHE": "syscall",
- "syscall.SIOCBRDGSFD": "syscall",
- "syscall.SIOCBRDGSHT": "syscall",
- "syscall.SIOCBRDGSIFCOST": "syscall",
- "syscall.SIOCBRDGSIFFLGS": "syscall",
- "syscall.SIOCBRDGSIFPRIO": "syscall",
- "syscall.SIOCBRDGSMA": "syscall",
- "syscall.SIOCBRDGSPRI": "syscall",
- "syscall.SIOCBRDGSPROTO": "syscall",
- "syscall.SIOCBRDGSTO": "syscall",
- "syscall.SIOCBRDGSTXHC": "syscall",
- "syscall.SIOCDARP": "syscall",
- "syscall.SIOCDELDLCI": "syscall",
- "syscall.SIOCDELMULTI": "syscall",
- "syscall.SIOCDELRT": "syscall",
- "syscall.SIOCDEVPRIVATE": "syscall",
- "syscall.SIOCDIFADDR": "syscall",
- "syscall.SIOCDIFGROUP": "syscall",
- "syscall.SIOCDIFPHYADDR": "syscall",
- "syscall.SIOCDLIFADDR": "syscall",
- "syscall.SIOCDRARP": "syscall",
- "syscall.SIOCGARP": "syscall",
- "syscall.SIOCGDRVSPEC": "syscall",
- "syscall.SIOCGETKALIVE": "syscall",
- "syscall.SIOCGETLABEL": "syscall",
- "syscall.SIOCGETPFLOW": "syscall",
- "syscall.SIOCGETPFSYNC": "syscall",
- "syscall.SIOCGETSGCNT": "syscall",
- "syscall.SIOCGETVIFCNT": "syscall",
- "syscall.SIOCGETVLAN": "syscall",
- "syscall.SIOCGHIWAT": "syscall",
- "syscall.SIOCGIFADDR": "syscall",
- "syscall.SIOCGIFADDRPREF": "syscall",
- "syscall.SIOCGIFALIAS": "syscall",
- "syscall.SIOCGIFALTMTU": "syscall",
- "syscall.SIOCGIFASYNCMAP": "syscall",
- "syscall.SIOCGIFBOND": "syscall",
- "syscall.SIOCGIFBR": "syscall",
- "syscall.SIOCGIFBRDADDR": "syscall",
- "syscall.SIOCGIFCAP": "syscall",
- "syscall.SIOCGIFCONF": "syscall",
- "syscall.SIOCGIFCOUNT": "syscall",
- "syscall.SIOCGIFDATA": "syscall",
- "syscall.SIOCGIFDESCR": "syscall",
- "syscall.SIOCGIFDEVMTU": "syscall",
- "syscall.SIOCGIFDLT": "syscall",
- "syscall.SIOCGIFDSTADDR": "syscall",
- "syscall.SIOCGIFENCAP": "syscall",
- "syscall.SIOCGIFFIB": "syscall",
- "syscall.SIOCGIFFLAGS": "syscall",
- "syscall.SIOCGIFGATTR": "syscall",
- "syscall.SIOCGIFGENERIC": "syscall",
- "syscall.SIOCGIFGMEMB": "syscall",
- "syscall.SIOCGIFGROUP": "syscall",
- "syscall.SIOCGIFHARDMTU": "syscall",
- "syscall.SIOCGIFHWADDR": "syscall",
- "syscall.SIOCGIFINDEX": "syscall",
- "syscall.SIOCGIFKPI": "syscall",
- "syscall.SIOCGIFMAC": "syscall",
- "syscall.SIOCGIFMAP": "syscall",
- "syscall.SIOCGIFMEDIA": "syscall",
- "syscall.SIOCGIFMEM": "syscall",
- "syscall.SIOCGIFMETRIC": "syscall",
- "syscall.SIOCGIFMTU": "syscall",
- "syscall.SIOCGIFNAME": "syscall",
- "syscall.SIOCGIFNETMASK": "syscall",
- "syscall.SIOCGIFPDSTADDR": "syscall",
- "syscall.SIOCGIFPFLAGS": "syscall",
- "syscall.SIOCGIFPHYS": "syscall",
- "syscall.SIOCGIFPRIORITY": "syscall",
- "syscall.SIOCGIFPSRCADDR": "syscall",
- "syscall.SIOCGIFRDOMAIN": "syscall",
- "syscall.SIOCGIFRTLABEL": "syscall",
- "syscall.SIOCGIFSLAVE": "syscall",
- "syscall.SIOCGIFSTATUS": "syscall",
- "syscall.SIOCGIFTIMESLOT": "syscall",
- "syscall.SIOCGIFTXQLEN": "syscall",
- "syscall.SIOCGIFVLAN": "syscall",
- "syscall.SIOCGIFWAKEFLAGS": "syscall",
- "syscall.SIOCGIFXFLAGS": "syscall",
- "syscall.SIOCGLIFADDR": "syscall",
- "syscall.SIOCGLIFPHYADDR": "syscall",
- "syscall.SIOCGLIFPHYRTABLE": "syscall",
- "syscall.SIOCGLIFPHYTTL": "syscall",
- "syscall.SIOCGLINKSTR": "syscall",
- "syscall.SIOCGLOWAT": "syscall",
- "syscall.SIOCGPGRP": "syscall",
- "syscall.SIOCGPRIVATE_0": "syscall",
- "syscall.SIOCGPRIVATE_1": "syscall",
- "syscall.SIOCGRARP": "syscall",
- "syscall.SIOCGSPPPPARAMS": "syscall",
- "syscall.SIOCGSTAMP": "syscall",
- "syscall.SIOCGSTAMPNS": "syscall",
- "syscall.SIOCGVH": "syscall",
- "syscall.SIOCGVNETID": "syscall",
- "syscall.SIOCIFCREATE": "syscall",
- "syscall.SIOCIFCREATE2": "syscall",
- "syscall.SIOCIFDESTROY": "syscall",
- "syscall.SIOCIFGCLONERS": "syscall",
- "syscall.SIOCINITIFADDR": "syscall",
- "syscall.SIOCPROTOPRIVATE": "syscall",
- "syscall.SIOCRSLVMULTI": "syscall",
- "syscall.SIOCRTMSG": "syscall",
- "syscall.SIOCSARP": "syscall",
- "syscall.SIOCSDRVSPEC": "syscall",
- "syscall.SIOCSETKALIVE": "syscall",
- "syscall.SIOCSETLABEL": "syscall",
- "syscall.SIOCSETPFLOW": "syscall",
- "syscall.SIOCSETPFSYNC": "syscall",
- "syscall.SIOCSETVLAN": "syscall",
- "syscall.SIOCSHIWAT": "syscall",
- "syscall.SIOCSIFADDR": "syscall",
- "syscall.SIOCSIFADDRPREF": "syscall",
- "syscall.SIOCSIFALTMTU": "syscall",
- "syscall.SIOCSIFASYNCMAP": "syscall",
- "syscall.SIOCSIFBOND": "syscall",
- "syscall.SIOCSIFBR": "syscall",
- "syscall.SIOCSIFBRDADDR": "syscall",
- "syscall.SIOCSIFCAP": "syscall",
- "syscall.SIOCSIFDESCR": "syscall",
- "syscall.SIOCSIFDSTADDR": "syscall",
- "syscall.SIOCSIFENCAP": "syscall",
- "syscall.SIOCSIFFIB": "syscall",
- "syscall.SIOCSIFFLAGS": "syscall",
- "syscall.SIOCSIFGATTR": "syscall",
- "syscall.SIOCSIFGENERIC": "syscall",
- "syscall.SIOCSIFHWADDR": "syscall",
- "syscall.SIOCSIFHWBROADCAST": "syscall",
- "syscall.SIOCSIFKPI": "syscall",
- "syscall.SIOCSIFLINK": "syscall",
- "syscall.SIOCSIFLLADDR": "syscall",
- "syscall.SIOCSIFMAC": "syscall",
- "syscall.SIOCSIFMAP": "syscall",
- "syscall.SIOCSIFMEDIA": "syscall",
- "syscall.SIOCSIFMEM": "syscall",
- "syscall.SIOCSIFMETRIC": "syscall",
- "syscall.SIOCSIFMTU": "syscall",
- "syscall.SIOCSIFNAME": "syscall",
- "syscall.SIOCSIFNETMASK": "syscall",
- "syscall.SIOCSIFPFLAGS": "syscall",
- "syscall.SIOCSIFPHYADDR": "syscall",
- "syscall.SIOCSIFPHYS": "syscall",
- "syscall.SIOCSIFPRIORITY": "syscall",
- "syscall.SIOCSIFRDOMAIN": "syscall",
- "syscall.SIOCSIFRTLABEL": "syscall",
- "syscall.SIOCSIFRVNET": "syscall",
- "syscall.SIOCSIFSLAVE": "syscall",
- "syscall.SIOCSIFTIMESLOT": "syscall",
- "syscall.SIOCSIFTXQLEN": "syscall",
- "syscall.SIOCSIFVLAN": "syscall",
- "syscall.SIOCSIFVNET": "syscall",
- "syscall.SIOCSIFXFLAGS": "syscall",
- "syscall.SIOCSLIFPHYADDR": "syscall",
- "syscall.SIOCSLIFPHYRTABLE": "syscall",
- "syscall.SIOCSLIFPHYTTL": "syscall",
- "syscall.SIOCSLINKSTR": "syscall",
- "syscall.SIOCSLOWAT": "syscall",
- "syscall.SIOCSPGRP": "syscall",
- "syscall.SIOCSRARP": "syscall",
- "syscall.SIOCSSPPPPARAMS": "syscall",
- "syscall.SIOCSVH": "syscall",
- "syscall.SIOCSVNETID": "syscall",
- "syscall.SIOCZIFDATA": "syscall",
- "syscall.SIO_GET_EXTENSION_FUNCTION_POINTER": "syscall",
- "syscall.SIO_GET_INTERFACE_LIST": "syscall",
- "syscall.SIO_KEEPALIVE_VALS": "syscall",
- "syscall.SIO_UDP_CONNRESET": "syscall",
- "syscall.SOCK_CLOEXEC": "syscall",
- "syscall.SOCK_DCCP": "syscall",
- "syscall.SOCK_DGRAM": "syscall",
- "syscall.SOCK_FLAGS_MASK": "syscall",
- "syscall.SOCK_MAXADDRLEN": "syscall",
- "syscall.SOCK_NONBLOCK": "syscall",
- "syscall.SOCK_NOSIGPIPE": "syscall",
- "syscall.SOCK_PACKET": "syscall",
- "syscall.SOCK_RAW": "syscall",
- "syscall.SOCK_RDM": "syscall",
- "syscall.SOCK_SEQPACKET": "syscall",
- "syscall.SOCK_STREAM": "syscall",
- "syscall.SOL_AAL": "syscall",
- "syscall.SOL_ATM": "syscall",
- "syscall.SOL_DECNET": "syscall",
- "syscall.SOL_ICMPV6": "syscall",
- "syscall.SOL_IP": "syscall",
- "syscall.SOL_IPV6": "syscall",
- "syscall.SOL_IRDA": "syscall",
- "syscall.SOL_PACKET": "syscall",
- "syscall.SOL_RAW": "syscall",
- "syscall.SOL_SOCKET": "syscall",
- "syscall.SOL_TCP": "syscall",
- "syscall.SOL_X25": "syscall",
- "syscall.SOMAXCONN": "syscall",
- "syscall.SO_ACCEPTCONN": "syscall",
- "syscall.SO_ACCEPTFILTER": "syscall",
- "syscall.SO_ATTACH_FILTER": "syscall",
- "syscall.SO_BINDANY": "syscall",
- "syscall.SO_BINDTODEVICE": "syscall",
- "syscall.SO_BINTIME": "syscall",
- "syscall.SO_BROADCAST": "syscall",
- "syscall.SO_BSDCOMPAT": "syscall",
- "syscall.SO_DEBUG": "syscall",
- "syscall.SO_DETACH_FILTER": "syscall",
- "syscall.SO_DOMAIN": "syscall",
- "syscall.SO_DONTROUTE": "syscall",
- "syscall.SO_DONTTRUNC": "syscall",
- "syscall.SO_ERROR": "syscall",
- "syscall.SO_KEEPALIVE": "syscall",
- "syscall.SO_LABEL": "syscall",
- "syscall.SO_LINGER": "syscall",
- "syscall.SO_LINGER_SEC": "syscall",
- "syscall.SO_LISTENINCQLEN": "syscall",
- "syscall.SO_LISTENQLEN": "syscall",
- "syscall.SO_LISTENQLIMIT": "syscall",
- "syscall.SO_MARK": "syscall",
- "syscall.SO_NETPROC": "syscall",
- "syscall.SO_NKE": "syscall",
- "syscall.SO_NOADDRERR": "syscall",
- "syscall.SO_NOHEADER": "syscall",
- "syscall.SO_NOSIGPIPE": "syscall",
- "syscall.SO_NOTIFYCONFLICT": "syscall",
- "syscall.SO_NO_CHECK": "syscall",
- "syscall.SO_NO_DDP": "syscall",
- "syscall.SO_NO_OFFLOAD": "syscall",
- "syscall.SO_NP_EXTENSIONS": "syscall",
- "syscall.SO_NREAD": "syscall",
- "syscall.SO_NWRITE": "syscall",
- "syscall.SO_OOBINLINE": "syscall",
- "syscall.SO_OVERFLOWED": "syscall",
- "syscall.SO_PASSCRED": "syscall",
- "syscall.SO_PASSSEC": "syscall",
- "syscall.SO_PEERCRED": "syscall",
- "syscall.SO_PEERLABEL": "syscall",
- "syscall.SO_PEERNAME": "syscall",
- "syscall.SO_PEERSEC": "syscall",
- "syscall.SO_PRIORITY": "syscall",
- "syscall.SO_PROTOCOL": "syscall",
- "syscall.SO_PROTOTYPE": "syscall",
- "syscall.SO_RANDOMPORT": "syscall",
- "syscall.SO_RCVBUF": "syscall",
- "syscall.SO_RCVBUFFORCE": "syscall",
- "syscall.SO_RCVLOWAT": "syscall",
- "syscall.SO_RCVTIMEO": "syscall",
- "syscall.SO_RESTRICTIONS": "syscall",
- "syscall.SO_RESTRICT_DENYIN": "syscall",
- "syscall.SO_RESTRICT_DENYOUT": "syscall",
- "syscall.SO_RESTRICT_DENYSET": "syscall",
- "syscall.SO_REUSEADDR": "syscall",
- "syscall.SO_REUSEPORT": "syscall",
- "syscall.SO_REUSESHAREUID": "syscall",
- "syscall.SO_RTABLE": "syscall",
- "syscall.SO_RXQ_OVFL": "syscall",
- "syscall.SO_SECURITY_AUTHENTICATION": "syscall",
- "syscall.SO_SECURITY_ENCRYPTION_NETWORK": "syscall",
- "syscall.SO_SECURITY_ENCRYPTION_TRANSPORT": "syscall",
- "syscall.SO_SETFIB": "syscall",
- "syscall.SO_SNDBUF": "syscall",
- "syscall.SO_SNDBUFFORCE": "syscall",
- "syscall.SO_SNDLOWAT": "syscall",
- "syscall.SO_SNDTIMEO": "syscall",
- "syscall.SO_SPLICE": "syscall",
- "syscall.SO_TIMESTAMP": "syscall",
- "syscall.SO_TIMESTAMPING": "syscall",
- "syscall.SO_TIMESTAMPNS": "syscall",
- "syscall.SO_TIMESTAMP_MONOTONIC": "syscall",
- "syscall.SO_TYPE": "syscall",
- "syscall.SO_UPCALLCLOSEWAIT": "syscall",
- "syscall.SO_UPDATE_ACCEPT_CONTEXT": "syscall",
- "syscall.SO_UPDATE_CONNECT_CONTEXT": "syscall",
- "syscall.SO_USELOOPBACK": "syscall",
- "syscall.SO_USER_COOKIE": "syscall",
- "syscall.SO_VENDOR": "syscall",
- "syscall.SO_WANTMORE": "syscall",
- "syscall.SO_WANTOOBFLAG": "syscall",
- "syscall.SSLExtraCertChainPolicyPara": "syscall",
- "syscall.STANDARD_RIGHTS_ALL": "syscall",
- "syscall.STANDARD_RIGHTS_EXECUTE": "syscall",
- "syscall.STANDARD_RIGHTS_READ": "syscall",
- "syscall.STANDARD_RIGHTS_REQUIRED": "syscall",
- "syscall.STANDARD_RIGHTS_WRITE": "syscall",
- "syscall.STARTF_USESHOWWINDOW": "syscall",
- "syscall.STARTF_USESTDHANDLES": "syscall",
- "syscall.STD_ERROR_HANDLE": "syscall",
- "syscall.STD_INPUT_HANDLE": "syscall",
- "syscall.STD_OUTPUT_HANDLE": "syscall",
- "syscall.SUBLANG_ENGLISH_US": "syscall",
- "syscall.SW_FORCEMINIMIZE": "syscall",
- "syscall.SW_HIDE": "syscall",
- "syscall.SW_MAXIMIZE": "syscall",
- "syscall.SW_MINIMIZE": "syscall",
- "syscall.SW_NORMAL": "syscall",
- "syscall.SW_RESTORE": "syscall",
- "syscall.SW_SHOW": "syscall",
- "syscall.SW_SHOWDEFAULT": "syscall",
- "syscall.SW_SHOWMAXIMIZED": "syscall",
- "syscall.SW_SHOWMINIMIZED": "syscall",
- "syscall.SW_SHOWMINNOACTIVE": "syscall",
- "syscall.SW_SHOWNA": "syscall",
- "syscall.SW_SHOWNOACTIVATE": "syscall",
- "syscall.SW_SHOWNORMAL": "syscall",
- "syscall.SYMBOLIC_LINK_FLAG_DIRECTORY": "syscall",
- "syscall.SYNCHRONIZE": "syscall",
- "syscall.SYSCTL_VERSION": "syscall",
- "syscall.SYSCTL_VERS_0": "syscall",
- "syscall.SYSCTL_VERS_1": "syscall",
- "syscall.SYSCTL_VERS_MASK": "syscall",
- "syscall.SYS_ABORT2": "syscall",
- "syscall.SYS_ACCEPT": "syscall",
- "syscall.SYS_ACCEPT4": "syscall",
- "syscall.SYS_ACCEPT_NOCANCEL": "syscall",
- "syscall.SYS_ACCESS": "syscall",
- "syscall.SYS_ACCESS_EXTENDED": "syscall",
- "syscall.SYS_ACCT": "syscall",
- "syscall.SYS_ADD_KEY": "syscall",
- "syscall.SYS_ADD_PROFIL": "syscall",
- "syscall.SYS_ADJFREQ": "syscall",
- "syscall.SYS_ADJTIME": "syscall",
- "syscall.SYS_ADJTIMEX": "syscall",
- "syscall.SYS_AFS_SYSCALL": "syscall",
- "syscall.SYS_AIO_CANCEL": "syscall",
- "syscall.SYS_AIO_ERROR": "syscall",
- "syscall.SYS_AIO_FSYNC": "syscall",
- "syscall.SYS_AIO_READ": "syscall",
- "syscall.SYS_AIO_RETURN": "syscall",
- "syscall.SYS_AIO_SUSPEND": "syscall",
- "syscall.SYS_AIO_SUSPEND_NOCANCEL": "syscall",
- "syscall.SYS_AIO_WRITE": "syscall",
- "syscall.SYS_ALARM": "syscall",
- "syscall.SYS_ARCH_PRCTL": "syscall",
- "syscall.SYS_ARM_FADVISE64_64": "syscall",
- "syscall.SYS_ARM_SYNC_FILE_RANGE": "syscall",
- "syscall.SYS_ATGETMSG": "syscall",
- "syscall.SYS_ATPGETREQ": "syscall",
- "syscall.SYS_ATPGETRSP": "syscall",
- "syscall.SYS_ATPSNDREQ": "syscall",
- "syscall.SYS_ATPSNDRSP": "syscall",
- "syscall.SYS_ATPUTMSG": "syscall",
- "syscall.SYS_ATSOCKET": "syscall",
- "syscall.SYS_AUDIT": "syscall",
- "syscall.SYS_AUDITCTL": "syscall",
- "syscall.SYS_AUDITON": "syscall",
- "syscall.SYS_AUDIT_SESSION_JOIN": "syscall",
- "syscall.SYS_AUDIT_SESSION_PORT": "syscall",
- "syscall.SYS_AUDIT_SESSION_SELF": "syscall",
- "syscall.SYS_BDFLUSH": "syscall",
- "syscall.SYS_BIND": "syscall",
- "syscall.SYS_BINDAT": "syscall",
- "syscall.SYS_BREAK": "syscall",
- "syscall.SYS_BRK": "syscall",
- "syscall.SYS_BSDTHREAD_CREATE": "syscall",
- "syscall.SYS_BSDTHREAD_REGISTER": "syscall",
- "syscall.SYS_BSDTHREAD_TERMINATE": "syscall",
- "syscall.SYS_CAPGET": "syscall",
- "syscall.SYS_CAPSET": "syscall",
- "syscall.SYS_CAP_ENTER": "syscall",
- "syscall.SYS_CAP_FCNTLS_GET": "syscall",
- "syscall.SYS_CAP_FCNTLS_LIMIT": "syscall",
- "syscall.SYS_CAP_GETMODE": "syscall",
- "syscall.SYS_CAP_GETRIGHTS": "syscall",
- "syscall.SYS_CAP_IOCTLS_GET": "syscall",
- "syscall.SYS_CAP_IOCTLS_LIMIT": "syscall",
- "syscall.SYS_CAP_NEW": "syscall",
- "syscall.SYS_CAP_RIGHTS_GET": "syscall",
- "syscall.SYS_CAP_RIGHTS_LIMIT": "syscall",
- "syscall.SYS_CHDIR": "syscall",
- "syscall.SYS_CHFLAGS": "syscall",
- "syscall.SYS_CHFLAGSAT": "syscall",
- "syscall.SYS_CHMOD": "syscall",
- "syscall.SYS_CHMOD_EXTENDED": "syscall",
- "syscall.SYS_CHOWN": "syscall",
- "syscall.SYS_CHOWN32": "syscall",
- "syscall.SYS_CHROOT": "syscall",
- "syscall.SYS_CHUD": "syscall",
- "syscall.SYS_CLOCK_ADJTIME": "syscall",
- "syscall.SYS_CLOCK_GETCPUCLOCKID2": "syscall",
- "syscall.SYS_CLOCK_GETRES": "syscall",
- "syscall.SYS_CLOCK_GETTIME": "syscall",
- "syscall.SYS_CLOCK_NANOSLEEP": "syscall",
- "syscall.SYS_CLOCK_SETTIME": "syscall",
- "syscall.SYS_CLONE": "syscall",
- "syscall.SYS_CLOSE": "syscall",
- "syscall.SYS_CLOSEFROM": "syscall",
- "syscall.SYS_CLOSE_NOCANCEL": "syscall",
- "syscall.SYS_CONNECT": "syscall",
- "syscall.SYS_CONNECTAT": "syscall",
- "syscall.SYS_CONNECT_NOCANCEL": "syscall",
- "syscall.SYS_COPYFILE": "syscall",
- "syscall.SYS_CPUSET": "syscall",
- "syscall.SYS_CPUSET_GETAFFINITY": "syscall",
- "syscall.SYS_CPUSET_GETID": "syscall",
- "syscall.SYS_CPUSET_SETAFFINITY": "syscall",
- "syscall.SYS_CPUSET_SETID": "syscall",
- "syscall.SYS_CREAT": "syscall",
- "syscall.SYS_CREATE_MODULE": "syscall",
- "syscall.SYS_CSOPS": "syscall",
- "syscall.SYS_DELETE": "syscall",
- "syscall.SYS_DELETE_MODULE": "syscall",
- "syscall.SYS_DUP": "syscall",
- "syscall.SYS_DUP2": "syscall",
- "syscall.SYS_DUP3": "syscall",
- "syscall.SYS_EACCESS": "syscall",
- "syscall.SYS_EPOLL_CREATE": "syscall",
- "syscall.SYS_EPOLL_CREATE1": "syscall",
- "syscall.SYS_EPOLL_CTL": "syscall",
- "syscall.SYS_EPOLL_CTL_OLD": "syscall",
- "syscall.SYS_EPOLL_PWAIT": "syscall",
- "syscall.SYS_EPOLL_WAIT": "syscall",
- "syscall.SYS_EPOLL_WAIT_OLD": "syscall",
- "syscall.SYS_EVENTFD": "syscall",
- "syscall.SYS_EVENTFD2": "syscall",
- "syscall.SYS_EXCHANGEDATA": "syscall",
- "syscall.SYS_EXECVE": "syscall",
- "syscall.SYS_EXIT": "syscall",
- "syscall.SYS_EXIT_GROUP": "syscall",
- "syscall.SYS_EXTATTRCTL": "syscall",
- "syscall.SYS_EXTATTR_DELETE_FD": "syscall",
- "syscall.SYS_EXTATTR_DELETE_FILE": "syscall",
- "syscall.SYS_EXTATTR_DELETE_LINK": "syscall",
- "syscall.SYS_EXTATTR_GET_FD": "syscall",
- "syscall.SYS_EXTATTR_GET_FILE": "syscall",
- "syscall.SYS_EXTATTR_GET_LINK": "syscall",
- "syscall.SYS_EXTATTR_LIST_FD": "syscall",
- "syscall.SYS_EXTATTR_LIST_FILE": "syscall",
- "syscall.SYS_EXTATTR_LIST_LINK": "syscall",
- "syscall.SYS_EXTATTR_SET_FD": "syscall",
- "syscall.SYS_EXTATTR_SET_FILE": "syscall",
- "syscall.SYS_EXTATTR_SET_LINK": "syscall",
- "syscall.SYS_FACCESSAT": "syscall",
- "syscall.SYS_FADVISE64": "syscall",
- "syscall.SYS_FADVISE64_64": "syscall",
- "syscall.SYS_FALLOCATE": "syscall",
- "syscall.SYS_FANOTIFY_INIT": "syscall",
- "syscall.SYS_FANOTIFY_MARK": "syscall",
- "syscall.SYS_FCHDIR": "syscall",
- "syscall.SYS_FCHFLAGS": "syscall",
- "syscall.SYS_FCHMOD": "syscall",
- "syscall.SYS_FCHMODAT": "syscall",
- "syscall.SYS_FCHMOD_EXTENDED": "syscall",
- "syscall.SYS_FCHOWN": "syscall",
- "syscall.SYS_FCHOWN32": "syscall",
- "syscall.SYS_FCHOWNAT": "syscall",
- "syscall.SYS_FCHROOT": "syscall",
- "syscall.SYS_FCNTL": "syscall",
- "syscall.SYS_FCNTL64": "syscall",
- "syscall.SYS_FCNTL_NOCANCEL": "syscall",
- "syscall.SYS_FDATASYNC": "syscall",
- "syscall.SYS_FEXECVE": "syscall",
- "syscall.SYS_FFCLOCK_GETCOUNTER": "syscall",
- "syscall.SYS_FFCLOCK_GETESTIMATE": "syscall",
- "syscall.SYS_FFCLOCK_SETESTIMATE": "syscall",
- "syscall.SYS_FFSCTL": "syscall",
- "syscall.SYS_FGETATTRLIST": "syscall",
- "syscall.SYS_FGETXATTR": "syscall",
- "syscall.SYS_FHOPEN": "syscall",
- "syscall.SYS_FHSTAT": "syscall",
- "syscall.SYS_FHSTATFS": "syscall",
- "syscall.SYS_FILEPORT_MAKEFD": "syscall",
- "syscall.SYS_FILEPORT_MAKEPORT": "syscall",
- "syscall.SYS_FKTRACE": "syscall",
- "syscall.SYS_FLISTXATTR": "syscall",
- "syscall.SYS_FLOCK": "syscall",
- "syscall.SYS_FORK": "syscall",
- "syscall.SYS_FPATHCONF": "syscall",
- "syscall.SYS_FREEBSD6_FTRUNCATE": "syscall",
- "syscall.SYS_FREEBSD6_LSEEK": "syscall",
- "syscall.SYS_FREEBSD6_MMAP": "syscall",
- "syscall.SYS_FREEBSD6_PREAD": "syscall",
- "syscall.SYS_FREEBSD6_PWRITE": "syscall",
- "syscall.SYS_FREEBSD6_TRUNCATE": "syscall",
- "syscall.SYS_FREMOVEXATTR": "syscall",
- "syscall.SYS_FSCTL": "syscall",
- "syscall.SYS_FSETATTRLIST": "syscall",
- "syscall.SYS_FSETXATTR": "syscall",
- "syscall.SYS_FSGETPATH": "syscall",
- "syscall.SYS_FSTAT": "syscall",
- "syscall.SYS_FSTAT64": "syscall",
- "syscall.SYS_FSTAT64_EXTENDED": "syscall",
- "syscall.SYS_FSTATAT": "syscall",
- "syscall.SYS_FSTATAT64": "syscall",
- "syscall.SYS_FSTATFS": "syscall",
- "syscall.SYS_FSTATFS64": "syscall",
- "syscall.SYS_FSTATV": "syscall",
- "syscall.SYS_FSTATVFS1": "syscall",
- "syscall.SYS_FSTAT_EXTENDED": "syscall",
- "syscall.SYS_FSYNC": "syscall",
- "syscall.SYS_FSYNC_NOCANCEL": "syscall",
- "syscall.SYS_FSYNC_RANGE": "syscall",
- "syscall.SYS_FTIME": "syscall",
- "syscall.SYS_FTRUNCATE": "syscall",
- "syscall.SYS_FTRUNCATE64": "syscall",
- "syscall.SYS_FUTEX": "syscall",
- "syscall.SYS_FUTIMENS": "syscall",
- "syscall.SYS_FUTIMES": "syscall",
- "syscall.SYS_FUTIMESAT": "syscall",
- "syscall.SYS_GETATTRLIST": "syscall",
- "syscall.SYS_GETAUDIT": "syscall",
- "syscall.SYS_GETAUDIT_ADDR": "syscall",
- "syscall.SYS_GETAUID": "syscall",
- "syscall.SYS_GETCONTEXT": "syscall",
- "syscall.SYS_GETCPU": "syscall",
- "syscall.SYS_GETCWD": "syscall",
- "syscall.SYS_GETDENTS": "syscall",
- "syscall.SYS_GETDENTS64": "syscall",
- "syscall.SYS_GETDIRENTRIES": "syscall",
- "syscall.SYS_GETDIRENTRIES64": "syscall",
- "syscall.SYS_GETDIRENTRIESATTR": "syscall",
- "syscall.SYS_GETDTABLECOUNT": "syscall",
- "syscall.SYS_GETDTABLESIZE": "syscall",
- "syscall.SYS_GETEGID": "syscall",
- "syscall.SYS_GETEGID32": "syscall",
- "syscall.SYS_GETEUID": "syscall",
- "syscall.SYS_GETEUID32": "syscall",
- "syscall.SYS_GETFH": "syscall",
- "syscall.SYS_GETFSSTAT": "syscall",
- "syscall.SYS_GETFSSTAT64": "syscall",
- "syscall.SYS_GETGID": "syscall",
- "syscall.SYS_GETGID32": "syscall",
- "syscall.SYS_GETGROUPS": "syscall",
- "syscall.SYS_GETGROUPS32": "syscall",
- "syscall.SYS_GETHOSTUUID": "syscall",
- "syscall.SYS_GETITIMER": "syscall",
- "syscall.SYS_GETLCID": "syscall",
- "syscall.SYS_GETLOGIN": "syscall",
- "syscall.SYS_GETLOGINCLASS": "syscall",
- "syscall.SYS_GETPEERNAME": "syscall",
- "syscall.SYS_GETPGID": "syscall",
- "syscall.SYS_GETPGRP": "syscall",
- "syscall.SYS_GETPID": "syscall",
- "syscall.SYS_GETPMSG": "syscall",
- "syscall.SYS_GETPPID": "syscall",
- "syscall.SYS_GETPRIORITY": "syscall",
- "syscall.SYS_GETRESGID": "syscall",
- "syscall.SYS_GETRESGID32": "syscall",
- "syscall.SYS_GETRESUID": "syscall",
- "syscall.SYS_GETRESUID32": "syscall",
- "syscall.SYS_GETRLIMIT": "syscall",
- "syscall.SYS_GETRTABLE": "syscall",
- "syscall.SYS_GETRUSAGE": "syscall",
- "syscall.SYS_GETSGROUPS": "syscall",
- "syscall.SYS_GETSID": "syscall",
- "syscall.SYS_GETSOCKNAME": "syscall",
- "syscall.SYS_GETSOCKOPT": "syscall",
- "syscall.SYS_GETTHRID": "syscall",
- "syscall.SYS_GETTID": "syscall",
- "syscall.SYS_GETTIMEOFDAY": "syscall",
- "syscall.SYS_GETUID": "syscall",
- "syscall.SYS_GETUID32": "syscall",
- "syscall.SYS_GETVFSSTAT": "syscall",
- "syscall.SYS_GETWGROUPS": "syscall",
- "syscall.SYS_GETXATTR": "syscall",
- "syscall.SYS_GET_KERNEL_SYMS": "syscall",
- "syscall.SYS_GET_MEMPOLICY": "syscall",
- "syscall.SYS_GET_ROBUST_LIST": "syscall",
- "syscall.SYS_GET_THREAD_AREA": "syscall",
- "syscall.SYS_GTTY": "syscall",
- "syscall.SYS_IDENTITYSVC": "syscall",
- "syscall.SYS_IDLE": "syscall",
- "syscall.SYS_INITGROUPS": "syscall",
- "syscall.SYS_INIT_MODULE": "syscall",
- "syscall.SYS_INOTIFY_ADD_WATCH": "syscall",
- "syscall.SYS_INOTIFY_INIT": "syscall",
- "syscall.SYS_INOTIFY_INIT1": "syscall",
- "syscall.SYS_INOTIFY_RM_WATCH": "syscall",
- "syscall.SYS_IOCTL": "syscall",
- "syscall.SYS_IOPERM": "syscall",
- "syscall.SYS_IOPL": "syscall",
- "syscall.SYS_IOPOLICYSYS": "syscall",
- "syscall.SYS_IOPRIO_GET": "syscall",
- "syscall.SYS_IOPRIO_SET": "syscall",
- "syscall.SYS_IO_CANCEL": "syscall",
- "syscall.SYS_IO_DESTROY": "syscall",
- "syscall.SYS_IO_GETEVENTS": "syscall",
- "syscall.SYS_IO_SETUP": "syscall",
- "syscall.SYS_IO_SUBMIT": "syscall",
- "syscall.SYS_IPC": "syscall",
- "syscall.SYS_ISSETUGID": "syscall",
- "syscall.SYS_JAIL": "syscall",
- "syscall.SYS_JAIL_ATTACH": "syscall",
- "syscall.SYS_JAIL_GET": "syscall",
- "syscall.SYS_JAIL_REMOVE": "syscall",
- "syscall.SYS_JAIL_SET": "syscall",
- "syscall.SYS_KDEBUG_TRACE": "syscall",
- "syscall.SYS_KENV": "syscall",
- "syscall.SYS_KEVENT": "syscall",
- "syscall.SYS_KEVENT64": "syscall",
- "syscall.SYS_KEXEC_LOAD": "syscall",
- "syscall.SYS_KEYCTL": "syscall",
- "syscall.SYS_KILL": "syscall",
- "syscall.SYS_KLDFIND": "syscall",
- "syscall.SYS_KLDFIRSTMOD": "syscall",
- "syscall.SYS_KLDLOAD": "syscall",
- "syscall.SYS_KLDNEXT": "syscall",
- "syscall.SYS_KLDSTAT": "syscall",
- "syscall.SYS_KLDSYM": "syscall",
- "syscall.SYS_KLDUNLOAD": "syscall",
- "syscall.SYS_KLDUNLOADF": "syscall",
- "syscall.SYS_KQUEUE": "syscall",
- "syscall.SYS_KQUEUE1": "syscall",
- "syscall.SYS_KTIMER_CREATE": "syscall",
- "syscall.SYS_KTIMER_DELETE": "syscall",
- "syscall.SYS_KTIMER_GETOVERRUN": "syscall",
- "syscall.SYS_KTIMER_GETTIME": "syscall",
- "syscall.SYS_KTIMER_SETTIME": "syscall",
- "syscall.SYS_KTRACE": "syscall",
- "syscall.SYS_LCHFLAGS": "syscall",
- "syscall.SYS_LCHMOD": "syscall",
- "syscall.SYS_LCHOWN": "syscall",
- "syscall.SYS_LCHOWN32": "syscall",
- "syscall.SYS_LGETFH": "syscall",
- "syscall.SYS_LGETXATTR": "syscall",
- "syscall.SYS_LINK": "syscall",
- "syscall.SYS_LINKAT": "syscall",
- "syscall.SYS_LIO_LISTIO": "syscall",
- "syscall.SYS_LISTEN": "syscall",
- "syscall.SYS_LISTXATTR": "syscall",
- "syscall.SYS_LLISTXATTR": "syscall",
- "syscall.SYS_LOCK": "syscall",
- "syscall.SYS_LOOKUP_DCOOKIE": "syscall",
- "syscall.SYS_LPATHCONF": "syscall",
- "syscall.SYS_LREMOVEXATTR": "syscall",
- "syscall.SYS_LSEEK": "syscall",
- "syscall.SYS_LSETXATTR": "syscall",
- "syscall.SYS_LSTAT": "syscall",
- "syscall.SYS_LSTAT64": "syscall",
- "syscall.SYS_LSTAT64_EXTENDED": "syscall",
- "syscall.SYS_LSTATV": "syscall",
- "syscall.SYS_LSTAT_EXTENDED": "syscall",
- "syscall.SYS_LUTIMES": "syscall",
- "syscall.SYS_MAC_SYSCALL": "syscall",
- "syscall.SYS_MADVISE": "syscall",
- "syscall.SYS_MADVISE1": "syscall",
- "syscall.SYS_MAXSYSCALL": "syscall",
- "syscall.SYS_MBIND": "syscall",
- "syscall.SYS_MIGRATE_PAGES": "syscall",
- "syscall.SYS_MINCORE": "syscall",
- "syscall.SYS_MINHERIT": "syscall",
- "syscall.SYS_MKCOMPLEX": "syscall",
- "syscall.SYS_MKDIR": "syscall",
- "syscall.SYS_MKDIRAT": "syscall",
- "syscall.SYS_MKDIR_EXTENDED": "syscall",
- "syscall.SYS_MKFIFO": "syscall",
- "syscall.SYS_MKFIFOAT": "syscall",
- "syscall.SYS_MKFIFO_EXTENDED": "syscall",
- "syscall.SYS_MKNOD": "syscall",
- "syscall.SYS_MKNODAT": "syscall",
- "syscall.SYS_MLOCK": "syscall",
- "syscall.SYS_MLOCKALL": "syscall",
- "syscall.SYS_MMAP": "syscall",
- "syscall.SYS_MMAP2": "syscall",
- "syscall.SYS_MODCTL": "syscall",
- "syscall.SYS_MODFIND": "syscall",
- "syscall.SYS_MODFNEXT": "syscall",
- "syscall.SYS_MODIFY_LDT": "syscall",
- "syscall.SYS_MODNEXT": "syscall",
- "syscall.SYS_MODSTAT": "syscall",
- "syscall.SYS_MODWATCH": "syscall",
- "syscall.SYS_MOUNT": "syscall",
- "syscall.SYS_MOVE_PAGES": "syscall",
- "syscall.SYS_MPROTECT": "syscall",
- "syscall.SYS_MPX": "syscall",
- "syscall.SYS_MQUERY": "syscall",
- "syscall.SYS_MQ_GETSETATTR": "syscall",
- "syscall.SYS_MQ_NOTIFY": "syscall",
- "syscall.SYS_MQ_OPEN": "syscall",
- "syscall.SYS_MQ_TIMEDRECEIVE": "syscall",
- "syscall.SYS_MQ_TIMEDSEND": "syscall",
- "syscall.SYS_MQ_UNLINK": "syscall",
- "syscall.SYS_MREMAP": "syscall",
- "syscall.SYS_MSGCTL": "syscall",
- "syscall.SYS_MSGGET": "syscall",
- "syscall.SYS_MSGRCV": "syscall",
- "syscall.SYS_MSGRCV_NOCANCEL": "syscall",
- "syscall.SYS_MSGSND": "syscall",
- "syscall.SYS_MSGSND_NOCANCEL": "syscall",
- "syscall.SYS_MSGSYS": "syscall",
- "syscall.SYS_MSYNC": "syscall",
- "syscall.SYS_MSYNC_NOCANCEL": "syscall",
- "syscall.SYS_MUNLOCK": "syscall",
- "syscall.SYS_MUNLOCKALL": "syscall",
- "syscall.SYS_MUNMAP": "syscall",
- "syscall.SYS_NAME_TO_HANDLE_AT": "syscall",
- "syscall.SYS_NANOSLEEP": "syscall",
- "syscall.SYS_NEWFSTATAT": "syscall",
- "syscall.SYS_NFSCLNT": "syscall",
- "syscall.SYS_NFSSERVCTL": "syscall",
- "syscall.SYS_NFSSVC": "syscall",
- "syscall.SYS_NFSTAT": "syscall",
- "syscall.SYS_NICE": "syscall",
- "syscall.SYS_NLSTAT": "syscall",
- "syscall.SYS_NMOUNT": "syscall",
- "syscall.SYS_NSTAT": "syscall",
- "syscall.SYS_NTP_ADJTIME": "syscall",
- "syscall.SYS_NTP_GETTIME": "syscall",
- "syscall.SYS_OABI_SYSCALL_BASE": "syscall",
- "syscall.SYS_OBREAK": "syscall",
- "syscall.SYS_OLDFSTAT": "syscall",
- "syscall.SYS_OLDLSTAT": "syscall",
- "syscall.SYS_OLDOLDUNAME": "syscall",
- "syscall.SYS_OLDSTAT": "syscall",
- "syscall.SYS_OLDUNAME": "syscall",
- "syscall.SYS_OPEN": "syscall",
- "syscall.SYS_OPENAT": "syscall",
- "syscall.SYS_OPENBSD_POLL": "syscall",
- "syscall.SYS_OPEN_BY_HANDLE_AT": "syscall",
- "syscall.SYS_OPEN_EXTENDED": "syscall",
- "syscall.SYS_OPEN_NOCANCEL": "syscall",
- "syscall.SYS_OVADVISE": "syscall",
- "syscall.SYS_PACCEPT": "syscall",
- "syscall.SYS_PATHCONF": "syscall",
- "syscall.SYS_PAUSE": "syscall",
- "syscall.SYS_PCICONFIG_IOBASE": "syscall",
- "syscall.SYS_PCICONFIG_READ": "syscall",
- "syscall.SYS_PCICONFIG_WRITE": "syscall",
- "syscall.SYS_PDFORK": "syscall",
- "syscall.SYS_PDGETPID": "syscall",
- "syscall.SYS_PDKILL": "syscall",
- "syscall.SYS_PERF_EVENT_OPEN": "syscall",
- "syscall.SYS_PERSONALITY": "syscall",
- "syscall.SYS_PID_HIBERNATE": "syscall",
- "syscall.SYS_PID_RESUME": "syscall",
- "syscall.SYS_PID_SHUTDOWN_SOCKETS": "syscall",
- "syscall.SYS_PID_SUSPEND": "syscall",
- "syscall.SYS_PIPE": "syscall",
- "syscall.SYS_PIPE2": "syscall",
- "syscall.SYS_PIVOT_ROOT": "syscall",
- "syscall.SYS_PMC_CONTROL": "syscall",
- "syscall.SYS_PMC_GET_INFO": "syscall",
- "syscall.SYS_POLL": "syscall",
- "syscall.SYS_POLLTS": "syscall",
- "syscall.SYS_POLL_NOCANCEL": "syscall",
- "syscall.SYS_POSIX_FADVISE": "syscall",
- "syscall.SYS_POSIX_FALLOCATE": "syscall",
- "syscall.SYS_POSIX_OPENPT": "syscall",
- "syscall.SYS_POSIX_SPAWN": "syscall",
- "syscall.SYS_PPOLL": "syscall",
- "syscall.SYS_PRCTL": "syscall",
- "syscall.SYS_PREAD": "syscall",
- "syscall.SYS_PREAD64": "syscall",
- "syscall.SYS_PREADV": "syscall",
- "syscall.SYS_PREAD_NOCANCEL": "syscall",
- "syscall.SYS_PRLIMIT64": "syscall",
- "syscall.SYS_PROCCTL": "syscall",
- "syscall.SYS_PROCESS_POLICY": "syscall",
- "syscall.SYS_PROCESS_VM_READV": "syscall",
- "syscall.SYS_PROCESS_VM_WRITEV": "syscall",
- "syscall.SYS_PROC_INFO": "syscall",
- "syscall.SYS_PROF": "syscall",
- "syscall.SYS_PROFIL": "syscall",
- "syscall.SYS_PSELECT": "syscall",
- "syscall.SYS_PSELECT6": "syscall",
- "syscall.SYS_PSET_ASSIGN": "syscall",
- "syscall.SYS_PSET_CREATE": "syscall",
- "syscall.SYS_PSET_DESTROY": "syscall",
- "syscall.SYS_PSYNCH_CVBROAD": "syscall",
- "syscall.SYS_PSYNCH_CVCLRPREPOST": "syscall",
- "syscall.SYS_PSYNCH_CVSIGNAL": "syscall",
- "syscall.SYS_PSYNCH_CVWAIT": "syscall",
- "syscall.SYS_PSYNCH_MUTEXDROP": "syscall",
- "syscall.SYS_PSYNCH_MUTEXWAIT": "syscall",
- "syscall.SYS_PSYNCH_RW_DOWNGRADE": "syscall",
- "syscall.SYS_PSYNCH_RW_LONGRDLOCK": "syscall",
- "syscall.SYS_PSYNCH_RW_RDLOCK": "syscall",
- "syscall.SYS_PSYNCH_RW_UNLOCK": "syscall",
- "syscall.SYS_PSYNCH_RW_UNLOCK2": "syscall",
- "syscall.SYS_PSYNCH_RW_UPGRADE": "syscall",
- "syscall.SYS_PSYNCH_RW_WRLOCK": "syscall",
- "syscall.SYS_PSYNCH_RW_YIELDWRLOCK": "syscall",
- "syscall.SYS_PTRACE": "syscall",
- "syscall.SYS_PUTPMSG": "syscall",
- "syscall.SYS_PWRITE": "syscall",
- "syscall.SYS_PWRITE64": "syscall",
- "syscall.SYS_PWRITEV": "syscall",
- "syscall.SYS_PWRITE_NOCANCEL": "syscall",
- "syscall.SYS_QUERY_MODULE": "syscall",
- "syscall.SYS_QUOTACTL": "syscall",
- "syscall.SYS_RASCTL": "syscall",
- "syscall.SYS_RCTL_ADD_RULE": "syscall",
- "syscall.SYS_RCTL_GET_LIMITS": "syscall",
- "syscall.SYS_RCTL_GET_RACCT": "syscall",
- "syscall.SYS_RCTL_GET_RULES": "syscall",
- "syscall.SYS_RCTL_REMOVE_RULE": "syscall",
- "syscall.SYS_READ": "syscall",
- "syscall.SYS_READAHEAD": "syscall",
- "syscall.SYS_READDIR": "syscall",
- "syscall.SYS_READLINK": "syscall",
- "syscall.SYS_READLINKAT": "syscall",
- "syscall.SYS_READV": "syscall",
- "syscall.SYS_READV_NOCANCEL": "syscall",
- "syscall.SYS_READ_NOCANCEL": "syscall",
- "syscall.SYS_REBOOT": "syscall",
- "syscall.SYS_RECV": "syscall",
- "syscall.SYS_RECVFROM": "syscall",
- "syscall.SYS_RECVFROM_NOCANCEL": "syscall",
- "syscall.SYS_RECVMMSG": "syscall",
- "syscall.SYS_RECVMSG": "syscall",
- "syscall.SYS_RECVMSG_NOCANCEL": "syscall",
- "syscall.SYS_REMAP_FILE_PAGES": "syscall",
- "syscall.SYS_REMOVEXATTR": "syscall",
- "syscall.SYS_RENAME": "syscall",
- "syscall.SYS_RENAMEAT": "syscall",
- "syscall.SYS_REQUEST_KEY": "syscall",
- "syscall.SYS_RESTART_SYSCALL": "syscall",
- "syscall.SYS_REVOKE": "syscall",
- "syscall.SYS_RFORK": "syscall",
- "syscall.SYS_RMDIR": "syscall",
- "syscall.SYS_RTPRIO": "syscall",
- "syscall.SYS_RTPRIO_THREAD": "syscall",
- "syscall.SYS_RT_SIGACTION": "syscall",
- "syscall.SYS_RT_SIGPENDING": "syscall",
- "syscall.SYS_RT_SIGPROCMASK": "syscall",
- "syscall.SYS_RT_SIGQUEUEINFO": "syscall",
- "syscall.SYS_RT_SIGRETURN": "syscall",
- "syscall.SYS_RT_SIGSUSPEND": "syscall",
- "syscall.SYS_RT_SIGTIMEDWAIT": "syscall",
- "syscall.SYS_RT_TGSIGQUEUEINFO": "syscall",
- "syscall.SYS_SBRK": "syscall",
- "syscall.SYS_SCHED_GETAFFINITY": "syscall",
- "syscall.SYS_SCHED_GETPARAM": "syscall",
- "syscall.SYS_SCHED_GETSCHEDULER": "syscall",
- "syscall.SYS_SCHED_GET_PRIORITY_MAX": "syscall",
- "syscall.SYS_SCHED_GET_PRIORITY_MIN": "syscall",
- "syscall.SYS_SCHED_RR_GET_INTERVAL": "syscall",
- "syscall.SYS_SCHED_SETAFFINITY": "syscall",
- "syscall.SYS_SCHED_SETPARAM": "syscall",
- "syscall.SYS_SCHED_SETSCHEDULER": "syscall",
- "syscall.SYS_SCHED_YIELD": "syscall",
- "syscall.SYS_SCTP_GENERIC_RECVMSG": "syscall",
- "syscall.SYS_SCTP_GENERIC_SENDMSG": "syscall",
- "syscall.SYS_SCTP_GENERIC_SENDMSG_IOV": "syscall",
- "syscall.SYS_SCTP_PEELOFF": "syscall",
- "syscall.SYS_SEARCHFS": "syscall",
- "syscall.SYS_SECURITY": "syscall",
- "syscall.SYS_SELECT": "syscall",
- "syscall.SYS_SELECT_NOCANCEL": "syscall",
- "syscall.SYS_SEMCONFIG": "syscall",
- "syscall.SYS_SEMCTL": "syscall",
- "syscall.SYS_SEMGET": "syscall",
- "syscall.SYS_SEMOP": "syscall",
- "syscall.SYS_SEMSYS": "syscall",
- "syscall.SYS_SEMTIMEDOP": "syscall",
- "syscall.SYS_SEM_CLOSE": "syscall",
- "syscall.SYS_SEM_DESTROY": "syscall",
- "syscall.SYS_SEM_GETVALUE": "syscall",
- "syscall.SYS_SEM_INIT": "syscall",
- "syscall.SYS_SEM_OPEN": "syscall",
- "syscall.SYS_SEM_POST": "syscall",
- "syscall.SYS_SEM_TRYWAIT": "syscall",
- "syscall.SYS_SEM_UNLINK": "syscall",
- "syscall.SYS_SEM_WAIT": "syscall",
- "syscall.SYS_SEM_WAIT_NOCANCEL": "syscall",
- "syscall.SYS_SEND": "syscall",
- "syscall.SYS_SENDFILE": "syscall",
- "syscall.SYS_SENDFILE64": "syscall",
- "syscall.SYS_SENDMMSG": "syscall",
- "syscall.SYS_SENDMSG": "syscall",
- "syscall.SYS_SENDMSG_NOCANCEL": "syscall",
- "syscall.SYS_SENDTO": "syscall",
- "syscall.SYS_SENDTO_NOCANCEL": "syscall",
- "syscall.SYS_SETATTRLIST": "syscall",
- "syscall.SYS_SETAUDIT": "syscall",
- "syscall.SYS_SETAUDIT_ADDR": "syscall",
- "syscall.SYS_SETAUID": "syscall",
- "syscall.SYS_SETCONTEXT": "syscall",
- "syscall.SYS_SETDOMAINNAME": "syscall",
- "syscall.SYS_SETEGID": "syscall",
- "syscall.SYS_SETEUID": "syscall",
- "syscall.SYS_SETFIB": "syscall",
- "syscall.SYS_SETFSGID": "syscall",
- "syscall.SYS_SETFSGID32": "syscall",
- "syscall.SYS_SETFSUID": "syscall",
- "syscall.SYS_SETFSUID32": "syscall",
- "syscall.SYS_SETGID": "syscall",
- "syscall.SYS_SETGID32": "syscall",
- "syscall.SYS_SETGROUPS": "syscall",
- "syscall.SYS_SETGROUPS32": "syscall",
- "syscall.SYS_SETHOSTNAME": "syscall",
- "syscall.SYS_SETITIMER": "syscall",
- "syscall.SYS_SETLCID": "syscall",
- "syscall.SYS_SETLOGIN": "syscall",
- "syscall.SYS_SETLOGINCLASS": "syscall",
- "syscall.SYS_SETNS": "syscall",
- "syscall.SYS_SETPGID": "syscall",
- "syscall.SYS_SETPRIORITY": "syscall",
- "syscall.SYS_SETPRIVEXEC": "syscall",
- "syscall.SYS_SETREGID": "syscall",
- "syscall.SYS_SETREGID32": "syscall",
- "syscall.SYS_SETRESGID": "syscall",
- "syscall.SYS_SETRESGID32": "syscall",
- "syscall.SYS_SETRESUID": "syscall",
- "syscall.SYS_SETRESUID32": "syscall",
- "syscall.SYS_SETREUID": "syscall",
- "syscall.SYS_SETREUID32": "syscall",
- "syscall.SYS_SETRLIMIT": "syscall",
- "syscall.SYS_SETRTABLE": "syscall",
- "syscall.SYS_SETSGROUPS": "syscall",
- "syscall.SYS_SETSID": "syscall",
- "syscall.SYS_SETSOCKOPT": "syscall",
- "syscall.SYS_SETTID": "syscall",
- "syscall.SYS_SETTID_WITH_PID": "syscall",
- "syscall.SYS_SETTIMEOFDAY": "syscall",
- "syscall.SYS_SETUID": "syscall",
- "syscall.SYS_SETUID32": "syscall",
- "syscall.SYS_SETWGROUPS": "syscall",
- "syscall.SYS_SETXATTR": "syscall",
- "syscall.SYS_SET_MEMPOLICY": "syscall",
- "syscall.SYS_SET_ROBUST_LIST": "syscall",
- "syscall.SYS_SET_THREAD_AREA": "syscall",
- "syscall.SYS_SET_TID_ADDRESS": "syscall",
- "syscall.SYS_SGETMASK": "syscall",
- "syscall.SYS_SHARED_REGION_CHECK_NP": "syscall",
- "syscall.SYS_SHARED_REGION_MAP_AND_SLIDE_NP": "syscall",
- "syscall.SYS_SHMAT": "syscall",
- "syscall.SYS_SHMCTL": "syscall",
- "syscall.SYS_SHMDT": "syscall",
- "syscall.SYS_SHMGET": "syscall",
- "syscall.SYS_SHMSYS": "syscall",
- "syscall.SYS_SHM_OPEN": "syscall",
- "syscall.SYS_SHM_UNLINK": "syscall",
- "syscall.SYS_SHUTDOWN": "syscall",
- "syscall.SYS_SIGACTION": "syscall",
- "syscall.SYS_SIGALTSTACK": "syscall",
- "syscall.SYS_SIGNAL": "syscall",
- "syscall.SYS_SIGNALFD": "syscall",
- "syscall.SYS_SIGNALFD4": "syscall",
- "syscall.SYS_SIGPENDING": "syscall",
- "syscall.SYS_SIGPROCMASK": "syscall",
- "syscall.SYS_SIGQUEUE": "syscall",
- "syscall.SYS_SIGQUEUEINFO": "syscall",
- "syscall.SYS_SIGRETURN": "syscall",
- "syscall.SYS_SIGSUSPEND": "syscall",
- "syscall.SYS_SIGSUSPEND_NOCANCEL": "syscall",
- "syscall.SYS_SIGTIMEDWAIT": "syscall",
- "syscall.SYS_SIGWAIT": "syscall",
- "syscall.SYS_SIGWAITINFO": "syscall",
- "syscall.SYS_SOCKET": "syscall",
- "syscall.SYS_SOCKETCALL": "syscall",
- "syscall.SYS_SOCKETPAIR": "syscall",
- "syscall.SYS_SPLICE": "syscall",
- "syscall.SYS_SSETMASK": "syscall",
- "syscall.SYS_SSTK": "syscall",
- "syscall.SYS_STACK_SNAPSHOT": "syscall",
- "syscall.SYS_STAT": "syscall",
- "syscall.SYS_STAT64": "syscall",
- "syscall.SYS_STAT64_EXTENDED": "syscall",
- "syscall.SYS_STATFS": "syscall",
- "syscall.SYS_STATFS64": "syscall",
- "syscall.SYS_STATV": "syscall",
- "syscall.SYS_STATVFS1": "syscall",
- "syscall.SYS_STAT_EXTENDED": "syscall",
- "syscall.SYS_STIME": "syscall",
- "syscall.SYS_STTY": "syscall",
- "syscall.SYS_SWAPCONTEXT": "syscall",
- "syscall.SYS_SWAPCTL": "syscall",
- "syscall.SYS_SWAPOFF": "syscall",
- "syscall.SYS_SWAPON": "syscall",
- "syscall.SYS_SYMLINK": "syscall",
- "syscall.SYS_SYMLINKAT": "syscall",
- "syscall.SYS_SYNC": "syscall",
- "syscall.SYS_SYNCFS": "syscall",
- "syscall.SYS_SYNC_FILE_RANGE": "syscall",
- "syscall.SYS_SYSARCH": "syscall",
- "syscall.SYS_SYSCALL": "syscall",
- "syscall.SYS_SYSCALL_BASE": "syscall",
- "syscall.SYS_SYSFS": "syscall",
- "syscall.SYS_SYSINFO": "syscall",
- "syscall.SYS_SYSLOG": "syscall",
- "syscall.SYS_TEE": "syscall",
- "syscall.SYS_TGKILL": "syscall",
- "syscall.SYS_THREAD_SELFID": "syscall",
- "syscall.SYS_THR_CREATE": "syscall",
- "syscall.SYS_THR_EXIT": "syscall",
- "syscall.SYS_THR_KILL": "syscall",
- "syscall.SYS_THR_KILL2": "syscall",
- "syscall.SYS_THR_NEW": "syscall",
- "syscall.SYS_THR_SELF": "syscall",
- "syscall.SYS_THR_SET_NAME": "syscall",
- "syscall.SYS_THR_SUSPEND": "syscall",
- "syscall.SYS_THR_WAKE": "syscall",
- "syscall.SYS_TIME": "syscall",
- "syscall.SYS_TIMERFD_CREATE": "syscall",
- "syscall.SYS_TIMERFD_GETTIME": "syscall",
- "syscall.SYS_TIMERFD_SETTIME": "syscall",
- "syscall.SYS_TIMER_CREATE": "syscall",
- "syscall.SYS_TIMER_DELETE": "syscall",
- "syscall.SYS_TIMER_GETOVERRUN": "syscall",
- "syscall.SYS_TIMER_GETTIME": "syscall",
- "syscall.SYS_TIMER_SETTIME": "syscall",
- "syscall.SYS_TIMES": "syscall",
- "syscall.SYS_TKILL": "syscall",
- "syscall.SYS_TRUNCATE": "syscall",
- "syscall.SYS_TRUNCATE64": "syscall",
- "syscall.SYS_TUXCALL": "syscall",
- "syscall.SYS_UGETRLIMIT": "syscall",
- "syscall.SYS_ULIMIT": "syscall",
- "syscall.SYS_UMASK": "syscall",
- "syscall.SYS_UMASK_EXTENDED": "syscall",
- "syscall.SYS_UMOUNT": "syscall",
- "syscall.SYS_UMOUNT2": "syscall",
- "syscall.SYS_UNAME": "syscall",
- "syscall.SYS_UNDELETE": "syscall",
- "syscall.SYS_UNLINK": "syscall",
- "syscall.SYS_UNLINKAT": "syscall",
- "syscall.SYS_UNMOUNT": "syscall",
- "syscall.SYS_UNSHARE": "syscall",
- "syscall.SYS_USELIB": "syscall",
- "syscall.SYS_USTAT": "syscall",
- "syscall.SYS_UTIME": "syscall",
- "syscall.SYS_UTIMENSAT": "syscall",
- "syscall.SYS_UTIMES": "syscall",
- "syscall.SYS_UTRACE": "syscall",
- "syscall.SYS_UUIDGEN": "syscall",
- "syscall.SYS_VADVISE": "syscall",
- "syscall.SYS_VFORK": "syscall",
- "syscall.SYS_VHANGUP": "syscall",
- "syscall.SYS_VM86": "syscall",
- "syscall.SYS_VM86OLD": "syscall",
- "syscall.SYS_VMSPLICE": "syscall",
- "syscall.SYS_VM_PRESSURE_MONITOR": "syscall",
- "syscall.SYS_VSERVER": "syscall",
- "syscall.SYS_WAIT4": "syscall",
- "syscall.SYS_WAIT4_NOCANCEL": "syscall",
- "syscall.SYS_WAIT6": "syscall",
- "syscall.SYS_WAITEVENT": "syscall",
- "syscall.SYS_WAITID": "syscall",
- "syscall.SYS_WAITID_NOCANCEL": "syscall",
- "syscall.SYS_WAITPID": "syscall",
- "syscall.SYS_WATCHEVENT": "syscall",
- "syscall.SYS_WORKQ_KERNRETURN": "syscall",
- "syscall.SYS_WORKQ_OPEN": "syscall",
- "syscall.SYS_WRITE": "syscall",
- "syscall.SYS_WRITEV": "syscall",
- "syscall.SYS_WRITEV_NOCANCEL": "syscall",
- "syscall.SYS_WRITE_NOCANCEL": "syscall",
- "syscall.SYS_YIELD": "syscall",
- "syscall.SYS__LLSEEK": "syscall",
- "syscall.SYS__LWP_CONTINUE": "syscall",
- "syscall.SYS__LWP_CREATE": "syscall",
- "syscall.SYS__LWP_CTL": "syscall",
- "syscall.SYS__LWP_DETACH": "syscall",
- "syscall.SYS__LWP_EXIT": "syscall",
- "syscall.SYS__LWP_GETNAME": "syscall",
- "syscall.SYS__LWP_GETPRIVATE": "syscall",
- "syscall.SYS__LWP_KILL": "syscall",
- "syscall.SYS__LWP_PARK": "syscall",
- "syscall.SYS__LWP_SELF": "syscall",
- "syscall.SYS__LWP_SETNAME": "syscall",
- "syscall.SYS__LWP_SETPRIVATE": "syscall",
- "syscall.SYS__LWP_SUSPEND": "syscall",
- "syscall.SYS__LWP_UNPARK": "syscall",
- "syscall.SYS__LWP_UNPARK_ALL": "syscall",
- "syscall.SYS__LWP_WAIT": "syscall",
- "syscall.SYS__LWP_WAKEUP": "syscall",
- "syscall.SYS__NEWSELECT": "syscall",
- "syscall.SYS__PSET_BIND": "syscall",
- "syscall.SYS__SCHED_GETAFFINITY": "syscall",
- "syscall.SYS__SCHED_GETPARAM": "syscall",
- "syscall.SYS__SCHED_SETAFFINITY": "syscall",
- "syscall.SYS__SCHED_SETPARAM": "syscall",
- "syscall.SYS__SYSCTL": "syscall",
- "syscall.SYS__UMTX_LOCK": "syscall",
- "syscall.SYS__UMTX_OP": "syscall",
- "syscall.SYS__UMTX_UNLOCK": "syscall",
- "syscall.SYS___ACL_ACLCHECK_FD": "syscall",
- "syscall.SYS___ACL_ACLCHECK_FILE": "syscall",
- "syscall.SYS___ACL_ACLCHECK_LINK": "syscall",
- "syscall.SYS___ACL_DELETE_FD": "syscall",
- "syscall.SYS___ACL_DELETE_FILE": "syscall",
- "syscall.SYS___ACL_DELETE_LINK": "syscall",
- "syscall.SYS___ACL_GET_FD": "syscall",
- "syscall.SYS___ACL_GET_FILE": "syscall",
- "syscall.SYS___ACL_GET_LINK": "syscall",
- "syscall.SYS___ACL_SET_FD": "syscall",
- "syscall.SYS___ACL_SET_FILE": "syscall",
- "syscall.SYS___ACL_SET_LINK": "syscall",
- "syscall.SYS___CLONE": "syscall",
- "syscall.SYS___DISABLE_THREADSIGNAL": "syscall",
- "syscall.SYS___GETCWD": "syscall",
- "syscall.SYS___GETLOGIN": "syscall",
- "syscall.SYS___GET_TCB": "syscall",
- "syscall.SYS___MAC_EXECVE": "syscall",
- "syscall.SYS___MAC_GETFSSTAT": "syscall",
- "syscall.SYS___MAC_GET_FD": "syscall",
- "syscall.SYS___MAC_GET_FILE": "syscall",
- "syscall.SYS___MAC_GET_LCID": "syscall",
- "syscall.SYS___MAC_GET_LCTX": "syscall",
- "syscall.SYS___MAC_GET_LINK": "syscall",
- "syscall.SYS___MAC_GET_MOUNT": "syscall",
- "syscall.SYS___MAC_GET_PID": "syscall",
- "syscall.SYS___MAC_GET_PROC": "syscall",
- "syscall.SYS___MAC_MOUNT": "syscall",
- "syscall.SYS___MAC_SET_FD": "syscall",
- "syscall.SYS___MAC_SET_FILE": "syscall",
- "syscall.SYS___MAC_SET_LCTX": "syscall",
- "syscall.SYS___MAC_SET_LINK": "syscall",
- "syscall.SYS___MAC_SET_PROC": "syscall",
- "syscall.SYS___MAC_SYSCALL": "syscall",
- "syscall.SYS___OLD_SEMWAIT_SIGNAL": "syscall",
- "syscall.SYS___OLD_SEMWAIT_SIGNAL_NOCANCEL": "syscall",
- "syscall.SYS___POSIX_CHOWN": "syscall",
- "syscall.SYS___POSIX_FCHOWN": "syscall",
- "syscall.SYS___POSIX_LCHOWN": "syscall",
- "syscall.SYS___POSIX_RENAME": "syscall",
- "syscall.SYS___PTHREAD_CANCELED": "syscall",
- "syscall.SYS___PTHREAD_CHDIR": "syscall",
- "syscall.SYS___PTHREAD_FCHDIR": "syscall",
- "syscall.SYS___PTHREAD_KILL": "syscall",
- "syscall.SYS___PTHREAD_MARKCANCEL": "syscall",
- "syscall.SYS___PTHREAD_SIGMASK": "syscall",
- "syscall.SYS___QUOTACTL": "syscall",
- "syscall.SYS___SEMCTL": "syscall",
- "syscall.SYS___SEMWAIT_SIGNAL": "syscall",
- "syscall.SYS___SEMWAIT_SIGNAL_NOCANCEL": "syscall",
- "syscall.SYS___SETLOGIN": "syscall",
- "syscall.SYS___SETUGID": "syscall",
- "syscall.SYS___SET_TCB": "syscall",
- "syscall.SYS___SIGACTION_SIGTRAMP": "syscall",
- "syscall.SYS___SIGTIMEDWAIT": "syscall",
- "syscall.SYS___SIGWAIT": "syscall",
- "syscall.SYS___SIGWAIT_NOCANCEL": "syscall",
- "syscall.SYS___SYSCTL": "syscall",
- "syscall.SYS___TFORK": "syscall",
- "syscall.SYS___THREXIT": "syscall",
- "syscall.SYS___THRSIGDIVERT": "syscall",
- "syscall.SYS___THRSLEEP": "syscall",
- "syscall.SYS___THRWAKEUP": "syscall",
- "syscall.S_ARCH1": "syscall",
- "syscall.S_ARCH2": "syscall",
- "syscall.S_BLKSIZE": "syscall",
- "syscall.S_IEXEC": "syscall",
- "syscall.S_IFBLK": "syscall",
- "syscall.S_IFCHR": "syscall",
- "syscall.S_IFDIR": "syscall",
- "syscall.S_IFIFO": "syscall",
- "syscall.S_IFLNK": "syscall",
- "syscall.S_IFMT": "syscall",
- "syscall.S_IFREG": "syscall",
- "syscall.S_IFSOCK": "syscall",
- "syscall.S_IFWHT": "syscall",
- "syscall.S_IREAD": "syscall",
- "syscall.S_IRGRP": "syscall",
- "syscall.S_IROTH": "syscall",
- "syscall.S_IRUSR": "syscall",
- "syscall.S_IRWXG": "syscall",
- "syscall.S_IRWXO": "syscall",
- "syscall.S_IRWXU": "syscall",
- "syscall.S_ISGID": "syscall",
- "syscall.S_ISTXT": "syscall",
- "syscall.S_ISUID": "syscall",
- "syscall.S_ISVTX": "syscall",
- "syscall.S_IWGRP": "syscall",
- "syscall.S_IWOTH": "syscall",
- "syscall.S_IWRITE": "syscall",
- "syscall.S_IWUSR": "syscall",
- "syscall.S_IXGRP": "syscall",
- "syscall.S_IXOTH": "syscall",
- "syscall.S_IXUSR": "syscall",
- "syscall.S_LOGIN_SET": "syscall",
- "syscall.SecurityAttributes": "syscall",
- "syscall.Seek": "syscall",
- "syscall.Select": "syscall",
- "syscall.Sendfile": "syscall",
- "syscall.Sendmsg": "syscall",
- "syscall.SendmsgN": "syscall",
- "syscall.Sendto": "syscall",
- "syscall.Servent": "syscall",
- "syscall.SetBpf": "syscall",
- "syscall.SetBpfBuflen": "syscall",
- "syscall.SetBpfDatalink": "syscall",
- "syscall.SetBpfHeadercmpl": "syscall",
- "syscall.SetBpfImmediate": "syscall",
- "syscall.SetBpfInterface": "syscall",
- "syscall.SetBpfPromisc": "syscall",
- "syscall.SetBpfTimeout": "syscall",
- "syscall.SetCurrentDirectory": "syscall",
- "syscall.SetEndOfFile": "syscall",
- "syscall.SetEnvironmentVariable": "syscall",
- "syscall.SetFileAttributes": "syscall",
- "syscall.SetFileCompletionNotificationModes": "syscall",
- "syscall.SetFilePointer": "syscall",
- "syscall.SetFileTime": "syscall",
- "syscall.SetHandleInformation": "syscall",
- "syscall.SetKevent": "syscall",
- "syscall.SetLsfPromisc": "syscall",
- "syscall.SetNonblock": "syscall",
- "syscall.Setdomainname": "syscall",
- "syscall.Setegid": "syscall",
- "syscall.Setenv": "syscall",
- "syscall.Seteuid": "syscall",
- "syscall.Setfsgid": "syscall",
- "syscall.Setfsuid": "syscall",
- "syscall.Setgid": "syscall",
- "syscall.Setgroups": "syscall",
- "syscall.Sethostname": "syscall",
- "syscall.Setlogin": "syscall",
- "syscall.Setpgid": "syscall",
- "syscall.Setpriority": "syscall",
- "syscall.Setprivexec": "syscall",
- "syscall.Setregid": "syscall",
- "syscall.Setresgid": "syscall",
- "syscall.Setresuid": "syscall",
- "syscall.Setreuid": "syscall",
- "syscall.Setrlimit": "syscall",
- "syscall.Setsid": "syscall",
- "syscall.Setsockopt": "syscall",
- "syscall.SetsockoptByte": "syscall",
- "syscall.SetsockoptICMPv6Filter": "syscall",
- "syscall.SetsockoptIPMreq": "syscall",
- "syscall.SetsockoptIPMreqn": "syscall",
- "syscall.SetsockoptIPv6Mreq": "syscall",
- "syscall.SetsockoptInet4Addr": "syscall",
- "syscall.SetsockoptInt": "syscall",
- "syscall.SetsockoptLinger": "syscall",
- "syscall.SetsockoptString": "syscall",
- "syscall.SetsockoptTimeval": "syscall",
- "syscall.Settimeofday": "syscall",
- "syscall.Setuid": "syscall",
- "syscall.Setxattr": "syscall",
- "syscall.Shutdown": "syscall",
- "syscall.SidTypeAlias": "syscall",
- "syscall.SidTypeComputer": "syscall",
- "syscall.SidTypeDeletedAccount": "syscall",
- "syscall.SidTypeDomain": "syscall",
- "syscall.SidTypeGroup": "syscall",
- "syscall.SidTypeInvalid": "syscall",
- "syscall.SidTypeLabel": "syscall",
- "syscall.SidTypeUnknown": "syscall",
- "syscall.SidTypeUser": "syscall",
- "syscall.SidTypeWellKnownGroup": "syscall",
- "syscall.Signal": "syscall",
- "syscall.SizeofBpfHdr": "syscall",
- "syscall.SizeofBpfInsn": "syscall",
- "syscall.SizeofBpfProgram": "syscall",
- "syscall.SizeofBpfStat": "syscall",
- "syscall.SizeofBpfVersion": "syscall",
- "syscall.SizeofBpfZbuf": "syscall",
- "syscall.SizeofBpfZbufHeader": "syscall",
- "syscall.SizeofCmsghdr": "syscall",
- "syscall.SizeofICMPv6Filter": "syscall",
- "syscall.SizeofIPMreq": "syscall",
- "syscall.SizeofIPMreqn": "syscall",
- "syscall.SizeofIPv6MTUInfo": "syscall",
- "syscall.SizeofIPv6Mreq": "syscall",
- "syscall.SizeofIfAddrmsg": "syscall",
- "syscall.SizeofIfAnnounceMsghdr": "syscall",
- "syscall.SizeofIfData": "syscall",
- "syscall.SizeofIfInfomsg": "syscall",
- "syscall.SizeofIfMsghdr": "syscall",
- "syscall.SizeofIfaMsghdr": "syscall",
- "syscall.SizeofIfmaMsghdr": "syscall",
- "syscall.SizeofIfmaMsghdr2": "syscall",
- "syscall.SizeofInet4Pktinfo": "syscall",
- "syscall.SizeofInet6Pktinfo": "syscall",
- "syscall.SizeofInotifyEvent": "syscall",
- "syscall.SizeofLinger": "syscall",
- "syscall.SizeofMsghdr": "syscall",
- "syscall.SizeofNlAttr": "syscall",
- "syscall.SizeofNlMsgerr": "syscall",
- "syscall.SizeofNlMsghdr": "syscall",
- "syscall.SizeofRtAttr": "syscall",
- "syscall.SizeofRtGenmsg": "syscall",
- "syscall.SizeofRtMetrics": "syscall",
- "syscall.SizeofRtMsg": "syscall",
- "syscall.SizeofRtMsghdr": "syscall",
- "syscall.SizeofRtNexthop": "syscall",
- "syscall.SizeofSockFilter": "syscall",
- "syscall.SizeofSockFprog": "syscall",
- "syscall.SizeofSockaddrAny": "syscall",
- "syscall.SizeofSockaddrDatalink": "syscall",
- "syscall.SizeofSockaddrInet4": "syscall",
- "syscall.SizeofSockaddrInet6": "syscall",
- "syscall.SizeofSockaddrLinklayer": "syscall",
- "syscall.SizeofSockaddrNetlink": "syscall",
- "syscall.SizeofSockaddrUnix": "syscall",
- "syscall.SizeofTCPInfo": "syscall",
- "syscall.SizeofUcred": "syscall",
- "syscall.SlicePtrFromStrings": "syscall",
- "syscall.SockFilter": "syscall",
- "syscall.SockFprog": "syscall",
- "syscall.SockaddrDatalink": "syscall",
- "syscall.SockaddrGen": "syscall",
- "syscall.SockaddrInet4": "syscall",
- "syscall.SockaddrInet6": "syscall",
- "syscall.SockaddrLinklayer": "syscall",
- "syscall.SockaddrNetlink": "syscall",
- "syscall.SockaddrUnix": "syscall",
- "syscall.Socket": "syscall",
- "syscall.SocketControlMessage": "syscall",
- "syscall.SocketDisableIPv6": "syscall",
- "syscall.Socketpair": "syscall",
- "syscall.Splice": "syscall",
- "syscall.StartProcess": "syscall",
- "syscall.StartupInfo": "syscall",
- "syscall.Stat": "syscall",
- "syscall.Stat_t": "syscall",
- "syscall.Statfs": "syscall",
- "syscall.Statfs_t": "syscall",
- "syscall.Stderr": "syscall",
- "syscall.Stdin": "syscall",
- "syscall.Stdout": "syscall",
- "syscall.StringBytePtr": "syscall",
- "syscall.StringByteSlice": "syscall",
- "syscall.StringSlicePtr": "syscall",
- "syscall.StringToSid": "syscall",
- "syscall.StringToUTF16": "syscall",
- "syscall.StringToUTF16Ptr": "syscall",
- "syscall.Symlink": "syscall",
- "syscall.Sync": "syscall",
- "syscall.SyncFileRange": "syscall",
- "syscall.SysProcAttr": "syscall",
- "syscall.SysProcIDMap": "syscall",
- "syscall.Syscall": "syscall",
- "syscall.Syscall12": "syscall",
- "syscall.Syscall15": "syscall",
- "syscall.Syscall6": "syscall",
- "syscall.Syscall9": "syscall",
- "syscall.Sysctl": "syscall",
- "syscall.SysctlUint32": "syscall",
- "syscall.Sysctlnode": "syscall",
- "syscall.Sysinfo": "syscall",
- "syscall.Sysinfo_t": "syscall",
- "syscall.Systemtime": "syscall",
- "syscall.TCGETS": "syscall",
- "syscall.TCIFLUSH": "syscall",
- "syscall.TCIOFLUSH": "syscall",
- "syscall.TCOFLUSH": "syscall",
- "syscall.TCPInfo": "syscall",
- "syscall.TCPKeepalive": "syscall",
- "syscall.TCP_CA_NAME_MAX": "syscall",
- "syscall.TCP_CONGCTL": "syscall",
- "syscall.TCP_CONGESTION": "syscall",
- "syscall.TCP_CONNECTIONTIMEOUT": "syscall",
- "syscall.TCP_CORK": "syscall",
- "syscall.TCP_DEFER_ACCEPT": "syscall",
- "syscall.TCP_INFO": "syscall",
- "syscall.TCP_KEEPALIVE": "syscall",
- "syscall.TCP_KEEPCNT": "syscall",
- "syscall.TCP_KEEPIDLE": "syscall",
- "syscall.TCP_KEEPINIT": "syscall",
- "syscall.TCP_KEEPINTVL": "syscall",
- "syscall.TCP_LINGER2": "syscall",
- "syscall.TCP_MAXBURST": "syscall",
- "syscall.TCP_MAXHLEN": "syscall",
- "syscall.TCP_MAXOLEN": "syscall",
- "syscall.TCP_MAXSEG": "syscall",
- "syscall.TCP_MAXWIN": "syscall",
- "syscall.TCP_MAX_SACK": "syscall",
- "syscall.TCP_MAX_WINSHIFT": "syscall",
- "syscall.TCP_MD5SIG": "syscall",
- "syscall.TCP_MD5SIG_MAXKEYLEN": "syscall",
- "syscall.TCP_MINMSS": "syscall",
- "syscall.TCP_MINMSSOVERLOAD": "syscall",
- "syscall.TCP_MSS": "syscall",
- "syscall.TCP_NODELAY": "syscall",
- "syscall.TCP_NOOPT": "syscall",
- "syscall.TCP_NOPUSH": "syscall",
- "syscall.TCP_NSTATES": "syscall",
- "syscall.TCP_QUICKACK": "syscall",
- "syscall.TCP_RXT_CONNDROPTIME": "syscall",
- "syscall.TCP_RXT_FINDROP": "syscall",
- "syscall.TCP_SACK_ENABLE": "syscall",
- "syscall.TCP_SYNCNT": "syscall",
- "syscall.TCP_VENDOR": "syscall",
- "syscall.TCP_WINDOW_CLAMP": "syscall",
- "syscall.TCSAFLUSH": "syscall",
- "syscall.TCSETS": "syscall",
- "syscall.TF_DISCONNECT": "syscall",
- "syscall.TF_REUSE_SOCKET": "syscall",
- "syscall.TF_USE_DEFAULT_WORKER": "syscall",
- "syscall.TF_USE_KERNEL_APC": "syscall",
- "syscall.TF_USE_SYSTEM_THREAD": "syscall",
- "syscall.TF_WRITE_BEHIND": "syscall",
- "syscall.TH32CS_INHERIT": "syscall",
- "syscall.TH32CS_SNAPALL": "syscall",
- "syscall.TH32CS_SNAPHEAPLIST": "syscall",
- "syscall.TH32CS_SNAPMODULE": "syscall",
- "syscall.TH32CS_SNAPMODULE32": "syscall",
- "syscall.TH32CS_SNAPPROCESS": "syscall",
- "syscall.TH32CS_SNAPTHREAD": "syscall",
- "syscall.TIME_ZONE_ID_DAYLIGHT": "syscall",
- "syscall.TIME_ZONE_ID_STANDARD": "syscall",
- "syscall.TIME_ZONE_ID_UNKNOWN": "syscall",
- "syscall.TIOCCBRK": "syscall",
- "syscall.TIOCCDTR": "syscall",
- "syscall.TIOCCONS": "syscall",
- "syscall.TIOCDCDTIMESTAMP": "syscall",
- "syscall.TIOCDRAIN": "syscall",
- "syscall.TIOCDSIMICROCODE": "syscall",
- "syscall.TIOCEXCL": "syscall",
- "syscall.TIOCEXT": "syscall",
- "syscall.TIOCFLAG_CDTRCTS": "syscall",
- "syscall.TIOCFLAG_CLOCAL": "syscall",
- "syscall.TIOCFLAG_CRTSCTS": "syscall",
- "syscall.TIOCFLAG_MDMBUF": "syscall",
- "syscall.TIOCFLAG_PPS": "syscall",
- "syscall.TIOCFLAG_SOFTCAR": "syscall",
- "syscall.TIOCFLUSH": "syscall",
- "syscall.TIOCGDEV": "syscall",
- "syscall.TIOCGDRAINWAIT": "syscall",
- "syscall.TIOCGETA": "syscall",
- "syscall.TIOCGETD": "syscall",
- "syscall.TIOCGFLAGS": "syscall",
- "syscall.TIOCGICOUNT": "syscall",
- "syscall.TIOCGLCKTRMIOS": "syscall",
- "syscall.TIOCGLINED": "syscall",
- "syscall.TIOCGPGRP": "syscall",
- "syscall.TIOCGPTN": "syscall",
- "syscall.TIOCGQSIZE": "syscall",
- "syscall.TIOCGRANTPT": "syscall",
- "syscall.TIOCGRS485": "syscall",
- "syscall.TIOCGSERIAL": "syscall",
- "syscall.TIOCGSID": "syscall",
- "syscall.TIOCGSIZE": "syscall",
- "syscall.TIOCGSOFTCAR": "syscall",
- "syscall.TIOCGTSTAMP": "syscall",
- "syscall.TIOCGWINSZ": "syscall",
- "syscall.TIOCINQ": "syscall",
- "syscall.TIOCIXOFF": "syscall",
- "syscall.TIOCIXON": "syscall",
- "syscall.TIOCLINUX": "syscall",
- "syscall.TIOCMBIC": "syscall",
- "syscall.TIOCMBIS": "syscall",
- "syscall.TIOCMGDTRWAIT": "syscall",
- "syscall.TIOCMGET": "syscall",
- "syscall.TIOCMIWAIT": "syscall",
- "syscall.TIOCMODG": "syscall",
- "syscall.TIOCMODS": "syscall",
- "syscall.TIOCMSDTRWAIT": "syscall",
- "syscall.TIOCMSET": "syscall",
- "syscall.TIOCM_CAR": "syscall",
- "syscall.TIOCM_CD": "syscall",
- "syscall.TIOCM_CTS": "syscall",
- "syscall.TIOCM_DCD": "syscall",
- "syscall.TIOCM_DSR": "syscall",
- "syscall.TIOCM_DTR": "syscall",
- "syscall.TIOCM_LE": "syscall",
- "syscall.TIOCM_RI": "syscall",
- "syscall.TIOCM_RNG": "syscall",
- "syscall.TIOCM_RTS": "syscall",
- "syscall.TIOCM_SR": "syscall",
- "syscall.TIOCM_ST": "syscall",
- "syscall.TIOCNOTTY": "syscall",
- "syscall.TIOCNXCL": "syscall",
- "syscall.TIOCOUTQ": "syscall",
- "syscall.TIOCPKT": "syscall",
- "syscall.TIOCPKT_DATA": "syscall",
- "syscall.TIOCPKT_DOSTOP": "syscall",
- "syscall.TIOCPKT_FLUSHREAD": "syscall",
- "syscall.TIOCPKT_FLUSHWRITE": "syscall",
- "syscall.TIOCPKT_IOCTL": "syscall",
- "syscall.TIOCPKT_NOSTOP": "syscall",
- "syscall.TIOCPKT_START": "syscall",
- "syscall.TIOCPKT_STOP": "syscall",
- "syscall.TIOCPTMASTER": "syscall",
- "syscall.TIOCPTMGET": "syscall",
- "syscall.TIOCPTSNAME": "syscall",
- "syscall.TIOCPTYGNAME": "syscall",
- "syscall.TIOCPTYGRANT": "syscall",
- "syscall.TIOCPTYUNLK": "syscall",
- "syscall.TIOCRCVFRAME": "syscall",
- "syscall.TIOCREMOTE": "syscall",
- "syscall.TIOCSBRK": "syscall",
- "syscall.TIOCSCONS": "syscall",
- "syscall.TIOCSCTTY": "syscall",
- "syscall.TIOCSDRAINWAIT": "syscall",
- "syscall.TIOCSDTR": "syscall",
- "syscall.TIOCSERCONFIG": "syscall",
- "syscall.TIOCSERGETLSR": "syscall",
- "syscall.TIOCSERGETMULTI": "syscall",
- "syscall.TIOCSERGSTRUCT": "syscall",
- "syscall.TIOCSERGWILD": "syscall",
- "syscall.TIOCSERSETMULTI": "syscall",
- "syscall.TIOCSERSWILD": "syscall",
- "syscall.TIOCSER_TEMT": "syscall",
- "syscall.TIOCSETA": "syscall",
- "syscall.TIOCSETAF": "syscall",
- "syscall.TIOCSETAW": "syscall",
- "syscall.TIOCSETD": "syscall",
- "syscall.TIOCSFLAGS": "syscall",
- "syscall.TIOCSIG": "syscall",
- "syscall.TIOCSLCKTRMIOS": "syscall",
- "syscall.TIOCSLINED": "syscall",
- "syscall.TIOCSPGRP": "syscall",
- "syscall.TIOCSPTLCK": "syscall",
- "syscall.TIOCSQSIZE": "syscall",
- "syscall.TIOCSRS485": "syscall",
- "syscall.TIOCSSERIAL": "syscall",
- "syscall.TIOCSSIZE": "syscall",
- "syscall.TIOCSSOFTCAR": "syscall",
- "syscall.TIOCSTART": "syscall",
- "syscall.TIOCSTAT": "syscall",
- "syscall.TIOCSTI": "syscall",
- "syscall.TIOCSTOP": "syscall",
- "syscall.TIOCSTSTAMP": "syscall",
- "syscall.TIOCSWINSZ": "syscall",
- "syscall.TIOCTIMESTAMP": "syscall",
- "syscall.TIOCUCNTL": "syscall",
- "syscall.TIOCVHANGUP": "syscall",
- "syscall.TIOCXMTFRAME": "syscall",
- "syscall.TOKEN_ADJUST_DEFAULT": "syscall",
- "syscall.TOKEN_ADJUST_GROUPS": "syscall",
- "syscall.TOKEN_ADJUST_PRIVILEGES": "syscall",
- "syscall.TOKEN_ALL_ACCESS": "syscall",
- "syscall.TOKEN_ASSIGN_PRIMARY": "syscall",
- "syscall.TOKEN_DUPLICATE": "syscall",
- "syscall.TOKEN_EXECUTE": "syscall",
- "syscall.TOKEN_IMPERSONATE": "syscall",
- "syscall.TOKEN_QUERY": "syscall",
- "syscall.TOKEN_QUERY_SOURCE": "syscall",
- "syscall.TOKEN_READ": "syscall",
- "syscall.TOKEN_WRITE": "syscall",
- "syscall.TOSTOP": "syscall",
- "syscall.TRUNCATE_EXISTING": "syscall",
- "syscall.TUNATTACHFILTER": "syscall",
- "syscall.TUNDETACHFILTER": "syscall",
- "syscall.TUNGETFEATURES": "syscall",
- "syscall.TUNGETIFF": "syscall",
- "syscall.TUNGETSNDBUF": "syscall",
- "syscall.TUNGETVNETHDRSZ": "syscall",
- "syscall.TUNSETDEBUG": "syscall",
- "syscall.TUNSETGROUP": "syscall",
- "syscall.TUNSETIFF": "syscall",
- "syscall.TUNSETLINK": "syscall",
- "syscall.TUNSETNOCSUM": "syscall",
- "syscall.TUNSETOFFLOAD": "syscall",
- "syscall.TUNSETOWNER": "syscall",
- "syscall.TUNSETPERSIST": "syscall",
- "syscall.TUNSETSNDBUF": "syscall",
- "syscall.TUNSETTXFILTER": "syscall",
- "syscall.TUNSETVNETHDRSZ": "syscall",
- "syscall.Tee": "syscall",
- "syscall.TerminateProcess": "syscall",
- "syscall.Termios": "syscall",
- "syscall.Tgkill": "syscall",
- "syscall.Time": "syscall",
- "syscall.Time_t": "syscall",
- "syscall.Times": "syscall",
- "syscall.Timespec": "syscall",
- "syscall.TimespecToNsec": "syscall",
- "syscall.Timeval": "syscall",
- "syscall.Timeval32": "syscall",
- "syscall.TimevalToNsec": "syscall",
- "syscall.Timex": "syscall",
- "syscall.Timezoneinformation": "syscall",
- "syscall.Tms": "syscall",
- "syscall.Token": "syscall",
- "syscall.TokenAccessInformation": "syscall",
- "syscall.TokenAuditPolicy": "syscall",
- "syscall.TokenDefaultDacl": "syscall",
- "syscall.TokenElevation": "syscall",
- "syscall.TokenElevationType": "syscall",
- "syscall.TokenGroups": "syscall",
- "syscall.TokenGroupsAndPrivileges": "syscall",
- "syscall.TokenHasRestrictions": "syscall",
- "syscall.TokenImpersonationLevel": "syscall",
- "syscall.TokenIntegrityLevel": "syscall",
- "syscall.TokenLinkedToken": "syscall",
- "syscall.TokenLogonSid": "syscall",
- "syscall.TokenMandatoryPolicy": "syscall",
- "syscall.TokenOrigin": "syscall",
- "syscall.TokenOwner": "syscall",
- "syscall.TokenPrimaryGroup": "syscall",
- "syscall.TokenPrivileges": "syscall",
- "syscall.TokenRestrictedSids": "syscall",
- "syscall.TokenSandBoxInert": "syscall",
- "syscall.TokenSessionId": "syscall",
- "syscall.TokenSessionReference": "syscall",
- "syscall.TokenSource": "syscall",
- "syscall.TokenStatistics": "syscall",
- "syscall.TokenType": "syscall",
- "syscall.TokenUIAccess": "syscall",
- "syscall.TokenUser": "syscall",
- "syscall.TokenVirtualizationAllowed": "syscall",
- "syscall.TokenVirtualizationEnabled": "syscall",
- "syscall.Tokenprimarygroup": "syscall",
- "syscall.Tokenuser": "syscall",
- "syscall.TranslateAccountName": "syscall",
- "syscall.TranslateName": "syscall",
- "syscall.TransmitFile": "syscall",
- "syscall.TransmitFileBuffers": "syscall",
- "syscall.Truncate": "syscall",
- "syscall.USAGE_MATCH_TYPE_AND": "syscall",
- "syscall.USAGE_MATCH_TYPE_OR": "syscall",
- "syscall.UTF16FromString": "syscall",
- "syscall.UTF16PtrFromString": "syscall",
- "syscall.UTF16ToString": "syscall",
- "syscall.Ucred": "syscall",
- "syscall.Umask": "syscall",
- "syscall.Uname": "syscall",
- "syscall.Undelete": "syscall",
- "syscall.UnixCredentials": "syscall",
- "syscall.UnixRights": "syscall",
- "syscall.Unlink": "syscall",
- "syscall.Unlinkat": "syscall",
- "syscall.UnmapViewOfFile": "syscall",
- "syscall.Unmount": "syscall",
- "syscall.Unsetenv": "syscall",
- "syscall.Unshare": "syscall",
- "syscall.UserInfo10": "syscall",
- "syscall.Ustat": "syscall",
- "syscall.Ustat_t": "syscall",
- "syscall.Utimbuf": "syscall",
- "syscall.Utime": "syscall",
- "syscall.Utimes": "syscall",
- "syscall.UtimesNano": "syscall",
- "syscall.Utsname": "syscall",
- "syscall.VDISCARD": "syscall",
- "syscall.VDSUSP": "syscall",
- "syscall.VEOF": "syscall",
- "syscall.VEOL": "syscall",
- "syscall.VEOL2": "syscall",
- "syscall.VERASE": "syscall",
- "syscall.VERASE2": "syscall",
- "syscall.VINTR": "syscall",
- "syscall.VKILL": "syscall",
- "syscall.VLNEXT": "syscall",
- "syscall.VMIN": "syscall",
- "syscall.VQUIT": "syscall",
- "syscall.VREPRINT": "syscall",
- "syscall.VSTART": "syscall",
- "syscall.VSTATUS": "syscall",
- "syscall.VSTOP": "syscall",
- "syscall.VSUSP": "syscall",
- "syscall.VSWTC": "syscall",
- "syscall.VT0": "syscall",
- "syscall.VT1": "syscall",
- "syscall.VTDLY": "syscall",
- "syscall.VTIME": "syscall",
- "syscall.VWERASE": "syscall",
- "syscall.VirtualLock": "syscall",
- "syscall.VirtualUnlock": "syscall",
- "syscall.WAIT_ABANDONED": "syscall",
- "syscall.WAIT_FAILED": "syscall",
- "syscall.WAIT_OBJECT_0": "syscall",
- "syscall.WAIT_TIMEOUT": "syscall",
- "syscall.WALL": "syscall",
- "syscall.WALLSIG": "syscall",
- "syscall.WALTSIG": "syscall",
- "syscall.WCLONE": "syscall",
- "syscall.WCONTINUED": "syscall",
- "syscall.WCOREFLAG": "syscall",
- "syscall.WEXITED": "syscall",
- "syscall.WLINUXCLONE": "syscall",
- "syscall.WNOHANG": "syscall",
- "syscall.WNOTHREAD": "syscall",
- "syscall.WNOWAIT": "syscall",
- "syscall.WNOZOMBIE": "syscall",
- "syscall.WOPTSCHECKED": "syscall",
- "syscall.WORDSIZE": "syscall",
- "syscall.WSABuf": "syscall",
- "syscall.WSACleanup": "syscall",
- "syscall.WSADESCRIPTION_LEN": "syscall",
- "syscall.WSAData": "syscall",
- "syscall.WSAEACCES": "syscall",
- "syscall.WSAECONNABORTED": "syscall",
- "syscall.WSAECONNRESET": "syscall",
- "syscall.WSAEnumProtocols": "syscall",
- "syscall.WSAID_CONNECTEX": "syscall",
- "syscall.WSAIoctl": "syscall",
- "syscall.WSAPROTOCOL_LEN": "syscall",
- "syscall.WSAProtocolChain": "syscall",
- "syscall.WSAProtocolInfo": "syscall",
- "syscall.WSARecv": "syscall",
- "syscall.WSARecvFrom": "syscall",
- "syscall.WSASYS_STATUS_LEN": "syscall",
- "syscall.WSASend": "syscall",
- "syscall.WSASendTo": "syscall",
- "syscall.WSASendto": "syscall",
- "syscall.WSAStartup": "syscall",
- "syscall.WSTOPPED": "syscall",
- "syscall.WTRAPPED": "syscall",
- "syscall.WUNTRACED": "syscall",
- "syscall.Wait4": "syscall",
- "syscall.WaitForSingleObject": "syscall",
- "syscall.WaitStatus": "syscall",
- "syscall.Win32FileAttributeData": "syscall",
- "syscall.Win32finddata": "syscall",
- "syscall.Write": "syscall",
- "syscall.WriteConsole": "syscall",
- "syscall.WriteFile": "syscall",
- "syscall.X509_ASN_ENCODING": "syscall",
- "syscall.XCASE": "syscall",
- "syscall.XP1_CONNECTIONLESS": "syscall",
- "syscall.XP1_CONNECT_DATA": "syscall",
- "syscall.XP1_DISCONNECT_DATA": "syscall",
- "syscall.XP1_EXPEDITED_DATA": "syscall",
- "syscall.XP1_GRACEFUL_CLOSE": "syscall",
- "syscall.XP1_GUARANTEED_DELIVERY": "syscall",
- "syscall.XP1_GUARANTEED_ORDER": "syscall",
- "syscall.XP1_IFS_HANDLES": "syscall",
- "syscall.XP1_MESSAGE_ORIENTED": "syscall",
- "syscall.XP1_MULTIPOINT_CONTROL_PLANE": "syscall",
- "syscall.XP1_MULTIPOINT_DATA_PLANE": "syscall",
- "syscall.XP1_PARTIAL_MESSAGE": "syscall",
- "syscall.XP1_PSEUDO_STREAM": "syscall",
- "syscall.XP1_QOS_SUPPORTED": "syscall",
- "syscall.XP1_SAN_SUPPORT_SDP": "syscall",
- "syscall.XP1_SUPPORT_BROADCAST": "syscall",
- "syscall.XP1_SUPPORT_MULTIPOINT": "syscall",
- "syscall.XP1_UNI_RECV": "syscall",
- "syscall.XP1_UNI_SEND": "syscall",
- "syslog.Dial": "log/syslog",
- "syslog.LOG_ALERT": "log/syslog",
- "syslog.LOG_AUTH": "log/syslog",
- "syslog.LOG_AUTHPRIV": "log/syslog",
- "syslog.LOG_CRIT": "log/syslog",
- "syslog.LOG_CRON": "log/syslog",
- "syslog.LOG_DAEMON": "log/syslog",
- "syslog.LOG_DEBUG": "log/syslog",
- "syslog.LOG_EMERG": "log/syslog",
- "syslog.LOG_ERR": "log/syslog",
- "syslog.LOG_FTP": "log/syslog",
- "syslog.LOG_INFO": "log/syslog",
- "syslog.LOG_KERN": "log/syslog",
- "syslog.LOG_LOCAL0": "log/syslog",
- "syslog.LOG_LOCAL1": "log/syslog",
- "syslog.LOG_LOCAL2": "log/syslog",
- "syslog.LOG_LOCAL3": "log/syslog",
- "syslog.LOG_LOCAL4": "log/syslog",
- "syslog.LOG_LOCAL5": "log/syslog",
- "syslog.LOG_LOCAL6": "log/syslog",
- "syslog.LOG_LOCAL7": "log/syslog",
- "syslog.LOG_LPR": "log/syslog",
- "syslog.LOG_MAIL": "log/syslog",
- "syslog.LOG_NEWS": "log/syslog",
- "syslog.LOG_NOTICE": "log/syslog",
- "syslog.LOG_SYSLOG": "log/syslog",
- "syslog.LOG_USER": "log/syslog",
- "syslog.LOG_UUCP": "log/syslog",
- "syslog.LOG_WARNING": "log/syslog",
- "syslog.New": "log/syslog",
- "syslog.NewLogger": "log/syslog",
- "syslog.Priority": "log/syslog",
- "syslog.Writer": "log/syslog",
- "tabwriter.AlignRight": "text/tabwriter",
- "tabwriter.Debug": "text/tabwriter",
- "tabwriter.DiscardEmptyColumns": "text/tabwriter",
- "tabwriter.Escape": "text/tabwriter",
- "tabwriter.FilterHTML": "text/tabwriter",
- "tabwriter.NewWriter": "text/tabwriter",
- "tabwriter.StripEscape": "text/tabwriter",
- "tabwriter.TabIndent": "text/tabwriter",
- "tabwriter.Writer": "text/tabwriter",
- "tar.ErrFieldTooLong": "archive/tar",
- "tar.ErrHeader": "archive/tar",
- "tar.ErrWriteAfterClose": "archive/tar",
- "tar.ErrWriteTooLong": "archive/tar",
- "tar.FileInfoHeader": "archive/tar",
- "tar.Header": "archive/tar",
- "tar.NewReader": "archive/tar",
- "tar.NewWriter": "archive/tar",
- "tar.Reader": "archive/tar",
- "tar.TypeBlock": "archive/tar",
- "tar.TypeChar": "archive/tar",
- "tar.TypeCont": "archive/tar",
- "tar.TypeDir": "archive/tar",
- "tar.TypeFifo": "archive/tar",
- "tar.TypeGNULongLink": "archive/tar",
- "tar.TypeGNULongName": "archive/tar",
- "tar.TypeGNUSparse": "archive/tar",
- "tar.TypeLink": "archive/tar",
- "tar.TypeReg": "archive/tar",
- "tar.TypeRegA": "archive/tar",
- "tar.TypeSymlink": "archive/tar",
- "tar.TypeXGlobalHeader": "archive/tar",
- "tar.TypeXHeader": "archive/tar",
- "tar.Writer": "archive/tar",
- "template.CSS": "html/template",
- "template.ErrAmbigContext": "html/template",
- "template.ErrBadHTML": "html/template",
- "template.ErrBranchEnd": "html/template",
- "template.ErrEndContext": "html/template",
- "template.ErrNoSuchTemplate": "html/template",
- "template.ErrOutputContext": "html/template",
- "template.ErrPartialCharset": "html/template",
- "template.ErrPartialEscape": "html/template",
- "template.ErrPredefinedEscaper": "html/template",
- "template.ErrRangeLoopReentry": "html/template",
- "template.ErrSlashAmbig": "html/template",
- "template.Error": "html/template",
- "template.ErrorCode": "html/template",
- "template.ExecError": "text/template",
- // "template.FuncMap" is ambiguous
- "template.HTML": "html/template",
- "template.HTMLAttr": "html/template",
- // "template.HTMLEscape" is ambiguous
- // "template.HTMLEscapeString" is ambiguous
- // "template.HTMLEscaper" is ambiguous
- // "template.IsTrue" is ambiguous
- "template.JS": "html/template",
- // "template.JSEscape" is ambiguous
- // "template.JSEscapeString" is ambiguous
- // "template.JSEscaper" is ambiguous
- "template.JSStr": "html/template",
- // "template.Must" is ambiguous
- // "template.New" is ambiguous
- "template.OK": "html/template",
- // "template.ParseFiles" is ambiguous
- // "template.ParseGlob" is ambiguous
- // "template.Template" is ambiguous
- "template.URL": "html/template",
- // "template.URLQueryEscaper" is ambiguous
- "testing.AllocsPerRun": "testing",
- "testing.B": "testing",
- "testing.Benchmark": "testing",
- "testing.BenchmarkResult": "testing",
- "testing.Cover": "testing",
- "testing.CoverBlock": "testing",
- "testing.CoverMode": "testing",
- "testing.Coverage": "testing",
- "testing.InternalBenchmark": "testing",
- "testing.InternalExample": "testing",
- "testing.InternalTest": "testing",
- "testing.M": "testing",
- "testing.Main": "testing",
- "testing.MainStart": "testing",
- "testing.PB": "testing",
- "testing.RegisterCover": "testing",
- "testing.RunBenchmarks": "testing",
- "testing.RunExamples": "testing",
- "testing.RunTests": "testing",
- "testing.Short": "testing",
- "testing.T": "testing",
- "testing.Verbose": "testing",
- "textproto.CanonicalMIMEHeaderKey": "net/textproto",
- "textproto.Conn": "net/textproto",
- "textproto.Dial": "net/textproto",
- "textproto.Error": "net/textproto",
- "textproto.MIMEHeader": "net/textproto",
- "textproto.NewConn": "net/textproto",
- "textproto.NewReader": "net/textproto",
- "textproto.NewWriter": "net/textproto",
- "textproto.Pipeline": "net/textproto",
- "textproto.ProtocolError": "net/textproto",
- "textproto.Reader": "net/textproto",
- "textproto.TrimBytes": "net/textproto",
- "textproto.TrimString": "net/textproto",
- "textproto.Writer": "net/textproto",
- "time.ANSIC": "time",
- "time.After": "time",
- "time.AfterFunc": "time",
- "time.April": "time",
- "time.August": "time",
- "time.Date": "time",
- "time.December": "time",
- "time.Duration": "time",
- "time.February": "time",
- "time.FixedZone": "time",
- "time.Friday": "time",
- "time.Hour": "time",
- "time.January": "time",
- "time.July": "time",
- "time.June": "time",
- "time.Kitchen": "time",
- "time.LoadLocation": "time",
- "time.Local": "time",
- "time.Location": "time",
- "time.March": "time",
- "time.May": "time",
- "time.Microsecond": "time",
- "time.Millisecond": "time",
- "time.Minute": "time",
- "time.Monday": "time",
- "time.Month": "time",
- "time.Nanosecond": "time",
- "time.NewTicker": "time",
- "time.NewTimer": "time",
- "time.November": "time",
- "time.Now": "time",
- "time.October": "time",
- "time.Parse": "time",
- "time.ParseDuration": "time",
- "time.ParseError": "time",
- "time.ParseInLocation": "time",
- "time.RFC1123": "time",
- "time.RFC1123Z": "time",
- "time.RFC3339": "time",
- "time.RFC3339Nano": "time",
- "time.RFC822": "time",
- "time.RFC822Z": "time",
- "time.RFC850": "time",
- "time.RubyDate": "time",
- "time.Saturday": "time",
- "time.Second": "time",
- "time.September": "time",
- "time.Since": "time",
- "time.Sleep": "time",
- "time.Stamp": "time",
- "time.StampMicro": "time",
- "time.StampMilli": "time",
- "time.StampNano": "time",
- "time.Sunday": "time",
- "time.Thursday": "time",
- "time.Tick": "time",
- "time.Ticker": "time",
- "time.Time": "time",
- "time.Timer": "time",
- "time.Tuesday": "time",
- "time.UTC": "time",
- "time.Unix": "time",
- "time.UnixDate": "time",
- "time.Until": "time",
- "time.Wednesday": "time",
- "time.Weekday": "time",
- "tls.Certificate": "crypto/tls",
- "tls.CertificateRequestInfo": "crypto/tls",
- "tls.Client": "crypto/tls",
- "tls.ClientAuthType": "crypto/tls",
- "tls.ClientHelloInfo": "crypto/tls",
- "tls.ClientSessionCache": "crypto/tls",
- "tls.ClientSessionState": "crypto/tls",
- "tls.Config": "crypto/tls",
- "tls.Conn": "crypto/tls",
- "tls.ConnectionState": "crypto/tls",
- "tls.CurveID": "crypto/tls",
- "tls.CurveP256": "crypto/tls",
- "tls.CurveP384": "crypto/tls",
- "tls.CurveP521": "crypto/tls",
- "tls.Dial": "crypto/tls",
- "tls.DialWithDialer": "crypto/tls",
- "tls.ECDSAWithP256AndSHA256": "crypto/tls",
- "tls.ECDSAWithP384AndSHA384": "crypto/tls",
- "tls.ECDSAWithP521AndSHA512": "crypto/tls",
- "tls.Listen": "crypto/tls",
- "tls.LoadX509KeyPair": "crypto/tls",
- "tls.NewLRUClientSessionCache": "crypto/tls",
- "tls.NewListener": "crypto/tls",
- "tls.NoClientCert": "crypto/tls",
- "tls.PKCS1WithSHA1": "crypto/tls",
- "tls.PKCS1WithSHA256": "crypto/tls",
- "tls.PKCS1WithSHA384": "crypto/tls",
- "tls.PKCS1WithSHA512": "crypto/tls",
- "tls.PSSWithSHA256": "crypto/tls",
- "tls.PSSWithSHA384": "crypto/tls",
- "tls.PSSWithSHA512": "crypto/tls",
- "tls.RecordHeaderError": "crypto/tls",
- "tls.RenegotiateFreelyAsClient": "crypto/tls",
- "tls.RenegotiateNever": "crypto/tls",
- "tls.RenegotiateOnceAsClient": "crypto/tls",
- "tls.RenegotiationSupport": "crypto/tls",
- "tls.RequestClientCert": "crypto/tls",
- "tls.RequireAndVerifyClientCert": "crypto/tls",
- "tls.RequireAnyClientCert": "crypto/tls",
- "tls.Server": "crypto/tls",
- "tls.SignatureScheme": "crypto/tls",
- "tls.TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA": "crypto/tls",
- "tls.TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256": "crypto/tls",
- "tls.TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256": "crypto/tls",
- "tls.TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA": "crypto/tls",
- "tls.TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384": "crypto/tls",
- "tls.TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305": "crypto/tls",
- "tls.TLS_ECDHE_ECDSA_WITH_RC4_128_SHA": "crypto/tls",
- "tls.TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA": "crypto/tls",
- "tls.TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA": "crypto/tls",
- "tls.TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256": "crypto/tls",
- "tls.TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256": "crypto/tls",
- "tls.TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA": "crypto/tls",
- "tls.TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384": "crypto/tls",
- "tls.TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305": "crypto/tls",
- "tls.TLS_ECDHE_RSA_WITH_RC4_128_SHA": "crypto/tls",
- "tls.TLS_FALLBACK_SCSV": "crypto/tls",
- "tls.TLS_RSA_WITH_3DES_EDE_CBC_SHA": "crypto/tls",
- "tls.TLS_RSA_WITH_AES_128_CBC_SHA": "crypto/tls",
- "tls.TLS_RSA_WITH_AES_128_CBC_SHA256": "crypto/tls",
- "tls.TLS_RSA_WITH_AES_128_GCM_SHA256": "crypto/tls",
- "tls.TLS_RSA_WITH_AES_256_CBC_SHA": "crypto/tls",
- "tls.TLS_RSA_WITH_AES_256_GCM_SHA384": "crypto/tls",
- "tls.TLS_RSA_WITH_RC4_128_SHA": "crypto/tls",
- "tls.VerifyClientCertIfGiven": "crypto/tls",
- "tls.VersionSSL30": "crypto/tls",
- "tls.VersionTLS10": "crypto/tls",
- "tls.VersionTLS11": "crypto/tls",
- "tls.VersionTLS12": "crypto/tls",
- "tls.X25519": "crypto/tls",
- "tls.X509KeyPair": "crypto/tls",
- "token.ADD": "go/token",
- "token.ADD_ASSIGN": "go/token",
- "token.AND": "go/token",
- "token.AND_ASSIGN": "go/token",
- "token.AND_NOT": "go/token",
- "token.AND_NOT_ASSIGN": "go/token",
- "token.ARROW": "go/token",
- "token.ASSIGN": "go/token",
- "token.BREAK": "go/token",
- "token.CASE": "go/token",
- "token.CHAN": "go/token",
- "token.CHAR": "go/token",
- "token.COLON": "go/token",
- "token.COMMA": "go/token",
- "token.COMMENT": "go/token",
- "token.CONST": "go/token",
- "token.CONTINUE": "go/token",
- "token.DEC": "go/token",
- "token.DEFAULT": "go/token",
- "token.DEFER": "go/token",
- "token.DEFINE": "go/token",
- "token.ELLIPSIS": "go/token",
- "token.ELSE": "go/token",
- "token.EOF": "go/token",
- "token.EQL": "go/token",
- "token.FALLTHROUGH": "go/token",
- "token.FLOAT": "go/token",
- "token.FOR": "go/token",
- "token.FUNC": "go/token",
- "token.File": "go/token",
- "token.FileSet": "go/token",
- "token.GEQ": "go/token",
- "token.GO": "go/token",
- "token.GOTO": "go/token",
- "token.GTR": "go/token",
- "token.HighestPrec": "go/token",
- "token.IDENT": "go/token",
- "token.IF": "go/token",
- "token.ILLEGAL": "go/token",
- "token.IMAG": "go/token",
- "token.IMPORT": "go/token",
- "token.INC": "go/token",
- "token.INT": "go/token",
- "token.INTERFACE": "go/token",
- "token.LAND": "go/token",
- "token.LBRACE": "go/token",
- "token.LBRACK": "go/token",
- "token.LEQ": "go/token",
- "token.LOR": "go/token",
- "token.LPAREN": "go/token",
- "token.LSS": "go/token",
- "token.Lookup": "go/token",
- "token.LowestPrec": "go/token",
- "token.MAP": "go/token",
- "token.MUL": "go/token",
- "token.MUL_ASSIGN": "go/token",
- "token.NEQ": "go/token",
- "token.NOT": "go/token",
- "token.NewFileSet": "go/token",
- "token.NoPos": "go/token",
- "token.OR": "go/token",
- "token.OR_ASSIGN": "go/token",
- "token.PACKAGE": "go/token",
- "token.PERIOD": "go/token",
- "token.Pos": "go/token",
- "token.Position": "go/token",
- "token.QUO": "go/token",
- "token.QUO_ASSIGN": "go/token",
- "token.RANGE": "go/token",
- "token.RBRACE": "go/token",
- "token.RBRACK": "go/token",
- "token.REM": "go/token",
- "token.REM_ASSIGN": "go/token",
- "token.RETURN": "go/token",
- "token.RPAREN": "go/token",
- "token.SELECT": "go/token",
- "token.SEMICOLON": "go/token",
- "token.SHL": "go/token",
- "token.SHL_ASSIGN": "go/token",
- "token.SHR": "go/token",
- "token.SHR_ASSIGN": "go/token",
- "token.STRING": "go/token",
- "token.STRUCT": "go/token",
- "token.SUB": "go/token",
- "token.SUB_ASSIGN": "go/token",
- "token.SWITCH": "go/token",
- "token.TYPE": "go/token",
- "token.Token": "go/token",
- "token.UnaryPrec": "go/token",
- "token.VAR": "go/token",
- "token.XOR": "go/token",
- "token.XOR_ASSIGN": "go/token",
- "trace.Start": "runtime/trace",
- "trace.Stop": "runtime/trace",
- "types.Array": "go/types",
- "types.AssertableTo": "go/types",
- "types.AssignableTo": "go/types",
- "types.Basic": "go/types",
- "types.BasicInfo": "go/types",
- "types.BasicKind": "go/types",
- "types.Bool": "go/types",
- "types.Builtin": "go/types",
- "types.Byte": "go/types",
- "types.Chan": "go/types",
- "types.ChanDir": "go/types",
- "types.Checker": "go/types",
- "types.Comparable": "go/types",
- "types.Complex128": "go/types",
- "types.Complex64": "go/types",
- "types.Config": "go/types",
- "types.Const": "go/types",
- "types.ConvertibleTo": "go/types",
- "types.DefPredeclaredTestFuncs": "go/types",
- "types.Default": "go/types",
- "types.Error": "go/types",
- "types.Eval": "go/types",
- "types.ExprString": "go/types",
- "types.FieldVal": "go/types",
- "types.Float32": "go/types",
- "types.Float64": "go/types",
- "types.Func": "go/types",
- "types.Id": "go/types",
- "types.Identical": "go/types",
- "types.IdenticalIgnoreTags": "go/types",
- "types.Implements": "go/types",
- "types.ImportMode": "go/types",
- "types.Importer": "go/types",
- "types.ImporterFrom": "go/types",
- "types.Info": "go/types",
- "types.Initializer": "go/types",
- "types.Int": "go/types",
- "types.Int16": "go/types",
- "types.Int32": "go/types",
- "types.Int64": "go/types",
- "types.Int8": "go/types",
- "types.Interface": "go/types",
- "types.Invalid": "go/types",
- "types.IsBoolean": "go/types",
- "types.IsComplex": "go/types",
- "types.IsConstType": "go/types",
- "types.IsFloat": "go/types",
- "types.IsInteger": "go/types",
- "types.IsInterface": "go/types",
- "types.IsNumeric": "go/types",
- "types.IsOrdered": "go/types",
- "types.IsString": "go/types",
- "types.IsUnsigned": "go/types",
- "types.IsUntyped": "go/types",
- "types.Label": "go/types",
- "types.LookupFieldOrMethod": "go/types",
- "types.Map": "go/types",
- "types.MethodExpr": "go/types",
- "types.MethodSet": "go/types",
- "types.MethodVal": "go/types",
- "types.MissingMethod": "go/types",
- "types.Named": "go/types",
- "types.NewArray": "go/types",
- "types.NewChan": "go/types",
- "types.NewChecker": "go/types",
- "types.NewConst": "go/types",
- "types.NewField": "go/types",
- "types.NewFunc": "go/types",
- "types.NewInterface": "go/types",
- "types.NewLabel": "go/types",
- "types.NewMap": "go/types",
- "types.NewMethodSet": "go/types",
- "types.NewNamed": "go/types",
- "types.NewPackage": "go/types",
- "types.NewParam": "go/types",
- "types.NewPkgName": "go/types",
- "types.NewPointer": "go/types",
- "types.NewScope": "go/types",
- "types.NewSignature": "go/types",
- "types.NewSlice": "go/types",
- "types.NewStruct": "go/types",
- "types.NewTuple": "go/types",
- "types.NewTypeName": "go/types",
- "types.NewVar": "go/types",
- "types.Nil": "go/types",
- "types.ObjectString": "go/types",
- "types.Package": "go/types",
- "types.PkgName": "go/types",
- "types.Pointer": "go/types",
- "types.Qualifier": "go/types",
- "types.RecvOnly": "go/types",
- "types.RelativeTo": "go/types",
- "types.Rune": "go/types",
- "types.Scope": "go/types",
- "types.Selection": "go/types",
- "types.SelectionKind": "go/types",
- "types.SelectionString": "go/types",
- "types.SendOnly": "go/types",
- "types.SendRecv": "go/types",
- "types.Signature": "go/types",
- "types.Sizes": "go/types",
- "types.SizesFor": "go/types",
- "types.Slice": "go/types",
- "types.StdSizes": "go/types",
- "types.String": "go/types",
- "types.Struct": "go/types",
- "types.Tuple": "go/types",
- "types.Typ": "go/types",
- "types.Type": "go/types",
- "types.TypeAndValue": "go/types",
- "types.TypeName": "go/types",
- "types.TypeString": "go/types",
- "types.Uint": "go/types",
- "types.Uint16": "go/types",
- "types.Uint32": "go/types",
- "types.Uint64": "go/types",
- "types.Uint8": "go/types",
- "types.Uintptr": "go/types",
- "types.Universe": "go/types",
- "types.Unsafe": "go/types",
- "types.UnsafePointer": "go/types",
- "types.UntypedBool": "go/types",
- "types.UntypedComplex": "go/types",
- "types.UntypedFloat": "go/types",
- "types.UntypedInt": "go/types",
- "types.UntypedNil": "go/types",
- "types.UntypedRune": "go/types",
- "types.UntypedString": "go/types",
- "types.Var": "go/types",
- "types.WriteExpr": "go/types",
- "types.WriteSignature": "go/types",
- "types.WriteType": "go/types",
- "unicode.ASCII_Hex_Digit": "unicode",
- "unicode.Adlam": "unicode",
- "unicode.Ahom": "unicode",
- "unicode.Anatolian_Hieroglyphs": "unicode",
- "unicode.Arabic": "unicode",
- "unicode.Armenian": "unicode",
- "unicode.Avestan": "unicode",
- "unicode.AzeriCase": "unicode",
- "unicode.Balinese": "unicode",
- "unicode.Bamum": "unicode",
- "unicode.Bassa_Vah": "unicode",
- "unicode.Batak": "unicode",
- "unicode.Bengali": "unicode",
- "unicode.Bhaiksuki": "unicode",
- "unicode.Bidi_Control": "unicode",
- "unicode.Bopomofo": "unicode",
- "unicode.Brahmi": "unicode",
- "unicode.Braille": "unicode",
- "unicode.Buginese": "unicode",
- "unicode.Buhid": "unicode",
- "unicode.C": "unicode",
- "unicode.Canadian_Aboriginal": "unicode",
- "unicode.Carian": "unicode",
- "unicode.CaseRange": "unicode",
- "unicode.CaseRanges": "unicode",
- "unicode.Categories": "unicode",
- "unicode.Caucasian_Albanian": "unicode",
- "unicode.Cc": "unicode",
- "unicode.Cf": "unicode",
- "unicode.Chakma": "unicode",
- "unicode.Cham": "unicode",
- "unicode.Cherokee": "unicode",
- "unicode.Co": "unicode",
- "unicode.Common": "unicode",
- "unicode.Coptic": "unicode",
- "unicode.Cs": "unicode",
- "unicode.Cuneiform": "unicode",
- "unicode.Cypriot": "unicode",
- "unicode.Cyrillic": "unicode",
- "unicode.Dash": "unicode",
- "unicode.Deprecated": "unicode",
- "unicode.Deseret": "unicode",
- "unicode.Devanagari": "unicode",
- "unicode.Diacritic": "unicode",
- "unicode.Digit": "unicode",
- "unicode.Duployan": "unicode",
- "unicode.Egyptian_Hieroglyphs": "unicode",
- "unicode.Elbasan": "unicode",
- "unicode.Ethiopic": "unicode",
- "unicode.Extender": "unicode",
- "unicode.FoldCategory": "unicode",
- "unicode.FoldScript": "unicode",
- "unicode.Georgian": "unicode",
- "unicode.Glagolitic": "unicode",
- "unicode.Gothic": "unicode",
- "unicode.Grantha": "unicode",
- "unicode.GraphicRanges": "unicode",
- "unicode.Greek": "unicode",
- "unicode.Gujarati": "unicode",
- "unicode.Gurmukhi": "unicode",
- "unicode.Han": "unicode",
- "unicode.Hangul": "unicode",
- "unicode.Hanunoo": "unicode",
- "unicode.Hatran": "unicode",
- "unicode.Hebrew": "unicode",
- "unicode.Hex_Digit": "unicode",
- "unicode.Hiragana": "unicode",
- "unicode.Hyphen": "unicode",
- "unicode.IDS_Binary_Operator": "unicode",
- "unicode.IDS_Trinary_Operator": "unicode",
- "unicode.Ideographic": "unicode",
- "unicode.Imperial_Aramaic": "unicode",
- "unicode.In": "unicode",
- "unicode.Inherited": "unicode",
- "unicode.Inscriptional_Pahlavi": "unicode",
- "unicode.Inscriptional_Parthian": "unicode",
- "unicode.Is": "unicode",
- "unicode.IsControl": "unicode",
- "unicode.IsDigit": "unicode",
- "unicode.IsGraphic": "unicode",
- "unicode.IsLetter": "unicode",
- "unicode.IsLower": "unicode",
- "unicode.IsMark": "unicode",
- "unicode.IsNumber": "unicode",
- "unicode.IsOneOf": "unicode",
- "unicode.IsPrint": "unicode",
- "unicode.IsPunct": "unicode",
- "unicode.IsSpace": "unicode",
- "unicode.IsSymbol": "unicode",
- "unicode.IsTitle": "unicode",
- "unicode.IsUpper": "unicode",
- "unicode.Javanese": "unicode",
- "unicode.Join_Control": "unicode",
- "unicode.Kaithi": "unicode",
- "unicode.Kannada": "unicode",
- "unicode.Katakana": "unicode",
- "unicode.Kayah_Li": "unicode",
- "unicode.Kharoshthi": "unicode",
- "unicode.Khmer": "unicode",
- "unicode.Khojki": "unicode",
- "unicode.Khudawadi": "unicode",
- "unicode.L": "unicode",
- "unicode.Lao": "unicode",
- "unicode.Latin": "unicode",
- "unicode.Lepcha": "unicode",
- "unicode.Letter": "unicode",
- "unicode.Limbu": "unicode",
- "unicode.Linear_A": "unicode",
- "unicode.Linear_B": "unicode",
- "unicode.Lisu": "unicode",
- "unicode.Ll": "unicode",
- "unicode.Lm": "unicode",
- "unicode.Lo": "unicode",
- "unicode.Logical_Order_Exception": "unicode",
- "unicode.Lower": "unicode",
- "unicode.LowerCase": "unicode",
- "unicode.Lt": "unicode",
- "unicode.Lu": "unicode",
- "unicode.Lycian": "unicode",
- "unicode.Lydian": "unicode",
- "unicode.M": "unicode",
- "unicode.Mahajani": "unicode",
- "unicode.Malayalam": "unicode",
- "unicode.Mandaic": "unicode",
- "unicode.Manichaean": "unicode",
- "unicode.Marchen": "unicode",
- "unicode.Mark": "unicode",
- "unicode.MaxASCII": "unicode",
- "unicode.MaxCase": "unicode",
- "unicode.MaxLatin1": "unicode",
- "unicode.MaxRune": "unicode",
- "unicode.Mc": "unicode",
- "unicode.Me": "unicode",
- "unicode.Meetei_Mayek": "unicode",
- "unicode.Mende_Kikakui": "unicode",
- "unicode.Meroitic_Cursive": "unicode",
- "unicode.Meroitic_Hieroglyphs": "unicode",
- "unicode.Miao": "unicode",
- "unicode.Mn": "unicode",
- "unicode.Modi": "unicode",
- "unicode.Mongolian": "unicode",
- "unicode.Mro": "unicode",
- "unicode.Multani": "unicode",
- "unicode.Myanmar": "unicode",
- "unicode.N": "unicode",
- "unicode.Nabataean": "unicode",
- "unicode.Nd": "unicode",
- "unicode.New_Tai_Lue": "unicode",
- "unicode.Newa": "unicode",
- "unicode.Nko": "unicode",
- "unicode.Nl": "unicode",
- "unicode.No": "unicode",
- "unicode.Noncharacter_Code_Point": "unicode",
- "unicode.Number": "unicode",
- "unicode.Ogham": "unicode",
- "unicode.Ol_Chiki": "unicode",
- "unicode.Old_Hungarian": "unicode",
- "unicode.Old_Italic": "unicode",
- "unicode.Old_North_Arabian": "unicode",
- "unicode.Old_Permic": "unicode",
- "unicode.Old_Persian": "unicode",
- "unicode.Old_South_Arabian": "unicode",
- "unicode.Old_Turkic": "unicode",
- "unicode.Oriya": "unicode",
- "unicode.Osage": "unicode",
- "unicode.Osmanya": "unicode",
- "unicode.Other": "unicode",
- "unicode.Other_Alphabetic": "unicode",
- "unicode.Other_Default_Ignorable_Code_Point": "unicode",
- "unicode.Other_Grapheme_Extend": "unicode",
- "unicode.Other_ID_Continue": "unicode",
- "unicode.Other_ID_Start": "unicode",
- "unicode.Other_Lowercase": "unicode",
- "unicode.Other_Math": "unicode",
- "unicode.Other_Uppercase": "unicode",
- "unicode.P": "unicode",
- "unicode.Pahawh_Hmong": "unicode",
- "unicode.Palmyrene": "unicode",
- "unicode.Pattern_Syntax": "unicode",
- "unicode.Pattern_White_Space": "unicode",
- "unicode.Pau_Cin_Hau": "unicode",
- "unicode.Pc": "unicode",
- "unicode.Pd": "unicode",
- "unicode.Pe": "unicode",
- "unicode.Pf": "unicode",
- "unicode.Phags_Pa": "unicode",
- "unicode.Phoenician": "unicode",
- "unicode.Pi": "unicode",
- "unicode.Po": "unicode",
- "unicode.Prepended_Concatenation_Mark": "unicode",
- "unicode.PrintRanges": "unicode",
- "unicode.Properties": "unicode",
- "unicode.Ps": "unicode",
- "unicode.Psalter_Pahlavi": "unicode",
- "unicode.Punct": "unicode",
- "unicode.Quotation_Mark": "unicode",
- "unicode.Radical": "unicode",
- "unicode.Range16": "unicode",
- "unicode.Range32": "unicode",
- "unicode.RangeTable": "unicode",
- "unicode.Rejang": "unicode",
- "unicode.ReplacementChar": "unicode",
- "unicode.Runic": "unicode",
- "unicode.S": "unicode",
- "unicode.STerm": "unicode",
- "unicode.Samaritan": "unicode",
- "unicode.Saurashtra": "unicode",
- "unicode.Sc": "unicode",
- "unicode.Scripts": "unicode",
- "unicode.Sentence_Terminal": "unicode",
- "unicode.Sharada": "unicode",
- "unicode.Shavian": "unicode",
- "unicode.Siddham": "unicode",
- "unicode.SignWriting": "unicode",
- "unicode.SimpleFold": "unicode",
- "unicode.Sinhala": "unicode",
- "unicode.Sk": "unicode",
- "unicode.Sm": "unicode",
- "unicode.So": "unicode",
- "unicode.Soft_Dotted": "unicode",
- "unicode.Sora_Sompeng": "unicode",
- "unicode.Space": "unicode",
- "unicode.SpecialCase": "unicode",
- "unicode.Sundanese": "unicode",
- "unicode.Syloti_Nagri": "unicode",
- "unicode.Symbol": "unicode",
- "unicode.Syriac": "unicode",
- "unicode.Tagalog": "unicode",
- "unicode.Tagbanwa": "unicode",
- "unicode.Tai_Le": "unicode",
- "unicode.Tai_Tham": "unicode",
- "unicode.Tai_Viet": "unicode",
- "unicode.Takri": "unicode",
- "unicode.Tamil": "unicode",
- "unicode.Tangut": "unicode",
- "unicode.Telugu": "unicode",
- "unicode.Terminal_Punctuation": "unicode",
- "unicode.Thaana": "unicode",
- "unicode.Thai": "unicode",
- "unicode.Tibetan": "unicode",
- "unicode.Tifinagh": "unicode",
- "unicode.Tirhuta": "unicode",
- "unicode.Title": "unicode",
- "unicode.TitleCase": "unicode",
- "unicode.To": "unicode",
- "unicode.ToLower": "unicode",
- "unicode.ToTitle": "unicode",
- "unicode.ToUpper": "unicode",
- "unicode.TurkishCase": "unicode",
- "unicode.Ugaritic": "unicode",
- "unicode.Unified_Ideograph": "unicode",
- "unicode.Upper": "unicode",
- "unicode.UpperCase": "unicode",
- "unicode.UpperLower": "unicode",
- "unicode.Vai": "unicode",
- "unicode.Variation_Selector": "unicode",
- "unicode.Version": "unicode",
- "unicode.Warang_Citi": "unicode",
- "unicode.White_Space": "unicode",
- "unicode.Yi": "unicode",
- "unicode.Z": "unicode",
- "unicode.Zl": "unicode",
- "unicode.Zp": "unicode",
- "unicode.Zs": "unicode",
- "url.Error": "net/url",
- "url.EscapeError": "net/url",
- "url.InvalidHostError": "net/url",
- "url.Parse": "net/url",
- "url.ParseQuery": "net/url",
- "url.ParseRequestURI": "net/url",
- "url.PathEscape": "net/url",
- "url.PathUnescape": "net/url",
- "url.QueryEscape": "net/url",
- "url.QueryUnescape": "net/url",
- "url.URL": "net/url",
- "url.User": "net/url",
- "url.UserPassword": "net/url",
- "url.Userinfo": "net/url",
- "url.Values": "net/url",
- "user.Current": "os/user",
- "user.Group": "os/user",
- "user.Lookup": "os/user",
- "user.LookupGroup": "os/user",
- "user.LookupGroupId": "os/user",
- "user.LookupId": "os/user",
- "user.UnknownGroupError": "os/user",
- "user.UnknownGroupIdError": "os/user",
- "user.UnknownUserError": "os/user",
- "user.UnknownUserIdError": "os/user",
- "user.User": "os/user",
- "utf16.Decode": "unicode/utf16",
- "utf16.DecodeRune": "unicode/utf16",
- "utf16.Encode": "unicode/utf16",
- "utf16.EncodeRune": "unicode/utf16",
- "utf16.IsSurrogate": "unicode/utf16",
- "utf8.DecodeLastRune": "unicode/utf8",
- "utf8.DecodeLastRuneInString": "unicode/utf8",
- "utf8.DecodeRune": "unicode/utf8",
- "utf8.DecodeRuneInString": "unicode/utf8",
- "utf8.EncodeRune": "unicode/utf8",
- "utf8.FullRune": "unicode/utf8",
- "utf8.FullRuneInString": "unicode/utf8",
- "utf8.MaxRune": "unicode/utf8",
- "utf8.RuneCount": "unicode/utf8",
- "utf8.RuneCountInString": "unicode/utf8",
- "utf8.RuneError": "unicode/utf8",
- "utf8.RuneLen": "unicode/utf8",
- "utf8.RuneSelf": "unicode/utf8",
- "utf8.RuneStart": "unicode/utf8",
- "utf8.UTFMax": "unicode/utf8",
- "utf8.Valid": "unicode/utf8",
- "utf8.ValidRune": "unicode/utf8",
- "utf8.ValidString": "unicode/utf8",
- "x509.CANotAuthorizedForThisName": "crypto/x509",
- "x509.CertPool": "crypto/x509",
- "x509.Certificate": "crypto/x509",
- "x509.CertificateInvalidError": "crypto/x509",
- "x509.CertificateRequest": "crypto/x509",
- "x509.ConstraintViolationError": "crypto/x509",
- "x509.CreateCertificate": "crypto/x509",
- "x509.CreateCertificateRequest": "crypto/x509",
- "x509.DSA": "crypto/x509",
- "x509.DSAWithSHA1": "crypto/x509",
- "x509.DSAWithSHA256": "crypto/x509",
- "x509.DecryptPEMBlock": "crypto/x509",
- "x509.ECDSA": "crypto/x509",
- "x509.ECDSAWithSHA1": "crypto/x509",
- "x509.ECDSAWithSHA256": "crypto/x509",
- "x509.ECDSAWithSHA384": "crypto/x509",
- "x509.ECDSAWithSHA512": "crypto/x509",
- "x509.EncryptPEMBlock": "crypto/x509",
- "x509.ErrUnsupportedAlgorithm": "crypto/x509",
- "x509.Expired": "crypto/x509",
- "x509.ExtKeyUsage": "crypto/x509",
- "x509.ExtKeyUsageAny": "crypto/x509",
- "x509.ExtKeyUsageClientAuth": "crypto/x509",
- "x509.ExtKeyUsageCodeSigning": "crypto/x509",
- "x509.ExtKeyUsageEmailProtection": "crypto/x509",
- "x509.ExtKeyUsageIPSECEndSystem": "crypto/x509",
- "x509.ExtKeyUsageIPSECTunnel": "crypto/x509",
- "x509.ExtKeyUsageIPSECUser": "crypto/x509",
- "x509.ExtKeyUsageMicrosoftServerGatedCrypto": "crypto/x509",
- "x509.ExtKeyUsageNetscapeServerGatedCrypto": "crypto/x509",
- "x509.ExtKeyUsageOCSPSigning": "crypto/x509",
- "x509.ExtKeyUsageServerAuth": "crypto/x509",
- "x509.ExtKeyUsageTimeStamping": "crypto/x509",
- "x509.HostnameError": "crypto/x509",
- "x509.IncompatibleUsage": "crypto/x509",
- "x509.IncorrectPasswordError": "crypto/x509",
- "x509.InsecureAlgorithmError": "crypto/x509",
- "x509.InvalidReason": "crypto/x509",
- "x509.IsEncryptedPEMBlock": "crypto/x509",
- "x509.KeyUsage": "crypto/x509",
- "x509.KeyUsageCRLSign": "crypto/x509",
- "x509.KeyUsageCertSign": "crypto/x509",
- "x509.KeyUsageContentCommitment": "crypto/x509",
- "x509.KeyUsageDataEncipherment": "crypto/x509",
- "x509.KeyUsageDecipherOnly": "crypto/x509",
- "x509.KeyUsageDigitalSignature": "crypto/x509",
- "x509.KeyUsageEncipherOnly": "crypto/x509",
- "x509.KeyUsageKeyAgreement": "crypto/x509",
- "x509.KeyUsageKeyEncipherment": "crypto/x509",
- "x509.MD2WithRSA": "crypto/x509",
- "x509.MD5WithRSA": "crypto/x509",
- "x509.MarshalECPrivateKey": "crypto/x509",
- "x509.MarshalPKCS1PrivateKey": "crypto/x509",
- "x509.MarshalPKIXPublicKey": "crypto/x509",
- "x509.NameMismatch": "crypto/x509",
- "x509.NewCertPool": "crypto/x509",
- "x509.NotAuthorizedToSign": "crypto/x509",
- "x509.PEMCipher": "crypto/x509",
- "x509.PEMCipher3DES": "crypto/x509",
- "x509.PEMCipherAES128": "crypto/x509",
- "x509.PEMCipherAES192": "crypto/x509",
- "x509.PEMCipherAES256": "crypto/x509",
- "x509.PEMCipherDES": "crypto/x509",
- "x509.ParseCRL": "crypto/x509",
- "x509.ParseCertificate": "crypto/x509",
- "x509.ParseCertificateRequest": "crypto/x509",
- "x509.ParseCertificates": "crypto/x509",
- "x509.ParseDERCRL": "crypto/x509",
- "x509.ParseECPrivateKey": "crypto/x509",
- "x509.ParsePKCS1PrivateKey": "crypto/x509",
- "x509.ParsePKCS8PrivateKey": "crypto/x509",
- "x509.ParsePKIXPublicKey": "crypto/x509",
- "x509.PublicKeyAlgorithm": "crypto/x509",
- "x509.RSA": "crypto/x509",
- "x509.SHA1WithRSA": "crypto/x509",
- "x509.SHA256WithRSA": "crypto/x509",
- "x509.SHA256WithRSAPSS": "crypto/x509",
- "x509.SHA384WithRSA": "crypto/x509",
- "x509.SHA384WithRSAPSS": "crypto/x509",
- "x509.SHA512WithRSA": "crypto/x509",
- "x509.SHA512WithRSAPSS": "crypto/x509",
- "x509.SignatureAlgorithm": "crypto/x509",
- "x509.SystemCertPool": "crypto/x509",
- "x509.SystemRootsError": "crypto/x509",
- "x509.TooManyIntermediates": "crypto/x509",
- "x509.UnhandledCriticalExtension": "crypto/x509",
- "x509.UnknownAuthorityError": "crypto/x509",
- "x509.UnknownPublicKeyAlgorithm": "crypto/x509",
- "x509.UnknownSignatureAlgorithm": "crypto/x509",
- "x509.VerifyOptions": "crypto/x509",
- "xml.Attr": "encoding/xml",
- "xml.CharData": "encoding/xml",
- "xml.Comment": "encoding/xml",
- "xml.CopyToken": "encoding/xml",
- "xml.Decoder": "encoding/xml",
- "xml.Directive": "encoding/xml",
- "xml.Encoder": "encoding/xml",
- "xml.EndElement": "encoding/xml",
- "xml.Escape": "encoding/xml",
- "xml.EscapeText": "encoding/xml",
- "xml.HTMLAutoClose": "encoding/xml",
- "xml.HTMLEntity": "encoding/xml",
- "xml.Header": "encoding/xml",
- "xml.Marshal": "encoding/xml",
- "xml.MarshalIndent": "encoding/xml",
- "xml.Marshaler": "encoding/xml",
- "xml.MarshalerAttr": "encoding/xml",
- "xml.Name": "encoding/xml",
- "xml.NewDecoder": "encoding/xml",
- "xml.NewEncoder": "encoding/xml",
- "xml.ProcInst": "encoding/xml",
- "xml.StartElement": "encoding/xml",
- "xml.SyntaxError": "encoding/xml",
- "xml.TagPathError": "encoding/xml",
- "xml.Token": "encoding/xml",
- "xml.Unmarshal": "encoding/xml",
- "xml.UnmarshalError": "encoding/xml",
- "xml.Unmarshaler": "encoding/xml",
- "xml.UnmarshalerAttr": "encoding/xml",
- "xml.UnsupportedTypeError": "encoding/xml",
- "zip.Compressor": "archive/zip",
- "zip.Decompressor": "archive/zip",
- "zip.Deflate": "archive/zip",
- "zip.ErrAlgorithm": "archive/zip",
- "zip.ErrChecksum": "archive/zip",
- "zip.ErrFormat": "archive/zip",
- "zip.File": "archive/zip",
- "zip.FileHeader": "archive/zip",
- "zip.FileInfoHeader": "archive/zip",
- "zip.NewReader": "archive/zip",
- "zip.NewWriter": "archive/zip",
- "zip.OpenReader": "archive/zip",
- "zip.ReadCloser": "archive/zip",
- "zip.Reader": "archive/zip",
- "zip.RegisterCompressor": "archive/zip",
- "zip.RegisterDecompressor": "archive/zip",
- "zip.Store": "archive/zip",
- "zip.Writer": "archive/zip",
- "zlib.BestCompression": "compress/zlib",
- "zlib.BestSpeed": "compress/zlib",
- "zlib.DefaultCompression": "compress/zlib",
- "zlib.ErrChecksum": "compress/zlib",
- "zlib.ErrDictionary": "compress/zlib",
- "zlib.ErrHeader": "compress/zlib",
- "zlib.HuffmanOnly": "compress/zlib",
- "zlib.NewReader": "compress/zlib",
- "zlib.NewReaderDict": "compress/zlib",
- "zlib.NewWriter": "compress/zlib",
- "zlib.NewWriterLevel": "compress/zlib",
- "zlib.NewWriterLevelDict": "compress/zlib",
- "zlib.NoCompression": "compress/zlib",
- "zlib.Resetter": "compress/zlib",
- "zlib.Writer": "compress/zlib",
-}
diff --git a/vendor/github.com/visualfc/gotools/terminal/command.go b/vendor/github.com/visualfc/gotools/terminal/command.go
deleted file mode 100644
index 32e8253..0000000
--- a/vendor/github.com/visualfc/gotools/terminal/command.go
+++ /dev/null
@@ -1,33 +0,0 @@
-// +build !windows
-
-package terminal
-
-import (
- "io"
- "os"
- "os/exec"
-
- "github.com/kr/pty"
-)
-
-func GetShell() (cmd string, args []string) {
- return "/bin/sh", []string{"-l", "-i"}
-}
-
-func Execute(c *exec.Cmd) error {
- f, err := pty.Start(c)
- if err != nil {
- return nil
- }
- go func() {
- for {
- io.Copy(f, os.Stdin)
- }
- }()
- go func() {
- for {
- io.Copy(os.Stdout, f)
- }
- }()
- return c.Wait()
-}
diff --git a/vendor/github.com/visualfc/gotools/terminal/command_windows.go b/vendor/github.com/visualfc/gotools/terminal/command_windows.go
deleted file mode 100644
index 18bc5f6..0000000
--- a/vendor/github.com/visualfc/gotools/terminal/command_windows.go
+++ /dev/null
@@ -1,34 +0,0 @@
-// +build windows
-
-package terminal
-
-import (
- "os"
- "os/exec"
-)
-
-func checkFiles(names ...string) string {
- for _, name := range names {
- _, err := os.Stat(name)
- if err == nil {
- return name
- }
- }
- return ""
-}
-
-func GetShell() (cmd string, args []string) {
- windir := os.Getenv("windir")
- if windir == "" {
- windir = "c:\\windows"
- }
- cmd = checkFiles(windir+"\\Sysnative\\cmd.exe", windir+"\\System32\\cmd.exe")
- return
-}
-
-func Execute(c *exec.Cmd) error {
- c.Stdin = os.Stdin
- c.Stdout = os.Stdout
- c.Stderr = os.Stderr
- return c.Run()
-}
diff --git a/vendor/github.com/visualfc/gotools/terminal/terminal.go b/vendor/github.com/visualfc/gotools/terminal/terminal.go
deleted file mode 100644
index 8138a49..0000000
--- a/vendor/github.com/visualfc/gotools/terminal/terminal.go
+++ /dev/null
@@ -1,39 +0,0 @@
-// Copyright 2011-2017 visualfc . All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-package terminal
-
-import (
- "os"
- "os/exec"
-
- "github.com/visualfc/gotools/command"
-)
-
-var Command = &command.Command{
- Run: runTerminal,
- UsageLine: "terminal [program_name arguments...]",
- Short: "terminal [program]",
- Long: `terminal program and arguments`,
- CustomFlags: true,
-}
-
-func runTerminal(cmd *command.Command, args []string) (err error) {
- var c *exec.Cmd
- if len(args) >= 1 {
- var carg []string
- if len(args) >= 2 {
- carg = append(carg, args[1:]...)
- }
- c = exec.Command(args[0], carg...)
- } else {
- shellCmd, shellArgs := GetShell()
- c = exec.Command(shellCmd, shellArgs...)
- }
- if c == nil {
- return os.ErrInvalid
- }
- err = Execute(c)
-
- return
-}
diff --git a/vendor/github.com/visualfc/gotools/types/types.go b/vendor/github.com/visualfc/gotools/types/types.go
deleted file mode 100644
index d7f5575..0000000
--- a/vendor/github.com/visualfc/gotools/types/types.go
+++ /dev/null
@@ -1,1279 +0,0 @@
-// Copyright 2011-2015 visualfc . All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package types
-
-import (
- "bytes"
- "fmt"
- "go/ast"
- "go/build"
- "go/importer"
- "go/parser"
- "go/printer"
- "go/token"
- "go/types"
- "io/ioutil"
- "log"
- "os"
- "path/filepath"
- "regexp"
- "sort"
- "strconv"
- "strings"
- "time"
-
- "github.com/visualfc/gotools/command"
- "github.com/visualfc/gotools/pkgutil"
- "github.com/visualfc/gotools/stdlib"
- "golang.org/x/tools/go/buildutil"
-)
-
-var Command = &command.Command{
- Run: runTypes,
- UsageLine: "types",
- Short: "golang type util",
- Long: `golang type util`,
-}
-
-var (
- typesVerbose bool
- typesAllowBinary bool
- typesFilePos string
- typesFileStdin bool
- typesFindUse bool
- typesFindDef bool
- typesFindUseAll bool
- typesFindInfo bool
- typesFindDoc bool
- typesTags string
- typesTagList = []string{} // exploded version of tags flag; set in main
-)
-
-//func init
-func init() {
- Command.Flag.BoolVar(&typesVerbose, "v", false, "verbose debugging")
- Command.Flag.BoolVar(&typesAllowBinary, "b", false, "import can be satisfied by a compiled package object without corresponding sources.")
- Command.Flag.StringVar(&typesFilePos, "pos", "", "file position \"file.go:pos\"")
- Command.Flag.BoolVar(&typesFileStdin, "stdin", false, "input file use stdin")
- Command.Flag.BoolVar(&typesFindInfo, "info", false, "find cursor info")
- Command.Flag.BoolVar(&typesFindDef, "def", false, "find cursor define")
- Command.Flag.BoolVar(&typesFindUse, "use", false, "find cursor usages")
- Command.Flag.BoolVar(&typesFindUseAll, "all", false, "find cursor all usages in GOPATH")
- Command.Flag.BoolVar(&typesFindDoc, "doc", false, "find cursor def doc")
- Command.Flag.StringVar(&typesTags, "tags", "", "space-separated list of build tags to apply when parsing")
-}
-
-type ObjKind int
-
-const (
- ObjNone ObjKind = iota
- ObjPkgName
- ObjTypeName
- ObjInterface
- ObjStruct
- ObjConst
- ObjVar
- ObjField
- ObjFunc
- ObjMethod
- ObjLabel
- ObjBuiltin
- ObjNil
- ObjImplicit
- ObjUnknown
- ObjComment
-)
-
-var ObjKindName = []string{"none", "package",
- "type", "interface", "struct",
- "const", "var", "field",
- "func", "method",
- "label", "builtin", "nil",
- "implicit", "unknown", "comment"}
-
-func (k ObjKind) String() string {
- if k >= 0 && int(k) < len(ObjKindName) {
- return ObjKindName[k]
- }
- return "unkwnown"
-}
-
-var builtinInfoMap = map[string]string{
- "append": "func append(slice []Type, elems ...Type) []Type",
- "copy": "func copy(dst, src []Type) int",
- "delete": "func delete(m map[Type]Type1, key Type)",
- "len": "func len(v Type) int",
- "cap": "func cap(v Type) int",
- "make": "func make(Type, size IntegerType) Type",
- "new": "func new(Type) *Type",
- "complex": "func complex(r, i FloatType) ComplexType",
- "real": "func real(c ComplexType) FloatType",
- "imag": "func imag(c ComplexType) FloatType",
- "close": "func close(c chan<- Type)",
- "panic": "func panic(v interface{})",
- "recover": "func recover() interface{}",
- "print": "func print(args ...Type)",
- "println": "func println(args ...Type)",
- "error": "type error interface {Error() string}",
- "Sizeof": "func unsafe.Sizeof(any) uintptr",
- "Offsetof": "func unsafe.Offsetof(any) uintptr",
- "Alignof": "func unsafe.Alignof(any) uintptr",
-}
-
-func builtinInfo(id string) string {
- if info, ok := builtinInfoMap[id]; ok {
- return "builtin " + info
- }
- return "builtin " + id
-}
-
-func simpleObjInfo(obj types.Object) string {
- s := obj.String()
- pkg := obj.Pkg()
- if pkg != nil {
- s = strings.Replace(s, pkg.Path(), pkg.Name(), -1)
- s = simpleType(s)
- if pkg.Name() == "main" {
- s = strings.Replace(s, "main.", "", -1)
- }
- }
- return s
-}
-
-func simpleType(src string) string {
- re, _ := regexp.Compile("[\\w\\./]+")
- return re.ReplaceAllStringFunc(src, func(s string) string {
- r := s
- if i := strings.LastIndex(s, "/"); i != -1 {
- r = s[i+1:]
- }
- if strings.Count(r, ".") > 1 {
- r = r[strings.Index(r, ".")+1:]
- }
- return r
- })
-}
-
-func runTypes(cmd *command.Command, args []string) error {
- if len(args) < 1 {
- cmd.Usage()
- return nil
- }
- if typesVerbose {
- now := time.Now()
- defer func() {
- log.Println("time", time.Now().Sub(now))
- }()
- }
- typesTagList = strings.Split(typesTags, " ")
- context := build.Default
- context.BuildTags = append(typesTagList, context.BuildTags...)
-
- w := NewPkgWalker(&context)
- var cursor *FileCursor
- if typesFilePos != "" {
- var cursorInfo FileCursor
- pos := strings.Index(typesFilePos, ":")
- if pos != -1 {
- cursorInfo.fileName = typesFilePos[:pos]
- if i, err := strconv.Atoi(typesFilePos[pos+1:]); err == nil {
- cursorInfo.cursorPos = i
- }
- }
- if typesFileStdin {
- src, err := ioutil.ReadAll(os.Stdin)
- if err == nil {
- cursorInfo.src = src
- }
- }
- cursor = &cursorInfo
- }
- w.cursor = cursor
- for _, pkgName := range args {
- if pkgName == "." {
- pkgPath, err := os.Getwd()
- if err != nil {
- log.Fatalln(err)
- }
- pkgName = pkgPath
- }
- conf := &PkgConfig{IgnoreFuncBodies: true, AllowBinary: true, WithTestFiles: true}
- if cursor != nil {
- cursor.pkgName = pkgName
- conf.Cursor = cursor
- conf.IgnoreFuncBodies = false
- conf.Info = &types.Info{
- Uses: make(map[*ast.Ident]types.Object),
- Defs: make(map[*ast.Ident]types.Object),
- Selections: make(map[*ast.SelectorExpr]*types.Selection),
- //Types: make(map[ast.Expr]types.TypeAndValue),
- //Scopes : make(map[ast.Node]*types.Scope)
- //Implicits : make(map[ast.Node]types.Object)
- }
- conf.XInfo = &types.Info{
- Uses: make(map[*ast.Ident]types.Object),
- Defs: make(map[*ast.Ident]types.Object),
- Selections: make(map[*ast.SelectorExpr]*types.Selection),
- }
- }
- pkg, err := w.Import("", pkgName, conf)
- if pkg == nil {
- log.Fatalln("error import path", err)
- }
- if cursor != nil && (typesFindInfo || typesFindDef || typesFindUse) {
- w.LookupCursor(pkg, conf, cursor)
- }
- }
- return nil
-}
-
-type FileCursor struct {
- pkgName string
- fileName string
- fileDir string
- cursorPos int
- pos token.Pos
- src interface{}
- xtest bool
-}
-
-type PkgConfig struct {
- IgnoreFuncBodies bool
- AllowBinary bool
- WithTestFiles bool
- Cursor *FileCursor
- Pkg *types.Package
- XPkg *types.Package
- Info *types.Info
- XInfo *types.Info
- Files map[string]*ast.File
- XTestFiles map[string]*ast.File
-}
-
-func NewPkgWalker(context *build.Context) *PkgWalker {
- return &PkgWalker{
- context: context,
- fset: token.NewFileSet(),
- parsedFileCache: map[string]*ast.File{},
- importingName: map[string]bool{},
- imported: map[string]*types.Package{"unsafe": types.Unsafe},
- gcimported: importer.Default(),
- }
-}
-
-type PkgWalker struct {
- fset *token.FileSet
- context *build.Context
- current *types.Package
- importingName map[string]bool
- parsedFileCache map[string]*ast.File
- imported map[string]*types.Package // packages already imported
- gcimported types.Importer
- cursor *FileCursor
- //importing types.Package
-}
-
-func contains(list []string, s string) bool {
- for _, t := range list {
- if t == s {
- return true
- }
- }
- return false
-}
-
-func (w *PkgWalker) isBinaryPkg(pkg string) bool {
- return stdlib.IsStdPkg(pkg)
-}
-
-func (w *PkgWalker) importPath(path string, mode build.ImportMode) (*build.Package, error) {
- if filepath.IsAbs(path) {
- return w.context.ImportDir(path, 0)
- }
- if stdlib.IsStdPkg(path) {
- return stdlib.ImportStdPkg(w.context, path, mode)
- }
- return w.context.Import(path, "", mode)
-}
-
-func (w *PkgWalker) Import(parentDir string, name string, conf *PkgConfig) (pkg *types.Package, err error) {
- defer func() {
- err := recover()
- if err != nil && typesVerbose {
- log.Println(err)
- }
- }()
-
- if parentDir != "" {
- if strings.HasPrefix(name, ".") {
- name = filepath.Join(parentDir, name)
- } else if pkgutil.IsVendorExperiment() {
- parentPkg := pkgutil.ImportDir(parentDir)
- name = pkgutil.VendoredImportPath(parentPkg, name)
- }
- }
-
- pkg = w.imported[name]
- if pkg != nil {
- // if pkg == &w.importing {
- // return nil, fmt.Errorf("cycle importing package %q", name)
- // }
- return pkg, nil
- }
-
- if typesVerbose {
- log.Println("parser pkg", parentDir, name)
- }
-
- bp, err := w.importPath(name, 0)
- if err != nil {
- return nil, err
- }
-
- checkName := name
-
- if bp.ImportPath == "." {
- checkName = bp.Name
- } else {
- checkName = bp.ImportPath
- }
-
- if w.importingName[checkName] {
- return nil, fmt.Errorf("cycle importing package %q", name)
- }
-
- w.importingName[checkName] = true
-
- // if err != nil {
- // return nil, err
- // //if _, nogo := err.(*build.NoGoError); nogo {
- // // return
- // //}
- // //return
- // //log.Fatalf("pkg %q, dir %q: ScanDir: %v", name, info.Dir, err)
- // }
-
- GoFiles := append(append([]string{}, bp.GoFiles...), bp.CgoFiles...)
- XTestFiles := append([]string{}, bp.XTestGoFiles...)
-
- if conf.WithTestFiles {
- GoFiles = append(GoFiles, bp.TestGoFiles...)
- }
-
- if name == "runtime" {
- n := fmt.Sprintf("zgoos_%s.go", w.context.GOOS)
- if !contains(GoFiles, n) {
- GoFiles = append(GoFiles, n)
- }
-
- n = fmt.Sprintf("zgoarch_%s.go", w.context.GOARCH)
- if !contains(GoFiles, n) {
- GoFiles = append(GoFiles, n)
- }
- }
-
- if conf.Cursor != nil && conf.Cursor.fileName != "" {
- cursor := conf.Cursor
- f, _ := w.parseFileEx(bp.Dir, cursor.fileName, cursor.src, true)
- if f != nil {
- cursor.pos = token.Pos(w.fset.File(f.Pos()).Base()) + token.Pos(cursor.cursorPos)
- cursor.fileDir = bp.Dir
- isTest := strings.HasSuffix(cursor.fileName, "_test.go")
- isXTest := false
- if isTest && strings.HasSuffix(f.Name.Name, "_test") {
- isXTest = true
- }
- cursor.xtest = isXTest
- checkAppend := func(filenames []string, file string) []string {
- for _, f := range filenames {
- if f == file {
- return filenames
- }
- }
- return append(filenames, file)
- }
- if isXTest {
- XTestFiles = checkAppend(XTestFiles, cursor.fileName)
- } else {
- GoFiles = checkAppend(GoFiles, cursor.fileName)
- }
- }
- }
-
- parserFiles := func(filenames []string, cursor *FileCursor, xtest bool) (files []*ast.File, fileMap map[string]*ast.File) {
- fileMap = make(map[string]*ast.File)
- for _, file := range filenames {
- var f *ast.File
- if cursor != nil && cursor.fileName == file {
- f, err = w.parseFile(bp.Dir, file, cursor.src)
- cursor.pos = token.Pos(w.fset.File(f.Pos()).Base()) + token.Pos(cursor.cursorPos)
- cursor.fileDir = bp.Dir
- cursor.xtest = xtest
- } else {
- f, err = w.parseFile(bp.Dir, file, nil)
- }
- if err != nil && typesVerbose {
- log.Printf("error parsing package %s: %s\n", name, err)
- }
- files = append(files, f)
- fileMap[file] = f
- }
- return
- }
- var files []*ast.File
- var xfiles []*ast.File
- files, conf.Files = parserFiles(GoFiles, conf.Cursor, false)
- xfiles, conf.XTestFiles = parserFiles(bp.XTestGoFiles, conf.Cursor, true)
-
- typesConf := types.Config{
- IgnoreFuncBodies: conf.IgnoreFuncBodies,
- FakeImportC: true,
- Importer: &Importer{w, conf, bp.Dir},
- Error: func(err error) {
- if typesVerbose {
- log.Println(err)
- }
- },
- }
- if pkg == nil {
- pkg, err = typesConf.Check(checkName, w.fset, files, conf.Info)
- conf.Pkg = pkg
- }
- w.importingName[checkName] = false
- w.imported[name] = pkg
-
- if len(xfiles) > 0 {
- xpkg, _ := typesConf.Check(checkName+"_test", w.fset, xfiles, conf.XInfo)
- w.imported[checkName+"_test"] = xpkg
- conf.XPkg = xpkg
- }
- return
-}
-
-type Importer struct {
- w *PkgWalker
- conf *PkgConfig
- dir string
-}
-
-func (im *Importer) Import(name string) (pkg *types.Package, err error) {
- if im.conf.AllowBinary && im.w.isBinaryPkg(name) {
- pkg, err = im.w.gcimported.Import(name)
- if pkg != nil && pkg.Complete() {
- return
- }
- // pkg = im.w.gcimporter[name]
- // if pkg != nil && pkg.Complete() {
- // return
- // }
- // pkg, err = importer.Default().Import(name)
- // if pkg != nil && pkg.Complete() {
- // im.w.gcimporter[name] = pkg
- // return
- // }
- }
- return im.w.Import(im.dir, name, &PkgConfig{IgnoreFuncBodies: true, AllowBinary: true, WithTestFiles: false})
-}
-
-func (w *PkgWalker) parseFile(dir, file string, src interface{}) (*ast.File, error) {
- return w.parseFileEx(dir, file, src, typesFindDoc)
-}
-
-func (w *PkgWalker) parseFileEx(dir, file string, src interface{}, findDoc bool) (*ast.File, error) {
- filename := filepath.Join(dir, file)
- f, _ := w.parsedFileCache[filename]
- if f != nil {
- return f, nil
- }
-
- var err error
-
- // generate missing context-dependent files.
- if w.context != nil && file == fmt.Sprintf("zgoos_%s.go", w.context.GOOS) {
- src := fmt.Sprintf("package runtime; const theGoos = `%s`", w.context.GOOS)
- f, err = parser.ParseFile(w.fset, filename, src, 0)
- if err != nil {
- log.Fatalf("incorrect generated file: %s", err)
- }
- }
-
- if w.context != nil && file == fmt.Sprintf("zgoarch_%s.go", w.context.GOARCH) {
- src := fmt.Sprintf("package runtime; const theGoarch = `%s`", w.context.GOARCH)
- f, err = parser.ParseFile(w.fset, filename, src, 0)
- if err != nil {
- log.Fatalf("incorrect generated file: %s", err)
- }
- }
-
- if f == nil {
- flag := parser.AllErrors
- if findDoc {
- flag |= parser.ParseComments
- }
- f, err = parser.ParseFile(w.fset, filename, src, flag)
- if err != nil {
- return f, err
- }
- }
-
- w.parsedFileCache[filename] = f
- return f, nil
-}
-
-func (w *PkgWalker) LookupCursor(pkg *types.Package, conf *PkgConfig, cursor *FileCursor) {
- if nm := w.CheckIsName(cursor); nm != nil {
- w.LookupName(pkg, conf, cursor, nm)
- } else if is := w.CheckIsImport(cursor); is != nil {
- if cursor.xtest {
- w.LookupImport(conf.XPkg, conf.XInfo, cursor, is)
- } else {
- w.LookupImport(conf.Pkg, conf.Info, cursor, is)
- }
- } else {
- w.LookupObjects(conf, cursor)
- }
-}
-
-func (w *PkgWalker) LookupName(pkg *types.Package, conf *PkgConfig, cursor *FileCursor, nm *ast.Ident) {
- if typesFindDef {
- fmt.Println(w.fset.Position(nm.Pos()))
- }
- if typesFindInfo {
- if cursor.xtest {
- fmt.Printf("package %s (%q)\n", pkg.Name()+"_test", pkg.Path())
- } else {
- if pkg.Path() == pkg.Name() {
- fmt.Printf("package %s\n", pkg.Name())
- } else {
- fmt.Printf("package %s (%q)\n", pkg.Name(), pkg.Path())
- }
- }
- }
-
- if !typesFindUse {
- return
- }
- var usages []int
- findUsage := func(fileMap map[string]*ast.File) {
- for _, f := range fileMap {
- if f != nil && f.Name != nil && f.Name.Name == nm.Name {
- usages = append(usages, int(f.Name.Pos()))
- }
- }
- }
- if cursor.xtest {
- findUsage(conf.XTestFiles)
- } else {
- findUsage(conf.Files)
- }
- (sort.IntSlice(usages)).Sort()
- for _, pos := range usages {
- fmt.Println(w.fset.Position(token.Pos(pos)))
- }
-}
-
-func (w *PkgWalker) LookupImport(pkg *types.Package, pkgInfo *types.Info, cursor *FileCursor, is *ast.ImportSpec) {
- fpath, err := strconv.Unquote(is.Path.Value)
- if err != nil {
- return
- }
-
- if typesFindDef {
- fmt.Println(w.fset.Position(is.Pos()))
- }
-
- fbase := fpath
- pos := strings.LastIndexAny(fpath, "./-\\")
- if pos != -1 {
- fbase = fpath[pos+1:]
- }
-
- var fname string
- if is.Name != nil {
- fname = is.Name.Name
- } else {
- fname = fbase
- }
-
- if typesFindInfo {
- if fname == fpath {
- fmt.Printf("package %s\n", fname)
- } else {
- fmt.Printf("package %s (%q)\n", fname, fpath)
- }
- }
-
- if !typesFindUse {
- return
- }
-
- fid := pkg.Path() + "." + fname
-
- var usages []int
- for id, obj := range pkgInfo.Uses {
- if obj != nil && obj.Id() == fid { //!= nil && cursorObj.Pos() == obj.Pos() {
- if _, ok := obj.(*types.PkgName); ok {
- usages = append(usages, int(id.Pos()))
- }
- }
- }
- (sort.IntSlice(usages)).Sort()
- for _, pos := range usages {
- fmt.Println(w.fset.Position(token.Pos(pos)))
- }
-}
-
-func testObjKind(obj types.Object, kind ObjKind) bool {
- k, err := parserObjKind(obj)
- if err != nil {
- return false
- }
- return k == kind
-}
-
-func parserObjKind(obj types.Object) (ObjKind, error) {
- var kind ObjKind
- switch t := obj.(type) {
- case *types.PkgName:
- kind = ObjPkgName
- case *types.Const:
- kind = ObjConst
- case *types.TypeName:
- kind = ObjTypeName
- switch t.Type().Underlying().(type) {
- case *types.Interface:
- kind = ObjInterface
- case *types.Struct:
- kind = ObjStruct
- }
- case *types.Var:
- kind = ObjVar
- if t.IsField() {
- kind = ObjField
- }
- case *types.Func:
- kind = ObjFunc
- if sig, ok := t.Type().(*types.Signature); ok {
- if sig.Recv() != nil {
- kind = ObjMethod
- }
- }
- case *types.Label:
- kind = ObjLabel
- case *types.Builtin:
- kind = ObjBuiltin
- case *types.Nil:
- kind = ObjNil
- default:
- return ObjNone, fmt.Errorf("unknown obj type %T", obj)
- }
- return kind, nil
-}
-
-func (w *PkgWalker) LookupStructFromField(info *types.Info, cursorPkg *types.Package, cursorObj types.Object, cursorPos token.Pos) types.Object {
- if info == nil {
- conf := &PkgConfig{
- IgnoreFuncBodies: true,
- AllowBinary: true,
- WithTestFiles: true,
- Info: &types.Info{
- Defs: make(map[*ast.Ident]types.Object),
- },
- }
- w.imported[cursorPkg.Path()] = nil
- pkg, _ := w.Import("", cursorPkg.Path(), conf)
- if pkg != nil {
- info = conf.Info
- }
- }
- for _, obj := range info.Defs {
- if obj == nil {
- continue
- }
- if _, ok := obj.(*types.TypeName); ok {
- if t, ok := obj.Type().Underlying().(*types.Struct); ok {
- for i := 0; i < t.NumFields(); i++ {
- if t.Field(i).Pos() == cursorPos {
- return obj
- }
- }
- }
- }
- }
- return nil
-}
-
-func (w *PkgWalker) lookupNamedField(named *types.Named, name string) *types.Named {
- if istruct, ok := named.Underlying().(*types.Struct); ok {
- for i := 0; i < istruct.NumFields(); i++ {
- field := istruct.Field(i)
- if field.Anonymous() {
- fieldType := orgType(field.Type())
- if typ, ok := fieldType.(*types.Named); ok {
- if na := w.lookupNamedField(typ, name); na != nil {
- return na
- }
- }
- } else {
- if field.Name() == name {
- return named
- }
- }
- }
- }
- return nil
-}
-
-func (w *PkgWalker) lookupNamedMethod(named *types.Named, name string) (types.Object, *types.Named) {
- if iface, ok := named.Underlying().(*types.Interface); ok {
- for i := 0; i < iface.NumMethods(); i++ {
- fn := iface.Method(i)
- if fn.Name() == name {
- return fn, named
- }
- }
- for i := 0; i < iface.NumEmbeddeds(); i++ {
- if obj, na := w.lookupNamedMethod(iface.Embedded(i), name); obj != nil {
- return obj, na
- }
- }
- return nil, nil
- }
- if istruct, ok := named.Underlying().(*types.Struct); ok {
- for i := 0; i < named.NumMethods(); i++ {
- fn := named.Method(i)
- if fn.Name() == name {
- return fn, named
- }
- }
- for i := 0; i < istruct.NumFields(); i++ {
- field := istruct.Field(i)
- if !field.Anonymous() {
- continue
- }
- if typ, ok := field.Type().(*types.Named); ok {
- if obj, na := w.lookupNamedMethod(typ, name); obj != nil {
- return obj, na
- }
- }
- }
- }
- return nil, nil
-}
-
-func IsSamePkg(a, b *types.Package) bool {
- if a == b {
- return true
- }
- if a == nil || b == nil {
- return false
- }
- return a.Path() == b.Path()
-}
-
-func IsSameObject(a, b types.Object) bool {
- if a == b {
- return true
- }
- if a == nil || b == nil {
- return false
- }
- var apath string
- var bpath string
- if a.Pkg() != nil {
- apath = a.Pkg().Path()
- }
- if b.Pkg() != nil {
- bpath = b.Pkg().Path()
- }
- if apath != bpath {
- return false
- }
- if a.Id() != b.Id() {
- return false
- }
- if a.Type().String() != b.Type().String() {
- return false
- }
- t1, ok1 := a.(*types.TypeName)
- t2, ok2 := b.(*types.TypeName)
- if ok1 && ok2 {
- return t1.Type().String() == t2.Type().String()
- }
- return a.String() == b.String()
-}
-
-func orgType(typ types.Type) types.Type {
- if pt, ok := typ.(*types.Pointer); ok {
- return pt.Elem()
- }
- return typ
-}
-
-func (w *PkgWalker) LookupObjects(conf *PkgConfig, cursor *FileCursor) {
- var cursorObj types.Object
- var cursorSelection *types.Selection
- var cursorObjIsDef bool
- //lookup defs
-
- var pkg *types.Package
- var pkgInfo *types.Info
- if cursor.xtest {
- pkgInfo = conf.XInfo
- pkg = conf.XPkg
- } else {
- pkgInfo = conf.Info
- pkg = conf.Pkg
- }
-
- _ = cursorObjIsDef
- if cursorObj == nil {
- for sel, obj := range pkgInfo.Selections {
- if cursor.pos >= sel.Sel.Pos() && cursor.pos <= sel.Sel.End() {
- cursorObj = obj.Obj()
- cursorSelection = obj
- break
- }
- }
- }
- var cursorId *ast.Ident
- if cursorObj == nil {
- for id, obj := range pkgInfo.Defs {
- if cursor.pos >= id.Pos() && cursor.pos <= id.End() {
- cursorObj = obj
- cursorId = id
- cursorObjIsDef = true
- break
- }
- }
- }
- _ = cursorSelection
- if cursorObj == nil {
- for id, obj := range pkgInfo.Uses {
- if cursor.pos >= id.Pos() && cursor.pos <= id.End() {
- cursorObj = obj
- break
- }
- }
- }
-
- var kind ObjKind
- if cursorObj != nil {
- var err error
- kind, err = parserObjKind(cursorObj)
- if err != nil {
- log.Fatalln(err)
- }
- } else if cursorId != nil {
- kind = ObjImplicit
- } else {
- return
- }
-
- if kind == ObjField {
- if cursorObj.(*types.Var).Anonymous() {
- typ := orgType(cursorObj.Type())
- if named, ok := typ.(*types.Named); ok {
- cursorObj = named.Obj()
- }
- }
- }
-
- var cursorPkg *types.Package
- var cursorPos token.Pos
-
- if cursorObj != nil {
- cursorPkg = cursorObj.Pkg()
- cursorPos = cursorObj.Pos()
- } else {
- cursorPkg = pkg
- cursorPos = cursorId.Pos()
- }
-
- //var fieldTypeInfo *types.Info
- var fieldTypeObj types.Object
- // if cursorPkg == pkg {
- // fieldTypeInfo = pkgInfo
- // }
- cursorIsInterfaceMethod := false
- var cursorInterfaceTypeName string
- var cursorInterfaceTypeNamed *types.Named
-
- if kind == ObjMethod && cursorSelection != nil && cursorSelection.Recv() != nil {
- sig := cursorObj.(*types.Func).Type().Underlying().(*types.Signature)
- if _, ok := sig.Recv().Type().Underlying().(*types.Interface); ok {
- if named, ok := cursorSelection.Recv().(*types.Named); ok {
- obj, typ := w.lookupNamedMethod(named, cursorObj.Name())
- if obj != nil {
- cursorObj = obj
- }
- if typ != nil {
- cursorPkg = typ.Obj().Pkg()
- cursorInterfaceTypeName = typ.Obj().Name()
- }
- cursorIsInterfaceMethod = true
- cursorInterfaceTypeNamed = named
- }
- }
- } else if kind == ObjField && cursorSelection != nil {
- if recv := cursorSelection.Recv(); recv != nil {
- typ := orgType(recv)
- if typ != nil {
- if name, ok := typ.(*types.Named); ok {
- fieldTypeObj = name.Obj()
- na := w.lookupNamedField(name, cursorObj.Name())
- if na != nil {
- fieldTypeObj = na.Obj()
- }
- }
- }
- }
- }
- if typesVerbose {
- log.Println("parser", cursorObj, kind, cursorIsInterfaceMethod)
- }
- if cursorPkg != nil && cursorPkg != pkg &&
- kind != ObjPkgName && w.isBinaryPkg(cursorPkg.Path()) {
- conf := &PkgConfig{
- IgnoreFuncBodies: true,
- AllowBinary: true,
- WithTestFiles: true,
- Info: &types.Info{
- Defs: make(map[*ast.Ident]types.Object),
- },
- }
- pkg, _ := w.Import("", cursorPkg.Path(), conf)
- if pkg != nil {
- if cursorIsInterfaceMethod {
- for k, v := range conf.Info.Defs {
- if k != nil && v != nil && IsSameObject(v, cursorInterfaceTypeNamed.Obj()) {
- named := v.Type().(*types.Named)
- obj, typ := w.lookupNamedMethod(named, cursorObj.Name())
- if obj != nil {
- cursorObj = obj
- cursorPos = obj.Pos()
- }
- if obj != nil {
- cursorObj = obj
- }
- if typ != nil {
- cursorPkg = typ.Obj().Pkg()
- cursorInterfaceTypeName = typ.Obj().Name()
- }
- break
- }
- }
- // for _, obj := range conf.Info.Defs {
- // if obj == nil {
- // continue
- // }
- // if fn, ok := obj.(*types.Func); ok {
- // if fn.Name() == cursorObj.Name() {
- // if sig, ok := fn.Type().Underlying().(*types.Signature); ok {
- // if named, ok := sig.Recv().Type().(*types.Named); ok {
- // if named.Obj() != nil && named.Obj().Name() == cursorInterfaceTypeName {
- // cursorPos = obj.Pos()
- // break
- // }
- // }
- // }
- // }
- // }
- // }
- } else if kind == ObjField && fieldTypeObj != nil {
- for _, obj := range conf.Info.Defs {
- if obj == nil {
- continue
- }
- if _, ok := obj.(*types.TypeName); ok {
- if IsSameObject(fieldTypeObj, obj) {
- if t, ok := obj.Type().Underlying().(*types.Struct); ok {
- for i := 0; i < t.NumFields(); i++ {
- if t.Field(i).Id() == cursorObj.Id() {
- cursorPos = t.Field(i).Pos()
- break
- }
- }
- }
- break
- }
- }
- }
- } else {
- for k, v := range conf.Info.Defs {
- if k != nil && v != nil && IsSameObject(v, cursorObj) {
- cursorPos = k.Pos()
- break
- }
- }
- }
- }
- // if kind == ObjField || cursorIsInterfaceMethod {
- // fieldTypeInfo = conf.Info
- // }
- }
- // if kind == ObjField {
- // fieldTypeObj = w.LookupStructFromField(fieldTypeInfo, cursorPkg, cursorObj, cursorPos)
- // }
- if typesFindDef {
- fmt.Println(w.fset.Position(cursorPos))
- }
- if typesFindInfo {
- /*if kind == ObjField && fieldTypeObj != nil {
- typeName := fieldTypeObj.Name()
- if fieldTypeObj.Pkg() != nil && fieldTypeObj.Pkg() != pkg {
- typeName = fieldTypeObj.Pkg().Name() + "." + fieldTypeObj.Name()
- }
- fmt.Println(typeName, simpleObjInfo(cursorObj))
- } else */
- if kind == ObjBuiltin {
- fmt.Println(builtinInfo(cursorObj.Name()))
- } else if kind == ObjPkgName {
- fmt.Println(cursorObj.String())
- } else if kind == ObjImplicit {
- fmt.Printf("%s is implicit\n", cursorId.Name)
- } else if cursorIsInterfaceMethod {
- fmt.Println(strings.Replace(simpleObjInfo(cursorObj), "(interface)", cursorPkg.Name()+"."+cursorInterfaceTypeName, 1))
- } else {
- fmt.Println(simpleObjInfo(cursorObj))
- }
- }
-
- if typesFindDoc && typesFindDef {
- pos := w.fset.Position(cursorPos)
- file := w.parsedFileCache[pos.Filename]
- if file != nil {
- line := pos.Line
- var group *ast.CommentGroup
- for _, v := range file.Comments {
- lastLine := w.fset.Position(v.End()).Line
- if lastLine == line || lastLine == line-1 {
- group = v
- } else if lastLine > line {
- break
- }
- }
- if group != nil {
- fmt.Println(group.Text())
- }
- }
- }
- if !typesFindUse {
- return
- }
-
- var usages []int
- if kind == ObjPkgName {
- for id, obj := range pkgInfo.Uses {
- if obj != nil && obj.Id() == cursorObj.Id() { //!= nil && cursorObj.Pos() == obj.Pos() {
- if _, ok := obj.(*types.PkgName); ok {
- usages = append(usages, int(id.Pos()))
- }
- }
- }
- } else {
- // for id, obj := range pkgInfo.Defs {
- // if obj == cursorObj { //!= nil && cursorObj.Pos() == obj.Pos() {
- // usages = append(usages, int(id.Pos()))
- // }
- // }
- if cursorObj != nil {
- for id, obj := range pkgInfo.Uses {
- if obj == cursorObj { //!= nil && cursorObj.Pos() == obj.Pos() {
- usages = append(usages, int(id.Pos()))
- }
- }
- } else {
- for id, obj := range pkgInfo.Uses {
- if obj != nil && obj.Pos() == cursorPos { //!= nil && cursorObj.Pos() == obj.Pos() {
- usages = append(usages, int(id.Pos()))
- }
- }
- }
- }
- var pkg_path string
- var xpkg_path string
- if conf.Pkg != nil {
- pkg_path = conf.Pkg.Path()
- }
- if conf.XPkg != nil {
- xpkg_path = conf.XPkg.Path()
- }
-
- if cursorPkg != nil &&
- (cursorPkg.Path() == pkg_path || cursorPkg.Path() == xpkg_path) &&
- kind != ObjPkgName {
- usages = append(usages, int(cursorPos))
- }
-
- (sort.IntSlice(usages)).Sort()
- for _, pos := range usages {
- fmt.Println(w.fset.Position(token.Pos(pos)))
- }
- //check look for current pkg.object on pkg_test
- if typesFindUseAll || IsSamePkg(cursorPkg, conf.Pkg) {
- var addInfo *types.Info
- if conf.Cursor.xtest {
- addInfo = conf.Info
- } else {
- addInfo = conf.XInfo
- }
- if addInfo != nil && cursorPkg != nil {
- var usages []int
- // for id, obj := range addInfo.Defs {
- // if id != nil && obj != nil && obj.Id() == cursorObj.Id() {
- // usages = append(usages, int(id.Pos()))
- // }
- // }
- for k, v := range addInfo.Uses {
- if k != nil && v != nil && IsSameObject(v, cursorObj) {
- usages = append(usages, int(k.Pos()))
- }
- }
- (sort.IntSlice(usages)).Sort()
- for _, pos := range usages {
- fmt.Println(w.fset.Position(token.Pos(pos)))
- }
- }
- }
- if !typesFindUseAll {
- return
- }
-
- if cursorPkg == nil {
- return
- }
-
- var find_def_pkg string
- var uses_paths []string
- if cursorPkg.Path() != pkg_path && cursorPkg.Path() != xpkg_path {
- find_def_pkg = cursorPkg.Path()
- uses_paths = append(uses_paths, cursorPkg.Path())
- }
-
- cursorPkgPath := cursorObj.Pkg().Path()
- if pkgutil.IsVendorExperiment() {
- cursorPkgPath = pkgutil.VendorPathToImportPath(cursorPkgPath)
- }
-
- buildutil.ForEachPackage(w.context, func(importPath string, err error) {
- if err != nil {
- return
- }
- if importPath == conf.Pkg.Path() {
- return
- }
- bp, err := w.importPath(importPath, 0)
- if err != nil {
- return
- }
- find := false
- if bp.ImportPath == cursorPkg.Path() {
- find = true
- } else {
- for _, v := range bp.Imports {
- if v == cursorPkgPath {
- find = true
- break
- }
- }
- }
- if find {
- for _, v := range uses_paths {
- if v == bp.ImportPath {
- return
- }
- }
- uses_paths = append(uses_paths, bp.ImportPath)
- }
- })
-
- w.imported = make(map[string]*types.Package)
- for _, v := range uses_paths {
- conf := &PkgConfig{
- IgnoreFuncBodies: false,
- AllowBinary: true,
- WithTestFiles: true,
- Info: &types.Info{
- Uses: make(map[*ast.Ident]types.Object),
- },
- XInfo: &types.Info{
- Uses: make(map[*ast.Ident]types.Object),
- },
- }
- w.imported[v] = nil
- var usages []int
- vpkg, _ := w.Import("", v, conf)
- if vpkg != nil && vpkg != pkg {
- if conf.Info != nil {
- for k, v := range conf.Info.Uses {
- if k != nil && v != nil && IsSameObject(v, cursorObj) {
- usages = append(usages, int(k.Pos()))
- }
- }
- }
- if conf.XInfo != nil {
- for k, v := range conf.XInfo.Uses {
- if k != nil && v != nil && IsSameObject(v, cursorObj) {
- usages = append(usages, int(k.Pos()))
- }
- }
- }
- }
- if v == find_def_pkg {
- usages = append(usages, int(cursorPos))
- }
- (sort.IntSlice(usages)).Sort()
- for _, pos := range usages {
- fmt.Println(w.fset.Position(token.Pos(pos)))
- }
- }
-}
-
-func (w *PkgWalker) CheckIsName(cursor *FileCursor) *ast.Ident {
- if cursor.fileDir == "" {
- return nil
- }
- file, _ := w.parseFile(cursor.fileDir, cursor.fileName, cursor.src)
- if file == nil {
- return nil
- }
- if inRange(file.Name, cursor.pos) {
- return file.Name
- }
- return nil
-}
-
-func (w *PkgWalker) CheckIsImport(cursor *FileCursor) *ast.ImportSpec {
- if cursor.fileDir == "" {
- return nil
- }
- file, _ := w.parseFile(cursor.fileDir, cursor.fileName, cursor.src)
- if file == nil {
- return nil
- }
- for _, is := range file.Imports {
- if inRange(is, cursor.pos) {
- return is
- }
- }
- return nil
-}
-
-func inRange(node ast.Node, p token.Pos) bool {
- if node == nil {
- return false
- }
- return p >= node.Pos() && p <= node.End()
-}
-
-func (w *PkgWalker) nodeString(node interface{}) string {
- if node == nil {
- return ""
- }
- var b bytes.Buffer
- printer.Fprint(&b, w.fset, node)
- return b.String()
-}
diff --git a/vendor/golang.org/x/text/LICENSE b/vendor/golang.org/x/text/LICENSE
deleted file mode 100644
index 6a66aea..0000000
--- a/vendor/golang.org/x/text/LICENSE
+++ /dev/null
@@ -1,27 +0,0 @@
-Copyright (c) 2009 The Go Authors. All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are
-met:
-
- * Redistributions of source code must retain the above copyright
-notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
-copyright notice, this list of conditions and the following disclaimer
-in the documentation and/or other materials provided with the
-distribution.
- * Neither the name of Google Inc. nor the names of its
-contributors may be used to endorse or promote products derived from
-this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/vendor/golang.org/x/text/PATENTS b/vendor/golang.org/x/text/PATENTS
deleted file mode 100644
index 7330990..0000000
--- a/vendor/golang.org/x/text/PATENTS
+++ /dev/null
@@ -1,22 +0,0 @@
-Additional IP Rights Grant (Patents)
-
-"This implementation" means the copyrightable works distributed by
-Google as part of the Go project.
-
-Google 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,
-transfer and otherwise run, modify and propagate the contents of this
-implementation of Go, where such license applies only to those patent
-claims, both currently owned or controlled by Google and acquired in
-the future, licensable by Google that are necessarily infringed by this
-implementation of Go. This grant does not include claims that would be
-infringed only as a consequence of further modification of this
-implementation. If you or your agent or exclusive licensee institute or
-order or agree to the institution of patent litigation against any
-entity (including a cross-claim or counterclaim in a lawsuit) alleging
-that this implementation of Go or any code incorporated within this
-implementation of Go constitutes direct or contributory patent
-infringement, or inducement of patent infringement, then any patent
-rights granted to you under this License for this implementation of Go
-shall terminate as of the date such litigation is filed.
diff --git a/vendor/golang.org/x/text/encoding/encoding.go b/vendor/golang.org/x/text/encoding/encoding.go
deleted file mode 100644
index 4ede52e..0000000
--- a/vendor/golang.org/x/text/encoding/encoding.go
+++ /dev/null
@@ -1,179 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Package encoding defines an interface for character encodings, such as Shift
-// JIS and Windows 1252, that can convert to and from UTF-8.
-//
-// To convert the bytes of an io.Reader r from the encoding e to UTF-8:
-// rInUTF8 := transform.NewReader(r, e.NewDecoder())
-// and to convert from UTF-8 to the encoding e:
-// wInUTF8 := transform.NewWriter(w, e.NewEncoder())
-// In both cases, import "golang.org/x/text/transform".
-//
-// Encoding implementations are provided in other packages, such as
-// golang.org/x/text/encoding/charmap and
-// golang.org/x/text/encoding/japanese.
-package encoding // import "golang.org/x/text/encoding"
-
-import (
- "errors"
- "unicode/utf8"
-
- "golang.org/x/text/transform"
-)
-
-// Encoding is a character set encoding that can be transformed to and from
-// UTF-8.
-type Encoding interface {
- // NewDecoder returns a transformer that converts to UTF-8.
- //
- // Transforming source bytes that are not of that encoding will not
- // result in an error per se. Each byte that cannot be transcoded will
- // be represented in the output by the UTF-8 encoding of '\uFFFD', the
- // replacement rune.
- NewDecoder() transform.Transformer
-
- // NewEncoder returns a transformer that converts from UTF-8.
- //
- // Transforming source bytes that are not valid UTF-8 will not result in
- // an error per se. Each rune that cannot be transcoded will be
- // represented in the output by an encoding-specific replacement such as
- // "\x1a" (the ASCII substitute character) or "\xff\xfd". To return
- // early with error instead, use transform.Chain to preprocess the data
- // with a UTF8Validator.
- NewEncoder() transform.Transformer
-}
-
-// ASCIISub is the ASCII substitute character, as recommended by
-// http://unicode.org/reports/tr36/#Text_Comparison
-const ASCIISub = '\x1a'
-
-// Nop is the nop encoding. Its transformed bytes are the same as the source
-// bytes; it does not replace invalid UTF-8 sequences.
-var Nop Encoding = nop{}
-
-type nop struct{}
-
-func (nop) NewDecoder() transform.Transformer {
- return transform.Nop
-}
-
-func (nop) NewEncoder() transform.Transformer {
- return transform.Nop
-}
-
-// Replacement is the replacement encoding. Decoding from the replacement
-// encoding yields a single '\uFFFD' replacement rune. Encoding from UTF-8 to
-// the replacement encoding yields the same as the source bytes except that
-// invalid UTF-8 is converted to '\uFFFD'.
-//
-// It is defined at http://encoding.spec.whatwg.org/#replacement
-var Replacement Encoding = replacement{}
-
-type replacement struct{}
-
-func (replacement) NewDecoder() transform.Transformer {
- return replacementDecoder{}
-}
-
-func (replacement) NewEncoder() transform.Transformer {
- return replacementEncoder{}
-}
-
-type replacementDecoder struct{ transform.NopResetter }
-
-func (replacementDecoder) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) {
- if len(dst) < 3 {
- return 0, 0, transform.ErrShortDst
- }
- if atEOF {
- const fffd = "\ufffd"
- dst[0] = fffd[0]
- dst[1] = fffd[1]
- dst[2] = fffd[2]
- nDst = 3
- }
- return nDst, len(src), nil
-}
-
-type replacementEncoder struct{ transform.NopResetter }
-
-func (replacementEncoder) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) {
- r, size := rune(0), 0
-
- for ; nSrc < len(src); nSrc += size {
- r = rune(src[nSrc])
-
- // Decode a 1-byte rune.
- if r < utf8.RuneSelf {
- size = 1
-
- } else {
- // Decode a multi-byte rune.
- r, size = utf8.DecodeRune(src[nSrc:])
- if size == 1 {
- // All valid runes of size 1 (those below utf8.RuneSelf) were
- // handled above. We have invalid UTF-8 or we haven't seen the
- // full character yet.
- if !atEOF && !utf8.FullRune(src[nSrc:]) {
- err = transform.ErrShortSrc
- break
- }
- r = '\ufffd'
- }
- }
-
- if nDst+utf8.RuneLen(r) > len(dst) {
- err = transform.ErrShortDst
- break
- }
- nDst += utf8.EncodeRune(dst[nDst:], r)
- }
- return nDst, nSrc, err
-}
-
-// ErrInvalidUTF8 means that a transformer encountered invalid UTF-8.
-var ErrInvalidUTF8 = errors.New("encoding: invalid UTF-8")
-
-// UTF8Validator is a transformer that returns ErrInvalidUTF8 on the first
-// input byte that is not valid UTF-8.
-var UTF8Validator transform.Transformer = utf8Validator{}
-
-type utf8Validator struct{ transform.NopResetter }
-
-func (utf8Validator) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) {
- n := len(src)
- if n > len(dst) {
- n = len(dst)
- }
- for i := 0; i < n; {
- if c := src[i]; c < utf8.RuneSelf {
- dst[i] = c
- i++
- continue
- }
- _, size := utf8.DecodeRune(src[i:])
- if size == 1 {
- // All valid runes of size 1 (those below utf8.RuneSelf) were
- // handled above. We have invalid UTF-8 or we haven't seen the
- // full character yet.
- err = ErrInvalidUTF8
- if !atEOF && !utf8.FullRune(src[i:]) {
- err = transform.ErrShortSrc
- }
- return i, i, err
- }
- if i+size > len(dst) {
- return i, i, transform.ErrShortDst
- }
- for ; size > 0; size-- {
- dst[i] = src[i]
- i++
- }
- }
- if len(src) > len(dst) {
- err = transform.ErrShortDst
- }
- return n, n, err
-}
diff --git a/vendor/golang.org/x/text/encoding/internal/identifier/gen.go b/vendor/golang.org/x/text/encoding/internal/identifier/gen.go
deleted file mode 100644
index 0c8eba7..0000000
--- a/vendor/golang.org/x/text/encoding/internal/identifier/gen.go
+++ /dev/null
@@ -1,137 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build ignore
-
-package main
-
-import (
- "bytes"
- "encoding/xml"
- "fmt"
- "io"
- "log"
- "strings"
-
- "golang.org/x/text/internal/gen"
-)
-
-type registry struct {
- XMLName xml.Name `xml:"registry"`
- Updated string `xml:"updated"`
- Registry []struct {
- ID string `xml:"id,attr"`
- Record []struct {
- Name string `xml:"name"`
- Xref []struct {
- Type string `xml:"type,attr"`
- Data string `xml:"data,attr"`
- } `xml:"xref"`
- Desc struct {
- Data string `xml:",innerxml"`
- // Any []struct {
- // Data string `xml:",chardata"`
- // } `xml:",any"`
- // Data string `xml:",chardata"`
- } `xml:"description,"`
- MIB string `xml:"value"`
- Alias []string `xml:"alias"`
- MIME string `xml:"preferred_alias"`
- } `xml:"record"`
- } `xml:"registry"`
-}
-
-func main() {
- r := gen.OpenIANAFile("assignments/character-sets/character-sets.xml")
- reg := ®istry{}
- if err := xml.NewDecoder(r).Decode(®); err != nil && err != io.EOF {
- log.Fatalf("Error decoding charset registry: %v", err)
- }
- if len(reg.Registry) == 0 || reg.Registry[0].ID != "character-sets-1" {
- log.Fatalf("Unexpected ID %s", reg.Registry[0].ID)
- }
-
- w := &bytes.Buffer{}
- fmt.Fprintf(w, "const (\n")
- for _, rec := range reg.Registry[0].Record {
- constName := ""
- for _, a := range rec.Alias {
- if strings.HasPrefix(a, "cs") && strings.IndexByte(a, '-') == -1 {
- // Some of the constant definitions have comments in them. Strip those.
- constName = strings.Title(strings.SplitN(a[2:], "\n", 2)[0])
- }
- }
- if constName == "" {
- switch rec.MIB {
- case "2085":
- constName = "HZGB2312" // Not listed as alias for some reason.
- default:
- log.Fatalf("No cs alias defined for %s.", rec.MIB)
- }
- }
- if rec.MIME != "" {
- rec.MIME = fmt.Sprintf(" (MIME: %s)", rec.MIME)
- }
- fmt.Fprintf(w, "// %s is the MIB identifier with IANA name %s%s.\n//\n", constName, rec.Name, rec.MIME)
- if len(rec.Desc.Data) > 0 {
- fmt.Fprint(w, "// ")
- d := xml.NewDecoder(strings.NewReader(rec.Desc.Data))
- inElem := true
- attr := ""
- for {
- t, err := d.Token()
- if err != nil {
- if err != io.EOF {
- log.Fatal(err)
- }
- break
- }
- switch x := t.(type) {
- case xml.CharData:
- attr = "" // Don't need attribute info.
- a := bytes.Split([]byte(x), []byte("\n"))
- for i, b := range a {
- if b = bytes.TrimSpace(b); len(b) != 0 {
- if !inElem && i > 0 {
- fmt.Fprint(w, "\n// ")
- }
- inElem = false
- fmt.Fprintf(w, "%s ", string(b))
- }
- }
- case xml.StartElement:
- if x.Name.Local == "xref" {
- inElem = true
- use := false
- for _, a := range x.Attr {
- if a.Name.Local == "type" {
- use = use || a.Value != "person"
- }
- if a.Name.Local == "data" && use {
- attr = a.Value + " "
- }
- }
- }
- case xml.EndElement:
- inElem = false
- fmt.Fprint(w, attr)
- }
- }
- fmt.Fprint(w, "\n")
- }
- for _, x := range rec.Xref {
- switch x.Type {
- case "rfc":
- fmt.Fprintf(w, "// Reference: %s\n", strings.ToUpper(x.Data))
- case "uri":
- fmt.Fprintf(w, "// Reference: %s\n", x.Data)
- }
- }
- fmt.Fprintf(w, "%s MIB = %s\n", constName, rec.MIB)
- fmt.Fprintln(w)
- }
- fmt.Fprintln(w, ")")
-
- gen.WriteGoFile("mib.go", "identifier", w.Bytes())
-}
diff --git a/vendor/golang.org/x/text/encoding/internal/identifier/identifier.go b/vendor/golang.org/x/text/encoding/internal/identifier/identifier.go
deleted file mode 100644
index cfb1354..0000000
--- a/vendor/golang.org/x/text/encoding/internal/identifier/identifier.go
+++ /dev/null
@@ -1,80 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-//go:generate go run gen.go
-
-// Package identifier defines the contract between implementations of Encoding
-// and Index by defining identifiers that uniquely identify standardized coded
-// character sets (CCS) and character encoding schemes (CES), which we will
-// together refer to as encodings, for which Encoding implementations provide
-// converters to and from UTF-8. This package is typically only of concern to
-// implementers of Indexes and Encodings.
-//
-// One part of the identifier is the MIB code, which is defined by IANA and
-// uniquely identifies a CCS or CES. Each code is associated with data that
-// references authorities, official documentation as well as aliases and MIME
-// names.
-//
-// Not all CESs are covered by the IANA registry. The "other" string that is
-// returned by ID can be used to identify other character sets or versions of
-// existing ones.
-//
-// It is recommended that each package that provides a set of Encodings provide
-// the All and Common variables to reference all supported encodings and
-// commonly used subset. This allows Index implementations to include all
-// available encodings without explicitly referencing or knowing about them.
-package identifier
-
-// Note: this package is internal, but could be made public if there is a need
-// for writing third-party Indexes and Encodings.
-
-// References:
-// - http://source.icu-project.org/repos/icu/icu/trunk/source/data/mappings/convrtrs.txt
-// - http://www.iana.org/assignments/character-sets/character-sets.xhtml
-// - http://www.iana.org/assignments/ianacharset-mib/ianacharset-mib
-// - http://www.ietf.org/rfc/rfc2978.txt
-// - http://www.unicode.org/reports/tr22/
-// - http://www.w3.org/TR/encoding/
-// - http://www.w3.org/TR/encoding/indexes/encodings.json
-// - https://encoding.spec.whatwg.org/
-// - https://tools.ietf.org/html/rfc6657#section-5
-
-// Interface can be implemented by Encodings to define the CCS or CES for which
-// it implements conversions.
-type Interface interface {
- // ID returns an encoding identifier. Exactly one of the mib and other
- // values should be non-zero.
- //
- // In the usual case it is only necessary to indicate the MIB code. The
- // other string can be used to specify encodings for which there is no MIB,
- // such as "x-mac-dingbat".
- //
- // The other string may only contain the characters a-z, A-Z, 0-9, - and _.
- ID() (mib MIB, other string)
-
- // NOTE: the restrictions on the encoding are to allow extending the syntax
- // with additional information such as versions, vendors and other variants.
-}
-
-// A MIB identifies an encoding. It is derived from the IANA MIB codes and adds
-// some identifiers for some encodings that are not covered by the IANA
-// standard.
-//
-// See http://www.iana.org/assignments/ianacharset-mib.
-type MIB uint16
-
-// These additional MIB types are not defined in IANA. They are added because
-// they are common and defined within the text repo.
-const (
- // Unofficial marks the start of encodings not registered by IANA.
- Unofficial MIB = 10000 + iota
-
- // TODO: add Replacement?
-
- // XUserDefined is the code for x-user-defined.
- XUserDefined
-
- // MacintoshCyrillic is the code for x-mac-cyrillic.
- MacintoshCyrillic
-)
diff --git a/vendor/golang.org/x/text/encoding/internal/identifier/mib.go b/vendor/golang.org/x/text/encoding/internal/identifier/mib.go
deleted file mode 100644
index 915abfa..0000000
--- a/vendor/golang.org/x/text/encoding/internal/identifier/mib.go
+++ /dev/null
@@ -1,1621 +0,0 @@
-// This file was generated by go generate; DO NOT EDIT
-
-package identifier
-
-const (
- // ASCII is the MIB identifier with IANA name US-ASCII (MIME: US-ASCII).
- //
- // ANSI X3.4-1986
- // Reference: RFC2046
- ASCII MIB = 3
-
- // ISOLatin1 is the MIB identifier with IANA name ISO_8859-1:1987 (MIME: ISO-8859-1).
- //
- // ISO-IR: International Register of Escape Sequences
- // Note: The current registration authority is IPSJ/ITSCJ, Japan.
- // Reference: RFC1345
- ISOLatin1 MIB = 4
-
- // ISOLatin2 is the MIB identifier with IANA name ISO_8859-2:1987 (MIME: ISO-8859-2).
- //
- // ISO-IR: International Register of Escape Sequences
- // Note: The current registration authority is IPSJ/ITSCJ, Japan.
- // Reference: RFC1345
- ISOLatin2 MIB = 5
-
- // ISOLatin3 is the MIB identifier with IANA name ISO_8859-3:1988 (MIME: ISO-8859-3).
- //
- // ISO-IR: International Register of Escape Sequences
- // Note: The current registration authority is IPSJ/ITSCJ, Japan.
- // Reference: RFC1345
- ISOLatin3 MIB = 6
-
- // ISOLatin4 is the MIB identifier with IANA name ISO_8859-4:1988 (MIME: ISO-8859-4).
- //
- // ISO-IR: International Register of Escape Sequences
- // Note: The current registration authority is IPSJ/ITSCJ, Japan.
- // Reference: RFC1345
- ISOLatin4 MIB = 7
-
- // ISOLatinCyrillic is the MIB identifier with IANA name ISO_8859-5:1988 (MIME: ISO-8859-5).
- //
- // ISO-IR: International Register of Escape Sequences
- // Note: The current registration authority is IPSJ/ITSCJ, Japan.
- // Reference: RFC1345
- ISOLatinCyrillic MIB = 8
-
- // ISOLatinArabic is the MIB identifier with IANA name ISO_8859-6:1987 (MIME: ISO-8859-6).
- //
- // ISO-IR: International Register of Escape Sequences
- // Note: The current registration authority is IPSJ/ITSCJ, Japan.
- // Reference: RFC1345
- ISOLatinArabic MIB = 9
-
- // ISOLatinGreek is the MIB identifier with IANA name ISO_8859-7:1987 (MIME: ISO-8859-7).
- //
- // ISO-IR: International Register of Escape Sequences
- // Note: The current registration authority is IPSJ/ITSCJ, Japan.
- // Reference: RFC1947
- // Reference: RFC1345
- ISOLatinGreek MIB = 10
-
- // ISOLatinHebrew is the MIB identifier with IANA name ISO_8859-8:1988 (MIME: ISO-8859-8).
- //
- // ISO-IR: International Register of Escape Sequences
- // Note: The current registration authority is IPSJ/ITSCJ, Japan.
- // Reference: RFC1345
- ISOLatinHebrew MIB = 11
-
- // ISOLatin5 is the MIB identifier with IANA name ISO_8859-9:1989 (MIME: ISO-8859-9).
- //
- // ISO-IR: International Register of Escape Sequences
- // Note: The current registration authority is IPSJ/ITSCJ, Japan.
- // Reference: RFC1345
- ISOLatin5 MIB = 12
-
- // ISOLatin6 is the MIB identifier with IANA name ISO-8859-10 (MIME: ISO-8859-10).
- //
- // ISO-IR: International Register of Escape Sequences
- // Note: The current registration authority is IPSJ/ITSCJ, Japan.
- // Reference: RFC1345
- ISOLatin6 MIB = 13
-
- // ISOTextComm is the MIB identifier with IANA name ISO_6937-2-add.
- //
- // ISO-IR: International Register of Escape Sequences and ISO 6937-2:1983
- // Note: The current registration authority is IPSJ/ITSCJ, Japan.
- // Reference: RFC1345
- ISOTextComm MIB = 14
-
- // HalfWidthKatakana is the MIB identifier with IANA name JIS_X0201.
- //
- // JIS X 0201-1976. One byte only, this is equivalent to
- // JIS/Roman (similar to ASCII) plus eight-bit half-width
- // Katakana
- // Reference: RFC1345
- HalfWidthKatakana MIB = 15
-
- // JISEncoding is the MIB identifier with IANA name JIS_Encoding.
- //
- // JIS X 0202-1991. Uses ISO 2022 escape sequences to
- // shift code sets as documented in JIS X 0202-1991.
- JISEncoding MIB = 16
-
- // ShiftJIS is the MIB identifier with IANA name Shift_JIS (MIME: Shift_JIS).
- //
- // This charset is an extension of csHalfWidthKatakana by
- // adding graphic characters in JIS X 0208. The CCS's are
- // JIS X0201:1997 and JIS X0208:1997. The
- // complete definition is shown in Appendix 1 of JIS
- // X0208:1997.
- // This charset can be used for the top-level media type "text".
- ShiftJIS MIB = 17
-
- // EUCPkdFmtJapanese is the MIB identifier with IANA name Extended_UNIX_Code_Packed_Format_for_Japanese (MIME: EUC-JP).
- //
- // Standardized by OSF, UNIX International, and UNIX Systems
- // Laboratories Pacific. Uses ISO 2022 rules to select
- // code set 0: US-ASCII (a single 7-bit byte set)
- // code set 1: JIS X0208-1990 (a double 8-bit byte set)
- // restricted to A0-FF in both bytes
- // code set 2: Half Width Katakana (a single 7-bit byte set)
- // requiring SS2 as the character prefix
- // code set 3: JIS X0212-1990 (a double 7-bit byte set)
- // restricted to A0-FF in both bytes
- // requiring SS3 as the character prefix
- EUCPkdFmtJapanese MIB = 18
-
- // EUCFixWidJapanese is the MIB identifier with IANA name Extended_UNIX_Code_Fixed_Width_for_Japanese.
- //
- // Used in Japan. Each character is 2 octets.
- // code set 0: US-ASCII (a single 7-bit byte set)
- // 1st byte = 00
- // 2nd byte = 20-7E
- // code set 1: JIS X0208-1990 (a double 7-bit byte set)
- // restricted to A0-FF in both bytes
- // code set 2: Half Width Katakana (a single 7-bit byte set)
- // 1st byte = 00
- // 2nd byte = A0-FF
- // code set 3: JIS X0212-1990 (a double 7-bit byte set)
- // restricted to A0-FF in
- // the first byte
- // and 21-7E in the second byte
- EUCFixWidJapanese MIB = 19
-
- // ISO4UnitedKingdom is the MIB identifier with IANA name BS_4730.
- //
- // ISO-IR: International Register of Escape Sequences
- // Note: The current registration authority is IPSJ/ITSCJ, Japan.
- // Reference: RFC1345
- ISO4UnitedKingdom MIB = 20
-
- // ISO11SwedishForNames is the MIB identifier with IANA name SEN_850200_C.
- //
- // ISO-IR: International Register of Escape Sequences
- // Note: The current registration authority is IPSJ/ITSCJ, Japan.
- // Reference: RFC1345
- ISO11SwedishForNames MIB = 21
-
- // ISO15Italian is the MIB identifier with IANA name IT.
- //
- // ISO-IR: International Register of Escape Sequences
- // Note: The current registration authority is IPSJ/ITSCJ, Japan.
- // Reference: RFC1345
- ISO15Italian MIB = 22
-
- // ISO17Spanish is the MIB identifier with IANA name ES.
- //
- // ISO-IR: International Register of Escape Sequences
- // Note: The current registration authority is IPSJ/ITSCJ, Japan.
- // Reference: RFC1345
- ISO17Spanish MIB = 23
-
- // ISO21German is the MIB identifier with IANA name DIN_66003.
- //
- // ISO-IR: International Register of Escape Sequences
- // Note: The current registration authority is IPSJ/ITSCJ, Japan.
- // Reference: RFC1345
- ISO21German MIB = 24
-
- // ISO60Norwegian1 is the MIB identifier with IANA name NS_4551-1.
- //
- // ISO-IR: International Register of Escape Sequences
- // Note: The current registration authority is IPSJ/ITSCJ, Japan.
- // Reference: RFC1345
- ISO60Norwegian1 MIB = 25
-
- // ISO69French is the MIB identifier with IANA name NF_Z_62-010.
- //
- // ISO-IR: International Register of Escape Sequences
- // Note: The current registration authority is IPSJ/ITSCJ, Japan.
- // Reference: RFC1345
- ISO69French MIB = 26
-
- // ISO10646UTF1 is the MIB identifier with IANA name ISO-10646-UTF-1.
- //
- // Universal Transfer Format (1), this is the multibyte
- // encoding, that subsets ASCII-7. It does not have byte
- // ordering issues.
- ISO10646UTF1 MIB = 27
-
- // ISO646basic1983 is the MIB identifier with IANA name ISO_646.basic:1983.
- //
- // ISO-IR: International Register of Escape Sequences
- // Note: The current registration authority is IPSJ/ITSCJ, Japan.
- // Reference: RFC1345
- ISO646basic1983 MIB = 28
-
- // INVARIANT is the MIB identifier with IANA name INVARIANT.
- //
- // Reference: RFC1345
- INVARIANT MIB = 29
-
- // ISO2IntlRefVersion is the MIB identifier with IANA name ISO_646.irv:1983.
- //
- // ISO-IR: International Register of Escape Sequences
- // Note: The current registration authority is IPSJ/ITSCJ, Japan.
- // Reference: RFC1345
- ISO2IntlRefVersion MIB = 30
-
- // NATSSEFI is the MIB identifier with IANA name NATS-SEFI.
- //
- // ISO-IR: International Register of Escape Sequences
- // Note: The current registration authority is IPSJ/ITSCJ, Japan.
- // Reference: RFC1345
- NATSSEFI MIB = 31
-
- // NATSSEFIADD is the MIB identifier with IANA name NATS-SEFI-ADD.
- //
- // ISO-IR: International Register of Escape Sequences
- // Note: The current registration authority is IPSJ/ITSCJ, Japan.
- // Reference: RFC1345
- NATSSEFIADD MIB = 32
-
- // NATSDANO is the MIB identifier with IANA name NATS-DANO.
- //
- // ISO-IR: International Register of Escape Sequences
- // Note: The current registration authority is IPSJ/ITSCJ, Japan.
- // Reference: RFC1345
- NATSDANO MIB = 33
-
- // NATSDANOADD is the MIB identifier with IANA name NATS-DANO-ADD.
- //
- // ISO-IR: International Register of Escape Sequences
- // Note: The current registration authority is IPSJ/ITSCJ, Japan.
- // Reference: RFC1345
- NATSDANOADD MIB = 34
-
- // ISO10Swedish is the MIB identifier with IANA name SEN_850200_B.
- //
- // ISO-IR: International Register of Escape Sequences
- // Note: The current registration authority is IPSJ/ITSCJ, Japan.
- // Reference: RFC1345
- ISO10Swedish MIB = 35
-
- // KSC56011987 is the MIB identifier with IANA name KS_C_5601-1987.
- //
- // ISO-IR: International Register of Escape Sequences
- // Note: The current registration authority is IPSJ/ITSCJ, Japan.
- // Reference: RFC1345
- KSC56011987 MIB = 36
-
- // ISO2022KR is the MIB identifier with IANA name ISO-2022-KR (MIME: ISO-2022-KR).
- //
- // rfc1557 (see also KS_C_5601-1987)
- // Reference: RFC1557
- ISO2022KR MIB = 37
-
- // EUCKR is the MIB identifier with IANA name EUC-KR (MIME: EUC-KR).
- //
- // rfc1557 (see also KS_C_5861-1992)
- // Reference: RFC1557
- EUCKR MIB = 38
-
- // ISO2022JP is the MIB identifier with IANA name ISO-2022-JP (MIME: ISO-2022-JP).
- //
- // rfc1468 (see also rfc2237 )
- // Reference: RFC1468
- ISO2022JP MIB = 39
-
- // ISO2022JP2 is the MIB identifier with IANA name ISO-2022-JP-2 (MIME: ISO-2022-JP-2).
- //
- // rfc1554
- // Reference: RFC1554
- ISO2022JP2 MIB = 40
-
- // ISO13JISC6220jp is the MIB identifier with IANA name JIS_C6220-1969-jp.
- //
- // ISO-IR: International Register of Escape Sequences
- // Note: The current registration authority is IPSJ/ITSCJ, Japan.
- // Reference: RFC1345
- ISO13JISC6220jp MIB = 41
-
- // ISO14JISC6220ro is the MIB identifier with IANA name JIS_C6220-1969-ro.
- //
- // ISO-IR: International Register of Escape Sequences
- // Note: The current registration authority is IPSJ/ITSCJ, Japan.
- // Reference: RFC1345
- ISO14JISC6220ro MIB = 42
-
- // ISO16Portuguese is the MIB identifier with IANA name PT.
- //
- // ISO-IR: International Register of Escape Sequences
- // Note: The current registration authority is IPSJ/ITSCJ, Japan.
- // Reference: RFC1345
- ISO16Portuguese MIB = 43
-
- // ISO18Greek7Old is the MIB identifier with IANA name greek7-old.
- //
- // ISO-IR: International Register of Escape Sequences
- // Note: The current registration authority is IPSJ/ITSCJ, Japan.
- // Reference: RFC1345
- ISO18Greek7Old MIB = 44
-
- // ISO19LatinGreek is the MIB identifier with IANA name latin-greek.
- //
- // ISO-IR: International Register of Escape Sequences
- // Note: The current registration authority is IPSJ/ITSCJ, Japan.
- // Reference: RFC1345
- ISO19LatinGreek MIB = 45
-
- // ISO25French is the MIB identifier with IANA name NF_Z_62-010_(1973).
- //
- // ISO-IR: International Register of Escape Sequences
- // Note: The current registration authority is IPSJ/ITSCJ, Japan.
- // Reference: RFC1345
- ISO25French MIB = 46
-
- // ISO27LatinGreek1 is the MIB identifier with IANA name Latin-greek-1.
- //
- // ISO-IR: International Register of Escape Sequences
- // Note: The current registration authority is IPSJ/ITSCJ, Japan.
- // Reference: RFC1345
- ISO27LatinGreek1 MIB = 47
-
- // ISO5427Cyrillic is the MIB identifier with IANA name ISO_5427.
- //
- // ISO-IR: International Register of Escape Sequences
- // Note: The current registration authority is IPSJ/ITSCJ, Japan.
- // Reference: RFC1345
- ISO5427Cyrillic MIB = 48
-
- // ISO42JISC62261978 is the MIB identifier with IANA name JIS_C6226-1978.
- //
- // ISO-IR: International Register of Escape Sequences
- // Note: The current registration authority is IPSJ/ITSCJ, Japan.
- // Reference: RFC1345
- ISO42JISC62261978 MIB = 49
-
- // ISO47BSViewdata is the MIB identifier with IANA name BS_viewdata.
- //
- // ISO-IR: International Register of Escape Sequences
- // Note: The current registration authority is IPSJ/ITSCJ, Japan.
- // Reference: RFC1345
- ISO47BSViewdata MIB = 50
-
- // ISO49INIS is the MIB identifier with IANA name INIS.
- //
- // ISO-IR: International Register of Escape Sequences
- // Note: The current registration authority is IPSJ/ITSCJ, Japan.
- // Reference: RFC1345
- ISO49INIS MIB = 51
-
- // ISO50INIS8 is the MIB identifier with IANA name INIS-8.
- //
- // ISO-IR: International Register of Escape Sequences
- // Note: The current registration authority is IPSJ/ITSCJ, Japan.
- // Reference: RFC1345
- ISO50INIS8 MIB = 52
-
- // ISO51INISCyrillic is the MIB identifier with IANA name INIS-cyrillic.
- //
- // ISO-IR: International Register of Escape Sequences
- // Note: The current registration authority is IPSJ/ITSCJ, Japan.
- // Reference: RFC1345
- ISO51INISCyrillic MIB = 53
-
- // ISO54271981 is the MIB identifier with IANA name ISO_5427:1981.
- //
- // ISO-IR: International Register of Escape Sequences
- // Note: The current registration authority is IPSJ/ITSCJ, Japan.
- // Reference: RFC1345
- ISO54271981 MIB = 54
-
- // ISO5428Greek is the MIB identifier with IANA name ISO_5428:1980.
- //
- // ISO-IR: International Register of Escape Sequences
- // Note: The current registration authority is IPSJ/ITSCJ, Japan.
- // Reference: RFC1345
- ISO5428Greek MIB = 55
-
- // ISO57GB1988 is the MIB identifier with IANA name GB_1988-80.
- //
- // ISO-IR: International Register of Escape Sequences
- // Note: The current registration authority is IPSJ/ITSCJ, Japan.
- // Reference: RFC1345
- ISO57GB1988 MIB = 56
-
- // ISO58GB231280 is the MIB identifier with IANA name GB_2312-80.
- //
- // ISO-IR: International Register of Escape Sequences
- // Note: The current registration authority is IPSJ/ITSCJ, Japan.
- // Reference: RFC1345
- ISO58GB231280 MIB = 57
-
- // ISO61Norwegian2 is the MIB identifier with IANA name NS_4551-2.
- //
- // ISO-IR: International Register of Escape Sequences
- // Note: The current registration authority is IPSJ/ITSCJ, Japan.
- // Reference: RFC1345
- ISO61Norwegian2 MIB = 58
-
- // ISO70VideotexSupp1 is the MIB identifier with IANA name videotex-suppl.
- //
- // ISO-IR: International Register of Escape Sequences
- // Note: The current registration authority is IPSJ/ITSCJ, Japan.
- // Reference: RFC1345
- ISO70VideotexSupp1 MIB = 59
-
- // ISO84Portuguese2 is the MIB identifier with IANA name PT2.
- //
- // ISO-IR: International Register of Escape Sequences
- // Note: The current registration authority is IPSJ/ITSCJ, Japan.
- // Reference: RFC1345
- ISO84Portuguese2 MIB = 60
-
- // ISO85Spanish2 is the MIB identifier with IANA name ES2.
- //
- // ISO-IR: International Register of Escape Sequences
- // Note: The current registration authority is IPSJ/ITSCJ, Japan.
- // Reference: RFC1345
- ISO85Spanish2 MIB = 61
-
- // ISO86Hungarian is the MIB identifier with IANA name MSZ_7795.3.
- //
- // ISO-IR: International Register of Escape Sequences
- // Note: The current registration authority is IPSJ/ITSCJ, Japan.
- // Reference: RFC1345
- ISO86Hungarian MIB = 62
-
- // ISO87JISX0208 is the MIB identifier with IANA name JIS_C6226-1983.
- //
- // ISO-IR: International Register of Escape Sequences
- // Note: The current registration authority is IPSJ/ITSCJ, Japan.
- // Reference: RFC1345
- ISO87JISX0208 MIB = 63
-
- // ISO88Greek7 is the MIB identifier with IANA name greek7.
- //
- // ISO-IR: International Register of Escape Sequences
- // Note: The current registration authority is IPSJ/ITSCJ, Japan.
- // Reference: RFC1345
- ISO88Greek7 MIB = 64
-
- // ISO89ASMO449 is the MIB identifier with IANA name ASMO_449.
- //
- // ISO-IR: International Register of Escape Sequences
- // Note: The current registration authority is IPSJ/ITSCJ, Japan.
- // Reference: RFC1345
- ISO89ASMO449 MIB = 65
-
- // ISO90 is the MIB identifier with IANA name iso-ir-90.
- //
- // ISO-IR: International Register of Escape Sequences
- // Note: The current registration authority is IPSJ/ITSCJ, Japan.
- // Reference: RFC1345
- ISO90 MIB = 66
-
- // ISO91JISC62291984a is the MIB identifier with IANA name JIS_C6229-1984-a.
- //
- // ISO-IR: International Register of Escape Sequences
- // Note: The current registration authority is IPSJ/ITSCJ, Japan.
- // Reference: RFC1345
- ISO91JISC62291984a MIB = 67
-
- // ISO92JISC62991984b is the MIB identifier with IANA name JIS_C6229-1984-b.
- //
- // ISO-IR: International Register of Escape Sequences
- // Note: The current registration authority is IPSJ/ITSCJ, Japan.
- // Reference: RFC1345
- ISO92JISC62991984b MIB = 68
-
- // ISO93JIS62291984badd is the MIB identifier with IANA name JIS_C6229-1984-b-add.
- //
- // ISO-IR: International Register of Escape Sequences
- // Note: The current registration authority is IPSJ/ITSCJ, Japan.
- // Reference: RFC1345
- ISO93JIS62291984badd MIB = 69
-
- // ISO94JIS62291984hand is the MIB identifier with IANA name JIS_C6229-1984-hand.
- //
- // ISO-IR: International Register of Escape Sequences
- // Note: The current registration authority is IPSJ/ITSCJ, Japan.
- // Reference: RFC1345
- ISO94JIS62291984hand MIB = 70
-
- // ISO95JIS62291984handadd is the MIB identifier with IANA name JIS_C6229-1984-hand-add.
- //
- // ISO-IR: International Register of Escape Sequences
- // Note: The current registration authority is IPSJ/ITSCJ, Japan.
- // Reference: RFC1345
- ISO95JIS62291984handadd MIB = 71
-
- // ISO96JISC62291984kana is the MIB identifier with IANA name JIS_C6229-1984-kana.
- //
- // ISO-IR: International Register of Escape Sequences
- // Note: The current registration authority is IPSJ/ITSCJ, Japan.
- // Reference: RFC1345
- ISO96JISC62291984kana MIB = 72
-
- // ISO2033 is the MIB identifier with IANA name ISO_2033-1983.
- //
- // ISO-IR: International Register of Escape Sequences
- // Note: The current registration authority is IPSJ/ITSCJ, Japan.
- // Reference: RFC1345
- ISO2033 MIB = 73
-
- // ISO99NAPLPS is the MIB identifier with IANA name ANSI_X3.110-1983.
- //
- // ISO-IR: International Register of Escape Sequences
- // Note: The current registration authority is IPSJ/ITSCJ, Japan.
- // Reference: RFC1345
- ISO99NAPLPS MIB = 74
-
- // ISO102T617bit is the MIB identifier with IANA name T.61-7bit.
- //
- // ISO-IR: International Register of Escape Sequences
- // Note: The current registration authority is IPSJ/ITSCJ, Japan.
- // Reference: RFC1345
- ISO102T617bit MIB = 75
-
- // ISO103T618bit is the MIB identifier with IANA name T.61-8bit.
- //
- // ISO-IR: International Register of Escape Sequences
- // Note: The current registration authority is IPSJ/ITSCJ, Japan.
- // Reference: RFC1345
- ISO103T618bit MIB = 76
-
- // ISO111ECMACyrillic is the MIB identifier with IANA name ECMA-cyrillic.
- //
- // ISO registry
- // (formerly ECMA
- // registry )
- ISO111ECMACyrillic MIB = 77
-
- // ISO121Canadian1 is the MIB identifier with IANA name CSA_Z243.4-1985-1.
- //
- // ISO-IR: International Register of Escape Sequences
- // Note: The current registration authority is IPSJ/ITSCJ, Japan.
- // Reference: RFC1345
- ISO121Canadian1 MIB = 78
-
- // ISO122Canadian2 is the MIB identifier with IANA name CSA_Z243.4-1985-2.
- //
- // ISO-IR: International Register of Escape Sequences
- // Note: The current registration authority is IPSJ/ITSCJ, Japan.
- // Reference: RFC1345
- ISO122Canadian2 MIB = 79
-
- // ISO123CSAZ24341985gr is the MIB identifier with IANA name CSA_Z243.4-1985-gr.
- //
- // ISO-IR: International Register of Escape Sequences
- // Note: The current registration authority is IPSJ/ITSCJ, Japan.
- // Reference: RFC1345
- ISO123CSAZ24341985gr MIB = 80
-
- // ISO88596E is the MIB identifier with IANA name ISO_8859-6-E (MIME: ISO-8859-6-E).
- //
- // rfc1556
- // Reference: RFC1556
- ISO88596E MIB = 81
-
- // ISO88596I is the MIB identifier with IANA name ISO_8859-6-I (MIME: ISO-8859-6-I).
- //
- // rfc1556
- // Reference: RFC1556
- ISO88596I MIB = 82
-
- // ISO128T101G2 is the MIB identifier with IANA name T.101-G2.
- //
- // ISO-IR: International Register of Escape Sequences
- // Note: The current registration authority is IPSJ/ITSCJ, Japan.
- // Reference: RFC1345
- ISO128T101G2 MIB = 83
-
- // ISO88598E is the MIB identifier with IANA name ISO_8859-8-E (MIME: ISO-8859-8-E).
- //
- // rfc1556
- // Reference: RFC1556
- ISO88598E MIB = 84
-
- // ISO88598I is the MIB identifier with IANA name ISO_8859-8-I (MIME: ISO-8859-8-I).
- //
- // rfc1556
- // Reference: RFC1556
- ISO88598I MIB = 85
-
- // ISO139CSN369103 is the MIB identifier with IANA name CSN_369103.
- //
- // ISO-IR: International Register of Escape Sequences
- // Note: The current registration authority is IPSJ/ITSCJ, Japan.
- // Reference: RFC1345
- ISO139CSN369103 MIB = 86
-
- // ISO141JUSIB1002 is the MIB identifier with IANA name JUS_I.B1.002.
- //
- // ISO-IR: International Register of Escape Sequences
- // Note: The current registration authority is IPSJ/ITSCJ, Japan.
- // Reference: RFC1345
- ISO141JUSIB1002 MIB = 87
-
- // ISO143IECP271 is the MIB identifier with IANA name IEC_P27-1.
- //
- // ISO-IR: International Register of Escape Sequences
- // Note: The current registration authority is IPSJ/ITSCJ, Japan.
- // Reference: RFC1345
- ISO143IECP271 MIB = 88
-
- // ISO146Serbian is the MIB identifier with IANA name JUS_I.B1.003-serb.
- //
- // ISO-IR: International Register of Escape Sequences
- // Note: The current registration authority is IPSJ/ITSCJ, Japan.
- // Reference: RFC1345
- ISO146Serbian MIB = 89
-
- // ISO147Macedonian is the MIB identifier with IANA name JUS_I.B1.003-mac.
- //
- // ISO-IR: International Register of Escape Sequences
- // Note: The current registration authority is IPSJ/ITSCJ, Japan.
- // Reference: RFC1345
- ISO147Macedonian MIB = 90
-
- // ISO150GreekCCITT is the MIB identifier with IANA name greek-ccitt.
- //
- // ISO-IR: International Register of Escape Sequences
- // Note: The current registration authority is IPSJ/ITSCJ, Japan.
- // Reference: RFC1345
- ISO150GreekCCITT MIB = 91
-
- // ISO151Cuba is the MIB identifier with IANA name NC_NC00-10:81.
- //
- // ISO-IR: International Register of Escape Sequences
- // Note: The current registration authority is IPSJ/ITSCJ, Japan.
- // Reference: RFC1345
- ISO151Cuba MIB = 92
-
- // ISO6937Add is the MIB identifier with IANA name ISO_6937-2-25.
- //
- // ISO-IR: International Register of Escape Sequences
- // Note: The current registration authority is IPSJ/ITSCJ, Japan.
- // Reference: RFC1345
- ISO6937Add MIB = 93
-
- // ISO153GOST1976874 is the MIB identifier with IANA name GOST_19768-74.
- //
- // ISO-IR: International Register of Escape Sequences
- // Note: The current registration authority is IPSJ/ITSCJ, Japan.
- // Reference: RFC1345
- ISO153GOST1976874 MIB = 94
-
- // ISO8859Supp is the MIB identifier with IANA name ISO_8859-supp.
- //
- // ISO-IR: International Register of Escape Sequences
- // Note: The current registration authority is IPSJ/ITSCJ, Japan.
- // Reference: RFC1345
- ISO8859Supp MIB = 95
-
- // ISO10367Box is the MIB identifier with IANA name ISO_10367-box.
- //
- // ISO-IR: International Register of Escape Sequences
- // Note: The current registration authority is IPSJ/ITSCJ, Japan.
- // Reference: RFC1345
- ISO10367Box MIB = 96
-
- // ISO158Lap is the MIB identifier with IANA name latin-lap.
- //
- // ISO-IR: International Register of Escape Sequences
- // Note: The current registration authority is IPSJ/ITSCJ, Japan.
- // Reference: RFC1345
- ISO158Lap MIB = 97
-
- // ISO159JISX02121990 is the MIB identifier with IANA name JIS_X0212-1990.
- //
- // ISO-IR: International Register of Escape Sequences
- // Note: The current registration authority is IPSJ/ITSCJ, Japan.
- // Reference: RFC1345
- ISO159JISX02121990 MIB = 98
-
- // ISO646Danish is the MIB identifier with IANA name DS_2089.
- //
- // Danish Standard, DS 2089, February 1974
- // Reference: RFC1345
- ISO646Danish MIB = 99
-
- // USDK is the MIB identifier with IANA name us-dk.
- //
- // Reference: RFC1345
- USDK MIB = 100
-
- // DKUS is the MIB identifier with IANA name dk-us.
- //
- // Reference: RFC1345
- DKUS MIB = 101
-
- // KSC5636 is the MIB identifier with IANA name KSC5636.
- //
- // Reference: RFC1345
- KSC5636 MIB = 102
-
- // Unicode11UTF7 is the MIB identifier with IANA name UNICODE-1-1-UTF-7.
- //
- // rfc1642
- // Reference: RFC1642
- Unicode11UTF7 MIB = 103
-
- // ISO2022CN is the MIB identifier with IANA name ISO-2022-CN.
- //
- // rfc1922
- // Reference: RFC1922
- ISO2022CN MIB = 104
-
- // ISO2022CNEXT is the MIB identifier with IANA name ISO-2022-CN-EXT.
- //
- // rfc1922
- // Reference: RFC1922
- ISO2022CNEXT MIB = 105
-
- // UTF8 is the MIB identifier with IANA name UTF-8.
- //
- // rfc3629
- // Reference: RFC3629
- UTF8 MIB = 106
-
- // ISO885913 is the MIB identifier with IANA name ISO-8859-13.
- //
- // ISO See http://www.iana.org/assignments/charset-reg/ISO-8859-13 http://www.iana.org/assignments/charset-reg/ISO-8859-13
- ISO885913 MIB = 109
-
- // ISO885914 is the MIB identifier with IANA name ISO-8859-14.
- //
- // ISO See http://www.iana.org/assignments/charset-reg/ISO-8859-14
- ISO885914 MIB = 110
-
- // ISO885915 is the MIB identifier with IANA name ISO-8859-15.
- //
- // ISO
- // Please see: http://www.iana.org/assignments/charset-reg/ISO-8859-15
- ISO885915 MIB = 111
-
- // ISO885916 is the MIB identifier with IANA name ISO-8859-16.
- //
- // ISO
- ISO885916 MIB = 112
-
- // GBK is the MIB identifier with IANA name GBK.
- //
- // Chinese IT Standardization Technical Committee
- // Please see: http://www.iana.org/assignments/charset-reg/GBK
- GBK MIB = 113
-
- // GB18030 is the MIB identifier with IANA name GB18030.
- //
- // Chinese IT Standardization Technical Committee
- // Please see: http://www.iana.org/assignments/charset-reg/GB18030
- GB18030 MIB = 114
-
- // OSDEBCDICDF0415 is the MIB identifier with IANA name OSD_EBCDIC_DF04_15.
- //
- // Fujitsu-Siemens standard mainframe EBCDIC encoding
- // Please see: http://www.iana.org/assignments/charset-reg/OSD-EBCDIC-DF04-15
- OSDEBCDICDF0415 MIB = 115
-
- // OSDEBCDICDF03IRV is the MIB identifier with IANA name OSD_EBCDIC_DF03_IRV.
- //
- // Fujitsu-Siemens standard mainframe EBCDIC encoding
- // Please see: http://www.iana.org/assignments/charset-reg/OSD-EBCDIC-DF03-IRV
- OSDEBCDICDF03IRV MIB = 116
-
- // OSDEBCDICDF041 is the MIB identifier with IANA name OSD_EBCDIC_DF04_1.
- //
- // Fujitsu-Siemens standard mainframe EBCDIC encoding
- // Please see: http://www.iana.org/assignments/charset-reg/OSD-EBCDIC-DF04-1
- OSDEBCDICDF041 MIB = 117
-
- // ISO115481 is the MIB identifier with IANA name ISO-11548-1.
- //
- // See http://www.iana.org/assignments/charset-reg/ISO-11548-1
- ISO115481 MIB = 118
-
- // KZ1048 is the MIB identifier with IANA name KZ-1048.
- //
- // See http://www.iana.org/assignments/charset-reg/KZ-1048
- KZ1048 MIB = 119
-
- // Unicode is the MIB identifier with IANA name ISO-10646-UCS-2.
- //
- // the 2-octet Basic Multilingual Plane, aka Unicode
- // this needs to specify network byte order: the standard
- // does not specify (it is a 16-bit integer space)
- Unicode MIB = 1000
-
- // UCS4 is the MIB identifier with IANA name ISO-10646-UCS-4.
- //
- // the full code space. (same comment about byte order,
- // these are 31-bit numbers.
- UCS4 MIB = 1001
-
- // UnicodeASCII is the MIB identifier with IANA name ISO-10646-UCS-Basic.
- //
- // ASCII subset of Unicode. Basic Latin = collection 1
- // See ISO 10646, Appendix A
- UnicodeASCII MIB = 1002
-
- // UnicodeLatin1 is the MIB identifier with IANA name ISO-10646-Unicode-Latin1.
- //
- // ISO Latin-1 subset of Unicode. Basic Latin and Latin-1
- // Supplement = collections 1 and 2. See ISO 10646,
- // Appendix A. See rfc1815 .
- UnicodeLatin1 MIB = 1003
-
- // UnicodeJapanese is the MIB identifier with IANA name ISO-10646-J-1.
- //
- // ISO 10646 Japanese, see rfc1815 .
- UnicodeJapanese MIB = 1004
-
- // UnicodeIBM1261 is the MIB identifier with IANA name ISO-Unicode-IBM-1261.
- //
- // IBM Latin-2, -3, -5, Extended Presentation Set, GCSGID: 1261
- UnicodeIBM1261 MIB = 1005
-
- // UnicodeIBM1268 is the MIB identifier with IANA name ISO-Unicode-IBM-1268.
- //
- // IBM Latin-4 Extended Presentation Set, GCSGID: 1268
- UnicodeIBM1268 MIB = 1006
-
- // UnicodeIBM1276 is the MIB identifier with IANA name ISO-Unicode-IBM-1276.
- //
- // IBM Cyrillic Greek Extended Presentation Set, GCSGID: 1276
- UnicodeIBM1276 MIB = 1007
-
- // UnicodeIBM1264 is the MIB identifier with IANA name ISO-Unicode-IBM-1264.
- //
- // IBM Arabic Presentation Set, GCSGID: 1264
- UnicodeIBM1264 MIB = 1008
-
- // UnicodeIBM1265 is the MIB identifier with IANA name ISO-Unicode-IBM-1265.
- //
- // IBM Hebrew Presentation Set, GCSGID: 1265
- UnicodeIBM1265 MIB = 1009
-
- // Unicode11 is the MIB identifier with IANA name UNICODE-1-1.
- //
- // rfc1641
- // Reference: RFC1641
- Unicode11 MIB = 1010
-
- // SCSU is the MIB identifier with IANA name SCSU.
- //
- // SCSU See http://www.iana.org/assignments/charset-reg/SCSU
- SCSU MIB = 1011
-
- // UTF7 is the MIB identifier with IANA name UTF-7.
- //
- // rfc2152
- // Reference: RFC2152
- UTF7 MIB = 1012
-
- // UTF16BE is the MIB identifier with IANA name UTF-16BE.
- //
- // rfc2781
- // Reference: RFC2781
- UTF16BE MIB = 1013
-
- // UTF16LE is the MIB identifier with IANA name UTF-16LE.
- //
- // rfc2781
- // Reference: RFC2781
- UTF16LE MIB = 1014
-
- // UTF16 is the MIB identifier with IANA name UTF-16.
- //
- // rfc2781
- // Reference: RFC2781
- UTF16 MIB = 1015
-
- // CESU8 is the MIB identifier with IANA name CESU-8.
- //
- // http://www.unicode.org/unicode/reports/tr26
- CESU8 MIB = 1016
-
- // UTF32 is the MIB identifier with IANA name UTF-32.
- //
- // http://www.unicode.org/unicode/reports/tr19/
- UTF32 MIB = 1017
-
- // UTF32BE is the MIB identifier with IANA name UTF-32BE.
- //
- // http://www.unicode.org/unicode/reports/tr19/
- UTF32BE MIB = 1018
-
- // UTF32LE is the MIB identifier with IANA name UTF-32LE.
- //
- // http://www.unicode.org/unicode/reports/tr19/
- UTF32LE MIB = 1019
-
- // BOCU1 is the MIB identifier with IANA name BOCU-1.
- //
- // http://www.unicode.org/notes/tn6/
- BOCU1 MIB = 1020
-
- // Windows30Latin1 is the MIB identifier with IANA name ISO-8859-1-Windows-3.0-Latin-1.
- //
- // Extended ISO 8859-1 Latin-1 for Windows 3.0.
- // PCL Symbol Set id: 9U
- Windows30Latin1 MIB = 2000
-
- // Windows31Latin1 is the MIB identifier with IANA name ISO-8859-1-Windows-3.1-Latin-1.
- //
- // Extended ISO 8859-1 Latin-1 for Windows 3.1.
- // PCL Symbol Set id: 19U
- Windows31Latin1 MIB = 2001
-
- // Windows31Latin2 is the MIB identifier with IANA name ISO-8859-2-Windows-Latin-2.
- //
- // Extended ISO 8859-2. Latin-2 for Windows 3.1.
- // PCL Symbol Set id: 9E
- Windows31Latin2 MIB = 2002
-
- // Windows31Latin5 is the MIB identifier with IANA name ISO-8859-9-Windows-Latin-5.
- //
- // Extended ISO 8859-9. Latin-5 for Windows 3.1
- // PCL Symbol Set id: 5T
- Windows31Latin5 MIB = 2003
-
- // HPRoman8 is the MIB identifier with IANA name hp-roman8.
- //
- // LaserJet IIP Printer User's Manual,
- // HP part no 33471-90901, Hewlet-Packard, June 1989.
- // Reference: RFC1345
- HPRoman8 MIB = 2004
-
- // AdobeStandardEncoding is the MIB identifier with IANA name Adobe-Standard-Encoding.
- //
- // PostScript Language Reference Manual
- // PCL Symbol Set id: 10J
- AdobeStandardEncoding MIB = 2005
-
- // VenturaUS is the MIB identifier with IANA name Ventura-US.
- //
- // Ventura US. ASCII plus characters typically used in
- // publishing, like pilcrow, copyright, registered, trade mark,
- // section, dagger, and double dagger in the range A0 (hex)
- // to FF (hex).
- // PCL Symbol Set id: 14J
- VenturaUS MIB = 2006
-
- // VenturaInternational is the MIB identifier with IANA name Ventura-International.
- //
- // Ventura International. ASCII plus coded characters similar
- // to Roman8.
- // PCL Symbol Set id: 13J
- VenturaInternational MIB = 2007
-
- // DECMCS is the MIB identifier with IANA name DEC-MCS.
- //
- // VAX/VMS User's Manual,
- // Order Number: AI-Y517A-TE, April 1986.
- // Reference: RFC1345
- DECMCS MIB = 2008
-
- // PC850Multilingual is the MIB identifier with IANA name IBM850.
- //
- // IBM NLS RM Vol2 SE09-8002-01, March 1990
- // Reference: RFC1345
- PC850Multilingual MIB = 2009
-
- // PC8DanishNorwegian is the MIB identifier with IANA name PC8-Danish-Norwegian.
- //
- // PC Danish Norwegian
- // 8-bit PC set for Danish Norwegian
- // PCL Symbol Set id: 11U
- PC8DanishNorwegian MIB = 2012
-
- // PC862LatinHebrew is the MIB identifier with IANA name IBM862.
- //
- // IBM NLS RM Vol2 SE09-8002-01, March 1990
- // Reference: RFC1345
- PC862LatinHebrew MIB = 2013
-
- // PC8Turkish is the MIB identifier with IANA name PC8-Turkish.
- //
- // PC Latin Turkish. PCL Symbol Set id: 9T
- PC8Turkish MIB = 2014
-
- // IBMSymbols is the MIB identifier with IANA name IBM-Symbols.
- //
- // Presentation Set, CPGID: 259
- IBMSymbols MIB = 2015
-
- // IBMThai is the MIB identifier with IANA name IBM-Thai.
- //
- // Presentation Set, CPGID: 838
- IBMThai MIB = 2016
-
- // HPLegal is the MIB identifier with IANA name HP-Legal.
- //
- // PCL 5 Comparison Guide, Hewlett-Packard,
- // HP part number 5961-0510, October 1992
- // PCL Symbol Set id: 1U
- HPLegal MIB = 2017
-
- // HPPiFont is the MIB identifier with IANA name HP-Pi-font.
- //
- // PCL 5 Comparison Guide, Hewlett-Packard,
- // HP part number 5961-0510, October 1992
- // PCL Symbol Set id: 15U
- HPPiFont MIB = 2018
-
- // HPMath8 is the MIB identifier with IANA name HP-Math8.
- //
- // PCL 5 Comparison Guide, Hewlett-Packard,
- // HP part number 5961-0510, October 1992
- // PCL Symbol Set id: 8M
- HPMath8 MIB = 2019
-
- // HPPSMath is the MIB identifier with IANA name Adobe-Symbol-Encoding.
- //
- // PostScript Language Reference Manual
- // PCL Symbol Set id: 5M
- HPPSMath MIB = 2020
-
- // HPDesktop is the MIB identifier with IANA name HP-DeskTop.
- //
- // PCL 5 Comparison Guide, Hewlett-Packard,
- // HP part number 5961-0510, October 1992
- // PCL Symbol Set id: 7J
- HPDesktop MIB = 2021
-
- // VenturaMath is the MIB identifier with IANA name Ventura-Math.
- //
- // PCL 5 Comparison Guide, Hewlett-Packard,
- // HP part number 5961-0510, October 1992
- // PCL Symbol Set id: 6M
- VenturaMath MIB = 2022
-
- // MicrosoftPublishing is the MIB identifier with IANA name Microsoft-Publishing.
- //
- // PCL 5 Comparison Guide, Hewlett-Packard,
- // HP part number 5961-0510, October 1992
- // PCL Symbol Set id: 6J
- MicrosoftPublishing MIB = 2023
-
- // Windows31J is the MIB identifier with IANA name Windows-31J.
- //
- // Windows Japanese. A further extension of Shift_JIS
- // to include NEC special characters (Row 13), NEC
- // selection of IBM extensions (Rows 89 to 92), and IBM
- // extensions (Rows 115 to 119). The CCS's are
- // JIS X0201:1997, JIS X0208:1997, and these extensions.
- // This charset can be used for the top-level media type "text",
- // but it is of limited or specialized use (see rfc2278 ).
- // PCL Symbol Set id: 19K
- Windows31J MIB = 2024
-
- // GB2312 is the MIB identifier with IANA name GB2312 (MIME: GB2312).
- //
- // Chinese for People's Republic of China (PRC) mixed one byte,
- // two byte set:
- // 20-7E = one byte ASCII
- // A1-FE = two byte PRC Kanji
- // See GB 2312-80
- // PCL Symbol Set Id: 18C
- GB2312 MIB = 2025
-
- // Big5 is the MIB identifier with IANA name Big5 (MIME: Big5).
- //
- // Chinese for Taiwan Multi-byte set.
- // PCL Symbol Set Id: 18T
- Big5 MIB = 2026
-
- // Macintosh is the MIB identifier with IANA name macintosh.
- //
- // The Unicode Standard ver1.0, ISBN 0-201-56788-1, Oct 1991
- // Reference: RFC1345
- Macintosh MIB = 2027
-
- // IBM037 is the MIB identifier with IANA name IBM037.
- //
- // IBM NLS RM Vol2 SE09-8002-01, March 1990
- // Reference: RFC1345
- IBM037 MIB = 2028
-
- // IBM038 is the MIB identifier with IANA name IBM038.
- //
- // IBM 3174 Character Set Ref, GA27-3831-02, March 1990
- // Reference: RFC1345
- IBM038 MIB = 2029
-
- // IBM273 is the MIB identifier with IANA name IBM273.
- //
- // IBM NLS RM Vol2 SE09-8002-01, March 1990
- // Reference: RFC1345
- IBM273 MIB = 2030
-
- // IBM274 is the MIB identifier with IANA name IBM274.
- //
- // IBM 3174 Character Set Ref, GA27-3831-02, March 1990
- // Reference: RFC1345
- IBM274 MIB = 2031
-
- // IBM275 is the MIB identifier with IANA name IBM275.
- //
- // IBM NLS RM Vol2 SE09-8002-01, March 1990
- // Reference: RFC1345
- IBM275 MIB = 2032
-
- // IBM277 is the MIB identifier with IANA name IBM277.
- //
- // IBM NLS RM Vol2 SE09-8002-01, March 1990
- // Reference: RFC1345
- IBM277 MIB = 2033
-
- // IBM278 is the MIB identifier with IANA name IBM278.
- //
- // IBM NLS RM Vol2 SE09-8002-01, March 1990
- // Reference: RFC1345
- IBM278 MIB = 2034
-
- // IBM280 is the MIB identifier with IANA name IBM280.
- //
- // IBM NLS RM Vol2 SE09-8002-01, March 1990
- // Reference: RFC1345
- IBM280 MIB = 2035
-
- // IBM281 is the MIB identifier with IANA name IBM281.
- //
- // IBM 3174 Character Set Ref, GA27-3831-02, March 1990
- // Reference: RFC1345
- IBM281 MIB = 2036
-
- // IBM284 is the MIB identifier with IANA name IBM284.
- //
- // IBM NLS RM Vol2 SE09-8002-01, March 1990
- // Reference: RFC1345
- IBM284 MIB = 2037
-
- // IBM285 is the MIB identifier with IANA name IBM285.
- //
- // IBM NLS RM Vol2 SE09-8002-01, March 1990
- // Reference: RFC1345
- IBM285 MIB = 2038
-
- // IBM290 is the MIB identifier with IANA name IBM290.
- //
- // IBM 3174 Character Set Ref, GA27-3831-02, March 1990
- // Reference: RFC1345
- IBM290 MIB = 2039
-
- // IBM297 is the MIB identifier with IANA name IBM297.
- //
- // IBM NLS RM Vol2 SE09-8002-01, March 1990
- // Reference: RFC1345
- IBM297 MIB = 2040
-
- // IBM420 is the MIB identifier with IANA name IBM420.
- //
- // IBM NLS RM Vol2 SE09-8002-01, March 1990,
- // IBM NLS RM p 11-11
- // Reference: RFC1345
- IBM420 MIB = 2041
-
- // IBM423 is the MIB identifier with IANA name IBM423.
- //
- // IBM NLS RM Vol2 SE09-8002-01, March 1990
- // Reference: RFC1345
- IBM423 MIB = 2042
-
- // IBM424 is the MIB identifier with IANA name IBM424.
- //
- // IBM NLS RM Vol2 SE09-8002-01, March 1990
- // Reference: RFC1345
- IBM424 MIB = 2043
-
- // PC8CodePage437 is the MIB identifier with IANA name IBM437.
- //
- // IBM NLS RM Vol2 SE09-8002-01, March 1990
- // Reference: RFC1345
- PC8CodePage437 MIB = 2011
-
- // IBM500 is the MIB identifier with IANA name IBM500.
- //
- // IBM NLS RM Vol2 SE09-8002-01, March 1990
- // Reference: RFC1345
- IBM500 MIB = 2044
-
- // IBM851 is the MIB identifier with IANA name IBM851.
- //
- // IBM NLS RM Vol2 SE09-8002-01, March 1990
- // Reference: RFC1345
- IBM851 MIB = 2045
-
- // PCp852 is the MIB identifier with IANA name IBM852.
- //
- // IBM NLS RM Vol2 SE09-8002-01, March 1990
- // Reference: RFC1345
- PCp852 MIB = 2010
-
- // IBM855 is the MIB identifier with IANA name IBM855.
- //
- // IBM NLS RM Vol2 SE09-8002-01, March 1990
- // Reference: RFC1345
- IBM855 MIB = 2046
-
- // IBM857 is the MIB identifier with IANA name IBM857.
- //
- // IBM NLS RM Vol2 SE09-8002-01, March 1990
- // Reference: RFC1345
- IBM857 MIB = 2047
-
- // IBM860 is the MIB identifier with IANA name IBM860.
- //
- // IBM NLS RM Vol2 SE09-8002-01, March 1990
- // Reference: RFC1345
- IBM860 MIB = 2048
-
- // IBM861 is the MIB identifier with IANA name IBM861.
- //
- // IBM NLS RM Vol2 SE09-8002-01, March 1990
- // Reference: RFC1345
- IBM861 MIB = 2049
-
- // IBM863 is the MIB identifier with IANA name IBM863.
- //
- // IBM Keyboard layouts and code pages, PN 07G4586 June 1991
- // Reference: RFC1345
- IBM863 MIB = 2050
-
- // IBM864 is the MIB identifier with IANA name IBM864.
- //
- // IBM Keyboard layouts and code pages, PN 07G4586 June 1991
- // Reference: RFC1345
- IBM864 MIB = 2051
-
- // IBM865 is the MIB identifier with IANA name IBM865.
- //
- // IBM DOS 3.3 Ref (Abridged), 94X9575 (Feb 1987)
- // Reference: RFC1345
- IBM865 MIB = 2052
-
- // IBM868 is the MIB identifier with IANA name IBM868.
- //
- // IBM NLS RM Vol2 SE09-8002-01, March 1990
- // Reference: RFC1345
- IBM868 MIB = 2053
-
- // IBM869 is the MIB identifier with IANA name IBM869.
- //
- // IBM Keyboard layouts and code pages, PN 07G4586 June 1991
- // Reference: RFC1345
- IBM869 MIB = 2054
-
- // IBM870 is the MIB identifier with IANA name IBM870.
- //
- // IBM NLS RM Vol2 SE09-8002-01, March 1990
- // Reference: RFC1345
- IBM870 MIB = 2055
-
- // IBM871 is the MIB identifier with IANA name IBM871.
- //
- // IBM NLS RM Vol2 SE09-8002-01, March 1990
- // Reference: RFC1345
- IBM871 MIB = 2056
-
- // IBM880 is the MIB identifier with IANA name IBM880.
- //
- // IBM NLS RM Vol2 SE09-8002-01, March 1990
- // Reference: RFC1345
- IBM880 MIB = 2057
-
- // IBM891 is the MIB identifier with IANA name IBM891.
- //
- // IBM NLS RM Vol2 SE09-8002-01, March 1990
- // Reference: RFC1345
- IBM891 MIB = 2058
-
- // IBM903 is the MIB identifier with IANA name IBM903.
- //
- // IBM NLS RM Vol2 SE09-8002-01, March 1990
- // Reference: RFC1345
- IBM903 MIB = 2059
-
- // IBBM904 is the MIB identifier with IANA name IBM904.
- //
- // IBM NLS RM Vol2 SE09-8002-01, March 1990
- // Reference: RFC1345
- IBBM904 MIB = 2060
-
- // IBM905 is the MIB identifier with IANA name IBM905.
- //
- // IBM 3174 Character Set Ref, GA27-3831-02, March 1990
- // Reference: RFC1345
- IBM905 MIB = 2061
-
- // IBM918 is the MIB identifier with IANA name IBM918.
- //
- // IBM NLS RM Vol2 SE09-8002-01, March 1990
- // Reference: RFC1345
- IBM918 MIB = 2062
-
- // IBM1026 is the MIB identifier with IANA name IBM1026.
- //
- // IBM NLS RM Vol2 SE09-8002-01, March 1990
- // Reference: RFC1345
- IBM1026 MIB = 2063
-
- // IBMEBCDICATDE is the MIB identifier with IANA name EBCDIC-AT-DE.
- //
- // IBM 3270 Char Set Ref Ch 10, GA27-2837-9, April 1987
- // Reference: RFC1345
- IBMEBCDICATDE MIB = 2064
-
- // EBCDICATDEA is the MIB identifier with IANA name EBCDIC-AT-DE-A.
- //
- // IBM 3270 Char Set Ref Ch 10, GA27-2837-9, April 1987
- // Reference: RFC1345
- EBCDICATDEA MIB = 2065
-
- // EBCDICCAFR is the MIB identifier with IANA name EBCDIC-CA-FR.
- //
- // IBM 3270 Char Set Ref Ch 10, GA27-2837-9, April 1987
- // Reference: RFC1345
- EBCDICCAFR MIB = 2066
-
- // EBCDICDKNO is the MIB identifier with IANA name EBCDIC-DK-NO.
- //
- // IBM 3270 Char Set Ref Ch 10, GA27-2837-9, April 1987
- // Reference: RFC1345
- EBCDICDKNO MIB = 2067
-
- // EBCDICDKNOA is the MIB identifier with IANA name EBCDIC-DK-NO-A.
- //
- // IBM 3270 Char Set Ref Ch 10, GA27-2837-9, April 1987
- // Reference: RFC1345
- EBCDICDKNOA MIB = 2068
-
- // EBCDICFISE is the MIB identifier with IANA name EBCDIC-FI-SE.
- //
- // IBM 3270 Char Set Ref Ch 10, GA27-2837-9, April 1987
- // Reference: RFC1345
- EBCDICFISE MIB = 2069
-
- // EBCDICFISEA is the MIB identifier with IANA name EBCDIC-FI-SE-A.
- //
- // IBM 3270 Char Set Ref Ch 10, GA27-2837-9, April 1987
- // Reference: RFC1345
- EBCDICFISEA MIB = 2070
-
- // EBCDICFR is the MIB identifier with IANA name EBCDIC-FR.
- //
- // IBM 3270 Char Set Ref Ch 10, GA27-2837-9, April 1987
- // Reference: RFC1345
- EBCDICFR MIB = 2071
-
- // EBCDICIT is the MIB identifier with IANA name EBCDIC-IT.
- //
- // IBM 3270 Char Set Ref Ch 10, GA27-2837-9, April 1987
- // Reference: RFC1345
- EBCDICIT MIB = 2072
-
- // EBCDICPT is the MIB identifier with IANA name EBCDIC-PT.
- //
- // IBM 3270 Char Set Ref Ch 10, GA27-2837-9, April 1987
- // Reference: RFC1345
- EBCDICPT MIB = 2073
-
- // EBCDICES is the MIB identifier with IANA name EBCDIC-ES.
- //
- // IBM 3270 Char Set Ref Ch 10, GA27-2837-9, April 1987
- // Reference: RFC1345
- EBCDICES MIB = 2074
-
- // EBCDICESA is the MIB identifier with IANA name EBCDIC-ES-A.
- //
- // IBM 3270 Char Set Ref Ch 10, GA27-2837-9, April 1987
- // Reference: RFC1345
- EBCDICESA MIB = 2075
-
- // EBCDICESS is the MIB identifier with IANA name EBCDIC-ES-S.
- //
- // IBM 3270 Char Set Ref Ch 10, GA27-2837-9, April 1987
- // Reference: RFC1345
- EBCDICESS MIB = 2076
-
- // EBCDICUK is the MIB identifier with IANA name EBCDIC-UK.
- //
- // IBM 3270 Char Set Ref Ch 10, GA27-2837-9, April 1987
- // Reference: RFC1345
- EBCDICUK MIB = 2077
-
- // EBCDICUS is the MIB identifier with IANA name EBCDIC-US.
- //
- // IBM 3270 Char Set Ref Ch 10, GA27-2837-9, April 1987
- // Reference: RFC1345
- EBCDICUS MIB = 2078
-
- // Unknown8BiT is the MIB identifier with IANA name UNKNOWN-8BIT.
- //
- // Reference: RFC1428
- Unknown8BiT MIB = 2079
-
- // Mnemonic is the MIB identifier with IANA name MNEMONIC.
- //
- // rfc1345 , also known as "mnemonic+ascii+38"
- // Reference: RFC1345
- Mnemonic MIB = 2080
-
- // Mnem is the MIB identifier with IANA name MNEM.
- //
- // rfc1345 , also known as "mnemonic+ascii+8200"
- // Reference: RFC1345
- Mnem MIB = 2081
-
- // VISCII is the MIB identifier with IANA name VISCII.
- //
- // rfc1456
- // Reference: RFC1456
- VISCII MIB = 2082
-
- // VIQR is the MIB identifier with IANA name VIQR.
- //
- // rfc1456
- // Reference: RFC1456
- VIQR MIB = 2083
-
- // KOI8R is the MIB identifier with IANA name KOI8-R (MIME: KOI8-R).
- //
- // rfc1489 , based on GOST-19768-74, ISO-6937/8,
- // INIS-Cyrillic, ISO-5427.
- // Reference: RFC1489
- KOI8R MIB = 2084
-
- // HZGB2312 is the MIB identifier with IANA name HZ-GB-2312.
- //
- // rfc1842 , rfc1843 rfc1843 rfc1842
- HZGB2312 MIB = 2085
-
- // IBM866 is the MIB identifier with IANA name IBM866.
- //
- // IBM NLDG Volume 2 (SE09-8002-03) August 1994
- IBM866 MIB = 2086
-
- // PC775Baltic is the MIB identifier with IANA name IBM775.
- //
- // HP PCL 5 Comparison Guide (P/N 5021-0329) pp B-13, 1996
- PC775Baltic MIB = 2087
-
- // KOI8U is the MIB identifier with IANA name KOI8-U.
- //
- // rfc2319
- // Reference: RFC2319
- KOI8U MIB = 2088
-
- // IBM00858 is the MIB identifier with IANA name IBM00858.
- //
- // IBM See http://www.iana.org/assignments/charset-reg/IBM00858
- IBM00858 MIB = 2089
-
- // IBM00924 is the MIB identifier with IANA name IBM00924.
- //
- // IBM See http://www.iana.org/assignments/charset-reg/IBM00924
- IBM00924 MIB = 2090
-
- // IBM01140 is the MIB identifier with IANA name IBM01140.
- //
- // IBM See http://www.iana.org/assignments/charset-reg/IBM01140
- IBM01140 MIB = 2091
-
- // IBM01141 is the MIB identifier with IANA name IBM01141.
- //
- // IBM See http://www.iana.org/assignments/charset-reg/IBM01141
- IBM01141 MIB = 2092
-
- // IBM01142 is the MIB identifier with IANA name IBM01142.
- //
- // IBM See http://www.iana.org/assignments/charset-reg/IBM01142
- IBM01142 MIB = 2093
-
- // IBM01143 is the MIB identifier with IANA name IBM01143.
- //
- // IBM See http://www.iana.org/assignments/charset-reg/IBM01143
- IBM01143 MIB = 2094
-
- // IBM01144 is the MIB identifier with IANA name IBM01144.
- //
- // IBM See http://www.iana.org/assignments/charset-reg/IBM01144
- IBM01144 MIB = 2095
-
- // IBM01145 is the MIB identifier with IANA name IBM01145.
- //
- // IBM See http://www.iana.org/assignments/charset-reg/IBM01145
- IBM01145 MIB = 2096
-
- // IBM01146 is the MIB identifier with IANA name IBM01146.
- //
- // IBM See http://www.iana.org/assignments/charset-reg/IBM01146
- IBM01146 MIB = 2097
-
- // IBM01147 is the MIB identifier with IANA name IBM01147.
- //
- // IBM See http://www.iana.org/assignments/charset-reg/IBM01147
- IBM01147 MIB = 2098
-
- // IBM01148 is the MIB identifier with IANA name IBM01148.
- //
- // IBM See http://www.iana.org/assignments/charset-reg/IBM01148
- IBM01148 MIB = 2099
-
- // IBM01149 is the MIB identifier with IANA name IBM01149.
- //
- // IBM See http://www.iana.org/assignments/charset-reg/IBM01149
- IBM01149 MIB = 2100
-
- // Big5HKSCS is the MIB identifier with IANA name Big5-HKSCS.
- //
- // See http://www.iana.org/assignments/charset-reg/Big5-HKSCS
- Big5HKSCS MIB = 2101
-
- // IBM1047 is the MIB identifier with IANA name IBM1047.
- //
- // IBM1047 (EBCDIC Latin 1/Open Systems) http://www-1.ibm.com/servers/eserver/iseries/software/globalization/pdf/cp01047z.pdf
- IBM1047 MIB = 2102
-
- // PTCP154 is the MIB identifier with IANA name PTCP154.
- //
- // See http://www.iana.org/assignments/charset-reg/PTCP154
- PTCP154 MIB = 2103
-
- // Amiga1251 is the MIB identifier with IANA name Amiga-1251.
- //
- // See http://www.amiga.ultranet.ru/Amiga-1251.html
- Amiga1251 MIB = 2104
-
- // KOI7switched is the MIB identifier with IANA name KOI7-switched.
- //
- // See http://www.iana.org/assignments/charset-reg/KOI7-switched
- KOI7switched MIB = 2105
-
- // BRF is the MIB identifier with IANA name BRF.
- //
- // See http://www.iana.org/assignments/charset-reg/BRF
- BRF MIB = 2106
-
- // TSCII is the MIB identifier with IANA name TSCII.
- //
- // See http://www.iana.org/assignments/charset-reg/TSCII
- TSCII MIB = 2107
-
- // CP51932 is the MIB identifier with IANA name CP51932.
- //
- // See http://www.iana.org/assignments/charset-reg/CP51932
- CP51932 MIB = 2108
-
- // Windows874 is the MIB identifier with IANA name windows-874.
- //
- // See http://www.iana.org/assignments/charset-reg/windows-874
- Windows874 MIB = 2109
-
- // Windows1250 is the MIB identifier with IANA name windows-1250.
- //
- // Microsoft http://www.iana.org/assignments/charset-reg/windows-1250
- Windows1250 MIB = 2250
-
- // Windows1251 is the MIB identifier with IANA name windows-1251.
- //
- // Microsoft http://www.iana.org/assignments/charset-reg/windows-1251
- Windows1251 MIB = 2251
-
- // Windows1252 is the MIB identifier with IANA name windows-1252.
- //
- // Microsoft http://www.iana.org/assignments/charset-reg/windows-1252
- Windows1252 MIB = 2252
-
- // Windows1253 is the MIB identifier with IANA name windows-1253.
- //
- // Microsoft http://www.iana.org/assignments/charset-reg/windows-1253
- Windows1253 MIB = 2253
-
- // Windows1254 is the MIB identifier with IANA name windows-1254.
- //
- // Microsoft http://www.iana.org/assignments/charset-reg/windows-1254
- Windows1254 MIB = 2254
-
- // Windows1255 is the MIB identifier with IANA name windows-1255.
- //
- // Microsoft http://www.iana.org/assignments/charset-reg/windows-1255
- Windows1255 MIB = 2255
-
- // Windows1256 is the MIB identifier with IANA name windows-1256.
- //
- // Microsoft http://www.iana.org/assignments/charset-reg/windows-1256
- Windows1256 MIB = 2256
-
- // Windows1257 is the MIB identifier with IANA name windows-1257.
- //
- // Microsoft http://www.iana.org/assignments/charset-reg/windows-1257
- Windows1257 MIB = 2257
-
- // Windows1258 is the MIB identifier with IANA name windows-1258.
- //
- // Microsoft http://www.iana.org/assignments/charset-reg/windows-1258
- Windows1258 MIB = 2258
-
- // TIS620 is the MIB identifier with IANA name TIS-620.
- //
- // Thai Industrial Standards Institute (TISI)
- TIS620 MIB = 2259
-
- // CP50220 is the MIB identifier with IANA name CP50220.
- //
- // See http://www.iana.org/assignments/charset-reg/CP50220
- CP50220 MIB = 2260
-)
diff --git a/vendor/golang.org/x/text/encoding/internal/internal.go b/vendor/golang.org/x/text/encoding/internal/internal.go
deleted file mode 100644
index 63bf16c..0000000
--- a/vendor/golang.org/x/text/encoding/internal/internal.go
+++ /dev/null
@@ -1,60 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Package internal contains code that is shared among encoding implementations.
-package internal
-
-import (
- "golang.org/x/text/encoding"
- "golang.org/x/text/encoding/internal/identifier"
- "golang.org/x/text/transform"
-)
-
-// Encoding is an implementation of the Encoding interface that adds the String
-// and ID methods to an existing encoding.
-type Encoding struct {
- encoding.Encoding
- Name string
- MIB identifier.MIB
-}
-
-// _ verifies that Encoding implements identifier.Interface.
-var _ identifier.Interface = (*Encoding)(nil)
-
-func (e *Encoding) String() string {
- return e.Name
-}
-
-func (e *Encoding) ID() (mib identifier.MIB, other string) {
- return e.MIB, ""
-}
-
-// SimpleEncoding is an Encoding that combines two Transformers.
-type SimpleEncoding struct {
- Decoder transform.Transformer
- Encoder transform.Transformer
-}
-
-func (e *SimpleEncoding) NewDecoder() transform.Transformer {
- return e.Decoder
-}
-
-func (e *SimpleEncoding) NewEncoder() transform.Transformer {
- return e.Encoder
-}
-
-// FuncEncoding is an Encoding that combines two functions returning a new
-// Transformer.
-type FuncEncoding struct {
- Decoder func() transform.Transformer
- Encoder func() transform.Transformer
-}
-
-func (e FuncEncoding) NewDecoder() transform.Transformer {
- return e.Decoder()
-}
-
-func (e FuncEncoding) NewEncoder() transform.Transformer {
- return e.Encoder()
-}
diff --git a/vendor/golang.org/x/text/encoding/simplifiedchinese/all.go b/vendor/golang.org/x/text/encoding/simplifiedchinese/all.go
deleted file mode 100644
index 5ecc526..0000000
--- a/vendor/golang.org/x/text/encoding/simplifiedchinese/all.go
+++ /dev/null
@@ -1,12 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package simplifiedchinese
-
-import (
- "golang.org/x/text/encoding"
-)
-
-// All is a list of all defined encodings in this package.
-var All = []encoding.Encoding{GB18030, GBK, HZGB2312}
diff --git a/vendor/golang.org/x/text/encoding/simplifiedchinese/gbk.go b/vendor/golang.org/x/text/encoding/simplifiedchinese/gbk.go
deleted file mode 100644
index bff5714..0000000
--- a/vendor/golang.org/x/text/encoding/simplifiedchinese/gbk.go
+++ /dev/null
@@ -1,280 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package simplifiedchinese
-
-import (
- "errors"
- "unicode/utf8"
-
- "golang.org/x/text/encoding"
- "golang.org/x/text/encoding/internal"
- "golang.org/x/text/encoding/internal/identifier"
- "golang.org/x/text/transform"
-)
-
-var (
- // GB18030 is the GB18030 encoding.
- GB18030 encoding.Encoding = &gbk18030
- // GBK is the GBK encoding. It encodes an extension of the GB2312 character set
- // and is also known as Code Page 936.
- GBK encoding.Encoding = &gbk
-)
-
-var gbk = internal.Encoding{
- &internal.SimpleEncoding{
- gbkDecoder{gb18030: false},
- gbkEncoder{gb18030: false},
- },
- "GBK",
- identifier.GBK,
-}
-
-var gbk18030 = internal.Encoding{
- &internal.SimpleEncoding{
- gbkDecoder{gb18030: true},
- gbkEncoder{gb18030: true},
- },
- "GB18030",
- identifier.GB18030,
-}
-
-var (
- errInvalidGB18030 = errors.New("simplifiedchinese: invalid GB18030 encoding")
- errInvalidGBK = errors.New("simplifiedchinese: invalid GBK encoding")
-)
-
-type gbkDecoder struct {
- transform.NopResetter
- gb18030 bool
-}
-
-func (d gbkDecoder) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) {
- r, size := rune(0), 0
-loop:
- for ; nSrc < len(src); nSrc += size {
- switch c0 := src[nSrc]; {
- case c0 < utf8.RuneSelf:
- r, size = rune(c0), 1
-
- // Microsoft's Code Page 936 extends GBK 1.0 to encode the euro sign U+20AC
- // as 0x80. The HTML5 specification at http://encoding.spec.whatwg.org/#gbk
- // says to treat "gbk" as Code Page 936.
- case c0 == 0x80:
- r, size = '€', 1
-
- case c0 < 0xff:
- if nSrc+1 >= len(src) {
- err = transform.ErrShortSrc
- break loop
- }
- c1 := src[nSrc+1]
- switch {
- case 0x40 <= c1 && c1 < 0x7f:
- c1 -= 0x40
- case 0x80 <= c1 && c1 < 0xff:
- c1 -= 0x41
- case d.gb18030 && 0x30 <= c1 && c1 < 0x40:
- if nSrc+3 >= len(src) {
- err = transform.ErrShortSrc
- break loop
- }
- c2 := src[nSrc+2]
- if c2 < 0x81 || 0xff <= c2 {
- err = errInvalidGB18030
- break loop
- }
- c3 := src[nSrc+3]
- if c3 < 0x30 || 0x3a <= c3 {
- err = errInvalidGB18030
- break loop
- }
- size = 4
- r = ((rune(c0-0x81)*10+rune(c1-0x30))*126+rune(c2-0x81))*10 + rune(c3-0x30)
- if r < 39420 {
- i, j := 0, len(gb18030)
- for i < j {
- h := i + (j-i)/2
- if r >= rune(gb18030[h][0]) {
- i = h + 1
- } else {
- j = h
- }
- }
- dec := &gb18030[i-1]
- r += rune(dec[1]) - rune(dec[0])
- goto write
- }
- r -= 189000
- if 0 <= r && r < 0x100000 {
- r += 0x10000
- goto write
- }
- err = errInvalidGB18030
- break loop
- default:
- if d.gb18030 {
- err = errInvalidGB18030
- } else {
- err = errInvalidGBK
- }
- break loop
- }
- r, size = '\ufffd', 2
- if i := int(c0-0x81)*190 + int(c1); i < len(decode) {
- r = rune(decode[i])
- if r == 0 {
- r = '\ufffd'
- }
- }
-
- default:
- if d.gb18030 {
- err = errInvalidGB18030
- } else {
- err = errInvalidGBK
- }
- break loop
- }
-
- write:
- if nDst+utf8.RuneLen(r) > len(dst) {
- err = transform.ErrShortDst
- break loop
- }
- nDst += utf8.EncodeRune(dst[nDst:], r)
- }
- if atEOF && err == transform.ErrShortSrc {
- if d.gb18030 {
- err = errInvalidGB18030
- } else {
- err = errInvalidGBK
- }
- }
- return nDst, nSrc, err
-}
-
-type gbkEncoder struct {
- transform.NopResetter
- gb18030 bool
-}
-
-func (e gbkEncoder) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) {
- r, r2, size := rune(0), rune(0), 0
- for ; nSrc < len(src); nSrc += size {
- r = rune(src[nSrc])
-
- // Decode a 1-byte rune.
- if r < utf8.RuneSelf {
- size = 1
-
- } else {
- // Decode a multi-byte rune.
- r, size = utf8.DecodeRune(src[nSrc:])
- if size == 1 {
- // All valid runes of size 1 (those below utf8.RuneSelf) were
- // handled above. We have invalid UTF-8 or we haven't seen the
- // full character yet.
- if !atEOF && !utf8.FullRune(src[nSrc:]) {
- err = transform.ErrShortSrc
- break
- }
- }
-
- // func init checks that the switch covers all tables.
- switch {
- case encode0Low <= r && r < encode0High:
- if r2 = rune(encode0[r-encode0Low]); r2 != 0 {
- goto write2
- }
- case encode1Low <= r && r < encode1High:
- // Microsoft's Code Page 936 extends GBK 1.0 to encode the euro sign U+20AC
- // as 0x80. The HTML5 specification at http://encoding.spec.whatwg.org/#gbk
- // says to treat "gbk" as Code Page 936.
- if r == '€' {
- r = 0x80
- goto write1
- }
- if r2 = rune(encode1[r-encode1Low]); r2 != 0 {
- goto write2
- }
- case encode2Low <= r && r < encode2High:
- if r2 = rune(encode2[r-encode2Low]); r2 != 0 {
- goto write2
- }
- case encode3Low <= r && r < encode3High:
- if r2 = rune(encode3[r-encode3Low]); r2 != 0 {
- goto write2
- }
- case encode4Low <= r && r < encode4High:
- if r2 = rune(encode4[r-encode4Low]); r2 != 0 {
- goto write2
- }
- }
-
- if e.gb18030 {
- if r < 0x10000 {
- i, j := 0, len(gb18030)
- for i < j {
- h := i + (j-i)/2
- if r >= rune(gb18030[h][1]) {
- i = h + 1
- } else {
- j = h
- }
- }
- dec := &gb18030[i-1]
- r += rune(dec[0]) - rune(dec[1])
- goto write4
- } else if r < 0x110000 {
- r += 189000 - 0x10000
- goto write4
- }
- }
- r = encoding.ASCIISub
- }
-
- write1:
- if nDst >= len(dst) {
- err = transform.ErrShortDst
- break
- }
- dst[nDst] = uint8(r)
- nDst++
- continue
-
- write2:
- if nDst+2 > len(dst) {
- err = transform.ErrShortDst
- break
- }
- dst[nDst+0] = uint8(r2 >> 8)
- dst[nDst+1] = uint8(r2)
- nDst += 2
- continue
-
- write4:
- if nDst+4 > len(dst) {
- err = transform.ErrShortDst
- break
- }
- dst[nDst+3] = uint8(r%10 + 0x30)
- r /= 10
- dst[nDst+2] = uint8(r%126 + 0x81)
- r /= 126
- dst[nDst+1] = uint8(r%10 + 0x30)
- r /= 10
- dst[nDst+0] = uint8(r + 0x81)
- nDst += 4
- continue
- }
- return nDst, nSrc, err
-}
-
-func init() {
- // Check that the hard-coded encode switch covers all tables.
- if numEncodeTables != 5 {
- panic("bad numEncodeTables")
- }
-}
diff --git a/vendor/golang.org/x/text/encoding/simplifiedchinese/hzgb2312.go b/vendor/golang.org/x/text/encoding/simplifiedchinese/hzgb2312.go
deleted file mode 100644
index e42af96..0000000
--- a/vendor/golang.org/x/text/encoding/simplifiedchinese/hzgb2312.go
+++ /dev/null
@@ -1,228 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package simplifiedchinese
-
-import (
- "errors"
- "unicode/utf8"
-
- "golang.org/x/text/encoding"
- "golang.org/x/text/encoding/internal"
- "golang.org/x/text/encoding/internal/identifier"
- "golang.org/x/text/transform"
-)
-
-// HZGB2312 is the HZ-GB2312 encoding.
-var HZGB2312 encoding.Encoding = &hzGB2312
-
-var hzGB2312 = internal.Encoding{
- internal.FuncEncoding{hzGB2312NewDecoder, hzGB2312NewEncoder},
- "HZ-GB2312",
- identifier.HZGB2312,
-}
-
-func hzGB2312NewDecoder() transform.Transformer {
- return new(hzGB2312Decoder)
-}
-
-func hzGB2312NewEncoder() transform.Transformer {
- return new(hzGB2312Encoder)
-}
-
-var errInvalidHZGB2312 = errors.New("simplifiedchinese: invalid HZ-GB2312 encoding")
-
-const (
- asciiState = iota
- gbState
-)
-
-type hzGB2312Decoder int
-
-func (d *hzGB2312Decoder) Reset() {
- *d = asciiState
-}
-
-func (d *hzGB2312Decoder) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) {
- r, size := rune(0), 0
-loop:
- for ; nSrc < len(src); nSrc += size {
- c0 := src[nSrc]
- if c0 >= utf8.RuneSelf {
- err = errInvalidHZGB2312
- break loop
- }
-
- if c0 == '~' {
- if nSrc+1 >= len(src) {
- err = transform.ErrShortSrc
- break loop
- }
- size = 2
- switch src[nSrc+1] {
- case '{':
- *d = gbState
- continue
- case '}':
- *d = asciiState
- continue
- case '~':
- if nDst >= len(dst) {
- err = transform.ErrShortDst
- break loop
- }
- dst[nDst] = '~'
- nDst++
- continue
- case '\n':
- continue
- default:
- err = errInvalidHZGB2312
- break loop
- }
- }
-
- if *d == asciiState {
- r, size = rune(c0), 1
- } else {
- if nSrc+1 >= len(src) {
- err = transform.ErrShortSrc
- break loop
- }
- c1 := src[nSrc+1]
- if c0 < 0x21 || 0x7e <= c0 || c1 < 0x21 || 0x7f <= c1 {
- err = errInvalidHZGB2312
- break loop
- }
-
- r, size = '\ufffd', 2
- if i := int(c0-0x01)*190 + int(c1+0x3f); i < len(decode) {
- r = rune(decode[i])
- if r == 0 {
- r = '\ufffd'
- }
- }
- }
-
- if nDst+utf8.RuneLen(r) > len(dst) {
- err = transform.ErrShortDst
- break loop
- }
- nDst += utf8.EncodeRune(dst[nDst:], r)
- }
- if atEOF && err == transform.ErrShortSrc {
- err = errInvalidHZGB2312
- }
- return nDst, nSrc, err
-}
-
-type hzGB2312Encoder int
-
-func (d *hzGB2312Encoder) Reset() {
- *d = asciiState
-}
-
-func (e *hzGB2312Encoder) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) {
- r, size := rune(0), 0
- for ; nSrc < len(src); nSrc += size {
- r = rune(src[nSrc])
-
- // Decode a 1-byte rune.
- if r < utf8.RuneSelf {
- size = 1
- if r == '~' {
- if nDst+2 > len(dst) {
- err = transform.ErrShortDst
- break
- }
- dst[nDst+0] = '~'
- dst[nDst+1] = '~'
- nDst += 2
- continue
- }
-
- } else {
- // Decode a multi-byte rune.
- r, size = utf8.DecodeRune(src[nSrc:])
- if size == 1 {
- // All valid runes of size 1 (those below utf8.RuneSelf) were
- // handled above. We have invalid UTF-8 or we haven't seen the
- // full character yet.
- if !atEOF && !utf8.FullRune(src[nSrc:]) {
- err = transform.ErrShortSrc
- break
- }
- }
-
- // func init checks that the switch covers all tables.
- switch {
- case encode0Low <= r && r < encode0High:
- if r = rune(encode0[r-encode0Low]); r != 0 {
- goto writeGB
- }
- case encode1Low <= r && r < encode1High:
- if r = rune(encode1[r-encode1Low]); r != 0 {
- goto writeGB
- }
- case encode2Low <= r && r < encode2High:
- if r = rune(encode2[r-encode2Low]); r != 0 {
- goto writeGB
- }
- case encode3Low <= r && r < encode3High:
- if r = rune(encode3[r-encode3Low]); r != 0 {
- goto writeGB
- }
- case encode4Low <= r && r < encode4High:
- if r = rune(encode4[r-encode4Low]); r != 0 {
- goto writeGB
- }
- }
- r = encoding.ASCIISub
- }
-
- writeASCII:
- if *e != asciiState {
- if nDst+3 > len(dst) {
- err = transform.ErrShortDst
- break
- }
- *e = asciiState
- dst[nDst+0] = '~'
- dst[nDst+1] = '}'
- nDst += 2
- } else if nDst >= len(dst) {
- err = transform.ErrShortDst
- break
- }
- dst[nDst] = uint8(r)
- nDst++
- continue
-
- writeGB:
- c0 := uint8(r>>8) - 0x80
- c1 := uint8(r) - 0x80
- if c0 < 0x21 || 0x7e <= c0 || c1 < 0x21 || 0x7f <= c1 {
- r = encoding.ASCIISub
- goto writeASCII
- }
- if *e == asciiState {
- if nDst+4 > len(dst) {
- err = transform.ErrShortDst
- break
- }
- *e = gbState
- dst[nDst+0] = '~'
- dst[nDst+1] = '{'
- nDst += 2
- } else if nDst+2 > len(dst) {
- err = transform.ErrShortDst
- break
- }
- dst[nDst+0] = c0
- dst[nDst+1] = c1
- nDst += 2
- continue
- }
- return nDst, nSrc, err
-}
diff --git a/vendor/golang.org/x/text/encoding/simplifiedchinese/maketables.go b/vendor/golang.org/x/text/encoding/simplifiedchinese/maketables.go
deleted file mode 100644
index 55016c7..0000000
--- a/vendor/golang.org/x/text/encoding/simplifiedchinese/maketables.go
+++ /dev/null
@@ -1,161 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build ignore
-
-package main
-
-// This program generates tables.go:
-// go run maketables.go | gofmt > tables.go
-
-import (
- "bufio"
- "fmt"
- "log"
- "net/http"
- "sort"
- "strings"
-)
-
-func main() {
- fmt.Printf("// generated by go run maketables.go; DO NOT EDIT\n\n")
- fmt.Printf("// Package simplifiedchinese provides Simplified Chinese encodings such as GBK.\n")
- fmt.Printf(`package simplifiedchinese // import "golang.org/x/text/encoding/simplifiedchinese"` + "\n\n")
-
- printGB18030()
- printGBK()
-}
-
-func printGB18030() {
- res, err := http.Get("http://encoding.spec.whatwg.org/index-gb18030.txt")
- if err != nil {
- log.Fatalf("Get: %v", err)
- }
- defer res.Body.Close()
-
- fmt.Printf("// gb18030 is the table from http://encoding.spec.whatwg.org/index-gb18030.txt\n")
- fmt.Printf("var gb18030 = [...][2]uint16{\n")
- scanner := bufio.NewScanner(res.Body)
- for scanner.Scan() {
- s := strings.TrimSpace(scanner.Text())
- if s == "" || s[0] == '#' {
- continue
- }
- x, y := uint32(0), uint32(0)
- if _, err := fmt.Sscanf(s, "%d 0x%x", &x, &y); err != nil {
- log.Fatalf("could not parse %q", s)
- }
- if x < 0x10000 && y < 0x10000 {
- fmt.Printf("\t{0x%04x, 0x%04x},\n", x, y)
- }
- }
- fmt.Printf("}\n\n")
-}
-
-func printGBK() {
- res, err := http.Get("http://encoding.spec.whatwg.org/index-gbk.txt")
- if err != nil {
- log.Fatalf("Get: %v", err)
- }
- defer res.Body.Close()
-
- mapping := [65536]uint16{}
- reverse := [65536]uint16{}
-
- scanner := bufio.NewScanner(res.Body)
- for scanner.Scan() {
- s := strings.TrimSpace(scanner.Text())
- if s == "" || s[0] == '#' {
- continue
- }
- x, y := uint16(0), uint16(0)
- if _, err := fmt.Sscanf(s, "%d 0x%x", &x, &y); err != nil {
- log.Fatalf("could not parse %q", s)
- }
- if x < 0 || 126*190 <= x {
- log.Fatalf("GBK code %d is out of range", x)
- }
- mapping[x] = y
- if reverse[y] == 0 {
- c0, c1 := x/190, x%190
- if c1 >= 0x3f {
- c1++
- }
- reverse[y] = (0x81+c0)<<8 | (0x40 + c1)
- }
- }
- if err := scanner.Err(); err != nil {
- log.Fatalf("scanner error: %v", err)
- }
-
- fmt.Printf("// decode is the decoding table from GBK code to Unicode.\n")
- fmt.Printf("// It is defined at http://encoding.spec.whatwg.org/index-gbk.txt\n")
- fmt.Printf("var decode = [...]uint16{\n")
- for i, v := range mapping {
- if v != 0 {
- fmt.Printf("\t%d: 0x%04X,\n", i, v)
- }
- }
- fmt.Printf("}\n\n")
-
- // Any run of at least separation continuous zero entries in the reverse map will
- // be a separate encode table.
- const separation = 1024
-
- intervals := []interval(nil)
- low, high := -1, -1
- for i, v := range reverse {
- if v == 0 {
- continue
- }
- if low < 0 {
- low = i
- } else if i-high >= separation {
- if high >= 0 {
- intervals = append(intervals, interval{low, high})
- }
- low = i
- }
- high = i + 1
- }
- if high >= 0 {
- intervals = append(intervals, interval{low, high})
- }
- sort.Sort(byDecreasingLength(intervals))
-
- fmt.Printf("const numEncodeTables = %d\n\n", len(intervals))
- fmt.Printf("// encodeX are the encoding tables from Unicode to GBK code,\n")
- fmt.Printf("// sorted by decreasing length.\n")
- for i, v := range intervals {
- fmt.Printf("// encode%d: %5d entries for runes in [%5d, %5d).\n", i, v.len(), v.low, v.high)
- }
- fmt.Printf("\n")
-
- for i, v := range intervals {
- fmt.Printf("const encode%dLow, encode%dHigh = %d, %d\n\n", i, i, v.low, v.high)
- fmt.Printf("var encode%d = [...]uint16{\n", i)
- for j := v.low; j < v.high; j++ {
- x := reverse[j]
- if x == 0 {
- continue
- }
- fmt.Printf("\t%d-%d: 0x%04X,\n", j, v.low, x)
- }
- fmt.Printf("}\n\n")
- }
-}
-
-// interval is a half-open interval [low, high).
-type interval struct {
- low, high int
-}
-
-func (i interval) len() int { return i.high - i.low }
-
-// byDecreasingLength sorts intervals by decreasing length.
-type byDecreasingLength []interval
-
-func (b byDecreasingLength) Len() int { return len(b) }
-func (b byDecreasingLength) Less(i, j int) bool { return b[i].len() > b[j].len() }
-func (b byDecreasingLength) Swap(i, j int) { b[i], b[j] = b[j], b[i] }
diff --git a/vendor/golang.org/x/text/encoding/simplifiedchinese/tables.go b/vendor/golang.org/x/text/encoding/simplifiedchinese/tables.go
deleted file mode 100644
index 415f52a..0000000
--- a/vendor/golang.org/x/text/encoding/simplifiedchinese/tables.go
+++ /dev/null
@@ -1,43999 +0,0 @@
-// generated by go run maketables.go; DO NOT EDIT
-
-// Package simplifiedchinese provides Simplified Chinese encodings such as GBK.
-package simplifiedchinese // import "golang.org/x/text/encoding/simplifiedchinese"
-
-// gb18030 is the table from http://encoding.spec.whatwg.org/index-gb18030.txt
-var gb18030 = [...][2]uint16{
- {0x0000, 0x0080},
- {0x0024, 0x00a5},
- {0x0026, 0x00a9},
- {0x002d, 0x00b2},
- {0x0032, 0x00b8},
- {0x0051, 0x00d8},
- {0x0059, 0x00e2},
- {0x005f, 0x00eb},
- {0x0060, 0x00ee},
- {0x0064, 0x00f4},
- {0x0067, 0x00f8},
- {0x0068, 0x00fb},
- {0x0069, 0x00fd},
- {0x006d, 0x0102},
- {0x007e, 0x0114},
- {0x0085, 0x011c},
- {0x0094, 0x012c},
- {0x00ac, 0x0145},
- {0x00af, 0x0149},
- {0x00b3, 0x014e},
- {0x00d0, 0x016c},
- {0x0132, 0x01cf},
- {0x0133, 0x01d1},
- {0x0134, 0x01d3},
- {0x0135, 0x01d5},
- {0x0136, 0x01d7},
- {0x0137, 0x01d9},
- {0x0138, 0x01db},
- {0x0139, 0x01dd},
- {0x0155, 0x01fa},
- {0x01ac, 0x0252},
- {0x01bb, 0x0262},
- {0x0220, 0x02c8},
- {0x0221, 0x02cc},
- {0x022e, 0x02da},
- {0x02e5, 0x03a2},
- {0x02e6, 0x03aa},
- {0x02ed, 0x03c2},
- {0x02ee, 0x03ca},
- {0x0325, 0x0402},
- {0x0333, 0x0450},
- {0x0334, 0x0452},
- {0x1ef2, 0x2011},
- {0x1ef4, 0x2017},
- {0x1ef5, 0x201a},
- {0x1ef7, 0x201e},
- {0x1efe, 0x2027},
- {0x1f07, 0x2031},
- {0x1f08, 0x2034},
- {0x1f09, 0x2036},
- {0x1f0e, 0x203c},
- {0x1f7e, 0x20ad},
- {0x1fd4, 0x2104},
- {0x1fd5, 0x2106},
- {0x1fd8, 0x210a},
- {0x1fe4, 0x2117},
- {0x1fee, 0x2122},
- {0x202c, 0x216c},
- {0x2030, 0x217a},
- {0x2046, 0x2194},
- {0x2048, 0x219a},
- {0x20b6, 0x2209},
- {0x20bc, 0x2210},
- {0x20bd, 0x2212},
- {0x20c0, 0x2216},
- {0x20c4, 0x221b},
- {0x20c6, 0x2221},
- {0x20c8, 0x2224},
- {0x20c9, 0x2226},
- {0x20ca, 0x222c},
- {0x20cc, 0x222f},
- {0x20d1, 0x2238},
- {0x20d6, 0x223e},
- {0x20e0, 0x2249},
- {0x20e3, 0x224d},
- {0x20e8, 0x2253},
- {0x20f5, 0x2262},
- {0x20f7, 0x2268},
- {0x20fd, 0x2270},
- {0x2122, 0x2296},
- {0x2125, 0x229a},
- {0x2130, 0x22a6},
- {0x2149, 0x22c0},
- {0x219b, 0x2313},
- {0x22e8, 0x246a},
- {0x22f2, 0x249c},
- {0x2356, 0x254c},
- {0x235a, 0x2574},
- {0x2367, 0x2590},
- {0x236a, 0x2596},
- {0x2374, 0x25a2},
- {0x2384, 0x25b4},
- {0x238c, 0x25be},
- {0x2394, 0x25c8},
- {0x2397, 0x25cc},
- {0x2399, 0x25d0},
- {0x23ab, 0x25e6},
- {0x23ca, 0x2607},
- {0x23cc, 0x260a},
- {0x2402, 0x2641},
- {0x2403, 0x2643},
- {0x2c41, 0x2e82},
- {0x2c43, 0x2e85},
- {0x2c46, 0x2e89},
- {0x2c48, 0x2e8d},
- {0x2c52, 0x2e98},
- {0x2c61, 0x2ea8},
- {0x2c63, 0x2eab},
- {0x2c66, 0x2eaf},
- {0x2c6a, 0x2eb4},
- {0x2c6c, 0x2eb8},
- {0x2c6f, 0x2ebc},
- {0x2c7d, 0x2ecb},
- {0x2da2, 0x2ffc},
- {0x2da6, 0x3004},
- {0x2da7, 0x3018},
- {0x2dac, 0x301f},
- {0x2dae, 0x302a},
- {0x2dc2, 0x303f},
- {0x2dc4, 0x3094},
- {0x2dcb, 0x309f},
- {0x2dcd, 0x30f7},
- {0x2dd2, 0x30ff},
- {0x2dd8, 0x312a},
- {0x2ece, 0x322a},
- {0x2ed5, 0x3232},
- {0x2f46, 0x32a4},
- {0x3030, 0x3390},
- {0x303c, 0x339f},
- {0x303e, 0x33a2},
- {0x3060, 0x33c5},
- {0x3069, 0x33cf},
- {0x306b, 0x33d3},
- {0x306d, 0x33d6},
- {0x30de, 0x3448},
- {0x3109, 0x3474},
- {0x3233, 0x359f},
- {0x32a2, 0x360f},
- {0x32ad, 0x361b},
- {0x35aa, 0x3919},
- {0x35ff, 0x396f},
- {0x365f, 0x39d1},
- {0x366d, 0x39e0},
- {0x3700, 0x3a74},
- {0x37da, 0x3b4f},
- {0x38f9, 0x3c6f},
- {0x396a, 0x3ce1},
- {0x3cdf, 0x4057},
- {0x3de7, 0x4160},
- {0x3fbe, 0x4338},
- {0x4032, 0x43ad},
- {0x4036, 0x43b2},
- {0x4061, 0x43de},
- {0x4159, 0x44d7},
- {0x42ce, 0x464d},
- {0x42e2, 0x4662},
- {0x43a3, 0x4724},
- {0x43a8, 0x472a},
- {0x43fa, 0x477d},
- {0x440a, 0x478e},
- {0x45c3, 0x4948},
- {0x45f5, 0x497b},
- {0x45f7, 0x497e},
- {0x45fb, 0x4984},
- {0x45fc, 0x4987},
- {0x4610, 0x499c},
- {0x4613, 0x49a0},
- {0x4629, 0x49b8},
- {0x48e8, 0x4c78},
- {0x490f, 0x4ca4},
- {0x497e, 0x4d1a},
- {0x4a12, 0x4daf},
- {0x4a63, 0x9fa6},
- {0x82bd, 0xe76c},
- {0x82be, 0xe7c8},
- {0x82bf, 0xe7e7},
- {0x82cc, 0xe815},
- {0x82cd, 0xe819},
- {0x82d2, 0xe81f},
- {0x82d9, 0xe827},
- {0x82dd, 0xe82d},
- {0x82e1, 0xe833},
- {0x82e9, 0xe83c},
- {0x82f0, 0xe844},
- {0x8300, 0xe856},
- {0x830e, 0xe865},
- {0x93d5, 0xf92d},
- {0x9421, 0xf97a},
- {0x943c, 0xf996},
- {0x948d, 0xf9e8},
- {0x9496, 0xf9f2},
- {0x94b0, 0xfa10},
- {0x94b1, 0xfa12},
- {0x94b2, 0xfa15},
- {0x94b5, 0xfa19},
- {0x94bb, 0xfa22},
- {0x94bc, 0xfa25},
- {0x94be, 0xfa2a},
- {0x98c4, 0xfe32},
- {0x98c5, 0xfe45},
- {0x98c9, 0xfe53},
- {0x98ca, 0xfe58},
- {0x98cb, 0xfe67},
- {0x98cc, 0xfe6c},
- {0x9961, 0xff5f},
- {0x99e2, 0xffe6},
-}
-
-// decode is the decoding table from GBK code to Unicode.
-// It is defined at http://encoding.spec.whatwg.org/index-gbk.txt
-var decode = [...]uint16{
- 0: 0x4E02,
- 1: 0x4E04,
- 2: 0x4E05,
- 3: 0x4E06,
- 4: 0x4E0F,
- 5: 0x4E12,
- 6: 0x4E17,
- 7: 0x4E1F,
- 8: 0x4E20,
- 9: 0x4E21,
- 10: 0x4E23,
- 11: 0x4E26,
- 12: 0x4E29,
- 13: 0x4E2E,
- 14: 0x4E2F,
- 15: 0x4E31,
- 16: 0x4E33,
- 17: 0x4E35,
- 18: 0x4E37,
- 19: 0x4E3C,
- 20: 0x4E40,
- 21: 0x4E41,
- 22: 0x4E42,
- 23: 0x4E44,
- 24: 0x4E46,
- 25: 0x4E4A,
- 26: 0x4E51,
- 27: 0x4E55,
- 28: 0x4E57,
- 29: 0x4E5A,
- 30: 0x4E5B,
- 31: 0x4E62,
- 32: 0x4E63,
- 33: 0x4E64,
- 34: 0x4E65,
- 35: 0x4E67,
- 36: 0x4E68,
- 37: 0x4E6A,
- 38: 0x4E6B,
- 39: 0x4E6C,
- 40: 0x4E6D,
- 41: 0x4E6E,
- 42: 0x4E6F,
- 43: 0x4E72,
- 44: 0x4E74,
- 45: 0x4E75,
- 46: 0x4E76,
- 47: 0x4E77,
- 48: 0x4E78,
- 49: 0x4E79,
- 50: 0x4E7A,
- 51: 0x4E7B,
- 52: 0x4E7C,
- 53: 0x4E7D,
- 54: 0x4E7F,
- 55: 0x4E80,
- 56: 0x4E81,
- 57: 0x4E82,
- 58: 0x4E83,
- 59: 0x4E84,
- 60: 0x4E85,
- 61: 0x4E87,
- 62: 0x4E8A,
- 63: 0x4E90,
- 64: 0x4E96,
- 65: 0x4E97,
- 66: 0x4E99,
- 67: 0x4E9C,
- 68: 0x4E9D,
- 69: 0x4E9E,
- 70: 0x4EA3,
- 71: 0x4EAA,
- 72: 0x4EAF,
- 73: 0x4EB0,
- 74: 0x4EB1,
- 75: 0x4EB4,
- 76: 0x4EB6,
- 77: 0x4EB7,
- 78: 0x4EB8,
- 79: 0x4EB9,
- 80: 0x4EBC,
- 81: 0x4EBD,
- 82: 0x4EBE,
- 83: 0x4EC8,
- 84: 0x4ECC,
- 85: 0x4ECF,
- 86: 0x4ED0,
- 87: 0x4ED2,
- 88: 0x4EDA,
- 89: 0x4EDB,
- 90: 0x4EDC,
- 91: 0x4EE0,
- 92: 0x4EE2,
- 93: 0x4EE6,
- 94: 0x4EE7,
- 95: 0x4EE9,
- 96: 0x4EED,
- 97: 0x4EEE,
- 98: 0x4EEF,
- 99: 0x4EF1,
- 100: 0x4EF4,
- 101: 0x4EF8,
- 102: 0x4EF9,
- 103: 0x4EFA,
- 104: 0x4EFC,
- 105: 0x4EFE,
- 106: 0x4F00,
- 107: 0x4F02,
- 108: 0x4F03,
- 109: 0x4F04,
- 110: 0x4F05,
- 111: 0x4F06,
- 112: 0x4F07,
- 113: 0x4F08,
- 114: 0x4F0B,
- 115: 0x4F0C,
- 116: 0x4F12,
- 117: 0x4F13,
- 118: 0x4F14,
- 119: 0x4F15,
- 120: 0x4F16,
- 121: 0x4F1C,
- 122: 0x4F1D,
- 123: 0x4F21,
- 124: 0x4F23,
- 125: 0x4F28,
- 126: 0x4F29,
- 127: 0x4F2C,
- 128: 0x4F2D,
- 129: 0x4F2E,
- 130: 0x4F31,
- 131: 0x4F33,
- 132: 0x4F35,
- 133: 0x4F37,
- 134: 0x4F39,
- 135: 0x4F3B,
- 136: 0x4F3E,
- 137: 0x4F3F,
- 138: 0x4F40,
- 139: 0x4F41,
- 140: 0x4F42,
- 141: 0x4F44,
- 142: 0x4F45,
- 143: 0x4F47,
- 144: 0x4F48,
- 145: 0x4F49,
- 146: 0x4F4A,
- 147: 0x4F4B,
- 148: 0x4F4C,
- 149: 0x4F52,
- 150: 0x4F54,
- 151: 0x4F56,
- 152: 0x4F61,
- 153: 0x4F62,
- 154: 0x4F66,
- 155: 0x4F68,
- 156: 0x4F6A,
- 157: 0x4F6B,
- 158: 0x4F6D,
- 159: 0x4F6E,
- 160: 0x4F71,
- 161: 0x4F72,
- 162: 0x4F75,
- 163: 0x4F77,
- 164: 0x4F78,
- 165: 0x4F79,
- 166: 0x4F7A,
- 167: 0x4F7D,
- 168: 0x4F80,
- 169: 0x4F81,
- 170: 0x4F82,
- 171: 0x4F85,
- 172: 0x4F86,
- 173: 0x4F87,
- 174: 0x4F8A,
- 175: 0x4F8C,
- 176: 0x4F8E,
- 177: 0x4F90,
- 178: 0x4F92,
- 179: 0x4F93,
- 180: 0x4F95,
- 181: 0x4F96,
- 182: 0x4F98,
- 183: 0x4F99,
- 184: 0x4F9A,
- 185: 0x4F9C,
- 186: 0x4F9E,
- 187: 0x4F9F,
- 188: 0x4FA1,
- 189: 0x4FA2,
- 190: 0x4FA4,
- 191: 0x4FAB,
- 192: 0x4FAD,
- 193: 0x4FB0,
- 194: 0x4FB1,
- 195: 0x4FB2,
- 196: 0x4FB3,
- 197: 0x4FB4,
- 198: 0x4FB6,
- 199: 0x4FB7,
- 200: 0x4FB8,
- 201: 0x4FB9,
- 202: 0x4FBA,
- 203: 0x4FBB,
- 204: 0x4FBC,
- 205: 0x4FBD,
- 206: 0x4FBE,
- 207: 0x4FC0,
- 208: 0x4FC1,
- 209: 0x4FC2,
- 210: 0x4FC6,
- 211: 0x4FC7,
- 212: 0x4FC8,
- 213: 0x4FC9,
- 214: 0x4FCB,
- 215: 0x4FCC,
- 216: 0x4FCD,
- 217: 0x4FD2,
- 218: 0x4FD3,
- 219: 0x4FD4,
- 220: 0x4FD5,
- 221: 0x4FD6,
- 222: 0x4FD9,
- 223: 0x4FDB,
- 224: 0x4FE0,
- 225: 0x4FE2,
- 226: 0x4FE4,
- 227: 0x4FE5,
- 228: 0x4FE7,
- 229: 0x4FEB,
- 230: 0x4FEC,
- 231: 0x4FF0,
- 232: 0x4FF2,
- 233: 0x4FF4,
- 234: 0x4FF5,
- 235: 0x4FF6,
- 236: 0x4FF7,
- 237: 0x4FF9,
- 238: 0x4FFB,
- 239: 0x4FFC,
- 240: 0x4FFD,
- 241: 0x4FFF,
- 242: 0x5000,
- 243: 0x5001,
- 244: 0x5002,
- 245: 0x5003,
- 246: 0x5004,
- 247: 0x5005,
- 248: 0x5006,
- 249: 0x5007,
- 250: 0x5008,
- 251: 0x5009,
- 252: 0x500A,
- 253: 0x500B,
- 254: 0x500E,
- 255: 0x5010,
- 256: 0x5011,
- 257: 0x5013,
- 258: 0x5015,
- 259: 0x5016,
- 260: 0x5017,
- 261: 0x501B,
- 262: 0x501D,
- 263: 0x501E,
- 264: 0x5020,
- 265: 0x5022,
- 266: 0x5023,
- 267: 0x5024,
- 268: 0x5027,
- 269: 0x502B,
- 270: 0x502F,
- 271: 0x5030,
- 272: 0x5031,
- 273: 0x5032,
- 274: 0x5033,
- 275: 0x5034,
- 276: 0x5035,
- 277: 0x5036,
- 278: 0x5037,
- 279: 0x5038,
- 280: 0x5039,
- 281: 0x503B,
- 282: 0x503D,
- 283: 0x503F,
- 284: 0x5040,
- 285: 0x5041,
- 286: 0x5042,
- 287: 0x5044,
- 288: 0x5045,
- 289: 0x5046,
- 290: 0x5049,
- 291: 0x504A,
- 292: 0x504B,
- 293: 0x504D,
- 294: 0x5050,
- 295: 0x5051,
- 296: 0x5052,
- 297: 0x5053,
- 298: 0x5054,
- 299: 0x5056,
- 300: 0x5057,
- 301: 0x5058,
- 302: 0x5059,
- 303: 0x505B,
- 304: 0x505D,
- 305: 0x505E,
- 306: 0x505F,
- 307: 0x5060,
- 308: 0x5061,
- 309: 0x5062,
- 310: 0x5063,
- 311: 0x5064,
- 312: 0x5066,
- 313: 0x5067,
- 314: 0x5068,
- 315: 0x5069,
- 316: 0x506A,
- 317: 0x506B,
- 318: 0x506D,
- 319: 0x506E,
- 320: 0x506F,
- 321: 0x5070,
- 322: 0x5071,
- 323: 0x5072,
- 324: 0x5073,
- 325: 0x5074,
- 326: 0x5075,
- 327: 0x5078,
- 328: 0x5079,
- 329: 0x507A,
- 330: 0x507C,
- 331: 0x507D,
- 332: 0x5081,
- 333: 0x5082,
- 334: 0x5083,
- 335: 0x5084,
- 336: 0x5086,
- 337: 0x5087,
- 338: 0x5089,
- 339: 0x508A,
- 340: 0x508B,
- 341: 0x508C,
- 342: 0x508E,
- 343: 0x508F,
- 344: 0x5090,
- 345: 0x5091,
- 346: 0x5092,
- 347: 0x5093,
- 348: 0x5094,
- 349: 0x5095,
- 350: 0x5096,
- 351: 0x5097,
- 352: 0x5098,
- 353: 0x5099,
- 354: 0x509A,
- 355: 0x509B,
- 356: 0x509C,
- 357: 0x509D,
- 358: 0x509E,
- 359: 0x509F,
- 360: 0x50A0,
- 361: 0x50A1,
- 362: 0x50A2,
- 363: 0x50A4,
- 364: 0x50A6,
- 365: 0x50AA,
- 366: 0x50AB,
- 367: 0x50AD,
- 368: 0x50AE,
- 369: 0x50AF,
- 370: 0x50B0,
- 371: 0x50B1,
- 372: 0x50B3,
- 373: 0x50B4,
- 374: 0x50B5,
- 375: 0x50B6,
- 376: 0x50B7,
- 377: 0x50B8,
- 378: 0x50B9,
- 379: 0x50BC,
- 380: 0x50BD,
- 381: 0x50BE,
- 382: 0x50BF,
- 383: 0x50C0,
- 384: 0x50C1,
- 385: 0x50C2,
- 386: 0x50C3,
- 387: 0x50C4,
- 388: 0x50C5,
- 389: 0x50C6,
- 390: 0x50C7,
- 391: 0x50C8,
- 392: 0x50C9,
- 393: 0x50CA,
- 394: 0x50CB,
- 395: 0x50CC,
- 396: 0x50CD,
- 397: 0x50CE,
- 398: 0x50D0,
- 399: 0x50D1,
- 400: 0x50D2,
- 401: 0x50D3,
- 402: 0x50D4,
- 403: 0x50D5,
- 404: 0x50D7,
- 405: 0x50D8,
- 406: 0x50D9,
- 407: 0x50DB,
- 408: 0x50DC,
- 409: 0x50DD,
- 410: 0x50DE,
- 411: 0x50DF,
- 412: 0x50E0,
- 413: 0x50E1,
- 414: 0x50E2,
- 415: 0x50E3,
- 416: 0x50E4,
- 417: 0x50E5,
- 418: 0x50E8,
- 419: 0x50E9,
- 420: 0x50EA,
- 421: 0x50EB,
- 422: 0x50EF,
- 423: 0x50F0,
- 424: 0x50F1,
- 425: 0x50F2,
- 426: 0x50F4,
- 427: 0x50F6,
- 428: 0x50F7,
- 429: 0x50F8,
- 430: 0x50F9,
- 431: 0x50FA,
- 432: 0x50FC,
- 433: 0x50FD,
- 434: 0x50FE,
- 435: 0x50FF,
- 436: 0x5100,
- 437: 0x5101,
- 438: 0x5102,
- 439: 0x5103,
- 440: 0x5104,
- 441: 0x5105,
- 442: 0x5108,
- 443: 0x5109,
- 444: 0x510A,
- 445: 0x510C,
- 446: 0x510D,
- 447: 0x510E,
- 448: 0x510F,
- 449: 0x5110,
- 450: 0x5111,
- 451: 0x5113,
- 452: 0x5114,
- 453: 0x5115,
- 454: 0x5116,
- 455: 0x5117,
- 456: 0x5118,
- 457: 0x5119,
- 458: 0x511A,
- 459: 0x511B,
- 460: 0x511C,
- 461: 0x511D,
- 462: 0x511E,
- 463: 0x511F,
- 464: 0x5120,
- 465: 0x5122,
- 466: 0x5123,
- 467: 0x5124,
- 468: 0x5125,
- 469: 0x5126,
- 470: 0x5127,
- 471: 0x5128,
- 472: 0x5129,
- 473: 0x512A,
- 474: 0x512B,
- 475: 0x512C,
- 476: 0x512D,
- 477: 0x512E,
- 478: 0x512F,
- 479: 0x5130,
- 480: 0x5131,
- 481: 0x5132,
- 482: 0x5133,
- 483: 0x5134,
- 484: 0x5135,
- 485: 0x5136,
- 486: 0x5137,
- 487: 0x5138,
- 488: 0x5139,
- 489: 0x513A,
- 490: 0x513B,
- 491: 0x513C,
- 492: 0x513D,
- 493: 0x513E,
- 494: 0x5142,
- 495: 0x5147,
- 496: 0x514A,
- 497: 0x514C,
- 498: 0x514E,
- 499: 0x514F,
- 500: 0x5150,
- 501: 0x5152,
- 502: 0x5153,
- 503: 0x5157,
- 504: 0x5158,
- 505: 0x5159,
- 506: 0x515B,
- 507: 0x515D,
- 508: 0x515E,
- 509: 0x515F,
- 510: 0x5160,
- 511: 0x5161,
- 512: 0x5163,
- 513: 0x5164,
- 514: 0x5166,
- 515: 0x5167,
- 516: 0x5169,
- 517: 0x516A,
- 518: 0x516F,
- 519: 0x5172,
- 520: 0x517A,
- 521: 0x517E,
- 522: 0x517F,
- 523: 0x5183,
- 524: 0x5184,
- 525: 0x5186,
- 526: 0x5187,
- 527: 0x518A,
- 528: 0x518B,
- 529: 0x518E,
- 530: 0x518F,
- 531: 0x5190,
- 532: 0x5191,
- 533: 0x5193,
- 534: 0x5194,
- 535: 0x5198,
- 536: 0x519A,
- 537: 0x519D,
- 538: 0x519E,
- 539: 0x519F,
- 540: 0x51A1,
- 541: 0x51A3,
- 542: 0x51A6,
- 543: 0x51A7,
- 544: 0x51A8,
- 545: 0x51A9,
- 546: 0x51AA,
- 547: 0x51AD,
- 548: 0x51AE,
- 549: 0x51B4,
- 550: 0x51B8,
- 551: 0x51B9,
- 552: 0x51BA,
- 553: 0x51BE,
- 554: 0x51BF,
- 555: 0x51C1,
- 556: 0x51C2,
- 557: 0x51C3,
- 558: 0x51C5,
- 559: 0x51C8,
- 560: 0x51CA,
- 561: 0x51CD,
- 562: 0x51CE,
- 563: 0x51D0,
- 564: 0x51D2,
- 565: 0x51D3,
- 566: 0x51D4,
- 567: 0x51D5,
- 568: 0x51D6,
- 569: 0x51D7,
- 570: 0x51D8,
- 571: 0x51D9,
- 572: 0x51DA,
- 573: 0x51DC,
- 574: 0x51DE,
- 575: 0x51DF,
- 576: 0x51E2,
- 577: 0x51E3,
- 578: 0x51E5,
- 579: 0x51E6,
- 580: 0x51E7,
- 581: 0x51E8,
- 582: 0x51E9,
- 583: 0x51EA,
- 584: 0x51EC,
- 585: 0x51EE,
- 586: 0x51F1,
- 587: 0x51F2,
- 588: 0x51F4,
- 589: 0x51F7,
- 590: 0x51FE,
- 591: 0x5204,
- 592: 0x5205,
- 593: 0x5209,
- 594: 0x520B,
- 595: 0x520C,
- 596: 0x520F,
- 597: 0x5210,
- 598: 0x5213,
- 599: 0x5214,
- 600: 0x5215,
- 601: 0x521C,
- 602: 0x521E,
- 603: 0x521F,
- 604: 0x5221,
- 605: 0x5222,
- 606: 0x5223,
- 607: 0x5225,
- 608: 0x5226,
- 609: 0x5227,
- 610: 0x522A,
- 611: 0x522C,
- 612: 0x522F,
- 613: 0x5231,
- 614: 0x5232,
- 615: 0x5234,
- 616: 0x5235,
- 617: 0x523C,
- 618: 0x523E,
- 619: 0x5244,
- 620: 0x5245,
- 621: 0x5246,
- 622: 0x5247,
- 623: 0x5248,
- 624: 0x5249,
- 625: 0x524B,
- 626: 0x524E,
- 627: 0x524F,
- 628: 0x5252,
- 629: 0x5253,
- 630: 0x5255,
- 631: 0x5257,
- 632: 0x5258,
- 633: 0x5259,
- 634: 0x525A,
- 635: 0x525B,
- 636: 0x525D,
- 637: 0x525F,
- 638: 0x5260,
- 639: 0x5262,
- 640: 0x5263,
- 641: 0x5264,
- 642: 0x5266,
- 643: 0x5268,
- 644: 0x526B,
- 645: 0x526C,
- 646: 0x526D,
- 647: 0x526E,
- 648: 0x5270,
- 649: 0x5271,
- 650: 0x5273,
- 651: 0x5274,
- 652: 0x5275,
- 653: 0x5276,
- 654: 0x5277,
- 655: 0x5278,
- 656: 0x5279,
- 657: 0x527A,
- 658: 0x527B,
- 659: 0x527C,
- 660: 0x527E,
- 661: 0x5280,
- 662: 0x5283,
- 663: 0x5284,
- 664: 0x5285,
- 665: 0x5286,
- 666: 0x5287,
- 667: 0x5289,
- 668: 0x528A,
- 669: 0x528B,
- 670: 0x528C,
- 671: 0x528D,
- 672: 0x528E,
- 673: 0x528F,
- 674: 0x5291,
- 675: 0x5292,
- 676: 0x5294,
- 677: 0x5295,
- 678: 0x5296,
- 679: 0x5297,
- 680: 0x5298,
- 681: 0x5299,
- 682: 0x529A,
- 683: 0x529C,
- 684: 0x52A4,
- 685: 0x52A5,
- 686: 0x52A6,
- 687: 0x52A7,
- 688: 0x52AE,
- 689: 0x52AF,
- 690: 0x52B0,
- 691: 0x52B4,
- 692: 0x52B5,
- 693: 0x52B6,
- 694: 0x52B7,
- 695: 0x52B8,
- 696: 0x52B9,
- 697: 0x52BA,
- 698: 0x52BB,
- 699: 0x52BC,
- 700: 0x52BD,
- 701: 0x52C0,
- 702: 0x52C1,
- 703: 0x52C2,
- 704: 0x52C4,
- 705: 0x52C5,
- 706: 0x52C6,
- 707: 0x52C8,
- 708: 0x52CA,
- 709: 0x52CC,
- 710: 0x52CD,
- 711: 0x52CE,
- 712: 0x52CF,
- 713: 0x52D1,
- 714: 0x52D3,
- 715: 0x52D4,
- 716: 0x52D5,
- 717: 0x52D7,
- 718: 0x52D9,
- 719: 0x52DA,
- 720: 0x52DB,
- 721: 0x52DC,
- 722: 0x52DD,
- 723: 0x52DE,
- 724: 0x52E0,
- 725: 0x52E1,
- 726: 0x52E2,
- 727: 0x52E3,
- 728: 0x52E5,
- 729: 0x52E6,
- 730: 0x52E7,
- 731: 0x52E8,
- 732: 0x52E9,
- 733: 0x52EA,
- 734: 0x52EB,
- 735: 0x52EC,
- 736: 0x52ED,
- 737: 0x52EE,
- 738: 0x52EF,
- 739: 0x52F1,
- 740: 0x52F2,
- 741: 0x52F3,
- 742: 0x52F4,
- 743: 0x52F5,
- 744: 0x52F6,
- 745: 0x52F7,
- 746: 0x52F8,
- 747: 0x52FB,
- 748: 0x52FC,
- 749: 0x52FD,
- 750: 0x5301,
- 751: 0x5302,
- 752: 0x5303,
- 753: 0x5304,
- 754: 0x5307,
- 755: 0x5309,
- 756: 0x530A,
- 757: 0x530B,
- 758: 0x530C,
- 759: 0x530E,
- 760: 0x5311,
- 761: 0x5312,
- 762: 0x5313,
- 763: 0x5314,
- 764: 0x5318,
- 765: 0x531B,
- 766: 0x531C,
- 767: 0x531E,
- 768: 0x531F,
- 769: 0x5322,
- 770: 0x5324,
- 771: 0x5325,
- 772: 0x5327,
- 773: 0x5328,
- 774: 0x5329,
- 775: 0x532B,
- 776: 0x532C,
- 777: 0x532D,
- 778: 0x532F,
- 779: 0x5330,
- 780: 0x5331,
- 781: 0x5332,
- 782: 0x5333,
- 783: 0x5334,
- 784: 0x5335,
- 785: 0x5336,
- 786: 0x5337,
- 787: 0x5338,
- 788: 0x533C,
- 789: 0x533D,
- 790: 0x5340,
- 791: 0x5342,
- 792: 0x5344,
- 793: 0x5346,
- 794: 0x534B,
- 795: 0x534C,
- 796: 0x534D,
- 797: 0x5350,
- 798: 0x5354,
- 799: 0x5358,
- 800: 0x5359,
- 801: 0x535B,
- 802: 0x535D,
- 803: 0x5365,
- 804: 0x5368,
- 805: 0x536A,
- 806: 0x536C,
- 807: 0x536D,
- 808: 0x5372,
- 809: 0x5376,
- 810: 0x5379,
- 811: 0x537B,
- 812: 0x537C,
- 813: 0x537D,
- 814: 0x537E,
- 815: 0x5380,
- 816: 0x5381,
- 817: 0x5383,
- 818: 0x5387,
- 819: 0x5388,
- 820: 0x538A,
- 821: 0x538E,
- 822: 0x538F,
- 823: 0x5390,
- 824: 0x5391,
- 825: 0x5392,
- 826: 0x5393,
- 827: 0x5394,
- 828: 0x5396,
- 829: 0x5397,
- 830: 0x5399,
- 831: 0x539B,
- 832: 0x539C,
- 833: 0x539E,
- 834: 0x53A0,
- 835: 0x53A1,
- 836: 0x53A4,
- 837: 0x53A7,
- 838: 0x53AA,
- 839: 0x53AB,
- 840: 0x53AC,
- 841: 0x53AD,
- 842: 0x53AF,
- 843: 0x53B0,
- 844: 0x53B1,
- 845: 0x53B2,
- 846: 0x53B3,
- 847: 0x53B4,
- 848: 0x53B5,
- 849: 0x53B7,
- 850: 0x53B8,
- 851: 0x53B9,
- 852: 0x53BA,
- 853: 0x53BC,
- 854: 0x53BD,
- 855: 0x53BE,
- 856: 0x53C0,
- 857: 0x53C3,
- 858: 0x53C4,
- 859: 0x53C5,
- 860: 0x53C6,
- 861: 0x53C7,
- 862: 0x53CE,
- 863: 0x53CF,
- 864: 0x53D0,
- 865: 0x53D2,
- 866: 0x53D3,
- 867: 0x53D5,
- 868: 0x53DA,
- 869: 0x53DC,
- 870: 0x53DD,
- 871: 0x53DE,
- 872: 0x53E1,
- 873: 0x53E2,
- 874: 0x53E7,
- 875: 0x53F4,
- 876: 0x53FA,
- 877: 0x53FE,
- 878: 0x53FF,
- 879: 0x5400,
- 880: 0x5402,
- 881: 0x5405,
- 882: 0x5407,
- 883: 0x540B,
- 884: 0x5414,
- 885: 0x5418,
- 886: 0x5419,
- 887: 0x541A,
- 888: 0x541C,
- 889: 0x5422,
- 890: 0x5424,
- 891: 0x5425,
- 892: 0x542A,
- 893: 0x5430,
- 894: 0x5433,
- 895: 0x5436,
- 896: 0x5437,
- 897: 0x543A,
- 898: 0x543D,
- 899: 0x543F,
- 900: 0x5441,
- 901: 0x5442,
- 902: 0x5444,
- 903: 0x5445,
- 904: 0x5447,
- 905: 0x5449,
- 906: 0x544C,
- 907: 0x544D,
- 908: 0x544E,
- 909: 0x544F,
- 910: 0x5451,
- 911: 0x545A,
- 912: 0x545D,
- 913: 0x545E,
- 914: 0x545F,
- 915: 0x5460,
- 916: 0x5461,
- 917: 0x5463,
- 918: 0x5465,
- 919: 0x5467,
- 920: 0x5469,
- 921: 0x546A,
- 922: 0x546B,
- 923: 0x546C,
- 924: 0x546D,
- 925: 0x546E,
- 926: 0x546F,
- 927: 0x5470,
- 928: 0x5474,
- 929: 0x5479,
- 930: 0x547A,
- 931: 0x547E,
- 932: 0x547F,
- 933: 0x5481,
- 934: 0x5483,
- 935: 0x5485,
- 936: 0x5487,
- 937: 0x5488,
- 938: 0x5489,
- 939: 0x548A,
- 940: 0x548D,
- 941: 0x5491,
- 942: 0x5493,
- 943: 0x5497,
- 944: 0x5498,
- 945: 0x549C,
- 946: 0x549E,
- 947: 0x549F,
- 948: 0x54A0,
- 949: 0x54A1,
- 950: 0x54A2,
- 951: 0x54A5,
- 952: 0x54AE,
- 953: 0x54B0,
- 954: 0x54B2,
- 955: 0x54B5,
- 956: 0x54B6,
- 957: 0x54B7,
- 958: 0x54B9,
- 959: 0x54BA,
- 960: 0x54BC,
- 961: 0x54BE,
- 962: 0x54C3,
- 963: 0x54C5,
- 964: 0x54CA,
- 965: 0x54CB,
- 966: 0x54D6,
- 967: 0x54D8,
- 968: 0x54DB,
- 969: 0x54E0,
- 970: 0x54E1,
- 971: 0x54E2,
- 972: 0x54E3,
- 973: 0x54E4,
- 974: 0x54EB,
- 975: 0x54EC,
- 976: 0x54EF,
- 977: 0x54F0,
- 978: 0x54F1,
- 979: 0x54F4,
- 980: 0x54F5,
- 981: 0x54F6,
- 982: 0x54F7,
- 983: 0x54F8,
- 984: 0x54F9,
- 985: 0x54FB,
- 986: 0x54FE,
- 987: 0x5500,
- 988: 0x5502,
- 989: 0x5503,
- 990: 0x5504,
- 991: 0x5505,
- 992: 0x5508,
- 993: 0x550A,
- 994: 0x550B,
- 995: 0x550C,
- 996: 0x550D,
- 997: 0x550E,
- 998: 0x5512,
- 999: 0x5513,
- 1000: 0x5515,
- 1001: 0x5516,
- 1002: 0x5517,
- 1003: 0x5518,
- 1004: 0x5519,
- 1005: 0x551A,
- 1006: 0x551C,
- 1007: 0x551D,
- 1008: 0x551E,
- 1009: 0x551F,
- 1010: 0x5521,
- 1011: 0x5525,
- 1012: 0x5526,
- 1013: 0x5528,
- 1014: 0x5529,
- 1015: 0x552B,
- 1016: 0x552D,
- 1017: 0x5532,
- 1018: 0x5534,
- 1019: 0x5535,
- 1020: 0x5536,
- 1021: 0x5538,
- 1022: 0x5539,
- 1023: 0x553A,
- 1024: 0x553B,
- 1025: 0x553D,
- 1026: 0x5540,
- 1027: 0x5542,
- 1028: 0x5545,
- 1029: 0x5547,
- 1030: 0x5548,
- 1031: 0x554B,
- 1032: 0x554C,
- 1033: 0x554D,
- 1034: 0x554E,
- 1035: 0x554F,
- 1036: 0x5551,
- 1037: 0x5552,
- 1038: 0x5553,
- 1039: 0x5554,
- 1040: 0x5557,
- 1041: 0x5558,
- 1042: 0x5559,
- 1043: 0x555A,
- 1044: 0x555B,
- 1045: 0x555D,
- 1046: 0x555E,
- 1047: 0x555F,
- 1048: 0x5560,
- 1049: 0x5562,
- 1050: 0x5563,
- 1051: 0x5568,
- 1052: 0x5569,
- 1053: 0x556B,
- 1054: 0x556F,
- 1055: 0x5570,
- 1056: 0x5571,
- 1057: 0x5572,
- 1058: 0x5573,
- 1059: 0x5574,
- 1060: 0x5579,
- 1061: 0x557A,
- 1062: 0x557D,
- 1063: 0x557F,
- 1064: 0x5585,
- 1065: 0x5586,
- 1066: 0x558C,
- 1067: 0x558D,
- 1068: 0x558E,
- 1069: 0x5590,
- 1070: 0x5592,
- 1071: 0x5593,
- 1072: 0x5595,
- 1073: 0x5596,
- 1074: 0x5597,
- 1075: 0x559A,
- 1076: 0x559B,
- 1077: 0x559E,
- 1078: 0x55A0,
- 1079: 0x55A1,
- 1080: 0x55A2,
- 1081: 0x55A3,
- 1082: 0x55A4,
- 1083: 0x55A5,
- 1084: 0x55A6,
- 1085: 0x55A8,
- 1086: 0x55A9,
- 1087: 0x55AA,
- 1088: 0x55AB,
- 1089: 0x55AC,
- 1090: 0x55AD,
- 1091: 0x55AE,
- 1092: 0x55AF,
- 1093: 0x55B0,
- 1094: 0x55B2,
- 1095: 0x55B4,
- 1096: 0x55B6,
- 1097: 0x55B8,
- 1098: 0x55BA,
- 1099: 0x55BC,
- 1100: 0x55BF,
- 1101: 0x55C0,
- 1102: 0x55C1,
- 1103: 0x55C2,
- 1104: 0x55C3,
- 1105: 0x55C6,
- 1106: 0x55C7,
- 1107: 0x55C8,
- 1108: 0x55CA,
- 1109: 0x55CB,
- 1110: 0x55CE,
- 1111: 0x55CF,
- 1112: 0x55D0,
- 1113: 0x55D5,
- 1114: 0x55D7,
- 1115: 0x55D8,
- 1116: 0x55D9,
- 1117: 0x55DA,
- 1118: 0x55DB,
- 1119: 0x55DE,
- 1120: 0x55E0,
- 1121: 0x55E2,
- 1122: 0x55E7,
- 1123: 0x55E9,
- 1124: 0x55ED,
- 1125: 0x55EE,
- 1126: 0x55F0,
- 1127: 0x55F1,
- 1128: 0x55F4,
- 1129: 0x55F6,
- 1130: 0x55F8,
- 1131: 0x55F9,
- 1132: 0x55FA,
- 1133: 0x55FB,
- 1134: 0x55FC,
- 1135: 0x55FF,
- 1136: 0x5602,
- 1137: 0x5603,
- 1138: 0x5604,
- 1139: 0x5605,
- 1140: 0x5606,
- 1141: 0x5607,
- 1142: 0x560A,
- 1143: 0x560B,
- 1144: 0x560D,
- 1145: 0x5610,
- 1146: 0x5611,
- 1147: 0x5612,
- 1148: 0x5613,
- 1149: 0x5614,
- 1150: 0x5615,
- 1151: 0x5616,
- 1152: 0x5617,
- 1153: 0x5619,
- 1154: 0x561A,
- 1155: 0x561C,
- 1156: 0x561D,
- 1157: 0x5620,
- 1158: 0x5621,
- 1159: 0x5622,
- 1160: 0x5625,
- 1161: 0x5626,
- 1162: 0x5628,
- 1163: 0x5629,
- 1164: 0x562A,
- 1165: 0x562B,
- 1166: 0x562E,
- 1167: 0x562F,
- 1168: 0x5630,
- 1169: 0x5633,
- 1170: 0x5635,
- 1171: 0x5637,
- 1172: 0x5638,
- 1173: 0x563A,
- 1174: 0x563C,
- 1175: 0x563D,
- 1176: 0x563E,
- 1177: 0x5640,
- 1178: 0x5641,
- 1179: 0x5642,
- 1180: 0x5643,
- 1181: 0x5644,
- 1182: 0x5645,
- 1183: 0x5646,
- 1184: 0x5647,
- 1185: 0x5648,
- 1186: 0x5649,
- 1187: 0x564A,
- 1188: 0x564B,
- 1189: 0x564F,
- 1190: 0x5650,
- 1191: 0x5651,
- 1192: 0x5652,
- 1193: 0x5653,
- 1194: 0x5655,
- 1195: 0x5656,
- 1196: 0x565A,
- 1197: 0x565B,
- 1198: 0x565D,
- 1199: 0x565E,
- 1200: 0x565F,
- 1201: 0x5660,
- 1202: 0x5661,
- 1203: 0x5663,
- 1204: 0x5665,
- 1205: 0x5666,
- 1206: 0x5667,
- 1207: 0x566D,
- 1208: 0x566E,
- 1209: 0x566F,
- 1210: 0x5670,
- 1211: 0x5672,
- 1212: 0x5673,
- 1213: 0x5674,
- 1214: 0x5675,
- 1215: 0x5677,
- 1216: 0x5678,
- 1217: 0x5679,
- 1218: 0x567A,
- 1219: 0x567D,
- 1220: 0x567E,
- 1221: 0x567F,
- 1222: 0x5680,
- 1223: 0x5681,
- 1224: 0x5682,
- 1225: 0x5683,
- 1226: 0x5684,
- 1227: 0x5687,
- 1228: 0x5688,
- 1229: 0x5689,
- 1230: 0x568A,
- 1231: 0x568B,
- 1232: 0x568C,
- 1233: 0x568D,
- 1234: 0x5690,
- 1235: 0x5691,
- 1236: 0x5692,
- 1237: 0x5694,
- 1238: 0x5695,
- 1239: 0x5696,
- 1240: 0x5697,
- 1241: 0x5698,
- 1242: 0x5699,
- 1243: 0x569A,
- 1244: 0x569B,
- 1245: 0x569C,
- 1246: 0x569D,
- 1247: 0x569E,
- 1248: 0x569F,
- 1249: 0x56A0,
- 1250: 0x56A1,
- 1251: 0x56A2,
- 1252: 0x56A4,
- 1253: 0x56A5,
- 1254: 0x56A6,
- 1255: 0x56A7,
- 1256: 0x56A8,
- 1257: 0x56A9,
- 1258: 0x56AA,
- 1259: 0x56AB,
- 1260: 0x56AC,
- 1261: 0x56AD,
- 1262: 0x56AE,
- 1263: 0x56B0,
- 1264: 0x56B1,
- 1265: 0x56B2,
- 1266: 0x56B3,
- 1267: 0x56B4,
- 1268: 0x56B5,
- 1269: 0x56B6,
- 1270: 0x56B8,
- 1271: 0x56B9,
- 1272: 0x56BA,
- 1273: 0x56BB,
- 1274: 0x56BD,
- 1275: 0x56BE,
- 1276: 0x56BF,
- 1277: 0x56C0,
- 1278: 0x56C1,
- 1279: 0x56C2,
- 1280: 0x56C3,
- 1281: 0x56C4,
- 1282: 0x56C5,
- 1283: 0x56C6,
- 1284: 0x56C7,
- 1285: 0x56C8,
- 1286: 0x56C9,
- 1287: 0x56CB,
- 1288: 0x56CC,
- 1289: 0x56CD,
- 1290: 0x56CE,
- 1291: 0x56CF,
- 1292: 0x56D0,
- 1293: 0x56D1,
- 1294: 0x56D2,
- 1295: 0x56D3,
- 1296: 0x56D5,
- 1297: 0x56D6,
- 1298: 0x56D8,
- 1299: 0x56D9,
- 1300: 0x56DC,
- 1301: 0x56E3,
- 1302: 0x56E5,
- 1303: 0x56E6,
- 1304: 0x56E7,
- 1305: 0x56E8,
- 1306: 0x56E9,
- 1307: 0x56EA,
- 1308: 0x56EC,
- 1309: 0x56EE,
- 1310: 0x56EF,
- 1311: 0x56F2,
- 1312: 0x56F3,
- 1313: 0x56F6,
- 1314: 0x56F7,
- 1315: 0x56F8,
- 1316: 0x56FB,
- 1317: 0x56FC,
- 1318: 0x5700,
- 1319: 0x5701,
- 1320: 0x5702,
- 1321: 0x5705,
- 1322: 0x5707,
- 1323: 0x570B,
- 1324: 0x570C,
- 1325: 0x570D,
- 1326: 0x570E,
- 1327: 0x570F,
- 1328: 0x5710,
- 1329: 0x5711,
- 1330: 0x5712,
- 1331: 0x5713,
- 1332: 0x5714,
- 1333: 0x5715,
- 1334: 0x5716,
- 1335: 0x5717,
- 1336: 0x5718,
- 1337: 0x5719,
- 1338: 0x571A,
- 1339: 0x571B,
- 1340: 0x571D,
- 1341: 0x571E,
- 1342: 0x5720,
- 1343: 0x5721,
- 1344: 0x5722,
- 1345: 0x5724,
- 1346: 0x5725,
- 1347: 0x5726,
- 1348: 0x5727,
- 1349: 0x572B,
- 1350: 0x5731,
- 1351: 0x5732,
- 1352: 0x5734,
- 1353: 0x5735,
- 1354: 0x5736,
- 1355: 0x5737,
- 1356: 0x5738,
- 1357: 0x573C,
- 1358: 0x573D,
- 1359: 0x573F,
- 1360: 0x5741,
- 1361: 0x5743,
- 1362: 0x5744,
- 1363: 0x5745,
- 1364: 0x5746,
- 1365: 0x5748,
- 1366: 0x5749,
- 1367: 0x574B,
- 1368: 0x5752,
- 1369: 0x5753,
- 1370: 0x5754,
- 1371: 0x5755,
- 1372: 0x5756,
- 1373: 0x5758,
- 1374: 0x5759,
- 1375: 0x5762,
- 1376: 0x5763,
- 1377: 0x5765,
- 1378: 0x5767,
- 1379: 0x576C,
- 1380: 0x576E,
- 1381: 0x5770,
- 1382: 0x5771,
- 1383: 0x5772,
- 1384: 0x5774,
- 1385: 0x5775,
- 1386: 0x5778,
- 1387: 0x5779,
- 1388: 0x577A,
- 1389: 0x577D,
- 1390: 0x577E,
- 1391: 0x577F,
- 1392: 0x5780,
- 1393: 0x5781,
- 1394: 0x5787,
- 1395: 0x5788,
- 1396: 0x5789,
- 1397: 0x578A,
- 1398: 0x578D,
- 1399: 0x578E,
- 1400: 0x578F,
- 1401: 0x5790,
- 1402: 0x5791,
- 1403: 0x5794,
- 1404: 0x5795,
- 1405: 0x5796,
- 1406: 0x5797,
- 1407: 0x5798,
- 1408: 0x5799,
- 1409: 0x579A,
- 1410: 0x579C,
- 1411: 0x579D,
- 1412: 0x579E,
- 1413: 0x579F,
- 1414: 0x57A5,
- 1415: 0x57A8,
- 1416: 0x57AA,
- 1417: 0x57AC,
- 1418: 0x57AF,
- 1419: 0x57B0,
- 1420: 0x57B1,
- 1421: 0x57B3,
- 1422: 0x57B5,
- 1423: 0x57B6,
- 1424: 0x57B7,
- 1425: 0x57B9,
- 1426: 0x57BA,
- 1427: 0x57BB,
- 1428: 0x57BC,
- 1429: 0x57BD,
- 1430: 0x57BE,
- 1431: 0x57BF,
- 1432: 0x57C0,
- 1433: 0x57C1,
- 1434: 0x57C4,
- 1435: 0x57C5,
- 1436: 0x57C6,
- 1437: 0x57C7,
- 1438: 0x57C8,
- 1439: 0x57C9,
- 1440: 0x57CA,
- 1441: 0x57CC,
- 1442: 0x57CD,
- 1443: 0x57D0,
- 1444: 0x57D1,
- 1445: 0x57D3,
- 1446: 0x57D6,
- 1447: 0x57D7,
- 1448: 0x57DB,
- 1449: 0x57DC,
- 1450: 0x57DE,
- 1451: 0x57E1,
- 1452: 0x57E2,
- 1453: 0x57E3,
- 1454: 0x57E5,
- 1455: 0x57E6,
- 1456: 0x57E7,
- 1457: 0x57E8,
- 1458: 0x57E9,
- 1459: 0x57EA,
- 1460: 0x57EB,
- 1461: 0x57EC,
- 1462: 0x57EE,
- 1463: 0x57F0,
- 1464: 0x57F1,
- 1465: 0x57F2,
- 1466: 0x57F3,
- 1467: 0x57F5,
- 1468: 0x57F6,
- 1469: 0x57F7,
- 1470: 0x57FB,
- 1471: 0x57FC,
- 1472: 0x57FE,
- 1473: 0x57FF,
- 1474: 0x5801,
- 1475: 0x5803,
- 1476: 0x5804,
- 1477: 0x5805,
- 1478: 0x5808,
- 1479: 0x5809,
- 1480: 0x580A,
- 1481: 0x580C,
- 1482: 0x580E,
- 1483: 0x580F,
- 1484: 0x5810,
- 1485: 0x5812,
- 1486: 0x5813,
- 1487: 0x5814,
- 1488: 0x5816,
- 1489: 0x5817,
- 1490: 0x5818,
- 1491: 0x581A,
- 1492: 0x581B,
- 1493: 0x581C,
- 1494: 0x581D,
- 1495: 0x581F,
- 1496: 0x5822,
- 1497: 0x5823,
- 1498: 0x5825,
- 1499: 0x5826,
- 1500: 0x5827,
- 1501: 0x5828,
- 1502: 0x5829,
- 1503: 0x582B,
- 1504: 0x582C,
- 1505: 0x582D,
- 1506: 0x582E,
- 1507: 0x582F,
- 1508: 0x5831,
- 1509: 0x5832,
- 1510: 0x5833,
- 1511: 0x5834,
- 1512: 0x5836,
- 1513: 0x5837,
- 1514: 0x5838,
- 1515: 0x5839,
- 1516: 0x583A,
- 1517: 0x583B,
- 1518: 0x583C,
- 1519: 0x583D,
- 1520: 0x583E,
- 1521: 0x583F,
- 1522: 0x5840,
- 1523: 0x5841,
- 1524: 0x5842,
- 1525: 0x5843,
- 1526: 0x5845,
- 1527: 0x5846,
- 1528: 0x5847,
- 1529: 0x5848,
- 1530: 0x5849,
- 1531: 0x584A,
- 1532: 0x584B,
- 1533: 0x584E,
- 1534: 0x584F,
- 1535: 0x5850,
- 1536: 0x5852,
- 1537: 0x5853,
- 1538: 0x5855,
- 1539: 0x5856,
- 1540: 0x5857,
- 1541: 0x5859,
- 1542: 0x585A,
- 1543: 0x585B,
- 1544: 0x585C,
- 1545: 0x585D,
- 1546: 0x585F,
- 1547: 0x5860,
- 1548: 0x5861,
- 1549: 0x5862,
- 1550: 0x5863,
- 1551: 0x5864,
- 1552: 0x5866,
- 1553: 0x5867,
- 1554: 0x5868,
- 1555: 0x5869,
- 1556: 0x586A,
- 1557: 0x586D,
- 1558: 0x586E,
- 1559: 0x586F,
- 1560: 0x5870,
- 1561: 0x5871,
- 1562: 0x5872,
- 1563: 0x5873,
- 1564: 0x5874,
- 1565: 0x5875,
- 1566: 0x5876,
- 1567: 0x5877,
- 1568: 0x5878,
- 1569: 0x5879,
- 1570: 0x587A,
- 1571: 0x587B,
- 1572: 0x587C,
- 1573: 0x587D,
- 1574: 0x587F,
- 1575: 0x5882,
- 1576: 0x5884,
- 1577: 0x5886,
- 1578: 0x5887,
- 1579: 0x5888,
- 1580: 0x588A,
- 1581: 0x588B,
- 1582: 0x588C,
- 1583: 0x588D,
- 1584: 0x588E,
- 1585: 0x588F,
- 1586: 0x5890,
- 1587: 0x5891,
- 1588: 0x5894,
- 1589: 0x5895,
- 1590: 0x5896,
- 1591: 0x5897,
- 1592: 0x5898,
- 1593: 0x589B,
- 1594: 0x589C,
- 1595: 0x589D,
- 1596: 0x58A0,
- 1597: 0x58A1,
- 1598: 0x58A2,
- 1599: 0x58A3,
- 1600: 0x58A4,
- 1601: 0x58A5,
- 1602: 0x58A6,
- 1603: 0x58A7,
- 1604: 0x58AA,
- 1605: 0x58AB,
- 1606: 0x58AC,
- 1607: 0x58AD,
- 1608: 0x58AE,
- 1609: 0x58AF,
- 1610: 0x58B0,
- 1611: 0x58B1,
- 1612: 0x58B2,
- 1613: 0x58B3,
- 1614: 0x58B4,
- 1615: 0x58B5,
- 1616: 0x58B6,
- 1617: 0x58B7,
- 1618: 0x58B8,
- 1619: 0x58B9,
- 1620: 0x58BA,
- 1621: 0x58BB,
- 1622: 0x58BD,
- 1623: 0x58BE,
- 1624: 0x58BF,
- 1625: 0x58C0,
- 1626: 0x58C2,
- 1627: 0x58C3,
- 1628: 0x58C4,
- 1629: 0x58C6,
- 1630: 0x58C7,
- 1631: 0x58C8,
- 1632: 0x58C9,
- 1633: 0x58CA,
- 1634: 0x58CB,
- 1635: 0x58CC,
- 1636: 0x58CD,
- 1637: 0x58CE,
- 1638: 0x58CF,
- 1639: 0x58D0,
- 1640: 0x58D2,
- 1641: 0x58D3,
- 1642: 0x58D4,
- 1643: 0x58D6,
- 1644: 0x58D7,
- 1645: 0x58D8,
- 1646: 0x58D9,
- 1647: 0x58DA,
- 1648: 0x58DB,
- 1649: 0x58DC,
- 1650: 0x58DD,
- 1651: 0x58DE,
- 1652: 0x58DF,
- 1653: 0x58E0,
- 1654: 0x58E1,
- 1655: 0x58E2,
- 1656: 0x58E3,
- 1657: 0x58E5,
- 1658: 0x58E6,
- 1659: 0x58E7,
- 1660: 0x58E8,
- 1661: 0x58E9,
- 1662: 0x58EA,
- 1663: 0x58ED,
- 1664: 0x58EF,
- 1665: 0x58F1,
- 1666: 0x58F2,
- 1667: 0x58F4,
- 1668: 0x58F5,
- 1669: 0x58F7,
- 1670: 0x58F8,
- 1671: 0x58FA,
- 1672: 0x58FB,
- 1673: 0x58FC,
- 1674: 0x58FD,
- 1675: 0x58FE,
- 1676: 0x58FF,
- 1677: 0x5900,
- 1678: 0x5901,
- 1679: 0x5903,
- 1680: 0x5905,
- 1681: 0x5906,
- 1682: 0x5908,
- 1683: 0x5909,
- 1684: 0x590A,
- 1685: 0x590B,
- 1686: 0x590C,
- 1687: 0x590E,
- 1688: 0x5910,
- 1689: 0x5911,
- 1690: 0x5912,
- 1691: 0x5913,
- 1692: 0x5917,
- 1693: 0x5918,
- 1694: 0x591B,
- 1695: 0x591D,
- 1696: 0x591E,
- 1697: 0x5920,
- 1698: 0x5921,
- 1699: 0x5922,
- 1700: 0x5923,
- 1701: 0x5926,
- 1702: 0x5928,
- 1703: 0x592C,
- 1704: 0x5930,
- 1705: 0x5932,
- 1706: 0x5933,
- 1707: 0x5935,
- 1708: 0x5936,
- 1709: 0x593B,
- 1710: 0x593D,
- 1711: 0x593E,
- 1712: 0x593F,
- 1713: 0x5940,
- 1714: 0x5943,
- 1715: 0x5945,
- 1716: 0x5946,
- 1717: 0x594A,
- 1718: 0x594C,
- 1719: 0x594D,
- 1720: 0x5950,
- 1721: 0x5952,
- 1722: 0x5953,
- 1723: 0x5959,
- 1724: 0x595B,
- 1725: 0x595C,
- 1726: 0x595D,
- 1727: 0x595E,
- 1728: 0x595F,
- 1729: 0x5961,
- 1730: 0x5963,
- 1731: 0x5964,
- 1732: 0x5966,
- 1733: 0x5967,
- 1734: 0x5968,
- 1735: 0x5969,
- 1736: 0x596A,
- 1737: 0x596B,
- 1738: 0x596C,
- 1739: 0x596D,
- 1740: 0x596E,
- 1741: 0x596F,
- 1742: 0x5970,
- 1743: 0x5971,
- 1744: 0x5972,
- 1745: 0x5975,
- 1746: 0x5977,
- 1747: 0x597A,
- 1748: 0x597B,
- 1749: 0x597C,
- 1750: 0x597E,
- 1751: 0x597F,
- 1752: 0x5980,
- 1753: 0x5985,
- 1754: 0x5989,
- 1755: 0x598B,
- 1756: 0x598C,
- 1757: 0x598E,
- 1758: 0x598F,
- 1759: 0x5990,
- 1760: 0x5991,
- 1761: 0x5994,
- 1762: 0x5995,
- 1763: 0x5998,
- 1764: 0x599A,
- 1765: 0x599B,
- 1766: 0x599C,
- 1767: 0x599D,
- 1768: 0x599F,
- 1769: 0x59A0,
- 1770: 0x59A1,
- 1771: 0x59A2,
- 1772: 0x59A6,
- 1773: 0x59A7,
- 1774: 0x59AC,
- 1775: 0x59AD,
- 1776: 0x59B0,
- 1777: 0x59B1,
- 1778: 0x59B3,
- 1779: 0x59B4,
- 1780: 0x59B5,
- 1781: 0x59B6,
- 1782: 0x59B7,
- 1783: 0x59B8,
- 1784: 0x59BA,
- 1785: 0x59BC,
- 1786: 0x59BD,
- 1787: 0x59BF,
- 1788: 0x59C0,
- 1789: 0x59C1,
- 1790: 0x59C2,
- 1791: 0x59C3,
- 1792: 0x59C4,
- 1793: 0x59C5,
- 1794: 0x59C7,
- 1795: 0x59C8,
- 1796: 0x59C9,
- 1797: 0x59CC,
- 1798: 0x59CD,
- 1799: 0x59CE,
- 1800: 0x59CF,
- 1801: 0x59D5,
- 1802: 0x59D6,
- 1803: 0x59D9,
- 1804: 0x59DB,
- 1805: 0x59DE,
- 1806: 0x59DF,
- 1807: 0x59E0,
- 1808: 0x59E1,
- 1809: 0x59E2,
- 1810: 0x59E4,
- 1811: 0x59E6,
- 1812: 0x59E7,
- 1813: 0x59E9,
- 1814: 0x59EA,
- 1815: 0x59EB,
- 1816: 0x59ED,
- 1817: 0x59EE,
- 1818: 0x59EF,
- 1819: 0x59F0,
- 1820: 0x59F1,
- 1821: 0x59F2,
- 1822: 0x59F3,
- 1823: 0x59F4,
- 1824: 0x59F5,
- 1825: 0x59F6,
- 1826: 0x59F7,
- 1827: 0x59F8,
- 1828: 0x59FA,
- 1829: 0x59FC,
- 1830: 0x59FD,
- 1831: 0x59FE,
- 1832: 0x5A00,
- 1833: 0x5A02,
- 1834: 0x5A0A,
- 1835: 0x5A0B,
- 1836: 0x5A0D,
- 1837: 0x5A0E,
- 1838: 0x5A0F,
- 1839: 0x5A10,
- 1840: 0x5A12,
- 1841: 0x5A14,
- 1842: 0x5A15,
- 1843: 0x5A16,
- 1844: 0x5A17,
- 1845: 0x5A19,
- 1846: 0x5A1A,
- 1847: 0x5A1B,
- 1848: 0x5A1D,
- 1849: 0x5A1E,
- 1850: 0x5A21,
- 1851: 0x5A22,
- 1852: 0x5A24,
- 1853: 0x5A26,
- 1854: 0x5A27,
- 1855: 0x5A28,
- 1856: 0x5A2A,
- 1857: 0x5A2B,
- 1858: 0x5A2C,
- 1859: 0x5A2D,
- 1860: 0x5A2E,
- 1861: 0x5A2F,
- 1862: 0x5A30,
- 1863: 0x5A33,
- 1864: 0x5A35,
- 1865: 0x5A37,
- 1866: 0x5A38,
- 1867: 0x5A39,
- 1868: 0x5A3A,
- 1869: 0x5A3B,
- 1870: 0x5A3D,
- 1871: 0x5A3E,
- 1872: 0x5A3F,
- 1873: 0x5A41,
- 1874: 0x5A42,
- 1875: 0x5A43,
- 1876: 0x5A44,
- 1877: 0x5A45,
- 1878: 0x5A47,
- 1879: 0x5A48,
- 1880: 0x5A4B,
- 1881: 0x5A4C,
- 1882: 0x5A4D,
- 1883: 0x5A4E,
- 1884: 0x5A4F,
- 1885: 0x5A50,
- 1886: 0x5A51,
- 1887: 0x5A52,
- 1888: 0x5A53,
- 1889: 0x5A54,
- 1890: 0x5A56,
- 1891: 0x5A57,
- 1892: 0x5A58,
- 1893: 0x5A59,
- 1894: 0x5A5B,
- 1895: 0x5A5C,
- 1896: 0x5A5D,
- 1897: 0x5A5E,
- 1898: 0x5A5F,
- 1899: 0x5A60,
- 1900: 0x5A61,
- 1901: 0x5A63,
- 1902: 0x5A64,
- 1903: 0x5A65,
- 1904: 0x5A66,
- 1905: 0x5A68,
- 1906: 0x5A69,
- 1907: 0x5A6B,
- 1908: 0x5A6C,
- 1909: 0x5A6D,
- 1910: 0x5A6E,
- 1911: 0x5A6F,
- 1912: 0x5A70,
- 1913: 0x5A71,
- 1914: 0x5A72,
- 1915: 0x5A73,
- 1916: 0x5A78,
- 1917: 0x5A79,
- 1918: 0x5A7B,
- 1919: 0x5A7C,
- 1920: 0x5A7D,
- 1921: 0x5A7E,
- 1922: 0x5A80,
- 1923: 0x5A81,
- 1924: 0x5A82,
- 1925: 0x5A83,
- 1926: 0x5A84,
- 1927: 0x5A85,
- 1928: 0x5A86,
- 1929: 0x5A87,
- 1930: 0x5A88,
- 1931: 0x5A89,
- 1932: 0x5A8A,
- 1933: 0x5A8B,
- 1934: 0x5A8C,
- 1935: 0x5A8D,
- 1936: 0x5A8E,
- 1937: 0x5A8F,
- 1938: 0x5A90,
- 1939: 0x5A91,
- 1940: 0x5A93,
- 1941: 0x5A94,
- 1942: 0x5A95,
- 1943: 0x5A96,
- 1944: 0x5A97,
- 1945: 0x5A98,
- 1946: 0x5A99,
- 1947: 0x5A9C,
- 1948: 0x5A9D,
- 1949: 0x5A9E,
- 1950: 0x5A9F,
- 1951: 0x5AA0,
- 1952: 0x5AA1,
- 1953: 0x5AA2,
- 1954: 0x5AA3,
- 1955: 0x5AA4,
- 1956: 0x5AA5,
- 1957: 0x5AA6,
- 1958: 0x5AA7,
- 1959: 0x5AA8,
- 1960: 0x5AA9,
- 1961: 0x5AAB,
- 1962: 0x5AAC,
- 1963: 0x5AAD,
- 1964: 0x5AAE,
- 1965: 0x5AAF,
- 1966: 0x5AB0,
- 1967: 0x5AB1,
- 1968: 0x5AB4,
- 1969: 0x5AB6,
- 1970: 0x5AB7,
- 1971: 0x5AB9,
- 1972: 0x5ABA,
- 1973: 0x5ABB,
- 1974: 0x5ABC,
- 1975: 0x5ABD,
- 1976: 0x5ABF,
- 1977: 0x5AC0,
- 1978: 0x5AC3,
- 1979: 0x5AC4,
- 1980: 0x5AC5,
- 1981: 0x5AC6,
- 1982: 0x5AC7,
- 1983: 0x5AC8,
- 1984: 0x5ACA,
- 1985: 0x5ACB,
- 1986: 0x5ACD,
- 1987: 0x5ACE,
- 1988: 0x5ACF,
- 1989: 0x5AD0,
- 1990: 0x5AD1,
- 1991: 0x5AD3,
- 1992: 0x5AD5,
- 1993: 0x5AD7,
- 1994: 0x5AD9,
- 1995: 0x5ADA,
- 1996: 0x5ADB,
- 1997: 0x5ADD,
- 1998: 0x5ADE,
- 1999: 0x5ADF,
- 2000: 0x5AE2,
- 2001: 0x5AE4,
- 2002: 0x5AE5,
- 2003: 0x5AE7,
- 2004: 0x5AE8,
- 2005: 0x5AEA,
- 2006: 0x5AEC,
- 2007: 0x5AED,
- 2008: 0x5AEE,
- 2009: 0x5AEF,
- 2010: 0x5AF0,
- 2011: 0x5AF2,
- 2012: 0x5AF3,
- 2013: 0x5AF4,
- 2014: 0x5AF5,
- 2015: 0x5AF6,
- 2016: 0x5AF7,
- 2017: 0x5AF8,
- 2018: 0x5AF9,
- 2019: 0x5AFA,
- 2020: 0x5AFB,
- 2021: 0x5AFC,
- 2022: 0x5AFD,
- 2023: 0x5AFE,
- 2024: 0x5AFF,
- 2025: 0x5B00,
- 2026: 0x5B01,
- 2027: 0x5B02,
- 2028: 0x5B03,
- 2029: 0x5B04,
- 2030: 0x5B05,
- 2031: 0x5B06,
- 2032: 0x5B07,
- 2033: 0x5B08,
- 2034: 0x5B0A,
- 2035: 0x5B0B,
- 2036: 0x5B0C,
- 2037: 0x5B0D,
- 2038: 0x5B0E,
- 2039: 0x5B0F,
- 2040: 0x5B10,
- 2041: 0x5B11,
- 2042: 0x5B12,
- 2043: 0x5B13,
- 2044: 0x5B14,
- 2045: 0x5B15,
- 2046: 0x5B18,
- 2047: 0x5B19,
- 2048: 0x5B1A,
- 2049: 0x5B1B,
- 2050: 0x5B1C,
- 2051: 0x5B1D,
- 2052: 0x5B1E,
- 2053: 0x5B1F,
- 2054: 0x5B20,
- 2055: 0x5B21,
- 2056: 0x5B22,
- 2057: 0x5B23,
- 2058: 0x5B24,
- 2059: 0x5B25,
- 2060: 0x5B26,
- 2061: 0x5B27,
- 2062: 0x5B28,
- 2063: 0x5B29,
- 2064: 0x5B2A,
- 2065: 0x5B2B,
- 2066: 0x5B2C,
- 2067: 0x5B2D,
- 2068: 0x5B2E,
- 2069: 0x5B2F,
- 2070: 0x5B30,
- 2071: 0x5B31,
- 2072: 0x5B33,
- 2073: 0x5B35,
- 2074: 0x5B36,
- 2075: 0x5B38,
- 2076: 0x5B39,
- 2077: 0x5B3A,
- 2078: 0x5B3B,
- 2079: 0x5B3C,
- 2080: 0x5B3D,
- 2081: 0x5B3E,
- 2082: 0x5B3F,
- 2083: 0x5B41,
- 2084: 0x5B42,
- 2085: 0x5B43,
- 2086: 0x5B44,
- 2087: 0x5B45,
- 2088: 0x5B46,
- 2089: 0x5B47,
- 2090: 0x5B48,
- 2091: 0x5B49,
- 2092: 0x5B4A,
- 2093: 0x5B4B,
- 2094: 0x5B4C,
- 2095: 0x5B4D,
- 2096: 0x5B4E,
- 2097: 0x5B4F,
- 2098: 0x5B52,
- 2099: 0x5B56,
- 2100: 0x5B5E,
- 2101: 0x5B60,
- 2102: 0x5B61,
- 2103: 0x5B67,
- 2104: 0x5B68,
- 2105: 0x5B6B,
- 2106: 0x5B6D,
- 2107: 0x5B6E,
- 2108: 0x5B6F,
- 2109: 0x5B72,
- 2110: 0x5B74,
- 2111: 0x5B76,
- 2112: 0x5B77,
- 2113: 0x5B78,
- 2114: 0x5B79,
- 2115: 0x5B7B,
- 2116: 0x5B7C,
- 2117: 0x5B7E,
- 2118: 0x5B7F,
- 2119: 0x5B82,
- 2120: 0x5B86,
- 2121: 0x5B8A,
- 2122: 0x5B8D,
- 2123: 0x5B8E,
- 2124: 0x5B90,
- 2125: 0x5B91,
- 2126: 0x5B92,
- 2127: 0x5B94,
- 2128: 0x5B96,
- 2129: 0x5B9F,
- 2130: 0x5BA7,
- 2131: 0x5BA8,
- 2132: 0x5BA9,
- 2133: 0x5BAC,
- 2134: 0x5BAD,
- 2135: 0x5BAE,
- 2136: 0x5BAF,
- 2137: 0x5BB1,
- 2138: 0x5BB2,
- 2139: 0x5BB7,
- 2140: 0x5BBA,
- 2141: 0x5BBB,
- 2142: 0x5BBC,
- 2143: 0x5BC0,
- 2144: 0x5BC1,
- 2145: 0x5BC3,
- 2146: 0x5BC8,
- 2147: 0x5BC9,
- 2148: 0x5BCA,
- 2149: 0x5BCB,
- 2150: 0x5BCD,
- 2151: 0x5BCE,
- 2152: 0x5BCF,
- 2153: 0x5BD1,
- 2154: 0x5BD4,
- 2155: 0x5BD5,
- 2156: 0x5BD6,
- 2157: 0x5BD7,
- 2158: 0x5BD8,
- 2159: 0x5BD9,
- 2160: 0x5BDA,
- 2161: 0x5BDB,
- 2162: 0x5BDC,
- 2163: 0x5BE0,
- 2164: 0x5BE2,
- 2165: 0x5BE3,
- 2166: 0x5BE6,
- 2167: 0x5BE7,
- 2168: 0x5BE9,
- 2169: 0x5BEA,
- 2170: 0x5BEB,
- 2171: 0x5BEC,
- 2172: 0x5BED,
- 2173: 0x5BEF,
- 2174: 0x5BF1,
- 2175: 0x5BF2,
- 2176: 0x5BF3,
- 2177: 0x5BF4,
- 2178: 0x5BF5,
- 2179: 0x5BF6,
- 2180: 0x5BF7,
- 2181: 0x5BFD,
- 2182: 0x5BFE,
- 2183: 0x5C00,
- 2184: 0x5C02,
- 2185: 0x5C03,
- 2186: 0x5C05,
- 2187: 0x5C07,
- 2188: 0x5C08,
- 2189: 0x5C0B,
- 2190: 0x5C0C,
- 2191: 0x5C0D,
- 2192: 0x5C0E,
- 2193: 0x5C10,
- 2194: 0x5C12,
- 2195: 0x5C13,
- 2196: 0x5C17,
- 2197: 0x5C19,
- 2198: 0x5C1B,
- 2199: 0x5C1E,
- 2200: 0x5C1F,
- 2201: 0x5C20,
- 2202: 0x5C21,
- 2203: 0x5C23,
- 2204: 0x5C26,
- 2205: 0x5C28,
- 2206: 0x5C29,
- 2207: 0x5C2A,
- 2208: 0x5C2B,
- 2209: 0x5C2D,
- 2210: 0x5C2E,
- 2211: 0x5C2F,
- 2212: 0x5C30,
- 2213: 0x5C32,
- 2214: 0x5C33,
- 2215: 0x5C35,
- 2216: 0x5C36,
- 2217: 0x5C37,
- 2218: 0x5C43,
- 2219: 0x5C44,
- 2220: 0x5C46,
- 2221: 0x5C47,
- 2222: 0x5C4C,
- 2223: 0x5C4D,
- 2224: 0x5C52,
- 2225: 0x5C53,
- 2226: 0x5C54,
- 2227: 0x5C56,
- 2228: 0x5C57,
- 2229: 0x5C58,
- 2230: 0x5C5A,
- 2231: 0x5C5B,
- 2232: 0x5C5C,
- 2233: 0x5C5D,
- 2234: 0x5C5F,
- 2235: 0x5C62,
- 2236: 0x5C64,
- 2237: 0x5C67,
- 2238: 0x5C68,
- 2239: 0x5C69,
- 2240: 0x5C6A,
- 2241: 0x5C6B,
- 2242: 0x5C6C,
- 2243: 0x5C6D,
- 2244: 0x5C70,
- 2245: 0x5C72,
- 2246: 0x5C73,
- 2247: 0x5C74,
- 2248: 0x5C75,
- 2249: 0x5C76,
- 2250: 0x5C77,
- 2251: 0x5C78,
- 2252: 0x5C7B,
- 2253: 0x5C7C,
- 2254: 0x5C7D,
- 2255: 0x5C7E,
- 2256: 0x5C80,
- 2257: 0x5C83,
- 2258: 0x5C84,
- 2259: 0x5C85,
- 2260: 0x5C86,
- 2261: 0x5C87,
- 2262: 0x5C89,
- 2263: 0x5C8A,
- 2264: 0x5C8B,
- 2265: 0x5C8E,
- 2266: 0x5C8F,
- 2267: 0x5C92,
- 2268: 0x5C93,
- 2269: 0x5C95,
- 2270: 0x5C9D,
- 2271: 0x5C9E,
- 2272: 0x5C9F,
- 2273: 0x5CA0,
- 2274: 0x5CA1,
- 2275: 0x5CA4,
- 2276: 0x5CA5,
- 2277: 0x5CA6,
- 2278: 0x5CA7,
- 2279: 0x5CA8,
- 2280: 0x5CAA,
- 2281: 0x5CAE,
- 2282: 0x5CAF,
- 2283: 0x5CB0,
- 2284: 0x5CB2,
- 2285: 0x5CB4,
- 2286: 0x5CB6,
- 2287: 0x5CB9,
- 2288: 0x5CBA,
- 2289: 0x5CBB,
- 2290: 0x5CBC,
- 2291: 0x5CBE,
- 2292: 0x5CC0,
- 2293: 0x5CC2,
- 2294: 0x5CC3,
- 2295: 0x5CC5,
- 2296: 0x5CC6,
- 2297: 0x5CC7,
- 2298: 0x5CC8,
- 2299: 0x5CC9,
- 2300: 0x5CCA,
- 2301: 0x5CCC,
- 2302: 0x5CCD,
- 2303: 0x5CCE,
- 2304: 0x5CCF,
- 2305: 0x5CD0,
- 2306: 0x5CD1,
- 2307: 0x5CD3,
- 2308: 0x5CD4,
- 2309: 0x5CD5,
- 2310: 0x5CD6,
- 2311: 0x5CD7,
- 2312: 0x5CD8,
- 2313: 0x5CDA,
- 2314: 0x5CDB,
- 2315: 0x5CDC,
- 2316: 0x5CDD,
- 2317: 0x5CDE,
- 2318: 0x5CDF,
- 2319: 0x5CE0,
- 2320: 0x5CE2,
- 2321: 0x5CE3,
- 2322: 0x5CE7,
- 2323: 0x5CE9,
- 2324: 0x5CEB,
- 2325: 0x5CEC,
- 2326: 0x5CEE,
- 2327: 0x5CEF,
- 2328: 0x5CF1,
- 2329: 0x5CF2,
- 2330: 0x5CF3,
- 2331: 0x5CF4,
- 2332: 0x5CF5,
- 2333: 0x5CF6,
- 2334: 0x5CF7,
- 2335: 0x5CF8,
- 2336: 0x5CF9,
- 2337: 0x5CFA,
- 2338: 0x5CFC,
- 2339: 0x5CFD,
- 2340: 0x5CFE,
- 2341: 0x5CFF,
- 2342: 0x5D00,
- 2343: 0x5D01,
- 2344: 0x5D04,
- 2345: 0x5D05,
- 2346: 0x5D08,
- 2347: 0x5D09,
- 2348: 0x5D0A,
- 2349: 0x5D0B,
- 2350: 0x5D0C,
- 2351: 0x5D0D,
- 2352: 0x5D0F,
- 2353: 0x5D10,
- 2354: 0x5D11,
- 2355: 0x5D12,
- 2356: 0x5D13,
- 2357: 0x5D15,
- 2358: 0x5D17,
- 2359: 0x5D18,
- 2360: 0x5D19,
- 2361: 0x5D1A,
- 2362: 0x5D1C,
- 2363: 0x5D1D,
- 2364: 0x5D1F,
- 2365: 0x5D20,
- 2366: 0x5D21,
- 2367: 0x5D22,
- 2368: 0x5D23,
- 2369: 0x5D25,
- 2370: 0x5D28,
- 2371: 0x5D2A,
- 2372: 0x5D2B,
- 2373: 0x5D2C,
- 2374: 0x5D2F,
- 2375: 0x5D30,
- 2376: 0x5D31,
- 2377: 0x5D32,
- 2378: 0x5D33,
- 2379: 0x5D35,
- 2380: 0x5D36,
- 2381: 0x5D37,
- 2382: 0x5D38,
- 2383: 0x5D39,
- 2384: 0x5D3A,
- 2385: 0x5D3B,
- 2386: 0x5D3C,
- 2387: 0x5D3F,
- 2388: 0x5D40,
- 2389: 0x5D41,
- 2390: 0x5D42,
- 2391: 0x5D43,
- 2392: 0x5D44,
- 2393: 0x5D45,
- 2394: 0x5D46,
- 2395: 0x5D48,
- 2396: 0x5D49,
- 2397: 0x5D4D,
- 2398: 0x5D4E,
- 2399: 0x5D4F,
- 2400: 0x5D50,
- 2401: 0x5D51,
- 2402: 0x5D52,
- 2403: 0x5D53,
- 2404: 0x5D54,
- 2405: 0x5D55,
- 2406: 0x5D56,
- 2407: 0x5D57,
- 2408: 0x5D59,
- 2409: 0x5D5A,
- 2410: 0x5D5C,
- 2411: 0x5D5E,
- 2412: 0x5D5F,
- 2413: 0x5D60,
- 2414: 0x5D61,
- 2415: 0x5D62,
- 2416: 0x5D63,
- 2417: 0x5D64,
- 2418: 0x5D65,
- 2419: 0x5D66,
- 2420: 0x5D67,
- 2421: 0x5D68,
- 2422: 0x5D6A,
- 2423: 0x5D6D,
- 2424: 0x5D6E,
- 2425: 0x5D70,
- 2426: 0x5D71,
- 2427: 0x5D72,
- 2428: 0x5D73,
- 2429: 0x5D75,
- 2430: 0x5D76,
- 2431: 0x5D77,
- 2432: 0x5D78,
- 2433: 0x5D79,
- 2434: 0x5D7A,
- 2435: 0x5D7B,
- 2436: 0x5D7C,
- 2437: 0x5D7D,
- 2438: 0x5D7E,
- 2439: 0x5D7F,
- 2440: 0x5D80,
- 2441: 0x5D81,
- 2442: 0x5D83,
- 2443: 0x5D84,
- 2444: 0x5D85,
- 2445: 0x5D86,
- 2446: 0x5D87,
- 2447: 0x5D88,
- 2448: 0x5D89,
- 2449: 0x5D8A,
- 2450: 0x5D8B,
- 2451: 0x5D8C,
- 2452: 0x5D8D,
- 2453: 0x5D8E,
- 2454: 0x5D8F,
- 2455: 0x5D90,
- 2456: 0x5D91,
- 2457: 0x5D92,
- 2458: 0x5D93,
- 2459: 0x5D94,
- 2460: 0x5D95,
- 2461: 0x5D96,
- 2462: 0x5D97,
- 2463: 0x5D98,
- 2464: 0x5D9A,
- 2465: 0x5D9B,
- 2466: 0x5D9C,
- 2467: 0x5D9E,
- 2468: 0x5D9F,
- 2469: 0x5DA0,
- 2470: 0x5DA1,
- 2471: 0x5DA2,
- 2472: 0x5DA3,
- 2473: 0x5DA4,
- 2474: 0x5DA5,
- 2475: 0x5DA6,
- 2476: 0x5DA7,
- 2477: 0x5DA8,
- 2478: 0x5DA9,
- 2479: 0x5DAA,
- 2480: 0x5DAB,
- 2481: 0x5DAC,
- 2482: 0x5DAD,
- 2483: 0x5DAE,
- 2484: 0x5DAF,
- 2485: 0x5DB0,
- 2486: 0x5DB1,
- 2487: 0x5DB2,
- 2488: 0x5DB3,
- 2489: 0x5DB4,
- 2490: 0x5DB5,
- 2491: 0x5DB6,
- 2492: 0x5DB8,
- 2493: 0x5DB9,
- 2494: 0x5DBA,
- 2495: 0x5DBB,
- 2496: 0x5DBC,
- 2497: 0x5DBD,
- 2498: 0x5DBE,
- 2499: 0x5DBF,
- 2500: 0x5DC0,
- 2501: 0x5DC1,
- 2502: 0x5DC2,
- 2503: 0x5DC3,
- 2504: 0x5DC4,
- 2505: 0x5DC6,
- 2506: 0x5DC7,
- 2507: 0x5DC8,
- 2508: 0x5DC9,
- 2509: 0x5DCA,
- 2510: 0x5DCB,
- 2511: 0x5DCC,
- 2512: 0x5DCE,
- 2513: 0x5DCF,
- 2514: 0x5DD0,
- 2515: 0x5DD1,
- 2516: 0x5DD2,
- 2517: 0x5DD3,
- 2518: 0x5DD4,
- 2519: 0x5DD5,
- 2520: 0x5DD6,
- 2521: 0x5DD7,
- 2522: 0x5DD8,
- 2523: 0x5DD9,
- 2524: 0x5DDA,
- 2525: 0x5DDC,
- 2526: 0x5DDF,
- 2527: 0x5DE0,
- 2528: 0x5DE3,
- 2529: 0x5DE4,
- 2530: 0x5DEA,
- 2531: 0x5DEC,
- 2532: 0x5DED,
- 2533: 0x5DF0,
- 2534: 0x5DF5,
- 2535: 0x5DF6,
- 2536: 0x5DF8,
- 2537: 0x5DF9,
- 2538: 0x5DFA,
- 2539: 0x5DFB,
- 2540: 0x5DFC,
- 2541: 0x5DFF,
- 2542: 0x5E00,
- 2543: 0x5E04,
- 2544: 0x5E07,
- 2545: 0x5E09,
- 2546: 0x5E0A,
- 2547: 0x5E0B,
- 2548: 0x5E0D,
- 2549: 0x5E0E,
- 2550: 0x5E12,
- 2551: 0x5E13,
- 2552: 0x5E17,
- 2553: 0x5E1E,
- 2554: 0x5E1F,
- 2555: 0x5E20,
- 2556: 0x5E21,
- 2557: 0x5E22,
- 2558: 0x5E23,
- 2559: 0x5E24,
- 2560: 0x5E25,
- 2561: 0x5E28,
- 2562: 0x5E29,
- 2563: 0x5E2A,
- 2564: 0x5E2B,
- 2565: 0x5E2C,
- 2566: 0x5E2F,
- 2567: 0x5E30,
- 2568: 0x5E32,
- 2569: 0x5E33,
- 2570: 0x5E34,
- 2571: 0x5E35,
- 2572: 0x5E36,
- 2573: 0x5E39,
- 2574: 0x5E3A,
- 2575: 0x5E3E,
- 2576: 0x5E3F,
- 2577: 0x5E40,
- 2578: 0x5E41,
- 2579: 0x5E43,
- 2580: 0x5E46,
- 2581: 0x5E47,
- 2582: 0x5E48,
- 2583: 0x5E49,
- 2584: 0x5E4A,
- 2585: 0x5E4B,
- 2586: 0x5E4D,
- 2587: 0x5E4E,
- 2588: 0x5E4F,
- 2589: 0x5E50,
- 2590: 0x5E51,
- 2591: 0x5E52,
- 2592: 0x5E53,
- 2593: 0x5E56,
- 2594: 0x5E57,
- 2595: 0x5E58,
- 2596: 0x5E59,
- 2597: 0x5E5A,
- 2598: 0x5E5C,
- 2599: 0x5E5D,
- 2600: 0x5E5F,
- 2601: 0x5E60,
- 2602: 0x5E63,
- 2603: 0x5E64,
- 2604: 0x5E65,
- 2605: 0x5E66,
- 2606: 0x5E67,
- 2607: 0x5E68,
- 2608: 0x5E69,
- 2609: 0x5E6A,
- 2610: 0x5E6B,
- 2611: 0x5E6C,
- 2612: 0x5E6D,
- 2613: 0x5E6E,
- 2614: 0x5E6F,
- 2615: 0x5E70,
- 2616: 0x5E71,
- 2617: 0x5E75,
- 2618: 0x5E77,
- 2619: 0x5E79,
- 2620: 0x5E7E,
- 2621: 0x5E81,
- 2622: 0x5E82,
- 2623: 0x5E83,
- 2624: 0x5E85,
- 2625: 0x5E88,
- 2626: 0x5E89,
- 2627: 0x5E8C,
- 2628: 0x5E8D,
- 2629: 0x5E8E,
- 2630: 0x5E92,
- 2631: 0x5E98,
- 2632: 0x5E9B,
- 2633: 0x5E9D,
- 2634: 0x5EA1,
- 2635: 0x5EA2,
- 2636: 0x5EA3,
- 2637: 0x5EA4,
- 2638: 0x5EA8,
- 2639: 0x5EA9,
- 2640: 0x5EAA,
- 2641: 0x5EAB,
- 2642: 0x5EAC,
- 2643: 0x5EAE,
- 2644: 0x5EAF,
- 2645: 0x5EB0,
- 2646: 0x5EB1,
- 2647: 0x5EB2,
- 2648: 0x5EB4,
- 2649: 0x5EBA,
- 2650: 0x5EBB,
- 2651: 0x5EBC,
- 2652: 0x5EBD,
- 2653: 0x5EBF,
- 2654: 0x5EC0,
- 2655: 0x5EC1,
- 2656: 0x5EC2,
- 2657: 0x5EC3,
- 2658: 0x5EC4,
- 2659: 0x5EC5,
- 2660: 0x5EC6,
- 2661: 0x5EC7,
- 2662: 0x5EC8,
- 2663: 0x5ECB,
- 2664: 0x5ECC,
- 2665: 0x5ECD,
- 2666: 0x5ECE,
- 2667: 0x5ECF,
- 2668: 0x5ED0,
- 2669: 0x5ED4,
- 2670: 0x5ED5,
- 2671: 0x5ED7,
- 2672: 0x5ED8,
- 2673: 0x5ED9,
- 2674: 0x5EDA,
- 2675: 0x5EDC,
- 2676: 0x5EDD,
- 2677: 0x5EDE,
- 2678: 0x5EDF,
- 2679: 0x5EE0,
- 2680: 0x5EE1,
- 2681: 0x5EE2,
- 2682: 0x5EE3,
- 2683: 0x5EE4,
- 2684: 0x5EE5,
- 2685: 0x5EE6,
- 2686: 0x5EE7,
- 2687: 0x5EE9,
- 2688: 0x5EEB,
- 2689: 0x5EEC,
- 2690: 0x5EED,
- 2691: 0x5EEE,
- 2692: 0x5EEF,
- 2693: 0x5EF0,
- 2694: 0x5EF1,
- 2695: 0x5EF2,
- 2696: 0x5EF3,
- 2697: 0x5EF5,
- 2698: 0x5EF8,
- 2699: 0x5EF9,
- 2700: 0x5EFB,
- 2701: 0x5EFC,
- 2702: 0x5EFD,
- 2703: 0x5F05,
- 2704: 0x5F06,
- 2705: 0x5F07,
- 2706: 0x5F09,
- 2707: 0x5F0C,
- 2708: 0x5F0D,
- 2709: 0x5F0E,
- 2710: 0x5F10,
- 2711: 0x5F12,
- 2712: 0x5F14,
- 2713: 0x5F16,
- 2714: 0x5F19,
- 2715: 0x5F1A,
- 2716: 0x5F1C,
- 2717: 0x5F1D,
- 2718: 0x5F1E,
- 2719: 0x5F21,
- 2720: 0x5F22,
- 2721: 0x5F23,
- 2722: 0x5F24,
- 2723: 0x5F28,
- 2724: 0x5F2B,
- 2725: 0x5F2C,
- 2726: 0x5F2E,
- 2727: 0x5F30,
- 2728: 0x5F32,
- 2729: 0x5F33,
- 2730: 0x5F34,
- 2731: 0x5F35,
- 2732: 0x5F36,
- 2733: 0x5F37,
- 2734: 0x5F38,
- 2735: 0x5F3B,
- 2736: 0x5F3D,
- 2737: 0x5F3E,
- 2738: 0x5F3F,
- 2739: 0x5F41,
- 2740: 0x5F42,
- 2741: 0x5F43,
- 2742: 0x5F44,
- 2743: 0x5F45,
- 2744: 0x5F46,
- 2745: 0x5F47,
- 2746: 0x5F48,
- 2747: 0x5F49,
- 2748: 0x5F4A,
- 2749: 0x5F4B,
- 2750: 0x5F4C,
- 2751: 0x5F4D,
- 2752: 0x5F4E,
- 2753: 0x5F4F,
- 2754: 0x5F51,
- 2755: 0x5F54,
- 2756: 0x5F59,
- 2757: 0x5F5A,
- 2758: 0x5F5B,
- 2759: 0x5F5C,
- 2760: 0x5F5E,
- 2761: 0x5F5F,
- 2762: 0x5F60,
- 2763: 0x5F63,
- 2764: 0x5F65,
- 2765: 0x5F67,
- 2766: 0x5F68,
- 2767: 0x5F6B,
- 2768: 0x5F6E,
- 2769: 0x5F6F,
- 2770: 0x5F72,
- 2771: 0x5F74,
- 2772: 0x5F75,
- 2773: 0x5F76,
- 2774: 0x5F78,
- 2775: 0x5F7A,
- 2776: 0x5F7D,
- 2777: 0x5F7E,
- 2778: 0x5F7F,
- 2779: 0x5F83,
- 2780: 0x5F86,
- 2781: 0x5F8D,
- 2782: 0x5F8E,
- 2783: 0x5F8F,
- 2784: 0x5F91,
- 2785: 0x5F93,
- 2786: 0x5F94,
- 2787: 0x5F96,
- 2788: 0x5F9A,
- 2789: 0x5F9B,
- 2790: 0x5F9D,
- 2791: 0x5F9E,
- 2792: 0x5F9F,
- 2793: 0x5FA0,
- 2794: 0x5FA2,
- 2795: 0x5FA3,
- 2796: 0x5FA4,
- 2797: 0x5FA5,
- 2798: 0x5FA6,
- 2799: 0x5FA7,
- 2800: 0x5FA9,
- 2801: 0x5FAB,
- 2802: 0x5FAC,
- 2803: 0x5FAF,
- 2804: 0x5FB0,
- 2805: 0x5FB1,
- 2806: 0x5FB2,
- 2807: 0x5FB3,
- 2808: 0x5FB4,
- 2809: 0x5FB6,
- 2810: 0x5FB8,
- 2811: 0x5FB9,
- 2812: 0x5FBA,
- 2813: 0x5FBB,
- 2814: 0x5FBE,
- 2815: 0x5FBF,
- 2816: 0x5FC0,
- 2817: 0x5FC1,
- 2818: 0x5FC2,
- 2819: 0x5FC7,
- 2820: 0x5FC8,
- 2821: 0x5FCA,
- 2822: 0x5FCB,
- 2823: 0x5FCE,
- 2824: 0x5FD3,
- 2825: 0x5FD4,
- 2826: 0x5FD5,
- 2827: 0x5FDA,
- 2828: 0x5FDB,
- 2829: 0x5FDC,
- 2830: 0x5FDE,
- 2831: 0x5FDF,
- 2832: 0x5FE2,
- 2833: 0x5FE3,
- 2834: 0x5FE5,
- 2835: 0x5FE6,
- 2836: 0x5FE8,
- 2837: 0x5FE9,
- 2838: 0x5FEC,
- 2839: 0x5FEF,
- 2840: 0x5FF0,
- 2841: 0x5FF2,
- 2842: 0x5FF3,
- 2843: 0x5FF4,
- 2844: 0x5FF6,
- 2845: 0x5FF7,
- 2846: 0x5FF9,
- 2847: 0x5FFA,
- 2848: 0x5FFC,
- 2849: 0x6007,
- 2850: 0x6008,
- 2851: 0x6009,
- 2852: 0x600B,
- 2853: 0x600C,
- 2854: 0x6010,
- 2855: 0x6011,
- 2856: 0x6013,
- 2857: 0x6017,
- 2858: 0x6018,
- 2859: 0x601A,
- 2860: 0x601E,
- 2861: 0x601F,
- 2862: 0x6022,
- 2863: 0x6023,
- 2864: 0x6024,
- 2865: 0x602C,
- 2866: 0x602D,
- 2867: 0x602E,
- 2868: 0x6030,
- 2869: 0x6031,
- 2870: 0x6032,
- 2871: 0x6033,
- 2872: 0x6034,
- 2873: 0x6036,
- 2874: 0x6037,
- 2875: 0x6038,
- 2876: 0x6039,
- 2877: 0x603A,
- 2878: 0x603D,
- 2879: 0x603E,
- 2880: 0x6040,
- 2881: 0x6044,
- 2882: 0x6045,
- 2883: 0x6046,
- 2884: 0x6047,
- 2885: 0x6048,
- 2886: 0x6049,
- 2887: 0x604A,
- 2888: 0x604C,
- 2889: 0x604E,
- 2890: 0x604F,
- 2891: 0x6051,
- 2892: 0x6053,
- 2893: 0x6054,
- 2894: 0x6056,
- 2895: 0x6057,
- 2896: 0x6058,
- 2897: 0x605B,
- 2898: 0x605C,
- 2899: 0x605E,
- 2900: 0x605F,
- 2901: 0x6060,
- 2902: 0x6061,
- 2903: 0x6065,
- 2904: 0x6066,
- 2905: 0x606E,
- 2906: 0x6071,
- 2907: 0x6072,
- 2908: 0x6074,
- 2909: 0x6075,
- 2910: 0x6077,
- 2911: 0x607E,
- 2912: 0x6080,
- 2913: 0x6081,
- 2914: 0x6082,
- 2915: 0x6085,
- 2916: 0x6086,
- 2917: 0x6087,
- 2918: 0x6088,
- 2919: 0x608A,
- 2920: 0x608B,
- 2921: 0x608E,
- 2922: 0x608F,
- 2923: 0x6090,
- 2924: 0x6091,
- 2925: 0x6093,
- 2926: 0x6095,
- 2927: 0x6097,
- 2928: 0x6098,
- 2929: 0x6099,
- 2930: 0x609C,
- 2931: 0x609E,
- 2932: 0x60A1,
- 2933: 0x60A2,
- 2934: 0x60A4,
- 2935: 0x60A5,
- 2936: 0x60A7,
- 2937: 0x60A9,
- 2938: 0x60AA,
- 2939: 0x60AE,
- 2940: 0x60B0,
- 2941: 0x60B3,
- 2942: 0x60B5,
- 2943: 0x60B6,
- 2944: 0x60B7,
- 2945: 0x60B9,
- 2946: 0x60BA,
- 2947: 0x60BD,
- 2948: 0x60BE,
- 2949: 0x60BF,
- 2950: 0x60C0,
- 2951: 0x60C1,
- 2952: 0x60C2,
- 2953: 0x60C3,
- 2954: 0x60C4,
- 2955: 0x60C7,
- 2956: 0x60C8,
- 2957: 0x60C9,
- 2958: 0x60CC,
- 2959: 0x60CD,
- 2960: 0x60CE,
- 2961: 0x60CF,
- 2962: 0x60D0,
- 2963: 0x60D2,
- 2964: 0x60D3,
- 2965: 0x60D4,
- 2966: 0x60D6,
- 2967: 0x60D7,
- 2968: 0x60D9,
- 2969: 0x60DB,
- 2970: 0x60DE,
- 2971: 0x60E1,
- 2972: 0x60E2,
- 2973: 0x60E3,
- 2974: 0x60E4,
- 2975: 0x60E5,
- 2976: 0x60EA,
- 2977: 0x60F1,
- 2978: 0x60F2,
- 2979: 0x60F5,
- 2980: 0x60F7,
- 2981: 0x60F8,
- 2982: 0x60FB,
- 2983: 0x60FC,
- 2984: 0x60FD,
- 2985: 0x60FE,
- 2986: 0x60FF,
- 2987: 0x6102,
- 2988: 0x6103,
- 2989: 0x6104,
- 2990: 0x6105,
- 2991: 0x6107,
- 2992: 0x610A,
- 2993: 0x610B,
- 2994: 0x610C,
- 2995: 0x6110,
- 2996: 0x6111,
- 2997: 0x6112,
- 2998: 0x6113,
- 2999: 0x6114,
- 3000: 0x6116,
- 3001: 0x6117,
- 3002: 0x6118,
- 3003: 0x6119,
- 3004: 0x611B,
- 3005: 0x611C,
- 3006: 0x611D,
- 3007: 0x611E,
- 3008: 0x6121,
- 3009: 0x6122,
- 3010: 0x6125,
- 3011: 0x6128,
- 3012: 0x6129,
- 3013: 0x612A,
- 3014: 0x612C,
- 3015: 0x612D,
- 3016: 0x612E,
- 3017: 0x612F,
- 3018: 0x6130,
- 3019: 0x6131,
- 3020: 0x6132,
- 3021: 0x6133,
- 3022: 0x6134,
- 3023: 0x6135,
- 3024: 0x6136,
- 3025: 0x6137,
- 3026: 0x6138,
- 3027: 0x6139,
- 3028: 0x613A,
- 3029: 0x613B,
- 3030: 0x613C,
- 3031: 0x613D,
- 3032: 0x613E,
- 3033: 0x6140,
- 3034: 0x6141,
- 3035: 0x6142,
- 3036: 0x6143,
- 3037: 0x6144,
- 3038: 0x6145,
- 3039: 0x6146,
- 3040: 0x6147,
- 3041: 0x6149,
- 3042: 0x614B,
- 3043: 0x614D,
- 3044: 0x614F,
- 3045: 0x6150,
- 3046: 0x6152,
- 3047: 0x6153,
- 3048: 0x6154,
- 3049: 0x6156,
- 3050: 0x6157,
- 3051: 0x6158,
- 3052: 0x6159,
- 3053: 0x615A,
- 3054: 0x615B,
- 3055: 0x615C,
- 3056: 0x615E,
- 3057: 0x615F,
- 3058: 0x6160,
- 3059: 0x6161,
- 3060: 0x6163,
- 3061: 0x6164,
- 3062: 0x6165,
- 3063: 0x6166,
- 3064: 0x6169,
- 3065: 0x616A,
- 3066: 0x616B,
- 3067: 0x616C,
- 3068: 0x616D,
- 3069: 0x616E,
- 3070: 0x616F,
- 3071: 0x6171,
- 3072: 0x6172,
- 3073: 0x6173,
- 3074: 0x6174,
- 3075: 0x6176,
- 3076: 0x6178,
- 3077: 0x6179,
- 3078: 0x617A,
- 3079: 0x617B,
- 3080: 0x617C,
- 3081: 0x617D,
- 3082: 0x617E,
- 3083: 0x617F,
- 3084: 0x6180,
- 3085: 0x6181,
- 3086: 0x6182,
- 3087: 0x6183,
- 3088: 0x6184,
- 3089: 0x6185,
- 3090: 0x6186,
- 3091: 0x6187,
- 3092: 0x6188,
- 3093: 0x6189,
- 3094: 0x618A,
- 3095: 0x618C,
- 3096: 0x618D,
- 3097: 0x618F,
- 3098: 0x6190,
- 3099: 0x6191,
- 3100: 0x6192,
- 3101: 0x6193,
- 3102: 0x6195,
- 3103: 0x6196,
- 3104: 0x6197,
- 3105: 0x6198,
- 3106: 0x6199,
- 3107: 0x619A,
- 3108: 0x619B,
- 3109: 0x619C,
- 3110: 0x619E,
- 3111: 0x619F,
- 3112: 0x61A0,
- 3113: 0x61A1,
- 3114: 0x61A2,
- 3115: 0x61A3,
- 3116: 0x61A4,
- 3117: 0x61A5,
- 3118: 0x61A6,
- 3119: 0x61AA,
- 3120: 0x61AB,
- 3121: 0x61AD,
- 3122: 0x61AE,
- 3123: 0x61AF,
- 3124: 0x61B0,
- 3125: 0x61B1,
- 3126: 0x61B2,
- 3127: 0x61B3,
- 3128: 0x61B4,
- 3129: 0x61B5,
- 3130: 0x61B6,
- 3131: 0x61B8,
- 3132: 0x61B9,
- 3133: 0x61BA,
- 3134: 0x61BB,
- 3135: 0x61BC,
- 3136: 0x61BD,
- 3137: 0x61BF,
- 3138: 0x61C0,
- 3139: 0x61C1,
- 3140: 0x61C3,
- 3141: 0x61C4,
- 3142: 0x61C5,
- 3143: 0x61C6,
- 3144: 0x61C7,
- 3145: 0x61C9,
- 3146: 0x61CC,
- 3147: 0x61CD,
- 3148: 0x61CE,
- 3149: 0x61CF,
- 3150: 0x61D0,
- 3151: 0x61D3,
- 3152: 0x61D5,
- 3153: 0x61D6,
- 3154: 0x61D7,
- 3155: 0x61D8,
- 3156: 0x61D9,
- 3157: 0x61DA,
- 3158: 0x61DB,
- 3159: 0x61DC,
- 3160: 0x61DD,
- 3161: 0x61DE,
- 3162: 0x61DF,
- 3163: 0x61E0,
- 3164: 0x61E1,
- 3165: 0x61E2,
- 3166: 0x61E3,
- 3167: 0x61E4,
- 3168: 0x61E5,
- 3169: 0x61E7,
- 3170: 0x61E8,
- 3171: 0x61E9,
- 3172: 0x61EA,
- 3173: 0x61EB,
- 3174: 0x61EC,
- 3175: 0x61ED,
- 3176: 0x61EE,
- 3177: 0x61EF,
- 3178: 0x61F0,
- 3179: 0x61F1,
- 3180: 0x61F2,
- 3181: 0x61F3,
- 3182: 0x61F4,
- 3183: 0x61F6,
- 3184: 0x61F7,
- 3185: 0x61F8,
- 3186: 0x61F9,
- 3187: 0x61FA,
- 3188: 0x61FB,
- 3189: 0x61FC,
- 3190: 0x61FD,
- 3191: 0x61FE,
- 3192: 0x6200,
- 3193: 0x6201,
- 3194: 0x6202,
- 3195: 0x6203,
- 3196: 0x6204,
- 3197: 0x6205,
- 3198: 0x6207,
- 3199: 0x6209,
- 3200: 0x6213,
- 3201: 0x6214,
- 3202: 0x6219,
- 3203: 0x621C,
- 3204: 0x621D,
- 3205: 0x621E,
- 3206: 0x6220,
- 3207: 0x6223,
- 3208: 0x6226,
- 3209: 0x6227,
- 3210: 0x6228,
- 3211: 0x6229,
- 3212: 0x622B,
- 3213: 0x622D,
- 3214: 0x622F,
- 3215: 0x6230,
- 3216: 0x6231,
- 3217: 0x6232,
- 3218: 0x6235,
- 3219: 0x6236,
- 3220: 0x6238,
- 3221: 0x6239,
- 3222: 0x623A,
- 3223: 0x623B,
- 3224: 0x623C,
- 3225: 0x6242,
- 3226: 0x6244,
- 3227: 0x6245,
- 3228: 0x6246,
- 3229: 0x624A,
- 3230: 0x624F,
- 3231: 0x6250,
- 3232: 0x6255,
- 3233: 0x6256,
- 3234: 0x6257,
- 3235: 0x6259,
- 3236: 0x625A,
- 3237: 0x625C,
- 3238: 0x625D,
- 3239: 0x625E,
- 3240: 0x625F,
- 3241: 0x6260,
- 3242: 0x6261,
- 3243: 0x6262,
- 3244: 0x6264,
- 3245: 0x6265,
- 3246: 0x6268,
- 3247: 0x6271,
- 3248: 0x6272,
- 3249: 0x6274,
- 3250: 0x6275,
- 3251: 0x6277,
- 3252: 0x6278,
- 3253: 0x627A,
- 3254: 0x627B,
- 3255: 0x627D,
- 3256: 0x6281,
- 3257: 0x6282,
- 3258: 0x6283,
- 3259: 0x6285,
- 3260: 0x6286,
- 3261: 0x6287,
- 3262: 0x6288,
- 3263: 0x628B,
- 3264: 0x628C,
- 3265: 0x628D,
- 3266: 0x628E,
- 3267: 0x628F,
- 3268: 0x6290,
- 3269: 0x6294,
- 3270: 0x6299,
- 3271: 0x629C,
- 3272: 0x629D,
- 3273: 0x629E,
- 3274: 0x62A3,
- 3275: 0x62A6,
- 3276: 0x62A7,
- 3277: 0x62A9,
- 3278: 0x62AA,
- 3279: 0x62AD,
- 3280: 0x62AE,
- 3281: 0x62AF,
- 3282: 0x62B0,
- 3283: 0x62B2,
- 3284: 0x62B3,
- 3285: 0x62B4,
- 3286: 0x62B6,
- 3287: 0x62B7,
- 3288: 0x62B8,
- 3289: 0x62BA,
- 3290: 0x62BE,
- 3291: 0x62C0,
- 3292: 0x62C1,
- 3293: 0x62C3,
- 3294: 0x62CB,
- 3295: 0x62CF,
- 3296: 0x62D1,
- 3297: 0x62D5,
- 3298: 0x62DD,
- 3299: 0x62DE,
- 3300: 0x62E0,
- 3301: 0x62E1,
- 3302: 0x62E4,
- 3303: 0x62EA,
- 3304: 0x62EB,
- 3305: 0x62F0,
- 3306: 0x62F2,
- 3307: 0x62F5,
- 3308: 0x62F8,
- 3309: 0x62F9,
- 3310: 0x62FA,
- 3311: 0x62FB,
- 3312: 0x6300,
- 3313: 0x6303,
- 3314: 0x6304,
- 3315: 0x6305,
- 3316: 0x6306,
- 3317: 0x630A,
- 3318: 0x630B,
- 3319: 0x630C,
- 3320: 0x630D,
- 3321: 0x630F,
- 3322: 0x6310,
- 3323: 0x6312,
- 3324: 0x6313,
- 3325: 0x6314,
- 3326: 0x6315,
- 3327: 0x6317,
- 3328: 0x6318,
- 3329: 0x6319,
- 3330: 0x631C,
- 3331: 0x6326,
- 3332: 0x6327,
- 3333: 0x6329,
- 3334: 0x632C,
- 3335: 0x632D,
- 3336: 0x632E,
- 3337: 0x6330,
- 3338: 0x6331,
- 3339: 0x6333,
- 3340: 0x6334,
- 3341: 0x6335,
- 3342: 0x6336,
- 3343: 0x6337,
- 3344: 0x6338,
- 3345: 0x633B,
- 3346: 0x633C,
- 3347: 0x633E,
- 3348: 0x633F,
- 3349: 0x6340,
- 3350: 0x6341,
- 3351: 0x6344,
- 3352: 0x6347,
- 3353: 0x6348,
- 3354: 0x634A,
- 3355: 0x6351,
- 3356: 0x6352,
- 3357: 0x6353,
- 3358: 0x6354,
- 3359: 0x6356,
- 3360: 0x6357,
- 3361: 0x6358,
- 3362: 0x6359,
- 3363: 0x635A,
- 3364: 0x635B,
- 3365: 0x635C,
- 3366: 0x635D,
- 3367: 0x6360,
- 3368: 0x6364,
- 3369: 0x6365,
- 3370: 0x6366,
- 3371: 0x6368,
- 3372: 0x636A,
- 3373: 0x636B,
- 3374: 0x636C,
- 3375: 0x636F,
- 3376: 0x6370,
- 3377: 0x6372,
- 3378: 0x6373,
- 3379: 0x6374,
- 3380: 0x6375,
- 3381: 0x6378,
- 3382: 0x6379,
- 3383: 0x637C,
- 3384: 0x637D,
- 3385: 0x637E,
- 3386: 0x637F,
- 3387: 0x6381,
- 3388: 0x6383,
- 3389: 0x6384,
- 3390: 0x6385,
- 3391: 0x6386,
- 3392: 0x638B,
- 3393: 0x638D,
- 3394: 0x6391,
- 3395: 0x6393,
- 3396: 0x6394,
- 3397: 0x6395,
- 3398: 0x6397,
- 3399: 0x6399,
- 3400: 0x639A,
- 3401: 0x639B,
- 3402: 0x639C,
- 3403: 0x639D,
- 3404: 0x639E,
- 3405: 0x639F,
- 3406: 0x63A1,
- 3407: 0x63A4,
- 3408: 0x63A6,
- 3409: 0x63AB,
- 3410: 0x63AF,
- 3411: 0x63B1,
- 3412: 0x63B2,
- 3413: 0x63B5,
- 3414: 0x63B6,
- 3415: 0x63B9,
- 3416: 0x63BB,
- 3417: 0x63BD,
- 3418: 0x63BF,
- 3419: 0x63C0,
- 3420: 0x63C1,
- 3421: 0x63C2,
- 3422: 0x63C3,
- 3423: 0x63C5,
- 3424: 0x63C7,
- 3425: 0x63C8,
- 3426: 0x63CA,
- 3427: 0x63CB,
- 3428: 0x63CC,
- 3429: 0x63D1,
- 3430: 0x63D3,
- 3431: 0x63D4,
- 3432: 0x63D5,
- 3433: 0x63D7,
- 3434: 0x63D8,
- 3435: 0x63D9,
- 3436: 0x63DA,
- 3437: 0x63DB,
- 3438: 0x63DC,
- 3439: 0x63DD,
- 3440: 0x63DF,
- 3441: 0x63E2,
- 3442: 0x63E4,
- 3443: 0x63E5,
- 3444: 0x63E6,
- 3445: 0x63E7,
- 3446: 0x63E8,
- 3447: 0x63EB,
- 3448: 0x63EC,
- 3449: 0x63EE,
- 3450: 0x63EF,
- 3451: 0x63F0,
- 3452: 0x63F1,
- 3453: 0x63F3,
- 3454: 0x63F5,
- 3455: 0x63F7,
- 3456: 0x63F9,
- 3457: 0x63FA,
- 3458: 0x63FB,
- 3459: 0x63FC,
- 3460: 0x63FE,
- 3461: 0x6403,
- 3462: 0x6404,
- 3463: 0x6406,
- 3464: 0x6407,
- 3465: 0x6408,
- 3466: 0x6409,
- 3467: 0x640A,
- 3468: 0x640D,
- 3469: 0x640E,
- 3470: 0x6411,
- 3471: 0x6412,
- 3472: 0x6415,
- 3473: 0x6416,
- 3474: 0x6417,
- 3475: 0x6418,
- 3476: 0x6419,
- 3477: 0x641A,
- 3478: 0x641D,
- 3479: 0x641F,
- 3480: 0x6422,
- 3481: 0x6423,
- 3482: 0x6424,
- 3483: 0x6425,
- 3484: 0x6427,
- 3485: 0x6428,
- 3486: 0x6429,
- 3487: 0x642B,
- 3488: 0x642E,
- 3489: 0x642F,
- 3490: 0x6430,
- 3491: 0x6431,
- 3492: 0x6432,
- 3493: 0x6433,
- 3494: 0x6435,
- 3495: 0x6436,
- 3496: 0x6437,
- 3497: 0x6438,
- 3498: 0x6439,
- 3499: 0x643B,
- 3500: 0x643C,
- 3501: 0x643E,
- 3502: 0x6440,
- 3503: 0x6442,
- 3504: 0x6443,
- 3505: 0x6449,
- 3506: 0x644B,
- 3507: 0x644C,
- 3508: 0x644D,
- 3509: 0x644E,
- 3510: 0x644F,
- 3511: 0x6450,
- 3512: 0x6451,
- 3513: 0x6453,
- 3514: 0x6455,
- 3515: 0x6456,
- 3516: 0x6457,
- 3517: 0x6459,
- 3518: 0x645A,
- 3519: 0x645B,
- 3520: 0x645C,
- 3521: 0x645D,
- 3522: 0x645F,
- 3523: 0x6460,
- 3524: 0x6461,
- 3525: 0x6462,
- 3526: 0x6463,
- 3527: 0x6464,
- 3528: 0x6465,
- 3529: 0x6466,
- 3530: 0x6468,
- 3531: 0x646A,
- 3532: 0x646B,
- 3533: 0x646C,
- 3534: 0x646E,
- 3535: 0x646F,
- 3536: 0x6470,
- 3537: 0x6471,
- 3538: 0x6472,
- 3539: 0x6473,
- 3540: 0x6474,
- 3541: 0x6475,
- 3542: 0x6476,
- 3543: 0x6477,
- 3544: 0x647B,
- 3545: 0x647C,
- 3546: 0x647D,
- 3547: 0x647E,
- 3548: 0x647F,
- 3549: 0x6480,
- 3550: 0x6481,
- 3551: 0x6483,
- 3552: 0x6486,
- 3553: 0x6488,
- 3554: 0x6489,
- 3555: 0x648A,
- 3556: 0x648B,
- 3557: 0x648C,
- 3558: 0x648D,
- 3559: 0x648E,
- 3560: 0x648F,
- 3561: 0x6490,
- 3562: 0x6493,
- 3563: 0x6494,
- 3564: 0x6497,
- 3565: 0x6498,
- 3566: 0x649A,
- 3567: 0x649B,
- 3568: 0x649C,
- 3569: 0x649D,
- 3570: 0x649F,
- 3571: 0x64A0,
- 3572: 0x64A1,
- 3573: 0x64A2,
- 3574: 0x64A3,
- 3575: 0x64A5,
- 3576: 0x64A6,
- 3577: 0x64A7,
- 3578: 0x64A8,
- 3579: 0x64AA,
- 3580: 0x64AB,
- 3581: 0x64AF,
- 3582: 0x64B1,
- 3583: 0x64B2,
- 3584: 0x64B3,
- 3585: 0x64B4,
- 3586: 0x64B6,
- 3587: 0x64B9,
- 3588: 0x64BB,
- 3589: 0x64BD,
- 3590: 0x64BE,
- 3591: 0x64BF,
- 3592: 0x64C1,
- 3593: 0x64C3,
- 3594: 0x64C4,
- 3595: 0x64C6,
- 3596: 0x64C7,
- 3597: 0x64C8,
- 3598: 0x64C9,
- 3599: 0x64CA,
- 3600: 0x64CB,
- 3601: 0x64CC,
- 3602: 0x64CF,
- 3603: 0x64D1,
- 3604: 0x64D3,
- 3605: 0x64D4,
- 3606: 0x64D5,
- 3607: 0x64D6,
- 3608: 0x64D9,
- 3609: 0x64DA,
- 3610: 0x64DB,
- 3611: 0x64DC,
- 3612: 0x64DD,
- 3613: 0x64DF,
- 3614: 0x64E0,
- 3615: 0x64E1,
- 3616: 0x64E3,
- 3617: 0x64E5,
- 3618: 0x64E7,
- 3619: 0x64E8,
- 3620: 0x64E9,
- 3621: 0x64EA,
- 3622: 0x64EB,
- 3623: 0x64EC,
- 3624: 0x64ED,
- 3625: 0x64EE,
- 3626: 0x64EF,
- 3627: 0x64F0,
- 3628: 0x64F1,
- 3629: 0x64F2,
- 3630: 0x64F3,
- 3631: 0x64F4,
- 3632: 0x64F5,
- 3633: 0x64F6,
- 3634: 0x64F7,
- 3635: 0x64F8,
- 3636: 0x64F9,
- 3637: 0x64FA,
- 3638: 0x64FB,
- 3639: 0x64FC,
- 3640: 0x64FD,
- 3641: 0x64FE,
- 3642: 0x64FF,
- 3643: 0x6501,
- 3644: 0x6502,
- 3645: 0x6503,
- 3646: 0x6504,
- 3647: 0x6505,
- 3648: 0x6506,
- 3649: 0x6507,
- 3650: 0x6508,
- 3651: 0x650A,
- 3652: 0x650B,
- 3653: 0x650C,
- 3654: 0x650D,
- 3655: 0x650E,
- 3656: 0x650F,
- 3657: 0x6510,
- 3658: 0x6511,
- 3659: 0x6513,
- 3660: 0x6514,
- 3661: 0x6515,
- 3662: 0x6516,
- 3663: 0x6517,
- 3664: 0x6519,
- 3665: 0x651A,
- 3666: 0x651B,
- 3667: 0x651C,
- 3668: 0x651D,
- 3669: 0x651E,
- 3670: 0x651F,
- 3671: 0x6520,
- 3672: 0x6521,
- 3673: 0x6522,
- 3674: 0x6523,
- 3675: 0x6524,
- 3676: 0x6526,
- 3677: 0x6527,
- 3678: 0x6528,
- 3679: 0x6529,
- 3680: 0x652A,
- 3681: 0x652C,
- 3682: 0x652D,
- 3683: 0x6530,
- 3684: 0x6531,
- 3685: 0x6532,
- 3686: 0x6533,
- 3687: 0x6537,
- 3688: 0x653A,
- 3689: 0x653C,
- 3690: 0x653D,
- 3691: 0x6540,
- 3692: 0x6541,
- 3693: 0x6542,
- 3694: 0x6543,
- 3695: 0x6544,
- 3696: 0x6546,
- 3697: 0x6547,
- 3698: 0x654A,
- 3699: 0x654B,
- 3700: 0x654D,
- 3701: 0x654E,
- 3702: 0x6550,
- 3703: 0x6552,
- 3704: 0x6553,
- 3705: 0x6554,
- 3706: 0x6557,
- 3707: 0x6558,
- 3708: 0x655A,
- 3709: 0x655C,
- 3710: 0x655F,
- 3711: 0x6560,
- 3712: 0x6561,
- 3713: 0x6564,
- 3714: 0x6565,
- 3715: 0x6567,
- 3716: 0x6568,
- 3717: 0x6569,
- 3718: 0x656A,
- 3719: 0x656D,
- 3720: 0x656E,
- 3721: 0x656F,
- 3722: 0x6571,
- 3723: 0x6573,
- 3724: 0x6575,
- 3725: 0x6576,
- 3726: 0x6578,
- 3727: 0x6579,
- 3728: 0x657A,
- 3729: 0x657B,
- 3730: 0x657C,
- 3731: 0x657D,
- 3732: 0x657E,
- 3733: 0x657F,
- 3734: 0x6580,
- 3735: 0x6581,
- 3736: 0x6582,
- 3737: 0x6583,
- 3738: 0x6584,
- 3739: 0x6585,
- 3740: 0x6586,
- 3741: 0x6588,
- 3742: 0x6589,
- 3743: 0x658A,
- 3744: 0x658D,
- 3745: 0x658E,
- 3746: 0x658F,
- 3747: 0x6592,
- 3748: 0x6594,
- 3749: 0x6595,
- 3750: 0x6596,
- 3751: 0x6598,
- 3752: 0x659A,
- 3753: 0x659D,
- 3754: 0x659E,
- 3755: 0x65A0,
- 3756: 0x65A2,
- 3757: 0x65A3,
- 3758: 0x65A6,
- 3759: 0x65A8,
- 3760: 0x65AA,
- 3761: 0x65AC,
- 3762: 0x65AE,
- 3763: 0x65B1,
- 3764: 0x65B2,
- 3765: 0x65B3,
- 3766: 0x65B4,
- 3767: 0x65B5,
- 3768: 0x65B6,
- 3769: 0x65B7,
- 3770: 0x65B8,
- 3771: 0x65BA,
- 3772: 0x65BB,
- 3773: 0x65BE,
- 3774: 0x65BF,
- 3775: 0x65C0,
- 3776: 0x65C2,
- 3777: 0x65C7,
- 3778: 0x65C8,
- 3779: 0x65C9,
- 3780: 0x65CA,
- 3781: 0x65CD,
- 3782: 0x65D0,
- 3783: 0x65D1,
- 3784: 0x65D3,
- 3785: 0x65D4,
- 3786: 0x65D5,
- 3787: 0x65D8,
- 3788: 0x65D9,
- 3789: 0x65DA,
- 3790: 0x65DB,
- 3791: 0x65DC,
- 3792: 0x65DD,
- 3793: 0x65DE,
- 3794: 0x65DF,
- 3795: 0x65E1,
- 3796: 0x65E3,
- 3797: 0x65E4,
- 3798: 0x65EA,
- 3799: 0x65EB,
- 3800: 0x65F2,
- 3801: 0x65F3,
- 3802: 0x65F4,
- 3803: 0x65F5,
- 3804: 0x65F8,
- 3805: 0x65F9,
- 3806: 0x65FB,
- 3807: 0x65FC,
- 3808: 0x65FD,
- 3809: 0x65FE,
- 3810: 0x65FF,
- 3811: 0x6601,
- 3812: 0x6604,
- 3813: 0x6605,
- 3814: 0x6607,
- 3815: 0x6608,
- 3816: 0x6609,
- 3817: 0x660B,
- 3818: 0x660D,
- 3819: 0x6610,
- 3820: 0x6611,
- 3821: 0x6612,
- 3822: 0x6616,
- 3823: 0x6617,
- 3824: 0x6618,
- 3825: 0x661A,
- 3826: 0x661B,
- 3827: 0x661C,
- 3828: 0x661E,
- 3829: 0x6621,
- 3830: 0x6622,
- 3831: 0x6623,
- 3832: 0x6624,
- 3833: 0x6626,
- 3834: 0x6629,
- 3835: 0x662A,
- 3836: 0x662B,
- 3837: 0x662C,
- 3838: 0x662E,
- 3839: 0x6630,
- 3840: 0x6632,
- 3841: 0x6633,
- 3842: 0x6637,
- 3843: 0x6638,
- 3844: 0x6639,
- 3845: 0x663A,
- 3846: 0x663B,
- 3847: 0x663D,
- 3848: 0x663F,
- 3849: 0x6640,
- 3850: 0x6642,
- 3851: 0x6644,
- 3852: 0x6645,
- 3853: 0x6646,
- 3854: 0x6647,
- 3855: 0x6648,
- 3856: 0x6649,
- 3857: 0x664A,
- 3858: 0x664D,
- 3859: 0x664E,
- 3860: 0x6650,
- 3861: 0x6651,
- 3862: 0x6658,
- 3863: 0x6659,
- 3864: 0x665B,
- 3865: 0x665C,
- 3866: 0x665D,
- 3867: 0x665E,
- 3868: 0x6660,
- 3869: 0x6662,
- 3870: 0x6663,
- 3871: 0x6665,
- 3872: 0x6667,
- 3873: 0x6669,
- 3874: 0x666A,
- 3875: 0x666B,
- 3876: 0x666C,
- 3877: 0x666D,
- 3878: 0x6671,
- 3879: 0x6672,
- 3880: 0x6673,
- 3881: 0x6675,
- 3882: 0x6678,
- 3883: 0x6679,
- 3884: 0x667B,
- 3885: 0x667C,
- 3886: 0x667D,
- 3887: 0x667F,
- 3888: 0x6680,
- 3889: 0x6681,
- 3890: 0x6683,
- 3891: 0x6685,
- 3892: 0x6686,
- 3893: 0x6688,
- 3894: 0x6689,
- 3895: 0x668A,
- 3896: 0x668B,
- 3897: 0x668D,
- 3898: 0x668E,
- 3899: 0x668F,
- 3900: 0x6690,
- 3901: 0x6692,
- 3902: 0x6693,
- 3903: 0x6694,
- 3904: 0x6695,
- 3905: 0x6698,
- 3906: 0x6699,
- 3907: 0x669A,
- 3908: 0x669B,
- 3909: 0x669C,
- 3910: 0x669E,
- 3911: 0x669F,
- 3912: 0x66A0,
- 3913: 0x66A1,
- 3914: 0x66A2,
- 3915: 0x66A3,
- 3916: 0x66A4,
- 3917: 0x66A5,
- 3918: 0x66A6,
- 3919: 0x66A9,
- 3920: 0x66AA,
- 3921: 0x66AB,
- 3922: 0x66AC,
- 3923: 0x66AD,
- 3924: 0x66AF,
- 3925: 0x66B0,
- 3926: 0x66B1,
- 3927: 0x66B2,
- 3928: 0x66B3,
- 3929: 0x66B5,
- 3930: 0x66B6,
- 3931: 0x66B7,
- 3932: 0x66B8,
- 3933: 0x66BA,
- 3934: 0x66BB,
- 3935: 0x66BC,
- 3936: 0x66BD,
- 3937: 0x66BF,
- 3938: 0x66C0,
- 3939: 0x66C1,
- 3940: 0x66C2,
- 3941: 0x66C3,
- 3942: 0x66C4,
- 3943: 0x66C5,
- 3944: 0x66C6,
- 3945: 0x66C7,
- 3946: 0x66C8,
- 3947: 0x66C9,
- 3948: 0x66CA,
- 3949: 0x66CB,
- 3950: 0x66CC,
- 3951: 0x66CD,
- 3952: 0x66CE,
- 3953: 0x66CF,
- 3954: 0x66D0,
- 3955: 0x66D1,
- 3956: 0x66D2,
- 3957: 0x66D3,
- 3958: 0x66D4,
- 3959: 0x66D5,
- 3960: 0x66D6,
- 3961: 0x66D7,
- 3962: 0x66D8,
- 3963: 0x66DA,
- 3964: 0x66DE,
- 3965: 0x66DF,
- 3966: 0x66E0,
- 3967: 0x66E1,
- 3968: 0x66E2,
- 3969: 0x66E3,
- 3970: 0x66E4,
- 3971: 0x66E5,
- 3972: 0x66E7,
- 3973: 0x66E8,
- 3974: 0x66EA,
- 3975: 0x66EB,
- 3976: 0x66EC,
- 3977: 0x66ED,
- 3978: 0x66EE,
- 3979: 0x66EF,
- 3980: 0x66F1,
- 3981: 0x66F5,
- 3982: 0x66F6,
- 3983: 0x66F8,
- 3984: 0x66FA,
- 3985: 0x66FB,
- 3986: 0x66FD,
- 3987: 0x6701,
- 3988: 0x6702,
- 3989: 0x6703,
- 3990: 0x6704,
- 3991: 0x6705,
- 3992: 0x6706,
- 3993: 0x6707,
- 3994: 0x670C,
- 3995: 0x670E,
- 3996: 0x670F,
- 3997: 0x6711,
- 3998: 0x6712,
- 3999: 0x6713,
- 4000: 0x6716,
- 4001: 0x6718,
- 4002: 0x6719,
- 4003: 0x671A,
- 4004: 0x671C,
- 4005: 0x671E,
- 4006: 0x6720,
- 4007: 0x6721,
- 4008: 0x6722,
- 4009: 0x6723,
- 4010: 0x6724,
- 4011: 0x6725,
- 4012: 0x6727,
- 4013: 0x6729,
- 4014: 0x672E,
- 4015: 0x6730,
- 4016: 0x6732,
- 4017: 0x6733,
- 4018: 0x6736,
- 4019: 0x6737,
- 4020: 0x6738,
- 4021: 0x6739,
- 4022: 0x673B,
- 4023: 0x673C,
- 4024: 0x673E,
- 4025: 0x673F,
- 4026: 0x6741,
- 4027: 0x6744,
- 4028: 0x6745,
- 4029: 0x6747,
- 4030: 0x674A,
- 4031: 0x674B,
- 4032: 0x674D,
- 4033: 0x6752,
- 4034: 0x6754,
- 4035: 0x6755,
- 4036: 0x6757,
- 4037: 0x6758,
- 4038: 0x6759,
- 4039: 0x675A,
- 4040: 0x675B,
- 4041: 0x675D,
- 4042: 0x6762,
- 4043: 0x6763,
- 4044: 0x6764,
- 4045: 0x6766,
- 4046: 0x6767,
- 4047: 0x676B,
- 4048: 0x676C,
- 4049: 0x676E,
- 4050: 0x6771,
- 4051: 0x6774,
- 4052: 0x6776,
- 4053: 0x6778,
- 4054: 0x6779,
- 4055: 0x677A,
- 4056: 0x677B,
- 4057: 0x677D,
- 4058: 0x6780,
- 4059: 0x6782,
- 4060: 0x6783,
- 4061: 0x6785,
- 4062: 0x6786,
- 4063: 0x6788,
- 4064: 0x678A,
- 4065: 0x678C,
- 4066: 0x678D,
- 4067: 0x678E,
- 4068: 0x678F,
- 4069: 0x6791,
- 4070: 0x6792,
- 4071: 0x6793,
- 4072: 0x6794,
- 4073: 0x6796,
- 4074: 0x6799,
- 4075: 0x679B,
- 4076: 0x679F,
- 4077: 0x67A0,
- 4078: 0x67A1,
- 4079: 0x67A4,
- 4080: 0x67A6,
- 4081: 0x67A9,
- 4082: 0x67AC,
- 4083: 0x67AE,
- 4084: 0x67B1,
- 4085: 0x67B2,
- 4086: 0x67B4,
- 4087: 0x67B9,
- 4088: 0x67BA,
- 4089: 0x67BB,
- 4090: 0x67BC,
- 4091: 0x67BD,
- 4092: 0x67BE,
- 4093: 0x67BF,
- 4094: 0x67C0,
- 4095: 0x67C2,
- 4096: 0x67C5,
- 4097: 0x67C6,
- 4098: 0x67C7,
- 4099: 0x67C8,
- 4100: 0x67C9,
- 4101: 0x67CA,
- 4102: 0x67CB,
- 4103: 0x67CC,
- 4104: 0x67CD,
- 4105: 0x67CE,
- 4106: 0x67D5,
- 4107: 0x67D6,
- 4108: 0x67D7,
- 4109: 0x67DB,
- 4110: 0x67DF,
- 4111: 0x67E1,
- 4112: 0x67E3,
- 4113: 0x67E4,
- 4114: 0x67E6,
- 4115: 0x67E7,
- 4116: 0x67E8,
- 4117: 0x67EA,
- 4118: 0x67EB,
- 4119: 0x67ED,
- 4120: 0x67EE,
- 4121: 0x67F2,
- 4122: 0x67F5,
- 4123: 0x67F6,
- 4124: 0x67F7,
- 4125: 0x67F8,
- 4126: 0x67F9,
- 4127: 0x67FA,
- 4128: 0x67FB,
- 4129: 0x67FC,
- 4130: 0x67FE,
- 4131: 0x6801,
- 4132: 0x6802,
- 4133: 0x6803,
- 4134: 0x6804,
- 4135: 0x6806,
- 4136: 0x680D,
- 4137: 0x6810,
- 4138: 0x6812,
- 4139: 0x6814,
- 4140: 0x6815,
- 4141: 0x6818,
- 4142: 0x6819,
- 4143: 0x681A,
- 4144: 0x681B,
- 4145: 0x681C,
- 4146: 0x681E,
- 4147: 0x681F,
- 4148: 0x6820,
- 4149: 0x6822,
- 4150: 0x6823,
- 4151: 0x6824,
- 4152: 0x6825,
- 4153: 0x6826,
- 4154: 0x6827,
- 4155: 0x6828,
- 4156: 0x682B,
- 4157: 0x682C,
- 4158: 0x682D,
- 4159: 0x682E,
- 4160: 0x682F,
- 4161: 0x6830,
- 4162: 0x6831,
- 4163: 0x6834,
- 4164: 0x6835,
- 4165: 0x6836,
- 4166: 0x683A,
- 4167: 0x683B,
- 4168: 0x683F,
- 4169: 0x6847,
- 4170: 0x684B,
- 4171: 0x684D,
- 4172: 0x684F,
- 4173: 0x6852,
- 4174: 0x6856,
- 4175: 0x6857,
- 4176: 0x6858,
- 4177: 0x6859,
- 4178: 0x685A,
- 4179: 0x685B,
- 4180: 0x685C,
- 4181: 0x685D,
- 4182: 0x685E,
- 4183: 0x685F,
- 4184: 0x686A,
- 4185: 0x686C,
- 4186: 0x686D,
- 4187: 0x686E,
- 4188: 0x686F,
- 4189: 0x6870,
- 4190: 0x6871,
- 4191: 0x6872,
- 4192: 0x6873,
- 4193: 0x6875,
- 4194: 0x6878,
- 4195: 0x6879,
- 4196: 0x687A,
- 4197: 0x687B,
- 4198: 0x687C,
- 4199: 0x687D,
- 4200: 0x687E,
- 4201: 0x687F,
- 4202: 0x6880,
- 4203: 0x6882,
- 4204: 0x6884,
- 4205: 0x6887,
- 4206: 0x6888,
- 4207: 0x6889,
- 4208: 0x688A,
- 4209: 0x688B,
- 4210: 0x688C,
- 4211: 0x688D,
- 4212: 0x688E,
- 4213: 0x6890,
- 4214: 0x6891,
- 4215: 0x6892,
- 4216: 0x6894,
- 4217: 0x6895,
- 4218: 0x6896,
- 4219: 0x6898,
- 4220: 0x6899,
- 4221: 0x689A,
- 4222: 0x689B,
- 4223: 0x689C,
- 4224: 0x689D,
- 4225: 0x689E,
- 4226: 0x689F,
- 4227: 0x68A0,
- 4228: 0x68A1,
- 4229: 0x68A3,
- 4230: 0x68A4,
- 4231: 0x68A5,
- 4232: 0x68A9,
- 4233: 0x68AA,
- 4234: 0x68AB,
- 4235: 0x68AC,
- 4236: 0x68AE,
- 4237: 0x68B1,
- 4238: 0x68B2,
- 4239: 0x68B4,
- 4240: 0x68B6,
- 4241: 0x68B7,
- 4242: 0x68B8,
- 4243: 0x68B9,
- 4244: 0x68BA,
- 4245: 0x68BB,
- 4246: 0x68BC,
- 4247: 0x68BD,
- 4248: 0x68BE,
- 4249: 0x68BF,
- 4250: 0x68C1,
- 4251: 0x68C3,
- 4252: 0x68C4,
- 4253: 0x68C5,
- 4254: 0x68C6,
- 4255: 0x68C7,
- 4256: 0x68C8,
- 4257: 0x68CA,
- 4258: 0x68CC,
- 4259: 0x68CE,
- 4260: 0x68CF,
- 4261: 0x68D0,
- 4262: 0x68D1,
- 4263: 0x68D3,
- 4264: 0x68D4,
- 4265: 0x68D6,
- 4266: 0x68D7,
- 4267: 0x68D9,
- 4268: 0x68DB,
- 4269: 0x68DC,
- 4270: 0x68DD,
- 4271: 0x68DE,
- 4272: 0x68DF,
- 4273: 0x68E1,
- 4274: 0x68E2,
- 4275: 0x68E4,
- 4276: 0x68E5,
- 4277: 0x68E6,
- 4278: 0x68E7,
- 4279: 0x68E8,
- 4280: 0x68E9,
- 4281: 0x68EA,
- 4282: 0x68EB,
- 4283: 0x68EC,
- 4284: 0x68ED,
- 4285: 0x68EF,
- 4286: 0x68F2,
- 4287: 0x68F3,
- 4288: 0x68F4,
- 4289: 0x68F6,
- 4290: 0x68F7,
- 4291: 0x68F8,
- 4292: 0x68FB,
- 4293: 0x68FD,
- 4294: 0x68FE,
- 4295: 0x68FF,
- 4296: 0x6900,
- 4297: 0x6902,
- 4298: 0x6903,
- 4299: 0x6904,
- 4300: 0x6906,
- 4301: 0x6907,
- 4302: 0x6908,
- 4303: 0x6909,
- 4304: 0x690A,
- 4305: 0x690C,
- 4306: 0x690F,
- 4307: 0x6911,
- 4308: 0x6913,
- 4309: 0x6914,
- 4310: 0x6915,
- 4311: 0x6916,
- 4312: 0x6917,
- 4313: 0x6918,
- 4314: 0x6919,
- 4315: 0x691A,
- 4316: 0x691B,
- 4317: 0x691C,
- 4318: 0x691D,
- 4319: 0x691E,
- 4320: 0x6921,
- 4321: 0x6922,
- 4322: 0x6923,
- 4323: 0x6925,
- 4324: 0x6926,
- 4325: 0x6927,
- 4326: 0x6928,
- 4327: 0x6929,
- 4328: 0x692A,
- 4329: 0x692B,
- 4330: 0x692C,
- 4331: 0x692E,
- 4332: 0x692F,
- 4333: 0x6931,
- 4334: 0x6932,
- 4335: 0x6933,
- 4336: 0x6935,
- 4337: 0x6936,
- 4338: 0x6937,
- 4339: 0x6938,
- 4340: 0x693A,
- 4341: 0x693B,
- 4342: 0x693C,
- 4343: 0x693E,
- 4344: 0x6940,
- 4345: 0x6941,
- 4346: 0x6943,
- 4347: 0x6944,
- 4348: 0x6945,
- 4349: 0x6946,
- 4350: 0x6947,
- 4351: 0x6948,
- 4352: 0x6949,
- 4353: 0x694A,
- 4354: 0x694B,
- 4355: 0x694C,
- 4356: 0x694D,
- 4357: 0x694E,
- 4358: 0x694F,
- 4359: 0x6950,
- 4360: 0x6951,
- 4361: 0x6952,
- 4362: 0x6953,
- 4363: 0x6955,
- 4364: 0x6956,
- 4365: 0x6958,
- 4366: 0x6959,
- 4367: 0x695B,
- 4368: 0x695C,
- 4369: 0x695F,
- 4370: 0x6961,
- 4371: 0x6962,
- 4372: 0x6964,
- 4373: 0x6965,
- 4374: 0x6967,
- 4375: 0x6968,
- 4376: 0x6969,
- 4377: 0x696A,
- 4378: 0x696C,
- 4379: 0x696D,
- 4380: 0x696F,
- 4381: 0x6970,
- 4382: 0x6972,
- 4383: 0x6973,
- 4384: 0x6974,
- 4385: 0x6975,
- 4386: 0x6976,
- 4387: 0x697A,
- 4388: 0x697B,
- 4389: 0x697D,
- 4390: 0x697E,
- 4391: 0x697F,
- 4392: 0x6981,
- 4393: 0x6983,
- 4394: 0x6985,
- 4395: 0x698A,
- 4396: 0x698B,
- 4397: 0x698C,
- 4398: 0x698E,
- 4399: 0x698F,
- 4400: 0x6990,
- 4401: 0x6991,
- 4402: 0x6992,
- 4403: 0x6993,
- 4404: 0x6996,
- 4405: 0x6997,
- 4406: 0x6999,
- 4407: 0x699A,
- 4408: 0x699D,
- 4409: 0x699E,
- 4410: 0x699F,
- 4411: 0x69A0,
- 4412: 0x69A1,
- 4413: 0x69A2,
- 4414: 0x69A3,
- 4415: 0x69A4,
- 4416: 0x69A5,
- 4417: 0x69A6,
- 4418: 0x69A9,
- 4419: 0x69AA,
- 4420: 0x69AC,
- 4421: 0x69AE,
- 4422: 0x69AF,
- 4423: 0x69B0,
- 4424: 0x69B2,
- 4425: 0x69B3,
- 4426: 0x69B5,
- 4427: 0x69B6,
- 4428: 0x69B8,
- 4429: 0x69B9,
- 4430: 0x69BA,
- 4431: 0x69BC,
- 4432: 0x69BD,
- 4433: 0x69BE,
- 4434: 0x69BF,
- 4435: 0x69C0,
- 4436: 0x69C2,
- 4437: 0x69C3,
- 4438: 0x69C4,
- 4439: 0x69C5,
- 4440: 0x69C6,
- 4441: 0x69C7,
- 4442: 0x69C8,
- 4443: 0x69C9,
- 4444: 0x69CB,
- 4445: 0x69CD,
- 4446: 0x69CF,
- 4447: 0x69D1,
- 4448: 0x69D2,
- 4449: 0x69D3,
- 4450: 0x69D5,
- 4451: 0x69D6,
- 4452: 0x69D7,
- 4453: 0x69D8,
- 4454: 0x69D9,
- 4455: 0x69DA,
- 4456: 0x69DC,
- 4457: 0x69DD,
- 4458: 0x69DE,
- 4459: 0x69E1,
- 4460: 0x69E2,
- 4461: 0x69E3,
- 4462: 0x69E4,
- 4463: 0x69E5,
- 4464: 0x69E6,
- 4465: 0x69E7,
- 4466: 0x69E8,
- 4467: 0x69E9,
- 4468: 0x69EA,
- 4469: 0x69EB,
- 4470: 0x69EC,
- 4471: 0x69EE,
- 4472: 0x69EF,
- 4473: 0x69F0,
- 4474: 0x69F1,
- 4475: 0x69F3,
- 4476: 0x69F4,
- 4477: 0x69F5,
- 4478: 0x69F6,
- 4479: 0x69F7,
- 4480: 0x69F8,
- 4481: 0x69F9,
- 4482: 0x69FA,
- 4483: 0x69FB,
- 4484: 0x69FC,
- 4485: 0x69FE,
- 4486: 0x6A00,
- 4487: 0x6A01,
- 4488: 0x6A02,
- 4489: 0x6A03,
- 4490: 0x6A04,
- 4491: 0x6A05,
- 4492: 0x6A06,
- 4493: 0x6A07,
- 4494: 0x6A08,
- 4495: 0x6A09,
- 4496: 0x6A0B,
- 4497: 0x6A0C,
- 4498: 0x6A0D,
- 4499: 0x6A0E,
- 4500: 0x6A0F,
- 4501: 0x6A10,
- 4502: 0x6A11,
- 4503: 0x6A12,
- 4504: 0x6A13,
- 4505: 0x6A14,
- 4506: 0x6A15,
- 4507: 0x6A16,
- 4508: 0x6A19,
- 4509: 0x6A1A,
- 4510: 0x6A1B,
- 4511: 0x6A1C,
- 4512: 0x6A1D,
- 4513: 0x6A1E,
- 4514: 0x6A20,
- 4515: 0x6A22,
- 4516: 0x6A23,
- 4517: 0x6A24,
- 4518: 0x6A25,
- 4519: 0x6A26,
- 4520: 0x6A27,
- 4521: 0x6A29,
- 4522: 0x6A2B,
- 4523: 0x6A2C,
- 4524: 0x6A2D,
- 4525: 0x6A2E,
- 4526: 0x6A30,
- 4527: 0x6A32,
- 4528: 0x6A33,
- 4529: 0x6A34,
- 4530: 0x6A36,
- 4531: 0x6A37,
- 4532: 0x6A38,
- 4533: 0x6A39,
- 4534: 0x6A3A,
- 4535: 0x6A3B,
- 4536: 0x6A3C,
- 4537: 0x6A3F,
- 4538: 0x6A40,
- 4539: 0x6A41,
- 4540: 0x6A42,
- 4541: 0x6A43,
- 4542: 0x6A45,
- 4543: 0x6A46,
- 4544: 0x6A48,
- 4545: 0x6A49,
- 4546: 0x6A4A,
- 4547: 0x6A4B,
- 4548: 0x6A4C,
- 4549: 0x6A4D,
- 4550: 0x6A4E,
- 4551: 0x6A4F,
- 4552: 0x6A51,
- 4553: 0x6A52,
- 4554: 0x6A53,
- 4555: 0x6A54,
- 4556: 0x6A55,
- 4557: 0x6A56,
- 4558: 0x6A57,
- 4559: 0x6A5A,
- 4560: 0x6A5C,
- 4561: 0x6A5D,
- 4562: 0x6A5E,
- 4563: 0x6A5F,
- 4564: 0x6A60,
- 4565: 0x6A62,
- 4566: 0x6A63,
- 4567: 0x6A64,
- 4568: 0x6A66,
- 4569: 0x6A67,
- 4570: 0x6A68,
- 4571: 0x6A69,
- 4572: 0x6A6A,
- 4573: 0x6A6B,
- 4574: 0x6A6C,
- 4575: 0x6A6D,
- 4576: 0x6A6E,
- 4577: 0x6A6F,
- 4578: 0x6A70,
- 4579: 0x6A72,
- 4580: 0x6A73,
- 4581: 0x6A74,
- 4582: 0x6A75,
- 4583: 0x6A76,
- 4584: 0x6A77,
- 4585: 0x6A78,
- 4586: 0x6A7A,
- 4587: 0x6A7B,
- 4588: 0x6A7D,
- 4589: 0x6A7E,
- 4590: 0x6A7F,
- 4591: 0x6A81,
- 4592: 0x6A82,
- 4593: 0x6A83,
- 4594: 0x6A85,
- 4595: 0x6A86,
- 4596: 0x6A87,
- 4597: 0x6A88,
- 4598: 0x6A89,
- 4599: 0x6A8A,
- 4600: 0x6A8B,
- 4601: 0x6A8C,
- 4602: 0x6A8D,
- 4603: 0x6A8F,
- 4604: 0x6A92,
- 4605: 0x6A93,
- 4606: 0x6A94,
- 4607: 0x6A95,
- 4608: 0x6A96,
- 4609: 0x6A98,
- 4610: 0x6A99,
- 4611: 0x6A9A,
- 4612: 0x6A9B,
- 4613: 0x6A9C,
- 4614: 0x6A9D,
- 4615: 0x6A9E,
- 4616: 0x6A9F,
- 4617: 0x6AA1,
- 4618: 0x6AA2,
- 4619: 0x6AA3,
- 4620: 0x6AA4,
- 4621: 0x6AA5,
- 4622: 0x6AA6,
- 4623: 0x6AA7,
- 4624: 0x6AA8,
- 4625: 0x6AAA,
- 4626: 0x6AAD,
- 4627: 0x6AAE,
- 4628: 0x6AAF,
- 4629: 0x6AB0,
- 4630: 0x6AB1,
- 4631: 0x6AB2,
- 4632: 0x6AB3,
- 4633: 0x6AB4,
- 4634: 0x6AB5,
- 4635: 0x6AB6,
- 4636: 0x6AB7,
- 4637: 0x6AB8,
- 4638: 0x6AB9,
- 4639: 0x6ABA,
- 4640: 0x6ABB,
- 4641: 0x6ABC,
- 4642: 0x6ABD,
- 4643: 0x6ABE,
- 4644: 0x6ABF,
- 4645: 0x6AC0,
- 4646: 0x6AC1,
- 4647: 0x6AC2,
- 4648: 0x6AC3,
- 4649: 0x6AC4,
- 4650: 0x6AC5,
- 4651: 0x6AC6,
- 4652: 0x6AC7,
- 4653: 0x6AC8,
- 4654: 0x6AC9,
- 4655: 0x6ACA,
- 4656: 0x6ACB,
- 4657: 0x6ACC,
- 4658: 0x6ACD,
- 4659: 0x6ACE,
- 4660: 0x6ACF,
- 4661: 0x6AD0,
- 4662: 0x6AD1,
- 4663: 0x6AD2,
- 4664: 0x6AD3,
- 4665: 0x6AD4,
- 4666: 0x6AD5,
- 4667: 0x6AD6,
- 4668: 0x6AD7,
- 4669: 0x6AD8,
- 4670: 0x6AD9,
- 4671: 0x6ADA,
- 4672: 0x6ADB,
- 4673: 0x6ADC,
- 4674: 0x6ADD,
- 4675: 0x6ADE,
- 4676: 0x6ADF,
- 4677: 0x6AE0,
- 4678: 0x6AE1,
- 4679: 0x6AE2,
- 4680: 0x6AE3,
- 4681: 0x6AE4,
- 4682: 0x6AE5,
- 4683: 0x6AE6,
- 4684: 0x6AE7,
- 4685: 0x6AE8,
- 4686: 0x6AE9,
- 4687: 0x6AEA,
- 4688: 0x6AEB,
- 4689: 0x6AEC,
- 4690: 0x6AED,
- 4691: 0x6AEE,
- 4692: 0x6AEF,
- 4693: 0x6AF0,
- 4694: 0x6AF1,
- 4695: 0x6AF2,
- 4696: 0x6AF3,
- 4697: 0x6AF4,
- 4698: 0x6AF5,
- 4699: 0x6AF6,
- 4700: 0x6AF7,
- 4701: 0x6AF8,
- 4702: 0x6AF9,
- 4703: 0x6AFA,
- 4704: 0x6AFB,
- 4705: 0x6AFC,
- 4706: 0x6AFD,
- 4707: 0x6AFE,
- 4708: 0x6AFF,
- 4709: 0x6B00,
- 4710: 0x6B01,
- 4711: 0x6B02,
- 4712: 0x6B03,
- 4713: 0x6B04,
- 4714: 0x6B05,
- 4715: 0x6B06,
- 4716: 0x6B07,
- 4717: 0x6B08,
- 4718: 0x6B09,
- 4719: 0x6B0A,
- 4720: 0x6B0B,
- 4721: 0x6B0C,
- 4722: 0x6B0D,
- 4723: 0x6B0E,
- 4724: 0x6B0F,
- 4725: 0x6B10,
- 4726: 0x6B11,
- 4727: 0x6B12,
- 4728: 0x6B13,
- 4729: 0x6B14,
- 4730: 0x6B15,
- 4731: 0x6B16,
- 4732: 0x6B17,
- 4733: 0x6B18,
- 4734: 0x6B19,
- 4735: 0x6B1A,
- 4736: 0x6B1B,
- 4737: 0x6B1C,
- 4738: 0x6B1D,
- 4739: 0x6B1E,
- 4740: 0x6B1F,
- 4741: 0x6B25,
- 4742: 0x6B26,
- 4743: 0x6B28,
- 4744: 0x6B29,
- 4745: 0x6B2A,
- 4746: 0x6B2B,
- 4747: 0x6B2C,
- 4748: 0x6B2D,
- 4749: 0x6B2E,
- 4750: 0x6B2F,
- 4751: 0x6B30,
- 4752: 0x6B31,
- 4753: 0x6B33,
- 4754: 0x6B34,
- 4755: 0x6B35,
- 4756: 0x6B36,
- 4757: 0x6B38,
- 4758: 0x6B3B,
- 4759: 0x6B3C,
- 4760: 0x6B3D,
- 4761: 0x6B3F,
- 4762: 0x6B40,
- 4763: 0x6B41,
- 4764: 0x6B42,
- 4765: 0x6B44,
- 4766: 0x6B45,
- 4767: 0x6B48,
- 4768: 0x6B4A,
- 4769: 0x6B4B,
- 4770: 0x6B4D,
- 4771: 0x6B4E,
- 4772: 0x6B4F,
- 4773: 0x6B50,
- 4774: 0x6B51,
- 4775: 0x6B52,
- 4776: 0x6B53,
- 4777: 0x6B54,
- 4778: 0x6B55,
- 4779: 0x6B56,
- 4780: 0x6B57,
- 4781: 0x6B58,
- 4782: 0x6B5A,
- 4783: 0x6B5B,
- 4784: 0x6B5C,
- 4785: 0x6B5D,
- 4786: 0x6B5E,
- 4787: 0x6B5F,
- 4788: 0x6B60,
- 4789: 0x6B61,
- 4790: 0x6B68,
- 4791: 0x6B69,
- 4792: 0x6B6B,
- 4793: 0x6B6C,
- 4794: 0x6B6D,
- 4795: 0x6B6E,
- 4796: 0x6B6F,
- 4797: 0x6B70,
- 4798: 0x6B71,
- 4799: 0x6B72,
- 4800: 0x6B73,
- 4801: 0x6B74,
- 4802: 0x6B75,
- 4803: 0x6B76,
- 4804: 0x6B77,
- 4805: 0x6B78,
- 4806: 0x6B7A,
- 4807: 0x6B7D,
- 4808: 0x6B7E,
- 4809: 0x6B7F,
- 4810: 0x6B80,
- 4811: 0x6B85,
- 4812: 0x6B88,
- 4813: 0x6B8C,
- 4814: 0x6B8E,
- 4815: 0x6B8F,
- 4816: 0x6B90,
- 4817: 0x6B91,
- 4818: 0x6B94,
- 4819: 0x6B95,
- 4820: 0x6B97,
- 4821: 0x6B98,
- 4822: 0x6B99,
- 4823: 0x6B9C,
- 4824: 0x6B9D,
- 4825: 0x6B9E,
- 4826: 0x6B9F,
- 4827: 0x6BA0,
- 4828: 0x6BA2,
- 4829: 0x6BA3,
- 4830: 0x6BA4,
- 4831: 0x6BA5,
- 4832: 0x6BA6,
- 4833: 0x6BA7,
- 4834: 0x6BA8,
- 4835: 0x6BA9,
- 4836: 0x6BAB,
- 4837: 0x6BAC,
- 4838: 0x6BAD,
- 4839: 0x6BAE,
- 4840: 0x6BAF,
- 4841: 0x6BB0,
- 4842: 0x6BB1,
- 4843: 0x6BB2,
- 4844: 0x6BB6,
- 4845: 0x6BB8,
- 4846: 0x6BB9,
- 4847: 0x6BBA,
- 4848: 0x6BBB,
- 4849: 0x6BBC,
- 4850: 0x6BBD,
- 4851: 0x6BBE,
- 4852: 0x6BC0,
- 4853: 0x6BC3,
- 4854: 0x6BC4,
- 4855: 0x6BC6,
- 4856: 0x6BC7,
- 4857: 0x6BC8,
- 4858: 0x6BC9,
- 4859: 0x6BCA,
- 4860: 0x6BCC,
- 4861: 0x6BCE,
- 4862: 0x6BD0,
- 4863: 0x6BD1,
- 4864: 0x6BD8,
- 4865: 0x6BDA,
- 4866: 0x6BDC,
- 4867: 0x6BDD,
- 4868: 0x6BDE,
- 4869: 0x6BDF,
- 4870: 0x6BE0,
- 4871: 0x6BE2,
- 4872: 0x6BE3,
- 4873: 0x6BE4,
- 4874: 0x6BE5,
- 4875: 0x6BE6,
- 4876: 0x6BE7,
- 4877: 0x6BE8,
- 4878: 0x6BE9,
- 4879: 0x6BEC,
- 4880: 0x6BED,
- 4881: 0x6BEE,
- 4882: 0x6BF0,
- 4883: 0x6BF1,
- 4884: 0x6BF2,
- 4885: 0x6BF4,
- 4886: 0x6BF6,
- 4887: 0x6BF7,
- 4888: 0x6BF8,
- 4889: 0x6BFA,
- 4890: 0x6BFB,
- 4891: 0x6BFC,
- 4892: 0x6BFE,
- 4893: 0x6BFF,
- 4894: 0x6C00,
- 4895: 0x6C01,
- 4896: 0x6C02,
- 4897: 0x6C03,
- 4898: 0x6C04,
- 4899: 0x6C08,
- 4900: 0x6C09,
- 4901: 0x6C0A,
- 4902: 0x6C0B,
- 4903: 0x6C0C,
- 4904: 0x6C0E,
- 4905: 0x6C12,
- 4906: 0x6C17,
- 4907: 0x6C1C,
- 4908: 0x6C1D,
- 4909: 0x6C1E,
- 4910: 0x6C20,
- 4911: 0x6C23,
- 4912: 0x6C25,
- 4913: 0x6C2B,
- 4914: 0x6C2C,
- 4915: 0x6C2D,
- 4916: 0x6C31,
- 4917: 0x6C33,
- 4918: 0x6C36,
- 4919: 0x6C37,
- 4920: 0x6C39,
- 4921: 0x6C3A,
- 4922: 0x6C3B,
- 4923: 0x6C3C,
- 4924: 0x6C3E,
- 4925: 0x6C3F,
- 4926: 0x6C43,
- 4927: 0x6C44,
- 4928: 0x6C45,
- 4929: 0x6C48,
- 4930: 0x6C4B,
- 4931: 0x6C4C,
- 4932: 0x6C4D,
- 4933: 0x6C4E,
- 4934: 0x6C4F,
- 4935: 0x6C51,
- 4936: 0x6C52,
- 4937: 0x6C53,
- 4938: 0x6C56,
- 4939: 0x6C58,
- 4940: 0x6C59,
- 4941: 0x6C5A,
- 4942: 0x6C62,
- 4943: 0x6C63,
- 4944: 0x6C65,
- 4945: 0x6C66,
- 4946: 0x6C67,
- 4947: 0x6C6B,
- 4948: 0x6C6C,
- 4949: 0x6C6D,
- 4950: 0x6C6E,
- 4951: 0x6C6F,
- 4952: 0x6C71,
- 4953: 0x6C73,
- 4954: 0x6C75,
- 4955: 0x6C77,
- 4956: 0x6C78,
- 4957: 0x6C7A,
- 4958: 0x6C7B,
- 4959: 0x6C7C,
- 4960: 0x6C7F,
- 4961: 0x6C80,
- 4962: 0x6C84,
- 4963: 0x6C87,
- 4964: 0x6C8A,
- 4965: 0x6C8B,
- 4966: 0x6C8D,
- 4967: 0x6C8E,
- 4968: 0x6C91,
- 4969: 0x6C92,
- 4970: 0x6C95,
- 4971: 0x6C96,
- 4972: 0x6C97,
- 4973: 0x6C98,
- 4974: 0x6C9A,
- 4975: 0x6C9C,
- 4976: 0x6C9D,
- 4977: 0x6C9E,
- 4978: 0x6CA0,
- 4979: 0x6CA2,
- 4980: 0x6CA8,
- 4981: 0x6CAC,
- 4982: 0x6CAF,
- 4983: 0x6CB0,
- 4984: 0x6CB4,
- 4985: 0x6CB5,
- 4986: 0x6CB6,
- 4987: 0x6CB7,
- 4988: 0x6CBA,
- 4989: 0x6CC0,
- 4990: 0x6CC1,
- 4991: 0x6CC2,
- 4992: 0x6CC3,
- 4993: 0x6CC6,
- 4994: 0x6CC7,
- 4995: 0x6CC8,
- 4996: 0x6CCB,
- 4997: 0x6CCD,
- 4998: 0x6CCE,
- 4999: 0x6CCF,
- 5000: 0x6CD1,
- 5001: 0x6CD2,
- 5002: 0x6CD8,
- 5003: 0x6CD9,
- 5004: 0x6CDA,
- 5005: 0x6CDC,
- 5006: 0x6CDD,
- 5007: 0x6CDF,
- 5008: 0x6CE4,
- 5009: 0x6CE6,
- 5010: 0x6CE7,
- 5011: 0x6CE9,
- 5012: 0x6CEC,
- 5013: 0x6CED,
- 5014: 0x6CF2,
- 5015: 0x6CF4,
- 5016: 0x6CF9,
- 5017: 0x6CFF,
- 5018: 0x6D00,
- 5019: 0x6D02,
- 5020: 0x6D03,
- 5021: 0x6D05,
- 5022: 0x6D06,
- 5023: 0x6D08,
- 5024: 0x6D09,
- 5025: 0x6D0A,
- 5026: 0x6D0D,
- 5027: 0x6D0F,
- 5028: 0x6D10,
- 5029: 0x6D11,
- 5030: 0x6D13,
- 5031: 0x6D14,
- 5032: 0x6D15,
- 5033: 0x6D16,
- 5034: 0x6D18,
- 5035: 0x6D1C,
- 5036: 0x6D1D,
- 5037: 0x6D1F,
- 5038: 0x6D20,
- 5039: 0x6D21,
- 5040: 0x6D22,
- 5041: 0x6D23,
- 5042: 0x6D24,
- 5043: 0x6D26,
- 5044: 0x6D28,
- 5045: 0x6D29,
- 5046: 0x6D2C,
- 5047: 0x6D2D,
- 5048: 0x6D2F,
- 5049: 0x6D30,
- 5050: 0x6D34,
- 5051: 0x6D36,
- 5052: 0x6D37,
- 5053: 0x6D38,
- 5054: 0x6D3A,
- 5055: 0x6D3F,
- 5056: 0x6D40,
- 5057: 0x6D42,
- 5058: 0x6D44,
- 5059: 0x6D49,
- 5060: 0x6D4C,
- 5061: 0x6D50,
- 5062: 0x6D55,
- 5063: 0x6D56,
- 5064: 0x6D57,
- 5065: 0x6D58,
- 5066: 0x6D5B,
- 5067: 0x6D5D,
- 5068: 0x6D5F,
- 5069: 0x6D61,
- 5070: 0x6D62,
- 5071: 0x6D64,
- 5072: 0x6D65,
- 5073: 0x6D67,
- 5074: 0x6D68,
- 5075: 0x6D6B,
- 5076: 0x6D6C,
- 5077: 0x6D6D,
- 5078: 0x6D70,
- 5079: 0x6D71,
- 5080: 0x6D72,
- 5081: 0x6D73,
- 5082: 0x6D75,
- 5083: 0x6D76,
- 5084: 0x6D79,
- 5085: 0x6D7A,
- 5086: 0x6D7B,
- 5087: 0x6D7D,
- 5088: 0x6D7E,
- 5089: 0x6D7F,
- 5090: 0x6D80,
- 5091: 0x6D81,
- 5092: 0x6D83,
- 5093: 0x6D84,
- 5094: 0x6D86,
- 5095: 0x6D87,
- 5096: 0x6D8A,
- 5097: 0x6D8B,
- 5098: 0x6D8D,
- 5099: 0x6D8F,
- 5100: 0x6D90,
- 5101: 0x6D92,
- 5102: 0x6D96,
- 5103: 0x6D97,
- 5104: 0x6D98,
- 5105: 0x6D99,
- 5106: 0x6D9A,
- 5107: 0x6D9C,
- 5108: 0x6DA2,
- 5109: 0x6DA5,
- 5110: 0x6DAC,
- 5111: 0x6DAD,
- 5112: 0x6DB0,
- 5113: 0x6DB1,
- 5114: 0x6DB3,
- 5115: 0x6DB4,
- 5116: 0x6DB6,
- 5117: 0x6DB7,
- 5118: 0x6DB9,
- 5119: 0x6DBA,
- 5120: 0x6DBB,
- 5121: 0x6DBC,
- 5122: 0x6DBD,
- 5123: 0x6DBE,
- 5124: 0x6DC1,
- 5125: 0x6DC2,
- 5126: 0x6DC3,
- 5127: 0x6DC8,
- 5128: 0x6DC9,
- 5129: 0x6DCA,
- 5130: 0x6DCD,
- 5131: 0x6DCE,
- 5132: 0x6DCF,
- 5133: 0x6DD0,
- 5134: 0x6DD2,
- 5135: 0x6DD3,
- 5136: 0x6DD4,
- 5137: 0x6DD5,
- 5138: 0x6DD7,
- 5139: 0x6DDA,
- 5140: 0x6DDB,
- 5141: 0x6DDC,
- 5142: 0x6DDF,
- 5143: 0x6DE2,
- 5144: 0x6DE3,
- 5145: 0x6DE5,
- 5146: 0x6DE7,
- 5147: 0x6DE8,
- 5148: 0x6DE9,
- 5149: 0x6DEA,
- 5150: 0x6DED,
- 5151: 0x6DEF,
- 5152: 0x6DF0,
- 5153: 0x6DF2,
- 5154: 0x6DF4,
- 5155: 0x6DF5,
- 5156: 0x6DF6,
- 5157: 0x6DF8,
- 5158: 0x6DFA,
- 5159: 0x6DFD,
- 5160: 0x6DFE,
- 5161: 0x6DFF,
- 5162: 0x6E00,
- 5163: 0x6E01,
- 5164: 0x6E02,
- 5165: 0x6E03,
- 5166: 0x6E04,
- 5167: 0x6E06,
- 5168: 0x6E07,
- 5169: 0x6E08,
- 5170: 0x6E09,
- 5171: 0x6E0B,
- 5172: 0x6E0F,
- 5173: 0x6E12,
- 5174: 0x6E13,
- 5175: 0x6E15,
- 5176: 0x6E18,
- 5177: 0x6E19,
- 5178: 0x6E1B,
- 5179: 0x6E1C,
- 5180: 0x6E1E,
- 5181: 0x6E1F,
- 5182: 0x6E22,
- 5183: 0x6E26,
- 5184: 0x6E27,
- 5185: 0x6E28,
- 5186: 0x6E2A,
- 5187: 0x6E2C,
- 5188: 0x6E2E,
- 5189: 0x6E30,
- 5190: 0x6E31,
- 5191: 0x6E33,
- 5192: 0x6E35,
- 5193: 0x6E36,
- 5194: 0x6E37,
- 5195: 0x6E39,
- 5196: 0x6E3B,
- 5197: 0x6E3C,
- 5198: 0x6E3D,
- 5199: 0x6E3E,
- 5200: 0x6E3F,
- 5201: 0x6E40,
- 5202: 0x6E41,
- 5203: 0x6E42,
- 5204: 0x6E45,
- 5205: 0x6E46,
- 5206: 0x6E47,
- 5207: 0x6E48,
- 5208: 0x6E49,
- 5209: 0x6E4A,
- 5210: 0x6E4B,
- 5211: 0x6E4C,
- 5212: 0x6E4F,
- 5213: 0x6E50,
- 5214: 0x6E51,
- 5215: 0x6E52,
- 5216: 0x6E55,
- 5217: 0x6E57,
- 5218: 0x6E59,
- 5219: 0x6E5A,
- 5220: 0x6E5C,
- 5221: 0x6E5D,
- 5222: 0x6E5E,
- 5223: 0x6E60,
- 5224: 0x6E61,
- 5225: 0x6E62,
- 5226: 0x6E63,
- 5227: 0x6E64,
- 5228: 0x6E65,
- 5229: 0x6E66,
- 5230: 0x6E67,
- 5231: 0x6E68,
- 5232: 0x6E69,
- 5233: 0x6E6A,
- 5234: 0x6E6C,
- 5235: 0x6E6D,
- 5236: 0x6E6F,
- 5237: 0x6E70,
- 5238: 0x6E71,
- 5239: 0x6E72,
- 5240: 0x6E73,
- 5241: 0x6E74,
- 5242: 0x6E75,
- 5243: 0x6E76,
- 5244: 0x6E77,
- 5245: 0x6E78,
- 5246: 0x6E79,
- 5247: 0x6E7A,
- 5248: 0x6E7B,
- 5249: 0x6E7C,
- 5250: 0x6E7D,
- 5251: 0x6E80,
- 5252: 0x6E81,
- 5253: 0x6E82,
- 5254: 0x6E84,
- 5255: 0x6E87,
- 5256: 0x6E88,
- 5257: 0x6E8A,
- 5258: 0x6E8B,
- 5259: 0x6E8C,
- 5260: 0x6E8D,
- 5261: 0x6E8E,
- 5262: 0x6E91,
- 5263: 0x6E92,
- 5264: 0x6E93,
- 5265: 0x6E94,
- 5266: 0x6E95,
- 5267: 0x6E96,
- 5268: 0x6E97,
- 5269: 0x6E99,
- 5270: 0x6E9A,
- 5271: 0x6E9B,
- 5272: 0x6E9D,
- 5273: 0x6E9E,
- 5274: 0x6EA0,
- 5275: 0x6EA1,
- 5276: 0x6EA3,
- 5277: 0x6EA4,
- 5278: 0x6EA6,
- 5279: 0x6EA8,
- 5280: 0x6EA9,
- 5281: 0x6EAB,
- 5282: 0x6EAC,
- 5283: 0x6EAD,
- 5284: 0x6EAE,
- 5285: 0x6EB0,
- 5286: 0x6EB3,
- 5287: 0x6EB5,
- 5288: 0x6EB8,
- 5289: 0x6EB9,
- 5290: 0x6EBC,
- 5291: 0x6EBE,
- 5292: 0x6EBF,
- 5293: 0x6EC0,
- 5294: 0x6EC3,
- 5295: 0x6EC4,
- 5296: 0x6EC5,
- 5297: 0x6EC6,
- 5298: 0x6EC8,
- 5299: 0x6EC9,
- 5300: 0x6ECA,
- 5301: 0x6ECC,
- 5302: 0x6ECD,
- 5303: 0x6ECE,
- 5304: 0x6ED0,
- 5305: 0x6ED2,
- 5306: 0x6ED6,
- 5307: 0x6ED8,
- 5308: 0x6ED9,
- 5309: 0x6EDB,
- 5310: 0x6EDC,
- 5311: 0x6EDD,
- 5312: 0x6EE3,
- 5313: 0x6EE7,
- 5314: 0x6EEA,
- 5315: 0x6EEB,
- 5316: 0x6EEC,
- 5317: 0x6EED,
- 5318: 0x6EEE,
- 5319: 0x6EEF,
- 5320: 0x6EF0,
- 5321: 0x6EF1,
- 5322: 0x6EF2,
- 5323: 0x6EF3,
- 5324: 0x6EF5,
- 5325: 0x6EF6,
- 5326: 0x6EF7,
- 5327: 0x6EF8,
- 5328: 0x6EFA,
- 5329: 0x6EFB,
- 5330: 0x6EFC,
- 5331: 0x6EFD,
- 5332: 0x6EFE,
- 5333: 0x6EFF,
- 5334: 0x6F00,
- 5335: 0x6F01,
- 5336: 0x6F03,
- 5337: 0x6F04,
- 5338: 0x6F05,
- 5339: 0x6F07,
- 5340: 0x6F08,
- 5341: 0x6F0A,
- 5342: 0x6F0B,
- 5343: 0x6F0C,
- 5344: 0x6F0D,
- 5345: 0x6F0E,
- 5346: 0x6F10,
- 5347: 0x6F11,
- 5348: 0x6F12,
- 5349: 0x6F16,
- 5350: 0x6F17,
- 5351: 0x6F18,
- 5352: 0x6F19,
- 5353: 0x6F1A,
- 5354: 0x6F1B,
- 5355: 0x6F1C,
- 5356: 0x6F1D,
- 5357: 0x6F1E,
- 5358: 0x6F1F,
- 5359: 0x6F21,
- 5360: 0x6F22,
- 5361: 0x6F23,
- 5362: 0x6F25,
- 5363: 0x6F26,
- 5364: 0x6F27,
- 5365: 0x6F28,
- 5366: 0x6F2C,
- 5367: 0x6F2E,
- 5368: 0x6F30,
- 5369: 0x6F32,
- 5370: 0x6F34,
- 5371: 0x6F35,
- 5372: 0x6F37,
- 5373: 0x6F38,
- 5374: 0x6F39,
- 5375: 0x6F3A,
- 5376: 0x6F3B,
- 5377: 0x6F3C,
- 5378: 0x6F3D,
- 5379: 0x6F3F,
- 5380: 0x6F40,
- 5381: 0x6F41,
- 5382: 0x6F42,
- 5383: 0x6F43,
- 5384: 0x6F44,
- 5385: 0x6F45,
- 5386: 0x6F48,
- 5387: 0x6F49,
- 5388: 0x6F4A,
- 5389: 0x6F4C,
- 5390: 0x6F4E,
- 5391: 0x6F4F,
- 5392: 0x6F50,
- 5393: 0x6F51,
- 5394: 0x6F52,
- 5395: 0x6F53,
- 5396: 0x6F54,
- 5397: 0x6F55,
- 5398: 0x6F56,
- 5399: 0x6F57,
- 5400: 0x6F59,
- 5401: 0x6F5A,
- 5402: 0x6F5B,
- 5403: 0x6F5D,
- 5404: 0x6F5F,
- 5405: 0x6F60,
- 5406: 0x6F61,
- 5407: 0x6F63,
- 5408: 0x6F64,
- 5409: 0x6F65,
- 5410: 0x6F67,
- 5411: 0x6F68,
- 5412: 0x6F69,
- 5413: 0x6F6A,
- 5414: 0x6F6B,
- 5415: 0x6F6C,
- 5416: 0x6F6F,
- 5417: 0x6F70,
- 5418: 0x6F71,
- 5419: 0x6F73,
- 5420: 0x6F75,
- 5421: 0x6F76,
- 5422: 0x6F77,
- 5423: 0x6F79,
- 5424: 0x6F7B,
- 5425: 0x6F7D,
- 5426: 0x6F7E,
- 5427: 0x6F7F,
- 5428: 0x6F80,
- 5429: 0x6F81,
- 5430: 0x6F82,
- 5431: 0x6F83,
- 5432: 0x6F85,
- 5433: 0x6F86,
- 5434: 0x6F87,
- 5435: 0x6F8A,
- 5436: 0x6F8B,
- 5437: 0x6F8F,
- 5438: 0x6F90,
- 5439: 0x6F91,
- 5440: 0x6F92,
- 5441: 0x6F93,
- 5442: 0x6F94,
- 5443: 0x6F95,
- 5444: 0x6F96,
- 5445: 0x6F97,
- 5446: 0x6F98,
- 5447: 0x6F99,
- 5448: 0x6F9A,
- 5449: 0x6F9B,
- 5450: 0x6F9D,
- 5451: 0x6F9E,
- 5452: 0x6F9F,
- 5453: 0x6FA0,
- 5454: 0x6FA2,
- 5455: 0x6FA3,
- 5456: 0x6FA4,
- 5457: 0x6FA5,
- 5458: 0x6FA6,
- 5459: 0x6FA8,
- 5460: 0x6FA9,
- 5461: 0x6FAA,
- 5462: 0x6FAB,
- 5463: 0x6FAC,
- 5464: 0x6FAD,
- 5465: 0x6FAE,
- 5466: 0x6FAF,
- 5467: 0x6FB0,
- 5468: 0x6FB1,
- 5469: 0x6FB2,
- 5470: 0x6FB4,
- 5471: 0x6FB5,
- 5472: 0x6FB7,
- 5473: 0x6FB8,
- 5474: 0x6FBA,
- 5475: 0x6FBB,
- 5476: 0x6FBC,
- 5477: 0x6FBD,
- 5478: 0x6FBE,
- 5479: 0x6FBF,
- 5480: 0x6FC1,
- 5481: 0x6FC3,
- 5482: 0x6FC4,
- 5483: 0x6FC5,
- 5484: 0x6FC6,
- 5485: 0x6FC7,
- 5486: 0x6FC8,
- 5487: 0x6FCA,
- 5488: 0x6FCB,
- 5489: 0x6FCC,
- 5490: 0x6FCD,
- 5491: 0x6FCE,
- 5492: 0x6FCF,
- 5493: 0x6FD0,
- 5494: 0x6FD3,
- 5495: 0x6FD4,
- 5496: 0x6FD5,
- 5497: 0x6FD6,
- 5498: 0x6FD7,
- 5499: 0x6FD8,
- 5500: 0x6FD9,
- 5501: 0x6FDA,
- 5502: 0x6FDB,
- 5503: 0x6FDC,
- 5504: 0x6FDD,
- 5505: 0x6FDF,
- 5506: 0x6FE2,
- 5507: 0x6FE3,
- 5508: 0x6FE4,
- 5509: 0x6FE5,
- 5510: 0x6FE6,
- 5511: 0x6FE7,
- 5512: 0x6FE8,
- 5513: 0x6FE9,
- 5514: 0x6FEA,
- 5515: 0x6FEB,
- 5516: 0x6FEC,
- 5517: 0x6FED,
- 5518: 0x6FF0,
- 5519: 0x6FF1,
- 5520: 0x6FF2,
- 5521: 0x6FF3,
- 5522: 0x6FF4,
- 5523: 0x6FF5,
- 5524: 0x6FF6,
- 5525: 0x6FF7,
- 5526: 0x6FF8,
- 5527: 0x6FF9,
- 5528: 0x6FFA,
- 5529: 0x6FFB,
- 5530: 0x6FFC,
- 5531: 0x6FFD,
- 5532: 0x6FFE,
- 5533: 0x6FFF,
- 5534: 0x7000,
- 5535: 0x7001,
- 5536: 0x7002,
- 5537: 0x7003,
- 5538: 0x7004,
- 5539: 0x7005,
- 5540: 0x7006,
- 5541: 0x7007,
- 5542: 0x7008,
- 5543: 0x7009,
- 5544: 0x700A,
- 5545: 0x700B,
- 5546: 0x700C,
- 5547: 0x700D,
- 5548: 0x700E,
- 5549: 0x700F,
- 5550: 0x7010,
- 5551: 0x7012,
- 5552: 0x7013,
- 5553: 0x7014,
- 5554: 0x7015,
- 5555: 0x7016,
- 5556: 0x7017,
- 5557: 0x7018,
- 5558: 0x7019,
- 5559: 0x701C,
- 5560: 0x701D,
- 5561: 0x701E,
- 5562: 0x701F,
- 5563: 0x7020,
- 5564: 0x7021,
- 5565: 0x7022,
- 5566: 0x7024,
- 5567: 0x7025,
- 5568: 0x7026,
- 5569: 0x7027,
- 5570: 0x7028,
- 5571: 0x7029,
- 5572: 0x702A,
- 5573: 0x702B,
- 5574: 0x702C,
- 5575: 0x702D,
- 5576: 0x702E,
- 5577: 0x702F,
- 5578: 0x7030,
- 5579: 0x7031,
- 5580: 0x7032,
- 5581: 0x7033,
- 5582: 0x7034,
- 5583: 0x7036,
- 5584: 0x7037,
- 5585: 0x7038,
- 5586: 0x703A,
- 5587: 0x703B,
- 5588: 0x703C,
- 5589: 0x703D,
- 5590: 0x703E,
- 5591: 0x703F,
- 5592: 0x7040,
- 5593: 0x7041,
- 5594: 0x7042,
- 5595: 0x7043,
- 5596: 0x7044,
- 5597: 0x7045,
- 5598: 0x7046,
- 5599: 0x7047,
- 5600: 0x7048,
- 5601: 0x7049,
- 5602: 0x704A,
- 5603: 0x704B,
- 5604: 0x704D,
- 5605: 0x704E,
- 5606: 0x7050,
- 5607: 0x7051,
- 5608: 0x7052,
- 5609: 0x7053,
- 5610: 0x7054,
- 5611: 0x7055,
- 5612: 0x7056,
- 5613: 0x7057,
- 5614: 0x7058,
- 5615: 0x7059,
- 5616: 0x705A,
- 5617: 0x705B,
- 5618: 0x705C,
- 5619: 0x705D,
- 5620: 0x705F,
- 5621: 0x7060,
- 5622: 0x7061,
- 5623: 0x7062,
- 5624: 0x7063,
- 5625: 0x7064,
- 5626: 0x7065,
- 5627: 0x7066,
- 5628: 0x7067,
- 5629: 0x7068,
- 5630: 0x7069,
- 5631: 0x706A,
- 5632: 0x706E,
- 5633: 0x7071,
- 5634: 0x7072,
- 5635: 0x7073,
- 5636: 0x7074,
- 5637: 0x7077,
- 5638: 0x7079,
- 5639: 0x707A,
- 5640: 0x707B,
- 5641: 0x707D,
- 5642: 0x7081,
- 5643: 0x7082,
- 5644: 0x7083,
- 5645: 0x7084,
- 5646: 0x7086,
- 5647: 0x7087,
- 5648: 0x7088,
- 5649: 0x708B,
- 5650: 0x708C,
- 5651: 0x708D,
- 5652: 0x708F,
- 5653: 0x7090,
- 5654: 0x7091,
- 5655: 0x7093,
- 5656: 0x7097,
- 5657: 0x7098,
- 5658: 0x709A,
- 5659: 0x709B,
- 5660: 0x709E,
- 5661: 0x709F,
- 5662: 0x70A0,
- 5663: 0x70A1,
- 5664: 0x70A2,
- 5665: 0x70A3,
- 5666: 0x70A4,
- 5667: 0x70A5,
- 5668: 0x70A6,
- 5669: 0x70A7,
- 5670: 0x70A8,
- 5671: 0x70A9,
- 5672: 0x70AA,
- 5673: 0x70B0,
- 5674: 0x70B2,
- 5675: 0x70B4,
- 5676: 0x70B5,
- 5677: 0x70B6,
- 5678: 0x70BA,
- 5679: 0x70BE,
- 5680: 0x70BF,
- 5681: 0x70C4,
- 5682: 0x70C5,
- 5683: 0x70C6,
- 5684: 0x70C7,
- 5685: 0x70C9,
- 5686: 0x70CB,
- 5687: 0x70CC,
- 5688: 0x70CD,
- 5689: 0x70CE,
- 5690: 0x70CF,
- 5691: 0x70D0,
- 5692: 0x70D1,
- 5693: 0x70D2,
- 5694: 0x70D3,
- 5695: 0x70D4,
- 5696: 0x70D5,
- 5697: 0x70D6,
- 5698: 0x70D7,
- 5699: 0x70DA,
- 5700: 0x70DC,
- 5701: 0x70DD,
- 5702: 0x70DE,
- 5703: 0x70E0,
- 5704: 0x70E1,
- 5705: 0x70E2,
- 5706: 0x70E3,
- 5707: 0x70E5,
- 5708: 0x70EA,
- 5709: 0x70EE,
- 5710: 0x70F0,
- 5711: 0x70F1,
- 5712: 0x70F2,
- 5713: 0x70F3,
- 5714: 0x70F4,
- 5715: 0x70F5,
- 5716: 0x70F6,
- 5717: 0x70F8,
- 5718: 0x70FA,
- 5719: 0x70FB,
- 5720: 0x70FC,
- 5721: 0x70FE,
- 5722: 0x70FF,
- 5723: 0x7100,
- 5724: 0x7101,
- 5725: 0x7102,
- 5726: 0x7103,
- 5727: 0x7104,
- 5728: 0x7105,
- 5729: 0x7106,
- 5730: 0x7107,
- 5731: 0x7108,
- 5732: 0x710B,
- 5733: 0x710C,
- 5734: 0x710D,
- 5735: 0x710E,
- 5736: 0x710F,
- 5737: 0x7111,
- 5738: 0x7112,
- 5739: 0x7114,
- 5740: 0x7117,
- 5741: 0x711B,
- 5742: 0x711C,
- 5743: 0x711D,
- 5744: 0x711E,
- 5745: 0x711F,
- 5746: 0x7120,
- 5747: 0x7121,
- 5748: 0x7122,
- 5749: 0x7123,
- 5750: 0x7124,
- 5751: 0x7125,
- 5752: 0x7127,
- 5753: 0x7128,
- 5754: 0x7129,
- 5755: 0x712A,
- 5756: 0x712B,
- 5757: 0x712C,
- 5758: 0x712D,
- 5759: 0x712E,
- 5760: 0x7132,
- 5761: 0x7133,
- 5762: 0x7134,
- 5763: 0x7135,
- 5764: 0x7137,
- 5765: 0x7138,
- 5766: 0x7139,
- 5767: 0x713A,
- 5768: 0x713B,
- 5769: 0x713C,
- 5770: 0x713D,
- 5771: 0x713E,
- 5772: 0x713F,
- 5773: 0x7140,
- 5774: 0x7141,
- 5775: 0x7142,
- 5776: 0x7143,
- 5777: 0x7144,
- 5778: 0x7146,
- 5779: 0x7147,
- 5780: 0x7148,
- 5781: 0x7149,
- 5782: 0x714B,
- 5783: 0x714D,
- 5784: 0x714F,
- 5785: 0x7150,
- 5786: 0x7151,
- 5787: 0x7152,
- 5788: 0x7153,
- 5789: 0x7154,
- 5790: 0x7155,
- 5791: 0x7156,
- 5792: 0x7157,
- 5793: 0x7158,
- 5794: 0x7159,
- 5795: 0x715A,
- 5796: 0x715B,
- 5797: 0x715D,
- 5798: 0x715F,
- 5799: 0x7160,
- 5800: 0x7161,
- 5801: 0x7162,
- 5802: 0x7163,
- 5803: 0x7165,
- 5804: 0x7169,
- 5805: 0x716A,
- 5806: 0x716B,
- 5807: 0x716C,
- 5808: 0x716D,
- 5809: 0x716F,
- 5810: 0x7170,
- 5811: 0x7171,
- 5812: 0x7174,
- 5813: 0x7175,
- 5814: 0x7176,
- 5815: 0x7177,
- 5816: 0x7179,
- 5817: 0x717B,
- 5818: 0x717C,
- 5819: 0x717E,
- 5820: 0x717F,
- 5821: 0x7180,
- 5822: 0x7181,
- 5823: 0x7182,
- 5824: 0x7183,
- 5825: 0x7185,
- 5826: 0x7186,
- 5827: 0x7187,
- 5828: 0x7188,
- 5829: 0x7189,
- 5830: 0x718B,
- 5831: 0x718C,
- 5832: 0x718D,
- 5833: 0x718E,
- 5834: 0x7190,
- 5835: 0x7191,
- 5836: 0x7192,
- 5837: 0x7193,
- 5838: 0x7195,
- 5839: 0x7196,
- 5840: 0x7197,
- 5841: 0x719A,
- 5842: 0x719B,
- 5843: 0x719C,
- 5844: 0x719D,
- 5845: 0x719E,
- 5846: 0x71A1,
- 5847: 0x71A2,
- 5848: 0x71A3,
- 5849: 0x71A4,
- 5850: 0x71A5,
- 5851: 0x71A6,
- 5852: 0x71A7,
- 5853: 0x71A9,
- 5854: 0x71AA,
- 5855: 0x71AB,
- 5856: 0x71AD,
- 5857: 0x71AE,
- 5858: 0x71AF,
- 5859: 0x71B0,
- 5860: 0x71B1,
- 5861: 0x71B2,
- 5862: 0x71B4,
- 5863: 0x71B6,
- 5864: 0x71B7,
- 5865: 0x71B8,
- 5866: 0x71BA,
- 5867: 0x71BB,
- 5868: 0x71BC,
- 5869: 0x71BD,
- 5870: 0x71BE,
- 5871: 0x71BF,
- 5872: 0x71C0,
- 5873: 0x71C1,
- 5874: 0x71C2,
- 5875: 0x71C4,
- 5876: 0x71C5,
- 5877: 0x71C6,
- 5878: 0x71C7,
- 5879: 0x71C8,
- 5880: 0x71C9,
- 5881: 0x71CA,
- 5882: 0x71CB,
- 5883: 0x71CC,
- 5884: 0x71CD,
- 5885: 0x71CF,
- 5886: 0x71D0,
- 5887: 0x71D1,
- 5888: 0x71D2,
- 5889: 0x71D3,
- 5890: 0x71D6,
- 5891: 0x71D7,
- 5892: 0x71D8,
- 5893: 0x71D9,
- 5894: 0x71DA,
- 5895: 0x71DB,
- 5896: 0x71DC,
- 5897: 0x71DD,
- 5898: 0x71DE,
- 5899: 0x71DF,
- 5900: 0x71E1,
- 5901: 0x71E2,
- 5902: 0x71E3,
- 5903: 0x71E4,
- 5904: 0x71E6,
- 5905: 0x71E8,
- 5906: 0x71E9,
- 5907: 0x71EA,
- 5908: 0x71EB,
- 5909: 0x71EC,
- 5910: 0x71ED,
- 5911: 0x71EF,
- 5912: 0x71F0,
- 5913: 0x71F1,
- 5914: 0x71F2,
- 5915: 0x71F3,
- 5916: 0x71F4,
- 5917: 0x71F5,
- 5918: 0x71F6,
- 5919: 0x71F7,
- 5920: 0x71F8,
- 5921: 0x71FA,
- 5922: 0x71FB,
- 5923: 0x71FC,
- 5924: 0x71FD,
- 5925: 0x71FE,
- 5926: 0x71FF,
- 5927: 0x7200,
- 5928: 0x7201,
- 5929: 0x7202,
- 5930: 0x7203,
- 5931: 0x7204,
- 5932: 0x7205,
- 5933: 0x7207,
- 5934: 0x7208,
- 5935: 0x7209,
- 5936: 0x720A,
- 5937: 0x720B,
- 5938: 0x720C,
- 5939: 0x720D,
- 5940: 0x720E,
- 5941: 0x720F,
- 5942: 0x7210,
- 5943: 0x7211,
- 5944: 0x7212,
- 5945: 0x7213,
- 5946: 0x7214,
- 5947: 0x7215,
- 5948: 0x7216,
- 5949: 0x7217,
- 5950: 0x7218,
- 5951: 0x7219,
- 5952: 0x721A,
- 5953: 0x721B,
- 5954: 0x721C,
- 5955: 0x721E,
- 5956: 0x721F,
- 5957: 0x7220,
- 5958: 0x7221,
- 5959: 0x7222,
- 5960: 0x7223,
- 5961: 0x7224,
- 5962: 0x7225,
- 5963: 0x7226,
- 5964: 0x7227,
- 5965: 0x7229,
- 5966: 0x722B,
- 5967: 0x722D,
- 5968: 0x722E,
- 5969: 0x722F,
- 5970: 0x7232,
- 5971: 0x7233,
- 5972: 0x7234,
- 5973: 0x723A,
- 5974: 0x723C,
- 5975: 0x723E,
- 5976: 0x7240,
- 5977: 0x7241,
- 5978: 0x7242,
- 5979: 0x7243,
- 5980: 0x7244,
- 5981: 0x7245,
- 5982: 0x7246,
- 5983: 0x7249,
- 5984: 0x724A,
- 5985: 0x724B,
- 5986: 0x724E,
- 5987: 0x724F,
- 5988: 0x7250,
- 5989: 0x7251,
- 5990: 0x7253,
- 5991: 0x7254,
- 5992: 0x7255,
- 5993: 0x7257,
- 5994: 0x7258,
- 5995: 0x725A,
- 5996: 0x725C,
- 5997: 0x725E,
- 5998: 0x7260,
- 5999: 0x7263,
- 6000: 0x7264,
- 6001: 0x7265,
- 6002: 0x7268,
- 6003: 0x726A,
- 6004: 0x726B,
- 6005: 0x726C,
- 6006: 0x726D,
- 6007: 0x7270,
- 6008: 0x7271,
- 6009: 0x7273,
- 6010: 0x7274,
- 6011: 0x7276,
- 6012: 0x7277,
- 6013: 0x7278,
- 6014: 0x727B,
- 6015: 0x727C,
- 6016: 0x727D,
- 6017: 0x7282,
- 6018: 0x7283,
- 6019: 0x7285,
- 6020: 0x7286,
- 6021: 0x7287,
- 6022: 0x7288,
- 6023: 0x7289,
- 6024: 0x728C,
- 6025: 0x728E,
- 6026: 0x7290,
- 6027: 0x7291,
- 6028: 0x7293,
- 6029: 0x7294,
- 6030: 0x7295,
- 6031: 0x7296,
- 6032: 0x7297,
- 6033: 0x7298,
- 6034: 0x7299,
- 6035: 0x729A,
- 6036: 0x729B,
- 6037: 0x729C,
- 6038: 0x729D,
- 6039: 0x729E,
- 6040: 0x72A0,
- 6041: 0x72A1,
- 6042: 0x72A2,
- 6043: 0x72A3,
- 6044: 0x72A4,
- 6045: 0x72A5,
- 6046: 0x72A6,
- 6047: 0x72A7,
- 6048: 0x72A8,
- 6049: 0x72A9,
- 6050: 0x72AA,
- 6051: 0x72AB,
- 6052: 0x72AE,
- 6053: 0x72B1,
- 6054: 0x72B2,
- 6055: 0x72B3,
- 6056: 0x72B5,
- 6057: 0x72BA,
- 6058: 0x72BB,
- 6059: 0x72BC,
- 6060: 0x72BD,
- 6061: 0x72BE,
- 6062: 0x72BF,
- 6063: 0x72C0,
- 6064: 0x72C5,
- 6065: 0x72C6,
- 6066: 0x72C7,
- 6067: 0x72C9,
- 6068: 0x72CA,
- 6069: 0x72CB,
- 6070: 0x72CC,
- 6071: 0x72CF,
- 6072: 0x72D1,
- 6073: 0x72D3,
- 6074: 0x72D4,
- 6075: 0x72D5,
- 6076: 0x72D6,
- 6077: 0x72D8,
- 6078: 0x72DA,
- 6079: 0x72DB,
- 6176: 0x3000,
- 6177: 0x3001,
- 6178: 0x3002,
- 6179: 0x00B7,
- 6180: 0x02C9,
- 6181: 0x02C7,
- 6182: 0x00A8,
- 6183: 0x3003,
- 6184: 0x3005,
- 6185: 0x2014,
- 6186: 0xFF5E,
- 6187: 0x2016,
- 6188: 0x2026,
- 6189: 0x2018,
- 6190: 0x2019,
- 6191: 0x201C,
- 6192: 0x201D,
- 6193: 0x3014,
- 6194: 0x3015,
- 6195: 0x3008,
- 6196: 0x3009,
- 6197: 0x300A,
- 6198: 0x300B,
- 6199: 0x300C,
- 6200: 0x300D,
- 6201: 0x300E,
- 6202: 0x300F,
- 6203: 0x3016,
- 6204: 0x3017,
- 6205: 0x3010,
- 6206: 0x3011,
- 6207: 0x00B1,
- 6208: 0x00D7,
- 6209: 0x00F7,
- 6210: 0x2236,
- 6211: 0x2227,
- 6212: 0x2228,
- 6213: 0x2211,
- 6214: 0x220F,
- 6215: 0x222A,
- 6216: 0x2229,
- 6217: 0x2208,
- 6218: 0x2237,
- 6219: 0x221A,
- 6220: 0x22A5,
- 6221: 0x2225,
- 6222: 0x2220,
- 6223: 0x2312,
- 6224: 0x2299,
- 6225: 0x222B,
- 6226: 0x222E,
- 6227: 0x2261,
- 6228: 0x224C,
- 6229: 0x2248,
- 6230: 0x223D,
- 6231: 0x221D,
- 6232: 0x2260,
- 6233: 0x226E,
- 6234: 0x226F,
- 6235: 0x2264,
- 6236: 0x2265,
- 6237: 0x221E,
- 6238: 0x2235,
- 6239: 0x2234,
- 6240: 0x2642,
- 6241: 0x2640,
- 6242: 0x00B0,
- 6243: 0x2032,
- 6244: 0x2033,
- 6245: 0x2103,
- 6246: 0xFF04,
- 6247: 0x00A4,
- 6248: 0xFFE0,
- 6249: 0xFFE1,
- 6250: 0x2030,
- 6251: 0x00A7,
- 6252: 0x2116,
- 6253: 0x2606,
- 6254: 0x2605,
- 6255: 0x25CB,
- 6256: 0x25CF,
- 6257: 0x25CE,
- 6258: 0x25C7,
- 6259: 0x25C6,
- 6260: 0x25A1,
- 6261: 0x25A0,
- 6262: 0x25B3,
- 6263: 0x25B2,
- 6264: 0x203B,
- 6265: 0x2192,
- 6266: 0x2190,
- 6267: 0x2191,
- 6268: 0x2193,
- 6269: 0x3013,
- 6366: 0x2170,
- 6367: 0x2171,
- 6368: 0x2172,
- 6369: 0x2173,
- 6370: 0x2174,
- 6371: 0x2175,
- 6372: 0x2176,
- 6373: 0x2177,
- 6374: 0x2178,
- 6375: 0x2179,
- 6382: 0x2488,
- 6383: 0x2489,
- 6384: 0x248A,
- 6385: 0x248B,
- 6386: 0x248C,
- 6387: 0x248D,
- 6388: 0x248E,
- 6389: 0x248F,
- 6390: 0x2490,
- 6391: 0x2491,
- 6392: 0x2492,
- 6393: 0x2493,
- 6394: 0x2494,
- 6395: 0x2495,
- 6396: 0x2496,
- 6397: 0x2497,
- 6398: 0x2498,
- 6399: 0x2499,
- 6400: 0x249A,
- 6401: 0x249B,
- 6402: 0x2474,
- 6403: 0x2475,
- 6404: 0x2476,
- 6405: 0x2477,
- 6406: 0x2478,
- 6407: 0x2479,
- 6408: 0x247A,
- 6409: 0x247B,
- 6410: 0x247C,
- 6411: 0x247D,
- 6412: 0x247E,
- 6413: 0x247F,
- 6414: 0x2480,
- 6415: 0x2481,
- 6416: 0x2482,
- 6417: 0x2483,
- 6418: 0x2484,
- 6419: 0x2485,
- 6420: 0x2486,
- 6421: 0x2487,
- 6422: 0x2460,
- 6423: 0x2461,
- 6424: 0x2462,
- 6425: 0x2463,
- 6426: 0x2464,
- 6427: 0x2465,
- 6428: 0x2466,
- 6429: 0x2467,
- 6430: 0x2468,
- 6431: 0x2469,
- 6432: 0x20AC,
- 6434: 0x3220,
- 6435: 0x3221,
- 6436: 0x3222,
- 6437: 0x3223,
- 6438: 0x3224,
- 6439: 0x3225,
- 6440: 0x3226,
- 6441: 0x3227,
- 6442: 0x3228,
- 6443: 0x3229,
- 6446: 0x2160,
- 6447: 0x2161,
- 6448: 0x2162,
- 6449: 0x2163,
- 6450: 0x2164,
- 6451: 0x2165,
- 6452: 0x2166,
- 6453: 0x2167,
- 6454: 0x2168,
- 6455: 0x2169,
- 6456: 0x216A,
- 6457: 0x216B,
- 6555: 0x3000,
- 6556: 0xFF01,
- 6557: 0xFF02,
- 6558: 0xFF03,
- 6559: 0xFFE5,
- 6560: 0xFF05,
- 6561: 0xFF06,
- 6562: 0xFF07,
- 6563: 0xFF08,
- 6564: 0xFF09,
- 6565: 0xFF0A,
- 6566: 0xFF0B,
- 6567: 0xFF0C,
- 6568: 0xFF0D,
- 6569: 0xFF0E,
- 6570: 0xFF0F,
- 6571: 0xFF10,
- 6572: 0xFF11,
- 6573: 0xFF12,
- 6574: 0xFF13,
- 6575: 0xFF14,
- 6576: 0xFF15,
- 6577: 0xFF16,
- 6578: 0xFF17,
- 6579: 0xFF18,
- 6580: 0xFF19,
- 6581: 0xFF1A,
- 6582: 0xFF1B,
- 6583: 0xFF1C,
- 6584: 0xFF1D,
- 6585: 0xFF1E,
- 6586: 0xFF1F,
- 6587: 0xFF20,
- 6588: 0xFF21,
- 6589: 0xFF22,
- 6590: 0xFF23,
- 6591: 0xFF24,
- 6592: 0xFF25,
- 6593: 0xFF26,
- 6594: 0xFF27,
- 6595: 0xFF28,
- 6596: 0xFF29,
- 6597: 0xFF2A,
- 6598: 0xFF2B,
- 6599: 0xFF2C,
- 6600: 0xFF2D,
- 6601: 0xFF2E,
- 6602: 0xFF2F,
- 6603: 0xFF30,
- 6604: 0xFF31,
- 6605: 0xFF32,
- 6606: 0xFF33,
- 6607: 0xFF34,
- 6608: 0xFF35,
- 6609: 0xFF36,
- 6610: 0xFF37,
- 6611: 0xFF38,
- 6612: 0xFF39,
- 6613: 0xFF3A,
- 6614: 0xFF3B,
- 6615: 0xFF3C,
- 6616: 0xFF3D,
- 6617: 0xFF3E,
- 6618: 0xFF3F,
- 6619: 0xFF40,
- 6620: 0xFF41,
- 6621: 0xFF42,
- 6622: 0xFF43,
- 6623: 0xFF44,
- 6624: 0xFF45,
- 6625: 0xFF46,
- 6626: 0xFF47,
- 6627: 0xFF48,
- 6628: 0xFF49,
- 6629: 0xFF4A,
- 6630: 0xFF4B,
- 6631: 0xFF4C,
- 6632: 0xFF4D,
- 6633: 0xFF4E,
- 6634: 0xFF4F,
- 6635: 0xFF50,
- 6636: 0xFF51,
- 6637: 0xFF52,
- 6638: 0xFF53,
- 6639: 0xFF54,
- 6640: 0xFF55,
- 6641: 0xFF56,
- 6642: 0xFF57,
- 6643: 0xFF58,
- 6644: 0xFF59,
- 6645: 0xFF5A,
- 6646: 0xFF5B,
- 6647: 0xFF5C,
- 6648: 0xFF5D,
- 6649: 0xFFE3,
- 6746: 0x3041,
- 6747: 0x3042,
- 6748: 0x3043,
- 6749: 0x3044,
- 6750: 0x3045,
- 6751: 0x3046,
- 6752: 0x3047,
- 6753: 0x3048,
- 6754: 0x3049,
- 6755: 0x304A,
- 6756: 0x304B,
- 6757: 0x304C,
- 6758: 0x304D,
- 6759: 0x304E,
- 6760: 0x304F,
- 6761: 0x3050,
- 6762: 0x3051,
- 6763: 0x3052,
- 6764: 0x3053,
- 6765: 0x3054,
- 6766: 0x3055,
- 6767: 0x3056,
- 6768: 0x3057,
- 6769: 0x3058,
- 6770: 0x3059,
- 6771: 0x305A,
- 6772: 0x305B,
- 6773: 0x305C,
- 6774: 0x305D,
- 6775: 0x305E,
- 6776: 0x305F,
- 6777: 0x3060,
- 6778: 0x3061,
- 6779: 0x3062,
- 6780: 0x3063,
- 6781: 0x3064,
- 6782: 0x3065,
- 6783: 0x3066,
- 6784: 0x3067,
- 6785: 0x3068,
- 6786: 0x3069,
- 6787: 0x306A,
- 6788: 0x306B,
- 6789: 0x306C,
- 6790: 0x306D,
- 6791: 0x306E,
- 6792: 0x306F,
- 6793: 0x3070,
- 6794: 0x3071,
- 6795: 0x3072,
- 6796: 0x3073,
- 6797: 0x3074,
- 6798: 0x3075,
- 6799: 0x3076,
- 6800: 0x3077,
- 6801: 0x3078,
- 6802: 0x3079,
- 6803: 0x307A,
- 6804: 0x307B,
- 6805: 0x307C,
- 6806: 0x307D,
- 6807: 0x307E,
- 6808: 0x307F,
- 6809: 0x3080,
- 6810: 0x3081,
- 6811: 0x3082,
- 6812: 0x3083,
- 6813: 0x3084,
- 6814: 0x3085,
- 6815: 0x3086,
- 6816: 0x3087,
- 6817: 0x3088,
- 6818: 0x3089,
- 6819: 0x308A,
- 6820: 0x308B,
- 6821: 0x308C,
- 6822: 0x308D,
- 6823: 0x308E,
- 6824: 0x308F,
- 6825: 0x3090,
- 6826: 0x3091,
- 6827: 0x3092,
- 6828: 0x3093,
- 6936: 0x30A1,
- 6937: 0x30A2,
- 6938: 0x30A3,
- 6939: 0x30A4,
- 6940: 0x30A5,
- 6941: 0x30A6,
- 6942: 0x30A7,
- 6943: 0x30A8,
- 6944: 0x30A9,
- 6945: 0x30AA,
- 6946: 0x30AB,
- 6947: 0x30AC,
- 6948: 0x30AD,
- 6949: 0x30AE,
- 6950: 0x30AF,
- 6951: 0x30B0,
- 6952: 0x30B1,
- 6953: 0x30B2,
- 6954: 0x30B3,
- 6955: 0x30B4,
- 6956: 0x30B5,
- 6957: 0x30B6,
- 6958: 0x30B7,
- 6959: 0x30B8,
- 6960: 0x30B9,
- 6961: 0x30BA,
- 6962: 0x30BB,
- 6963: 0x30BC,
- 6964: 0x30BD,
- 6965: 0x30BE,
- 6966: 0x30BF,
- 6967: 0x30C0,
- 6968: 0x30C1,
- 6969: 0x30C2,
- 6970: 0x30C3,
- 6971: 0x30C4,
- 6972: 0x30C5,
- 6973: 0x30C6,
- 6974: 0x30C7,
- 6975: 0x30C8,
- 6976: 0x30C9,
- 6977: 0x30CA,
- 6978: 0x30CB,
- 6979: 0x30CC,
- 6980: 0x30CD,
- 6981: 0x30CE,
- 6982: 0x30CF,
- 6983: 0x30D0,
- 6984: 0x30D1,
- 6985: 0x30D2,
- 6986: 0x30D3,
- 6987: 0x30D4,
- 6988: 0x30D5,
- 6989: 0x30D6,
- 6990: 0x30D7,
- 6991: 0x30D8,
- 6992: 0x30D9,
- 6993: 0x30DA,
- 6994: 0x30DB,
- 6995: 0x30DC,
- 6996: 0x30DD,
- 6997: 0x30DE,
- 6998: 0x30DF,
- 6999: 0x30E0,
- 7000: 0x30E1,
- 7001: 0x30E2,
- 7002: 0x30E3,
- 7003: 0x30E4,
- 7004: 0x30E5,
- 7005: 0x30E6,
- 7006: 0x30E7,
- 7007: 0x30E8,
- 7008: 0x30E9,
- 7009: 0x30EA,
- 7010: 0x30EB,
- 7011: 0x30EC,
- 7012: 0x30ED,
- 7013: 0x30EE,
- 7014: 0x30EF,
- 7015: 0x30F0,
- 7016: 0x30F1,
- 7017: 0x30F2,
- 7018: 0x30F3,
- 7019: 0x30F4,
- 7020: 0x30F5,
- 7021: 0x30F6,
- 7126: 0x0391,
- 7127: 0x0392,
- 7128: 0x0393,
- 7129: 0x0394,
- 7130: 0x0395,
- 7131: 0x0396,
- 7132: 0x0397,
- 7133: 0x0398,
- 7134: 0x0399,
- 7135: 0x039A,
- 7136: 0x039B,
- 7137: 0x039C,
- 7138: 0x039D,
- 7139: 0x039E,
- 7140: 0x039F,
- 7141: 0x03A0,
- 7142: 0x03A1,
- 7143: 0x03A3,
- 7144: 0x03A4,
- 7145: 0x03A5,
- 7146: 0x03A6,
- 7147: 0x03A7,
- 7148: 0x03A8,
- 7149: 0x03A9,
- 7158: 0x03B1,
- 7159: 0x03B2,
- 7160: 0x03B3,
- 7161: 0x03B4,
- 7162: 0x03B5,
- 7163: 0x03B6,
- 7164: 0x03B7,
- 7165: 0x03B8,
- 7166: 0x03B9,
- 7167: 0x03BA,
- 7168: 0x03BB,
- 7169: 0x03BC,
- 7170: 0x03BD,
- 7171: 0x03BE,
- 7172: 0x03BF,
- 7173: 0x03C0,
- 7174: 0x03C1,
- 7175: 0x03C3,
- 7176: 0x03C4,
- 7177: 0x03C5,
- 7178: 0x03C6,
- 7179: 0x03C7,
- 7180: 0x03C8,
- 7181: 0x03C9,
- 7189: 0xFE35,
- 7190: 0xFE36,
- 7191: 0xFE39,
- 7192: 0xFE3A,
- 7193: 0xFE3F,
- 7194: 0xFE40,
- 7195: 0xFE3D,
- 7196: 0xFE3E,
- 7197: 0xFE41,
- 7198: 0xFE42,
- 7199: 0xFE43,
- 7200: 0xFE44,
- 7203: 0xFE3B,
- 7204: 0xFE3C,
- 7205: 0xFE37,
- 7206: 0xFE38,
- 7207: 0xFE31,
- 7209: 0xFE33,
- 7210: 0xFE34,
- 7316: 0x0410,
- 7317: 0x0411,
- 7318: 0x0412,
- 7319: 0x0413,
- 7320: 0x0414,
- 7321: 0x0415,
- 7322: 0x0401,
- 7323: 0x0416,
- 7324: 0x0417,
- 7325: 0x0418,
- 7326: 0x0419,
- 7327: 0x041A,
- 7328: 0x041B,
- 7329: 0x041C,
- 7330: 0x041D,
- 7331: 0x041E,
- 7332: 0x041F,
- 7333: 0x0420,
- 7334: 0x0421,
- 7335: 0x0422,
- 7336: 0x0423,
- 7337: 0x0424,
- 7338: 0x0425,
- 7339: 0x0426,
- 7340: 0x0427,
- 7341: 0x0428,
- 7342: 0x0429,
- 7343: 0x042A,
- 7344: 0x042B,
- 7345: 0x042C,
- 7346: 0x042D,
- 7347: 0x042E,
- 7348: 0x042F,
- 7364: 0x0430,
- 7365: 0x0431,
- 7366: 0x0432,
- 7367: 0x0433,
- 7368: 0x0434,
- 7369: 0x0435,
- 7370: 0x0451,
- 7371: 0x0436,
- 7372: 0x0437,
- 7373: 0x0438,
- 7374: 0x0439,
- 7375: 0x043A,
- 7376: 0x043B,
- 7377: 0x043C,
- 7378: 0x043D,
- 7379: 0x043E,
- 7380: 0x043F,
- 7381: 0x0440,
- 7382: 0x0441,
- 7383: 0x0442,
- 7384: 0x0443,
- 7385: 0x0444,
- 7386: 0x0445,
- 7387: 0x0446,
- 7388: 0x0447,
- 7389: 0x0448,
- 7390: 0x0449,
- 7391: 0x044A,
- 7392: 0x044B,
- 7393: 0x044C,
- 7394: 0x044D,
- 7395: 0x044E,
- 7396: 0x044F,
- 7410: 0x02CA,
- 7411: 0x02CB,
- 7412: 0x02D9,
- 7413: 0x2013,
- 7414: 0x2015,
- 7415: 0x2025,
- 7416: 0x2035,
- 7417: 0x2105,
- 7418: 0x2109,
- 7419: 0x2196,
- 7420: 0x2197,
- 7421: 0x2198,
- 7422: 0x2199,
- 7423: 0x2215,
- 7424: 0x221F,
- 7425: 0x2223,
- 7426: 0x2252,
- 7427: 0x2266,
- 7428: 0x2267,
- 7429: 0x22BF,
- 7430: 0x2550,
- 7431: 0x2551,
- 7432: 0x2552,
- 7433: 0x2553,
- 7434: 0x2554,
- 7435: 0x2555,
- 7436: 0x2556,
- 7437: 0x2557,
- 7438: 0x2558,
- 7439: 0x2559,
- 7440: 0x255A,
- 7441: 0x255B,
- 7442: 0x255C,
- 7443: 0x255D,
- 7444: 0x255E,
- 7445: 0x255F,
- 7446: 0x2560,
- 7447: 0x2561,
- 7448: 0x2562,
- 7449: 0x2563,
- 7450: 0x2564,
- 7451: 0x2565,
- 7452: 0x2566,
- 7453: 0x2567,
- 7454: 0x2568,
- 7455: 0x2569,
- 7456: 0x256A,
- 7457: 0x256B,
- 7458: 0x256C,
- 7459: 0x256D,
- 7460: 0x256E,
- 7461: 0x256F,
- 7462: 0x2570,
- 7463: 0x2571,
- 7464: 0x2572,
- 7465: 0x2573,
- 7466: 0x2581,
- 7467: 0x2582,
- 7468: 0x2583,
- 7469: 0x2584,
- 7470: 0x2585,
- 7471: 0x2586,
- 7472: 0x2587,
- 7473: 0x2588,
- 7474: 0x2589,
- 7475: 0x258A,
- 7476: 0x258B,
- 7477: 0x258C,
- 7478: 0x258D,
- 7479: 0x258E,
- 7480: 0x258F,
- 7481: 0x2593,
- 7482: 0x2594,
- 7483: 0x2595,
- 7484: 0x25BC,
- 7485: 0x25BD,
- 7486: 0x25E2,
- 7487: 0x25E3,
- 7488: 0x25E4,
- 7489: 0x25E5,
- 7490: 0x2609,
- 7491: 0x2295,
- 7492: 0x3012,
- 7493: 0x301D,
- 7494: 0x301E,
- 7506: 0x0101,
- 7507: 0x00E1,
- 7508: 0x01CE,
- 7509: 0x00E0,
- 7510: 0x0113,
- 7511: 0x00E9,
- 7512: 0x011B,
- 7513: 0x00E8,
- 7514: 0x012B,
- 7515: 0x00ED,
- 7516: 0x01D0,
- 7517: 0x00EC,
- 7518: 0x014D,
- 7519: 0x00F3,
- 7520: 0x01D2,
- 7521: 0x00F2,
- 7522: 0x016B,
- 7523: 0x00FA,
- 7524: 0x01D4,
- 7525: 0x00F9,
- 7526: 0x01D6,
- 7527: 0x01D8,
- 7528: 0x01DA,
- 7529: 0x01DC,
- 7530: 0x00FC,
- 7531: 0x00EA,
- 7532: 0x0251,
- 7534: 0x0144,
- 7535: 0x0148,
- 7536: 0x01F9,
- 7537: 0x0261,
- 7542: 0x3105,
- 7543: 0x3106,
- 7544: 0x3107,
- 7545: 0x3108,
- 7546: 0x3109,
- 7547: 0x310A,
- 7548: 0x310B,
- 7549: 0x310C,
- 7550: 0x310D,
- 7551: 0x310E,
- 7552: 0x310F,
- 7553: 0x3110,
- 7554: 0x3111,
- 7555: 0x3112,
- 7556: 0x3113,
- 7557: 0x3114,
- 7558: 0x3115,
- 7559: 0x3116,
- 7560: 0x3117,
- 7561: 0x3118,
- 7562: 0x3119,
- 7563: 0x311A,
- 7564: 0x311B,
- 7565: 0x311C,
- 7566: 0x311D,
- 7567: 0x311E,
- 7568: 0x311F,
- 7569: 0x3120,
- 7570: 0x3121,
- 7571: 0x3122,
- 7572: 0x3123,
- 7573: 0x3124,
- 7574: 0x3125,
- 7575: 0x3126,
- 7576: 0x3127,
- 7577: 0x3128,
- 7578: 0x3129,
- 7600: 0x3021,
- 7601: 0x3022,
- 7602: 0x3023,
- 7603: 0x3024,
- 7604: 0x3025,
- 7605: 0x3026,
- 7606: 0x3027,
- 7607: 0x3028,
- 7608: 0x3029,
- 7609: 0x32A3,
- 7610: 0x338E,
- 7611: 0x338F,
- 7612: 0x339C,
- 7613: 0x339D,
- 7614: 0x339E,
- 7615: 0x33A1,
- 7616: 0x33C4,
- 7617: 0x33CE,
- 7618: 0x33D1,
- 7619: 0x33D2,
- 7620: 0x33D5,
- 7621: 0xFE30,
- 7622: 0xFFE2,
- 7623: 0xFFE4,
- 7625: 0x2121,
- 7626: 0x3231,
- 7628: 0x2010,
- 7632: 0x30FC,
- 7633: 0x309B,
- 7634: 0x309C,
- 7635: 0x30FD,
- 7636: 0x30FE,
- 7637: 0x3006,
- 7638: 0x309D,
- 7639: 0x309E,
- 7640: 0xFE49,
- 7641: 0xFE4A,
- 7642: 0xFE4B,
- 7643: 0xFE4C,
- 7644: 0xFE4D,
- 7645: 0xFE4E,
- 7646: 0xFE4F,
- 7647: 0xFE50,
- 7648: 0xFE51,
- 7649: 0xFE52,
- 7650: 0xFE54,
- 7651: 0xFE55,
- 7652: 0xFE56,
- 7653: 0xFE57,
- 7654: 0xFE59,
- 7655: 0xFE5A,
- 7656: 0xFE5B,
- 7657: 0xFE5C,
- 7658: 0xFE5D,
- 7659: 0xFE5E,
- 7660: 0xFE5F,
- 7661: 0xFE60,
- 7662: 0xFE61,
- 7663: 0xFE62,
- 7664: 0xFE63,
- 7665: 0xFE64,
- 7666: 0xFE65,
- 7667: 0xFE66,
- 7668: 0xFE68,
- 7669: 0xFE69,
- 7670: 0xFE6A,
- 7671: 0xFE6B,
- 7672: 0x303E,
- 7673: 0x2FF0,
- 7674: 0x2FF1,
- 7675: 0x2FF2,
- 7676: 0x2FF3,
- 7677: 0x2FF4,
- 7678: 0x2FF5,
- 7679: 0x2FF6,
- 7680: 0x2FF7,
- 7681: 0x2FF8,
- 7682: 0x2FF9,
- 7683: 0x2FFA,
- 7684: 0x2FFB,
- 7685: 0x3007,
- 7699: 0x2500,
- 7700: 0x2501,
- 7701: 0x2502,
- 7702: 0x2503,
- 7703: 0x2504,
- 7704: 0x2505,
- 7705: 0x2506,
- 7706: 0x2507,
- 7707: 0x2508,
- 7708: 0x2509,
- 7709: 0x250A,
- 7710: 0x250B,
- 7711: 0x250C,
- 7712: 0x250D,
- 7713: 0x250E,
- 7714: 0x250F,
- 7715: 0x2510,
- 7716: 0x2511,
- 7717: 0x2512,
- 7718: 0x2513,
- 7719: 0x2514,
- 7720: 0x2515,
- 7721: 0x2516,
- 7722: 0x2517,
- 7723: 0x2518,
- 7724: 0x2519,
- 7725: 0x251A,
- 7726: 0x251B,
- 7727: 0x251C,
- 7728: 0x251D,
- 7729: 0x251E,
- 7730: 0x251F,
- 7731: 0x2520,
- 7732: 0x2521,
- 7733: 0x2522,
- 7734: 0x2523,
- 7735: 0x2524,
- 7736: 0x2525,
- 7737: 0x2526,
- 7738: 0x2527,
- 7739: 0x2528,
- 7740: 0x2529,
- 7741: 0x252A,
- 7742: 0x252B,
- 7743: 0x252C,
- 7744: 0x252D,
- 7745: 0x252E,
- 7746: 0x252F,
- 7747: 0x2530,
- 7748: 0x2531,
- 7749: 0x2532,
- 7750: 0x2533,
- 7751: 0x2534,
- 7752: 0x2535,
- 7753: 0x2536,
- 7754: 0x2537,
- 7755: 0x2538,
- 7756: 0x2539,
- 7757: 0x253A,
- 7758: 0x253B,
- 7759: 0x253C,
- 7760: 0x253D,
- 7761: 0x253E,
- 7762: 0x253F,
- 7763: 0x2540,
- 7764: 0x2541,
- 7765: 0x2542,
- 7766: 0x2543,
- 7767: 0x2544,
- 7768: 0x2545,
- 7769: 0x2546,
- 7770: 0x2547,
- 7771: 0x2548,
- 7772: 0x2549,
- 7773: 0x254A,
- 7774: 0x254B,
- 7790: 0x72DC,
- 7791: 0x72DD,
- 7792: 0x72DF,
- 7793: 0x72E2,
- 7794: 0x72E3,
- 7795: 0x72E4,
- 7796: 0x72E5,
- 7797: 0x72E6,
- 7798: 0x72E7,
- 7799: 0x72EA,
- 7800: 0x72EB,
- 7801: 0x72F5,
- 7802: 0x72F6,
- 7803: 0x72F9,
- 7804: 0x72FD,
- 7805: 0x72FE,
- 7806: 0x72FF,
- 7807: 0x7300,
- 7808: 0x7302,
- 7809: 0x7304,
- 7810: 0x7305,
- 7811: 0x7306,
- 7812: 0x7307,
- 7813: 0x7308,
- 7814: 0x7309,
- 7815: 0x730B,
- 7816: 0x730C,
- 7817: 0x730D,
- 7818: 0x730F,
- 7819: 0x7310,
- 7820: 0x7311,
- 7821: 0x7312,
- 7822: 0x7314,
- 7823: 0x7318,
- 7824: 0x7319,
- 7825: 0x731A,
- 7826: 0x731F,
- 7827: 0x7320,
- 7828: 0x7323,
- 7829: 0x7324,
- 7830: 0x7326,
- 7831: 0x7327,
- 7832: 0x7328,
- 7833: 0x732D,
- 7834: 0x732F,
- 7835: 0x7330,
- 7836: 0x7332,
- 7837: 0x7333,
- 7838: 0x7335,
- 7839: 0x7336,
- 7840: 0x733A,
- 7841: 0x733B,
- 7842: 0x733C,
- 7843: 0x733D,
- 7844: 0x7340,
- 7845: 0x7341,
- 7846: 0x7342,
- 7847: 0x7343,
- 7848: 0x7344,
- 7849: 0x7345,
- 7850: 0x7346,
- 7851: 0x7347,
- 7852: 0x7348,
- 7853: 0x7349,
- 7854: 0x734A,
- 7855: 0x734B,
- 7856: 0x734C,
- 7857: 0x734E,
- 7858: 0x734F,
- 7859: 0x7351,
- 7860: 0x7353,
- 7861: 0x7354,
- 7862: 0x7355,
- 7863: 0x7356,
- 7864: 0x7358,
- 7865: 0x7359,
- 7866: 0x735A,
- 7867: 0x735B,
- 7868: 0x735C,
- 7869: 0x735D,
- 7870: 0x735E,
- 7871: 0x735F,
- 7872: 0x7361,
- 7873: 0x7362,
- 7874: 0x7363,
- 7875: 0x7364,
- 7876: 0x7365,
- 7877: 0x7366,
- 7878: 0x7367,
- 7879: 0x7368,
- 7880: 0x7369,
- 7881: 0x736A,
- 7882: 0x736B,
- 7883: 0x736E,
- 7884: 0x7370,
- 7885: 0x7371,
- 7980: 0x7372,
- 7981: 0x7373,
- 7982: 0x7374,
- 7983: 0x7375,
- 7984: 0x7376,
- 7985: 0x7377,
- 7986: 0x7378,
- 7987: 0x7379,
- 7988: 0x737A,
- 7989: 0x737B,
- 7990: 0x737C,
- 7991: 0x737D,
- 7992: 0x737F,
- 7993: 0x7380,
- 7994: 0x7381,
- 7995: 0x7382,
- 7996: 0x7383,
- 7997: 0x7385,
- 7998: 0x7386,
- 7999: 0x7388,
- 8000: 0x738A,
- 8001: 0x738C,
- 8002: 0x738D,
- 8003: 0x738F,
- 8004: 0x7390,
- 8005: 0x7392,
- 8006: 0x7393,
- 8007: 0x7394,
- 8008: 0x7395,
- 8009: 0x7397,
- 8010: 0x7398,
- 8011: 0x7399,
- 8012: 0x739A,
- 8013: 0x739C,
- 8014: 0x739D,
- 8015: 0x739E,
- 8016: 0x73A0,
- 8017: 0x73A1,
- 8018: 0x73A3,
- 8019: 0x73A4,
- 8020: 0x73A5,
- 8021: 0x73A6,
- 8022: 0x73A7,
- 8023: 0x73A8,
- 8024: 0x73AA,
- 8025: 0x73AC,
- 8026: 0x73AD,
- 8027: 0x73B1,
- 8028: 0x73B4,
- 8029: 0x73B5,
- 8030: 0x73B6,
- 8031: 0x73B8,
- 8032: 0x73B9,
- 8033: 0x73BC,
- 8034: 0x73BD,
- 8035: 0x73BE,
- 8036: 0x73BF,
- 8037: 0x73C1,
- 8038: 0x73C3,
- 8039: 0x73C4,
- 8040: 0x73C5,
- 8041: 0x73C6,
- 8042: 0x73C7,
- 8043: 0x73CB,
- 8044: 0x73CC,
- 8045: 0x73CE,
- 8046: 0x73D2,
- 8047: 0x73D3,
- 8048: 0x73D4,
- 8049: 0x73D5,
- 8050: 0x73D6,
- 8051: 0x73D7,
- 8052: 0x73D8,
- 8053: 0x73DA,
- 8054: 0x73DB,
- 8055: 0x73DC,
- 8056: 0x73DD,
- 8057: 0x73DF,
- 8058: 0x73E1,
- 8059: 0x73E2,
- 8060: 0x73E3,
- 8061: 0x73E4,
- 8062: 0x73E6,
- 8063: 0x73E8,
- 8064: 0x73EA,
- 8065: 0x73EB,
- 8066: 0x73EC,
- 8067: 0x73EE,
- 8068: 0x73EF,
- 8069: 0x73F0,
- 8070: 0x73F1,
- 8071: 0x73F3,
- 8072: 0x73F4,
- 8073: 0x73F5,
- 8074: 0x73F6,
- 8075: 0x73F7,
- 8170: 0x73F8,
- 8171: 0x73F9,
- 8172: 0x73FA,
- 8173: 0x73FB,
- 8174: 0x73FC,
- 8175: 0x73FD,
- 8176: 0x73FE,
- 8177: 0x73FF,
- 8178: 0x7400,
- 8179: 0x7401,
- 8180: 0x7402,
- 8181: 0x7404,
- 8182: 0x7407,
- 8183: 0x7408,
- 8184: 0x740B,
- 8185: 0x740C,
- 8186: 0x740D,
- 8187: 0x740E,
- 8188: 0x7411,
- 8189: 0x7412,
- 8190: 0x7413,
- 8191: 0x7414,
- 8192: 0x7415,
- 8193: 0x7416,
- 8194: 0x7417,
- 8195: 0x7418,
- 8196: 0x7419,
- 8197: 0x741C,
- 8198: 0x741D,
- 8199: 0x741E,
- 8200: 0x741F,
- 8201: 0x7420,
- 8202: 0x7421,
- 8203: 0x7423,
- 8204: 0x7424,
- 8205: 0x7427,
- 8206: 0x7429,
- 8207: 0x742B,
- 8208: 0x742D,
- 8209: 0x742F,
- 8210: 0x7431,
- 8211: 0x7432,
- 8212: 0x7437,
- 8213: 0x7438,
- 8214: 0x7439,
- 8215: 0x743A,
- 8216: 0x743B,
- 8217: 0x743D,
- 8218: 0x743E,
- 8219: 0x743F,
- 8220: 0x7440,
- 8221: 0x7442,
- 8222: 0x7443,
- 8223: 0x7444,
- 8224: 0x7445,
- 8225: 0x7446,
- 8226: 0x7447,
- 8227: 0x7448,
- 8228: 0x7449,
- 8229: 0x744A,
- 8230: 0x744B,
- 8231: 0x744C,
- 8232: 0x744D,
- 8233: 0x744E,
- 8234: 0x744F,
- 8235: 0x7450,
- 8236: 0x7451,
- 8237: 0x7452,
- 8238: 0x7453,
- 8239: 0x7454,
- 8240: 0x7456,
- 8241: 0x7458,
- 8242: 0x745D,
- 8243: 0x7460,
- 8244: 0x7461,
- 8245: 0x7462,
- 8246: 0x7463,
- 8247: 0x7464,
- 8248: 0x7465,
- 8249: 0x7466,
- 8250: 0x7467,
- 8251: 0x7468,
- 8252: 0x7469,
- 8253: 0x746A,
- 8254: 0x746B,
- 8255: 0x746C,
- 8256: 0x746E,
- 8257: 0x746F,
- 8258: 0x7471,
- 8259: 0x7472,
- 8260: 0x7473,
- 8261: 0x7474,
- 8262: 0x7475,
- 8263: 0x7478,
- 8264: 0x7479,
- 8265: 0x747A,
- 8360: 0x747B,
- 8361: 0x747C,
- 8362: 0x747D,
- 8363: 0x747F,
- 8364: 0x7482,
- 8365: 0x7484,
- 8366: 0x7485,
- 8367: 0x7486,
- 8368: 0x7488,
- 8369: 0x7489,
- 8370: 0x748A,
- 8371: 0x748C,
- 8372: 0x748D,
- 8373: 0x748F,
- 8374: 0x7491,
- 8375: 0x7492,
- 8376: 0x7493,
- 8377: 0x7494,
- 8378: 0x7495,
- 8379: 0x7496,
- 8380: 0x7497,
- 8381: 0x7498,
- 8382: 0x7499,
- 8383: 0x749A,
- 8384: 0x749B,
- 8385: 0x749D,
- 8386: 0x749F,
- 8387: 0x74A0,
- 8388: 0x74A1,
- 8389: 0x74A2,
- 8390: 0x74A3,
- 8391: 0x74A4,
- 8392: 0x74A5,
- 8393: 0x74A6,
- 8394: 0x74AA,
- 8395: 0x74AB,
- 8396: 0x74AC,
- 8397: 0x74AD,
- 8398: 0x74AE,
- 8399: 0x74AF,
- 8400: 0x74B0,
- 8401: 0x74B1,
- 8402: 0x74B2,
- 8403: 0x74B3,
- 8404: 0x74B4,
- 8405: 0x74B5,
- 8406: 0x74B6,
- 8407: 0x74B7,
- 8408: 0x74B8,
- 8409: 0x74B9,
- 8410: 0x74BB,
- 8411: 0x74BC,
- 8412: 0x74BD,
- 8413: 0x74BE,
- 8414: 0x74BF,
- 8415: 0x74C0,
- 8416: 0x74C1,
- 8417: 0x74C2,
- 8418: 0x74C3,
- 8419: 0x74C4,
- 8420: 0x74C5,
- 8421: 0x74C6,
- 8422: 0x74C7,
- 8423: 0x74C8,
- 8424: 0x74C9,
- 8425: 0x74CA,
- 8426: 0x74CB,
- 8427: 0x74CC,
- 8428: 0x74CD,
- 8429: 0x74CE,
- 8430: 0x74CF,
- 8431: 0x74D0,
- 8432: 0x74D1,
- 8433: 0x74D3,
- 8434: 0x74D4,
- 8435: 0x74D5,
- 8436: 0x74D6,
- 8437: 0x74D7,
- 8438: 0x74D8,
- 8439: 0x74D9,
- 8440: 0x74DA,
- 8441: 0x74DB,
- 8442: 0x74DD,
- 8443: 0x74DF,
- 8444: 0x74E1,
- 8445: 0x74E5,
- 8446: 0x74E7,
- 8447: 0x74E8,
- 8448: 0x74E9,
- 8449: 0x74EA,
- 8450: 0x74EB,
- 8451: 0x74EC,
- 8452: 0x74ED,
- 8453: 0x74F0,
- 8454: 0x74F1,
- 8455: 0x74F2,
- 8550: 0x74F3,
- 8551: 0x74F5,
- 8552: 0x74F8,
- 8553: 0x74F9,
- 8554: 0x74FA,
- 8555: 0x74FB,
- 8556: 0x74FC,
- 8557: 0x74FD,
- 8558: 0x74FE,
- 8559: 0x7500,
- 8560: 0x7501,
- 8561: 0x7502,
- 8562: 0x7503,
- 8563: 0x7505,
- 8564: 0x7506,
- 8565: 0x7507,
- 8566: 0x7508,
- 8567: 0x7509,
- 8568: 0x750A,
- 8569: 0x750B,
- 8570: 0x750C,
- 8571: 0x750E,
- 8572: 0x7510,
- 8573: 0x7512,
- 8574: 0x7514,
- 8575: 0x7515,
- 8576: 0x7516,
- 8577: 0x7517,
- 8578: 0x751B,
- 8579: 0x751D,
- 8580: 0x751E,
- 8581: 0x7520,
- 8582: 0x7521,
- 8583: 0x7522,
- 8584: 0x7523,
- 8585: 0x7524,
- 8586: 0x7526,
- 8587: 0x7527,
- 8588: 0x752A,
- 8589: 0x752E,
- 8590: 0x7534,
- 8591: 0x7536,
- 8592: 0x7539,
- 8593: 0x753C,
- 8594: 0x753D,
- 8595: 0x753F,
- 8596: 0x7541,
- 8597: 0x7542,
- 8598: 0x7543,
- 8599: 0x7544,
- 8600: 0x7546,
- 8601: 0x7547,
- 8602: 0x7549,
- 8603: 0x754A,
- 8604: 0x754D,
- 8605: 0x7550,
- 8606: 0x7551,
- 8607: 0x7552,
- 8608: 0x7553,
- 8609: 0x7555,
- 8610: 0x7556,
- 8611: 0x7557,
- 8612: 0x7558,
- 8613: 0x755D,
- 8614: 0x755E,
- 8615: 0x755F,
- 8616: 0x7560,
- 8617: 0x7561,
- 8618: 0x7562,
- 8619: 0x7563,
- 8620: 0x7564,
- 8621: 0x7567,
- 8622: 0x7568,
- 8623: 0x7569,
- 8624: 0x756B,
- 8625: 0x756C,
- 8626: 0x756D,
- 8627: 0x756E,
- 8628: 0x756F,
- 8629: 0x7570,
- 8630: 0x7571,
- 8631: 0x7573,
- 8632: 0x7575,
- 8633: 0x7576,
- 8634: 0x7577,
- 8635: 0x757A,
- 8636: 0x757B,
- 8637: 0x757C,
- 8638: 0x757D,
- 8639: 0x757E,
- 8640: 0x7580,
- 8641: 0x7581,
- 8642: 0x7582,
- 8643: 0x7584,
- 8644: 0x7585,
- 8645: 0x7587,
- 8740: 0x7588,
- 8741: 0x7589,
- 8742: 0x758A,
- 8743: 0x758C,
- 8744: 0x758D,
- 8745: 0x758E,
- 8746: 0x7590,
- 8747: 0x7593,
- 8748: 0x7595,
- 8749: 0x7598,
- 8750: 0x759B,
- 8751: 0x759C,
- 8752: 0x759E,
- 8753: 0x75A2,
- 8754: 0x75A6,
- 8755: 0x75A7,
- 8756: 0x75A8,
- 8757: 0x75A9,
- 8758: 0x75AA,
- 8759: 0x75AD,
- 8760: 0x75B6,
- 8761: 0x75B7,
- 8762: 0x75BA,
- 8763: 0x75BB,
- 8764: 0x75BF,
- 8765: 0x75C0,
- 8766: 0x75C1,
- 8767: 0x75C6,
- 8768: 0x75CB,
- 8769: 0x75CC,
- 8770: 0x75CE,
- 8771: 0x75CF,
- 8772: 0x75D0,
- 8773: 0x75D1,
- 8774: 0x75D3,
- 8775: 0x75D7,
- 8776: 0x75D9,
- 8777: 0x75DA,
- 8778: 0x75DC,
- 8779: 0x75DD,
- 8780: 0x75DF,
- 8781: 0x75E0,
- 8782: 0x75E1,
- 8783: 0x75E5,
- 8784: 0x75E9,
- 8785: 0x75EC,
- 8786: 0x75ED,
- 8787: 0x75EE,
- 8788: 0x75EF,
- 8789: 0x75F2,
- 8790: 0x75F3,
- 8791: 0x75F5,
- 8792: 0x75F6,
- 8793: 0x75F7,
- 8794: 0x75F8,
- 8795: 0x75FA,
- 8796: 0x75FB,
- 8797: 0x75FD,
- 8798: 0x75FE,
- 8799: 0x7602,
- 8800: 0x7604,
- 8801: 0x7606,
- 8802: 0x7607,
- 8803: 0x7608,
- 8804: 0x7609,
- 8805: 0x760B,
- 8806: 0x760D,
- 8807: 0x760E,
- 8808: 0x760F,
- 8809: 0x7611,
- 8810: 0x7612,
- 8811: 0x7613,
- 8812: 0x7614,
- 8813: 0x7616,
- 8814: 0x761A,
- 8815: 0x761C,
- 8816: 0x761D,
- 8817: 0x761E,
- 8818: 0x7621,
- 8819: 0x7623,
- 8820: 0x7627,
- 8821: 0x7628,
- 8822: 0x762C,
- 8823: 0x762E,
- 8824: 0x762F,
- 8825: 0x7631,
- 8826: 0x7632,
- 8827: 0x7636,
- 8828: 0x7637,
- 8829: 0x7639,
- 8830: 0x763A,
- 8831: 0x763B,
- 8832: 0x763D,
- 8833: 0x7641,
- 8834: 0x7642,
- 8835: 0x7644,
- 8930: 0x7645,
- 8931: 0x7646,
- 8932: 0x7647,
- 8933: 0x7648,
- 8934: 0x7649,
- 8935: 0x764A,
- 8936: 0x764B,
- 8937: 0x764E,
- 8938: 0x764F,
- 8939: 0x7650,
- 8940: 0x7651,
- 8941: 0x7652,
- 8942: 0x7653,
- 8943: 0x7655,
- 8944: 0x7657,
- 8945: 0x7658,
- 8946: 0x7659,
- 8947: 0x765A,
- 8948: 0x765B,
- 8949: 0x765D,
- 8950: 0x765F,
- 8951: 0x7660,
- 8952: 0x7661,
- 8953: 0x7662,
- 8954: 0x7664,
- 8955: 0x7665,
- 8956: 0x7666,
- 8957: 0x7667,
- 8958: 0x7668,
- 8959: 0x7669,
- 8960: 0x766A,
- 8961: 0x766C,
- 8962: 0x766D,
- 8963: 0x766E,
- 8964: 0x7670,
- 8965: 0x7671,
- 8966: 0x7672,
- 8967: 0x7673,
- 8968: 0x7674,
- 8969: 0x7675,
- 8970: 0x7676,
- 8971: 0x7677,
- 8972: 0x7679,
- 8973: 0x767A,
- 8974: 0x767C,
- 8975: 0x767F,
- 8976: 0x7680,
- 8977: 0x7681,
- 8978: 0x7683,
- 8979: 0x7685,
- 8980: 0x7689,
- 8981: 0x768A,
- 8982: 0x768C,
- 8983: 0x768D,
- 8984: 0x768F,
- 8985: 0x7690,
- 8986: 0x7692,
- 8987: 0x7694,
- 8988: 0x7695,
- 8989: 0x7697,
- 8990: 0x7698,
- 8991: 0x769A,
- 8992: 0x769B,
- 8993: 0x769C,
- 8994: 0x769D,
- 8995: 0x769E,
- 8996: 0x769F,
- 8997: 0x76A0,
- 8998: 0x76A1,
- 8999: 0x76A2,
- 9000: 0x76A3,
- 9001: 0x76A5,
- 9002: 0x76A6,
- 9003: 0x76A7,
- 9004: 0x76A8,
- 9005: 0x76A9,
- 9006: 0x76AA,
- 9007: 0x76AB,
- 9008: 0x76AC,
- 9009: 0x76AD,
- 9010: 0x76AF,
- 9011: 0x76B0,
- 9012: 0x76B3,
- 9013: 0x76B5,
- 9014: 0x76B6,
- 9015: 0x76B7,
- 9016: 0x76B8,
- 9017: 0x76B9,
- 9018: 0x76BA,
- 9019: 0x76BB,
- 9020: 0x76BC,
- 9021: 0x76BD,
- 9022: 0x76BE,
- 9023: 0x76C0,
- 9024: 0x76C1,
- 9025: 0x76C3,
- 9026: 0x554A,
- 9027: 0x963F,
- 9028: 0x57C3,
- 9029: 0x6328,
- 9030: 0x54CE,
- 9031: 0x5509,
- 9032: 0x54C0,
- 9033: 0x7691,
- 9034: 0x764C,
- 9035: 0x853C,
- 9036: 0x77EE,
- 9037: 0x827E,
- 9038: 0x788D,
- 9039: 0x7231,
- 9040: 0x9698,
- 9041: 0x978D,
- 9042: 0x6C28,
- 9043: 0x5B89,
- 9044: 0x4FFA,
- 9045: 0x6309,
- 9046: 0x6697,
- 9047: 0x5CB8,
- 9048: 0x80FA,
- 9049: 0x6848,
- 9050: 0x80AE,
- 9051: 0x6602,
- 9052: 0x76CE,
- 9053: 0x51F9,
- 9054: 0x6556,
- 9055: 0x71AC,
- 9056: 0x7FF1,
- 9057: 0x8884,
- 9058: 0x50B2,
- 9059: 0x5965,
- 9060: 0x61CA,
- 9061: 0x6FB3,
- 9062: 0x82AD,
- 9063: 0x634C,
- 9064: 0x6252,
- 9065: 0x53ED,
- 9066: 0x5427,
- 9067: 0x7B06,
- 9068: 0x516B,
- 9069: 0x75A4,
- 9070: 0x5DF4,
- 9071: 0x62D4,
- 9072: 0x8DCB,
- 9073: 0x9776,
- 9074: 0x628A,
- 9075: 0x8019,
- 9076: 0x575D,
- 9077: 0x9738,
- 9078: 0x7F62,
- 9079: 0x7238,
- 9080: 0x767D,
- 9081: 0x67CF,
- 9082: 0x767E,
- 9083: 0x6446,
- 9084: 0x4F70,
- 9085: 0x8D25,
- 9086: 0x62DC,
- 9087: 0x7A17,
- 9088: 0x6591,
- 9089: 0x73ED,
- 9090: 0x642C,
- 9091: 0x6273,
- 9092: 0x822C,
- 9093: 0x9881,
- 9094: 0x677F,
- 9095: 0x7248,
- 9096: 0x626E,
- 9097: 0x62CC,
- 9098: 0x4F34,
- 9099: 0x74E3,
- 9100: 0x534A,
- 9101: 0x529E,
- 9102: 0x7ECA,
- 9103: 0x90A6,
- 9104: 0x5E2E,
- 9105: 0x6886,
- 9106: 0x699C,
- 9107: 0x8180,
- 9108: 0x7ED1,
- 9109: 0x68D2,
- 9110: 0x78C5,
- 9111: 0x868C,
- 9112: 0x9551,
- 9113: 0x508D,
- 9114: 0x8C24,
- 9115: 0x82DE,
- 9116: 0x80DE,
- 9117: 0x5305,
- 9118: 0x8912,
- 9119: 0x5265,
- 9120: 0x76C4,
- 9121: 0x76C7,
- 9122: 0x76C9,
- 9123: 0x76CB,
- 9124: 0x76CC,
- 9125: 0x76D3,
- 9126: 0x76D5,
- 9127: 0x76D9,
- 9128: 0x76DA,
- 9129: 0x76DC,
- 9130: 0x76DD,
- 9131: 0x76DE,
- 9132: 0x76E0,
- 9133: 0x76E1,
- 9134: 0x76E2,
- 9135: 0x76E3,
- 9136: 0x76E4,
- 9137: 0x76E6,
- 9138: 0x76E7,
- 9139: 0x76E8,
- 9140: 0x76E9,
- 9141: 0x76EA,
- 9142: 0x76EB,
- 9143: 0x76EC,
- 9144: 0x76ED,
- 9145: 0x76F0,
- 9146: 0x76F3,
- 9147: 0x76F5,
- 9148: 0x76F6,
- 9149: 0x76F7,
- 9150: 0x76FA,
- 9151: 0x76FB,
- 9152: 0x76FD,
- 9153: 0x76FF,
- 9154: 0x7700,
- 9155: 0x7702,
- 9156: 0x7703,
- 9157: 0x7705,
- 9158: 0x7706,
- 9159: 0x770A,
- 9160: 0x770C,
- 9161: 0x770E,
- 9162: 0x770F,
- 9163: 0x7710,
- 9164: 0x7711,
- 9165: 0x7712,
- 9166: 0x7713,
- 9167: 0x7714,
- 9168: 0x7715,
- 9169: 0x7716,
- 9170: 0x7717,
- 9171: 0x7718,
- 9172: 0x771B,
- 9173: 0x771C,
- 9174: 0x771D,
- 9175: 0x771E,
- 9176: 0x7721,
- 9177: 0x7723,
- 9178: 0x7724,
- 9179: 0x7725,
- 9180: 0x7727,
- 9181: 0x772A,
- 9182: 0x772B,
- 9183: 0x772C,
- 9184: 0x772E,
- 9185: 0x7730,
- 9186: 0x7731,
- 9187: 0x7732,
- 9188: 0x7733,
- 9189: 0x7734,
- 9190: 0x7739,
- 9191: 0x773B,
- 9192: 0x773D,
- 9193: 0x773E,
- 9194: 0x773F,
- 9195: 0x7742,
- 9196: 0x7744,
- 9197: 0x7745,
- 9198: 0x7746,
- 9199: 0x7748,
- 9200: 0x7749,
- 9201: 0x774A,
- 9202: 0x774B,
- 9203: 0x774C,
- 9204: 0x774D,
- 9205: 0x774E,
- 9206: 0x774F,
- 9207: 0x7752,
- 9208: 0x7753,
- 9209: 0x7754,
- 9210: 0x7755,
- 9211: 0x7756,
- 9212: 0x7757,
- 9213: 0x7758,
- 9214: 0x7759,
- 9215: 0x775C,
- 9216: 0x8584,
- 9217: 0x96F9,
- 9218: 0x4FDD,
- 9219: 0x5821,
- 9220: 0x9971,
- 9221: 0x5B9D,
- 9222: 0x62B1,
- 9223: 0x62A5,
- 9224: 0x66B4,
- 9225: 0x8C79,
- 9226: 0x9C8D,
- 9227: 0x7206,
- 9228: 0x676F,
- 9229: 0x7891,
- 9230: 0x60B2,
- 9231: 0x5351,
- 9232: 0x5317,
- 9233: 0x8F88,
- 9234: 0x80CC,
- 9235: 0x8D1D,
- 9236: 0x94A1,
- 9237: 0x500D,
- 9238: 0x72C8,
- 9239: 0x5907,
- 9240: 0x60EB,
- 9241: 0x7119,
- 9242: 0x88AB,
- 9243: 0x5954,
- 9244: 0x82EF,
- 9245: 0x672C,
- 9246: 0x7B28,
- 9247: 0x5D29,
- 9248: 0x7EF7,
- 9249: 0x752D,
- 9250: 0x6CF5,
- 9251: 0x8E66,
- 9252: 0x8FF8,
- 9253: 0x903C,
- 9254: 0x9F3B,
- 9255: 0x6BD4,
- 9256: 0x9119,
- 9257: 0x7B14,
- 9258: 0x5F7C,
- 9259: 0x78A7,
- 9260: 0x84D6,
- 9261: 0x853D,
- 9262: 0x6BD5,
- 9263: 0x6BD9,
- 9264: 0x6BD6,
- 9265: 0x5E01,
- 9266: 0x5E87,
- 9267: 0x75F9,
- 9268: 0x95ED,
- 9269: 0x655D,
- 9270: 0x5F0A,
- 9271: 0x5FC5,
- 9272: 0x8F9F,
- 9273: 0x58C1,
- 9274: 0x81C2,
- 9275: 0x907F,
- 9276: 0x965B,
- 9277: 0x97AD,
- 9278: 0x8FB9,
- 9279: 0x7F16,
- 9280: 0x8D2C,
- 9281: 0x6241,
- 9282: 0x4FBF,
- 9283: 0x53D8,
- 9284: 0x535E,
- 9285: 0x8FA8,
- 9286: 0x8FA9,
- 9287: 0x8FAB,
- 9288: 0x904D,
- 9289: 0x6807,
- 9290: 0x5F6A,
- 9291: 0x8198,
- 9292: 0x8868,
- 9293: 0x9CD6,
- 9294: 0x618B,
- 9295: 0x522B,
- 9296: 0x762A,
- 9297: 0x5F6C,
- 9298: 0x658C,
- 9299: 0x6FD2,
- 9300: 0x6EE8,
- 9301: 0x5BBE,
- 9302: 0x6448,
- 9303: 0x5175,
- 9304: 0x51B0,
- 9305: 0x67C4,
- 9306: 0x4E19,
- 9307: 0x79C9,
- 9308: 0x997C,
- 9309: 0x70B3,
- 9310: 0x775D,
- 9311: 0x775E,
- 9312: 0x775F,
- 9313: 0x7760,
- 9314: 0x7764,
- 9315: 0x7767,
- 9316: 0x7769,
- 9317: 0x776A,
- 9318: 0x776D,
- 9319: 0x776E,
- 9320: 0x776F,
- 9321: 0x7770,
- 9322: 0x7771,
- 9323: 0x7772,
- 9324: 0x7773,
- 9325: 0x7774,
- 9326: 0x7775,
- 9327: 0x7776,
- 9328: 0x7777,
- 9329: 0x7778,
- 9330: 0x777A,
- 9331: 0x777B,
- 9332: 0x777C,
- 9333: 0x7781,
- 9334: 0x7782,
- 9335: 0x7783,
- 9336: 0x7786,
- 9337: 0x7787,
- 9338: 0x7788,
- 9339: 0x7789,
- 9340: 0x778A,
- 9341: 0x778B,
- 9342: 0x778F,
- 9343: 0x7790,
- 9344: 0x7793,
- 9345: 0x7794,
- 9346: 0x7795,
- 9347: 0x7796,
- 9348: 0x7797,
- 9349: 0x7798,
- 9350: 0x7799,
- 9351: 0x779A,
- 9352: 0x779B,
- 9353: 0x779C,
- 9354: 0x779D,
- 9355: 0x779E,
- 9356: 0x77A1,
- 9357: 0x77A3,
- 9358: 0x77A4,
- 9359: 0x77A6,
- 9360: 0x77A8,
- 9361: 0x77AB,
- 9362: 0x77AD,
- 9363: 0x77AE,
- 9364: 0x77AF,
- 9365: 0x77B1,
- 9366: 0x77B2,
- 9367: 0x77B4,
- 9368: 0x77B6,
- 9369: 0x77B7,
- 9370: 0x77B8,
- 9371: 0x77B9,
- 9372: 0x77BA,
- 9373: 0x77BC,
- 9374: 0x77BE,
- 9375: 0x77C0,
- 9376: 0x77C1,
- 9377: 0x77C2,
- 9378: 0x77C3,
- 9379: 0x77C4,
- 9380: 0x77C5,
- 9381: 0x77C6,
- 9382: 0x77C7,
- 9383: 0x77C8,
- 9384: 0x77C9,
- 9385: 0x77CA,
- 9386: 0x77CB,
- 9387: 0x77CC,
- 9388: 0x77CE,
- 9389: 0x77CF,
- 9390: 0x77D0,
- 9391: 0x77D1,
- 9392: 0x77D2,
- 9393: 0x77D3,
- 9394: 0x77D4,
- 9395: 0x77D5,
- 9396: 0x77D6,
- 9397: 0x77D8,
- 9398: 0x77D9,
- 9399: 0x77DA,
- 9400: 0x77DD,
- 9401: 0x77DE,
- 9402: 0x77DF,
- 9403: 0x77E0,
- 9404: 0x77E1,
- 9405: 0x77E4,
- 9406: 0x75C5,
- 9407: 0x5E76,
- 9408: 0x73BB,
- 9409: 0x83E0,
- 9410: 0x64AD,
- 9411: 0x62E8,
- 9412: 0x94B5,
- 9413: 0x6CE2,
- 9414: 0x535A,
- 9415: 0x52C3,
- 9416: 0x640F,
- 9417: 0x94C2,
- 9418: 0x7B94,
- 9419: 0x4F2F,
- 9420: 0x5E1B,
- 9421: 0x8236,
- 9422: 0x8116,
- 9423: 0x818A,
- 9424: 0x6E24,
- 9425: 0x6CCA,
- 9426: 0x9A73,
- 9427: 0x6355,
- 9428: 0x535C,
- 9429: 0x54FA,
- 9430: 0x8865,
- 9431: 0x57E0,
- 9432: 0x4E0D,
- 9433: 0x5E03,
- 9434: 0x6B65,
- 9435: 0x7C3F,
- 9436: 0x90E8,
- 9437: 0x6016,
- 9438: 0x64E6,
- 9439: 0x731C,
- 9440: 0x88C1,
- 9441: 0x6750,
- 9442: 0x624D,
- 9443: 0x8D22,
- 9444: 0x776C,
- 9445: 0x8E29,
- 9446: 0x91C7,
- 9447: 0x5F69,
- 9448: 0x83DC,
- 9449: 0x8521,
- 9450: 0x9910,
- 9451: 0x53C2,
- 9452: 0x8695,
- 9453: 0x6B8B,
- 9454: 0x60ED,
- 9455: 0x60E8,
- 9456: 0x707F,
- 9457: 0x82CD,
- 9458: 0x8231,
- 9459: 0x4ED3,
- 9460: 0x6CA7,
- 9461: 0x85CF,
- 9462: 0x64CD,
- 9463: 0x7CD9,
- 9464: 0x69FD,
- 9465: 0x66F9,
- 9466: 0x8349,
- 9467: 0x5395,
- 9468: 0x7B56,
- 9469: 0x4FA7,
- 9470: 0x518C,
- 9471: 0x6D4B,
- 9472: 0x5C42,
- 9473: 0x8E6D,
- 9474: 0x63D2,
- 9475: 0x53C9,
- 9476: 0x832C,
- 9477: 0x8336,
- 9478: 0x67E5,
- 9479: 0x78B4,
- 9480: 0x643D,
- 9481: 0x5BDF,
- 9482: 0x5C94,
- 9483: 0x5DEE,
- 9484: 0x8BE7,
- 9485: 0x62C6,
- 9486: 0x67F4,
- 9487: 0x8C7A,
- 9488: 0x6400,
- 9489: 0x63BA,
- 9490: 0x8749,
- 9491: 0x998B,
- 9492: 0x8C17,
- 9493: 0x7F20,
- 9494: 0x94F2,
- 9495: 0x4EA7,
- 9496: 0x9610,
- 9497: 0x98A4,
- 9498: 0x660C,
- 9499: 0x7316,
- 9500: 0x77E6,
- 9501: 0x77E8,
- 9502: 0x77EA,
- 9503: 0x77EF,
- 9504: 0x77F0,
- 9505: 0x77F1,
- 9506: 0x77F2,
- 9507: 0x77F4,
- 9508: 0x77F5,
- 9509: 0x77F7,
- 9510: 0x77F9,
- 9511: 0x77FA,
- 9512: 0x77FB,
- 9513: 0x77FC,
- 9514: 0x7803,
- 9515: 0x7804,
- 9516: 0x7805,
- 9517: 0x7806,
- 9518: 0x7807,
- 9519: 0x7808,
- 9520: 0x780A,
- 9521: 0x780B,
- 9522: 0x780E,
- 9523: 0x780F,
- 9524: 0x7810,
- 9525: 0x7813,
- 9526: 0x7815,
- 9527: 0x7819,
- 9528: 0x781B,
- 9529: 0x781E,
- 9530: 0x7820,
- 9531: 0x7821,
- 9532: 0x7822,
- 9533: 0x7824,
- 9534: 0x7828,
- 9535: 0x782A,
- 9536: 0x782B,
- 9537: 0x782E,
- 9538: 0x782F,
- 9539: 0x7831,
- 9540: 0x7832,
- 9541: 0x7833,
- 9542: 0x7835,
- 9543: 0x7836,
- 9544: 0x783D,
- 9545: 0x783F,
- 9546: 0x7841,
- 9547: 0x7842,
- 9548: 0x7843,
- 9549: 0x7844,
- 9550: 0x7846,
- 9551: 0x7848,
- 9552: 0x7849,
- 9553: 0x784A,
- 9554: 0x784B,
- 9555: 0x784D,
- 9556: 0x784F,
- 9557: 0x7851,
- 9558: 0x7853,
- 9559: 0x7854,
- 9560: 0x7858,
- 9561: 0x7859,
- 9562: 0x785A,
- 9563: 0x785B,
- 9564: 0x785C,
- 9565: 0x785E,
- 9566: 0x785F,
- 9567: 0x7860,
- 9568: 0x7861,
- 9569: 0x7862,
- 9570: 0x7863,
- 9571: 0x7864,
- 9572: 0x7865,
- 9573: 0x7866,
- 9574: 0x7867,
- 9575: 0x7868,
- 9576: 0x7869,
- 9577: 0x786F,
- 9578: 0x7870,
- 9579: 0x7871,
- 9580: 0x7872,
- 9581: 0x7873,
- 9582: 0x7874,
- 9583: 0x7875,
- 9584: 0x7876,
- 9585: 0x7878,
- 9586: 0x7879,
- 9587: 0x787A,
- 9588: 0x787B,
- 9589: 0x787D,
- 9590: 0x787E,
- 9591: 0x787F,
- 9592: 0x7880,
- 9593: 0x7881,
- 9594: 0x7882,
- 9595: 0x7883,
- 9596: 0x573A,
- 9597: 0x5C1D,
- 9598: 0x5E38,
- 9599: 0x957F,
- 9600: 0x507F,
- 9601: 0x80A0,
- 9602: 0x5382,
- 9603: 0x655E,
- 9604: 0x7545,
- 9605: 0x5531,
- 9606: 0x5021,
- 9607: 0x8D85,
- 9608: 0x6284,
- 9609: 0x949E,
- 9610: 0x671D,
- 9611: 0x5632,
- 9612: 0x6F6E,
- 9613: 0x5DE2,
- 9614: 0x5435,
- 9615: 0x7092,
- 9616: 0x8F66,
- 9617: 0x626F,
- 9618: 0x64A4,
- 9619: 0x63A3,
- 9620: 0x5F7B,
- 9621: 0x6F88,
- 9622: 0x90F4,
- 9623: 0x81E3,
- 9624: 0x8FB0,
- 9625: 0x5C18,
- 9626: 0x6668,
- 9627: 0x5FF1,
- 9628: 0x6C89,
- 9629: 0x9648,
- 9630: 0x8D81,
- 9631: 0x886C,
- 9632: 0x6491,
- 9633: 0x79F0,
- 9634: 0x57CE,
- 9635: 0x6A59,
- 9636: 0x6210,
- 9637: 0x5448,
- 9638: 0x4E58,
- 9639: 0x7A0B,
- 9640: 0x60E9,
- 9641: 0x6F84,
- 9642: 0x8BDA,
- 9643: 0x627F,
- 9644: 0x901E,
- 9645: 0x9A8B,
- 9646: 0x79E4,
- 9647: 0x5403,
- 9648: 0x75F4,
- 9649: 0x6301,
- 9650: 0x5319,
- 9651: 0x6C60,
- 9652: 0x8FDF,
- 9653: 0x5F1B,
- 9654: 0x9A70,
- 9655: 0x803B,
- 9656: 0x9F7F,
- 9657: 0x4F88,
- 9658: 0x5C3A,
- 9659: 0x8D64,
- 9660: 0x7FC5,
- 9661: 0x65A5,
- 9662: 0x70BD,
- 9663: 0x5145,
- 9664: 0x51B2,
- 9665: 0x866B,
- 9666: 0x5D07,
- 9667: 0x5BA0,
- 9668: 0x62BD,
- 9669: 0x916C,
- 9670: 0x7574,
- 9671: 0x8E0C,
- 9672: 0x7A20,
- 9673: 0x6101,
- 9674: 0x7B79,
- 9675: 0x4EC7,
- 9676: 0x7EF8,
- 9677: 0x7785,
- 9678: 0x4E11,
- 9679: 0x81ED,
- 9680: 0x521D,
- 9681: 0x51FA,
- 9682: 0x6A71,
- 9683: 0x53A8,
- 9684: 0x8E87,
- 9685: 0x9504,
- 9686: 0x96CF,
- 9687: 0x6EC1,
- 9688: 0x9664,
- 9689: 0x695A,
- 9690: 0x7884,
- 9691: 0x7885,
- 9692: 0x7886,
- 9693: 0x7888,
- 9694: 0x788A,
- 9695: 0x788B,
- 9696: 0x788F,
- 9697: 0x7890,
- 9698: 0x7892,
- 9699: 0x7894,
- 9700: 0x7895,
- 9701: 0x7896,
- 9702: 0x7899,
- 9703: 0x789D,
- 9704: 0x789E,
- 9705: 0x78A0,
- 9706: 0x78A2,
- 9707: 0x78A4,
- 9708: 0x78A6,
- 9709: 0x78A8,
- 9710: 0x78A9,
- 9711: 0x78AA,
- 9712: 0x78AB,
- 9713: 0x78AC,
- 9714: 0x78AD,
- 9715: 0x78AE,
- 9716: 0x78AF,
- 9717: 0x78B5,
- 9718: 0x78B6,
- 9719: 0x78B7,
- 9720: 0x78B8,
- 9721: 0x78BA,
- 9722: 0x78BB,
- 9723: 0x78BC,
- 9724: 0x78BD,
- 9725: 0x78BF,
- 9726: 0x78C0,
- 9727: 0x78C2,
- 9728: 0x78C3,
- 9729: 0x78C4,
- 9730: 0x78C6,
- 9731: 0x78C7,
- 9732: 0x78C8,
- 9733: 0x78CC,
- 9734: 0x78CD,
- 9735: 0x78CE,
- 9736: 0x78CF,
- 9737: 0x78D1,
- 9738: 0x78D2,
- 9739: 0x78D3,
- 9740: 0x78D6,
- 9741: 0x78D7,
- 9742: 0x78D8,
- 9743: 0x78DA,
- 9744: 0x78DB,
- 9745: 0x78DC,
- 9746: 0x78DD,
- 9747: 0x78DE,
- 9748: 0x78DF,
- 9749: 0x78E0,
- 9750: 0x78E1,
- 9751: 0x78E2,
- 9752: 0x78E3,
- 9753: 0x78E4,
- 9754: 0x78E5,
- 9755: 0x78E6,
- 9756: 0x78E7,
- 9757: 0x78E9,
- 9758: 0x78EA,
- 9759: 0x78EB,
- 9760: 0x78ED,
- 9761: 0x78EE,
- 9762: 0x78EF,
- 9763: 0x78F0,
- 9764: 0x78F1,
- 9765: 0x78F3,
- 9766: 0x78F5,
- 9767: 0x78F6,
- 9768: 0x78F8,
- 9769: 0x78F9,
- 9770: 0x78FB,
- 9771: 0x78FC,
- 9772: 0x78FD,
- 9773: 0x78FE,
- 9774: 0x78FF,
- 9775: 0x7900,
- 9776: 0x7902,
- 9777: 0x7903,
- 9778: 0x7904,
- 9779: 0x7906,
- 9780: 0x7907,
- 9781: 0x7908,
- 9782: 0x7909,
- 9783: 0x790A,
- 9784: 0x790B,
- 9785: 0x790C,
- 9786: 0x7840,
- 9787: 0x50A8,
- 9788: 0x77D7,
- 9789: 0x6410,
- 9790: 0x89E6,
- 9791: 0x5904,
- 9792: 0x63E3,
- 9793: 0x5DDD,
- 9794: 0x7A7F,
- 9795: 0x693D,
- 9796: 0x4F20,
- 9797: 0x8239,
- 9798: 0x5598,
- 9799: 0x4E32,
- 9800: 0x75AE,
- 9801: 0x7A97,
- 9802: 0x5E62,
- 9803: 0x5E8A,
- 9804: 0x95EF,
- 9805: 0x521B,
- 9806: 0x5439,
- 9807: 0x708A,
- 9808: 0x6376,
- 9809: 0x9524,
- 9810: 0x5782,
- 9811: 0x6625,
- 9812: 0x693F,
- 9813: 0x9187,
- 9814: 0x5507,
- 9815: 0x6DF3,
- 9816: 0x7EAF,
- 9817: 0x8822,
- 9818: 0x6233,
- 9819: 0x7EF0,
- 9820: 0x75B5,
- 9821: 0x8328,
- 9822: 0x78C1,
- 9823: 0x96CC,
- 9824: 0x8F9E,
- 9825: 0x6148,
- 9826: 0x74F7,
- 9827: 0x8BCD,
- 9828: 0x6B64,
- 9829: 0x523A,
- 9830: 0x8D50,
- 9831: 0x6B21,
- 9832: 0x806A,
- 9833: 0x8471,
- 9834: 0x56F1,
- 9835: 0x5306,
- 9836: 0x4ECE,
- 9837: 0x4E1B,
- 9838: 0x51D1,
- 9839: 0x7C97,
- 9840: 0x918B,
- 9841: 0x7C07,
- 9842: 0x4FC3,
- 9843: 0x8E7F,
- 9844: 0x7BE1,
- 9845: 0x7A9C,
- 9846: 0x6467,
- 9847: 0x5D14,
- 9848: 0x50AC,
- 9849: 0x8106,
- 9850: 0x7601,
- 9851: 0x7CB9,
- 9852: 0x6DEC,
- 9853: 0x7FE0,
- 9854: 0x6751,
- 9855: 0x5B58,
- 9856: 0x5BF8,
- 9857: 0x78CB,
- 9858: 0x64AE,
- 9859: 0x6413,
- 9860: 0x63AA,
- 9861: 0x632B,
- 9862: 0x9519,
- 9863: 0x642D,
- 9864: 0x8FBE,
- 9865: 0x7B54,
- 9866: 0x7629,
- 9867: 0x6253,
- 9868: 0x5927,
- 9869: 0x5446,
- 9870: 0x6B79,
- 9871: 0x50A3,
- 9872: 0x6234,
- 9873: 0x5E26,
- 9874: 0x6B86,
- 9875: 0x4EE3,
- 9876: 0x8D37,
- 9877: 0x888B,
- 9878: 0x5F85,
- 9879: 0x902E,
- 9880: 0x790D,
- 9881: 0x790E,
- 9882: 0x790F,
- 9883: 0x7910,
- 9884: 0x7911,
- 9885: 0x7912,
- 9886: 0x7914,
- 9887: 0x7915,
- 9888: 0x7916,
- 9889: 0x7917,
- 9890: 0x7918,
- 9891: 0x7919,
- 9892: 0x791A,
- 9893: 0x791B,
- 9894: 0x791C,
- 9895: 0x791D,
- 9896: 0x791F,
- 9897: 0x7920,
- 9898: 0x7921,
- 9899: 0x7922,
- 9900: 0x7923,
- 9901: 0x7925,
- 9902: 0x7926,
- 9903: 0x7927,
- 9904: 0x7928,
- 9905: 0x7929,
- 9906: 0x792A,
- 9907: 0x792B,
- 9908: 0x792C,
- 9909: 0x792D,
- 9910: 0x792E,
- 9911: 0x792F,
- 9912: 0x7930,
- 9913: 0x7931,
- 9914: 0x7932,
- 9915: 0x7933,
- 9916: 0x7935,
- 9917: 0x7936,
- 9918: 0x7937,
- 9919: 0x7938,
- 9920: 0x7939,
- 9921: 0x793D,
- 9922: 0x793F,
- 9923: 0x7942,
- 9924: 0x7943,
- 9925: 0x7944,
- 9926: 0x7945,
- 9927: 0x7947,
- 9928: 0x794A,
- 9929: 0x794B,
- 9930: 0x794C,
- 9931: 0x794D,
- 9932: 0x794E,
- 9933: 0x794F,
- 9934: 0x7950,
- 9935: 0x7951,
- 9936: 0x7952,
- 9937: 0x7954,
- 9938: 0x7955,
- 9939: 0x7958,
- 9940: 0x7959,
- 9941: 0x7961,
- 9942: 0x7963,
- 9943: 0x7964,
- 9944: 0x7966,
- 9945: 0x7969,
- 9946: 0x796A,
- 9947: 0x796B,
- 9948: 0x796C,
- 9949: 0x796E,
- 9950: 0x7970,
- 9951: 0x7971,
- 9952: 0x7972,
- 9953: 0x7973,
- 9954: 0x7974,
- 9955: 0x7975,
- 9956: 0x7976,
- 9957: 0x7979,
- 9958: 0x797B,
- 9959: 0x797C,
- 9960: 0x797D,
- 9961: 0x797E,
- 9962: 0x797F,
- 9963: 0x7982,
- 9964: 0x7983,
- 9965: 0x7986,
- 9966: 0x7987,
- 9967: 0x7988,
- 9968: 0x7989,
- 9969: 0x798B,
- 9970: 0x798C,
- 9971: 0x798D,
- 9972: 0x798E,
- 9973: 0x7990,
- 9974: 0x7991,
- 9975: 0x7992,
- 9976: 0x6020,
- 9977: 0x803D,
- 9978: 0x62C5,
- 9979: 0x4E39,
- 9980: 0x5355,
- 9981: 0x90F8,
- 9982: 0x63B8,
- 9983: 0x80C6,
- 9984: 0x65E6,
- 9985: 0x6C2E,
- 9986: 0x4F46,
- 9987: 0x60EE,
- 9988: 0x6DE1,
- 9989: 0x8BDE,
- 9990: 0x5F39,
- 9991: 0x86CB,
- 9992: 0x5F53,
- 9993: 0x6321,
- 9994: 0x515A,
- 9995: 0x8361,
- 9996: 0x6863,
- 9997: 0x5200,
- 9998: 0x6363,
- 9999: 0x8E48,
- 10000: 0x5012,
- 10001: 0x5C9B,
- 10002: 0x7977,
- 10003: 0x5BFC,
- 10004: 0x5230,
- 10005: 0x7A3B,
- 10006: 0x60BC,
- 10007: 0x9053,
- 10008: 0x76D7,
- 10009: 0x5FB7,
- 10010: 0x5F97,
- 10011: 0x7684,
- 10012: 0x8E6C,
- 10013: 0x706F,
- 10014: 0x767B,
- 10015: 0x7B49,
- 10016: 0x77AA,
- 10017: 0x51F3,
- 10018: 0x9093,
- 10019: 0x5824,
- 10020: 0x4F4E,
- 10021: 0x6EF4,
- 10022: 0x8FEA,
- 10023: 0x654C,
- 10024: 0x7B1B,
- 10025: 0x72C4,
- 10026: 0x6DA4,
- 10027: 0x7FDF,
- 10028: 0x5AE1,
- 10029: 0x62B5,
- 10030: 0x5E95,
- 10031: 0x5730,
- 10032: 0x8482,
- 10033: 0x7B2C,
- 10034: 0x5E1D,
- 10035: 0x5F1F,
- 10036: 0x9012,
- 10037: 0x7F14,
- 10038: 0x98A0,
- 10039: 0x6382,
- 10040: 0x6EC7,
- 10041: 0x7898,
- 10042: 0x70B9,
- 10043: 0x5178,
- 10044: 0x975B,
- 10045: 0x57AB,
- 10046: 0x7535,
- 10047: 0x4F43,
- 10048: 0x7538,
- 10049: 0x5E97,
- 10050: 0x60E6,
- 10051: 0x5960,
- 10052: 0x6DC0,
- 10053: 0x6BBF,
- 10054: 0x7889,
- 10055: 0x53FC,
- 10056: 0x96D5,
- 10057: 0x51CB,
- 10058: 0x5201,
- 10059: 0x6389,
- 10060: 0x540A,
- 10061: 0x9493,
- 10062: 0x8C03,
- 10063: 0x8DCC,
- 10064: 0x7239,
- 10065: 0x789F,
- 10066: 0x8776,
- 10067: 0x8FED,
- 10068: 0x8C0D,
- 10069: 0x53E0,
- 10070: 0x7993,
- 10071: 0x7994,
- 10072: 0x7995,
- 10073: 0x7996,
- 10074: 0x7997,
- 10075: 0x7998,
- 10076: 0x7999,
- 10077: 0x799B,
- 10078: 0x799C,
- 10079: 0x799D,
- 10080: 0x799E,
- 10081: 0x799F,
- 10082: 0x79A0,
- 10083: 0x79A1,
- 10084: 0x79A2,
- 10085: 0x79A3,
- 10086: 0x79A4,
- 10087: 0x79A5,
- 10088: 0x79A6,
- 10089: 0x79A8,
- 10090: 0x79A9,
- 10091: 0x79AA,
- 10092: 0x79AB,
- 10093: 0x79AC,
- 10094: 0x79AD,
- 10095: 0x79AE,
- 10096: 0x79AF,
- 10097: 0x79B0,
- 10098: 0x79B1,
- 10099: 0x79B2,
- 10100: 0x79B4,
- 10101: 0x79B5,
- 10102: 0x79B6,
- 10103: 0x79B7,
- 10104: 0x79B8,
- 10105: 0x79BC,
- 10106: 0x79BF,
- 10107: 0x79C2,
- 10108: 0x79C4,
- 10109: 0x79C5,
- 10110: 0x79C7,
- 10111: 0x79C8,
- 10112: 0x79CA,
- 10113: 0x79CC,
- 10114: 0x79CE,
- 10115: 0x79CF,
- 10116: 0x79D0,
- 10117: 0x79D3,
- 10118: 0x79D4,
- 10119: 0x79D6,
- 10120: 0x79D7,
- 10121: 0x79D9,
- 10122: 0x79DA,
- 10123: 0x79DB,
- 10124: 0x79DC,
- 10125: 0x79DD,
- 10126: 0x79DE,
- 10127: 0x79E0,
- 10128: 0x79E1,
- 10129: 0x79E2,
- 10130: 0x79E5,
- 10131: 0x79E8,
- 10132: 0x79EA,
- 10133: 0x79EC,
- 10134: 0x79EE,
- 10135: 0x79F1,
- 10136: 0x79F2,
- 10137: 0x79F3,
- 10138: 0x79F4,
- 10139: 0x79F5,
- 10140: 0x79F6,
- 10141: 0x79F7,
- 10142: 0x79F9,
- 10143: 0x79FA,
- 10144: 0x79FC,
- 10145: 0x79FE,
- 10146: 0x79FF,
- 10147: 0x7A01,
- 10148: 0x7A04,
- 10149: 0x7A05,
- 10150: 0x7A07,
- 10151: 0x7A08,
- 10152: 0x7A09,
- 10153: 0x7A0A,
- 10154: 0x7A0C,
- 10155: 0x7A0F,
- 10156: 0x7A10,
- 10157: 0x7A11,
- 10158: 0x7A12,
- 10159: 0x7A13,
- 10160: 0x7A15,
- 10161: 0x7A16,
- 10162: 0x7A18,
- 10163: 0x7A19,
- 10164: 0x7A1B,
- 10165: 0x7A1C,
- 10166: 0x4E01,
- 10167: 0x76EF,
- 10168: 0x53EE,
- 10169: 0x9489,
- 10170: 0x9876,
- 10171: 0x9F0E,
- 10172: 0x952D,
- 10173: 0x5B9A,
- 10174: 0x8BA2,
- 10175: 0x4E22,
- 10176: 0x4E1C,
- 10177: 0x51AC,
- 10178: 0x8463,
- 10179: 0x61C2,
- 10180: 0x52A8,
- 10181: 0x680B,
- 10182: 0x4F97,
- 10183: 0x606B,
- 10184: 0x51BB,
- 10185: 0x6D1E,
- 10186: 0x515C,
- 10187: 0x6296,
- 10188: 0x6597,
- 10189: 0x9661,
- 10190: 0x8C46,
- 10191: 0x9017,
- 10192: 0x75D8,
- 10193: 0x90FD,
- 10194: 0x7763,
- 10195: 0x6BD2,
- 10196: 0x728A,
- 10197: 0x72EC,
- 10198: 0x8BFB,
- 10199: 0x5835,
- 10200: 0x7779,
- 10201: 0x8D4C,
- 10202: 0x675C,
- 10203: 0x9540,
- 10204: 0x809A,
- 10205: 0x5EA6,
- 10206: 0x6E21,
- 10207: 0x5992,
- 10208: 0x7AEF,
- 10209: 0x77ED,
- 10210: 0x953B,
- 10211: 0x6BB5,
- 10212: 0x65AD,
- 10213: 0x7F0E,
- 10214: 0x5806,
- 10215: 0x5151,
- 10216: 0x961F,
- 10217: 0x5BF9,
- 10218: 0x58A9,
- 10219: 0x5428,
- 10220: 0x8E72,
- 10221: 0x6566,
- 10222: 0x987F,
- 10223: 0x56E4,
- 10224: 0x949D,
- 10225: 0x76FE,
- 10226: 0x9041,
- 10227: 0x6387,
- 10228: 0x54C6,
- 10229: 0x591A,
- 10230: 0x593A,
- 10231: 0x579B,
- 10232: 0x8EB2,
- 10233: 0x6735,
- 10234: 0x8DFA,
- 10235: 0x8235,
- 10236: 0x5241,
- 10237: 0x60F0,
- 10238: 0x5815,
- 10239: 0x86FE,
- 10240: 0x5CE8,
- 10241: 0x9E45,
- 10242: 0x4FC4,
- 10243: 0x989D,
- 10244: 0x8BB9,
- 10245: 0x5A25,
- 10246: 0x6076,
- 10247: 0x5384,
- 10248: 0x627C,
- 10249: 0x904F,
- 10250: 0x9102,
- 10251: 0x997F,
- 10252: 0x6069,
- 10253: 0x800C,
- 10254: 0x513F,
- 10255: 0x8033,
- 10256: 0x5C14,
- 10257: 0x9975,
- 10258: 0x6D31,
- 10259: 0x4E8C,
- 10260: 0x7A1D,
- 10261: 0x7A1F,
- 10262: 0x7A21,
- 10263: 0x7A22,
- 10264: 0x7A24,
- 10265: 0x7A25,
- 10266: 0x7A26,
- 10267: 0x7A27,
- 10268: 0x7A28,
- 10269: 0x7A29,
- 10270: 0x7A2A,
- 10271: 0x7A2B,
- 10272: 0x7A2C,
- 10273: 0x7A2D,
- 10274: 0x7A2E,
- 10275: 0x7A2F,
- 10276: 0x7A30,
- 10277: 0x7A31,
- 10278: 0x7A32,
- 10279: 0x7A34,
- 10280: 0x7A35,
- 10281: 0x7A36,
- 10282: 0x7A38,
- 10283: 0x7A3A,
- 10284: 0x7A3E,
- 10285: 0x7A40,
- 10286: 0x7A41,
- 10287: 0x7A42,
- 10288: 0x7A43,
- 10289: 0x7A44,
- 10290: 0x7A45,
- 10291: 0x7A47,
- 10292: 0x7A48,
- 10293: 0x7A49,
- 10294: 0x7A4A,
- 10295: 0x7A4B,
- 10296: 0x7A4C,
- 10297: 0x7A4D,
- 10298: 0x7A4E,
- 10299: 0x7A4F,
- 10300: 0x7A50,
- 10301: 0x7A52,
- 10302: 0x7A53,
- 10303: 0x7A54,
- 10304: 0x7A55,
- 10305: 0x7A56,
- 10306: 0x7A58,
- 10307: 0x7A59,
- 10308: 0x7A5A,
- 10309: 0x7A5B,
- 10310: 0x7A5C,
- 10311: 0x7A5D,
- 10312: 0x7A5E,
- 10313: 0x7A5F,
- 10314: 0x7A60,
- 10315: 0x7A61,
- 10316: 0x7A62,
- 10317: 0x7A63,
- 10318: 0x7A64,
- 10319: 0x7A65,
- 10320: 0x7A66,
- 10321: 0x7A67,
- 10322: 0x7A68,
- 10323: 0x7A69,
- 10324: 0x7A6A,
- 10325: 0x7A6B,
- 10326: 0x7A6C,
- 10327: 0x7A6D,
- 10328: 0x7A6E,
- 10329: 0x7A6F,
- 10330: 0x7A71,
- 10331: 0x7A72,
- 10332: 0x7A73,
- 10333: 0x7A75,
- 10334: 0x7A7B,
- 10335: 0x7A7C,
- 10336: 0x7A7D,
- 10337: 0x7A7E,
- 10338: 0x7A82,
- 10339: 0x7A85,
- 10340: 0x7A87,
- 10341: 0x7A89,
- 10342: 0x7A8A,
- 10343: 0x7A8B,
- 10344: 0x7A8C,
- 10345: 0x7A8E,
- 10346: 0x7A8F,
- 10347: 0x7A90,
- 10348: 0x7A93,
- 10349: 0x7A94,
- 10350: 0x7A99,
- 10351: 0x7A9A,
- 10352: 0x7A9B,
- 10353: 0x7A9E,
- 10354: 0x7AA1,
- 10355: 0x7AA2,
- 10356: 0x8D30,
- 10357: 0x53D1,
- 10358: 0x7F5A,
- 10359: 0x7B4F,
- 10360: 0x4F10,
- 10361: 0x4E4F,
- 10362: 0x9600,
- 10363: 0x6CD5,
- 10364: 0x73D0,
- 10365: 0x85E9,
- 10366: 0x5E06,
- 10367: 0x756A,
- 10368: 0x7FFB,
- 10369: 0x6A0A,
- 10370: 0x77FE,
- 10371: 0x9492,
- 10372: 0x7E41,
- 10373: 0x51E1,
- 10374: 0x70E6,
- 10375: 0x53CD,
- 10376: 0x8FD4,
- 10377: 0x8303,
- 10378: 0x8D29,
- 10379: 0x72AF,
- 10380: 0x996D,
- 10381: 0x6CDB,
- 10382: 0x574A,
- 10383: 0x82B3,
- 10384: 0x65B9,
- 10385: 0x80AA,
- 10386: 0x623F,
- 10387: 0x9632,
- 10388: 0x59A8,
- 10389: 0x4EFF,
- 10390: 0x8BBF,
- 10391: 0x7EBA,
- 10392: 0x653E,
- 10393: 0x83F2,
- 10394: 0x975E,
- 10395: 0x5561,
- 10396: 0x98DE,
- 10397: 0x80A5,
- 10398: 0x532A,
- 10399: 0x8BFD,
- 10400: 0x5420,
- 10401: 0x80BA,
- 10402: 0x5E9F,
- 10403: 0x6CB8,
- 10404: 0x8D39,
- 10405: 0x82AC,
- 10406: 0x915A,
- 10407: 0x5429,
- 10408: 0x6C1B,
- 10409: 0x5206,
- 10410: 0x7EB7,
- 10411: 0x575F,
- 10412: 0x711A,
- 10413: 0x6C7E,
- 10414: 0x7C89,
- 10415: 0x594B,
- 10416: 0x4EFD,
- 10417: 0x5FFF,
- 10418: 0x6124,
- 10419: 0x7CAA,
- 10420: 0x4E30,
- 10421: 0x5C01,
- 10422: 0x67AB,
- 10423: 0x8702,
- 10424: 0x5CF0,
- 10425: 0x950B,
- 10426: 0x98CE,
- 10427: 0x75AF,
- 10428: 0x70FD,
- 10429: 0x9022,
- 10430: 0x51AF,
- 10431: 0x7F1D,
- 10432: 0x8BBD,
- 10433: 0x5949,
- 10434: 0x51E4,
- 10435: 0x4F5B,
- 10436: 0x5426,
- 10437: 0x592B,
- 10438: 0x6577,
- 10439: 0x80A4,
- 10440: 0x5B75,
- 10441: 0x6276,
- 10442: 0x62C2,
- 10443: 0x8F90,
- 10444: 0x5E45,
- 10445: 0x6C1F,
- 10446: 0x7B26,
- 10447: 0x4F0F,
- 10448: 0x4FD8,
- 10449: 0x670D,
- 10450: 0x7AA3,
- 10451: 0x7AA4,
- 10452: 0x7AA7,
- 10453: 0x7AA9,
- 10454: 0x7AAA,
- 10455: 0x7AAB,
- 10456: 0x7AAE,
- 10457: 0x7AAF,
- 10458: 0x7AB0,
- 10459: 0x7AB1,
- 10460: 0x7AB2,
- 10461: 0x7AB4,
- 10462: 0x7AB5,
- 10463: 0x7AB6,
- 10464: 0x7AB7,
- 10465: 0x7AB8,
- 10466: 0x7AB9,
- 10467: 0x7ABA,
- 10468: 0x7ABB,
- 10469: 0x7ABC,
- 10470: 0x7ABD,
- 10471: 0x7ABE,
- 10472: 0x7AC0,
- 10473: 0x7AC1,
- 10474: 0x7AC2,
- 10475: 0x7AC3,
- 10476: 0x7AC4,
- 10477: 0x7AC5,
- 10478: 0x7AC6,
- 10479: 0x7AC7,
- 10480: 0x7AC8,
- 10481: 0x7AC9,
- 10482: 0x7ACA,
- 10483: 0x7ACC,
- 10484: 0x7ACD,
- 10485: 0x7ACE,
- 10486: 0x7ACF,
- 10487: 0x7AD0,
- 10488: 0x7AD1,
- 10489: 0x7AD2,
- 10490: 0x7AD3,
- 10491: 0x7AD4,
- 10492: 0x7AD5,
- 10493: 0x7AD7,
- 10494: 0x7AD8,
- 10495: 0x7ADA,
- 10496: 0x7ADB,
- 10497: 0x7ADC,
- 10498: 0x7ADD,
- 10499: 0x7AE1,
- 10500: 0x7AE2,
- 10501: 0x7AE4,
- 10502: 0x7AE7,
- 10503: 0x7AE8,
- 10504: 0x7AE9,
- 10505: 0x7AEA,
- 10506: 0x7AEB,
- 10507: 0x7AEC,
- 10508: 0x7AEE,
- 10509: 0x7AF0,
- 10510: 0x7AF1,
- 10511: 0x7AF2,
- 10512: 0x7AF3,
- 10513: 0x7AF4,
- 10514: 0x7AF5,
- 10515: 0x7AF6,
- 10516: 0x7AF7,
- 10517: 0x7AF8,
- 10518: 0x7AFB,
- 10519: 0x7AFC,
- 10520: 0x7AFE,
- 10521: 0x7B00,
- 10522: 0x7B01,
- 10523: 0x7B02,
- 10524: 0x7B05,
- 10525: 0x7B07,
- 10526: 0x7B09,
- 10527: 0x7B0C,
- 10528: 0x7B0D,
- 10529: 0x7B0E,
- 10530: 0x7B10,
- 10531: 0x7B12,
- 10532: 0x7B13,
- 10533: 0x7B16,
- 10534: 0x7B17,
- 10535: 0x7B18,
- 10536: 0x7B1A,
- 10537: 0x7B1C,
- 10538: 0x7B1D,
- 10539: 0x7B1F,
- 10540: 0x7B21,
- 10541: 0x7B22,
- 10542: 0x7B23,
- 10543: 0x7B27,
- 10544: 0x7B29,
- 10545: 0x7B2D,
- 10546: 0x6D6E,
- 10547: 0x6DAA,
- 10548: 0x798F,
- 10549: 0x88B1,
- 10550: 0x5F17,
- 10551: 0x752B,
- 10552: 0x629A,
- 10553: 0x8F85,
- 10554: 0x4FEF,
- 10555: 0x91DC,
- 10556: 0x65A7,
- 10557: 0x812F,
- 10558: 0x8151,
- 10559: 0x5E9C,
- 10560: 0x8150,
- 10561: 0x8D74,
- 10562: 0x526F,
- 10563: 0x8986,
- 10564: 0x8D4B,
- 10565: 0x590D,
- 10566: 0x5085,
- 10567: 0x4ED8,
- 10568: 0x961C,
- 10569: 0x7236,
- 10570: 0x8179,
- 10571: 0x8D1F,
- 10572: 0x5BCC,
- 10573: 0x8BA3,
- 10574: 0x9644,
- 10575: 0x5987,
- 10576: 0x7F1A,
- 10577: 0x5490,
- 10578: 0x5676,
- 10579: 0x560E,
- 10580: 0x8BE5,
- 10581: 0x6539,
- 10582: 0x6982,
- 10583: 0x9499,
- 10584: 0x76D6,
- 10585: 0x6E89,
- 10586: 0x5E72,
- 10587: 0x7518,
- 10588: 0x6746,
- 10589: 0x67D1,
- 10590: 0x7AFF,
- 10591: 0x809D,
- 10592: 0x8D76,
- 10593: 0x611F,
- 10594: 0x79C6,
- 10595: 0x6562,
- 10596: 0x8D63,
- 10597: 0x5188,
- 10598: 0x521A,
- 10599: 0x94A2,
- 10600: 0x7F38,
- 10601: 0x809B,
- 10602: 0x7EB2,
- 10603: 0x5C97,
- 10604: 0x6E2F,
- 10605: 0x6760,
- 10606: 0x7BD9,
- 10607: 0x768B,
- 10608: 0x9AD8,
- 10609: 0x818F,
- 10610: 0x7F94,
- 10611: 0x7CD5,
- 10612: 0x641E,
- 10613: 0x9550,
- 10614: 0x7A3F,
- 10615: 0x544A,
- 10616: 0x54E5,
- 10617: 0x6B4C,
- 10618: 0x6401,
- 10619: 0x6208,
- 10620: 0x9E3D,
- 10621: 0x80F3,
- 10622: 0x7599,
- 10623: 0x5272,
- 10624: 0x9769,
- 10625: 0x845B,
- 10626: 0x683C,
- 10627: 0x86E4,
- 10628: 0x9601,
- 10629: 0x9694,
- 10630: 0x94EC,
- 10631: 0x4E2A,
- 10632: 0x5404,
- 10633: 0x7ED9,
- 10634: 0x6839,
- 10635: 0x8DDF,
- 10636: 0x8015,
- 10637: 0x66F4,
- 10638: 0x5E9A,
- 10639: 0x7FB9,
- 10640: 0x7B2F,
- 10641: 0x7B30,
- 10642: 0x7B32,
- 10643: 0x7B34,
- 10644: 0x7B35,
- 10645: 0x7B36,
- 10646: 0x7B37,
- 10647: 0x7B39,
- 10648: 0x7B3B,
- 10649: 0x7B3D,
- 10650: 0x7B3F,
- 10651: 0x7B40,
- 10652: 0x7B41,
- 10653: 0x7B42,
- 10654: 0x7B43,
- 10655: 0x7B44,
- 10656: 0x7B46,
- 10657: 0x7B48,
- 10658: 0x7B4A,
- 10659: 0x7B4D,
- 10660: 0x7B4E,
- 10661: 0x7B53,
- 10662: 0x7B55,
- 10663: 0x7B57,
- 10664: 0x7B59,
- 10665: 0x7B5C,
- 10666: 0x7B5E,
- 10667: 0x7B5F,
- 10668: 0x7B61,
- 10669: 0x7B63,
- 10670: 0x7B64,
- 10671: 0x7B65,
- 10672: 0x7B66,
- 10673: 0x7B67,
- 10674: 0x7B68,
- 10675: 0x7B69,
- 10676: 0x7B6A,
- 10677: 0x7B6B,
- 10678: 0x7B6C,
- 10679: 0x7B6D,
- 10680: 0x7B6F,
- 10681: 0x7B70,
- 10682: 0x7B73,
- 10683: 0x7B74,
- 10684: 0x7B76,
- 10685: 0x7B78,
- 10686: 0x7B7A,
- 10687: 0x7B7C,
- 10688: 0x7B7D,
- 10689: 0x7B7F,
- 10690: 0x7B81,
- 10691: 0x7B82,
- 10692: 0x7B83,
- 10693: 0x7B84,
- 10694: 0x7B86,
- 10695: 0x7B87,
- 10696: 0x7B88,
- 10697: 0x7B89,
- 10698: 0x7B8A,
- 10699: 0x7B8B,
- 10700: 0x7B8C,
- 10701: 0x7B8E,
- 10702: 0x7B8F,
- 10703: 0x7B91,
- 10704: 0x7B92,
- 10705: 0x7B93,
- 10706: 0x7B96,
- 10707: 0x7B98,
- 10708: 0x7B99,
- 10709: 0x7B9A,
- 10710: 0x7B9B,
- 10711: 0x7B9E,
- 10712: 0x7B9F,
- 10713: 0x7BA0,
- 10714: 0x7BA3,
- 10715: 0x7BA4,
- 10716: 0x7BA5,
- 10717: 0x7BAE,
- 10718: 0x7BAF,
- 10719: 0x7BB0,
- 10720: 0x7BB2,
- 10721: 0x7BB3,
- 10722: 0x7BB5,
- 10723: 0x7BB6,
- 10724: 0x7BB7,
- 10725: 0x7BB9,
- 10726: 0x7BBA,
- 10727: 0x7BBB,
- 10728: 0x7BBC,
- 10729: 0x7BBD,
- 10730: 0x7BBE,
- 10731: 0x7BBF,
- 10732: 0x7BC0,
- 10733: 0x7BC2,
- 10734: 0x7BC3,
- 10735: 0x7BC4,
- 10736: 0x57C2,
- 10737: 0x803F,
- 10738: 0x6897,
- 10739: 0x5DE5,
- 10740: 0x653B,
- 10741: 0x529F,
- 10742: 0x606D,
- 10743: 0x9F9A,
- 10744: 0x4F9B,
- 10745: 0x8EAC,
- 10746: 0x516C,
- 10747: 0x5BAB,
- 10748: 0x5F13,
- 10749: 0x5DE9,
- 10750: 0x6C5E,
- 10751: 0x62F1,
- 10752: 0x8D21,
- 10753: 0x5171,
- 10754: 0x94A9,
- 10755: 0x52FE,
- 10756: 0x6C9F,
- 10757: 0x82DF,
- 10758: 0x72D7,
- 10759: 0x57A2,
- 10760: 0x6784,
- 10761: 0x8D2D,
- 10762: 0x591F,
- 10763: 0x8F9C,
- 10764: 0x83C7,
- 10765: 0x5495,
- 10766: 0x7B8D,
- 10767: 0x4F30,
- 10768: 0x6CBD,
- 10769: 0x5B64,
- 10770: 0x59D1,
- 10771: 0x9F13,
- 10772: 0x53E4,
- 10773: 0x86CA,
- 10774: 0x9AA8,
- 10775: 0x8C37,
- 10776: 0x80A1,
- 10777: 0x6545,
- 10778: 0x987E,
- 10779: 0x56FA,
- 10780: 0x96C7,
- 10781: 0x522E,
- 10782: 0x74DC,
- 10783: 0x5250,
- 10784: 0x5BE1,
- 10785: 0x6302,
- 10786: 0x8902,
- 10787: 0x4E56,
- 10788: 0x62D0,
- 10789: 0x602A,
- 10790: 0x68FA,
- 10791: 0x5173,
- 10792: 0x5B98,
- 10793: 0x51A0,
- 10794: 0x89C2,
- 10795: 0x7BA1,
- 10796: 0x9986,
- 10797: 0x7F50,
- 10798: 0x60EF,
- 10799: 0x704C,
- 10800: 0x8D2F,
- 10801: 0x5149,
- 10802: 0x5E7F,
- 10803: 0x901B,
- 10804: 0x7470,
- 10805: 0x89C4,
- 10806: 0x572D,
- 10807: 0x7845,
- 10808: 0x5F52,
- 10809: 0x9F9F,
- 10810: 0x95FA,
- 10811: 0x8F68,
- 10812: 0x9B3C,
- 10813: 0x8BE1,
- 10814: 0x7678,
- 10815: 0x6842,
- 10816: 0x67DC,
- 10817: 0x8DEA,
- 10818: 0x8D35,
- 10819: 0x523D,
- 10820: 0x8F8A,
- 10821: 0x6EDA,
- 10822: 0x68CD,
- 10823: 0x9505,
- 10824: 0x90ED,
- 10825: 0x56FD,
- 10826: 0x679C,
- 10827: 0x88F9,
- 10828: 0x8FC7,
- 10829: 0x54C8,
- 10830: 0x7BC5,
- 10831: 0x7BC8,
- 10832: 0x7BC9,
- 10833: 0x7BCA,
- 10834: 0x7BCB,
- 10835: 0x7BCD,
- 10836: 0x7BCE,
- 10837: 0x7BCF,
- 10838: 0x7BD0,
- 10839: 0x7BD2,
- 10840: 0x7BD4,
- 10841: 0x7BD5,
- 10842: 0x7BD6,
- 10843: 0x7BD7,
- 10844: 0x7BD8,
- 10845: 0x7BDB,
- 10846: 0x7BDC,
- 10847: 0x7BDE,
- 10848: 0x7BDF,
- 10849: 0x7BE0,
- 10850: 0x7BE2,
- 10851: 0x7BE3,
- 10852: 0x7BE4,
- 10853: 0x7BE7,
- 10854: 0x7BE8,
- 10855: 0x7BE9,
- 10856: 0x7BEB,
- 10857: 0x7BEC,
- 10858: 0x7BED,
- 10859: 0x7BEF,
- 10860: 0x7BF0,
- 10861: 0x7BF2,
- 10862: 0x7BF3,
- 10863: 0x7BF4,
- 10864: 0x7BF5,
- 10865: 0x7BF6,
- 10866: 0x7BF8,
- 10867: 0x7BF9,
- 10868: 0x7BFA,
- 10869: 0x7BFB,
- 10870: 0x7BFD,
- 10871: 0x7BFF,
- 10872: 0x7C00,
- 10873: 0x7C01,
- 10874: 0x7C02,
- 10875: 0x7C03,
- 10876: 0x7C04,
- 10877: 0x7C05,
- 10878: 0x7C06,
- 10879: 0x7C08,
- 10880: 0x7C09,
- 10881: 0x7C0A,
- 10882: 0x7C0D,
- 10883: 0x7C0E,
- 10884: 0x7C10,
- 10885: 0x7C11,
- 10886: 0x7C12,
- 10887: 0x7C13,
- 10888: 0x7C14,
- 10889: 0x7C15,
- 10890: 0x7C17,
- 10891: 0x7C18,
- 10892: 0x7C19,
- 10893: 0x7C1A,
- 10894: 0x7C1B,
- 10895: 0x7C1C,
- 10896: 0x7C1D,
- 10897: 0x7C1E,
- 10898: 0x7C20,
- 10899: 0x7C21,
- 10900: 0x7C22,
- 10901: 0x7C23,
- 10902: 0x7C24,
- 10903: 0x7C25,
- 10904: 0x7C28,
- 10905: 0x7C29,
- 10906: 0x7C2B,
- 10907: 0x7C2C,
- 10908: 0x7C2D,
- 10909: 0x7C2E,
- 10910: 0x7C2F,
- 10911: 0x7C30,
- 10912: 0x7C31,
- 10913: 0x7C32,
- 10914: 0x7C33,
- 10915: 0x7C34,
- 10916: 0x7C35,
- 10917: 0x7C36,
- 10918: 0x7C37,
- 10919: 0x7C39,
- 10920: 0x7C3A,
- 10921: 0x7C3B,
- 10922: 0x7C3C,
- 10923: 0x7C3D,
- 10924: 0x7C3E,
- 10925: 0x7C42,
- 10926: 0x9AB8,
- 10927: 0x5B69,
- 10928: 0x6D77,
- 10929: 0x6C26,
- 10930: 0x4EA5,
- 10931: 0x5BB3,
- 10932: 0x9A87,
- 10933: 0x9163,
- 10934: 0x61A8,
- 10935: 0x90AF,
- 10936: 0x97E9,
- 10937: 0x542B,
- 10938: 0x6DB5,
- 10939: 0x5BD2,
- 10940: 0x51FD,
- 10941: 0x558A,
- 10942: 0x7F55,
- 10943: 0x7FF0,
- 10944: 0x64BC,
- 10945: 0x634D,
- 10946: 0x65F1,
- 10947: 0x61BE,
- 10948: 0x608D,
- 10949: 0x710A,
- 10950: 0x6C57,
- 10951: 0x6C49,
- 10952: 0x592F,
- 10953: 0x676D,
- 10954: 0x822A,
- 10955: 0x58D5,
- 10956: 0x568E,
- 10957: 0x8C6A,
- 10958: 0x6BEB,
- 10959: 0x90DD,
- 10960: 0x597D,
- 10961: 0x8017,
- 10962: 0x53F7,
- 10963: 0x6D69,
- 10964: 0x5475,
- 10965: 0x559D,
- 10966: 0x8377,
- 10967: 0x83CF,
- 10968: 0x6838,
- 10969: 0x79BE,
- 10970: 0x548C,
- 10971: 0x4F55,
- 10972: 0x5408,
- 10973: 0x76D2,
- 10974: 0x8C89,
- 10975: 0x9602,
- 10976: 0x6CB3,
- 10977: 0x6DB8,
- 10978: 0x8D6B,
- 10979: 0x8910,
- 10980: 0x9E64,
- 10981: 0x8D3A,
- 10982: 0x563F,
- 10983: 0x9ED1,
- 10984: 0x75D5,
- 10985: 0x5F88,
- 10986: 0x72E0,
- 10987: 0x6068,
- 10988: 0x54FC,
- 10989: 0x4EA8,
- 10990: 0x6A2A,
- 10991: 0x8861,
- 10992: 0x6052,
- 10993: 0x8F70,
- 10994: 0x54C4,
- 10995: 0x70D8,
- 10996: 0x8679,
- 10997: 0x9E3F,
- 10998: 0x6D2A,
- 10999: 0x5B8F,
- 11000: 0x5F18,
- 11001: 0x7EA2,
- 11002: 0x5589,
- 11003: 0x4FAF,
- 11004: 0x7334,
- 11005: 0x543C,
- 11006: 0x539A,
- 11007: 0x5019,
- 11008: 0x540E,
- 11009: 0x547C,
- 11010: 0x4E4E,
- 11011: 0x5FFD,
- 11012: 0x745A,
- 11013: 0x58F6,
- 11014: 0x846B,
- 11015: 0x80E1,
- 11016: 0x8774,
- 11017: 0x72D0,
- 11018: 0x7CCA,
- 11019: 0x6E56,
- 11020: 0x7C43,
- 11021: 0x7C44,
- 11022: 0x7C45,
- 11023: 0x7C46,
- 11024: 0x7C47,
- 11025: 0x7C48,
- 11026: 0x7C49,
- 11027: 0x7C4A,
- 11028: 0x7C4B,
- 11029: 0x7C4C,
- 11030: 0x7C4E,
- 11031: 0x7C4F,
- 11032: 0x7C50,
- 11033: 0x7C51,
- 11034: 0x7C52,
- 11035: 0x7C53,
- 11036: 0x7C54,
- 11037: 0x7C55,
- 11038: 0x7C56,
- 11039: 0x7C57,
- 11040: 0x7C58,
- 11041: 0x7C59,
- 11042: 0x7C5A,
- 11043: 0x7C5B,
- 11044: 0x7C5C,
- 11045: 0x7C5D,
- 11046: 0x7C5E,
- 11047: 0x7C5F,
- 11048: 0x7C60,
- 11049: 0x7C61,
- 11050: 0x7C62,
- 11051: 0x7C63,
- 11052: 0x7C64,
- 11053: 0x7C65,
- 11054: 0x7C66,
- 11055: 0x7C67,
- 11056: 0x7C68,
- 11057: 0x7C69,
- 11058: 0x7C6A,
- 11059: 0x7C6B,
- 11060: 0x7C6C,
- 11061: 0x7C6D,
- 11062: 0x7C6E,
- 11063: 0x7C6F,
- 11064: 0x7C70,
- 11065: 0x7C71,
- 11066: 0x7C72,
- 11067: 0x7C75,
- 11068: 0x7C76,
- 11069: 0x7C77,
- 11070: 0x7C78,
- 11071: 0x7C79,
- 11072: 0x7C7A,
- 11073: 0x7C7E,
- 11074: 0x7C7F,
- 11075: 0x7C80,
- 11076: 0x7C81,
- 11077: 0x7C82,
- 11078: 0x7C83,
- 11079: 0x7C84,
- 11080: 0x7C85,
- 11081: 0x7C86,
- 11082: 0x7C87,
- 11083: 0x7C88,
- 11084: 0x7C8A,
- 11085: 0x7C8B,
- 11086: 0x7C8C,
- 11087: 0x7C8D,
- 11088: 0x7C8E,
- 11089: 0x7C8F,
- 11090: 0x7C90,
- 11091: 0x7C93,
- 11092: 0x7C94,
- 11093: 0x7C96,
- 11094: 0x7C99,
- 11095: 0x7C9A,
- 11096: 0x7C9B,
- 11097: 0x7CA0,
- 11098: 0x7CA1,
- 11099: 0x7CA3,
- 11100: 0x7CA6,
- 11101: 0x7CA7,
- 11102: 0x7CA8,
- 11103: 0x7CA9,
- 11104: 0x7CAB,
- 11105: 0x7CAC,
- 11106: 0x7CAD,
- 11107: 0x7CAF,
- 11108: 0x7CB0,
- 11109: 0x7CB4,
- 11110: 0x7CB5,
- 11111: 0x7CB6,
- 11112: 0x7CB7,
- 11113: 0x7CB8,
- 11114: 0x7CBA,
- 11115: 0x7CBB,
- 11116: 0x5F27,
- 11117: 0x864E,
- 11118: 0x552C,
- 11119: 0x62A4,
- 11120: 0x4E92,
- 11121: 0x6CAA,
- 11122: 0x6237,
- 11123: 0x82B1,
- 11124: 0x54D7,
- 11125: 0x534E,
- 11126: 0x733E,
- 11127: 0x6ED1,
- 11128: 0x753B,
- 11129: 0x5212,
- 11130: 0x5316,
- 11131: 0x8BDD,
- 11132: 0x69D0,
- 11133: 0x5F8A,
- 11134: 0x6000,
- 11135: 0x6DEE,
- 11136: 0x574F,
- 11137: 0x6B22,
- 11138: 0x73AF,
- 11139: 0x6853,
- 11140: 0x8FD8,
- 11141: 0x7F13,
- 11142: 0x6362,
- 11143: 0x60A3,
- 11144: 0x5524,
- 11145: 0x75EA,
- 11146: 0x8C62,
- 11147: 0x7115,
- 11148: 0x6DA3,
- 11149: 0x5BA6,
- 11150: 0x5E7B,
- 11151: 0x8352,
- 11152: 0x614C,
- 11153: 0x9EC4,
- 11154: 0x78FA,
- 11155: 0x8757,
- 11156: 0x7C27,
- 11157: 0x7687,
- 11158: 0x51F0,
- 11159: 0x60F6,
- 11160: 0x714C,
- 11161: 0x6643,
- 11162: 0x5E4C,
- 11163: 0x604D,
- 11164: 0x8C0E,
- 11165: 0x7070,
- 11166: 0x6325,
- 11167: 0x8F89,
- 11168: 0x5FBD,
- 11169: 0x6062,
- 11170: 0x86D4,
- 11171: 0x56DE,
- 11172: 0x6BC1,
- 11173: 0x6094,
- 11174: 0x6167,
- 11175: 0x5349,
- 11176: 0x60E0,
- 11177: 0x6666,
- 11178: 0x8D3F,
- 11179: 0x79FD,
- 11180: 0x4F1A,
- 11181: 0x70E9,
- 11182: 0x6C47,
- 11183: 0x8BB3,
- 11184: 0x8BF2,
- 11185: 0x7ED8,
- 11186: 0x8364,
- 11187: 0x660F,
- 11188: 0x5A5A,
- 11189: 0x9B42,
- 11190: 0x6D51,
- 11191: 0x6DF7,
- 11192: 0x8C41,
- 11193: 0x6D3B,
- 11194: 0x4F19,
- 11195: 0x706B,
- 11196: 0x83B7,
- 11197: 0x6216,
- 11198: 0x60D1,
- 11199: 0x970D,
- 11200: 0x8D27,
- 11201: 0x7978,
- 11202: 0x51FB,
- 11203: 0x573E,
- 11204: 0x57FA,
- 11205: 0x673A,
- 11206: 0x7578,
- 11207: 0x7A3D,
- 11208: 0x79EF,
- 11209: 0x7B95,
- 11210: 0x7CBF,
- 11211: 0x7CC0,
- 11212: 0x7CC2,
- 11213: 0x7CC3,
- 11214: 0x7CC4,
- 11215: 0x7CC6,
- 11216: 0x7CC9,
- 11217: 0x7CCB,
- 11218: 0x7CCE,
- 11219: 0x7CCF,
- 11220: 0x7CD0,
- 11221: 0x7CD1,
- 11222: 0x7CD2,
- 11223: 0x7CD3,
- 11224: 0x7CD4,
- 11225: 0x7CD8,
- 11226: 0x7CDA,
- 11227: 0x7CDB,
- 11228: 0x7CDD,
- 11229: 0x7CDE,
- 11230: 0x7CE1,
- 11231: 0x7CE2,
- 11232: 0x7CE3,
- 11233: 0x7CE4,
- 11234: 0x7CE5,
- 11235: 0x7CE6,
- 11236: 0x7CE7,
- 11237: 0x7CE9,
- 11238: 0x7CEA,
- 11239: 0x7CEB,
- 11240: 0x7CEC,
- 11241: 0x7CED,
- 11242: 0x7CEE,
- 11243: 0x7CF0,
- 11244: 0x7CF1,
- 11245: 0x7CF2,
- 11246: 0x7CF3,
- 11247: 0x7CF4,
- 11248: 0x7CF5,
- 11249: 0x7CF6,
- 11250: 0x7CF7,
- 11251: 0x7CF9,
- 11252: 0x7CFA,
- 11253: 0x7CFC,
- 11254: 0x7CFD,
- 11255: 0x7CFE,
- 11256: 0x7CFF,
- 11257: 0x7D00,
- 11258: 0x7D01,
- 11259: 0x7D02,
- 11260: 0x7D03,
- 11261: 0x7D04,
- 11262: 0x7D05,
- 11263: 0x7D06,
- 11264: 0x7D07,
- 11265: 0x7D08,
- 11266: 0x7D09,
- 11267: 0x7D0B,
- 11268: 0x7D0C,
- 11269: 0x7D0D,
- 11270: 0x7D0E,
- 11271: 0x7D0F,
- 11272: 0x7D10,
- 11273: 0x7D11,
- 11274: 0x7D12,
- 11275: 0x7D13,
- 11276: 0x7D14,
- 11277: 0x7D15,
- 11278: 0x7D16,
- 11279: 0x7D17,
- 11280: 0x7D18,
- 11281: 0x7D19,
- 11282: 0x7D1A,
- 11283: 0x7D1B,
- 11284: 0x7D1C,
- 11285: 0x7D1D,
- 11286: 0x7D1E,
- 11287: 0x7D1F,
- 11288: 0x7D21,
- 11289: 0x7D23,
- 11290: 0x7D24,
- 11291: 0x7D25,
- 11292: 0x7D26,
- 11293: 0x7D28,
- 11294: 0x7D29,
- 11295: 0x7D2A,
- 11296: 0x7D2C,
- 11297: 0x7D2D,
- 11298: 0x7D2E,
- 11299: 0x7D30,
- 11300: 0x7D31,
- 11301: 0x7D32,
- 11302: 0x7D33,
- 11303: 0x7D34,
- 11304: 0x7D35,
- 11305: 0x7D36,
- 11306: 0x808C,
- 11307: 0x9965,
- 11308: 0x8FF9,
- 11309: 0x6FC0,
- 11310: 0x8BA5,
- 11311: 0x9E21,
- 11312: 0x59EC,
- 11313: 0x7EE9,
- 11314: 0x7F09,
- 11315: 0x5409,
- 11316: 0x6781,
- 11317: 0x68D8,
- 11318: 0x8F91,
- 11319: 0x7C4D,
- 11320: 0x96C6,
- 11321: 0x53CA,
- 11322: 0x6025,
- 11323: 0x75BE,
- 11324: 0x6C72,
- 11325: 0x5373,
- 11326: 0x5AC9,
- 11327: 0x7EA7,
- 11328: 0x6324,
- 11329: 0x51E0,
- 11330: 0x810A,
- 11331: 0x5DF1,
- 11332: 0x84DF,
- 11333: 0x6280,
- 11334: 0x5180,
- 11335: 0x5B63,
- 11336: 0x4F0E,
- 11337: 0x796D,
- 11338: 0x5242,
- 11339: 0x60B8,
- 11340: 0x6D4E,
- 11341: 0x5BC4,
- 11342: 0x5BC2,
- 11343: 0x8BA1,
- 11344: 0x8BB0,
- 11345: 0x65E2,
- 11346: 0x5FCC,
- 11347: 0x9645,
- 11348: 0x5993,
- 11349: 0x7EE7,
- 11350: 0x7EAA,
- 11351: 0x5609,
- 11352: 0x67B7,
- 11353: 0x5939,
- 11354: 0x4F73,
- 11355: 0x5BB6,
- 11356: 0x52A0,
- 11357: 0x835A,
- 11358: 0x988A,
- 11359: 0x8D3E,
- 11360: 0x7532,
- 11361: 0x94BE,
- 11362: 0x5047,
- 11363: 0x7A3C,
- 11364: 0x4EF7,
- 11365: 0x67B6,
- 11366: 0x9A7E,
- 11367: 0x5AC1,
- 11368: 0x6B7C,
- 11369: 0x76D1,
- 11370: 0x575A,
- 11371: 0x5C16,
- 11372: 0x7B3A,
- 11373: 0x95F4,
- 11374: 0x714E,
- 11375: 0x517C,
- 11376: 0x80A9,
- 11377: 0x8270,
- 11378: 0x5978,
- 11379: 0x7F04,
- 11380: 0x8327,
- 11381: 0x68C0,
- 11382: 0x67EC,
- 11383: 0x78B1,
- 11384: 0x7877,
- 11385: 0x62E3,
- 11386: 0x6361,
- 11387: 0x7B80,
- 11388: 0x4FED,
- 11389: 0x526A,
- 11390: 0x51CF,
- 11391: 0x8350,
- 11392: 0x69DB,
- 11393: 0x9274,
- 11394: 0x8DF5,
- 11395: 0x8D31,
- 11396: 0x89C1,
- 11397: 0x952E,
- 11398: 0x7BAD,
- 11399: 0x4EF6,
- 11400: 0x7D37,
- 11401: 0x7D38,
- 11402: 0x7D39,
- 11403: 0x7D3A,
- 11404: 0x7D3B,
- 11405: 0x7D3C,
- 11406: 0x7D3D,
- 11407: 0x7D3E,
- 11408: 0x7D3F,
- 11409: 0x7D40,
- 11410: 0x7D41,
- 11411: 0x7D42,
- 11412: 0x7D43,
- 11413: 0x7D44,
- 11414: 0x7D45,
- 11415: 0x7D46,
- 11416: 0x7D47,
- 11417: 0x7D48,
- 11418: 0x7D49,
- 11419: 0x7D4A,
- 11420: 0x7D4B,
- 11421: 0x7D4C,
- 11422: 0x7D4D,
- 11423: 0x7D4E,
- 11424: 0x7D4F,
- 11425: 0x7D50,
- 11426: 0x7D51,
- 11427: 0x7D52,
- 11428: 0x7D53,
- 11429: 0x7D54,
- 11430: 0x7D55,
- 11431: 0x7D56,
- 11432: 0x7D57,
- 11433: 0x7D58,
- 11434: 0x7D59,
- 11435: 0x7D5A,
- 11436: 0x7D5B,
- 11437: 0x7D5C,
- 11438: 0x7D5D,
- 11439: 0x7D5E,
- 11440: 0x7D5F,
- 11441: 0x7D60,
- 11442: 0x7D61,
- 11443: 0x7D62,
- 11444: 0x7D63,
- 11445: 0x7D64,
- 11446: 0x7D65,
- 11447: 0x7D66,
- 11448: 0x7D67,
- 11449: 0x7D68,
- 11450: 0x7D69,
- 11451: 0x7D6A,
- 11452: 0x7D6B,
- 11453: 0x7D6C,
- 11454: 0x7D6D,
- 11455: 0x7D6F,
- 11456: 0x7D70,
- 11457: 0x7D71,
- 11458: 0x7D72,
- 11459: 0x7D73,
- 11460: 0x7D74,
- 11461: 0x7D75,
- 11462: 0x7D76,
- 11463: 0x7D78,
- 11464: 0x7D79,
- 11465: 0x7D7A,
- 11466: 0x7D7B,
- 11467: 0x7D7C,
- 11468: 0x7D7D,
- 11469: 0x7D7E,
- 11470: 0x7D7F,
- 11471: 0x7D80,
- 11472: 0x7D81,
- 11473: 0x7D82,
- 11474: 0x7D83,
- 11475: 0x7D84,
- 11476: 0x7D85,
- 11477: 0x7D86,
- 11478: 0x7D87,
- 11479: 0x7D88,
- 11480: 0x7D89,
- 11481: 0x7D8A,
- 11482: 0x7D8B,
- 11483: 0x7D8C,
- 11484: 0x7D8D,
- 11485: 0x7D8E,
- 11486: 0x7D8F,
- 11487: 0x7D90,
- 11488: 0x7D91,
- 11489: 0x7D92,
- 11490: 0x7D93,
- 11491: 0x7D94,
- 11492: 0x7D95,
- 11493: 0x7D96,
- 11494: 0x7D97,
- 11495: 0x7D98,
- 11496: 0x5065,
- 11497: 0x8230,
- 11498: 0x5251,
- 11499: 0x996F,
- 11500: 0x6E10,
- 11501: 0x6E85,
- 11502: 0x6DA7,
- 11503: 0x5EFA,
- 11504: 0x50F5,
- 11505: 0x59DC,
- 11506: 0x5C06,
- 11507: 0x6D46,
- 11508: 0x6C5F,
- 11509: 0x7586,
- 11510: 0x848B,
- 11511: 0x6868,
- 11512: 0x5956,
- 11513: 0x8BB2,
- 11514: 0x5320,
- 11515: 0x9171,
- 11516: 0x964D,
- 11517: 0x8549,
- 11518: 0x6912,
- 11519: 0x7901,
- 11520: 0x7126,
- 11521: 0x80F6,
- 11522: 0x4EA4,
- 11523: 0x90CA,
- 11524: 0x6D47,
- 11525: 0x9A84,
- 11526: 0x5A07,
- 11527: 0x56BC,
- 11528: 0x6405,
- 11529: 0x94F0,
- 11530: 0x77EB,
- 11531: 0x4FA5,
- 11532: 0x811A,
- 11533: 0x72E1,
- 11534: 0x89D2,
- 11535: 0x997A,
- 11536: 0x7F34,
- 11537: 0x7EDE,
- 11538: 0x527F,
- 11539: 0x6559,
- 11540: 0x9175,
- 11541: 0x8F7F,
- 11542: 0x8F83,
- 11543: 0x53EB,
- 11544: 0x7A96,
- 11545: 0x63ED,
- 11546: 0x63A5,
- 11547: 0x7686,
- 11548: 0x79F8,
- 11549: 0x8857,
- 11550: 0x9636,
- 11551: 0x622A,
- 11552: 0x52AB,
- 11553: 0x8282,
- 11554: 0x6854,
- 11555: 0x6770,
- 11556: 0x6377,
- 11557: 0x776B,
- 11558: 0x7AED,
- 11559: 0x6D01,
- 11560: 0x7ED3,
- 11561: 0x89E3,
- 11562: 0x59D0,
- 11563: 0x6212,
- 11564: 0x85C9,
- 11565: 0x82A5,
- 11566: 0x754C,
- 11567: 0x501F,
- 11568: 0x4ECB,
- 11569: 0x75A5,
- 11570: 0x8BEB,
- 11571: 0x5C4A,
- 11572: 0x5DFE,
- 11573: 0x7B4B,
- 11574: 0x65A4,
- 11575: 0x91D1,
- 11576: 0x4ECA,
- 11577: 0x6D25,
- 11578: 0x895F,
- 11579: 0x7D27,
- 11580: 0x9526,
- 11581: 0x4EC5,
- 11582: 0x8C28,
- 11583: 0x8FDB,
- 11584: 0x9773,
- 11585: 0x664B,
- 11586: 0x7981,
- 11587: 0x8FD1,
- 11588: 0x70EC,
- 11589: 0x6D78,
- 11590: 0x7D99,
- 11591: 0x7D9A,
- 11592: 0x7D9B,
- 11593: 0x7D9C,
- 11594: 0x7D9D,
- 11595: 0x7D9E,
- 11596: 0x7D9F,
- 11597: 0x7DA0,
- 11598: 0x7DA1,
- 11599: 0x7DA2,
- 11600: 0x7DA3,
- 11601: 0x7DA4,
- 11602: 0x7DA5,
- 11603: 0x7DA7,
- 11604: 0x7DA8,
- 11605: 0x7DA9,
- 11606: 0x7DAA,
- 11607: 0x7DAB,
- 11608: 0x7DAC,
- 11609: 0x7DAD,
- 11610: 0x7DAF,
- 11611: 0x7DB0,
- 11612: 0x7DB1,
- 11613: 0x7DB2,
- 11614: 0x7DB3,
- 11615: 0x7DB4,
- 11616: 0x7DB5,
- 11617: 0x7DB6,
- 11618: 0x7DB7,
- 11619: 0x7DB8,
- 11620: 0x7DB9,
- 11621: 0x7DBA,
- 11622: 0x7DBB,
- 11623: 0x7DBC,
- 11624: 0x7DBD,
- 11625: 0x7DBE,
- 11626: 0x7DBF,
- 11627: 0x7DC0,
- 11628: 0x7DC1,
- 11629: 0x7DC2,
- 11630: 0x7DC3,
- 11631: 0x7DC4,
- 11632: 0x7DC5,
- 11633: 0x7DC6,
- 11634: 0x7DC7,
- 11635: 0x7DC8,
- 11636: 0x7DC9,
- 11637: 0x7DCA,
- 11638: 0x7DCB,
- 11639: 0x7DCC,
- 11640: 0x7DCD,
- 11641: 0x7DCE,
- 11642: 0x7DCF,
- 11643: 0x7DD0,
- 11644: 0x7DD1,
- 11645: 0x7DD2,
- 11646: 0x7DD3,
- 11647: 0x7DD4,
- 11648: 0x7DD5,
- 11649: 0x7DD6,
- 11650: 0x7DD7,
- 11651: 0x7DD8,
- 11652: 0x7DD9,
- 11653: 0x7DDA,
- 11654: 0x7DDB,
- 11655: 0x7DDC,
- 11656: 0x7DDD,
- 11657: 0x7DDE,
- 11658: 0x7DDF,
- 11659: 0x7DE0,
- 11660: 0x7DE1,
- 11661: 0x7DE2,
- 11662: 0x7DE3,
- 11663: 0x7DE4,
- 11664: 0x7DE5,
- 11665: 0x7DE6,
- 11666: 0x7DE7,
- 11667: 0x7DE8,
- 11668: 0x7DE9,
- 11669: 0x7DEA,
- 11670: 0x7DEB,
- 11671: 0x7DEC,
- 11672: 0x7DED,
- 11673: 0x7DEE,
- 11674: 0x7DEF,
- 11675: 0x7DF0,
- 11676: 0x7DF1,
- 11677: 0x7DF2,
- 11678: 0x7DF3,
- 11679: 0x7DF4,
- 11680: 0x7DF5,
- 11681: 0x7DF6,
- 11682: 0x7DF7,
- 11683: 0x7DF8,
- 11684: 0x7DF9,
- 11685: 0x7DFA,
- 11686: 0x5C3D,
- 11687: 0x52B2,
- 11688: 0x8346,
- 11689: 0x5162,
- 11690: 0x830E,
- 11691: 0x775B,
- 11692: 0x6676,
- 11693: 0x9CB8,
- 11694: 0x4EAC,
- 11695: 0x60CA,
- 11696: 0x7CBE,
- 11697: 0x7CB3,
- 11698: 0x7ECF,
- 11699: 0x4E95,
- 11700: 0x8B66,
- 11701: 0x666F,
- 11702: 0x9888,
- 11703: 0x9759,
- 11704: 0x5883,
- 11705: 0x656C,
- 11706: 0x955C,
- 11707: 0x5F84,
- 11708: 0x75C9,
- 11709: 0x9756,
- 11710: 0x7ADF,
- 11711: 0x7ADE,
- 11712: 0x51C0,
- 11713: 0x70AF,
- 11714: 0x7A98,
- 11715: 0x63EA,
- 11716: 0x7A76,
- 11717: 0x7EA0,
- 11718: 0x7396,
- 11719: 0x97ED,
- 11720: 0x4E45,
- 11721: 0x7078,
- 11722: 0x4E5D,
- 11723: 0x9152,
- 11724: 0x53A9,
- 11725: 0x6551,
- 11726: 0x65E7,
- 11727: 0x81FC,
- 11728: 0x8205,
- 11729: 0x548E,
- 11730: 0x5C31,
- 11731: 0x759A,
- 11732: 0x97A0,
- 11733: 0x62D8,
- 11734: 0x72D9,
- 11735: 0x75BD,
- 11736: 0x5C45,
- 11737: 0x9A79,
- 11738: 0x83CA,
- 11739: 0x5C40,
- 11740: 0x5480,
- 11741: 0x77E9,
- 11742: 0x4E3E,
- 11743: 0x6CAE,
- 11744: 0x805A,
- 11745: 0x62D2,
- 11746: 0x636E,
- 11747: 0x5DE8,
- 11748: 0x5177,
- 11749: 0x8DDD,
- 11750: 0x8E1E,
- 11751: 0x952F,
- 11752: 0x4FF1,
- 11753: 0x53E5,
- 11754: 0x60E7,
- 11755: 0x70AC,
- 11756: 0x5267,
- 11757: 0x6350,
- 11758: 0x9E43,
- 11759: 0x5A1F,
- 11760: 0x5026,
- 11761: 0x7737,
- 11762: 0x5377,
- 11763: 0x7EE2,
- 11764: 0x6485,
- 11765: 0x652B,
- 11766: 0x6289,
- 11767: 0x6398,
- 11768: 0x5014,
- 11769: 0x7235,
- 11770: 0x89C9,
- 11771: 0x51B3,
- 11772: 0x8BC0,
- 11773: 0x7EDD,
- 11774: 0x5747,
- 11775: 0x83CC,
- 11776: 0x94A7,
- 11777: 0x519B,
- 11778: 0x541B,
- 11779: 0x5CFB,
- 11780: 0x7DFB,
- 11781: 0x7DFC,
- 11782: 0x7DFD,
- 11783: 0x7DFE,
- 11784: 0x7DFF,
- 11785: 0x7E00,
- 11786: 0x7E01,
- 11787: 0x7E02,
- 11788: 0x7E03,
- 11789: 0x7E04,
- 11790: 0x7E05,
- 11791: 0x7E06,
- 11792: 0x7E07,
- 11793: 0x7E08,
- 11794: 0x7E09,
- 11795: 0x7E0A,
- 11796: 0x7E0B,
- 11797: 0x7E0C,
- 11798: 0x7E0D,
- 11799: 0x7E0E,
- 11800: 0x7E0F,
- 11801: 0x7E10,
- 11802: 0x7E11,
- 11803: 0x7E12,
- 11804: 0x7E13,
- 11805: 0x7E14,
- 11806: 0x7E15,
- 11807: 0x7E16,
- 11808: 0x7E17,
- 11809: 0x7E18,
- 11810: 0x7E19,
- 11811: 0x7E1A,
- 11812: 0x7E1B,
- 11813: 0x7E1C,
- 11814: 0x7E1D,
- 11815: 0x7E1E,
- 11816: 0x7E1F,
- 11817: 0x7E20,
- 11818: 0x7E21,
- 11819: 0x7E22,
- 11820: 0x7E23,
- 11821: 0x7E24,
- 11822: 0x7E25,
- 11823: 0x7E26,
- 11824: 0x7E27,
- 11825: 0x7E28,
- 11826: 0x7E29,
- 11827: 0x7E2A,
- 11828: 0x7E2B,
- 11829: 0x7E2C,
- 11830: 0x7E2D,
- 11831: 0x7E2E,
- 11832: 0x7E2F,
- 11833: 0x7E30,
- 11834: 0x7E31,
- 11835: 0x7E32,
- 11836: 0x7E33,
- 11837: 0x7E34,
- 11838: 0x7E35,
- 11839: 0x7E36,
- 11840: 0x7E37,
- 11841: 0x7E38,
- 11842: 0x7E39,
- 11843: 0x7E3A,
- 11844: 0x7E3C,
- 11845: 0x7E3D,
- 11846: 0x7E3E,
- 11847: 0x7E3F,
- 11848: 0x7E40,
- 11849: 0x7E42,
- 11850: 0x7E43,
- 11851: 0x7E44,
- 11852: 0x7E45,
- 11853: 0x7E46,
- 11854: 0x7E48,
- 11855: 0x7E49,
- 11856: 0x7E4A,
- 11857: 0x7E4B,
- 11858: 0x7E4C,
- 11859: 0x7E4D,
- 11860: 0x7E4E,
- 11861: 0x7E4F,
- 11862: 0x7E50,
- 11863: 0x7E51,
- 11864: 0x7E52,
- 11865: 0x7E53,
- 11866: 0x7E54,
- 11867: 0x7E55,
- 11868: 0x7E56,
- 11869: 0x7E57,
- 11870: 0x7E58,
- 11871: 0x7E59,
- 11872: 0x7E5A,
- 11873: 0x7E5B,
- 11874: 0x7E5C,
- 11875: 0x7E5D,
- 11876: 0x4FCA,
- 11877: 0x7AE3,
- 11878: 0x6D5A,
- 11879: 0x90E1,
- 11880: 0x9A8F,
- 11881: 0x5580,
- 11882: 0x5496,
- 11883: 0x5361,
- 11884: 0x54AF,
- 11885: 0x5F00,
- 11886: 0x63E9,
- 11887: 0x6977,
- 11888: 0x51EF,
- 11889: 0x6168,
- 11890: 0x520A,
- 11891: 0x582A,
- 11892: 0x52D8,
- 11893: 0x574E,
- 11894: 0x780D,
- 11895: 0x770B,
- 11896: 0x5EB7,
- 11897: 0x6177,
- 11898: 0x7CE0,
- 11899: 0x625B,
- 11900: 0x6297,
- 11901: 0x4EA2,
- 11902: 0x7095,
- 11903: 0x8003,
- 11904: 0x62F7,
- 11905: 0x70E4,
- 11906: 0x9760,
- 11907: 0x5777,
- 11908: 0x82DB,
- 11909: 0x67EF,
- 11910: 0x68F5,
- 11911: 0x78D5,
- 11912: 0x9897,
- 11913: 0x79D1,
- 11914: 0x58F3,
- 11915: 0x54B3,
- 11916: 0x53EF,
- 11917: 0x6E34,
- 11918: 0x514B,
- 11919: 0x523B,
- 11920: 0x5BA2,
- 11921: 0x8BFE,
- 11922: 0x80AF,
- 11923: 0x5543,
- 11924: 0x57A6,
- 11925: 0x6073,
- 11926: 0x5751,
- 11927: 0x542D,
- 11928: 0x7A7A,
- 11929: 0x6050,
- 11930: 0x5B54,
- 11931: 0x63A7,
- 11932: 0x62A0,
- 11933: 0x53E3,
- 11934: 0x6263,
- 11935: 0x5BC7,
- 11936: 0x67AF,
- 11937: 0x54ED,
- 11938: 0x7A9F,
- 11939: 0x82E6,
- 11940: 0x9177,
- 11941: 0x5E93,
- 11942: 0x88E4,
- 11943: 0x5938,
- 11944: 0x57AE,
- 11945: 0x630E,
- 11946: 0x8DE8,
- 11947: 0x80EF,
- 11948: 0x5757,
- 11949: 0x7B77,
- 11950: 0x4FA9,
- 11951: 0x5FEB,
- 11952: 0x5BBD,
- 11953: 0x6B3E,
- 11954: 0x5321,
- 11955: 0x7B50,
- 11956: 0x72C2,
- 11957: 0x6846,
- 11958: 0x77FF,
- 11959: 0x7736,
- 11960: 0x65F7,
- 11961: 0x51B5,
- 11962: 0x4E8F,
- 11963: 0x76D4,
- 11964: 0x5CBF,
- 11965: 0x7AA5,
- 11966: 0x8475,
- 11967: 0x594E,
- 11968: 0x9B41,
- 11969: 0x5080,
- 11970: 0x7E5E,
- 11971: 0x7E5F,
- 11972: 0x7E60,
- 11973: 0x7E61,
- 11974: 0x7E62,
- 11975: 0x7E63,
- 11976: 0x7E64,
- 11977: 0x7E65,
- 11978: 0x7E66,
- 11979: 0x7E67,
- 11980: 0x7E68,
- 11981: 0x7E69,
- 11982: 0x7E6A,
- 11983: 0x7E6B,
- 11984: 0x7E6C,
- 11985: 0x7E6D,
- 11986: 0x7E6E,
- 11987: 0x7E6F,
- 11988: 0x7E70,
- 11989: 0x7E71,
- 11990: 0x7E72,
- 11991: 0x7E73,
- 11992: 0x7E74,
- 11993: 0x7E75,
- 11994: 0x7E76,
- 11995: 0x7E77,
- 11996: 0x7E78,
- 11997: 0x7E79,
- 11998: 0x7E7A,
- 11999: 0x7E7B,
- 12000: 0x7E7C,
- 12001: 0x7E7D,
- 12002: 0x7E7E,
- 12003: 0x7E7F,
- 12004: 0x7E80,
- 12005: 0x7E81,
- 12006: 0x7E83,
- 12007: 0x7E84,
- 12008: 0x7E85,
- 12009: 0x7E86,
- 12010: 0x7E87,
- 12011: 0x7E88,
- 12012: 0x7E89,
- 12013: 0x7E8A,
- 12014: 0x7E8B,
- 12015: 0x7E8C,
- 12016: 0x7E8D,
- 12017: 0x7E8E,
- 12018: 0x7E8F,
- 12019: 0x7E90,
- 12020: 0x7E91,
- 12021: 0x7E92,
- 12022: 0x7E93,
- 12023: 0x7E94,
- 12024: 0x7E95,
- 12025: 0x7E96,
- 12026: 0x7E97,
- 12027: 0x7E98,
- 12028: 0x7E99,
- 12029: 0x7E9A,
- 12030: 0x7E9C,
- 12031: 0x7E9D,
- 12032: 0x7E9E,
- 12033: 0x7EAE,
- 12034: 0x7EB4,
- 12035: 0x7EBB,
- 12036: 0x7EBC,
- 12037: 0x7ED6,
- 12038: 0x7EE4,
- 12039: 0x7EEC,
- 12040: 0x7EF9,
- 12041: 0x7F0A,
- 12042: 0x7F10,
- 12043: 0x7F1E,
- 12044: 0x7F37,
- 12045: 0x7F39,
- 12046: 0x7F3B,
- 12047: 0x7F3C,
- 12048: 0x7F3D,
- 12049: 0x7F3E,
- 12050: 0x7F3F,
- 12051: 0x7F40,
- 12052: 0x7F41,
- 12053: 0x7F43,
- 12054: 0x7F46,
- 12055: 0x7F47,
- 12056: 0x7F48,
- 12057: 0x7F49,
- 12058: 0x7F4A,
- 12059: 0x7F4B,
- 12060: 0x7F4C,
- 12061: 0x7F4D,
- 12062: 0x7F4E,
- 12063: 0x7F4F,
- 12064: 0x7F52,
- 12065: 0x7F53,
- 12066: 0x9988,
- 12067: 0x6127,
- 12068: 0x6E83,
- 12069: 0x5764,
- 12070: 0x6606,
- 12071: 0x6346,
- 12072: 0x56F0,
- 12073: 0x62EC,
- 12074: 0x6269,
- 12075: 0x5ED3,
- 12076: 0x9614,
- 12077: 0x5783,
- 12078: 0x62C9,
- 12079: 0x5587,
- 12080: 0x8721,
- 12081: 0x814A,
- 12082: 0x8FA3,
- 12083: 0x5566,
- 12084: 0x83B1,
- 12085: 0x6765,
- 12086: 0x8D56,
- 12087: 0x84DD,
- 12088: 0x5A6A,
- 12089: 0x680F,
- 12090: 0x62E6,
- 12091: 0x7BEE,
- 12092: 0x9611,
- 12093: 0x5170,
- 12094: 0x6F9C,
- 12095: 0x8C30,
- 12096: 0x63FD,
- 12097: 0x89C8,
- 12098: 0x61D2,
- 12099: 0x7F06,
- 12100: 0x70C2,
- 12101: 0x6EE5,
- 12102: 0x7405,
- 12103: 0x6994,
- 12104: 0x72FC,
- 12105: 0x5ECA,
- 12106: 0x90CE,
- 12107: 0x6717,
- 12108: 0x6D6A,
- 12109: 0x635E,
- 12110: 0x52B3,
- 12111: 0x7262,
- 12112: 0x8001,
- 12113: 0x4F6C,
- 12114: 0x59E5,
- 12115: 0x916A,
- 12116: 0x70D9,
- 12117: 0x6D9D,
- 12118: 0x52D2,
- 12119: 0x4E50,
- 12120: 0x96F7,
- 12121: 0x956D,
- 12122: 0x857E,
- 12123: 0x78CA,
- 12124: 0x7D2F,
- 12125: 0x5121,
- 12126: 0x5792,
- 12127: 0x64C2,
- 12128: 0x808B,
- 12129: 0x7C7B,
- 12130: 0x6CEA,
- 12131: 0x68F1,
- 12132: 0x695E,
- 12133: 0x51B7,
- 12134: 0x5398,
- 12135: 0x68A8,
- 12136: 0x7281,
- 12137: 0x9ECE,
- 12138: 0x7BF1,
- 12139: 0x72F8,
- 12140: 0x79BB,
- 12141: 0x6F13,
- 12142: 0x7406,
- 12143: 0x674E,
- 12144: 0x91CC,
- 12145: 0x9CA4,
- 12146: 0x793C,
- 12147: 0x8389,
- 12148: 0x8354,
- 12149: 0x540F,
- 12150: 0x6817,
- 12151: 0x4E3D,
- 12152: 0x5389,
- 12153: 0x52B1,
- 12154: 0x783E,
- 12155: 0x5386,
- 12156: 0x5229,
- 12157: 0x5088,
- 12158: 0x4F8B,
- 12159: 0x4FD0,
- 12160: 0x7F56,
- 12161: 0x7F59,
- 12162: 0x7F5B,
- 12163: 0x7F5C,
- 12164: 0x7F5D,
- 12165: 0x7F5E,
- 12166: 0x7F60,
- 12167: 0x7F63,
- 12168: 0x7F64,
- 12169: 0x7F65,
- 12170: 0x7F66,
- 12171: 0x7F67,
- 12172: 0x7F6B,
- 12173: 0x7F6C,
- 12174: 0x7F6D,
- 12175: 0x7F6F,
- 12176: 0x7F70,
- 12177: 0x7F73,
- 12178: 0x7F75,
- 12179: 0x7F76,
- 12180: 0x7F77,
- 12181: 0x7F78,
- 12182: 0x7F7A,
- 12183: 0x7F7B,
- 12184: 0x7F7C,
- 12185: 0x7F7D,
- 12186: 0x7F7F,
- 12187: 0x7F80,
- 12188: 0x7F82,
- 12189: 0x7F83,
- 12190: 0x7F84,
- 12191: 0x7F85,
- 12192: 0x7F86,
- 12193: 0x7F87,
- 12194: 0x7F88,
- 12195: 0x7F89,
- 12196: 0x7F8B,
- 12197: 0x7F8D,
- 12198: 0x7F8F,
- 12199: 0x7F90,
- 12200: 0x7F91,
- 12201: 0x7F92,
- 12202: 0x7F93,
- 12203: 0x7F95,
- 12204: 0x7F96,
- 12205: 0x7F97,
- 12206: 0x7F98,
- 12207: 0x7F99,
- 12208: 0x7F9B,
- 12209: 0x7F9C,
- 12210: 0x7FA0,
- 12211: 0x7FA2,
- 12212: 0x7FA3,
- 12213: 0x7FA5,
- 12214: 0x7FA6,
- 12215: 0x7FA8,
- 12216: 0x7FA9,
- 12217: 0x7FAA,
- 12218: 0x7FAB,
- 12219: 0x7FAC,
- 12220: 0x7FAD,
- 12221: 0x7FAE,
- 12222: 0x7FB1,
- 12223: 0x7FB3,
- 12224: 0x7FB4,
- 12225: 0x7FB5,
- 12226: 0x7FB6,
- 12227: 0x7FB7,
- 12228: 0x7FBA,
- 12229: 0x7FBB,
- 12230: 0x7FBE,
- 12231: 0x7FC0,
- 12232: 0x7FC2,
- 12233: 0x7FC3,
- 12234: 0x7FC4,
- 12235: 0x7FC6,
- 12236: 0x7FC7,
- 12237: 0x7FC8,
- 12238: 0x7FC9,
- 12239: 0x7FCB,
- 12240: 0x7FCD,
- 12241: 0x7FCF,
- 12242: 0x7FD0,
- 12243: 0x7FD1,
- 12244: 0x7FD2,
- 12245: 0x7FD3,
- 12246: 0x7FD6,
- 12247: 0x7FD7,
- 12248: 0x7FD9,
- 12249: 0x7FDA,
- 12250: 0x7FDB,
- 12251: 0x7FDC,
- 12252: 0x7FDD,
- 12253: 0x7FDE,
- 12254: 0x7FE2,
- 12255: 0x7FE3,
- 12256: 0x75E2,
- 12257: 0x7ACB,
- 12258: 0x7C92,
- 12259: 0x6CA5,
- 12260: 0x96B6,
- 12261: 0x529B,
- 12262: 0x7483,
- 12263: 0x54E9,
- 12264: 0x4FE9,
- 12265: 0x8054,
- 12266: 0x83B2,
- 12267: 0x8FDE,
- 12268: 0x9570,
- 12269: 0x5EC9,
- 12270: 0x601C,
- 12271: 0x6D9F,
- 12272: 0x5E18,
- 12273: 0x655B,
- 12274: 0x8138,
- 12275: 0x94FE,
- 12276: 0x604B,
- 12277: 0x70BC,
- 12278: 0x7EC3,
- 12279: 0x7CAE,
- 12280: 0x51C9,
- 12281: 0x6881,
- 12282: 0x7CB1,
- 12283: 0x826F,
- 12284: 0x4E24,
- 12285: 0x8F86,
- 12286: 0x91CF,
- 12287: 0x667E,
- 12288: 0x4EAE,
- 12289: 0x8C05,
- 12290: 0x64A9,
- 12291: 0x804A,
- 12292: 0x50DA,
- 12293: 0x7597,
- 12294: 0x71CE,
- 12295: 0x5BE5,
- 12296: 0x8FBD,
- 12297: 0x6F66,
- 12298: 0x4E86,
- 12299: 0x6482,
- 12300: 0x9563,
- 12301: 0x5ED6,
- 12302: 0x6599,
- 12303: 0x5217,
- 12304: 0x88C2,
- 12305: 0x70C8,
- 12306: 0x52A3,
- 12307: 0x730E,
- 12308: 0x7433,
- 12309: 0x6797,
- 12310: 0x78F7,
- 12311: 0x9716,
- 12312: 0x4E34,
- 12313: 0x90BB,
- 12314: 0x9CDE,
- 12315: 0x6DCB,
- 12316: 0x51DB,
- 12317: 0x8D41,
- 12318: 0x541D,
- 12319: 0x62CE,
- 12320: 0x73B2,
- 12321: 0x83F1,
- 12322: 0x96F6,
- 12323: 0x9F84,
- 12324: 0x94C3,
- 12325: 0x4F36,
- 12326: 0x7F9A,
- 12327: 0x51CC,
- 12328: 0x7075,
- 12329: 0x9675,
- 12330: 0x5CAD,
- 12331: 0x9886,
- 12332: 0x53E6,
- 12333: 0x4EE4,
- 12334: 0x6E9C,
- 12335: 0x7409,
- 12336: 0x69B4,
- 12337: 0x786B,
- 12338: 0x998F,
- 12339: 0x7559,
- 12340: 0x5218,
- 12341: 0x7624,
- 12342: 0x6D41,
- 12343: 0x67F3,
- 12344: 0x516D,
- 12345: 0x9F99,
- 12346: 0x804B,
- 12347: 0x5499,
- 12348: 0x7B3C,
- 12349: 0x7ABF,
- 12350: 0x7FE4,
- 12351: 0x7FE7,
- 12352: 0x7FE8,
- 12353: 0x7FEA,
- 12354: 0x7FEB,
- 12355: 0x7FEC,
- 12356: 0x7FED,
- 12357: 0x7FEF,
- 12358: 0x7FF2,
- 12359: 0x7FF4,
- 12360: 0x7FF5,
- 12361: 0x7FF6,
- 12362: 0x7FF7,
- 12363: 0x7FF8,
- 12364: 0x7FF9,
- 12365: 0x7FFA,
- 12366: 0x7FFD,
- 12367: 0x7FFE,
- 12368: 0x7FFF,
- 12369: 0x8002,
- 12370: 0x8007,
- 12371: 0x8008,
- 12372: 0x8009,
- 12373: 0x800A,
- 12374: 0x800E,
- 12375: 0x800F,
- 12376: 0x8011,
- 12377: 0x8013,
- 12378: 0x801A,
- 12379: 0x801B,
- 12380: 0x801D,
- 12381: 0x801E,
- 12382: 0x801F,
- 12383: 0x8021,
- 12384: 0x8023,
- 12385: 0x8024,
- 12386: 0x802B,
- 12387: 0x802C,
- 12388: 0x802D,
- 12389: 0x802E,
- 12390: 0x802F,
- 12391: 0x8030,
- 12392: 0x8032,
- 12393: 0x8034,
- 12394: 0x8039,
- 12395: 0x803A,
- 12396: 0x803C,
- 12397: 0x803E,
- 12398: 0x8040,
- 12399: 0x8041,
- 12400: 0x8044,
- 12401: 0x8045,
- 12402: 0x8047,
- 12403: 0x8048,
- 12404: 0x8049,
- 12405: 0x804E,
- 12406: 0x804F,
- 12407: 0x8050,
- 12408: 0x8051,
- 12409: 0x8053,
- 12410: 0x8055,
- 12411: 0x8056,
- 12412: 0x8057,
- 12413: 0x8059,
- 12414: 0x805B,
- 12415: 0x805C,
- 12416: 0x805D,
- 12417: 0x805E,
- 12418: 0x805F,
- 12419: 0x8060,
- 12420: 0x8061,
- 12421: 0x8062,
- 12422: 0x8063,
- 12423: 0x8064,
- 12424: 0x8065,
- 12425: 0x8066,
- 12426: 0x8067,
- 12427: 0x8068,
- 12428: 0x806B,
- 12429: 0x806C,
- 12430: 0x806D,
- 12431: 0x806E,
- 12432: 0x806F,
- 12433: 0x8070,
- 12434: 0x8072,
- 12435: 0x8073,
- 12436: 0x8074,
- 12437: 0x8075,
- 12438: 0x8076,
- 12439: 0x8077,
- 12440: 0x8078,
- 12441: 0x8079,
- 12442: 0x807A,
- 12443: 0x807B,
- 12444: 0x807C,
- 12445: 0x807D,
- 12446: 0x9686,
- 12447: 0x5784,
- 12448: 0x62E2,
- 12449: 0x9647,
- 12450: 0x697C,
- 12451: 0x5A04,
- 12452: 0x6402,
- 12453: 0x7BD3,
- 12454: 0x6F0F,
- 12455: 0x964B,
- 12456: 0x82A6,
- 12457: 0x5362,
- 12458: 0x9885,
- 12459: 0x5E90,
- 12460: 0x7089,
- 12461: 0x63B3,
- 12462: 0x5364,
- 12463: 0x864F,
- 12464: 0x9C81,
- 12465: 0x9E93,
- 12466: 0x788C,
- 12467: 0x9732,
- 12468: 0x8DEF,
- 12469: 0x8D42,
- 12470: 0x9E7F,
- 12471: 0x6F5E,
- 12472: 0x7984,
- 12473: 0x5F55,
- 12474: 0x9646,
- 12475: 0x622E,
- 12476: 0x9A74,
- 12477: 0x5415,
- 12478: 0x94DD,
- 12479: 0x4FA3,
- 12480: 0x65C5,
- 12481: 0x5C65,
- 12482: 0x5C61,
- 12483: 0x7F15,
- 12484: 0x8651,
- 12485: 0x6C2F,
- 12486: 0x5F8B,
- 12487: 0x7387,
- 12488: 0x6EE4,
- 12489: 0x7EFF,
- 12490: 0x5CE6,
- 12491: 0x631B,
- 12492: 0x5B6A,
- 12493: 0x6EE6,
- 12494: 0x5375,
- 12495: 0x4E71,
- 12496: 0x63A0,
- 12497: 0x7565,
- 12498: 0x62A1,
- 12499: 0x8F6E,
- 12500: 0x4F26,
- 12501: 0x4ED1,
- 12502: 0x6CA6,
- 12503: 0x7EB6,
- 12504: 0x8BBA,
- 12505: 0x841D,
- 12506: 0x87BA,
- 12507: 0x7F57,
- 12508: 0x903B,
- 12509: 0x9523,
- 12510: 0x7BA9,
- 12511: 0x9AA1,
- 12512: 0x88F8,
- 12513: 0x843D,
- 12514: 0x6D1B,
- 12515: 0x9A86,
- 12516: 0x7EDC,
- 12517: 0x5988,
- 12518: 0x9EBB,
- 12519: 0x739B,
- 12520: 0x7801,
- 12521: 0x8682,
- 12522: 0x9A6C,
- 12523: 0x9A82,
- 12524: 0x561B,
- 12525: 0x5417,
- 12526: 0x57CB,
- 12527: 0x4E70,
- 12528: 0x9EA6,
- 12529: 0x5356,
- 12530: 0x8FC8,
- 12531: 0x8109,
- 12532: 0x7792,
- 12533: 0x9992,
- 12534: 0x86EE,
- 12535: 0x6EE1,
- 12536: 0x8513,
- 12537: 0x66FC,
- 12538: 0x6162,
- 12539: 0x6F2B,
- 12540: 0x807E,
- 12541: 0x8081,
- 12542: 0x8082,
- 12543: 0x8085,
- 12544: 0x8088,
- 12545: 0x808A,
- 12546: 0x808D,
- 12547: 0x808E,
- 12548: 0x808F,
- 12549: 0x8090,
- 12550: 0x8091,
- 12551: 0x8092,
- 12552: 0x8094,
- 12553: 0x8095,
- 12554: 0x8097,
- 12555: 0x8099,
- 12556: 0x809E,
- 12557: 0x80A3,
- 12558: 0x80A6,
- 12559: 0x80A7,
- 12560: 0x80A8,
- 12561: 0x80AC,
- 12562: 0x80B0,
- 12563: 0x80B3,
- 12564: 0x80B5,
- 12565: 0x80B6,
- 12566: 0x80B8,
- 12567: 0x80B9,
- 12568: 0x80BB,
- 12569: 0x80C5,
- 12570: 0x80C7,
- 12571: 0x80C8,
- 12572: 0x80C9,
- 12573: 0x80CA,
- 12574: 0x80CB,
- 12575: 0x80CF,
- 12576: 0x80D0,
- 12577: 0x80D1,
- 12578: 0x80D2,
- 12579: 0x80D3,
- 12580: 0x80D4,
- 12581: 0x80D5,
- 12582: 0x80D8,
- 12583: 0x80DF,
- 12584: 0x80E0,
- 12585: 0x80E2,
- 12586: 0x80E3,
- 12587: 0x80E6,
- 12588: 0x80EE,
- 12589: 0x80F5,
- 12590: 0x80F7,
- 12591: 0x80F9,
- 12592: 0x80FB,
- 12593: 0x80FE,
- 12594: 0x80FF,
- 12595: 0x8100,
- 12596: 0x8101,
- 12597: 0x8103,
- 12598: 0x8104,
- 12599: 0x8105,
- 12600: 0x8107,
- 12601: 0x8108,
- 12602: 0x810B,
- 12603: 0x810C,
- 12604: 0x8115,
- 12605: 0x8117,
- 12606: 0x8119,
- 12607: 0x811B,
- 12608: 0x811C,
- 12609: 0x811D,
- 12610: 0x811F,
- 12611: 0x8120,
- 12612: 0x8121,
- 12613: 0x8122,
- 12614: 0x8123,
- 12615: 0x8124,
- 12616: 0x8125,
- 12617: 0x8126,
- 12618: 0x8127,
- 12619: 0x8128,
- 12620: 0x8129,
- 12621: 0x812A,
- 12622: 0x812B,
- 12623: 0x812D,
- 12624: 0x812E,
- 12625: 0x8130,
- 12626: 0x8133,
- 12627: 0x8134,
- 12628: 0x8135,
- 12629: 0x8137,
- 12630: 0x8139,
- 12631: 0x813A,
- 12632: 0x813B,
- 12633: 0x813C,
- 12634: 0x813D,
- 12635: 0x813F,
- 12636: 0x8C29,
- 12637: 0x8292,
- 12638: 0x832B,
- 12639: 0x76F2,
- 12640: 0x6C13,
- 12641: 0x5FD9,
- 12642: 0x83BD,
- 12643: 0x732B,
- 12644: 0x8305,
- 12645: 0x951A,
- 12646: 0x6BDB,
- 12647: 0x77DB,
- 12648: 0x94C6,
- 12649: 0x536F,
- 12650: 0x8302,
- 12651: 0x5192,
- 12652: 0x5E3D,
- 12653: 0x8C8C,
- 12654: 0x8D38,
- 12655: 0x4E48,
- 12656: 0x73AB,
- 12657: 0x679A,
- 12658: 0x6885,
- 12659: 0x9176,
- 12660: 0x9709,
- 12661: 0x7164,
- 12662: 0x6CA1,
- 12663: 0x7709,
- 12664: 0x5A92,
- 12665: 0x9541,
- 12666: 0x6BCF,
- 12667: 0x7F8E,
- 12668: 0x6627,
- 12669: 0x5BD0,
- 12670: 0x59B9,
- 12671: 0x5A9A,
- 12672: 0x95E8,
- 12673: 0x95F7,
- 12674: 0x4EEC,
- 12675: 0x840C,
- 12676: 0x8499,
- 12677: 0x6AAC,
- 12678: 0x76DF,
- 12679: 0x9530,
- 12680: 0x731B,
- 12681: 0x68A6,
- 12682: 0x5B5F,
- 12683: 0x772F,
- 12684: 0x919A,
- 12685: 0x9761,
- 12686: 0x7CDC,
- 12687: 0x8FF7,
- 12688: 0x8C1C,
- 12689: 0x5F25,
- 12690: 0x7C73,
- 12691: 0x79D8,
- 12692: 0x89C5,
- 12693: 0x6CCC,
- 12694: 0x871C,
- 12695: 0x5BC6,
- 12696: 0x5E42,
- 12697: 0x68C9,
- 12698: 0x7720,
- 12699: 0x7EF5,
- 12700: 0x5195,
- 12701: 0x514D,
- 12702: 0x52C9,
- 12703: 0x5A29,
- 12704: 0x7F05,
- 12705: 0x9762,
- 12706: 0x82D7,
- 12707: 0x63CF,
- 12708: 0x7784,
- 12709: 0x85D0,
- 12710: 0x79D2,
- 12711: 0x6E3A,
- 12712: 0x5E99,
- 12713: 0x5999,
- 12714: 0x8511,
- 12715: 0x706D,
- 12716: 0x6C11,
- 12717: 0x62BF,
- 12718: 0x76BF,
- 12719: 0x654F,
- 12720: 0x60AF,
- 12721: 0x95FD,
- 12722: 0x660E,
- 12723: 0x879F,
- 12724: 0x9E23,
- 12725: 0x94ED,
- 12726: 0x540D,
- 12727: 0x547D,
- 12728: 0x8C2C,
- 12729: 0x6478,
- 12730: 0x8140,
- 12731: 0x8141,
- 12732: 0x8142,
- 12733: 0x8143,
- 12734: 0x8144,
- 12735: 0x8145,
- 12736: 0x8147,
- 12737: 0x8149,
- 12738: 0x814D,
- 12739: 0x814E,
- 12740: 0x814F,
- 12741: 0x8152,
- 12742: 0x8156,
- 12743: 0x8157,
- 12744: 0x8158,
- 12745: 0x815B,
- 12746: 0x815C,
- 12747: 0x815D,
- 12748: 0x815E,
- 12749: 0x815F,
- 12750: 0x8161,
- 12751: 0x8162,
- 12752: 0x8163,
- 12753: 0x8164,
- 12754: 0x8166,
- 12755: 0x8168,
- 12756: 0x816A,
- 12757: 0x816B,
- 12758: 0x816C,
- 12759: 0x816F,
- 12760: 0x8172,
- 12761: 0x8173,
- 12762: 0x8175,
- 12763: 0x8176,
- 12764: 0x8177,
- 12765: 0x8178,
- 12766: 0x8181,
- 12767: 0x8183,
- 12768: 0x8184,
- 12769: 0x8185,
- 12770: 0x8186,
- 12771: 0x8187,
- 12772: 0x8189,
- 12773: 0x818B,
- 12774: 0x818C,
- 12775: 0x818D,
- 12776: 0x818E,
- 12777: 0x8190,
- 12778: 0x8192,
- 12779: 0x8193,
- 12780: 0x8194,
- 12781: 0x8195,
- 12782: 0x8196,
- 12783: 0x8197,
- 12784: 0x8199,
- 12785: 0x819A,
- 12786: 0x819E,
- 12787: 0x819F,
- 12788: 0x81A0,
- 12789: 0x81A1,
- 12790: 0x81A2,
- 12791: 0x81A4,
- 12792: 0x81A5,
- 12793: 0x81A7,
- 12794: 0x81A9,
- 12795: 0x81AB,
- 12796: 0x81AC,
- 12797: 0x81AD,
- 12798: 0x81AE,
- 12799: 0x81AF,
- 12800: 0x81B0,
- 12801: 0x81B1,
- 12802: 0x81B2,
- 12803: 0x81B4,
- 12804: 0x81B5,
- 12805: 0x81B6,
- 12806: 0x81B7,
- 12807: 0x81B8,
- 12808: 0x81B9,
- 12809: 0x81BC,
- 12810: 0x81BD,
- 12811: 0x81BE,
- 12812: 0x81BF,
- 12813: 0x81C4,
- 12814: 0x81C5,
- 12815: 0x81C7,
- 12816: 0x81C8,
- 12817: 0x81C9,
- 12818: 0x81CB,
- 12819: 0x81CD,
- 12820: 0x81CE,
- 12821: 0x81CF,
- 12822: 0x81D0,
- 12823: 0x81D1,
- 12824: 0x81D2,
- 12825: 0x81D3,
- 12826: 0x6479,
- 12827: 0x8611,
- 12828: 0x6A21,
- 12829: 0x819C,
- 12830: 0x78E8,
- 12831: 0x6469,
- 12832: 0x9B54,
- 12833: 0x62B9,
- 12834: 0x672B,
- 12835: 0x83AB,
- 12836: 0x58A8,
- 12837: 0x9ED8,
- 12838: 0x6CAB,
- 12839: 0x6F20,
- 12840: 0x5BDE,
- 12841: 0x964C,
- 12842: 0x8C0B,
- 12843: 0x725F,
- 12844: 0x67D0,
- 12845: 0x62C7,
- 12846: 0x7261,
- 12847: 0x4EA9,
- 12848: 0x59C6,
- 12849: 0x6BCD,
- 12850: 0x5893,
- 12851: 0x66AE,
- 12852: 0x5E55,
- 12853: 0x52DF,
- 12854: 0x6155,
- 12855: 0x6728,
- 12856: 0x76EE,
- 12857: 0x7766,
- 12858: 0x7267,
- 12859: 0x7A46,
- 12860: 0x62FF,
- 12861: 0x54EA,
- 12862: 0x5450,
- 12863: 0x94A0,
- 12864: 0x90A3,
- 12865: 0x5A1C,
- 12866: 0x7EB3,
- 12867: 0x6C16,
- 12868: 0x4E43,
- 12869: 0x5976,
- 12870: 0x8010,
- 12871: 0x5948,
- 12872: 0x5357,
- 12873: 0x7537,
- 12874: 0x96BE,
- 12875: 0x56CA,
- 12876: 0x6320,
- 12877: 0x8111,
- 12878: 0x607C,
- 12879: 0x95F9,
- 12880: 0x6DD6,
- 12881: 0x5462,
- 12882: 0x9981,
- 12883: 0x5185,
- 12884: 0x5AE9,
- 12885: 0x80FD,
- 12886: 0x59AE,
- 12887: 0x9713,
- 12888: 0x502A,
- 12889: 0x6CE5,
- 12890: 0x5C3C,
- 12891: 0x62DF,
- 12892: 0x4F60,
- 12893: 0x533F,
- 12894: 0x817B,
- 12895: 0x9006,
- 12896: 0x6EBA,
- 12897: 0x852B,
- 12898: 0x62C8,
- 12899: 0x5E74,
- 12900: 0x78BE,
- 12901: 0x64B5,
- 12902: 0x637B,
- 12903: 0x5FF5,
- 12904: 0x5A18,
- 12905: 0x917F,
- 12906: 0x9E1F,
- 12907: 0x5C3F,
- 12908: 0x634F,
- 12909: 0x8042,
- 12910: 0x5B7D,
- 12911: 0x556E,
- 12912: 0x954A,
- 12913: 0x954D,
- 12914: 0x6D85,
- 12915: 0x60A8,
- 12916: 0x67E0,
- 12917: 0x72DE,
- 12918: 0x51DD,
- 12919: 0x5B81,
- 12920: 0x81D4,
- 12921: 0x81D5,
- 12922: 0x81D6,
- 12923: 0x81D7,
- 12924: 0x81D8,
- 12925: 0x81D9,
- 12926: 0x81DA,
- 12927: 0x81DB,
- 12928: 0x81DC,
- 12929: 0x81DD,
- 12930: 0x81DE,
- 12931: 0x81DF,
- 12932: 0x81E0,
- 12933: 0x81E1,
- 12934: 0x81E2,
- 12935: 0x81E4,
- 12936: 0x81E5,
- 12937: 0x81E6,
- 12938: 0x81E8,
- 12939: 0x81E9,
- 12940: 0x81EB,
- 12941: 0x81EE,
- 12942: 0x81EF,
- 12943: 0x81F0,
- 12944: 0x81F1,
- 12945: 0x81F2,
- 12946: 0x81F5,
- 12947: 0x81F6,
- 12948: 0x81F7,
- 12949: 0x81F8,
- 12950: 0x81F9,
- 12951: 0x81FA,
- 12952: 0x81FD,
- 12953: 0x81FF,
- 12954: 0x8203,
- 12955: 0x8207,
- 12956: 0x8208,
- 12957: 0x8209,
- 12958: 0x820A,
- 12959: 0x820B,
- 12960: 0x820E,
- 12961: 0x820F,
- 12962: 0x8211,
- 12963: 0x8213,
- 12964: 0x8215,
- 12965: 0x8216,
- 12966: 0x8217,
- 12967: 0x8218,
- 12968: 0x8219,
- 12969: 0x821A,
- 12970: 0x821D,
- 12971: 0x8220,
- 12972: 0x8224,
- 12973: 0x8225,
- 12974: 0x8226,
- 12975: 0x8227,
- 12976: 0x8229,
- 12977: 0x822E,
- 12978: 0x8232,
- 12979: 0x823A,
- 12980: 0x823C,
- 12981: 0x823D,
- 12982: 0x823F,
- 12983: 0x8240,
- 12984: 0x8241,
- 12985: 0x8242,
- 12986: 0x8243,
- 12987: 0x8245,
- 12988: 0x8246,
- 12989: 0x8248,
- 12990: 0x824A,
- 12991: 0x824C,
- 12992: 0x824D,
- 12993: 0x824E,
- 12994: 0x8250,
- 12995: 0x8251,
- 12996: 0x8252,
- 12997: 0x8253,
- 12998: 0x8254,
- 12999: 0x8255,
- 13000: 0x8256,
- 13001: 0x8257,
- 13002: 0x8259,
- 13003: 0x825B,
- 13004: 0x825C,
- 13005: 0x825D,
- 13006: 0x825E,
- 13007: 0x8260,
- 13008: 0x8261,
- 13009: 0x8262,
- 13010: 0x8263,
- 13011: 0x8264,
- 13012: 0x8265,
- 13013: 0x8266,
- 13014: 0x8267,
- 13015: 0x8269,
- 13016: 0x62E7,
- 13017: 0x6CDE,
- 13018: 0x725B,
- 13019: 0x626D,
- 13020: 0x94AE,
- 13021: 0x7EBD,
- 13022: 0x8113,
- 13023: 0x6D53,
- 13024: 0x519C,
- 13025: 0x5F04,
- 13026: 0x5974,
- 13027: 0x52AA,
- 13028: 0x6012,
- 13029: 0x5973,
- 13030: 0x6696,
- 13031: 0x8650,
- 13032: 0x759F,
- 13033: 0x632A,
- 13034: 0x61E6,
- 13035: 0x7CEF,
- 13036: 0x8BFA,
- 13037: 0x54E6,
- 13038: 0x6B27,
- 13039: 0x9E25,
- 13040: 0x6BB4,
- 13041: 0x85D5,
- 13042: 0x5455,
- 13043: 0x5076,
- 13044: 0x6CA4,
- 13045: 0x556A,
- 13046: 0x8DB4,
- 13047: 0x722C,
- 13048: 0x5E15,
- 13049: 0x6015,
- 13050: 0x7436,
- 13051: 0x62CD,
- 13052: 0x6392,
- 13053: 0x724C,
- 13054: 0x5F98,
- 13055: 0x6E43,
- 13056: 0x6D3E,
- 13057: 0x6500,
- 13058: 0x6F58,
- 13059: 0x76D8,
- 13060: 0x78D0,
- 13061: 0x76FC,
- 13062: 0x7554,
- 13063: 0x5224,
- 13064: 0x53DB,
- 13065: 0x4E53,
- 13066: 0x5E9E,
- 13067: 0x65C1,
- 13068: 0x802A,
- 13069: 0x80D6,
- 13070: 0x629B,
- 13071: 0x5486,
- 13072: 0x5228,
- 13073: 0x70AE,
- 13074: 0x888D,
- 13075: 0x8DD1,
- 13076: 0x6CE1,
- 13077: 0x5478,
- 13078: 0x80DA,
- 13079: 0x57F9,
- 13080: 0x88F4,
- 13081: 0x8D54,
- 13082: 0x966A,
- 13083: 0x914D,
- 13084: 0x4F69,
- 13085: 0x6C9B,
- 13086: 0x55B7,
- 13087: 0x76C6,
- 13088: 0x7830,
- 13089: 0x62A8,
- 13090: 0x70F9,
- 13091: 0x6F8E,
- 13092: 0x5F6D,
- 13093: 0x84EC,
- 13094: 0x68DA,
- 13095: 0x787C,
- 13096: 0x7BF7,
- 13097: 0x81A8,
- 13098: 0x670B,
- 13099: 0x9E4F,
- 13100: 0x6367,
- 13101: 0x78B0,
- 13102: 0x576F,
- 13103: 0x7812,
- 13104: 0x9739,
- 13105: 0x6279,
- 13106: 0x62AB,
- 13107: 0x5288,
- 13108: 0x7435,
- 13109: 0x6BD7,
- 13110: 0x826A,
- 13111: 0x826B,
- 13112: 0x826C,
- 13113: 0x826D,
- 13114: 0x8271,
- 13115: 0x8275,
- 13116: 0x8276,
- 13117: 0x8277,
- 13118: 0x8278,
- 13119: 0x827B,
- 13120: 0x827C,
- 13121: 0x8280,
- 13122: 0x8281,
- 13123: 0x8283,
- 13124: 0x8285,
- 13125: 0x8286,
- 13126: 0x8287,
- 13127: 0x8289,
- 13128: 0x828C,
- 13129: 0x8290,
- 13130: 0x8293,
- 13131: 0x8294,
- 13132: 0x8295,
- 13133: 0x8296,
- 13134: 0x829A,
- 13135: 0x829B,
- 13136: 0x829E,
- 13137: 0x82A0,
- 13138: 0x82A2,
- 13139: 0x82A3,
- 13140: 0x82A7,
- 13141: 0x82B2,
- 13142: 0x82B5,
- 13143: 0x82B6,
- 13144: 0x82BA,
- 13145: 0x82BB,
- 13146: 0x82BC,
- 13147: 0x82BF,
- 13148: 0x82C0,
- 13149: 0x82C2,
- 13150: 0x82C3,
- 13151: 0x82C5,
- 13152: 0x82C6,
- 13153: 0x82C9,
- 13154: 0x82D0,
- 13155: 0x82D6,
- 13156: 0x82D9,
- 13157: 0x82DA,
- 13158: 0x82DD,
- 13159: 0x82E2,
- 13160: 0x82E7,
- 13161: 0x82E8,
- 13162: 0x82E9,
- 13163: 0x82EA,
- 13164: 0x82EC,
- 13165: 0x82ED,
- 13166: 0x82EE,
- 13167: 0x82F0,
- 13168: 0x82F2,
- 13169: 0x82F3,
- 13170: 0x82F5,
- 13171: 0x82F6,
- 13172: 0x82F8,
- 13173: 0x82FA,
- 13174: 0x82FC,
- 13175: 0x82FD,
- 13176: 0x82FE,
- 13177: 0x82FF,
- 13178: 0x8300,
- 13179: 0x830A,
- 13180: 0x830B,
- 13181: 0x830D,
- 13182: 0x8310,
- 13183: 0x8312,
- 13184: 0x8313,
- 13185: 0x8316,
- 13186: 0x8318,
- 13187: 0x8319,
- 13188: 0x831D,
- 13189: 0x831E,
- 13190: 0x831F,
- 13191: 0x8320,
- 13192: 0x8321,
- 13193: 0x8322,
- 13194: 0x8323,
- 13195: 0x8324,
- 13196: 0x8325,
- 13197: 0x8326,
- 13198: 0x8329,
- 13199: 0x832A,
- 13200: 0x832E,
- 13201: 0x8330,
- 13202: 0x8332,
- 13203: 0x8337,
- 13204: 0x833B,
- 13205: 0x833D,
- 13206: 0x5564,
- 13207: 0x813E,
- 13208: 0x75B2,
- 13209: 0x76AE,
- 13210: 0x5339,
- 13211: 0x75DE,
- 13212: 0x50FB,
- 13213: 0x5C41,
- 13214: 0x8B6C,
- 13215: 0x7BC7,
- 13216: 0x504F,
- 13217: 0x7247,
- 13218: 0x9A97,
- 13219: 0x98D8,
- 13220: 0x6F02,
- 13221: 0x74E2,
- 13222: 0x7968,
- 13223: 0x6487,
- 13224: 0x77A5,
- 13225: 0x62FC,
- 13226: 0x9891,
- 13227: 0x8D2B,
- 13228: 0x54C1,
- 13229: 0x8058,
- 13230: 0x4E52,
- 13231: 0x576A,
- 13232: 0x82F9,
- 13233: 0x840D,
- 13234: 0x5E73,
- 13235: 0x51ED,
- 13236: 0x74F6,
- 13237: 0x8BC4,
- 13238: 0x5C4F,
- 13239: 0x5761,
- 13240: 0x6CFC,
- 13241: 0x9887,
- 13242: 0x5A46,
- 13243: 0x7834,
- 13244: 0x9B44,
- 13245: 0x8FEB,
- 13246: 0x7C95,
- 13247: 0x5256,
- 13248: 0x6251,
- 13249: 0x94FA,
- 13250: 0x4EC6,
- 13251: 0x8386,
- 13252: 0x8461,
- 13253: 0x83E9,
- 13254: 0x84B2,
- 13255: 0x57D4,
- 13256: 0x6734,
- 13257: 0x5703,
- 13258: 0x666E,
- 13259: 0x6D66,
- 13260: 0x8C31,
- 13261: 0x66DD,
- 13262: 0x7011,
- 13263: 0x671F,
- 13264: 0x6B3A,
- 13265: 0x6816,
- 13266: 0x621A,
- 13267: 0x59BB,
- 13268: 0x4E03,
- 13269: 0x51C4,
- 13270: 0x6F06,
- 13271: 0x67D2,
- 13272: 0x6C8F,
- 13273: 0x5176,
- 13274: 0x68CB,
- 13275: 0x5947,
- 13276: 0x6B67,
- 13277: 0x7566,
- 13278: 0x5D0E,
- 13279: 0x8110,
- 13280: 0x9F50,
- 13281: 0x65D7,
- 13282: 0x7948,
- 13283: 0x7941,
- 13284: 0x9A91,
- 13285: 0x8D77,
- 13286: 0x5C82,
- 13287: 0x4E5E,
- 13288: 0x4F01,
- 13289: 0x542F,
- 13290: 0x5951,
- 13291: 0x780C,
- 13292: 0x5668,
- 13293: 0x6C14,
- 13294: 0x8FC4,
- 13295: 0x5F03,
- 13296: 0x6C7D,
- 13297: 0x6CE3,
- 13298: 0x8BAB,
- 13299: 0x6390,
- 13300: 0x833E,
- 13301: 0x833F,
- 13302: 0x8341,
- 13303: 0x8342,
- 13304: 0x8344,
- 13305: 0x8345,
- 13306: 0x8348,
- 13307: 0x834A,
- 13308: 0x834B,
- 13309: 0x834C,
- 13310: 0x834D,
- 13311: 0x834E,
- 13312: 0x8353,
- 13313: 0x8355,
- 13314: 0x8356,
- 13315: 0x8357,
- 13316: 0x8358,
- 13317: 0x8359,
- 13318: 0x835D,
- 13319: 0x8362,
- 13320: 0x8370,
- 13321: 0x8371,
- 13322: 0x8372,
- 13323: 0x8373,
- 13324: 0x8374,
- 13325: 0x8375,
- 13326: 0x8376,
- 13327: 0x8379,
- 13328: 0x837A,
- 13329: 0x837E,
- 13330: 0x837F,
- 13331: 0x8380,
- 13332: 0x8381,
- 13333: 0x8382,
- 13334: 0x8383,
- 13335: 0x8384,
- 13336: 0x8387,
- 13337: 0x8388,
- 13338: 0x838A,
- 13339: 0x838B,
- 13340: 0x838C,
- 13341: 0x838D,
- 13342: 0x838F,
- 13343: 0x8390,
- 13344: 0x8391,
- 13345: 0x8394,
- 13346: 0x8395,
- 13347: 0x8396,
- 13348: 0x8397,
- 13349: 0x8399,
- 13350: 0x839A,
- 13351: 0x839D,
- 13352: 0x839F,
- 13353: 0x83A1,
- 13354: 0x83A2,
- 13355: 0x83A3,
- 13356: 0x83A4,
- 13357: 0x83A5,
- 13358: 0x83A6,
- 13359: 0x83A7,
- 13360: 0x83AC,
- 13361: 0x83AD,
- 13362: 0x83AE,
- 13363: 0x83AF,
- 13364: 0x83B5,
- 13365: 0x83BB,
- 13366: 0x83BE,
- 13367: 0x83BF,
- 13368: 0x83C2,
- 13369: 0x83C3,
- 13370: 0x83C4,
- 13371: 0x83C6,
- 13372: 0x83C8,
- 13373: 0x83C9,
- 13374: 0x83CB,
- 13375: 0x83CD,
- 13376: 0x83CE,
- 13377: 0x83D0,
- 13378: 0x83D1,
- 13379: 0x83D2,
- 13380: 0x83D3,
- 13381: 0x83D5,
- 13382: 0x83D7,
- 13383: 0x83D9,
- 13384: 0x83DA,
- 13385: 0x83DB,
- 13386: 0x83DE,
- 13387: 0x83E2,
- 13388: 0x83E3,
- 13389: 0x83E4,
- 13390: 0x83E6,
- 13391: 0x83E7,
- 13392: 0x83E8,
- 13393: 0x83EB,
- 13394: 0x83EC,
- 13395: 0x83ED,
- 13396: 0x6070,
- 13397: 0x6D3D,
- 13398: 0x7275,
- 13399: 0x6266,
- 13400: 0x948E,
- 13401: 0x94C5,
- 13402: 0x5343,
- 13403: 0x8FC1,
- 13404: 0x7B7E,
- 13405: 0x4EDF,
- 13406: 0x8C26,
- 13407: 0x4E7E,
- 13408: 0x9ED4,
- 13409: 0x94B1,
- 13410: 0x94B3,
- 13411: 0x524D,
- 13412: 0x6F5C,
- 13413: 0x9063,
- 13414: 0x6D45,
- 13415: 0x8C34,
- 13416: 0x5811,
- 13417: 0x5D4C,
- 13418: 0x6B20,
- 13419: 0x6B49,
- 13420: 0x67AA,
- 13421: 0x545B,
- 13422: 0x8154,
- 13423: 0x7F8C,
- 13424: 0x5899,
- 13425: 0x8537,
- 13426: 0x5F3A,
- 13427: 0x62A2,
- 13428: 0x6A47,
- 13429: 0x9539,
- 13430: 0x6572,
- 13431: 0x6084,
- 13432: 0x6865,
- 13433: 0x77A7,
- 13434: 0x4E54,
- 13435: 0x4FA8,
- 13436: 0x5DE7,
- 13437: 0x9798,
- 13438: 0x64AC,
- 13439: 0x7FD8,
- 13440: 0x5CED,
- 13441: 0x4FCF,
- 13442: 0x7A8D,
- 13443: 0x5207,
- 13444: 0x8304,
- 13445: 0x4E14,
- 13446: 0x602F,
- 13447: 0x7A83,
- 13448: 0x94A6,
- 13449: 0x4FB5,
- 13450: 0x4EB2,
- 13451: 0x79E6,
- 13452: 0x7434,
- 13453: 0x52E4,
- 13454: 0x82B9,
- 13455: 0x64D2,
- 13456: 0x79BD,
- 13457: 0x5BDD,
- 13458: 0x6C81,
- 13459: 0x9752,
- 13460: 0x8F7B,
- 13461: 0x6C22,
- 13462: 0x503E,
- 13463: 0x537F,
- 13464: 0x6E05,
- 13465: 0x64CE,
- 13466: 0x6674,
- 13467: 0x6C30,
- 13468: 0x60C5,
- 13469: 0x9877,
- 13470: 0x8BF7,
- 13471: 0x5E86,
- 13472: 0x743C,
- 13473: 0x7A77,
- 13474: 0x79CB,
- 13475: 0x4E18,
- 13476: 0x90B1,
- 13477: 0x7403,
- 13478: 0x6C42,
- 13479: 0x56DA,
- 13480: 0x914B,
- 13481: 0x6CC5,
- 13482: 0x8D8B,
- 13483: 0x533A,
- 13484: 0x86C6,
- 13485: 0x66F2,
- 13486: 0x8EAF,
- 13487: 0x5C48,
- 13488: 0x9A71,
- 13489: 0x6E20,
- 13490: 0x83EE,
- 13491: 0x83EF,
- 13492: 0x83F3,
- 13493: 0x83F4,
- 13494: 0x83F5,
- 13495: 0x83F6,
- 13496: 0x83F7,
- 13497: 0x83FA,
- 13498: 0x83FB,
- 13499: 0x83FC,
- 13500: 0x83FE,
- 13501: 0x83FF,
- 13502: 0x8400,
- 13503: 0x8402,
- 13504: 0x8405,
- 13505: 0x8407,
- 13506: 0x8408,
- 13507: 0x8409,
- 13508: 0x840A,
- 13509: 0x8410,
- 13510: 0x8412,
- 13511: 0x8413,
- 13512: 0x8414,
- 13513: 0x8415,
- 13514: 0x8416,
- 13515: 0x8417,
- 13516: 0x8419,
- 13517: 0x841A,
- 13518: 0x841B,
- 13519: 0x841E,
- 13520: 0x841F,
- 13521: 0x8420,
- 13522: 0x8421,
- 13523: 0x8422,
- 13524: 0x8423,
- 13525: 0x8429,
- 13526: 0x842A,
- 13527: 0x842B,
- 13528: 0x842C,
- 13529: 0x842D,
- 13530: 0x842E,
- 13531: 0x842F,
- 13532: 0x8430,
- 13533: 0x8432,
- 13534: 0x8433,
- 13535: 0x8434,
- 13536: 0x8435,
- 13537: 0x8436,
- 13538: 0x8437,
- 13539: 0x8439,
- 13540: 0x843A,
- 13541: 0x843B,
- 13542: 0x843E,
- 13543: 0x843F,
- 13544: 0x8440,
- 13545: 0x8441,
- 13546: 0x8442,
- 13547: 0x8443,
- 13548: 0x8444,
- 13549: 0x8445,
- 13550: 0x8447,
- 13551: 0x8448,
- 13552: 0x8449,
- 13553: 0x844A,
- 13554: 0x844B,
- 13555: 0x844C,
- 13556: 0x844D,
- 13557: 0x844E,
- 13558: 0x844F,
- 13559: 0x8450,
- 13560: 0x8452,
- 13561: 0x8453,
- 13562: 0x8454,
- 13563: 0x8455,
- 13564: 0x8456,
- 13565: 0x8458,
- 13566: 0x845D,
- 13567: 0x845E,
- 13568: 0x845F,
- 13569: 0x8460,
- 13570: 0x8462,
- 13571: 0x8464,
- 13572: 0x8465,
- 13573: 0x8466,
- 13574: 0x8467,
- 13575: 0x8468,
- 13576: 0x846A,
- 13577: 0x846E,
- 13578: 0x846F,
- 13579: 0x8470,
- 13580: 0x8472,
- 13581: 0x8474,
- 13582: 0x8477,
- 13583: 0x8479,
- 13584: 0x847B,
- 13585: 0x847C,
- 13586: 0x53D6,
- 13587: 0x5A36,
- 13588: 0x9F8B,
- 13589: 0x8DA3,
- 13590: 0x53BB,
- 13591: 0x5708,
- 13592: 0x98A7,
- 13593: 0x6743,
- 13594: 0x919B,
- 13595: 0x6CC9,
- 13596: 0x5168,
- 13597: 0x75CA,
- 13598: 0x62F3,
- 13599: 0x72AC,
- 13600: 0x5238,
- 13601: 0x529D,
- 13602: 0x7F3A,
- 13603: 0x7094,
- 13604: 0x7638,
- 13605: 0x5374,
- 13606: 0x9E4A,
- 13607: 0x69B7,
- 13608: 0x786E,
- 13609: 0x96C0,
- 13610: 0x88D9,
- 13611: 0x7FA4,
- 13612: 0x7136,
- 13613: 0x71C3,
- 13614: 0x5189,
- 13615: 0x67D3,
- 13616: 0x74E4,
- 13617: 0x58E4,
- 13618: 0x6518,
- 13619: 0x56B7,
- 13620: 0x8BA9,
- 13621: 0x9976,
- 13622: 0x6270,
- 13623: 0x7ED5,
- 13624: 0x60F9,
- 13625: 0x70ED,
- 13626: 0x58EC,
- 13627: 0x4EC1,
- 13628: 0x4EBA,
- 13629: 0x5FCD,
- 13630: 0x97E7,
- 13631: 0x4EFB,
- 13632: 0x8BA4,
- 13633: 0x5203,
- 13634: 0x598A,
- 13635: 0x7EAB,
- 13636: 0x6254,
- 13637: 0x4ECD,
- 13638: 0x65E5,
- 13639: 0x620E,
- 13640: 0x8338,
- 13641: 0x84C9,
- 13642: 0x8363,
- 13643: 0x878D,
- 13644: 0x7194,
- 13645: 0x6EB6,
- 13646: 0x5BB9,
- 13647: 0x7ED2,
- 13648: 0x5197,
- 13649: 0x63C9,
- 13650: 0x67D4,
- 13651: 0x8089,
- 13652: 0x8339,
- 13653: 0x8815,
- 13654: 0x5112,
- 13655: 0x5B7A,
- 13656: 0x5982,
- 13657: 0x8FB1,
- 13658: 0x4E73,
- 13659: 0x6C5D,
- 13660: 0x5165,
- 13661: 0x8925,
- 13662: 0x8F6F,
- 13663: 0x962E,
- 13664: 0x854A,
- 13665: 0x745E,
- 13666: 0x9510,
- 13667: 0x95F0,
- 13668: 0x6DA6,
- 13669: 0x82E5,
- 13670: 0x5F31,
- 13671: 0x6492,
- 13672: 0x6D12,
- 13673: 0x8428,
- 13674: 0x816E,
- 13675: 0x9CC3,
- 13676: 0x585E,
- 13677: 0x8D5B,
- 13678: 0x4E09,
- 13679: 0x53C1,
- 13680: 0x847D,
- 13681: 0x847E,
- 13682: 0x847F,
- 13683: 0x8480,
- 13684: 0x8481,
- 13685: 0x8483,
- 13686: 0x8484,
- 13687: 0x8485,
- 13688: 0x8486,
- 13689: 0x848A,
- 13690: 0x848D,
- 13691: 0x848F,
- 13692: 0x8490,
- 13693: 0x8491,
- 13694: 0x8492,
- 13695: 0x8493,
- 13696: 0x8494,
- 13697: 0x8495,
- 13698: 0x8496,
- 13699: 0x8498,
- 13700: 0x849A,
- 13701: 0x849B,
- 13702: 0x849D,
- 13703: 0x849E,
- 13704: 0x849F,
- 13705: 0x84A0,
- 13706: 0x84A2,
- 13707: 0x84A3,
- 13708: 0x84A4,
- 13709: 0x84A5,
- 13710: 0x84A6,
- 13711: 0x84A7,
- 13712: 0x84A8,
- 13713: 0x84A9,
- 13714: 0x84AA,
- 13715: 0x84AB,
- 13716: 0x84AC,
- 13717: 0x84AD,
- 13718: 0x84AE,
- 13719: 0x84B0,
- 13720: 0x84B1,
- 13721: 0x84B3,
- 13722: 0x84B5,
- 13723: 0x84B6,
- 13724: 0x84B7,
- 13725: 0x84BB,
- 13726: 0x84BC,
- 13727: 0x84BE,
- 13728: 0x84C0,
- 13729: 0x84C2,
- 13730: 0x84C3,
- 13731: 0x84C5,
- 13732: 0x84C6,
- 13733: 0x84C7,
- 13734: 0x84C8,
- 13735: 0x84CB,
- 13736: 0x84CC,
- 13737: 0x84CE,
- 13738: 0x84CF,
- 13739: 0x84D2,
- 13740: 0x84D4,
- 13741: 0x84D5,
- 13742: 0x84D7,
- 13743: 0x84D8,
- 13744: 0x84D9,
- 13745: 0x84DA,
- 13746: 0x84DB,
- 13747: 0x84DC,
- 13748: 0x84DE,
- 13749: 0x84E1,
- 13750: 0x84E2,
- 13751: 0x84E4,
- 13752: 0x84E7,
- 13753: 0x84E8,
- 13754: 0x84E9,
- 13755: 0x84EA,
- 13756: 0x84EB,
- 13757: 0x84ED,
- 13758: 0x84EE,
- 13759: 0x84EF,
- 13760: 0x84F1,
- 13761: 0x84F2,
- 13762: 0x84F3,
- 13763: 0x84F4,
- 13764: 0x84F5,
- 13765: 0x84F6,
- 13766: 0x84F7,
- 13767: 0x84F8,
- 13768: 0x84F9,
- 13769: 0x84FA,
- 13770: 0x84FB,
- 13771: 0x84FD,
- 13772: 0x84FE,
- 13773: 0x8500,
- 13774: 0x8501,
- 13775: 0x8502,
- 13776: 0x4F1E,
- 13777: 0x6563,
- 13778: 0x6851,
- 13779: 0x55D3,
- 13780: 0x4E27,
- 13781: 0x6414,
- 13782: 0x9A9A,
- 13783: 0x626B,
- 13784: 0x5AC2,
- 13785: 0x745F,
- 13786: 0x8272,
- 13787: 0x6DA9,
- 13788: 0x68EE,
- 13789: 0x50E7,
- 13790: 0x838E,
- 13791: 0x7802,
- 13792: 0x6740,
- 13793: 0x5239,
- 13794: 0x6C99,
- 13795: 0x7EB1,
- 13796: 0x50BB,
- 13797: 0x5565,
- 13798: 0x715E,
- 13799: 0x7B5B,
- 13800: 0x6652,
- 13801: 0x73CA,
- 13802: 0x82EB,
- 13803: 0x6749,
- 13804: 0x5C71,
- 13805: 0x5220,
- 13806: 0x717D,
- 13807: 0x886B,
- 13808: 0x95EA,
- 13809: 0x9655,
- 13810: 0x64C5,
- 13811: 0x8D61,
- 13812: 0x81B3,
- 13813: 0x5584,
- 13814: 0x6C55,
- 13815: 0x6247,
- 13816: 0x7F2E,
- 13817: 0x5892,
- 13818: 0x4F24,
- 13819: 0x5546,
- 13820: 0x8D4F,
- 13821: 0x664C,
- 13822: 0x4E0A,
- 13823: 0x5C1A,
- 13824: 0x88F3,
- 13825: 0x68A2,
- 13826: 0x634E,
- 13827: 0x7A0D,
- 13828: 0x70E7,
- 13829: 0x828D,
- 13830: 0x52FA,
- 13831: 0x97F6,
- 13832: 0x5C11,
- 13833: 0x54E8,
- 13834: 0x90B5,
- 13835: 0x7ECD,
- 13836: 0x5962,
- 13837: 0x8D4A,
- 13838: 0x86C7,
- 13839: 0x820C,
- 13840: 0x820D,
- 13841: 0x8D66,
- 13842: 0x6444,
- 13843: 0x5C04,
- 13844: 0x6151,
- 13845: 0x6D89,
- 13846: 0x793E,
- 13847: 0x8BBE,
- 13848: 0x7837,
- 13849: 0x7533,
- 13850: 0x547B,
- 13851: 0x4F38,
- 13852: 0x8EAB,
- 13853: 0x6DF1,
- 13854: 0x5A20,
- 13855: 0x7EC5,
- 13856: 0x795E,
- 13857: 0x6C88,
- 13858: 0x5BA1,
- 13859: 0x5A76,
- 13860: 0x751A,
- 13861: 0x80BE,
- 13862: 0x614E,
- 13863: 0x6E17,
- 13864: 0x58F0,
- 13865: 0x751F,
- 13866: 0x7525,
- 13867: 0x7272,
- 13868: 0x5347,
- 13869: 0x7EF3,
- 13870: 0x8503,
- 13871: 0x8504,
- 13872: 0x8505,
- 13873: 0x8506,
- 13874: 0x8507,
- 13875: 0x8508,
- 13876: 0x8509,
- 13877: 0x850A,
- 13878: 0x850B,
- 13879: 0x850D,
- 13880: 0x850E,
- 13881: 0x850F,
- 13882: 0x8510,
- 13883: 0x8512,
- 13884: 0x8514,
- 13885: 0x8515,
- 13886: 0x8516,
- 13887: 0x8518,
- 13888: 0x8519,
- 13889: 0x851B,
- 13890: 0x851C,
- 13891: 0x851D,
- 13892: 0x851E,
- 13893: 0x8520,
- 13894: 0x8522,
- 13895: 0x8523,
- 13896: 0x8524,
- 13897: 0x8525,
- 13898: 0x8526,
- 13899: 0x8527,
- 13900: 0x8528,
- 13901: 0x8529,
- 13902: 0x852A,
- 13903: 0x852D,
- 13904: 0x852E,
- 13905: 0x852F,
- 13906: 0x8530,
- 13907: 0x8531,
- 13908: 0x8532,
- 13909: 0x8533,
- 13910: 0x8534,
- 13911: 0x8535,
- 13912: 0x8536,
- 13913: 0x853E,
- 13914: 0x853F,
- 13915: 0x8540,
- 13916: 0x8541,
- 13917: 0x8542,
- 13918: 0x8544,
- 13919: 0x8545,
- 13920: 0x8546,
- 13921: 0x8547,
- 13922: 0x854B,
- 13923: 0x854C,
- 13924: 0x854D,
- 13925: 0x854E,
- 13926: 0x854F,
- 13927: 0x8550,
- 13928: 0x8551,
- 13929: 0x8552,
- 13930: 0x8553,
- 13931: 0x8554,
- 13932: 0x8555,
- 13933: 0x8557,
- 13934: 0x8558,
- 13935: 0x855A,
- 13936: 0x855B,
- 13937: 0x855C,
- 13938: 0x855D,
- 13939: 0x855F,
- 13940: 0x8560,
- 13941: 0x8561,
- 13942: 0x8562,
- 13943: 0x8563,
- 13944: 0x8565,
- 13945: 0x8566,
- 13946: 0x8567,
- 13947: 0x8569,
- 13948: 0x856A,
- 13949: 0x856B,
- 13950: 0x856C,
- 13951: 0x856D,
- 13952: 0x856E,
- 13953: 0x856F,
- 13954: 0x8570,
- 13955: 0x8571,
- 13956: 0x8573,
- 13957: 0x8575,
- 13958: 0x8576,
- 13959: 0x8577,
- 13960: 0x8578,
- 13961: 0x857C,
- 13962: 0x857D,
- 13963: 0x857F,
- 13964: 0x8580,
- 13965: 0x8581,
- 13966: 0x7701,
- 13967: 0x76DB,
- 13968: 0x5269,
- 13969: 0x80DC,
- 13970: 0x5723,
- 13971: 0x5E08,
- 13972: 0x5931,
- 13973: 0x72EE,
- 13974: 0x65BD,
- 13975: 0x6E7F,
- 13976: 0x8BD7,
- 13977: 0x5C38,
- 13978: 0x8671,
- 13979: 0x5341,
- 13980: 0x77F3,
- 13981: 0x62FE,
- 13982: 0x65F6,
- 13983: 0x4EC0,
- 13984: 0x98DF,
- 13985: 0x8680,
- 13986: 0x5B9E,
- 13987: 0x8BC6,
- 13988: 0x53F2,
- 13989: 0x77E2,
- 13990: 0x4F7F,
- 13991: 0x5C4E,
- 13992: 0x9A76,
- 13993: 0x59CB,
- 13994: 0x5F0F,
- 13995: 0x793A,
- 13996: 0x58EB,
- 13997: 0x4E16,
- 13998: 0x67FF,
- 13999: 0x4E8B,
- 14000: 0x62ED,
- 14001: 0x8A93,
- 14002: 0x901D,
- 14003: 0x52BF,
- 14004: 0x662F,
- 14005: 0x55DC,
- 14006: 0x566C,
- 14007: 0x9002,
- 14008: 0x4ED5,
- 14009: 0x4F8D,
- 14010: 0x91CA,
- 14011: 0x9970,
- 14012: 0x6C0F,
- 14013: 0x5E02,
- 14014: 0x6043,
- 14015: 0x5BA4,
- 14016: 0x89C6,
- 14017: 0x8BD5,
- 14018: 0x6536,
- 14019: 0x624B,
- 14020: 0x9996,
- 14021: 0x5B88,
- 14022: 0x5BFF,
- 14023: 0x6388,
- 14024: 0x552E,
- 14025: 0x53D7,
- 14026: 0x7626,
- 14027: 0x517D,
- 14028: 0x852C,
- 14029: 0x67A2,
- 14030: 0x68B3,
- 14031: 0x6B8A,
- 14032: 0x6292,
- 14033: 0x8F93,
- 14034: 0x53D4,
- 14035: 0x8212,
- 14036: 0x6DD1,
- 14037: 0x758F,
- 14038: 0x4E66,
- 14039: 0x8D4E,
- 14040: 0x5B70,
- 14041: 0x719F,
- 14042: 0x85AF,
- 14043: 0x6691,
- 14044: 0x66D9,
- 14045: 0x7F72,
- 14046: 0x8700,
- 14047: 0x9ECD,
- 14048: 0x9F20,
- 14049: 0x5C5E,
- 14050: 0x672F,
- 14051: 0x8FF0,
- 14052: 0x6811,
- 14053: 0x675F,
- 14054: 0x620D,
- 14055: 0x7AD6,
- 14056: 0x5885,
- 14057: 0x5EB6,
- 14058: 0x6570,
- 14059: 0x6F31,
- 14060: 0x8582,
- 14061: 0x8583,
- 14062: 0x8586,
- 14063: 0x8588,
- 14064: 0x8589,
- 14065: 0x858A,
- 14066: 0x858B,
- 14067: 0x858C,
- 14068: 0x858D,
- 14069: 0x858E,
- 14070: 0x8590,
- 14071: 0x8591,
- 14072: 0x8592,
- 14073: 0x8593,
- 14074: 0x8594,
- 14075: 0x8595,
- 14076: 0x8596,
- 14077: 0x8597,
- 14078: 0x8598,
- 14079: 0x8599,
- 14080: 0x859A,
- 14081: 0x859D,
- 14082: 0x859E,
- 14083: 0x859F,
- 14084: 0x85A0,
- 14085: 0x85A1,
- 14086: 0x85A2,
- 14087: 0x85A3,
- 14088: 0x85A5,
- 14089: 0x85A6,
- 14090: 0x85A7,
- 14091: 0x85A9,
- 14092: 0x85AB,
- 14093: 0x85AC,
- 14094: 0x85AD,
- 14095: 0x85B1,
- 14096: 0x85B2,
- 14097: 0x85B3,
- 14098: 0x85B4,
- 14099: 0x85B5,
- 14100: 0x85B6,
- 14101: 0x85B8,
- 14102: 0x85BA,
- 14103: 0x85BB,
- 14104: 0x85BC,
- 14105: 0x85BD,
- 14106: 0x85BE,
- 14107: 0x85BF,
- 14108: 0x85C0,
- 14109: 0x85C2,
- 14110: 0x85C3,
- 14111: 0x85C4,
- 14112: 0x85C5,
- 14113: 0x85C6,
- 14114: 0x85C7,
- 14115: 0x85C8,
- 14116: 0x85CA,
- 14117: 0x85CB,
- 14118: 0x85CC,
- 14119: 0x85CD,
- 14120: 0x85CE,
- 14121: 0x85D1,
- 14122: 0x85D2,
- 14123: 0x85D4,
- 14124: 0x85D6,
- 14125: 0x85D7,
- 14126: 0x85D8,
- 14127: 0x85D9,
- 14128: 0x85DA,
- 14129: 0x85DB,
- 14130: 0x85DD,
- 14131: 0x85DE,
- 14132: 0x85DF,
- 14133: 0x85E0,
- 14134: 0x85E1,
- 14135: 0x85E2,
- 14136: 0x85E3,
- 14137: 0x85E5,
- 14138: 0x85E6,
- 14139: 0x85E7,
- 14140: 0x85E8,
- 14141: 0x85EA,
- 14142: 0x85EB,
- 14143: 0x85EC,
- 14144: 0x85ED,
- 14145: 0x85EE,
- 14146: 0x85EF,
- 14147: 0x85F0,
- 14148: 0x85F1,
- 14149: 0x85F2,
- 14150: 0x85F3,
- 14151: 0x85F4,
- 14152: 0x85F5,
- 14153: 0x85F6,
- 14154: 0x85F7,
- 14155: 0x85F8,
- 14156: 0x6055,
- 14157: 0x5237,
- 14158: 0x800D,
- 14159: 0x6454,
- 14160: 0x8870,
- 14161: 0x7529,
- 14162: 0x5E05,
- 14163: 0x6813,
- 14164: 0x62F4,
- 14165: 0x971C,
- 14166: 0x53CC,
- 14167: 0x723D,
- 14168: 0x8C01,
- 14169: 0x6C34,
- 14170: 0x7761,
- 14171: 0x7A0E,
- 14172: 0x542E,
- 14173: 0x77AC,
- 14174: 0x987A,
- 14175: 0x821C,
- 14176: 0x8BF4,
- 14177: 0x7855,
- 14178: 0x6714,
- 14179: 0x70C1,
- 14180: 0x65AF,
- 14181: 0x6495,
- 14182: 0x5636,
- 14183: 0x601D,
- 14184: 0x79C1,
- 14185: 0x53F8,
- 14186: 0x4E1D,
- 14187: 0x6B7B,
- 14188: 0x8086,
- 14189: 0x5BFA,
- 14190: 0x55E3,
- 14191: 0x56DB,
- 14192: 0x4F3A,
- 14193: 0x4F3C,
- 14194: 0x9972,
- 14195: 0x5DF3,
- 14196: 0x677E,
- 14197: 0x8038,
- 14198: 0x6002,
- 14199: 0x9882,
- 14200: 0x9001,
- 14201: 0x5B8B,
- 14202: 0x8BBC,
- 14203: 0x8BF5,
- 14204: 0x641C,
- 14205: 0x8258,
- 14206: 0x64DE,
- 14207: 0x55FD,
- 14208: 0x82CF,
- 14209: 0x9165,
- 14210: 0x4FD7,
- 14211: 0x7D20,
- 14212: 0x901F,
- 14213: 0x7C9F,
- 14214: 0x50F3,
- 14215: 0x5851,
- 14216: 0x6EAF,
- 14217: 0x5BBF,
- 14218: 0x8BC9,
- 14219: 0x8083,
- 14220: 0x9178,
- 14221: 0x849C,
- 14222: 0x7B97,
- 14223: 0x867D,
- 14224: 0x968B,
- 14225: 0x968F,
- 14226: 0x7EE5,
- 14227: 0x9AD3,
- 14228: 0x788E,
- 14229: 0x5C81,
- 14230: 0x7A57,
- 14231: 0x9042,
- 14232: 0x96A7,
- 14233: 0x795F,
- 14234: 0x5B59,
- 14235: 0x635F,
- 14236: 0x7B0B,
- 14237: 0x84D1,
- 14238: 0x68AD,
- 14239: 0x5506,
- 14240: 0x7F29,
- 14241: 0x7410,
- 14242: 0x7D22,
- 14243: 0x9501,
- 14244: 0x6240,
- 14245: 0x584C,
- 14246: 0x4ED6,
- 14247: 0x5B83,
- 14248: 0x5979,
- 14249: 0x5854,
- 14250: 0x85F9,
- 14251: 0x85FA,
- 14252: 0x85FC,
- 14253: 0x85FD,
- 14254: 0x85FE,
- 14255: 0x8600,
- 14256: 0x8601,
- 14257: 0x8602,
- 14258: 0x8603,
- 14259: 0x8604,
- 14260: 0x8606,
- 14261: 0x8607,
- 14262: 0x8608,
- 14263: 0x8609,
- 14264: 0x860A,
- 14265: 0x860B,
- 14266: 0x860C,
- 14267: 0x860D,
- 14268: 0x860E,
- 14269: 0x860F,
- 14270: 0x8610,
- 14271: 0x8612,
- 14272: 0x8613,
- 14273: 0x8614,
- 14274: 0x8615,
- 14275: 0x8617,
- 14276: 0x8618,
- 14277: 0x8619,
- 14278: 0x861A,
- 14279: 0x861B,
- 14280: 0x861C,
- 14281: 0x861D,
- 14282: 0x861E,
- 14283: 0x861F,
- 14284: 0x8620,
- 14285: 0x8621,
- 14286: 0x8622,
- 14287: 0x8623,
- 14288: 0x8624,
- 14289: 0x8625,
- 14290: 0x8626,
- 14291: 0x8628,
- 14292: 0x862A,
- 14293: 0x862B,
- 14294: 0x862C,
- 14295: 0x862D,
- 14296: 0x862E,
- 14297: 0x862F,
- 14298: 0x8630,
- 14299: 0x8631,
- 14300: 0x8632,
- 14301: 0x8633,
- 14302: 0x8634,
- 14303: 0x8635,
- 14304: 0x8636,
- 14305: 0x8637,
- 14306: 0x8639,
- 14307: 0x863A,
- 14308: 0x863B,
- 14309: 0x863D,
- 14310: 0x863E,
- 14311: 0x863F,
- 14312: 0x8640,
- 14313: 0x8641,
- 14314: 0x8642,
- 14315: 0x8643,
- 14316: 0x8644,
- 14317: 0x8645,
- 14318: 0x8646,
- 14319: 0x8647,
- 14320: 0x8648,
- 14321: 0x8649,
- 14322: 0x864A,
- 14323: 0x864B,
- 14324: 0x864C,
- 14325: 0x8652,
- 14326: 0x8653,
- 14327: 0x8655,
- 14328: 0x8656,
- 14329: 0x8657,
- 14330: 0x8658,
- 14331: 0x8659,
- 14332: 0x865B,
- 14333: 0x865C,
- 14334: 0x865D,
- 14335: 0x865F,
- 14336: 0x8660,
- 14337: 0x8661,
- 14338: 0x8663,
- 14339: 0x8664,
- 14340: 0x8665,
- 14341: 0x8666,
- 14342: 0x8667,
- 14343: 0x8668,
- 14344: 0x8669,
- 14345: 0x866A,
- 14346: 0x736D,
- 14347: 0x631E,
- 14348: 0x8E4B,
- 14349: 0x8E0F,
- 14350: 0x80CE,
- 14351: 0x82D4,
- 14352: 0x62AC,
- 14353: 0x53F0,
- 14354: 0x6CF0,
- 14355: 0x915E,
- 14356: 0x592A,
- 14357: 0x6001,
- 14358: 0x6C70,
- 14359: 0x574D,
- 14360: 0x644A,
- 14361: 0x8D2A,
- 14362: 0x762B,
- 14363: 0x6EE9,
- 14364: 0x575B,
- 14365: 0x6A80,
- 14366: 0x75F0,
- 14367: 0x6F6D,
- 14368: 0x8C2D,
- 14369: 0x8C08,
- 14370: 0x5766,
- 14371: 0x6BEF,
- 14372: 0x8892,
- 14373: 0x78B3,
- 14374: 0x63A2,
- 14375: 0x53F9,
- 14376: 0x70AD,
- 14377: 0x6C64,
- 14378: 0x5858,
- 14379: 0x642A,
- 14380: 0x5802,
- 14381: 0x68E0,
- 14382: 0x819B,
- 14383: 0x5510,
- 14384: 0x7CD6,
- 14385: 0x5018,
- 14386: 0x8EBA,
- 14387: 0x6DCC,
- 14388: 0x8D9F,
- 14389: 0x70EB,
- 14390: 0x638F,
- 14391: 0x6D9B,
- 14392: 0x6ED4,
- 14393: 0x7EE6,
- 14394: 0x8404,
- 14395: 0x6843,
- 14396: 0x9003,
- 14397: 0x6DD8,
- 14398: 0x9676,
- 14399: 0x8BA8,
- 14400: 0x5957,
- 14401: 0x7279,
- 14402: 0x85E4,
- 14403: 0x817E,
- 14404: 0x75BC,
- 14405: 0x8A8A,
- 14406: 0x68AF,
- 14407: 0x5254,
- 14408: 0x8E22,
- 14409: 0x9511,
- 14410: 0x63D0,
- 14411: 0x9898,
- 14412: 0x8E44,
- 14413: 0x557C,
- 14414: 0x4F53,
- 14415: 0x66FF,
- 14416: 0x568F,
- 14417: 0x60D5,
- 14418: 0x6D95,
- 14419: 0x5243,
- 14420: 0x5C49,
- 14421: 0x5929,
- 14422: 0x6DFB,
- 14423: 0x586B,
- 14424: 0x7530,
- 14425: 0x751C,
- 14426: 0x606C,
- 14427: 0x8214,
- 14428: 0x8146,
- 14429: 0x6311,
- 14430: 0x6761,
- 14431: 0x8FE2,
- 14432: 0x773A,
- 14433: 0x8DF3,
- 14434: 0x8D34,
- 14435: 0x94C1,
- 14436: 0x5E16,
- 14437: 0x5385,
- 14438: 0x542C,
- 14439: 0x70C3,
- 14440: 0x866D,
- 14441: 0x866F,
- 14442: 0x8670,
- 14443: 0x8672,
- 14444: 0x8673,
- 14445: 0x8674,
- 14446: 0x8675,
- 14447: 0x8676,
- 14448: 0x8677,
- 14449: 0x8678,
- 14450: 0x8683,
- 14451: 0x8684,
- 14452: 0x8685,
- 14453: 0x8686,
- 14454: 0x8687,
- 14455: 0x8688,
- 14456: 0x8689,
- 14457: 0x868E,
- 14458: 0x868F,
- 14459: 0x8690,
- 14460: 0x8691,
- 14461: 0x8692,
- 14462: 0x8694,
- 14463: 0x8696,
- 14464: 0x8697,
- 14465: 0x8698,
- 14466: 0x8699,
- 14467: 0x869A,
- 14468: 0x869B,
- 14469: 0x869E,
- 14470: 0x869F,
- 14471: 0x86A0,
- 14472: 0x86A1,
- 14473: 0x86A2,
- 14474: 0x86A5,
- 14475: 0x86A6,
- 14476: 0x86AB,
- 14477: 0x86AD,
- 14478: 0x86AE,
- 14479: 0x86B2,
- 14480: 0x86B3,
- 14481: 0x86B7,
- 14482: 0x86B8,
- 14483: 0x86B9,
- 14484: 0x86BB,
- 14485: 0x86BC,
- 14486: 0x86BD,
- 14487: 0x86BE,
- 14488: 0x86BF,
- 14489: 0x86C1,
- 14490: 0x86C2,
- 14491: 0x86C3,
- 14492: 0x86C5,
- 14493: 0x86C8,
- 14494: 0x86CC,
- 14495: 0x86CD,
- 14496: 0x86D2,
- 14497: 0x86D3,
- 14498: 0x86D5,
- 14499: 0x86D6,
- 14500: 0x86D7,
- 14501: 0x86DA,
- 14502: 0x86DC,
- 14503: 0x86DD,
- 14504: 0x86E0,
- 14505: 0x86E1,
- 14506: 0x86E2,
- 14507: 0x86E3,
- 14508: 0x86E5,
- 14509: 0x86E6,
- 14510: 0x86E7,
- 14511: 0x86E8,
- 14512: 0x86EA,
- 14513: 0x86EB,
- 14514: 0x86EC,
- 14515: 0x86EF,
- 14516: 0x86F5,
- 14517: 0x86F6,
- 14518: 0x86F7,
- 14519: 0x86FA,
- 14520: 0x86FB,
- 14521: 0x86FC,
- 14522: 0x86FD,
- 14523: 0x86FF,
- 14524: 0x8701,
- 14525: 0x8704,
- 14526: 0x8705,
- 14527: 0x8706,
- 14528: 0x870B,
- 14529: 0x870C,
- 14530: 0x870E,
- 14531: 0x870F,
- 14532: 0x8710,
- 14533: 0x8711,
- 14534: 0x8714,
- 14535: 0x8716,
- 14536: 0x6C40,
- 14537: 0x5EF7,
- 14538: 0x505C,
- 14539: 0x4EAD,
- 14540: 0x5EAD,
- 14541: 0x633A,
- 14542: 0x8247,
- 14543: 0x901A,
- 14544: 0x6850,
- 14545: 0x916E,
- 14546: 0x77B3,
- 14547: 0x540C,
- 14548: 0x94DC,
- 14549: 0x5F64,
- 14550: 0x7AE5,
- 14551: 0x6876,
- 14552: 0x6345,
- 14553: 0x7B52,
- 14554: 0x7EDF,
- 14555: 0x75DB,
- 14556: 0x5077,
- 14557: 0x6295,
- 14558: 0x5934,
- 14559: 0x900F,
- 14560: 0x51F8,
- 14561: 0x79C3,
- 14562: 0x7A81,
- 14563: 0x56FE,
- 14564: 0x5F92,
- 14565: 0x9014,
- 14566: 0x6D82,
- 14567: 0x5C60,
- 14568: 0x571F,
- 14569: 0x5410,
- 14570: 0x5154,
- 14571: 0x6E4D,
- 14572: 0x56E2,
- 14573: 0x63A8,
- 14574: 0x9893,
- 14575: 0x817F,
- 14576: 0x8715,
- 14577: 0x892A,
- 14578: 0x9000,
- 14579: 0x541E,
- 14580: 0x5C6F,
- 14581: 0x81C0,
- 14582: 0x62D6,
- 14583: 0x6258,
- 14584: 0x8131,
- 14585: 0x9E35,
- 14586: 0x9640,
- 14587: 0x9A6E,
- 14588: 0x9A7C,
- 14589: 0x692D,
- 14590: 0x59A5,
- 14591: 0x62D3,
- 14592: 0x553E,
- 14593: 0x6316,
- 14594: 0x54C7,
- 14595: 0x86D9,
- 14596: 0x6D3C,
- 14597: 0x5A03,
- 14598: 0x74E6,
- 14599: 0x889C,
- 14600: 0x6B6A,
- 14601: 0x5916,
- 14602: 0x8C4C,
- 14603: 0x5F2F,
- 14604: 0x6E7E,
- 14605: 0x73A9,
- 14606: 0x987D,
- 14607: 0x4E38,
- 14608: 0x70F7,
- 14609: 0x5B8C,
- 14610: 0x7897,
- 14611: 0x633D,
- 14612: 0x665A,
- 14613: 0x7696,
- 14614: 0x60CB,
- 14615: 0x5B9B,
- 14616: 0x5A49,
- 14617: 0x4E07,
- 14618: 0x8155,
- 14619: 0x6C6A,
- 14620: 0x738B,
- 14621: 0x4EA1,
- 14622: 0x6789,
- 14623: 0x7F51,
- 14624: 0x5F80,
- 14625: 0x65FA,
- 14626: 0x671B,
- 14627: 0x5FD8,
- 14628: 0x5984,
- 14629: 0x5A01,
- 14630: 0x8719,
- 14631: 0x871B,
- 14632: 0x871D,
- 14633: 0x871F,
- 14634: 0x8720,
- 14635: 0x8724,
- 14636: 0x8726,
- 14637: 0x8727,
- 14638: 0x8728,
- 14639: 0x872A,
- 14640: 0x872B,
- 14641: 0x872C,
- 14642: 0x872D,
- 14643: 0x872F,
- 14644: 0x8730,
- 14645: 0x8732,
- 14646: 0x8733,
- 14647: 0x8735,
- 14648: 0x8736,
- 14649: 0x8738,
- 14650: 0x8739,
- 14651: 0x873A,
- 14652: 0x873C,
- 14653: 0x873D,
- 14654: 0x8740,
- 14655: 0x8741,
- 14656: 0x8742,
- 14657: 0x8743,
- 14658: 0x8744,
- 14659: 0x8745,
- 14660: 0x8746,
- 14661: 0x874A,
- 14662: 0x874B,
- 14663: 0x874D,
- 14664: 0x874F,
- 14665: 0x8750,
- 14666: 0x8751,
- 14667: 0x8752,
- 14668: 0x8754,
- 14669: 0x8755,
- 14670: 0x8756,
- 14671: 0x8758,
- 14672: 0x875A,
- 14673: 0x875B,
- 14674: 0x875C,
- 14675: 0x875D,
- 14676: 0x875E,
- 14677: 0x875F,
- 14678: 0x8761,
- 14679: 0x8762,
- 14680: 0x8766,
- 14681: 0x8767,
- 14682: 0x8768,
- 14683: 0x8769,
- 14684: 0x876A,
- 14685: 0x876B,
- 14686: 0x876C,
- 14687: 0x876D,
- 14688: 0x876F,
- 14689: 0x8771,
- 14690: 0x8772,
- 14691: 0x8773,
- 14692: 0x8775,
- 14693: 0x8777,
- 14694: 0x8778,
- 14695: 0x8779,
- 14696: 0x877A,
- 14697: 0x877F,
- 14698: 0x8780,
- 14699: 0x8781,
- 14700: 0x8784,
- 14701: 0x8786,
- 14702: 0x8787,
- 14703: 0x8789,
- 14704: 0x878A,
- 14705: 0x878C,
- 14706: 0x878E,
- 14707: 0x878F,
- 14708: 0x8790,
- 14709: 0x8791,
- 14710: 0x8792,
- 14711: 0x8794,
- 14712: 0x8795,
- 14713: 0x8796,
- 14714: 0x8798,
- 14715: 0x8799,
- 14716: 0x879A,
- 14717: 0x879B,
- 14718: 0x879C,
- 14719: 0x879D,
- 14720: 0x879E,
- 14721: 0x87A0,
- 14722: 0x87A1,
- 14723: 0x87A2,
- 14724: 0x87A3,
- 14725: 0x87A4,
- 14726: 0x5DCD,
- 14727: 0x5FAE,
- 14728: 0x5371,
- 14729: 0x97E6,
- 14730: 0x8FDD,
- 14731: 0x6845,
- 14732: 0x56F4,
- 14733: 0x552F,
- 14734: 0x60DF,
- 14735: 0x4E3A,
- 14736: 0x6F4D,
- 14737: 0x7EF4,
- 14738: 0x82C7,
- 14739: 0x840E,
- 14740: 0x59D4,
- 14741: 0x4F1F,
- 14742: 0x4F2A,
- 14743: 0x5C3E,
- 14744: 0x7EAC,
- 14745: 0x672A,
- 14746: 0x851A,
- 14747: 0x5473,
- 14748: 0x754F,
- 14749: 0x80C3,
- 14750: 0x5582,
- 14751: 0x9B4F,
- 14752: 0x4F4D,
- 14753: 0x6E2D,
- 14754: 0x8C13,
- 14755: 0x5C09,
- 14756: 0x6170,
- 14757: 0x536B,
- 14758: 0x761F,
- 14759: 0x6E29,
- 14760: 0x868A,
- 14761: 0x6587,
- 14762: 0x95FB,
- 14763: 0x7EB9,
- 14764: 0x543B,
- 14765: 0x7A33,
- 14766: 0x7D0A,
- 14767: 0x95EE,
- 14768: 0x55E1,
- 14769: 0x7FC1,
- 14770: 0x74EE,
- 14771: 0x631D,
- 14772: 0x8717,
- 14773: 0x6DA1,
- 14774: 0x7A9D,
- 14775: 0x6211,
- 14776: 0x65A1,
- 14777: 0x5367,
- 14778: 0x63E1,
- 14779: 0x6C83,
- 14780: 0x5DEB,
- 14781: 0x545C,
- 14782: 0x94A8,
- 14783: 0x4E4C,
- 14784: 0x6C61,
- 14785: 0x8BEC,
- 14786: 0x5C4B,
- 14787: 0x65E0,
- 14788: 0x829C,
- 14789: 0x68A7,
- 14790: 0x543E,
- 14791: 0x5434,
- 14792: 0x6BCB,
- 14793: 0x6B66,
- 14794: 0x4E94,
- 14795: 0x6342,
- 14796: 0x5348,
- 14797: 0x821E,
- 14798: 0x4F0D,
- 14799: 0x4FAE,
- 14800: 0x575E,
- 14801: 0x620A,
- 14802: 0x96FE,
- 14803: 0x6664,
- 14804: 0x7269,
- 14805: 0x52FF,
- 14806: 0x52A1,
- 14807: 0x609F,
- 14808: 0x8BEF,
- 14809: 0x6614,
- 14810: 0x7199,
- 14811: 0x6790,
- 14812: 0x897F,
- 14813: 0x7852,
- 14814: 0x77FD,
- 14815: 0x6670,
- 14816: 0x563B,
- 14817: 0x5438,
- 14818: 0x9521,
- 14819: 0x727A,
- 14820: 0x87A5,
- 14821: 0x87A6,
- 14822: 0x87A7,
- 14823: 0x87A9,
- 14824: 0x87AA,
- 14825: 0x87AE,
- 14826: 0x87B0,
- 14827: 0x87B1,
- 14828: 0x87B2,
- 14829: 0x87B4,
- 14830: 0x87B6,
- 14831: 0x87B7,
- 14832: 0x87B8,
- 14833: 0x87B9,
- 14834: 0x87BB,
- 14835: 0x87BC,
- 14836: 0x87BE,
- 14837: 0x87BF,
- 14838: 0x87C1,
- 14839: 0x87C2,
- 14840: 0x87C3,
- 14841: 0x87C4,
- 14842: 0x87C5,
- 14843: 0x87C7,
- 14844: 0x87C8,
- 14845: 0x87C9,
- 14846: 0x87CC,
- 14847: 0x87CD,
- 14848: 0x87CE,
- 14849: 0x87CF,
- 14850: 0x87D0,
- 14851: 0x87D4,
- 14852: 0x87D5,
- 14853: 0x87D6,
- 14854: 0x87D7,
- 14855: 0x87D8,
- 14856: 0x87D9,
- 14857: 0x87DA,
- 14858: 0x87DC,
- 14859: 0x87DD,
- 14860: 0x87DE,
- 14861: 0x87DF,
- 14862: 0x87E1,
- 14863: 0x87E2,
- 14864: 0x87E3,
- 14865: 0x87E4,
- 14866: 0x87E6,
- 14867: 0x87E7,
- 14868: 0x87E8,
- 14869: 0x87E9,
- 14870: 0x87EB,
- 14871: 0x87EC,
- 14872: 0x87ED,
- 14873: 0x87EF,
- 14874: 0x87F0,
- 14875: 0x87F1,
- 14876: 0x87F2,
- 14877: 0x87F3,
- 14878: 0x87F4,
- 14879: 0x87F5,
- 14880: 0x87F6,
- 14881: 0x87F7,
- 14882: 0x87F8,
- 14883: 0x87FA,
- 14884: 0x87FB,
- 14885: 0x87FC,
- 14886: 0x87FD,
- 14887: 0x87FF,
- 14888: 0x8800,
- 14889: 0x8801,
- 14890: 0x8802,
- 14891: 0x8804,
- 14892: 0x8805,
- 14893: 0x8806,
- 14894: 0x8807,
- 14895: 0x8808,
- 14896: 0x8809,
- 14897: 0x880B,
- 14898: 0x880C,
- 14899: 0x880D,
- 14900: 0x880E,
- 14901: 0x880F,
- 14902: 0x8810,
- 14903: 0x8811,
- 14904: 0x8812,
- 14905: 0x8814,
- 14906: 0x8817,
- 14907: 0x8818,
- 14908: 0x8819,
- 14909: 0x881A,
- 14910: 0x881C,
- 14911: 0x881D,
- 14912: 0x881E,
- 14913: 0x881F,
- 14914: 0x8820,
- 14915: 0x8823,
- 14916: 0x7A00,
- 14917: 0x606F,
- 14918: 0x5E0C,
- 14919: 0x6089,
- 14920: 0x819D,
- 14921: 0x5915,
- 14922: 0x60DC,
- 14923: 0x7184,
- 14924: 0x70EF,
- 14925: 0x6EAA,
- 14926: 0x6C50,
- 14927: 0x7280,
- 14928: 0x6A84,
- 14929: 0x88AD,
- 14930: 0x5E2D,
- 14931: 0x4E60,
- 14932: 0x5AB3,
- 14933: 0x559C,
- 14934: 0x94E3,
- 14935: 0x6D17,
- 14936: 0x7CFB,
- 14937: 0x9699,
- 14938: 0x620F,
- 14939: 0x7EC6,
- 14940: 0x778E,
- 14941: 0x867E,
- 14942: 0x5323,
- 14943: 0x971E,
- 14944: 0x8F96,
- 14945: 0x6687,
- 14946: 0x5CE1,
- 14947: 0x4FA0,
- 14948: 0x72ED,
- 14949: 0x4E0B,
- 14950: 0x53A6,
- 14951: 0x590F,
- 14952: 0x5413,
- 14953: 0x6380,
- 14954: 0x9528,
- 14955: 0x5148,
- 14956: 0x4ED9,
- 14957: 0x9C9C,
- 14958: 0x7EA4,
- 14959: 0x54B8,
- 14960: 0x8D24,
- 14961: 0x8854,
- 14962: 0x8237,
- 14963: 0x95F2,
- 14964: 0x6D8E,
- 14965: 0x5F26,
- 14966: 0x5ACC,
- 14967: 0x663E,
- 14968: 0x9669,
- 14969: 0x73B0,
- 14970: 0x732E,
- 14971: 0x53BF,
- 14972: 0x817A,
- 14973: 0x9985,
- 14974: 0x7FA1,
- 14975: 0x5BAA,
- 14976: 0x9677,
- 14977: 0x9650,
- 14978: 0x7EBF,
- 14979: 0x76F8,
- 14980: 0x53A2,
- 14981: 0x9576,
- 14982: 0x9999,
- 14983: 0x7BB1,
- 14984: 0x8944,
- 14985: 0x6E58,
- 14986: 0x4E61,
- 14987: 0x7FD4,
- 14988: 0x7965,
- 14989: 0x8BE6,
- 14990: 0x60F3,
- 14991: 0x54CD,
- 14992: 0x4EAB,
- 14993: 0x9879,
- 14994: 0x5DF7,
- 14995: 0x6A61,
- 14996: 0x50CF,
- 14997: 0x5411,
- 14998: 0x8C61,
- 14999: 0x8427,
- 15000: 0x785D,
- 15001: 0x9704,
- 15002: 0x524A,
- 15003: 0x54EE,
- 15004: 0x56A3,
- 15005: 0x9500,
- 15006: 0x6D88,
- 15007: 0x5BB5,
- 15008: 0x6DC6,
- 15009: 0x6653,
- 15010: 0x8824,
- 15011: 0x8825,
- 15012: 0x8826,
- 15013: 0x8827,
- 15014: 0x8828,
- 15015: 0x8829,
- 15016: 0x882A,
- 15017: 0x882B,
- 15018: 0x882C,
- 15019: 0x882D,
- 15020: 0x882E,
- 15021: 0x882F,
- 15022: 0x8830,
- 15023: 0x8831,
- 15024: 0x8833,
- 15025: 0x8834,
- 15026: 0x8835,
- 15027: 0x8836,
- 15028: 0x8837,
- 15029: 0x8838,
- 15030: 0x883A,
- 15031: 0x883B,
- 15032: 0x883D,
- 15033: 0x883E,
- 15034: 0x883F,
- 15035: 0x8841,
- 15036: 0x8842,
- 15037: 0x8843,
- 15038: 0x8846,
- 15039: 0x8847,
- 15040: 0x8848,
- 15041: 0x8849,
- 15042: 0x884A,
- 15043: 0x884B,
- 15044: 0x884E,
- 15045: 0x884F,
- 15046: 0x8850,
- 15047: 0x8851,
- 15048: 0x8852,
- 15049: 0x8853,
- 15050: 0x8855,
- 15051: 0x8856,
- 15052: 0x8858,
- 15053: 0x885A,
- 15054: 0x885B,
- 15055: 0x885C,
- 15056: 0x885D,
- 15057: 0x885E,
- 15058: 0x885F,
- 15059: 0x8860,
- 15060: 0x8866,
- 15061: 0x8867,
- 15062: 0x886A,
- 15063: 0x886D,
- 15064: 0x886F,
- 15065: 0x8871,
- 15066: 0x8873,
- 15067: 0x8874,
- 15068: 0x8875,
- 15069: 0x8876,
- 15070: 0x8878,
- 15071: 0x8879,
- 15072: 0x887A,
- 15073: 0x887B,
- 15074: 0x887C,
- 15075: 0x8880,
- 15076: 0x8883,
- 15077: 0x8886,
- 15078: 0x8887,
- 15079: 0x8889,
- 15080: 0x888A,
- 15081: 0x888C,
- 15082: 0x888E,
- 15083: 0x888F,
- 15084: 0x8890,
- 15085: 0x8891,
- 15086: 0x8893,
- 15087: 0x8894,
- 15088: 0x8895,
- 15089: 0x8897,
- 15090: 0x8898,
- 15091: 0x8899,
- 15092: 0x889A,
- 15093: 0x889B,
- 15094: 0x889D,
- 15095: 0x889E,
- 15096: 0x889F,
- 15097: 0x88A0,
- 15098: 0x88A1,
- 15099: 0x88A3,
- 15100: 0x88A5,
- 15101: 0x88A6,
- 15102: 0x88A7,
- 15103: 0x88A8,
- 15104: 0x88A9,
- 15105: 0x88AA,
- 15106: 0x5C0F,
- 15107: 0x5B5D,
- 15108: 0x6821,
- 15109: 0x8096,
- 15110: 0x5578,
- 15111: 0x7B11,
- 15112: 0x6548,
- 15113: 0x6954,
- 15114: 0x4E9B,
- 15115: 0x6B47,
- 15116: 0x874E,
- 15117: 0x978B,
- 15118: 0x534F,
- 15119: 0x631F,
- 15120: 0x643A,
- 15121: 0x90AA,
- 15122: 0x659C,
- 15123: 0x80C1,
- 15124: 0x8C10,
- 15125: 0x5199,
- 15126: 0x68B0,
- 15127: 0x5378,
- 15128: 0x87F9,
- 15129: 0x61C8,
- 15130: 0x6CC4,
- 15131: 0x6CFB,
- 15132: 0x8C22,
- 15133: 0x5C51,
- 15134: 0x85AA,
- 15135: 0x82AF,
- 15136: 0x950C,
- 15137: 0x6B23,
- 15138: 0x8F9B,
- 15139: 0x65B0,
- 15140: 0x5FFB,
- 15141: 0x5FC3,
- 15142: 0x4FE1,
- 15143: 0x8845,
- 15144: 0x661F,
- 15145: 0x8165,
- 15146: 0x7329,
- 15147: 0x60FA,
- 15148: 0x5174,
- 15149: 0x5211,
- 15150: 0x578B,
- 15151: 0x5F62,
- 15152: 0x90A2,
- 15153: 0x884C,
- 15154: 0x9192,
- 15155: 0x5E78,
- 15156: 0x674F,
- 15157: 0x6027,
- 15158: 0x59D3,
- 15159: 0x5144,
- 15160: 0x51F6,
- 15161: 0x80F8,
- 15162: 0x5308,
- 15163: 0x6C79,
- 15164: 0x96C4,
- 15165: 0x718A,
- 15166: 0x4F11,
- 15167: 0x4FEE,
- 15168: 0x7F9E,
- 15169: 0x673D,
- 15170: 0x55C5,
- 15171: 0x9508,
- 15172: 0x79C0,
- 15173: 0x8896,
- 15174: 0x7EE3,
- 15175: 0x589F,
- 15176: 0x620C,
- 15177: 0x9700,
- 15178: 0x865A,
- 15179: 0x5618,
- 15180: 0x987B,
- 15181: 0x5F90,
- 15182: 0x8BB8,
- 15183: 0x84C4,
- 15184: 0x9157,
- 15185: 0x53D9,
- 15186: 0x65ED,
- 15187: 0x5E8F,
- 15188: 0x755C,
- 15189: 0x6064,
- 15190: 0x7D6E,
- 15191: 0x5A7F,
- 15192: 0x7EEA,
- 15193: 0x7EED,
- 15194: 0x8F69,
- 15195: 0x55A7,
- 15196: 0x5BA3,
- 15197: 0x60AC,
- 15198: 0x65CB,
- 15199: 0x7384,
- 15200: 0x88AC,
- 15201: 0x88AE,
- 15202: 0x88AF,
- 15203: 0x88B0,
- 15204: 0x88B2,
- 15205: 0x88B3,
- 15206: 0x88B4,
- 15207: 0x88B5,
- 15208: 0x88B6,
- 15209: 0x88B8,
- 15210: 0x88B9,
- 15211: 0x88BA,
- 15212: 0x88BB,
- 15213: 0x88BD,
- 15214: 0x88BE,
- 15215: 0x88BF,
- 15216: 0x88C0,
- 15217: 0x88C3,
- 15218: 0x88C4,
- 15219: 0x88C7,
- 15220: 0x88C8,
- 15221: 0x88CA,
- 15222: 0x88CB,
- 15223: 0x88CC,
- 15224: 0x88CD,
- 15225: 0x88CF,
- 15226: 0x88D0,
- 15227: 0x88D1,
- 15228: 0x88D3,
- 15229: 0x88D6,
- 15230: 0x88D7,
- 15231: 0x88DA,
- 15232: 0x88DB,
- 15233: 0x88DC,
- 15234: 0x88DD,
- 15235: 0x88DE,
- 15236: 0x88E0,
- 15237: 0x88E1,
- 15238: 0x88E6,
- 15239: 0x88E7,
- 15240: 0x88E9,
- 15241: 0x88EA,
- 15242: 0x88EB,
- 15243: 0x88EC,
- 15244: 0x88ED,
- 15245: 0x88EE,
- 15246: 0x88EF,
- 15247: 0x88F2,
- 15248: 0x88F5,
- 15249: 0x88F6,
- 15250: 0x88F7,
- 15251: 0x88FA,
- 15252: 0x88FB,
- 15253: 0x88FD,
- 15254: 0x88FF,
- 15255: 0x8900,
- 15256: 0x8901,
- 15257: 0x8903,
- 15258: 0x8904,
- 15259: 0x8905,
- 15260: 0x8906,
- 15261: 0x8907,
- 15262: 0x8908,
- 15263: 0x8909,
- 15264: 0x890B,
- 15265: 0x890C,
- 15266: 0x890D,
- 15267: 0x890E,
- 15268: 0x890F,
- 15269: 0x8911,
- 15270: 0x8914,
- 15271: 0x8915,
- 15272: 0x8916,
- 15273: 0x8917,
- 15274: 0x8918,
- 15275: 0x891C,
- 15276: 0x891D,
- 15277: 0x891E,
- 15278: 0x891F,
- 15279: 0x8920,
- 15280: 0x8922,
- 15281: 0x8923,
- 15282: 0x8924,
- 15283: 0x8926,
- 15284: 0x8927,
- 15285: 0x8928,
- 15286: 0x8929,
- 15287: 0x892C,
- 15288: 0x892D,
- 15289: 0x892E,
- 15290: 0x892F,
- 15291: 0x8931,
- 15292: 0x8932,
- 15293: 0x8933,
- 15294: 0x8935,
- 15295: 0x8937,
- 15296: 0x9009,
- 15297: 0x7663,
- 15298: 0x7729,
- 15299: 0x7EDA,
- 15300: 0x9774,
- 15301: 0x859B,
- 15302: 0x5B66,
- 15303: 0x7A74,
- 15304: 0x96EA,
- 15305: 0x8840,
- 15306: 0x52CB,
- 15307: 0x718F,
- 15308: 0x5FAA,
- 15309: 0x65EC,
- 15310: 0x8BE2,
- 15311: 0x5BFB,
- 15312: 0x9A6F,
- 15313: 0x5DE1,
- 15314: 0x6B89,
- 15315: 0x6C5B,
- 15316: 0x8BAD,
- 15317: 0x8BAF,
- 15318: 0x900A,
- 15319: 0x8FC5,
- 15320: 0x538B,
- 15321: 0x62BC,
- 15322: 0x9E26,
- 15323: 0x9E2D,
- 15324: 0x5440,
- 15325: 0x4E2B,
- 15326: 0x82BD,
- 15327: 0x7259,
- 15328: 0x869C,
- 15329: 0x5D16,
- 15330: 0x8859,
- 15331: 0x6DAF,
- 15332: 0x96C5,
- 15333: 0x54D1,
- 15334: 0x4E9A,
- 15335: 0x8BB6,
- 15336: 0x7109,
- 15337: 0x54BD,
- 15338: 0x9609,
- 15339: 0x70DF,
- 15340: 0x6DF9,
- 15341: 0x76D0,
- 15342: 0x4E25,
- 15343: 0x7814,
- 15344: 0x8712,
- 15345: 0x5CA9,
- 15346: 0x5EF6,
- 15347: 0x8A00,
- 15348: 0x989C,
- 15349: 0x960E,
- 15350: 0x708E,
- 15351: 0x6CBF,
- 15352: 0x5944,
- 15353: 0x63A9,
- 15354: 0x773C,
- 15355: 0x884D,
- 15356: 0x6F14,
- 15357: 0x8273,
- 15358: 0x5830,
- 15359: 0x71D5,
- 15360: 0x538C,
- 15361: 0x781A,
- 15362: 0x96C1,
- 15363: 0x5501,
- 15364: 0x5F66,
- 15365: 0x7130,
- 15366: 0x5BB4,
- 15367: 0x8C1A,
- 15368: 0x9A8C,
- 15369: 0x6B83,
- 15370: 0x592E,
- 15371: 0x9E2F,
- 15372: 0x79E7,
- 15373: 0x6768,
- 15374: 0x626C,
- 15375: 0x4F6F,
- 15376: 0x75A1,
- 15377: 0x7F8A,
- 15378: 0x6D0B,
- 15379: 0x9633,
- 15380: 0x6C27,
- 15381: 0x4EF0,
- 15382: 0x75D2,
- 15383: 0x517B,
- 15384: 0x6837,
- 15385: 0x6F3E,
- 15386: 0x9080,
- 15387: 0x8170,
- 15388: 0x5996,
- 15389: 0x7476,
- 15390: 0x8938,
- 15391: 0x8939,
- 15392: 0x893A,
- 15393: 0x893B,
- 15394: 0x893C,
- 15395: 0x893D,
- 15396: 0x893E,
- 15397: 0x893F,
- 15398: 0x8940,
- 15399: 0x8942,
- 15400: 0x8943,
- 15401: 0x8945,
- 15402: 0x8946,
- 15403: 0x8947,
- 15404: 0x8948,
- 15405: 0x8949,
- 15406: 0x894A,
- 15407: 0x894B,
- 15408: 0x894C,
- 15409: 0x894D,
- 15410: 0x894E,
- 15411: 0x894F,
- 15412: 0x8950,
- 15413: 0x8951,
- 15414: 0x8952,
- 15415: 0x8953,
- 15416: 0x8954,
- 15417: 0x8955,
- 15418: 0x8956,
- 15419: 0x8957,
- 15420: 0x8958,
- 15421: 0x8959,
- 15422: 0x895A,
- 15423: 0x895B,
- 15424: 0x895C,
- 15425: 0x895D,
- 15426: 0x8960,
- 15427: 0x8961,
- 15428: 0x8962,
- 15429: 0x8963,
- 15430: 0x8964,
- 15431: 0x8965,
- 15432: 0x8967,
- 15433: 0x8968,
- 15434: 0x8969,
- 15435: 0x896A,
- 15436: 0x896B,
- 15437: 0x896C,
- 15438: 0x896D,
- 15439: 0x896E,
- 15440: 0x896F,
- 15441: 0x8970,
- 15442: 0x8971,
- 15443: 0x8972,
- 15444: 0x8973,
- 15445: 0x8974,
- 15446: 0x8975,
- 15447: 0x8976,
- 15448: 0x8977,
- 15449: 0x8978,
- 15450: 0x8979,
- 15451: 0x897A,
- 15452: 0x897C,
- 15453: 0x897D,
- 15454: 0x897E,
- 15455: 0x8980,
- 15456: 0x8982,
- 15457: 0x8984,
- 15458: 0x8985,
- 15459: 0x8987,
- 15460: 0x8988,
- 15461: 0x8989,
- 15462: 0x898A,
- 15463: 0x898B,
- 15464: 0x898C,
- 15465: 0x898D,
- 15466: 0x898E,
- 15467: 0x898F,
- 15468: 0x8990,
- 15469: 0x8991,
- 15470: 0x8992,
- 15471: 0x8993,
- 15472: 0x8994,
- 15473: 0x8995,
- 15474: 0x8996,
- 15475: 0x8997,
- 15476: 0x8998,
- 15477: 0x8999,
- 15478: 0x899A,
- 15479: 0x899B,
- 15480: 0x899C,
- 15481: 0x899D,
- 15482: 0x899E,
- 15483: 0x899F,
- 15484: 0x89A0,
- 15485: 0x89A1,
- 15486: 0x6447,
- 15487: 0x5C27,
- 15488: 0x9065,
- 15489: 0x7A91,
- 15490: 0x8C23,
- 15491: 0x59DA,
- 15492: 0x54AC,
- 15493: 0x8200,
- 15494: 0x836F,
- 15495: 0x8981,
- 15496: 0x8000,
- 15497: 0x6930,
- 15498: 0x564E,
- 15499: 0x8036,
- 15500: 0x7237,
- 15501: 0x91CE,
- 15502: 0x51B6,
- 15503: 0x4E5F,
- 15504: 0x9875,
- 15505: 0x6396,
- 15506: 0x4E1A,
- 15507: 0x53F6,
- 15508: 0x66F3,
- 15509: 0x814B,
- 15510: 0x591C,
- 15511: 0x6DB2,
- 15512: 0x4E00,
- 15513: 0x58F9,
- 15514: 0x533B,
- 15515: 0x63D6,
- 15516: 0x94F1,
- 15517: 0x4F9D,
- 15518: 0x4F0A,
- 15519: 0x8863,
- 15520: 0x9890,
- 15521: 0x5937,
- 15522: 0x9057,
- 15523: 0x79FB,
- 15524: 0x4EEA,
- 15525: 0x80F0,
- 15526: 0x7591,
- 15527: 0x6C82,
- 15528: 0x5B9C,
- 15529: 0x59E8,
- 15530: 0x5F5D,
- 15531: 0x6905,
- 15532: 0x8681,
- 15533: 0x501A,
- 15534: 0x5DF2,
- 15535: 0x4E59,
- 15536: 0x77E3,
- 15537: 0x4EE5,
- 15538: 0x827A,
- 15539: 0x6291,
- 15540: 0x6613,
- 15541: 0x9091,
- 15542: 0x5C79,
- 15543: 0x4EBF,
- 15544: 0x5F79,
- 15545: 0x81C6,
- 15546: 0x9038,
- 15547: 0x8084,
- 15548: 0x75AB,
- 15549: 0x4EA6,
- 15550: 0x88D4,
- 15551: 0x610F,
- 15552: 0x6BC5,
- 15553: 0x5FC6,
- 15554: 0x4E49,
- 15555: 0x76CA,
- 15556: 0x6EA2,
- 15557: 0x8BE3,
- 15558: 0x8BAE,
- 15559: 0x8C0A,
- 15560: 0x8BD1,
- 15561: 0x5F02,
- 15562: 0x7FFC,
- 15563: 0x7FCC,
- 15564: 0x7ECE,
- 15565: 0x8335,
- 15566: 0x836B,
- 15567: 0x56E0,
- 15568: 0x6BB7,
- 15569: 0x97F3,
- 15570: 0x9634,
- 15571: 0x59FB,
- 15572: 0x541F,
- 15573: 0x94F6,
- 15574: 0x6DEB,
- 15575: 0x5BC5,
- 15576: 0x996E,
- 15577: 0x5C39,
- 15578: 0x5F15,
- 15579: 0x9690,
- 15580: 0x89A2,
- 15581: 0x89A3,
- 15582: 0x89A4,
- 15583: 0x89A5,
- 15584: 0x89A6,
- 15585: 0x89A7,
- 15586: 0x89A8,
- 15587: 0x89A9,
- 15588: 0x89AA,
- 15589: 0x89AB,
- 15590: 0x89AC,
- 15591: 0x89AD,
- 15592: 0x89AE,
- 15593: 0x89AF,
- 15594: 0x89B0,
- 15595: 0x89B1,
- 15596: 0x89B2,
- 15597: 0x89B3,
- 15598: 0x89B4,
- 15599: 0x89B5,
- 15600: 0x89B6,
- 15601: 0x89B7,
- 15602: 0x89B8,
- 15603: 0x89B9,
- 15604: 0x89BA,
- 15605: 0x89BB,
- 15606: 0x89BC,
- 15607: 0x89BD,
- 15608: 0x89BE,
- 15609: 0x89BF,
- 15610: 0x89C0,
- 15611: 0x89C3,
- 15612: 0x89CD,
- 15613: 0x89D3,
- 15614: 0x89D4,
- 15615: 0x89D5,
- 15616: 0x89D7,
- 15617: 0x89D8,
- 15618: 0x89D9,
- 15619: 0x89DB,
- 15620: 0x89DD,
- 15621: 0x89DF,
- 15622: 0x89E0,
- 15623: 0x89E1,
- 15624: 0x89E2,
- 15625: 0x89E4,
- 15626: 0x89E7,
- 15627: 0x89E8,
- 15628: 0x89E9,
- 15629: 0x89EA,
- 15630: 0x89EC,
- 15631: 0x89ED,
- 15632: 0x89EE,
- 15633: 0x89F0,
- 15634: 0x89F1,
- 15635: 0x89F2,
- 15636: 0x89F4,
- 15637: 0x89F5,
- 15638: 0x89F6,
- 15639: 0x89F7,
- 15640: 0x89F8,
- 15641: 0x89F9,
- 15642: 0x89FA,
- 15643: 0x89FB,
- 15644: 0x89FC,
- 15645: 0x89FD,
- 15646: 0x89FE,
- 15647: 0x89FF,
- 15648: 0x8A01,
- 15649: 0x8A02,
- 15650: 0x8A03,
- 15651: 0x8A04,
- 15652: 0x8A05,
- 15653: 0x8A06,
- 15654: 0x8A08,
- 15655: 0x8A09,
- 15656: 0x8A0A,
- 15657: 0x8A0B,
- 15658: 0x8A0C,
- 15659: 0x8A0D,
- 15660: 0x8A0E,
- 15661: 0x8A0F,
- 15662: 0x8A10,
- 15663: 0x8A11,
- 15664: 0x8A12,
- 15665: 0x8A13,
- 15666: 0x8A14,
- 15667: 0x8A15,
- 15668: 0x8A16,
- 15669: 0x8A17,
- 15670: 0x8A18,
- 15671: 0x8A19,
- 15672: 0x8A1A,
- 15673: 0x8A1B,
- 15674: 0x8A1C,
- 15675: 0x8A1D,
- 15676: 0x5370,
- 15677: 0x82F1,
- 15678: 0x6A31,
- 15679: 0x5A74,
- 15680: 0x9E70,
- 15681: 0x5E94,
- 15682: 0x7F28,
- 15683: 0x83B9,
- 15684: 0x8424,
- 15685: 0x8425,
- 15686: 0x8367,
- 15687: 0x8747,
- 15688: 0x8FCE,
- 15689: 0x8D62,
- 15690: 0x76C8,
- 15691: 0x5F71,
- 15692: 0x9896,
- 15693: 0x786C,
- 15694: 0x6620,
- 15695: 0x54DF,
- 15696: 0x62E5,
- 15697: 0x4F63,
- 15698: 0x81C3,
- 15699: 0x75C8,
- 15700: 0x5EB8,
- 15701: 0x96CD,
- 15702: 0x8E0A,
- 15703: 0x86F9,
- 15704: 0x548F,
- 15705: 0x6CF3,
- 15706: 0x6D8C,
- 15707: 0x6C38,
- 15708: 0x607F,
- 15709: 0x52C7,
- 15710: 0x7528,
- 15711: 0x5E7D,
- 15712: 0x4F18,
- 15713: 0x60A0,
- 15714: 0x5FE7,
- 15715: 0x5C24,
- 15716: 0x7531,
- 15717: 0x90AE,
- 15718: 0x94C0,
- 15719: 0x72B9,
- 15720: 0x6CB9,
- 15721: 0x6E38,
- 15722: 0x9149,
- 15723: 0x6709,
- 15724: 0x53CB,
- 15725: 0x53F3,
- 15726: 0x4F51,
- 15727: 0x91C9,
- 15728: 0x8BF1,
- 15729: 0x53C8,
- 15730: 0x5E7C,
- 15731: 0x8FC2,
- 15732: 0x6DE4,
- 15733: 0x4E8E,
- 15734: 0x76C2,
- 15735: 0x6986,
- 15736: 0x865E,
- 15737: 0x611A,
- 15738: 0x8206,
- 15739: 0x4F59,
- 15740: 0x4FDE,
- 15741: 0x903E,
- 15742: 0x9C7C,
- 15743: 0x6109,
- 15744: 0x6E1D,
- 15745: 0x6E14,
- 15746: 0x9685,
- 15747: 0x4E88,
- 15748: 0x5A31,
- 15749: 0x96E8,
- 15750: 0x4E0E,
- 15751: 0x5C7F,
- 15752: 0x79B9,
- 15753: 0x5B87,
- 15754: 0x8BED,
- 15755: 0x7FBD,
- 15756: 0x7389,
- 15757: 0x57DF,
- 15758: 0x828B,
- 15759: 0x90C1,
- 15760: 0x5401,
- 15761: 0x9047,
- 15762: 0x55BB,
- 15763: 0x5CEA,
- 15764: 0x5FA1,
- 15765: 0x6108,
- 15766: 0x6B32,
- 15767: 0x72F1,
- 15768: 0x80B2,
- 15769: 0x8A89,
- 15770: 0x8A1E,
- 15771: 0x8A1F,
- 15772: 0x8A20,
- 15773: 0x8A21,
- 15774: 0x8A22,
- 15775: 0x8A23,
- 15776: 0x8A24,
- 15777: 0x8A25,
- 15778: 0x8A26,
- 15779: 0x8A27,
- 15780: 0x8A28,
- 15781: 0x8A29,
- 15782: 0x8A2A,
- 15783: 0x8A2B,
- 15784: 0x8A2C,
- 15785: 0x8A2D,
- 15786: 0x8A2E,
- 15787: 0x8A2F,
- 15788: 0x8A30,
- 15789: 0x8A31,
- 15790: 0x8A32,
- 15791: 0x8A33,
- 15792: 0x8A34,
- 15793: 0x8A35,
- 15794: 0x8A36,
- 15795: 0x8A37,
- 15796: 0x8A38,
- 15797: 0x8A39,
- 15798: 0x8A3A,
- 15799: 0x8A3B,
- 15800: 0x8A3C,
- 15801: 0x8A3D,
- 15802: 0x8A3F,
- 15803: 0x8A40,
- 15804: 0x8A41,
- 15805: 0x8A42,
- 15806: 0x8A43,
- 15807: 0x8A44,
- 15808: 0x8A45,
- 15809: 0x8A46,
- 15810: 0x8A47,
- 15811: 0x8A49,
- 15812: 0x8A4A,
- 15813: 0x8A4B,
- 15814: 0x8A4C,
- 15815: 0x8A4D,
- 15816: 0x8A4E,
- 15817: 0x8A4F,
- 15818: 0x8A50,
- 15819: 0x8A51,
- 15820: 0x8A52,
- 15821: 0x8A53,
- 15822: 0x8A54,
- 15823: 0x8A55,
- 15824: 0x8A56,
- 15825: 0x8A57,
- 15826: 0x8A58,
- 15827: 0x8A59,
- 15828: 0x8A5A,
- 15829: 0x8A5B,
- 15830: 0x8A5C,
- 15831: 0x8A5D,
- 15832: 0x8A5E,
- 15833: 0x8A5F,
- 15834: 0x8A60,
- 15835: 0x8A61,
- 15836: 0x8A62,
- 15837: 0x8A63,
- 15838: 0x8A64,
- 15839: 0x8A65,
- 15840: 0x8A66,
- 15841: 0x8A67,
- 15842: 0x8A68,
- 15843: 0x8A69,
- 15844: 0x8A6A,
- 15845: 0x8A6B,
- 15846: 0x8A6C,
- 15847: 0x8A6D,
- 15848: 0x8A6E,
- 15849: 0x8A6F,
- 15850: 0x8A70,
- 15851: 0x8A71,
- 15852: 0x8A72,
- 15853: 0x8A73,
- 15854: 0x8A74,
- 15855: 0x8A75,
- 15856: 0x8A76,
- 15857: 0x8A77,
- 15858: 0x8A78,
- 15859: 0x8A7A,
- 15860: 0x8A7B,
- 15861: 0x8A7C,
- 15862: 0x8A7D,
- 15863: 0x8A7E,
- 15864: 0x8A7F,
- 15865: 0x8A80,
- 15866: 0x6D74,
- 15867: 0x5BD3,
- 15868: 0x88D5,
- 15869: 0x9884,
- 15870: 0x8C6B,
- 15871: 0x9A6D,
- 15872: 0x9E33,
- 15873: 0x6E0A,
- 15874: 0x51A4,
- 15875: 0x5143,
- 15876: 0x57A3,
- 15877: 0x8881,
- 15878: 0x539F,
- 15879: 0x63F4,
- 15880: 0x8F95,
- 15881: 0x56ED,
- 15882: 0x5458,
- 15883: 0x5706,
- 15884: 0x733F,
- 15885: 0x6E90,
- 15886: 0x7F18,
- 15887: 0x8FDC,
- 15888: 0x82D1,
- 15889: 0x613F,
- 15890: 0x6028,
- 15891: 0x9662,
- 15892: 0x66F0,
- 15893: 0x7EA6,
- 15894: 0x8D8A,
- 15895: 0x8DC3,
- 15896: 0x94A5,
- 15897: 0x5CB3,
- 15898: 0x7CA4,
- 15899: 0x6708,
- 15900: 0x60A6,
- 15901: 0x9605,
- 15902: 0x8018,
- 15903: 0x4E91,
- 15904: 0x90E7,
- 15905: 0x5300,
- 15906: 0x9668,
- 15907: 0x5141,
- 15908: 0x8FD0,
- 15909: 0x8574,
- 15910: 0x915D,
- 15911: 0x6655,
- 15912: 0x97F5,
- 15913: 0x5B55,
- 15914: 0x531D,
- 15915: 0x7838,
- 15916: 0x6742,
- 15917: 0x683D,
- 15918: 0x54C9,
- 15919: 0x707E,
- 15920: 0x5BB0,
- 15921: 0x8F7D,
- 15922: 0x518D,
- 15923: 0x5728,
- 15924: 0x54B1,
- 15925: 0x6512,
- 15926: 0x6682,
- 15927: 0x8D5E,
- 15928: 0x8D43,
- 15929: 0x810F,
- 15930: 0x846C,
- 15931: 0x906D,
- 15932: 0x7CDF,
- 15933: 0x51FF,
- 15934: 0x85FB,
- 15935: 0x67A3,
- 15936: 0x65E9,
- 15937: 0x6FA1,
- 15938: 0x86A4,
- 15939: 0x8E81,
- 15940: 0x566A,
- 15941: 0x9020,
- 15942: 0x7682,
- 15943: 0x7076,
- 15944: 0x71E5,
- 15945: 0x8D23,
- 15946: 0x62E9,
- 15947: 0x5219,
- 15948: 0x6CFD,
- 15949: 0x8D3C,
- 15950: 0x600E,
- 15951: 0x589E,
- 15952: 0x618E,
- 15953: 0x66FE,
- 15954: 0x8D60,
- 15955: 0x624E,
- 15956: 0x55B3,
- 15957: 0x6E23,
- 15958: 0x672D,
- 15959: 0x8F67,
- 15960: 0x8A81,
- 15961: 0x8A82,
- 15962: 0x8A83,
- 15963: 0x8A84,
- 15964: 0x8A85,
- 15965: 0x8A86,
- 15966: 0x8A87,
- 15967: 0x8A88,
- 15968: 0x8A8B,
- 15969: 0x8A8C,
- 15970: 0x8A8D,
- 15971: 0x8A8E,
- 15972: 0x8A8F,
- 15973: 0x8A90,
- 15974: 0x8A91,
- 15975: 0x8A92,
- 15976: 0x8A94,
- 15977: 0x8A95,
- 15978: 0x8A96,
- 15979: 0x8A97,
- 15980: 0x8A98,
- 15981: 0x8A99,
- 15982: 0x8A9A,
- 15983: 0x8A9B,
- 15984: 0x8A9C,
- 15985: 0x8A9D,
- 15986: 0x8A9E,
- 15987: 0x8A9F,
- 15988: 0x8AA0,
- 15989: 0x8AA1,
- 15990: 0x8AA2,
- 15991: 0x8AA3,
- 15992: 0x8AA4,
- 15993: 0x8AA5,
- 15994: 0x8AA6,
- 15995: 0x8AA7,
- 15996: 0x8AA8,
- 15997: 0x8AA9,
- 15998: 0x8AAA,
- 15999: 0x8AAB,
- 16000: 0x8AAC,
- 16001: 0x8AAD,
- 16002: 0x8AAE,
- 16003: 0x8AAF,
- 16004: 0x8AB0,
- 16005: 0x8AB1,
- 16006: 0x8AB2,
- 16007: 0x8AB3,
- 16008: 0x8AB4,
- 16009: 0x8AB5,
- 16010: 0x8AB6,
- 16011: 0x8AB7,
- 16012: 0x8AB8,
- 16013: 0x8AB9,
- 16014: 0x8ABA,
- 16015: 0x8ABB,
- 16016: 0x8ABC,
- 16017: 0x8ABD,
- 16018: 0x8ABE,
- 16019: 0x8ABF,
- 16020: 0x8AC0,
- 16021: 0x8AC1,
- 16022: 0x8AC2,
- 16023: 0x8AC3,
- 16024: 0x8AC4,
- 16025: 0x8AC5,
- 16026: 0x8AC6,
- 16027: 0x8AC7,
- 16028: 0x8AC8,
- 16029: 0x8AC9,
- 16030: 0x8ACA,
- 16031: 0x8ACB,
- 16032: 0x8ACC,
- 16033: 0x8ACD,
- 16034: 0x8ACE,
- 16035: 0x8ACF,
- 16036: 0x8AD0,
- 16037: 0x8AD1,
- 16038: 0x8AD2,
- 16039: 0x8AD3,
- 16040: 0x8AD4,
- 16041: 0x8AD5,
- 16042: 0x8AD6,
- 16043: 0x8AD7,
- 16044: 0x8AD8,
- 16045: 0x8AD9,
- 16046: 0x8ADA,
- 16047: 0x8ADB,
- 16048: 0x8ADC,
- 16049: 0x8ADD,
- 16050: 0x8ADE,
- 16051: 0x8ADF,
- 16052: 0x8AE0,
- 16053: 0x8AE1,
- 16054: 0x8AE2,
- 16055: 0x8AE3,
- 16056: 0x94E1,
- 16057: 0x95F8,
- 16058: 0x7728,
- 16059: 0x6805,
- 16060: 0x69A8,
- 16061: 0x548B,
- 16062: 0x4E4D,
- 16063: 0x70B8,
- 16064: 0x8BC8,
- 16065: 0x6458,
- 16066: 0x658B,
- 16067: 0x5B85,
- 16068: 0x7A84,
- 16069: 0x503A,
- 16070: 0x5BE8,
- 16071: 0x77BB,
- 16072: 0x6BE1,
- 16073: 0x8A79,
- 16074: 0x7C98,
- 16075: 0x6CBE,
- 16076: 0x76CF,
- 16077: 0x65A9,
- 16078: 0x8F97,
- 16079: 0x5D2D,
- 16080: 0x5C55,
- 16081: 0x8638,
- 16082: 0x6808,
- 16083: 0x5360,
- 16084: 0x6218,
- 16085: 0x7AD9,
- 16086: 0x6E5B,
- 16087: 0x7EFD,
- 16088: 0x6A1F,
- 16089: 0x7AE0,
- 16090: 0x5F70,
- 16091: 0x6F33,
- 16092: 0x5F20,
- 16093: 0x638C,
- 16094: 0x6DA8,
- 16095: 0x6756,
- 16096: 0x4E08,
- 16097: 0x5E10,
- 16098: 0x8D26,
- 16099: 0x4ED7,
- 16100: 0x80C0,
- 16101: 0x7634,
- 16102: 0x969C,
- 16103: 0x62DB,
- 16104: 0x662D,
- 16105: 0x627E,
- 16106: 0x6CBC,
- 16107: 0x8D75,
- 16108: 0x7167,
- 16109: 0x7F69,
- 16110: 0x5146,
- 16111: 0x8087,
- 16112: 0x53EC,
- 16113: 0x906E,
- 16114: 0x6298,
- 16115: 0x54F2,
- 16116: 0x86F0,
- 16117: 0x8F99,
- 16118: 0x8005,
- 16119: 0x9517,
- 16120: 0x8517,
- 16121: 0x8FD9,
- 16122: 0x6D59,
- 16123: 0x73CD,
- 16124: 0x659F,
- 16125: 0x771F,
- 16126: 0x7504,
- 16127: 0x7827,
- 16128: 0x81FB,
- 16129: 0x8D1E,
- 16130: 0x9488,
- 16131: 0x4FA6,
- 16132: 0x6795,
- 16133: 0x75B9,
- 16134: 0x8BCA,
- 16135: 0x9707,
- 16136: 0x632F,
- 16137: 0x9547,
- 16138: 0x9635,
- 16139: 0x84B8,
- 16140: 0x6323,
- 16141: 0x7741,
- 16142: 0x5F81,
- 16143: 0x72F0,
- 16144: 0x4E89,
- 16145: 0x6014,
- 16146: 0x6574,
- 16147: 0x62EF,
- 16148: 0x6B63,
- 16149: 0x653F,
- 16150: 0x8AE4,
- 16151: 0x8AE5,
- 16152: 0x8AE6,
- 16153: 0x8AE7,
- 16154: 0x8AE8,
- 16155: 0x8AE9,
- 16156: 0x8AEA,
- 16157: 0x8AEB,
- 16158: 0x8AEC,
- 16159: 0x8AED,
- 16160: 0x8AEE,
- 16161: 0x8AEF,
- 16162: 0x8AF0,
- 16163: 0x8AF1,
- 16164: 0x8AF2,
- 16165: 0x8AF3,
- 16166: 0x8AF4,
- 16167: 0x8AF5,
- 16168: 0x8AF6,
- 16169: 0x8AF7,
- 16170: 0x8AF8,
- 16171: 0x8AF9,
- 16172: 0x8AFA,
- 16173: 0x8AFB,
- 16174: 0x8AFC,
- 16175: 0x8AFD,
- 16176: 0x8AFE,
- 16177: 0x8AFF,
- 16178: 0x8B00,
- 16179: 0x8B01,
- 16180: 0x8B02,
- 16181: 0x8B03,
- 16182: 0x8B04,
- 16183: 0x8B05,
- 16184: 0x8B06,
- 16185: 0x8B08,
- 16186: 0x8B09,
- 16187: 0x8B0A,
- 16188: 0x8B0B,
- 16189: 0x8B0C,
- 16190: 0x8B0D,
- 16191: 0x8B0E,
- 16192: 0x8B0F,
- 16193: 0x8B10,
- 16194: 0x8B11,
- 16195: 0x8B12,
- 16196: 0x8B13,
- 16197: 0x8B14,
- 16198: 0x8B15,
- 16199: 0x8B16,
- 16200: 0x8B17,
- 16201: 0x8B18,
- 16202: 0x8B19,
- 16203: 0x8B1A,
- 16204: 0x8B1B,
- 16205: 0x8B1C,
- 16206: 0x8B1D,
- 16207: 0x8B1E,
- 16208: 0x8B1F,
- 16209: 0x8B20,
- 16210: 0x8B21,
- 16211: 0x8B22,
- 16212: 0x8B23,
- 16213: 0x8B24,
- 16214: 0x8B25,
- 16215: 0x8B27,
- 16216: 0x8B28,
- 16217: 0x8B29,
- 16218: 0x8B2A,
- 16219: 0x8B2B,
- 16220: 0x8B2C,
- 16221: 0x8B2D,
- 16222: 0x8B2E,
- 16223: 0x8B2F,
- 16224: 0x8B30,
- 16225: 0x8B31,
- 16226: 0x8B32,
- 16227: 0x8B33,
- 16228: 0x8B34,
- 16229: 0x8B35,
- 16230: 0x8B36,
- 16231: 0x8B37,
- 16232: 0x8B38,
- 16233: 0x8B39,
- 16234: 0x8B3A,
- 16235: 0x8B3B,
- 16236: 0x8B3C,
- 16237: 0x8B3D,
- 16238: 0x8B3E,
- 16239: 0x8B3F,
- 16240: 0x8B40,
- 16241: 0x8B41,
- 16242: 0x8B42,
- 16243: 0x8B43,
- 16244: 0x8B44,
- 16245: 0x8B45,
- 16246: 0x5E27,
- 16247: 0x75C7,
- 16248: 0x90D1,
- 16249: 0x8BC1,
- 16250: 0x829D,
- 16251: 0x679D,
- 16252: 0x652F,
- 16253: 0x5431,
- 16254: 0x8718,
- 16255: 0x77E5,
- 16256: 0x80A2,
- 16257: 0x8102,
- 16258: 0x6C41,
- 16259: 0x4E4B,
- 16260: 0x7EC7,
- 16261: 0x804C,
- 16262: 0x76F4,
- 16263: 0x690D,
- 16264: 0x6B96,
- 16265: 0x6267,
- 16266: 0x503C,
- 16267: 0x4F84,
- 16268: 0x5740,
- 16269: 0x6307,
- 16270: 0x6B62,
- 16271: 0x8DBE,
- 16272: 0x53EA,
- 16273: 0x65E8,
- 16274: 0x7EB8,
- 16275: 0x5FD7,
- 16276: 0x631A,
- 16277: 0x63B7,
- 16278: 0x81F3,
- 16279: 0x81F4,
- 16280: 0x7F6E,
- 16281: 0x5E1C,
- 16282: 0x5CD9,
- 16283: 0x5236,
- 16284: 0x667A,
- 16285: 0x79E9,
- 16286: 0x7A1A,
- 16287: 0x8D28,
- 16288: 0x7099,
- 16289: 0x75D4,
- 16290: 0x6EDE,
- 16291: 0x6CBB,
- 16292: 0x7A92,
- 16293: 0x4E2D,
- 16294: 0x76C5,
- 16295: 0x5FE0,
- 16296: 0x949F,
- 16297: 0x8877,
- 16298: 0x7EC8,
- 16299: 0x79CD,
- 16300: 0x80BF,
- 16301: 0x91CD,
- 16302: 0x4EF2,
- 16303: 0x4F17,
- 16304: 0x821F,
- 16305: 0x5468,
- 16306: 0x5DDE,
- 16307: 0x6D32,
- 16308: 0x8BCC,
- 16309: 0x7CA5,
- 16310: 0x8F74,
- 16311: 0x8098,
- 16312: 0x5E1A,
- 16313: 0x5492,
- 16314: 0x76B1,
- 16315: 0x5B99,
- 16316: 0x663C,
- 16317: 0x9AA4,
- 16318: 0x73E0,
- 16319: 0x682A,
- 16320: 0x86DB,
- 16321: 0x6731,
- 16322: 0x732A,
- 16323: 0x8BF8,
- 16324: 0x8BDB,
- 16325: 0x9010,
- 16326: 0x7AF9,
- 16327: 0x70DB,
- 16328: 0x716E,
- 16329: 0x62C4,
- 16330: 0x77A9,
- 16331: 0x5631,
- 16332: 0x4E3B,
- 16333: 0x8457,
- 16334: 0x67F1,
- 16335: 0x52A9,
- 16336: 0x86C0,
- 16337: 0x8D2E,
- 16338: 0x94F8,
- 16339: 0x7B51,
- 16340: 0x8B46,
- 16341: 0x8B47,
- 16342: 0x8B48,
- 16343: 0x8B49,
- 16344: 0x8B4A,
- 16345: 0x8B4B,
- 16346: 0x8B4C,
- 16347: 0x8B4D,
- 16348: 0x8B4E,
- 16349: 0x8B4F,
- 16350: 0x8B50,
- 16351: 0x8B51,
- 16352: 0x8B52,
- 16353: 0x8B53,
- 16354: 0x8B54,
- 16355: 0x8B55,
- 16356: 0x8B56,
- 16357: 0x8B57,
- 16358: 0x8B58,
- 16359: 0x8B59,
- 16360: 0x8B5A,
- 16361: 0x8B5B,
- 16362: 0x8B5C,
- 16363: 0x8B5D,
- 16364: 0x8B5E,
- 16365: 0x8B5F,
- 16366: 0x8B60,
- 16367: 0x8B61,
- 16368: 0x8B62,
- 16369: 0x8B63,
- 16370: 0x8B64,
- 16371: 0x8B65,
- 16372: 0x8B67,
- 16373: 0x8B68,
- 16374: 0x8B69,
- 16375: 0x8B6A,
- 16376: 0x8B6B,
- 16377: 0x8B6D,
- 16378: 0x8B6E,
- 16379: 0x8B6F,
- 16380: 0x8B70,
- 16381: 0x8B71,
- 16382: 0x8B72,
- 16383: 0x8B73,
- 16384: 0x8B74,
- 16385: 0x8B75,
- 16386: 0x8B76,
- 16387: 0x8B77,
- 16388: 0x8B78,
- 16389: 0x8B79,
- 16390: 0x8B7A,
- 16391: 0x8B7B,
- 16392: 0x8B7C,
- 16393: 0x8B7D,
- 16394: 0x8B7E,
- 16395: 0x8B7F,
- 16396: 0x8B80,
- 16397: 0x8B81,
- 16398: 0x8B82,
- 16399: 0x8B83,
- 16400: 0x8B84,
- 16401: 0x8B85,
- 16402: 0x8B86,
- 16403: 0x8B87,
- 16404: 0x8B88,
- 16405: 0x8B89,
- 16406: 0x8B8A,
- 16407: 0x8B8B,
- 16408: 0x8B8C,
- 16409: 0x8B8D,
- 16410: 0x8B8E,
- 16411: 0x8B8F,
- 16412: 0x8B90,
- 16413: 0x8B91,
- 16414: 0x8B92,
- 16415: 0x8B93,
- 16416: 0x8B94,
- 16417: 0x8B95,
- 16418: 0x8B96,
- 16419: 0x8B97,
- 16420: 0x8B98,
- 16421: 0x8B99,
- 16422: 0x8B9A,
- 16423: 0x8B9B,
- 16424: 0x8B9C,
- 16425: 0x8B9D,
- 16426: 0x8B9E,
- 16427: 0x8B9F,
- 16428: 0x8BAC,
- 16429: 0x8BB1,
- 16430: 0x8BBB,
- 16431: 0x8BC7,
- 16432: 0x8BD0,
- 16433: 0x8BEA,
- 16434: 0x8C09,
- 16435: 0x8C1E,
- 16436: 0x4F4F,
- 16437: 0x6CE8,
- 16438: 0x795D,
- 16439: 0x9A7B,
- 16440: 0x6293,
- 16441: 0x722A,
- 16442: 0x62FD,
- 16443: 0x4E13,
- 16444: 0x7816,
- 16445: 0x8F6C,
- 16446: 0x64B0,
- 16447: 0x8D5A,
- 16448: 0x7BC6,
- 16449: 0x6869,
- 16450: 0x5E84,
- 16451: 0x88C5,
- 16452: 0x5986,
- 16453: 0x649E,
- 16454: 0x58EE,
- 16455: 0x72B6,
- 16456: 0x690E,
- 16457: 0x9525,
- 16458: 0x8FFD,
- 16459: 0x8D58,
- 16460: 0x5760,
- 16461: 0x7F00,
- 16462: 0x8C06,
- 16463: 0x51C6,
- 16464: 0x6349,
- 16465: 0x62D9,
- 16466: 0x5353,
- 16467: 0x684C,
- 16468: 0x7422,
- 16469: 0x8301,
- 16470: 0x914C,
- 16471: 0x5544,
- 16472: 0x7740,
- 16473: 0x707C,
- 16474: 0x6D4A,
- 16475: 0x5179,
- 16476: 0x54A8,
- 16477: 0x8D44,
- 16478: 0x59FF,
- 16479: 0x6ECB,
- 16480: 0x6DC4,
- 16481: 0x5B5C,
- 16482: 0x7D2B,
- 16483: 0x4ED4,
- 16484: 0x7C7D,
- 16485: 0x6ED3,
- 16486: 0x5B50,
- 16487: 0x81EA,
- 16488: 0x6E0D,
- 16489: 0x5B57,
- 16490: 0x9B03,
- 16491: 0x68D5,
- 16492: 0x8E2A,
- 16493: 0x5B97,
- 16494: 0x7EFC,
- 16495: 0x603B,
- 16496: 0x7EB5,
- 16497: 0x90B9,
- 16498: 0x8D70,
- 16499: 0x594F,
- 16500: 0x63CD,
- 16501: 0x79DF,
- 16502: 0x8DB3,
- 16503: 0x5352,
- 16504: 0x65CF,
- 16505: 0x7956,
- 16506: 0x8BC5,
- 16507: 0x963B,
- 16508: 0x7EC4,
- 16509: 0x94BB,
- 16510: 0x7E82,
- 16511: 0x5634,
- 16512: 0x9189,
- 16513: 0x6700,
- 16514: 0x7F6A,
- 16515: 0x5C0A,
- 16516: 0x9075,
- 16517: 0x6628,
- 16518: 0x5DE6,
- 16519: 0x4F50,
- 16520: 0x67DE,
- 16521: 0x505A,
- 16522: 0x4F5C,
- 16523: 0x5750,
- 16524: 0x5EA7,
- 16530: 0x8C38,
- 16531: 0x8C39,
- 16532: 0x8C3A,
- 16533: 0x8C3B,
- 16534: 0x8C3C,
- 16535: 0x8C3D,
- 16536: 0x8C3E,
- 16537: 0x8C3F,
- 16538: 0x8C40,
- 16539: 0x8C42,
- 16540: 0x8C43,
- 16541: 0x8C44,
- 16542: 0x8C45,
- 16543: 0x8C48,
- 16544: 0x8C4A,
- 16545: 0x8C4B,
- 16546: 0x8C4D,
- 16547: 0x8C4E,
- 16548: 0x8C4F,
- 16549: 0x8C50,
- 16550: 0x8C51,
- 16551: 0x8C52,
- 16552: 0x8C53,
- 16553: 0x8C54,
- 16554: 0x8C56,
- 16555: 0x8C57,
- 16556: 0x8C58,
- 16557: 0x8C59,
- 16558: 0x8C5B,
- 16559: 0x8C5C,
- 16560: 0x8C5D,
- 16561: 0x8C5E,
- 16562: 0x8C5F,
- 16563: 0x8C60,
- 16564: 0x8C63,
- 16565: 0x8C64,
- 16566: 0x8C65,
- 16567: 0x8C66,
- 16568: 0x8C67,
- 16569: 0x8C68,
- 16570: 0x8C69,
- 16571: 0x8C6C,
- 16572: 0x8C6D,
- 16573: 0x8C6E,
- 16574: 0x8C6F,
- 16575: 0x8C70,
- 16576: 0x8C71,
- 16577: 0x8C72,
- 16578: 0x8C74,
- 16579: 0x8C75,
- 16580: 0x8C76,
- 16581: 0x8C77,
- 16582: 0x8C7B,
- 16583: 0x8C7C,
- 16584: 0x8C7D,
- 16585: 0x8C7E,
- 16586: 0x8C7F,
- 16587: 0x8C80,
- 16588: 0x8C81,
- 16589: 0x8C83,
- 16590: 0x8C84,
- 16591: 0x8C86,
- 16592: 0x8C87,
- 16593: 0x8C88,
- 16594: 0x8C8B,
- 16595: 0x8C8D,
- 16596: 0x8C8E,
- 16597: 0x8C8F,
- 16598: 0x8C90,
- 16599: 0x8C91,
- 16600: 0x8C92,
- 16601: 0x8C93,
- 16602: 0x8C95,
- 16603: 0x8C96,
- 16604: 0x8C97,
- 16605: 0x8C99,
- 16606: 0x8C9A,
- 16607: 0x8C9B,
- 16608: 0x8C9C,
- 16609: 0x8C9D,
- 16610: 0x8C9E,
- 16611: 0x8C9F,
- 16612: 0x8CA0,
- 16613: 0x8CA1,
- 16614: 0x8CA2,
- 16615: 0x8CA3,
- 16616: 0x8CA4,
- 16617: 0x8CA5,
- 16618: 0x8CA6,
- 16619: 0x8CA7,
- 16620: 0x8CA8,
- 16621: 0x8CA9,
- 16622: 0x8CAA,
- 16623: 0x8CAB,
- 16624: 0x8CAC,
- 16625: 0x8CAD,
- 16626: 0x4E8D,
- 16627: 0x4E0C,
- 16628: 0x5140,
- 16629: 0x4E10,
- 16630: 0x5EFF,
- 16631: 0x5345,
- 16632: 0x4E15,
- 16633: 0x4E98,
- 16634: 0x4E1E,
- 16635: 0x9B32,
- 16636: 0x5B6C,
- 16637: 0x5669,
- 16638: 0x4E28,
- 16639: 0x79BA,
- 16640: 0x4E3F,
- 16641: 0x5315,
- 16642: 0x4E47,
- 16643: 0x592D,
- 16644: 0x723B,
- 16645: 0x536E,
- 16646: 0x6C10,
- 16647: 0x56DF,
- 16648: 0x80E4,
- 16649: 0x9997,
- 16650: 0x6BD3,
- 16651: 0x777E,
- 16652: 0x9F17,
- 16653: 0x4E36,
- 16654: 0x4E9F,
- 16655: 0x9F10,
- 16656: 0x4E5C,
- 16657: 0x4E69,
- 16658: 0x4E93,
- 16659: 0x8288,
- 16660: 0x5B5B,
- 16661: 0x556C,
- 16662: 0x560F,
- 16663: 0x4EC4,
- 16664: 0x538D,
- 16665: 0x539D,
- 16666: 0x53A3,
- 16667: 0x53A5,
- 16668: 0x53AE,
- 16669: 0x9765,
- 16670: 0x8D5D,
- 16671: 0x531A,
- 16672: 0x53F5,
- 16673: 0x5326,
- 16674: 0x532E,
- 16675: 0x533E,
- 16676: 0x8D5C,
- 16677: 0x5366,
- 16678: 0x5363,
- 16679: 0x5202,
- 16680: 0x5208,
- 16681: 0x520E,
- 16682: 0x522D,
- 16683: 0x5233,
- 16684: 0x523F,
- 16685: 0x5240,
- 16686: 0x524C,
- 16687: 0x525E,
- 16688: 0x5261,
- 16689: 0x525C,
- 16690: 0x84AF,
- 16691: 0x527D,
- 16692: 0x5282,
- 16693: 0x5281,
- 16694: 0x5290,
- 16695: 0x5293,
- 16696: 0x5182,
- 16697: 0x7F54,
- 16698: 0x4EBB,
- 16699: 0x4EC3,
- 16700: 0x4EC9,
- 16701: 0x4EC2,
- 16702: 0x4EE8,
- 16703: 0x4EE1,
- 16704: 0x4EEB,
- 16705: 0x4EDE,
- 16706: 0x4F1B,
- 16707: 0x4EF3,
- 16708: 0x4F22,
- 16709: 0x4F64,
- 16710: 0x4EF5,
- 16711: 0x4F25,
- 16712: 0x4F27,
- 16713: 0x4F09,
- 16714: 0x4F2B,
- 16715: 0x4F5E,
- 16716: 0x4F67,
- 16717: 0x6538,
- 16718: 0x4F5A,
- 16719: 0x4F5D,
- 16720: 0x8CAE,
- 16721: 0x8CAF,
- 16722: 0x8CB0,
- 16723: 0x8CB1,
- 16724: 0x8CB2,
- 16725: 0x8CB3,
- 16726: 0x8CB4,
- 16727: 0x8CB5,
- 16728: 0x8CB6,
- 16729: 0x8CB7,
- 16730: 0x8CB8,
- 16731: 0x8CB9,
- 16732: 0x8CBA,
- 16733: 0x8CBB,
- 16734: 0x8CBC,
- 16735: 0x8CBD,
- 16736: 0x8CBE,
- 16737: 0x8CBF,
- 16738: 0x8CC0,
- 16739: 0x8CC1,
- 16740: 0x8CC2,
- 16741: 0x8CC3,
- 16742: 0x8CC4,
- 16743: 0x8CC5,
- 16744: 0x8CC6,
- 16745: 0x8CC7,
- 16746: 0x8CC8,
- 16747: 0x8CC9,
- 16748: 0x8CCA,
- 16749: 0x8CCB,
- 16750: 0x8CCC,
- 16751: 0x8CCD,
- 16752: 0x8CCE,
- 16753: 0x8CCF,
- 16754: 0x8CD0,
- 16755: 0x8CD1,
- 16756: 0x8CD2,
- 16757: 0x8CD3,
- 16758: 0x8CD4,
- 16759: 0x8CD5,
- 16760: 0x8CD6,
- 16761: 0x8CD7,
- 16762: 0x8CD8,
- 16763: 0x8CD9,
- 16764: 0x8CDA,
- 16765: 0x8CDB,
- 16766: 0x8CDC,
- 16767: 0x8CDD,
- 16768: 0x8CDE,
- 16769: 0x8CDF,
- 16770: 0x8CE0,
- 16771: 0x8CE1,
- 16772: 0x8CE2,
- 16773: 0x8CE3,
- 16774: 0x8CE4,
- 16775: 0x8CE5,
- 16776: 0x8CE6,
- 16777: 0x8CE7,
- 16778: 0x8CE8,
- 16779: 0x8CE9,
- 16780: 0x8CEA,
- 16781: 0x8CEB,
- 16782: 0x8CEC,
- 16783: 0x8CED,
- 16784: 0x8CEE,
- 16785: 0x8CEF,
- 16786: 0x8CF0,
- 16787: 0x8CF1,
- 16788: 0x8CF2,
- 16789: 0x8CF3,
- 16790: 0x8CF4,
- 16791: 0x8CF5,
- 16792: 0x8CF6,
- 16793: 0x8CF7,
- 16794: 0x8CF8,
- 16795: 0x8CF9,
- 16796: 0x8CFA,
- 16797: 0x8CFB,
- 16798: 0x8CFC,
- 16799: 0x8CFD,
- 16800: 0x8CFE,
- 16801: 0x8CFF,
- 16802: 0x8D00,
- 16803: 0x8D01,
- 16804: 0x8D02,
- 16805: 0x8D03,
- 16806: 0x8D04,
- 16807: 0x8D05,
- 16808: 0x8D06,
- 16809: 0x8D07,
- 16810: 0x8D08,
- 16811: 0x8D09,
- 16812: 0x8D0A,
- 16813: 0x8D0B,
- 16814: 0x8D0C,
- 16815: 0x8D0D,
- 16816: 0x4F5F,
- 16817: 0x4F57,
- 16818: 0x4F32,
- 16819: 0x4F3D,
- 16820: 0x4F76,
- 16821: 0x4F74,
- 16822: 0x4F91,
- 16823: 0x4F89,
- 16824: 0x4F83,
- 16825: 0x4F8F,
- 16826: 0x4F7E,
- 16827: 0x4F7B,
- 16828: 0x4FAA,
- 16829: 0x4F7C,
- 16830: 0x4FAC,
- 16831: 0x4F94,
- 16832: 0x4FE6,
- 16833: 0x4FE8,
- 16834: 0x4FEA,
- 16835: 0x4FC5,
- 16836: 0x4FDA,
- 16837: 0x4FE3,
- 16838: 0x4FDC,
- 16839: 0x4FD1,
- 16840: 0x4FDF,
- 16841: 0x4FF8,
- 16842: 0x5029,
- 16843: 0x504C,
- 16844: 0x4FF3,
- 16845: 0x502C,
- 16846: 0x500F,
- 16847: 0x502E,
- 16848: 0x502D,
- 16849: 0x4FFE,
- 16850: 0x501C,
- 16851: 0x500C,
- 16852: 0x5025,
- 16853: 0x5028,
- 16854: 0x507E,
- 16855: 0x5043,
- 16856: 0x5055,
- 16857: 0x5048,
- 16858: 0x504E,
- 16859: 0x506C,
- 16860: 0x507B,
- 16861: 0x50A5,
- 16862: 0x50A7,
- 16863: 0x50A9,
- 16864: 0x50BA,
- 16865: 0x50D6,
- 16866: 0x5106,
- 16867: 0x50ED,
- 16868: 0x50EC,
- 16869: 0x50E6,
- 16870: 0x50EE,
- 16871: 0x5107,
- 16872: 0x510B,
- 16873: 0x4EDD,
- 16874: 0x6C3D,
- 16875: 0x4F58,
- 16876: 0x4F65,
- 16877: 0x4FCE,
- 16878: 0x9FA0,
- 16879: 0x6C46,
- 16880: 0x7C74,
- 16881: 0x516E,
- 16882: 0x5DFD,
- 16883: 0x9EC9,
- 16884: 0x9998,
- 16885: 0x5181,
- 16886: 0x5914,
- 16887: 0x52F9,
- 16888: 0x530D,
- 16889: 0x8A07,
- 16890: 0x5310,
- 16891: 0x51EB,
- 16892: 0x5919,
- 16893: 0x5155,
- 16894: 0x4EA0,
- 16895: 0x5156,
- 16896: 0x4EB3,
- 16897: 0x886E,
- 16898: 0x88A4,
- 16899: 0x4EB5,
- 16900: 0x8114,
- 16901: 0x88D2,
- 16902: 0x7980,
- 16903: 0x5B34,
- 16904: 0x8803,
- 16905: 0x7FB8,
- 16906: 0x51AB,
- 16907: 0x51B1,
- 16908: 0x51BD,
- 16909: 0x51BC,
- 16910: 0x8D0E,
- 16911: 0x8D0F,
- 16912: 0x8D10,
- 16913: 0x8D11,
- 16914: 0x8D12,
- 16915: 0x8D13,
- 16916: 0x8D14,
- 16917: 0x8D15,
- 16918: 0x8D16,
- 16919: 0x8D17,
- 16920: 0x8D18,
- 16921: 0x8D19,
- 16922: 0x8D1A,
- 16923: 0x8D1B,
- 16924: 0x8D1C,
- 16925: 0x8D20,
- 16926: 0x8D51,
- 16927: 0x8D52,
- 16928: 0x8D57,
- 16929: 0x8D5F,
- 16930: 0x8D65,
- 16931: 0x8D68,
- 16932: 0x8D69,
- 16933: 0x8D6A,
- 16934: 0x8D6C,
- 16935: 0x8D6E,
- 16936: 0x8D6F,
- 16937: 0x8D71,
- 16938: 0x8D72,
- 16939: 0x8D78,
- 16940: 0x8D79,
- 16941: 0x8D7A,
- 16942: 0x8D7B,
- 16943: 0x8D7C,
- 16944: 0x8D7D,
- 16945: 0x8D7E,
- 16946: 0x8D7F,
- 16947: 0x8D80,
- 16948: 0x8D82,
- 16949: 0x8D83,
- 16950: 0x8D86,
- 16951: 0x8D87,
- 16952: 0x8D88,
- 16953: 0x8D89,
- 16954: 0x8D8C,
- 16955: 0x8D8D,
- 16956: 0x8D8E,
- 16957: 0x8D8F,
- 16958: 0x8D90,
- 16959: 0x8D92,
- 16960: 0x8D93,
- 16961: 0x8D95,
- 16962: 0x8D96,
- 16963: 0x8D97,
- 16964: 0x8D98,
- 16965: 0x8D99,
- 16966: 0x8D9A,
- 16967: 0x8D9B,
- 16968: 0x8D9C,
- 16969: 0x8D9D,
- 16970: 0x8D9E,
- 16971: 0x8DA0,
- 16972: 0x8DA1,
- 16973: 0x8DA2,
- 16974: 0x8DA4,
- 16975: 0x8DA5,
- 16976: 0x8DA6,
- 16977: 0x8DA7,
- 16978: 0x8DA8,
- 16979: 0x8DA9,
- 16980: 0x8DAA,
- 16981: 0x8DAB,
- 16982: 0x8DAC,
- 16983: 0x8DAD,
- 16984: 0x8DAE,
- 16985: 0x8DAF,
- 16986: 0x8DB0,
- 16987: 0x8DB2,
- 16988: 0x8DB6,
- 16989: 0x8DB7,
- 16990: 0x8DB9,
- 16991: 0x8DBB,
- 16992: 0x8DBD,
- 16993: 0x8DC0,
- 16994: 0x8DC1,
- 16995: 0x8DC2,
- 16996: 0x8DC5,
- 16997: 0x8DC7,
- 16998: 0x8DC8,
- 16999: 0x8DC9,
- 17000: 0x8DCA,
- 17001: 0x8DCD,
- 17002: 0x8DD0,
- 17003: 0x8DD2,
- 17004: 0x8DD3,
- 17005: 0x8DD4,
- 17006: 0x51C7,
- 17007: 0x5196,
- 17008: 0x51A2,
- 17009: 0x51A5,
- 17010: 0x8BA0,
- 17011: 0x8BA6,
- 17012: 0x8BA7,
- 17013: 0x8BAA,
- 17014: 0x8BB4,
- 17015: 0x8BB5,
- 17016: 0x8BB7,
- 17017: 0x8BC2,
- 17018: 0x8BC3,
- 17019: 0x8BCB,
- 17020: 0x8BCF,
- 17021: 0x8BCE,
- 17022: 0x8BD2,
- 17023: 0x8BD3,
- 17024: 0x8BD4,
- 17025: 0x8BD6,
- 17026: 0x8BD8,
- 17027: 0x8BD9,
- 17028: 0x8BDC,
- 17029: 0x8BDF,
- 17030: 0x8BE0,
- 17031: 0x8BE4,
- 17032: 0x8BE8,
- 17033: 0x8BE9,
- 17034: 0x8BEE,
- 17035: 0x8BF0,
- 17036: 0x8BF3,
- 17037: 0x8BF6,
- 17038: 0x8BF9,
- 17039: 0x8BFC,
- 17040: 0x8BFF,
- 17041: 0x8C00,
- 17042: 0x8C02,
- 17043: 0x8C04,
- 17044: 0x8C07,
- 17045: 0x8C0C,
- 17046: 0x8C0F,
- 17047: 0x8C11,
- 17048: 0x8C12,
- 17049: 0x8C14,
- 17050: 0x8C15,
- 17051: 0x8C16,
- 17052: 0x8C19,
- 17053: 0x8C1B,
- 17054: 0x8C18,
- 17055: 0x8C1D,
- 17056: 0x8C1F,
- 17057: 0x8C20,
- 17058: 0x8C21,
- 17059: 0x8C25,
- 17060: 0x8C27,
- 17061: 0x8C2A,
- 17062: 0x8C2B,
- 17063: 0x8C2E,
- 17064: 0x8C2F,
- 17065: 0x8C32,
- 17066: 0x8C33,
- 17067: 0x8C35,
- 17068: 0x8C36,
- 17069: 0x5369,
- 17070: 0x537A,
- 17071: 0x961D,
- 17072: 0x9622,
- 17073: 0x9621,
- 17074: 0x9631,
- 17075: 0x962A,
- 17076: 0x963D,
- 17077: 0x963C,
- 17078: 0x9642,
- 17079: 0x9649,
- 17080: 0x9654,
- 17081: 0x965F,
- 17082: 0x9667,
- 17083: 0x966C,
- 17084: 0x9672,
- 17085: 0x9674,
- 17086: 0x9688,
- 17087: 0x968D,
- 17088: 0x9697,
- 17089: 0x96B0,
- 17090: 0x9097,
- 17091: 0x909B,
- 17092: 0x909D,
- 17093: 0x9099,
- 17094: 0x90AC,
- 17095: 0x90A1,
- 17096: 0x90B4,
- 17097: 0x90B3,
- 17098: 0x90B6,
- 17099: 0x90BA,
- 17100: 0x8DD5,
- 17101: 0x8DD8,
- 17102: 0x8DD9,
- 17103: 0x8DDC,
- 17104: 0x8DE0,
- 17105: 0x8DE1,
- 17106: 0x8DE2,
- 17107: 0x8DE5,
- 17108: 0x8DE6,
- 17109: 0x8DE7,
- 17110: 0x8DE9,
- 17111: 0x8DED,
- 17112: 0x8DEE,
- 17113: 0x8DF0,
- 17114: 0x8DF1,
- 17115: 0x8DF2,
- 17116: 0x8DF4,
- 17117: 0x8DF6,
- 17118: 0x8DFC,
- 17119: 0x8DFE,
- 17120: 0x8DFF,
- 17121: 0x8E00,
- 17122: 0x8E01,
- 17123: 0x8E02,
- 17124: 0x8E03,
- 17125: 0x8E04,
- 17126: 0x8E06,
- 17127: 0x8E07,
- 17128: 0x8E08,
- 17129: 0x8E0B,
- 17130: 0x8E0D,
- 17131: 0x8E0E,
- 17132: 0x8E10,
- 17133: 0x8E11,
- 17134: 0x8E12,
- 17135: 0x8E13,
- 17136: 0x8E15,
- 17137: 0x8E16,
- 17138: 0x8E17,
- 17139: 0x8E18,
- 17140: 0x8E19,
- 17141: 0x8E1A,
- 17142: 0x8E1B,
- 17143: 0x8E1C,
- 17144: 0x8E20,
- 17145: 0x8E21,
- 17146: 0x8E24,
- 17147: 0x8E25,
- 17148: 0x8E26,
- 17149: 0x8E27,
- 17150: 0x8E28,
- 17151: 0x8E2B,
- 17152: 0x8E2D,
- 17153: 0x8E30,
- 17154: 0x8E32,
- 17155: 0x8E33,
- 17156: 0x8E34,
- 17157: 0x8E36,
- 17158: 0x8E37,
- 17159: 0x8E38,
- 17160: 0x8E3B,
- 17161: 0x8E3C,
- 17162: 0x8E3E,
- 17163: 0x8E3F,
- 17164: 0x8E43,
- 17165: 0x8E45,
- 17166: 0x8E46,
- 17167: 0x8E4C,
- 17168: 0x8E4D,
- 17169: 0x8E4E,
- 17170: 0x8E4F,
- 17171: 0x8E50,
- 17172: 0x8E53,
- 17173: 0x8E54,
- 17174: 0x8E55,
- 17175: 0x8E56,
- 17176: 0x8E57,
- 17177: 0x8E58,
- 17178: 0x8E5A,
- 17179: 0x8E5B,
- 17180: 0x8E5C,
- 17181: 0x8E5D,
- 17182: 0x8E5E,
- 17183: 0x8E5F,
- 17184: 0x8E60,
- 17185: 0x8E61,
- 17186: 0x8E62,
- 17187: 0x8E63,
- 17188: 0x8E64,
- 17189: 0x8E65,
- 17190: 0x8E67,
- 17191: 0x8E68,
- 17192: 0x8E6A,
- 17193: 0x8E6B,
- 17194: 0x8E6E,
- 17195: 0x8E71,
- 17196: 0x90B8,
- 17197: 0x90B0,
- 17198: 0x90CF,
- 17199: 0x90C5,
- 17200: 0x90BE,
- 17201: 0x90D0,
- 17202: 0x90C4,
- 17203: 0x90C7,
- 17204: 0x90D3,
- 17205: 0x90E6,
- 17206: 0x90E2,
- 17207: 0x90DC,
- 17208: 0x90D7,
- 17209: 0x90DB,
- 17210: 0x90EB,
- 17211: 0x90EF,
- 17212: 0x90FE,
- 17213: 0x9104,
- 17214: 0x9122,
- 17215: 0x911E,
- 17216: 0x9123,
- 17217: 0x9131,
- 17218: 0x912F,
- 17219: 0x9139,
- 17220: 0x9143,
- 17221: 0x9146,
- 17222: 0x520D,
- 17223: 0x5942,
- 17224: 0x52A2,
- 17225: 0x52AC,
- 17226: 0x52AD,
- 17227: 0x52BE,
- 17228: 0x54FF,
- 17229: 0x52D0,
- 17230: 0x52D6,
- 17231: 0x52F0,
- 17232: 0x53DF,
- 17233: 0x71EE,
- 17234: 0x77CD,
- 17235: 0x5EF4,
- 17236: 0x51F5,
- 17237: 0x51FC,
- 17238: 0x9B2F,
- 17239: 0x53B6,
- 17240: 0x5F01,
- 17241: 0x755A,
- 17242: 0x5DEF,
- 17243: 0x574C,
- 17244: 0x57A9,
- 17245: 0x57A1,
- 17246: 0x587E,
- 17247: 0x58BC,
- 17248: 0x58C5,
- 17249: 0x58D1,
- 17250: 0x5729,
- 17251: 0x572C,
- 17252: 0x572A,
- 17253: 0x5733,
- 17254: 0x5739,
- 17255: 0x572E,
- 17256: 0x572F,
- 17257: 0x575C,
- 17258: 0x573B,
- 17259: 0x5742,
- 17260: 0x5769,
- 17261: 0x5785,
- 17262: 0x576B,
- 17263: 0x5786,
- 17264: 0x577C,
- 17265: 0x577B,
- 17266: 0x5768,
- 17267: 0x576D,
- 17268: 0x5776,
- 17269: 0x5773,
- 17270: 0x57AD,
- 17271: 0x57A4,
- 17272: 0x578C,
- 17273: 0x57B2,
- 17274: 0x57CF,
- 17275: 0x57A7,
- 17276: 0x57B4,
- 17277: 0x5793,
- 17278: 0x57A0,
- 17279: 0x57D5,
- 17280: 0x57D8,
- 17281: 0x57DA,
- 17282: 0x57D9,
- 17283: 0x57D2,
- 17284: 0x57B8,
- 17285: 0x57F4,
- 17286: 0x57EF,
- 17287: 0x57F8,
- 17288: 0x57E4,
- 17289: 0x57DD,
- 17290: 0x8E73,
- 17291: 0x8E75,
- 17292: 0x8E77,
- 17293: 0x8E78,
- 17294: 0x8E79,
- 17295: 0x8E7A,
- 17296: 0x8E7B,
- 17297: 0x8E7D,
- 17298: 0x8E7E,
- 17299: 0x8E80,
- 17300: 0x8E82,
- 17301: 0x8E83,
- 17302: 0x8E84,
- 17303: 0x8E86,
- 17304: 0x8E88,
- 17305: 0x8E89,
- 17306: 0x8E8A,
- 17307: 0x8E8B,
- 17308: 0x8E8C,
- 17309: 0x8E8D,
- 17310: 0x8E8E,
- 17311: 0x8E91,
- 17312: 0x8E92,
- 17313: 0x8E93,
- 17314: 0x8E95,
- 17315: 0x8E96,
- 17316: 0x8E97,
- 17317: 0x8E98,
- 17318: 0x8E99,
- 17319: 0x8E9A,
- 17320: 0x8E9B,
- 17321: 0x8E9D,
- 17322: 0x8E9F,
- 17323: 0x8EA0,
- 17324: 0x8EA1,
- 17325: 0x8EA2,
- 17326: 0x8EA3,
- 17327: 0x8EA4,
- 17328: 0x8EA5,
- 17329: 0x8EA6,
- 17330: 0x8EA7,
- 17331: 0x8EA8,
- 17332: 0x8EA9,
- 17333: 0x8EAA,
- 17334: 0x8EAD,
- 17335: 0x8EAE,
- 17336: 0x8EB0,
- 17337: 0x8EB1,
- 17338: 0x8EB3,
- 17339: 0x8EB4,
- 17340: 0x8EB5,
- 17341: 0x8EB6,
- 17342: 0x8EB7,
- 17343: 0x8EB8,
- 17344: 0x8EB9,
- 17345: 0x8EBB,
- 17346: 0x8EBC,
- 17347: 0x8EBD,
- 17348: 0x8EBE,
- 17349: 0x8EBF,
- 17350: 0x8EC0,
- 17351: 0x8EC1,
- 17352: 0x8EC2,
- 17353: 0x8EC3,
- 17354: 0x8EC4,
- 17355: 0x8EC5,
- 17356: 0x8EC6,
- 17357: 0x8EC7,
- 17358: 0x8EC8,
- 17359: 0x8EC9,
- 17360: 0x8ECA,
- 17361: 0x8ECB,
- 17362: 0x8ECC,
- 17363: 0x8ECD,
- 17364: 0x8ECF,
- 17365: 0x8ED0,
- 17366: 0x8ED1,
- 17367: 0x8ED2,
- 17368: 0x8ED3,
- 17369: 0x8ED4,
- 17370: 0x8ED5,
- 17371: 0x8ED6,
- 17372: 0x8ED7,
- 17373: 0x8ED8,
- 17374: 0x8ED9,
- 17375: 0x8EDA,
- 17376: 0x8EDB,
- 17377: 0x8EDC,
- 17378: 0x8EDD,
- 17379: 0x8EDE,
- 17380: 0x8EDF,
- 17381: 0x8EE0,
- 17382: 0x8EE1,
- 17383: 0x8EE2,
- 17384: 0x8EE3,
- 17385: 0x8EE4,
- 17386: 0x580B,
- 17387: 0x580D,
- 17388: 0x57FD,
- 17389: 0x57ED,
- 17390: 0x5800,
- 17391: 0x581E,
- 17392: 0x5819,
- 17393: 0x5844,
- 17394: 0x5820,
- 17395: 0x5865,
- 17396: 0x586C,
- 17397: 0x5881,
- 17398: 0x5889,
- 17399: 0x589A,
- 17400: 0x5880,
- 17401: 0x99A8,
- 17402: 0x9F19,
- 17403: 0x61FF,
- 17404: 0x8279,
- 17405: 0x827D,
- 17406: 0x827F,
- 17407: 0x828F,
- 17408: 0x828A,
- 17409: 0x82A8,
- 17410: 0x8284,
- 17411: 0x828E,
- 17412: 0x8291,
- 17413: 0x8297,
- 17414: 0x8299,
- 17415: 0x82AB,
- 17416: 0x82B8,
- 17417: 0x82BE,
- 17418: 0x82B0,
- 17419: 0x82C8,
- 17420: 0x82CA,
- 17421: 0x82E3,
- 17422: 0x8298,
- 17423: 0x82B7,
- 17424: 0x82AE,
- 17425: 0x82CB,
- 17426: 0x82CC,
- 17427: 0x82C1,
- 17428: 0x82A9,
- 17429: 0x82B4,
- 17430: 0x82A1,
- 17431: 0x82AA,
- 17432: 0x829F,
- 17433: 0x82C4,
- 17434: 0x82CE,
- 17435: 0x82A4,
- 17436: 0x82E1,
- 17437: 0x8309,
- 17438: 0x82F7,
- 17439: 0x82E4,
- 17440: 0x830F,
- 17441: 0x8307,
- 17442: 0x82DC,
- 17443: 0x82F4,
- 17444: 0x82D2,
- 17445: 0x82D8,
- 17446: 0x830C,
- 17447: 0x82FB,
- 17448: 0x82D3,
- 17449: 0x8311,
- 17450: 0x831A,
- 17451: 0x8306,
- 17452: 0x8314,
- 17453: 0x8315,
- 17454: 0x82E0,
- 17455: 0x82D5,
- 17456: 0x831C,
- 17457: 0x8351,
- 17458: 0x835B,
- 17459: 0x835C,
- 17460: 0x8308,
- 17461: 0x8392,
- 17462: 0x833C,
- 17463: 0x8334,
- 17464: 0x8331,
- 17465: 0x839B,
- 17466: 0x835E,
- 17467: 0x832F,
- 17468: 0x834F,
- 17469: 0x8347,
- 17470: 0x8343,
- 17471: 0x835F,
- 17472: 0x8340,
- 17473: 0x8317,
- 17474: 0x8360,
- 17475: 0x832D,
- 17476: 0x833A,
- 17477: 0x8333,
- 17478: 0x8366,
- 17479: 0x8365,
- 17480: 0x8EE5,
- 17481: 0x8EE6,
- 17482: 0x8EE7,
- 17483: 0x8EE8,
- 17484: 0x8EE9,
- 17485: 0x8EEA,
- 17486: 0x8EEB,
- 17487: 0x8EEC,
- 17488: 0x8EED,
- 17489: 0x8EEE,
- 17490: 0x8EEF,
- 17491: 0x8EF0,
- 17492: 0x8EF1,
- 17493: 0x8EF2,
- 17494: 0x8EF3,
- 17495: 0x8EF4,
- 17496: 0x8EF5,
- 17497: 0x8EF6,
- 17498: 0x8EF7,
- 17499: 0x8EF8,
- 17500: 0x8EF9,
- 17501: 0x8EFA,
- 17502: 0x8EFB,
- 17503: 0x8EFC,
- 17504: 0x8EFD,
- 17505: 0x8EFE,
- 17506: 0x8EFF,
- 17507: 0x8F00,
- 17508: 0x8F01,
- 17509: 0x8F02,
- 17510: 0x8F03,
- 17511: 0x8F04,
- 17512: 0x8F05,
- 17513: 0x8F06,
- 17514: 0x8F07,
- 17515: 0x8F08,
- 17516: 0x8F09,
- 17517: 0x8F0A,
- 17518: 0x8F0B,
- 17519: 0x8F0C,
- 17520: 0x8F0D,
- 17521: 0x8F0E,
- 17522: 0x8F0F,
- 17523: 0x8F10,
- 17524: 0x8F11,
- 17525: 0x8F12,
- 17526: 0x8F13,
- 17527: 0x8F14,
- 17528: 0x8F15,
- 17529: 0x8F16,
- 17530: 0x8F17,
- 17531: 0x8F18,
- 17532: 0x8F19,
- 17533: 0x8F1A,
- 17534: 0x8F1B,
- 17535: 0x8F1C,
- 17536: 0x8F1D,
- 17537: 0x8F1E,
- 17538: 0x8F1F,
- 17539: 0x8F20,
- 17540: 0x8F21,
- 17541: 0x8F22,
- 17542: 0x8F23,
- 17543: 0x8F24,
- 17544: 0x8F25,
- 17545: 0x8F26,
- 17546: 0x8F27,
- 17547: 0x8F28,
- 17548: 0x8F29,
- 17549: 0x8F2A,
- 17550: 0x8F2B,
- 17551: 0x8F2C,
- 17552: 0x8F2D,
- 17553: 0x8F2E,
- 17554: 0x8F2F,
- 17555: 0x8F30,
- 17556: 0x8F31,
- 17557: 0x8F32,
- 17558: 0x8F33,
- 17559: 0x8F34,
- 17560: 0x8F35,
- 17561: 0x8F36,
- 17562: 0x8F37,
- 17563: 0x8F38,
- 17564: 0x8F39,
- 17565: 0x8F3A,
- 17566: 0x8F3B,
- 17567: 0x8F3C,
- 17568: 0x8F3D,
- 17569: 0x8F3E,
- 17570: 0x8F3F,
- 17571: 0x8F40,
- 17572: 0x8F41,
- 17573: 0x8F42,
- 17574: 0x8F43,
- 17575: 0x8F44,
- 17576: 0x8368,
- 17577: 0x831B,
- 17578: 0x8369,
- 17579: 0x836C,
- 17580: 0x836A,
- 17581: 0x836D,
- 17582: 0x836E,
- 17583: 0x83B0,
- 17584: 0x8378,
- 17585: 0x83B3,
- 17586: 0x83B4,
- 17587: 0x83A0,
- 17588: 0x83AA,
- 17589: 0x8393,
- 17590: 0x839C,
- 17591: 0x8385,
- 17592: 0x837C,
- 17593: 0x83B6,
- 17594: 0x83A9,
- 17595: 0x837D,
- 17596: 0x83B8,
- 17597: 0x837B,
- 17598: 0x8398,
- 17599: 0x839E,
- 17600: 0x83A8,
- 17601: 0x83BA,
- 17602: 0x83BC,
- 17603: 0x83C1,
- 17604: 0x8401,
- 17605: 0x83E5,
- 17606: 0x83D8,
- 17607: 0x5807,
- 17608: 0x8418,
- 17609: 0x840B,
- 17610: 0x83DD,
- 17611: 0x83FD,
- 17612: 0x83D6,
- 17613: 0x841C,
- 17614: 0x8438,
- 17615: 0x8411,
- 17616: 0x8406,
- 17617: 0x83D4,
- 17618: 0x83DF,
- 17619: 0x840F,
- 17620: 0x8403,
- 17621: 0x83F8,
- 17622: 0x83F9,
- 17623: 0x83EA,
- 17624: 0x83C5,
- 17625: 0x83C0,
- 17626: 0x8426,
- 17627: 0x83F0,
- 17628: 0x83E1,
- 17629: 0x845C,
- 17630: 0x8451,
- 17631: 0x845A,
- 17632: 0x8459,
- 17633: 0x8473,
- 17634: 0x8487,
- 17635: 0x8488,
- 17636: 0x847A,
- 17637: 0x8489,
- 17638: 0x8478,
- 17639: 0x843C,
- 17640: 0x8446,
- 17641: 0x8469,
- 17642: 0x8476,
- 17643: 0x848C,
- 17644: 0x848E,
- 17645: 0x8431,
- 17646: 0x846D,
- 17647: 0x84C1,
- 17648: 0x84CD,
- 17649: 0x84D0,
- 17650: 0x84E6,
- 17651: 0x84BD,
- 17652: 0x84D3,
- 17653: 0x84CA,
- 17654: 0x84BF,
- 17655: 0x84BA,
- 17656: 0x84E0,
- 17657: 0x84A1,
- 17658: 0x84B9,
- 17659: 0x84B4,
- 17660: 0x8497,
- 17661: 0x84E5,
- 17662: 0x84E3,
- 17663: 0x850C,
- 17664: 0x750D,
- 17665: 0x8538,
- 17666: 0x84F0,
- 17667: 0x8539,
- 17668: 0x851F,
- 17669: 0x853A,
- 17670: 0x8F45,
- 17671: 0x8F46,
- 17672: 0x8F47,
- 17673: 0x8F48,
- 17674: 0x8F49,
- 17675: 0x8F4A,
- 17676: 0x8F4B,
- 17677: 0x8F4C,
- 17678: 0x8F4D,
- 17679: 0x8F4E,
- 17680: 0x8F4F,
- 17681: 0x8F50,
- 17682: 0x8F51,
- 17683: 0x8F52,
- 17684: 0x8F53,
- 17685: 0x8F54,
- 17686: 0x8F55,
- 17687: 0x8F56,
- 17688: 0x8F57,
- 17689: 0x8F58,
- 17690: 0x8F59,
- 17691: 0x8F5A,
- 17692: 0x8F5B,
- 17693: 0x8F5C,
- 17694: 0x8F5D,
- 17695: 0x8F5E,
- 17696: 0x8F5F,
- 17697: 0x8F60,
- 17698: 0x8F61,
- 17699: 0x8F62,
- 17700: 0x8F63,
- 17701: 0x8F64,
- 17702: 0x8F65,
- 17703: 0x8F6A,
- 17704: 0x8F80,
- 17705: 0x8F8C,
- 17706: 0x8F92,
- 17707: 0x8F9D,
- 17708: 0x8FA0,
- 17709: 0x8FA1,
- 17710: 0x8FA2,
- 17711: 0x8FA4,
- 17712: 0x8FA5,
- 17713: 0x8FA6,
- 17714: 0x8FA7,
- 17715: 0x8FAA,
- 17716: 0x8FAC,
- 17717: 0x8FAD,
- 17718: 0x8FAE,
- 17719: 0x8FAF,
- 17720: 0x8FB2,
- 17721: 0x8FB3,
- 17722: 0x8FB4,
- 17723: 0x8FB5,
- 17724: 0x8FB7,
- 17725: 0x8FB8,
- 17726: 0x8FBA,
- 17727: 0x8FBB,
- 17728: 0x8FBC,
- 17729: 0x8FBF,
- 17730: 0x8FC0,
- 17731: 0x8FC3,
- 17732: 0x8FC6,
- 17733: 0x8FC9,
- 17734: 0x8FCA,
- 17735: 0x8FCB,
- 17736: 0x8FCC,
- 17737: 0x8FCD,
- 17738: 0x8FCF,
- 17739: 0x8FD2,
- 17740: 0x8FD6,
- 17741: 0x8FD7,
- 17742: 0x8FDA,
- 17743: 0x8FE0,
- 17744: 0x8FE1,
- 17745: 0x8FE3,
- 17746: 0x8FE7,
- 17747: 0x8FEC,
- 17748: 0x8FEF,
- 17749: 0x8FF1,
- 17750: 0x8FF2,
- 17751: 0x8FF4,
- 17752: 0x8FF5,
- 17753: 0x8FF6,
- 17754: 0x8FFA,
- 17755: 0x8FFB,
- 17756: 0x8FFC,
- 17757: 0x8FFE,
- 17758: 0x8FFF,
- 17759: 0x9007,
- 17760: 0x9008,
- 17761: 0x900C,
- 17762: 0x900E,
- 17763: 0x9013,
- 17764: 0x9015,
- 17765: 0x9018,
- 17766: 0x8556,
- 17767: 0x853B,
- 17768: 0x84FF,
- 17769: 0x84FC,
- 17770: 0x8559,
- 17771: 0x8548,
- 17772: 0x8568,
- 17773: 0x8564,
- 17774: 0x855E,
- 17775: 0x857A,
- 17776: 0x77A2,
- 17777: 0x8543,
- 17778: 0x8572,
- 17779: 0x857B,
- 17780: 0x85A4,
- 17781: 0x85A8,
- 17782: 0x8587,
- 17783: 0x858F,
- 17784: 0x8579,
- 17785: 0x85AE,
- 17786: 0x859C,
- 17787: 0x8585,
- 17788: 0x85B9,
- 17789: 0x85B7,
- 17790: 0x85B0,
- 17791: 0x85D3,
- 17792: 0x85C1,
- 17793: 0x85DC,
- 17794: 0x85FF,
- 17795: 0x8627,
- 17796: 0x8605,
- 17797: 0x8629,
- 17798: 0x8616,
- 17799: 0x863C,
- 17800: 0x5EFE,
- 17801: 0x5F08,
- 17802: 0x593C,
- 17803: 0x5941,
- 17804: 0x8037,
- 17805: 0x5955,
- 17806: 0x595A,
- 17807: 0x5958,
- 17808: 0x530F,
- 17809: 0x5C22,
- 17810: 0x5C25,
- 17811: 0x5C2C,
- 17812: 0x5C34,
- 17813: 0x624C,
- 17814: 0x626A,
- 17815: 0x629F,
- 17816: 0x62BB,
- 17817: 0x62CA,
- 17818: 0x62DA,
- 17819: 0x62D7,
- 17820: 0x62EE,
- 17821: 0x6322,
- 17822: 0x62F6,
- 17823: 0x6339,
- 17824: 0x634B,
- 17825: 0x6343,
- 17826: 0x63AD,
- 17827: 0x63F6,
- 17828: 0x6371,
- 17829: 0x637A,
- 17830: 0x638E,
- 17831: 0x63B4,
- 17832: 0x636D,
- 17833: 0x63AC,
- 17834: 0x638A,
- 17835: 0x6369,
- 17836: 0x63AE,
- 17837: 0x63BC,
- 17838: 0x63F2,
- 17839: 0x63F8,
- 17840: 0x63E0,
- 17841: 0x63FF,
- 17842: 0x63C4,
- 17843: 0x63DE,
- 17844: 0x63CE,
- 17845: 0x6452,
- 17846: 0x63C6,
- 17847: 0x63BE,
- 17848: 0x6445,
- 17849: 0x6441,
- 17850: 0x640B,
- 17851: 0x641B,
- 17852: 0x6420,
- 17853: 0x640C,
- 17854: 0x6426,
- 17855: 0x6421,
- 17856: 0x645E,
- 17857: 0x6484,
- 17858: 0x646D,
- 17859: 0x6496,
- 17860: 0x9019,
- 17861: 0x901C,
- 17862: 0x9023,
- 17863: 0x9024,
- 17864: 0x9025,
- 17865: 0x9027,
- 17866: 0x9028,
- 17867: 0x9029,
- 17868: 0x902A,
- 17869: 0x902B,
- 17870: 0x902C,
- 17871: 0x9030,
- 17872: 0x9031,
- 17873: 0x9032,
- 17874: 0x9033,
- 17875: 0x9034,
- 17876: 0x9037,
- 17877: 0x9039,
- 17878: 0x903A,
- 17879: 0x903D,
- 17880: 0x903F,
- 17881: 0x9040,
- 17882: 0x9043,
- 17883: 0x9045,
- 17884: 0x9046,
- 17885: 0x9048,
- 17886: 0x9049,
- 17887: 0x904A,
- 17888: 0x904B,
- 17889: 0x904C,
- 17890: 0x904E,
- 17891: 0x9054,
- 17892: 0x9055,
- 17893: 0x9056,
- 17894: 0x9059,
- 17895: 0x905A,
- 17896: 0x905C,
- 17897: 0x905D,
- 17898: 0x905E,
- 17899: 0x905F,
- 17900: 0x9060,
- 17901: 0x9061,
- 17902: 0x9064,
- 17903: 0x9066,
- 17904: 0x9067,
- 17905: 0x9069,
- 17906: 0x906A,
- 17907: 0x906B,
- 17908: 0x906C,
- 17909: 0x906F,
- 17910: 0x9070,
- 17911: 0x9071,
- 17912: 0x9072,
- 17913: 0x9073,
- 17914: 0x9076,
- 17915: 0x9077,
- 17916: 0x9078,
- 17917: 0x9079,
- 17918: 0x907A,
- 17919: 0x907B,
- 17920: 0x907C,
- 17921: 0x907E,
- 17922: 0x9081,
- 17923: 0x9084,
- 17924: 0x9085,
- 17925: 0x9086,
- 17926: 0x9087,
- 17927: 0x9089,
- 17928: 0x908A,
- 17929: 0x908C,
- 17930: 0x908D,
- 17931: 0x908E,
- 17932: 0x908F,
- 17933: 0x9090,
- 17934: 0x9092,
- 17935: 0x9094,
- 17936: 0x9096,
- 17937: 0x9098,
- 17938: 0x909A,
- 17939: 0x909C,
- 17940: 0x909E,
- 17941: 0x909F,
- 17942: 0x90A0,
- 17943: 0x90A4,
- 17944: 0x90A5,
- 17945: 0x90A7,
- 17946: 0x90A8,
- 17947: 0x90A9,
- 17948: 0x90AB,
- 17949: 0x90AD,
- 17950: 0x90B2,
- 17951: 0x90B7,
- 17952: 0x90BC,
- 17953: 0x90BD,
- 17954: 0x90BF,
- 17955: 0x90C0,
- 17956: 0x647A,
- 17957: 0x64B7,
- 17958: 0x64B8,
- 17959: 0x6499,
- 17960: 0x64BA,
- 17961: 0x64C0,
- 17962: 0x64D0,
- 17963: 0x64D7,
- 17964: 0x64E4,
- 17965: 0x64E2,
- 17966: 0x6509,
- 17967: 0x6525,
- 17968: 0x652E,
- 17969: 0x5F0B,
- 17970: 0x5FD2,
- 17971: 0x7519,
- 17972: 0x5F11,
- 17973: 0x535F,
- 17974: 0x53F1,
- 17975: 0x53FD,
- 17976: 0x53E9,
- 17977: 0x53E8,
- 17978: 0x53FB,
- 17979: 0x5412,
- 17980: 0x5416,
- 17981: 0x5406,
- 17982: 0x544B,
- 17983: 0x5452,
- 17984: 0x5453,
- 17985: 0x5454,
- 17986: 0x5456,
- 17987: 0x5443,
- 17988: 0x5421,
- 17989: 0x5457,
- 17990: 0x5459,
- 17991: 0x5423,
- 17992: 0x5432,
- 17993: 0x5482,
- 17994: 0x5494,
- 17995: 0x5477,
- 17996: 0x5471,
- 17997: 0x5464,
- 17998: 0x549A,
- 17999: 0x549B,
- 18000: 0x5484,
- 18001: 0x5476,
- 18002: 0x5466,
- 18003: 0x549D,
- 18004: 0x54D0,
- 18005: 0x54AD,
- 18006: 0x54C2,
- 18007: 0x54B4,
- 18008: 0x54D2,
- 18009: 0x54A7,
- 18010: 0x54A6,
- 18011: 0x54D3,
- 18012: 0x54D4,
- 18013: 0x5472,
- 18014: 0x54A3,
- 18015: 0x54D5,
- 18016: 0x54BB,
- 18017: 0x54BF,
- 18018: 0x54CC,
- 18019: 0x54D9,
- 18020: 0x54DA,
- 18021: 0x54DC,
- 18022: 0x54A9,
- 18023: 0x54AA,
- 18024: 0x54A4,
- 18025: 0x54DD,
- 18026: 0x54CF,
- 18027: 0x54DE,
- 18028: 0x551B,
- 18029: 0x54E7,
- 18030: 0x5520,
- 18031: 0x54FD,
- 18032: 0x5514,
- 18033: 0x54F3,
- 18034: 0x5522,
- 18035: 0x5523,
- 18036: 0x550F,
- 18037: 0x5511,
- 18038: 0x5527,
- 18039: 0x552A,
- 18040: 0x5567,
- 18041: 0x558F,
- 18042: 0x55B5,
- 18043: 0x5549,
- 18044: 0x556D,
- 18045: 0x5541,
- 18046: 0x5555,
- 18047: 0x553F,
- 18048: 0x5550,
- 18049: 0x553C,
- 18050: 0x90C2,
- 18051: 0x90C3,
- 18052: 0x90C6,
- 18053: 0x90C8,
- 18054: 0x90C9,
- 18055: 0x90CB,
- 18056: 0x90CC,
- 18057: 0x90CD,
- 18058: 0x90D2,
- 18059: 0x90D4,
- 18060: 0x90D5,
- 18061: 0x90D6,
- 18062: 0x90D8,
- 18063: 0x90D9,
- 18064: 0x90DA,
- 18065: 0x90DE,
- 18066: 0x90DF,
- 18067: 0x90E0,
- 18068: 0x90E3,
- 18069: 0x90E4,
- 18070: 0x90E5,
- 18071: 0x90E9,
- 18072: 0x90EA,
- 18073: 0x90EC,
- 18074: 0x90EE,
- 18075: 0x90F0,
- 18076: 0x90F1,
- 18077: 0x90F2,
- 18078: 0x90F3,
- 18079: 0x90F5,
- 18080: 0x90F6,
- 18081: 0x90F7,
- 18082: 0x90F9,
- 18083: 0x90FA,
- 18084: 0x90FB,
- 18085: 0x90FC,
- 18086: 0x90FF,
- 18087: 0x9100,
- 18088: 0x9101,
- 18089: 0x9103,
- 18090: 0x9105,
- 18091: 0x9106,
- 18092: 0x9107,
- 18093: 0x9108,
- 18094: 0x9109,
- 18095: 0x910A,
- 18096: 0x910B,
- 18097: 0x910C,
- 18098: 0x910D,
- 18099: 0x910E,
- 18100: 0x910F,
- 18101: 0x9110,
- 18102: 0x9111,
- 18103: 0x9112,
- 18104: 0x9113,
- 18105: 0x9114,
- 18106: 0x9115,
- 18107: 0x9116,
- 18108: 0x9117,
- 18109: 0x9118,
- 18110: 0x911A,
- 18111: 0x911B,
- 18112: 0x911C,
- 18113: 0x911D,
- 18114: 0x911F,
- 18115: 0x9120,
- 18116: 0x9121,
- 18117: 0x9124,
- 18118: 0x9125,
- 18119: 0x9126,
- 18120: 0x9127,
- 18121: 0x9128,
- 18122: 0x9129,
- 18123: 0x912A,
- 18124: 0x912B,
- 18125: 0x912C,
- 18126: 0x912D,
- 18127: 0x912E,
- 18128: 0x9130,
- 18129: 0x9132,
- 18130: 0x9133,
- 18131: 0x9134,
- 18132: 0x9135,
- 18133: 0x9136,
- 18134: 0x9137,
- 18135: 0x9138,
- 18136: 0x913A,
- 18137: 0x913B,
- 18138: 0x913C,
- 18139: 0x913D,
- 18140: 0x913E,
- 18141: 0x913F,
- 18142: 0x9140,
- 18143: 0x9141,
- 18144: 0x9142,
- 18145: 0x9144,
- 18146: 0x5537,
- 18147: 0x5556,
- 18148: 0x5575,
- 18149: 0x5576,
- 18150: 0x5577,
- 18151: 0x5533,
- 18152: 0x5530,
- 18153: 0x555C,
- 18154: 0x558B,
- 18155: 0x55D2,
- 18156: 0x5583,
- 18157: 0x55B1,
- 18158: 0x55B9,
- 18159: 0x5588,
- 18160: 0x5581,
- 18161: 0x559F,
- 18162: 0x557E,
- 18163: 0x55D6,
- 18164: 0x5591,
- 18165: 0x557B,
- 18166: 0x55DF,
- 18167: 0x55BD,
- 18168: 0x55BE,
- 18169: 0x5594,
- 18170: 0x5599,
- 18171: 0x55EA,
- 18172: 0x55F7,
- 18173: 0x55C9,
- 18174: 0x561F,
- 18175: 0x55D1,
- 18176: 0x55EB,
- 18177: 0x55EC,
- 18178: 0x55D4,
- 18179: 0x55E6,
- 18180: 0x55DD,
- 18181: 0x55C4,
- 18182: 0x55EF,
- 18183: 0x55E5,
- 18184: 0x55F2,
- 18185: 0x55F3,
- 18186: 0x55CC,
- 18187: 0x55CD,
- 18188: 0x55E8,
- 18189: 0x55F5,
- 18190: 0x55E4,
- 18191: 0x8F94,
- 18192: 0x561E,
- 18193: 0x5608,
- 18194: 0x560C,
- 18195: 0x5601,
- 18196: 0x5624,
- 18197: 0x5623,
- 18198: 0x55FE,
- 18199: 0x5600,
- 18200: 0x5627,
- 18201: 0x562D,
- 18202: 0x5658,
- 18203: 0x5639,
- 18204: 0x5657,
- 18205: 0x562C,
- 18206: 0x564D,
- 18207: 0x5662,
- 18208: 0x5659,
- 18209: 0x565C,
- 18210: 0x564C,
- 18211: 0x5654,
- 18212: 0x5686,
- 18213: 0x5664,
- 18214: 0x5671,
- 18215: 0x566B,
- 18216: 0x567B,
- 18217: 0x567C,
- 18218: 0x5685,
- 18219: 0x5693,
- 18220: 0x56AF,
- 18221: 0x56D4,
- 18222: 0x56D7,
- 18223: 0x56DD,
- 18224: 0x56E1,
- 18225: 0x56F5,
- 18226: 0x56EB,
- 18227: 0x56F9,
- 18228: 0x56FF,
- 18229: 0x5704,
- 18230: 0x570A,
- 18231: 0x5709,
- 18232: 0x571C,
- 18233: 0x5E0F,
- 18234: 0x5E19,
- 18235: 0x5E14,
- 18236: 0x5E11,
- 18237: 0x5E31,
- 18238: 0x5E3B,
- 18239: 0x5E3C,
- 18240: 0x9145,
- 18241: 0x9147,
- 18242: 0x9148,
- 18243: 0x9151,
- 18244: 0x9153,
- 18245: 0x9154,
- 18246: 0x9155,
- 18247: 0x9156,
- 18248: 0x9158,
- 18249: 0x9159,
- 18250: 0x915B,
- 18251: 0x915C,
- 18252: 0x915F,
- 18253: 0x9160,
- 18254: 0x9166,
- 18255: 0x9167,
- 18256: 0x9168,
- 18257: 0x916B,
- 18258: 0x916D,
- 18259: 0x9173,
- 18260: 0x917A,
- 18261: 0x917B,
- 18262: 0x917C,
- 18263: 0x9180,
- 18264: 0x9181,
- 18265: 0x9182,
- 18266: 0x9183,
- 18267: 0x9184,
- 18268: 0x9186,
- 18269: 0x9188,
- 18270: 0x918A,
- 18271: 0x918E,
- 18272: 0x918F,
- 18273: 0x9193,
- 18274: 0x9194,
- 18275: 0x9195,
- 18276: 0x9196,
- 18277: 0x9197,
- 18278: 0x9198,
- 18279: 0x9199,
- 18280: 0x919C,
- 18281: 0x919D,
- 18282: 0x919E,
- 18283: 0x919F,
- 18284: 0x91A0,
- 18285: 0x91A1,
- 18286: 0x91A4,
- 18287: 0x91A5,
- 18288: 0x91A6,
- 18289: 0x91A7,
- 18290: 0x91A8,
- 18291: 0x91A9,
- 18292: 0x91AB,
- 18293: 0x91AC,
- 18294: 0x91B0,
- 18295: 0x91B1,
- 18296: 0x91B2,
- 18297: 0x91B3,
- 18298: 0x91B6,
- 18299: 0x91B7,
- 18300: 0x91B8,
- 18301: 0x91B9,
- 18302: 0x91BB,
- 18303: 0x91BC,
- 18304: 0x91BD,
- 18305: 0x91BE,
- 18306: 0x91BF,
- 18307: 0x91C0,
- 18308: 0x91C1,
- 18309: 0x91C2,
- 18310: 0x91C3,
- 18311: 0x91C4,
- 18312: 0x91C5,
- 18313: 0x91C6,
- 18314: 0x91C8,
- 18315: 0x91CB,
- 18316: 0x91D0,
- 18317: 0x91D2,
- 18318: 0x91D3,
- 18319: 0x91D4,
- 18320: 0x91D5,
- 18321: 0x91D6,
- 18322: 0x91D7,
- 18323: 0x91D8,
- 18324: 0x91D9,
- 18325: 0x91DA,
- 18326: 0x91DB,
- 18327: 0x91DD,
- 18328: 0x91DE,
- 18329: 0x91DF,
- 18330: 0x91E0,
- 18331: 0x91E1,
- 18332: 0x91E2,
- 18333: 0x91E3,
- 18334: 0x91E4,
- 18335: 0x91E5,
- 18336: 0x5E37,
- 18337: 0x5E44,
- 18338: 0x5E54,
- 18339: 0x5E5B,
- 18340: 0x5E5E,
- 18341: 0x5E61,
- 18342: 0x5C8C,
- 18343: 0x5C7A,
- 18344: 0x5C8D,
- 18345: 0x5C90,
- 18346: 0x5C96,
- 18347: 0x5C88,
- 18348: 0x5C98,
- 18349: 0x5C99,
- 18350: 0x5C91,
- 18351: 0x5C9A,
- 18352: 0x5C9C,
- 18353: 0x5CB5,
- 18354: 0x5CA2,
- 18355: 0x5CBD,
- 18356: 0x5CAC,
- 18357: 0x5CAB,
- 18358: 0x5CB1,
- 18359: 0x5CA3,
- 18360: 0x5CC1,
- 18361: 0x5CB7,
- 18362: 0x5CC4,
- 18363: 0x5CD2,
- 18364: 0x5CE4,
- 18365: 0x5CCB,
- 18366: 0x5CE5,
- 18367: 0x5D02,
- 18368: 0x5D03,
- 18369: 0x5D27,
- 18370: 0x5D26,
- 18371: 0x5D2E,
- 18372: 0x5D24,
- 18373: 0x5D1E,
- 18374: 0x5D06,
- 18375: 0x5D1B,
- 18376: 0x5D58,
- 18377: 0x5D3E,
- 18378: 0x5D34,
- 18379: 0x5D3D,
- 18380: 0x5D6C,
- 18381: 0x5D5B,
- 18382: 0x5D6F,
- 18383: 0x5D5D,
- 18384: 0x5D6B,
- 18385: 0x5D4B,
- 18386: 0x5D4A,
- 18387: 0x5D69,
- 18388: 0x5D74,
- 18389: 0x5D82,
- 18390: 0x5D99,
- 18391: 0x5D9D,
- 18392: 0x8C73,
- 18393: 0x5DB7,
- 18394: 0x5DC5,
- 18395: 0x5F73,
- 18396: 0x5F77,
- 18397: 0x5F82,
- 18398: 0x5F87,
- 18399: 0x5F89,
- 18400: 0x5F8C,
- 18401: 0x5F95,
- 18402: 0x5F99,
- 18403: 0x5F9C,
- 18404: 0x5FA8,
- 18405: 0x5FAD,
- 18406: 0x5FB5,
- 18407: 0x5FBC,
- 18408: 0x8862,
- 18409: 0x5F61,
- 18410: 0x72AD,
- 18411: 0x72B0,
- 18412: 0x72B4,
- 18413: 0x72B7,
- 18414: 0x72B8,
- 18415: 0x72C3,
- 18416: 0x72C1,
- 18417: 0x72CE,
- 18418: 0x72CD,
- 18419: 0x72D2,
- 18420: 0x72E8,
- 18421: 0x72EF,
- 18422: 0x72E9,
- 18423: 0x72F2,
- 18424: 0x72F4,
- 18425: 0x72F7,
- 18426: 0x7301,
- 18427: 0x72F3,
- 18428: 0x7303,
- 18429: 0x72FA,
- 18430: 0x91E6,
- 18431: 0x91E7,
- 18432: 0x91E8,
- 18433: 0x91E9,
- 18434: 0x91EA,
- 18435: 0x91EB,
- 18436: 0x91EC,
- 18437: 0x91ED,
- 18438: 0x91EE,
- 18439: 0x91EF,
- 18440: 0x91F0,
- 18441: 0x91F1,
- 18442: 0x91F2,
- 18443: 0x91F3,
- 18444: 0x91F4,
- 18445: 0x91F5,
- 18446: 0x91F6,
- 18447: 0x91F7,
- 18448: 0x91F8,
- 18449: 0x91F9,
- 18450: 0x91FA,
- 18451: 0x91FB,
- 18452: 0x91FC,
- 18453: 0x91FD,
- 18454: 0x91FE,
- 18455: 0x91FF,
- 18456: 0x9200,
- 18457: 0x9201,
- 18458: 0x9202,
- 18459: 0x9203,
- 18460: 0x9204,
- 18461: 0x9205,
- 18462: 0x9206,
- 18463: 0x9207,
- 18464: 0x9208,
- 18465: 0x9209,
- 18466: 0x920A,
- 18467: 0x920B,
- 18468: 0x920C,
- 18469: 0x920D,
- 18470: 0x920E,
- 18471: 0x920F,
- 18472: 0x9210,
- 18473: 0x9211,
- 18474: 0x9212,
- 18475: 0x9213,
- 18476: 0x9214,
- 18477: 0x9215,
- 18478: 0x9216,
- 18479: 0x9217,
- 18480: 0x9218,
- 18481: 0x9219,
- 18482: 0x921A,
- 18483: 0x921B,
- 18484: 0x921C,
- 18485: 0x921D,
- 18486: 0x921E,
- 18487: 0x921F,
- 18488: 0x9220,
- 18489: 0x9221,
- 18490: 0x9222,
- 18491: 0x9223,
- 18492: 0x9224,
- 18493: 0x9225,
- 18494: 0x9226,
- 18495: 0x9227,
- 18496: 0x9228,
- 18497: 0x9229,
- 18498: 0x922A,
- 18499: 0x922B,
- 18500: 0x922C,
- 18501: 0x922D,
- 18502: 0x922E,
- 18503: 0x922F,
- 18504: 0x9230,
- 18505: 0x9231,
- 18506: 0x9232,
- 18507: 0x9233,
- 18508: 0x9234,
- 18509: 0x9235,
- 18510: 0x9236,
- 18511: 0x9237,
- 18512: 0x9238,
- 18513: 0x9239,
- 18514: 0x923A,
- 18515: 0x923B,
- 18516: 0x923C,
- 18517: 0x923D,
- 18518: 0x923E,
- 18519: 0x923F,
- 18520: 0x9240,
- 18521: 0x9241,
- 18522: 0x9242,
- 18523: 0x9243,
- 18524: 0x9244,
- 18525: 0x9245,
- 18526: 0x72FB,
- 18527: 0x7317,
- 18528: 0x7313,
- 18529: 0x7321,
- 18530: 0x730A,
- 18531: 0x731E,
- 18532: 0x731D,
- 18533: 0x7315,
- 18534: 0x7322,
- 18535: 0x7339,
- 18536: 0x7325,
- 18537: 0x732C,
- 18538: 0x7338,
- 18539: 0x7331,
- 18540: 0x7350,
- 18541: 0x734D,
- 18542: 0x7357,
- 18543: 0x7360,
- 18544: 0x736C,
- 18545: 0x736F,
- 18546: 0x737E,
- 18547: 0x821B,
- 18548: 0x5925,
- 18549: 0x98E7,
- 18550: 0x5924,
- 18551: 0x5902,
- 18552: 0x9963,
- 18553: 0x9967,
- 18554: 0x9968,
- 18555: 0x9969,
- 18556: 0x996A,
- 18557: 0x996B,
- 18558: 0x996C,
- 18559: 0x9974,
- 18560: 0x9977,
- 18561: 0x997D,
- 18562: 0x9980,
- 18563: 0x9984,
- 18564: 0x9987,
- 18565: 0x998A,
- 18566: 0x998D,
- 18567: 0x9990,
- 18568: 0x9991,
- 18569: 0x9993,
- 18570: 0x9994,
- 18571: 0x9995,
- 18572: 0x5E80,
- 18573: 0x5E91,
- 18574: 0x5E8B,
- 18575: 0x5E96,
- 18576: 0x5EA5,
- 18577: 0x5EA0,
- 18578: 0x5EB9,
- 18579: 0x5EB5,
- 18580: 0x5EBE,
- 18581: 0x5EB3,
- 18582: 0x8D53,
- 18583: 0x5ED2,
- 18584: 0x5ED1,
- 18585: 0x5EDB,
- 18586: 0x5EE8,
- 18587: 0x5EEA,
- 18588: 0x81BA,
- 18589: 0x5FC4,
- 18590: 0x5FC9,
- 18591: 0x5FD6,
- 18592: 0x5FCF,
- 18593: 0x6003,
- 18594: 0x5FEE,
- 18595: 0x6004,
- 18596: 0x5FE1,
- 18597: 0x5FE4,
- 18598: 0x5FFE,
- 18599: 0x6005,
- 18600: 0x6006,
- 18601: 0x5FEA,
- 18602: 0x5FED,
- 18603: 0x5FF8,
- 18604: 0x6019,
- 18605: 0x6035,
- 18606: 0x6026,
- 18607: 0x601B,
- 18608: 0x600F,
- 18609: 0x600D,
- 18610: 0x6029,
- 18611: 0x602B,
- 18612: 0x600A,
- 18613: 0x603F,
- 18614: 0x6021,
- 18615: 0x6078,
- 18616: 0x6079,
- 18617: 0x607B,
- 18618: 0x607A,
- 18619: 0x6042,
- 18620: 0x9246,
- 18621: 0x9247,
- 18622: 0x9248,
- 18623: 0x9249,
- 18624: 0x924A,
- 18625: 0x924B,
- 18626: 0x924C,
- 18627: 0x924D,
- 18628: 0x924E,
- 18629: 0x924F,
- 18630: 0x9250,
- 18631: 0x9251,
- 18632: 0x9252,
- 18633: 0x9253,
- 18634: 0x9254,
- 18635: 0x9255,
- 18636: 0x9256,
- 18637: 0x9257,
- 18638: 0x9258,
- 18639: 0x9259,
- 18640: 0x925A,
- 18641: 0x925B,
- 18642: 0x925C,
- 18643: 0x925D,
- 18644: 0x925E,
- 18645: 0x925F,
- 18646: 0x9260,
- 18647: 0x9261,
- 18648: 0x9262,
- 18649: 0x9263,
- 18650: 0x9264,
- 18651: 0x9265,
- 18652: 0x9266,
- 18653: 0x9267,
- 18654: 0x9268,
- 18655: 0x9269,
- 18656: 0x926A,
- 18657: 0x926B,
- 18658: 0x926C,
- 18659: 0x926D,
- 18660: 0x926E,
- 18661: 0x926F,
- 18662: 0x9270,
- 18663: 0x9271,
- 18664: 0x9272,
- 18665: 0x9273,
- 18666: 0x9275,
- 18667: 0x9276,
- 18668: 0x9277,
- 18669: 0x9278,
- 18670: 0x9279,
- 18671: 0x927A,
- 18672: 0x927B,
- 18673: 0x927C,
- 18674: 0x927D,
- 18675: 0x927E,
- 18676: 0x927F,
- 18677: 0x9280,
- 18678: 0x9281,
- 18679: 0x9282,
- 18680: 0x9283,
- 18681: 0x9284,
- 18682: 0x9285,
- 18683: 0x9286,
- 18684: 0x9287,
- 18685: 0x9288,
- 18686: 0x9289,
- 18687: 0x928A,
- 18688: 0x928B,
- 18689: 0x928C,
- 18690: 0x928D,
- 18691: 0x928F,
- 18692: 0x9290,
- 18693: 0x9291,
- 18694: 0x9292,
- 18695: 0x9293,
- 18696: 0x9294,
- 18697: 0x9295,
- 18698: 0x9296,
- 18699: 0x9297,
- 18700: 0x9298,
- 18701: 0x9299,
- 18702: 0x929A,
- 18703: 0x929B,
- 18704: 0x929C,
- 18705: 0x929D,
- 18706: 0x929E,
- 18707: 0x929F,
- 18708: 0x92A0,
- 18709: 0x92A1,
- 18710: 0x92A2,
- 18711: 0x92A3,
- 18712: 0x92A4,
- 18713: 0x92A5,
- 18714: 0x92A6,
- 18715: 0x92A7,
- 18716: 0x606A,
- 18717: 0x607D,
- 18718: 0x6096,
- 18719: 0x609A,
- 18720: 0x60AD,
- 18721: 0x609D,
- 18722: 0x6083,
- 18723: 0x6092,
- 18724: 0x608C,
- 18725: 0x609B,
- 18726: 0x60EC,
- 18727: 0x60BB,
- 18728: 0x60B1,
- 18729: 0x60DD,
- 18730: 0x60D8,
- 18731: 0x60C6,
- 18732: 0x60DA,
- 18733: 0x60B4,
- 18734: 0x6120,
- 18735: 0x6126,
- 18736: 0x6115,
- 18737: 0x6123,
- 18738: 0x60F4,
- 18739: 0x6100,
- 18740: 0x610E,
- 18741: 0x612B,
- 18742: 0x614A,
- 18743: 0x6175,
- 18744: 0x61AC,
- 18745: 0x6194,
- 18746: 0x61A7,
- 18747: 0x61B7,
- 18748: 0x61D4,
- 18749: 0x61F5,
- 18750: 0x5FDD,
- 18751: 0x96B3,
- 18752: 0x95E9,
- 18753: 0x95EB,
- 18754: 0x95F1,
- 18755: 0x95F3,
- 18756: 0x95F5,
- 18757: 0x95F6,
- 18758: 0x95FC,
- 18759: 0x95FE,
- 18760: 0x9603,
- 18761: 0x9604,
- 18762: 0x9606,
- 18763: 0x9608,
- 18764: 0x960A,
- 18765: 0x960B,
- 18766: 0x960C,
- 18767: 0x960D,
- 18768: 0x960F,
- 18769: 0x9612,
- 18770: 0x9615,
- 18771: 0x9616,
- 18772: 0x9617,
- 18773: 0x9619,
- 18774: 0x961A,
- 18775: 0x4E2C,
- 18776: 0x723F,
- 18777: 0x6215,
- 18778: 0x6C35,
- 18779: 0x6C54,
- 18780: 0x6C5C,
- 18781: 0x6C4A,
- 18782: 0x6CA3,
- 18783: 0x6C85,
- 18784: 0x6C90,
- 18785: 0x6C94,
- 18786: 0x6C8C,
- 18787: 0x6C68,
- 18788: 0x6C69,
- 18789: 0x6C74,
- 18790: 0x6C76,
- 18791: 0x6C86,
- 18792: 0x6CA9,
- 18793: 0x6CD0,
- 18794: 0x6CD4,
- 18795: 0x6CAD,
- 18796: 0x6CF7,
- 18797: 0x6CF8,
- 18798: 0x6CF1,
- 18799: 0x6CD7,
- 18800: 0x6CB2,
- 18801: 0x6CE0,
- 18802: 0x6CD6,
- 18803: 0x6CFA,
- 18804: 0x6CEB,
- 18805: 0x6CEE,
- 18806: 0x6CB1,
- 18807: 0x6CD3,
- 18808: 0x6CEF,
- 18809: 0x6CFE,
- 18810: 0x92A8,
- 18811: 0x92A9,
- 18812: 0x92AA,
- 18813: 0x92AB,
- 18814: 0x92AC,
- 18815: 0x92AD,
- 18816: 0x92AF,
- 18817: 0x92B0,
- 18818: 0x92B1,
- 18819: 0x92B2,
- 18820: 0x92B3,
- 18821: 0x92B4,
- 18822: 0x92B5,
- 18823: 0x92B6,
- 18824: 0x92B7,
- 18825: 0x92B8,
- 18826: 0x92B9,
- 18827: 0x92BA,
- 18828: 0x92BB,
- 18829: 0x92BC,
- 18830: 0x92BD,
- 18831: 0x92BE,
- 18832: 0x92BF,
- 18833: 0x92C0,
- 18834: 0x92C1,
- 18835: 0x92C2,
- 18836: 0x92C3,
- 18837: 0x92C4,
- 18838: 0x92C5,
- 18839: 0x92C6,
- 18840: 0x92C7,
- 18841: 0x92C9,
- 18842: 0x92CA,
- 18843: 0x92CB,
- 18844: 0x92CC,
- 18845: 0x92CD,
- 18846: 0x92CE,
- 18847: 0x92CF,
- 18848: 0x92D0,
- 18849: 0x92D1,
- 18850: 0x92D2,
- 18851: 0x92D3,
- 18852: 0x92D4,
- 18853: 0x92D5,
- 18854: 0x92D6,
- 18855: 0x92D7,
- 18856: 0x92D8,
- 18857: 0x92D9,
- 18858: 0x92DA,
- 18859: 0x92DB,
- 18860: 0x92DC,
- 18861: 0x92DD,
- 18862: 0x92DE,
- 18863: 0x92DF,
- 18864: 0x92E0,
- 18865: 0x92E1,
- 18866: 0x92E2,
- 18867: 0x92E3,
- 18868: 0x92E4,
- 18869: 0x92E5,
- 18870: 0x92E6,
- 18871: 0x92E7,
- 18872: 0x92E8,
- 18873: 0x92E9,
- 18874: 0x92EA,
- 18875: 0x92EB,
- 18876: 0x92EC,
- 18877: 0x92ED,
- 18878: 0x92EE,
- 18879: 0x92EF,
- 18880: 0x92F0,
- 18881: 0x92F1,
- 18882: 0x92F2,
- 18883: 0x92F3,
- 18884: 0x92F4,
- 18885: 0x92F5,
- 18886: 0x92F6,
- 18887: 0x92F7,
- 18888: 0x92F8,
- 18889: 0x92F9,
- 18890: 0x92FA,
- 18891: 0x92FB,
- 18892: 0x92FC,
- 18893: 0x92FD,
- 18894: 0x92FE,
- 18895: 0x92FF,
- 18896: 0x9300,
- 18897: 0x9301,
- 18898: 0x9302,
- 18899: 0x9303,
- 18900: 0x9304,
- 18901: 0x9305,
- 18902: 0x9306,
- 18903: 0x9307,
- 18904: 0x9308,
- 18905: 0x9309,
- 18906: 0x6D39,
- 18907: 0x6D27,
- 18908: 0x6D0C,
- 18909: 0x6D43,
- 18910: 0x6D48,
- 18911: 0x6D07,
- 18912: 0x6D04,
- 18913: 0x6D19,
- 18914: 0x6D0E,
- 18915: 0x6D2B,
- 18916: 0x6D4D,
- 18917: 0x6D2E,
- 18918: 0x6D35,
- 18919: 0x6D1A,
- 18920: 0x6D4F,
- 18921: 0x6D52,
- 18922: 0x6D54,
- 18923: 0x6D33,
- 18924: 0x6D91,
- 18925: 0x6D6F,
- 18926: 0x6D9E,
- 18927: 0x6DA0,
- 18928: 0x6D5E,
- 18929: 0x6D93,
- 18930: 0x6D94,
- 18931: 0x6D5C,
- 18932: 0x6D60,
- 18933: 0x6D7C,
- 18934: 0x6D63,
- 18935: 0x6E1A,
- 18936: 0x6DC7,
- 18937: 0x6DC5,
- 18938: 0x6DDE,
- 18939: 0x6E0E,
- 18940: 0x6DBF,
- 18941: 0x6DE0,
- 18942: 0x6E11,
- 18943: 0x6DE6,
- 18944: 0x6DDD,
- 18945: 0x6DD9,
- 18946: 0x6E16,
- 18947: 0x6DAB,
- 18948: 0x6E0C,
- 18949: 0x6DAE,
- 18950: 0x6E2B,
- 18951: 0x6E6E,
- 18952: 0x6E4E,
- 18953: 0x6E6B,
- 18954: 0x6EB2,
- 18955: 0x6E5F,
- 18956: 0x6E86,
- 18957: 0x6E53,
- 18958: 0x6E54,
- 18959: 0x6E32,
- 18960: 0x6E25,
- 18961: 0x6E44,
- 18962: 0x6EDF,
- 18963: 0x6EB1,
- 18964: 0x6E98,
- 18965: 0x6EE0,
- 18966: 0x6F2D,
- 18967: 0x6EE2,
- 18968: 0x6EA5,
- 18969: 0x6EA7,
- 18970: 0x6EBD,
- 18971: 0x6EBB,
- 18972: 0x6EB7,
- 18973: 0x6ED7,
- 18974: 0x6EB4,
- 18975: 0x6ECF,
- 18976: 0x6E8F,
- 18977: 0x6EC2,
- 18978: 0x6E9F,
- 18979: 0x6F62,
- 18980: 0x6F46,
- 18981: 0x6F47,
- 18982: 0x6F24,
- 18983: 0x6F15,
- 18984: 0x6EF9,
- 18985: 0x6F2F,
- 18986: 0x6F36,
- 18987: 0x6F4B,
- 18988: 0x6F74,
- 18989: 0x6F2A,
- 18990: 0x6F09,
- 18991: 0x6F29,
- 18992: 0x6F89,
- 18993: 0x6F8D,
- 18994: 0x6F8C,
- 18995: 0x6F78,
- 18996: 0x6F72,
- 18997: 0x6F7C,
- 18998: 0x6F7A,
- 18999: 0x6FD1,
- 19000: 0x930A,
- 19001: 0x930B,
- 19002: 0x930C,
- 19003: 0x930D,
- 19004: 0x930E,
- 19005: 0x930F,
- 19006: 0x9310,
- 19007: 0x9311,
- 19008: 0x9312,
- 19009: 0x9313,
- 19010: 0x9314,
- 19011: 0x9315,
- 19012: 0x9316,
- 19013: 0x9317,
- 19014: 0x9318,
- 19015: 0x9319,
- 19016: 0x931A,
- 19017: 0x931B,
- 19018: 0x931C,
- 19019: 0x931D,
- 19020: 0x931E,
- 19021: 0x931F,
- 19022: 0x9320,
- 19023: 0x9321,
- 19024: 0x9322,
- 19025: 0x9323,
- 19026: 0x9324,
- 19027: 0x9325,
- 19028: 0x9326,
- 19029: 0x9327,
- 19030: 0x9328,
- 19031: 0x9329,
- 19032: 0x932A,
- 19033: 0x932B,
- 19034: 0x932C,
- 19035: 0x932D,
- 19036: 0x932E,
- 19037: 0x932F,
- 19038: 0x9330,
- 19039: 0x9331,
- 19040: 0x9332,
- 19041: 0x9333,
- 19042: 0x9334,
- 19043: 0x9335,
- 19044: 0x9336,
- 19045: 0x9337,
- 19046: 0x9338,
- 19047: 0x9339,
- 19048: 0x933A,
- 19049: 0x933B,
- 19050: 0x933C,
- 19051: 0x933D,
- 19052: 0x933F,
- 19053: 0x9340,
- 19054: 0x9341,
- 19055: 0x9342,
- 19056: 0x9343,
- 19057: 0x9344,
- 19058: 0x9345,
- 19059: 0x9346,
- 19060: 0x9347,
- 19061: 0x9348,
- 19062: 0x9349,
- 19063: 0x934A,
- 19064: 0x934B,
- 19065: 0x934C,
- 19066: 0x934D,
- 19067: 0x934E,
- 19068: 0x934F,
- 19069: 0x9350,
- 19070: 0x9351,
- 19071: 0x9352,
- 19072: 0x9353,
- 19073: 0x9354,
- 19074: 0x9355,
- 19075: 0x9356,
- 19076: 0x9357,
- 19077: 0x9358,
- 19078: 0x9359,
- 19079: 0x935A,
- 19080: 0x935B,
- 19081: 0x935C,
- 19082: 0x935D,
- 19083: 0x935E,
- 19084: 0x935F,
- 19085: 0x9360,
- 19086: 0x9361,
- 19087: 0x9362,
- 19088: 0x9363,
- 19089: 0x9364,
- 19090: 0x9365,
- 19091: 0x9366,
- 19092: 0x9367,
- 19093: 0x9368,
- 19094: 0x9369,
- 19095: 0x936B,
- 19096: 0x6FC9,
- 19097: 0x6FA7,
- 19098: 0x6FB9,
- 19099: 0x6FB6,
- 19100: 0x6FC2,
- 19101: 0x6FE1,
- 19102: 0x6FEE,
- 19103: 0x6FDE,
- 19104: 0x6FE0,
- 19105: 0x6FEF,
- 19106: 0x701A,
- 19107: 0x7023,
- 19108: 0x701B,
- 19109: 0x7039,
- 19110: 0x7035,
- 19111: 0x704F,
- 19112: 0x705E,
- 19113: 0x5B80,
- 19114: 0x5B84,
- 19115: 0x5B95,
- 19116: 0x5B93,
- 19117: 0x5BA5,
- 19118: 0x5BB8,
- 19119: 0x752F,
- 19120: 0x9A9E,
- 19121: 0x6434,
- 19122: 0x5BE4,
- 19123: 0x5BEE,
- 19124: 0x8930,
- 19125: 0x5BF0,
- 19126: 0x8E47,
- 19127: 0x8B07,
- 19128: 0x8FB6,
- 19129: 0x8FD3,
- 19130: 0x8FD5,
- 19131: 0x8FE5,
- 19132: 0x8FEE,
- 19133: 0x8FE4,
- 19134: 0x8FE9,
- 19135: 0x8FE6,
- 19136: 0x8FF3,
- 19137: 0x8FE8,
- 19138: 0x9005,
- 19139: 0x9004,
- 19140: 0x900B,
- 19141: 0x9026,
- 19142: 0x9011,
- 19143: 0x900D,
- 19144: 0x9016,
- 19145: 0x9021,
- 19146: 0x9035,
- 19147: 0x9036,
- 19148: 0x902D,
- 19149: 0x902F,
- 19150: 0x9044,
- 19151: 0x9051,
- 19152: 0x9052,
- 19153: 0x9050,
- 19154: 0x9068,
- 19155: 0x9058,
- 19156: 0x9062,
- 19157: 0x905B,
- 19158: 0x66B9,
- 19159: 0x9074,
- 19160: 0x907D,
- 19161: 0x9082,
- 19162: 0x9088,
- 19163: 0x9083,
- 19164: 0x908B,
- 19165: 0x5F50,
- 19166: 0x5F57,
- 19167: 0x5F56,
- 19168: 0x5F58,
- 19169: 0x5C3B,
- 19170: 0x54AB,
- 19171: 0x5C50,
- 19172: 0x5C59,
- 19173: 0x5B71,
- 19174: 0x5C63,
- 19175: 0x5C66,
- 19176: 0x7FBC,
- 19177: 0x5F2A,
- 19178: 0x5F29,
- 19179: 0x5F2D,
- 19180: 0x8274,
- 19181: 0x5F3C,
- 19182: 0x9B3B,
- 19183: 0x5C6E,
- 19184: 0x5981,
- 19185: 0x5983,
- 19186: 0x598D,
- 19187: 0x59A9,
- 19188: 0x59AA,
- 19189: 0x59A3,
- 19190: 0x936C,
- 19191: 0x936D,
- 19192: 0x936E,
- 19193: 0x936F,
- 19194: 0x9370,
- 19195: 0x9371,
- 19196: 0x9372,
- 19197: 0x9373,
- 19198: 0x9374,
- 19199: 0x9375,
- 19200: 0x9376,
- 19201: 0x9377,
- 19202: 0x9378,
- 19203: 0x9379,
- 19204: 0x937A,
- 19205: 0x937B,
- 19206: 0x937C,
- 19207: 0x937D,
- 19208: 0x937E,
- 19209: 0x937F,
- 19210: 0x9380,
- 19211: 0x9381,
- 19212: 0x9382,
- 19213: 0x9383,
- 19214: 0x9384,
- 19215: 0x9385,
- 19216: 0x9386,
- 19217: 0x9387,
- 19218: 0x9388,
- 19219: 0x9389,
- 19220: 0x938A,
- 19221: 0x938B,
- 19222: 0x938C,
- 19223: 0x938D,
- 19224: 0x938E,
- 19225: 0x9390,
- 19226: 0x9391,
- 19227: 0x9392,
- 19228: 0x9393,
- 19229: 0x9394,
- 19230: 0x9395,
- 19231: 0x9396,
- 19232: 0x9397,
- 19233: 0x9398,
- 19234: 0x9399,
- 19235: 0x939A,
- 19236: 0x939B,
- 19237: 0x939C,
- 19238: 0x939D,
- 19239: 0x939E,
- 19240: 0x939F,
- 19241: 0x93A0,
- 19242: 0x93A1,
- 19243: 0x93A2,
- 19244: 0x93A3,
- 19245: 0x93A4,
- 19246: 0x93A5,
- 19247: 0x93A6,
- 19248: 0x93A7,
- 19249: 0x93A8,
- 19250: 0x93A9,
- 19251: 0x93AA,
- 19252: 0x93AB,
- 19253: 0x93AC,
- 19254: 0x93AD,
- 19255: 0x93AE,
- 19256: 0x93AF,
- 19257: 0x93B0,
- 19258: 0x93B1,
- 19259: 0x93B2,
- 19260: 0x93B3,
- 19261: 0x93B4,
- 19262: 0x93B5,
- 19263: 0x93B6,
- 19264: 0x93B7,
- 19265: 0x93B8,
- 19266: 0x93B9,
- 19267: 0x93BA,
- 19268: 0x93BB,
- 19269: 0x93BC,
- 19270: 0x93BD,
- 19271: 0x93BE,
- 19272: 0x93BF,
- 19273: 0x93C0,
- 19274: 0x93C1,
- 19275: 0x93C2,
- 19276: 0x93C3,
- 19277: 0x93C4,
- 19278: 0x93C5,
- 19279: 0x93C6,
- 19280: 0x93C7,
- 19281: 0x93C8,
- 19282: 0x93C9,
- 19283: 0x93CB,
- 19284: 0x93CC,
- 19285: 0x93CD,
- 19286: 0x5997,
- 19287: 0x59CA,
- 19288: 0x59AB,
- 19289: 0x599E,
- 19290: 0x59A4,
- 19291: 0x59D2,
- 19292: 0x59B2,
- 19293: 0x59AF,
- 19294: 0x59D7,
- 19295: 0x59BE,
- 19296: 0x5A05,
- 19297: 0x5A06,
- 19298: 0x59DD,
- 19299: 0x5A08,
- 19300: 0x59E3,
- 19301: 0x59D8,
- 19302: 0x59F9,
- 19303: 0x5A0C,
- 19304: 0x5A09,
- 19305: 0x5A32,
- 19306: 0x5A34,
- 19307: 0x5A11,
- 19308: 0x5A23,
- 19309: 0x5A13,
- 19310: 0x5A40,
- 19311: 0x5A67,
- 19312: 0x5A4A,
- 19313: 0x5A55,
- 19314: 0x5A3C,
- 19315: 0x5A62,
- 19316: 0x5A75,
- 19317: 0x80EC,
- 19318: 0x5AAA,
- 19319: 0x5A9B,
- 19320: 0x5A77,
- 19321: 0x5A7A,
- 19322: 0x5ABE,
- 19323: 0x5AEB,
- 19324: 0x5AB2,
- 19325: 0x5AD2,
- 19326: 0x5AD4,
- 19327: 0x5AB8,
- 19328: 0x5AE0,
- 19329: 0x5AE3,
- 19330: 0x5AF1,
- 19331: 0x5AD6,
- 19332: 0x5AE6,
- 19333: 0x5AD8,
- 19334: 0x5ADC,
- 19335: 0x5B09,
- 19336: 0x5B17,
- 19337: 0x5B16,
- 19338: 0x5B32,
- 19339: 0x5B37,
- 19340: 0x5B40,
- 19341: 0x5C15,
- 19342: 0x5C1C,
- 19343: 0x5B5A,
- 19344: 0x5B65,
- 19345: 0x5B73,
- 19346: 0x5B51,
- 19347: 0x5B53,
- 19348: 0x5B62,
- 19349: 0x9A75,
- 19350: 0x9A77,
- 19351: 0x9A78,
- 19352: 0x9A7A,
- 19353: 0x9A7F,
- 19354: 0x9A7D,
- 19355: 0x9A80,
- 19356: 0x9A81,
- 19357: 0x9A85,
- 19358: 0x9A88,
- 19359: 0x9A8A,
- 19360: 0x9A90,
- 19361: 0x9A92,
- 19362: 0x9A93,
- 19363: 0x9A96,
- 19364: 0x9A98,
- 19365: 0x9A9B,
- 19366: 0x9A9C,
- 19367: 0x9A9D,
- 19368: 0x9A9F,
- 19369: 0x9AA0,
- 19370: 0x9AA2,
- 19371: 0x9AA3,
- 19372: 0x9AA5,
- 19373: 0x9AA7,
- 19374: 0x7E9F,
- 19375: 0x7EA1,
- 19376: 0x7EA3,
- 19377: 0x7EA5,
- 19378: 0x7EA8,
- 19379: 0x7EA9,
- 19380: 0x93CE,
- 19381: 0x93CF,
- 19382: 0x93D0,
- 19383: 0x93D1,
- 19384: 0x93D2,
- 19385: 0x93D3,
- 19386: 0x93D4,
- 19387: 0x93D5,
- 19388: 0x93D7,
- 19389: 0x93D8,
- 19390: 0x93D9,
- 19391: 0x93DA,
- 19392: 0x93DB,
- 19393: 0x93DC,
- 19394: 0x93DD,
- 19395: 0x93DE,
- 19396: 0x93DF,
- 19397: 0x93E0,
- 19398: 0x93E1,
- 19399: 0x93E2,
- 19400: 0x93E3,
- 19401: 0x93E4,
- 19402: 0x93E5,
- 19403: 0x93E6,
- 19404: 0x93E7,
- 19405: 0x93E8,
- 19406: 0x93E9,
- 19407: 0x93EA,
- 19408: 0x93EB,
- 19409: 0x93EC,
- 19410: 0x93ED,
- 19411: 0x93EE,
- 19412: 0x93EF,
- 19413: 0x93F0,
- 19414: 0x93F1,
- 19415: 0x93F2,
- 19416: 0x93F3,
- 19417: 0x93F4,
- 19418: 0x93F5,
- 19419: 0x93F6,
- 19420: 0x93F7,
- 19421: 0x93F8,
- 19422: 0x93F9,
- 19423: 0x93FA,
- 19424: 0x93FB,
- 19425: 0x93FC,
- 19426: 0x93FD,
- 19427: 0x93FE,
- 19428: 0x93FF,
- 19429: 0x9400,
- 19430: 0x9401,
- 19431: 0x9402,
- 19432: 0x9403,
- 19433: 0x9404,
- 19434: 0x9405,
- 19435: 0x9406,
- 19436: 0x9407,
- 19437: 0x9408,
- 19438: 0x9409,
- 19439: 0x940A,
- 19440: 0x940B,
- 19441: 0x940C,
- 19442: 0x940D,
- 19443: 0x940E,
- 19444: 0x940F,
- 19445: 0x9410,
- 19446: 0x9411,
- 19447: 0x9412,
- 19448: 0x9413,
- 19449: 0x9414,
- 19450: 0x9415,
- 19451: 0x9416,
- 19452: 0x9417,
- 19453: 0x9418,
- 19454: 0x9419,
- 19455: 0x941A,
- 19456: 0x941B,
- 19457: 0x941C,
- 19458: 0x941D,
- 19459: 0x941E,
- 19460: 0x941F,
- 19461: 0x9420,
- 19462: 0x9421,
- 19463: 0x9422,
- 19464: 0x9423,
- 19465: 0x9424,
- 19466: 0x9425,
- 19467: 0x9426,
- 19468: 0x9427,
- 19469: 0x9428,
- 19470: 0x9429,
- 19471: 0x942A,
- 19472: 0x942B,
- 19473: 0x942C,
- 19474: 0x942D,
- 19475: 0x942E,
- 19476: 0x7EAD,
- 19477: 0x7EB0,
- 19478: 0x7EBE,
- 19479: 0x7EC0,
- 19480: 0x7EC1,
- 19481: 0x7EC2,
- 19482: 0x7EC9,
- 19483: 0x7ECB,
- 19484: 0x7ECC,
- 19485: 0x7ED0,
- 19486: 0x7ED4,
- 19487: 0x7ED7,
- 19488: 0x7EDB,
- 19489: 0x7EE0,
- 19490: 0x7EE1,
- 19491: 0x7EE8,
- 19492: 0x7EEB,
- 19493: 0x7EEE,
- 19494: 0x7EEF,
- 19495: 0x7EF1,
- 19496: 0x7EF2,
- 19497: 0x7F0D,
- 19498: 0x7EF6,
- 19499: 0x7EFA,
- 19500: 0x7EFB,
- 19501: 0x7EFE,
- 19502: 0x7F01,
- 19503: 0x7F02,
- 19504: 0x7F03,
- 19505: 0x7F07,
- 19506: 0x7F08,
- 19507: 0x7F0B,
- 19508: 0x7F0C,
- 19509: 0x7F0F,
- 19510: 0x7F11,
- 19511: 0x7F12,
- 19512: 0x7F17,
- 19513: 0x7F19,
- 19514: 0x7F1C,
- 19515: 0x7F1B,
- 19516: 0x7F1F,
- 19517: 0x7F21,
- 19518: 0x7F22,
- 19519: 0x7F23,
- 19520: 0x7F24,
- 19521: 0x7F25,
- 19522: 0x7F26,
- 19523: 0x7F27,
- 19524: 0x7F2A,
- 19525: 0x7F2B,
- 19526: 0x7F2C,
- 19527: 0x7F2D,
- 19528: 0x7F2F,
- 19529: 0x7F30,
- 19530: 0x7F31,
- 19531: 0x7F32,
- 19532: 0x7F33,
- 19533: 0x7F35,
- 19534: 0x5E7A,
- 19535: 0x757F,
- 19536: 0x5DDB,
- 19537: 0x753E,
- 19538: 0x9095,
- 19539: 0x738E,
- 19540: 0x7391,
- 19541: 0x73AE,
- 19542: 0x73A2,
- 19543: 0x739F,
- 19544: 0x73CF,
- 19545: 0x73C2,
- 19546: 0x73D1,
- 19547: 0x73B7,
- 19548: 0x73B3,
- 19549: 0x73C0,
- 19550: 0x73C9,
- 19551: 0x73C8,
- 19552: 0x73E5,
- 19553: 0x73D9,
- 19554: 0x987C,
- 19555: 0x740A,
- 19556: 0x73E9,
- 19557: 0x73E7,
- 19558: 0x73DE,
- 19559: 0x73BA,
- 19560: 0x73F2,
- 19561: 0x740F,
- 19562: 0x742A,
- 19563: 0x745B,
- 19564: 0x7426,
- 19565: 0x7425,
- 19566: 0x7428,
- 19567: 0x7430,
- 19568: 0x742E,
- 19569: 0x742C,
- 19570: 0x942F,
- 19571: 0x9430,
- 19572: 0x9431,
- 19573: 0x9432,
- 19574: 0x9433,
- 19575: 0x9434,
- 19576: 0x9435,
- 19577: 0x9436,
- 19578: 0x9437,
- 19579: 0x9438,
- 19580: 0x9439,
- 19581: 0x943A,
- 19582: 0x943B,
- 19583: 0x943C,
- 19584: 0x943D,
- 19585: 0x943F,
- 19586: 0x9440,
- 19587: 0x9441,
- 19588: 0x9442,
- 19589: 0x9443,
- 19590: 0x9444,
- 19591: 0x9445,
- 19592: 0x9446,
- 19593: 0x9447,
- 19594: 0x9448,
- 19595: 0x9449,
- 19596: 0x944A,
- 19597: 0x944B,
- 19598: 0x944C,
- 19599: 0x944D,
- 19600: 0x944E,
- 19601: 0x944F,
- 19602: 0x9450,
- 19603: 0x9451,
- 19604: 0x9452,
- 19605: 0x9453,
- 19606: 0x9454,
- 19607: 0x9455,
- 19608: 0x9456,
- 19609: 0x9457,
- 19610: 0x9458,
- 19611: 0x9459,
- 19612: 0x945A,
- 19613: 0x945B,
- 19614: 0x945C,
- 19615: 0x945D,
- 19616: 0x945E,
- 19617: 0x945F,
- 19618: 0x9460,
- 19619: 0x9461,
- 19620: 0x9462,
- 19621: 0x9463,
- 19622: 0x9464,
- 19623: 0x9465,
- 19624: 0x9466,
- 19625: 0x9467,
- 19626: 0x9468,
- 19627: 0x9469,
- 19628: 0x946A,
- 19629: 0x946C,
- 19630: 0x946D,
- 19631: 0x946E,
- 19632: 0x946F,
- 19633: 0x9470,
- 19634: 0x9471,
- 19635: 0x9472,
- 19636: 0x9473,
- 19637: 0x9474,
- 19638: 0x9475,
- 19639: 0x9476,
- 19640: 0x9477,
- 19641: 0x9478,
- 19642: 0x9479,
- 19643: 0x947A,
- 19644: 0x947B,
- 19645: 0x947C,
- 19646: 0x947D,
- 19647: 0x947E,
- 19648: 0x947F,
- 19649: 0x9480,
- 19650: 0x9481,
- 19651: 0x9482,
- 19652: 0x9483,
- 19653: 0x9484,
- 19654: 0x9491,
- 19655: 0x9496,
- 19656: 0x9498,
- 19657: 0x94C7,
- 19658: 0x94CF,
- 19659: 0x94D3,
- 19660: 0x94D4,
- 19661: 0x94DA,
- 19662: 0x94E6,
- 19663: 0x94FB,
- 19664: 0x951C,
- 19665: 0x9520,
- 19666: 0x741B,
- 19667: 0x741A,
- 19668: 0x7441,
- 19669: 0x745C,
- 19670: 0x7457,
- 19671: 0x7455,
- 19672: 0x7459,
- 19673: 0x7477,
- 19674: 0x746D,
- 19675: 0x747E,
- 19676: 0x749C,
- 19677: 0x748E,
- 19678: 0x7480,
- 19679: 0x7481,
- 19680: 0x7487,
- 19681: 0x748B,
- 19682: 0x749E,
- 19683: 0x74A8,
- 19684: 0x74A9,
- 19685: 0x7490,
- 19686: 0x74A7,
- 19687: 0x74D2,
- 19688: 0x74BA,
- 19689: 0x97EA,
- 19690: 0x97EB,
- 19691: 0x97EC,
- 19692: 0x674C,
- 19693: 0x6753,
- 19694: 0x675E,
- 19695: 0x6748,
- 19696: 0x6769,
- 19697: 0x67A5,
- 19698: 0x6787,
- 19699: 0x676A,
- 19700: 0x6773,
- 19701: 0x6798,
- 19702: 0x67A7,
- 19703: 0x6775,
- 19704: 0x67A8,
- 19705: 0x679E,
- 19706: 0x67AD,
- 19707: 0x678B,
- 19708: 0x6777,
- 19709: 0x677C,
- 19710: 0x67F0,
- 19711: 0x6809,
- 19712: 0x67D8,
- 19713: 0x680A,
- 19714: 0x67E9,
- 19715: 0x67B0,
- 19716: 0x680C,
- 19717: 0x67D9,
- 19718: 0x67B5,
- 19719: 0x67DA,
- 19720: 0x67B3,
- 19721: 0x67DD,
- 19722: 0x6800,
- 19723: 0x67C3,
- 19724: 0x67B8,
- 19725: 0x67E2,
- 19726: 0x680E,
- 19727: 0x67C1,
- 19728: 0x67FD,
- 19729: 0x6832,
- 19730: 0x6833,
- 19731: 0x6860,
- 19732: 0x6861,
- 19733: 0x684E,
- 19734: 0x6862,
- 19735: 0x6844,
- 19736: 0x6864,
- 19737: 0x6883,
- 19738: 0x681D,
- 19739: 0x6855,
- 19740: 0x6866,
- 19741: 0x6841,
- 19742: 0x6867,
- 19743: 0x6840,
- 19744: 0x683E,
- 19745: 0x684A,
- 19746: 0x6849,
- 19747: 0x6829,
- 19748: 0x68B5,
- 19749: 0x688F,
- 19750: 0x6874,
- 19751: 0x6877,
- 19752: 0x6893,
- 19753: 0x686B,
- 19754: 0x68C2,
- 19755: 0x696E,
- 19756: 0x68FC,
- 19757: 0x691F,
- 19758: 0x6920,
- 19759: 0x68F9,
- 19760: 0x9527,
- 19761: 0x9533,
- 19762: 0x953D,
- 19763: 0x9543,
- 19764: 0x9548,
- 19765: 0x954B,
- 19766: 0x9555,
- 19767: 0x955A,
- 19768: 0x9560,
- 19769: 0x956E,
- 19770: 0x9574,
- 19771: 0x9575,
- 19772: 0x9577,
- 19773: 0x9578,
- 19774: 0x9579,
- 19775: 0x957A,
- 19776: 0x957B,
- 19777: 0x957C,
- 19778: 0x957D,
- 19779: 0x957E,
- 19780: 0x9580,
- 19781: 0x9581,
- 19782: 0x9582,
- 19783: 0x9583,
- 19784: 0x9584,
- 19785: 0x9585,
- 19786: 0x9586,
- 19787: 0x9587,
- 19788: 0x9588,
- 19789: 0x9589,
- 19790: 0x958A,
- 19791: 0x958B,
- 19792: 0x958C,
- 19793: 0x958D,
- 19794: 0x958E,
- 19795: 0x958F,
- 19796: 0x9590,
- 19797: 0x9591,
- 19798: 0x9592,
- 19799: 0x9593,
- 19800: 0x9594,
- 19801: 0x9595,
- 19802: 0x9596,
- 19803: 0x9597,
- 19804: 0x9598,
- 19805: 0x9599,
- 19806: 0x959A,
- 19807: 0x959B,
- 19808: 0x959C,
- 19809: 0x959D,
- 19810: 0x959E,
- 19811: 0x959F,
- 19812: 0x95A0,
- 19813: 0x95A1,
- 19814: 0x95A2,
- 19815: 0x95A3,
- 19816: 0x95A4,
- 19817: 0x95A5,
- 19818: 0x95A6,
- 19819: 0x95A7,
- 19820: 0x95A8,
- 19821: 0x95A9,
- 19822: 0x95AA,
- 19823: 0x95AB,
- 19824: 0x95AC,
- 19825: 0x95AD,
- 19826: 0x95AE,
- 19827: 0x95AF,
- 19828: 0x95B0,
- 19829: 0x95B1,
- 19830: 0x95B2,
- 19831: 0x95B3,
- 19832: 0x95B4,
- 19833: 0x95B5,
- 19834: 0x95B6,
- 19835: 0x95B7,
- 19836: 0x95B8,
- 19837: 0x95B9,
- 19838: 0x95BA,
- 19839: 0x95BB,
- 19840: 0x95BC,
- 19841: 0x95BD,
- 19842: 0x95BE,
- 19843: 0x95BF,
- 19844: 0x95C0,
- 19845: 0x95C1,
- 19846: 0x95C2,
- 19847: 0x95C3,
- 19848: 0x95C4,
- 19849: 0x95C5,
- 19850: 0x95C6,
- 19851: 0x95C7,
- 19852: 0x95C8,
- 19853: 0x95C9,
- 19854: 0x95CA,
- 19855: 0x95CB,
- 19856: 0x6924,
- 19857: 0x68F0,
- 19858: 0x690B,
- 19859: 0x6901,
- 19860: 0x6957,
- 19861: 0x68E3,
- 19862: 0x6910,
- 19863: 0x6971,
- 19864: 0x6939,
- 19865: 0x6960,
- 19866: 0x6942,
- 19867: 0x695D,
- 19868: 0x6984,
- 19869: 0x696B,
- 19870: 0x6980,
- 19871: 0x6998,
- 19872: 0x6978,
- 19873: 0x6934,
- 19874: 0x69CC,
- 19875: 0x6987,
- 19876: 0x6988,
- 19877: 0x69CE,
- 19878: 0x6989,
- 19879: 0x6966,
- 19880: 0x6963,
- 19881: 0x6979,
- 19882: 0x699B,
- 19883: 0x69A7,
- 19884: 0x69BB,
- 19885: 0x69AB,
- 19886: 0x69AD,
- 19887: 0x69D4,
- 19888: 0x69B1,
- 19889: 0x69C1,
- 19890: 0x69CA,
- 19891: 0x69DF,
- 19892: 0x6995,
- 19893: 0x69E0,
- 19894: 0x698D,
- 19895: 0x69FF,
- 19896: 0x6A2F,
- 19897: 0x69ED,
- 19898: 0x6A17,
- 19899: 0x6A18,
- 19900: 0x6A65,
- 19901: 0x69F2,
- 19902: 0x6A44,
- 19903: 0x6A3E,
- 19904: 0x6AA0,
- 19905: 0x6A50,
- 19906: 0x6A5B,
- 19907: 0x6A35,
- 19908: 0x6A8E,
- 19909: 0x6A79,
- 19910: 0x6A3D,
- 19911: 0x6A28,
- 19912: 0x6A58,
- 19913: 0x6A7C,
- 19914: 0x6A91,
- 19915: 0x6A90,
- 19916: 0x6AA9,
- 19917: 0x6A97,
- 19918: 0x6AAB,
- 19919: 0x7337,
- 19920: 0x7352,
- 19921: 0x6B81,
- 19922: 0x6B82,
- 19923: 0x6B87,
- 19924: 0x6B84,
- 19925: 0x6B92,
- 19926: 0x6B93,
- 19927: 0x6B8D,
- 19928: 0x6B9A,
- 19929: 0x6B9B,
- 19930: 0x6BA1,
- 19931: 0x6BAA,
- 19932: 0x8F6B,
- 19933: 0x8F6D,
- 19934: 0x8F71,
- 19935: 0x8F72,
- 19936: 0x8F73,
- 19937: 0x8F75,
- 19938: 0x8F76,
- 19939: 0x8F78,
- 19940: 0x8F77,
- 19941: 0x8F79,
- 19942: 0x8F7A,
- 19943: 0x8F7C,
- 19944: 0x8F7E,
- 19945: 0x8F81,
- 19946: 0x8F82,
- 19947: 0x8F84,
- 19948: 0x8F87,
- 19949: 0x8F8B,
- 19950: 0x95CC,
- 19951: 0x95CD,
- 19952: 0x95CE,
- 19953: 0x95CF,
- 19954: 0x95D0,
- 19955: 0x95D1,
- 19956: 0x95D2,
- 19957: 0x95D3,
- 19958: 0x95D4,
- 19959: 0x95D5,
- 19960: 0x95D6,
- 19961: 0x95D7,
- 19962: 0x95D8,
- 19963: 0x95D9,
- 19964: 0x95DA,
- 19965: 0x95DB,
- 19966: 0x95DC,
- 19967: 0x95DD,
- 19968: 0x95DE,
- 19969: 0x95DF,
- 19970: 0x95E0,
- 19971: 0x95E1,
- 19972: 0x95E2,
- 19973: 0x95E3,
- 19974: 0x95E4,
- 19975: 0x95E5,
- 19976: 0x95E6,
- 19977: 0x95E7,
- 19978: 0x95EC,
- 19979: 0x95FF,
- 19980: 0x9607,
- 19981: 0x9613,
- 19982: 0x9618,
- 19983: 0x961B,
- 19984: 0x961E,
- 19985: 0x9620,
- 19986: 0x9623,
- 19987: 0x9624,
- 19988: 0x9625,
- 19989: 0x9626,
- 19990: 0x9627,
- 19991: 0x9628,
- 19992: 0x9629,
- 19993: 0x962B,
- 19994: 0x962C,
- 19995: 0x962D,
- 19996: 0x962F,
- 19997: 0x9630,
- 19998: 0x9637,
- 19999: 0x9638,
- 20000: 0x9639,
- 20001: 0x963A,
- 20002: 0x963E,
- 20003: 0x9641,
- 20004: 0x9643,
- 20005: 0x964A,
- 20006: 0x964E,
- 20007: 0x964F,
- 20008: 0x9651,
- 20009: 0x9652,
- 20010: 0x9653,
- 20011: 0x9656,
- 20012: 0x9657,
- 20013: 0x9658,
- 20014: 0x9659,
- 20015: 0x965A,
- 20016: 0x965C,
- 20017: 0x965D,
- 20018: 0x965E,
- 20019: 0x9660,
- 20020: 0x9663,
- 20021: 0x9665,
- 20022: 0x9666,
- 20023: 0x966B,
- 20024: 0x966D,
- 20025: 0x966E,
- 20026: 0x966F,
- 20027: 0x9670,
- 20028: 0x9671,
- 20029: 0x9673,
- 20030: 0x9678,
- 20031: 0x9679,
- 20032: 0x967A,
- 20033: 0x967B,
- 20034: 0x967C,
- 20035: 0x967D,
- 20036: 0x967E,
- 20037: 0x967F,
- 20038: 0x9680,
- 20039: 0x9681,
- 20040: 0x9682,
- 20041: 0x9683,
- 20042: 0x9684,
- 20043: 0x9687,
- 20044: 0x9689,
- 20045: 0x968A,
- 20046: 0x8F8D,
- 20047: 0x8F8E,
- 20048: 0x8F8F,
- 20049: 0x8F98,
- 20050: 0x8F9A,
- 20051: 0x8ECE,
- 20052: 0x620B,
- 20053: 0x6217,
- 20054: 0x621B,
- 20055: 0x621F,
- 20056: 0x6222,
- 20057: 0x6221,
- 20058: 0x6225,
- 20059: 0x6224,
- 20060: 0x622C,
- 20061: 0x81E7,
- 20062: 0x74EF,
- 20063: 0x74F4,
- 20064: 0x74FF,
- 20065: 0x750F,
- 20066: 0x7511,
- 20067: 0x7513,
- 20068: 0x6534,
- 20069: 0x65EE,
- 20070: 0x65EF,
- 20071: 0x65F0,
- 20072: 0x660A,
- 20073: 0x6619,
- 20074: 0x6772,
- 20075: 0x6603,
- 20076: 0x6615,
- 20077: 0x6600,
- 20078: 0x7085,
- 20079: 0x66F7,
- 20080: 0x661D,
- 20081: 0x6634,
- 20082: 0x6631,
- 20083: 0x6636,
- 20084: 0x6635,
- 20085: 0x8006,
- 20086: 0x665F,
- 20087: 0x6654,
- 20088: 0x6641,
- 20089: 0x664F,
- 20090: 0x6656,
- 20091: 0x6661,
- 20092: 0x6657,
- 20093: 0x6677,
- 20094: 0x6684,
- 20095: 0x668C,
- 20096: 0x66A7,
- 20097: 0x669D,
- 20098: 0x66BE,
- 20099: 0x66DB,
- 20100: 0x66DC,
- 20101: 0x66E6,
- 20102: 0x66E9,
- 20103: 0x8D32,
- 20104: 0x8D33,
- 20105: 0x8D36,
- 20106: 0x8D3B,
- 20107: 0x8D3D,
- 20108: 0x8D40,
- 20109: 0x8D45,
- 20110: 0x8D46,
- 20111: 0x8D48,
- 20112: 0x8D49,
- 20113: 0x8D47,
- 20114: 0x8D4D,
- 20115: 0x8D55,
- 20116: 0x8D59,
- 20117: 0x89C7,
- 20118: 0x89CA,
- 20119: 0x89CB,
- 20120: 0x89CC,
- 20121: 0x89CE,
- 20122: 0x89CF,
- 20123: 0x89D0,
- 20124: 0x89D1,
- 20125: 0x726E,
- 20126: 0x729F,
- 20127: 0x725D,
- 20128: 0x7266,
- 20129: 0x726F,
- 20130: 0x727E,
- 20131: 0x727F,
- 20132: 0x7284,
- 20133: 0x728B,
- 20134: 0x728D,
- 20135: 0x728F,
- 20136: 0x7292,
- 20137: 0x6308,
- 20138: 0x6332,
- 20139: 0x63B0,
- 20140: 0x968C,
- 20141: 0x968E,
- 20142: 0x9691,
- 20143: 0x9692,
- 20144: 0x9693,
- 20145: 0x9695,
- 20146: 0x9696,
- 20147: 0x969A,
- 20148: 0x969B,
- 20149: 0x969D,
- 20150: 0x969E,
- 20151: 0x969F,
- 20152: 0x96A0,
- 20153: 0x96A1,
- 20154: 0x96A2,
- 20155: 0x96A3,
- 20156: 0x96A4,
- 20157: 0x96A5,
- 20158: 0x96A6,
- 20159: 0x96A8,
- 20160: 0x96A9,
- 20161: 0x96AA,
- 20162: 0x96AB,
- 20163: 0x96AC,
- 20164: 0x96AD,
- 20165: 0x96AE,
- 20166: 0x96AF,
- 20167: 0x96B1,
- 20168: 0x96B2,
- 20169: 0x96B4,
- 20170: 0x96B5,
- 20171: 0x96B7,
- 20172: 0x96B8,
- 20173: 0x96BA,
- 20174: 0x96BB,
- 20175: 0x96BF,
- 20176: 0x96C2,
- 20177: 0x96C3,
- 20178: 0x96C8,
- 20179: 0x96CA,
- 20180: 0x96CB,
- 20181: 0x96D0,
- 20182: 0x96D1,
- 20183: 0x96D3,
- 20184: 0x96D4,
- 20185: 0x96D6,
- 20186: 0x96D7,
- 20187: 0x96D8,
- 20188: 0x96D9,
- 20189: 0x96DA,
- 20190: 0x96DB,
- 20191: 0x96DC,
- 20192: 0x96DD,
- 20193: 0x96DE,
- 20194: 0x96DF,
- 20195: 0x96E1,
- 20196: 0x96E2,
- 20197: 0x96E3,
- 20198: 0x96E4,
- 20199: 0x96E5,
- 20200: 0x96E6,
- 20201: 0x96E7,
- 20202: 0x96EB,
- 20203: 0x96EC,
- 20204: 0x96ED,
- 20205: 0x96EE,
- 20206: 0x96F0,
- 20207: 0x96F1,
- 20208: 0x96F2,
- 20209: 0x96F4,
- 20210: 0x96F5,
- 20211: 0x96F8,
- 20212: 0x96FA,
- 20213: 0x96FB,
- 20214: 0x96FC,
- 20215: 0x96FD,
- 20216: 0x96FF,
- 20217: 0x9702,
- 20218: 0x9703,
- 20219: 0x9705,
- 20220: 0x970A,
- 20221: 0x970B,
- 20222: 0x970C,
- 20223: 0x9710,
- 20224: 0x9711,
- 20225: 0x9712,
- 20226: 0x9714,
- 20227: 0x9715,
- 20228: 0x9717,
- 20229: 0x9718,
- 20230: 0x9719,
- 20231: 0x971A,
- 20232: 0x971B,
- 20233: 0x971D,
- 20234: 0x971F,
- 20235: 0x9720,
- 20236: 0x643F,
- 20237: 0x64D8,
- 20238: 0x8004,
- 20239: 0x6BEA,
- 20240: 0x6BF3,
- 20241: 0x6BFD,
- 20242: 0x6BF5,
- 20243: 0x6BF9,
- 20244: 0x6C05,
- 20245: 0x6C07,
- 20246: 0x6C06,
- 20247: 0x6C0D,
- 20248: 0x6C15,
- 20249: 0x6C18,
- 20250: 0x6C19,
- 20251: 0x6C1A,
- 20252: 0x6C21,
- 20253: 0x6C29,
- 20254: 0x6C24,
- 20255: 0x6C2A,
- 20256: 0x6C32,
- 20257: 0x6535,
- 20258: 0x6555,
- 20259: 0x656B,
- 20260: 0x724D,
- 20261: 0x7252,
- 20262: 0x7256,
- 20263: 0x7230,
- 20264: 0x8662,
- 20265: 0x5216,
- 20266: 0x809F,
- 20267: 0x809C,
- 20268: 0x8093,
- 20269: 0x80BC,
- 20270: 0x670A,
- 20271: 0x80BD,
- 20272: 0x80B1,
- 20273: 0x80AB,
- 20274: 0x80AD,
- 20275: 0x80B4,
- 20276: 0x80B7,
- 20277: 0x80E7,
- 20278: 0x80E8,
- 20279: 0x80E9,
- 20280: 0x80EA,
- 20281: 0x80DB,
- 20282: 0x80C2,
- 20283: 0x80C4,
- 20284: 0x80D9,
- 20285: 0x80CD,
- 20286: 0x80D7,
- 20287: 0x6710,
- 20288: 0x80DD,
- 20289: 0x80EB,
- 20290: 0x80F1,
- 20291: 0x80F4,
- 20292: 0x80ED,
- 20293: 0x810D,
- 20294: 0x810E,
- 20295: 0x80F2,
- 20296: 0x80FC,
- 20297: 0x6715,
- 20298: 0x8112,
- 20299: 0x8C5A,
- 20300: 0x8136,
- 20301: 0x811E,
- 20302: 0x812C,
- 20303: 0x8118,
- 20304: 0x8132,
- 20305: 0x8148,
- 20306: 0x814C,
- 20307: 0x8153,
- 20308: 0x8174,
- 20309: 0x8159,
- 20310: 0x815A,
- 20311: 0x8171,
- 20312: 0x8160,
- 20313: 0x8169,
- 20314: 0x817C,
- 20315: 0x817D,
- 20316: 0x816D,
- 20317: 0x8167,
- 20318: 0x584D,
- 20319: 0x5AB5,
- 20320: 0x8188,
- 20321: 0x8182,
- 20322: 0x8191,
- 20323: 0x6ED5,
- 20324: 0x81A3,
- 20325: 0x81AA,
- 20326: 0x81CC,
- 20327: 0x6726,
- 20328: 0x81CA,
- 20329: 0x81BB,
- 20330: 0x9721,
- 20331: 0x9722,
- 20332: 0x9723,
- 20333: 0x9724,
- 20334: 0x9725,
- 20335: 0x9726,
- 20336: 0x9727,
- 20337: 0x9728,
- 20338: 0x9729,
- 20339: 0x972B,
- 20340: 0x972C,
- 20341: 0x972E,
- 20342: 0x972F,
- 20343: 0x9731,
- 20344: 0x9733,
- 20345: 0x9734,
- 20346: 0x9735,
- 20347: 0x9736,
- 20348: 0x9737,
- 20349: 0x973A,
- 20350: 0x973B,
- 20351: 0x973C,
- 20352: 0x973D,
- 20353: 0x973F,
- 20354: 0x9740,
- 20355: 0x9741,
- 20356: 0x9742,
- 20357: 0x9743,
- 20358: 0x9744,
- 20359: 0x9745,
- 20360: 0x9746,
- 20361: 0x9747,
- 20362: 0x9748,
- 20363: 0x9749,
- 20364: 0x974A,
- 20365: 0x974B,
- 20366: 0x974C,
- 20367: 0x974D,
- 20368: 0x974E,
- 20369: 0x974F,
- 20370: 0x9750,
- 20371: 0x9751,
- 20372: 0x9754,
- 20373: 0x9755,
- 20374: 0x9757,
- 20375: 0x9758,
- 20376: 0x975A,
- 20377: 0x975C,
- 20378: 0x975D,
- 20379: 0x975F,
- 20380: 0x9763,
- 20381: 0x9764,
- 20382: 0x9766,
- 20383: 0x9767,
- 20384: 0x9768,
- 20385: 0x976A,
- 20386: 0x976B,
- 20387: 0x976C,
- 20388: 0x976D,
- 20389: 0x976E,
- 20390: 0x976F,
- 20391: 0x9770,
- 20392: 0x9771,
- 20393: 0x9772,
- 20394: 0x9775,
- 20395: 0x9777,
- 20396: 0x9778,
- 20397: 0x9779,
- 20398: 0x977A,
- 20399: 0x977B,
- 20400: 0x977D,
- 20401: 0x977E,
- 20402: 0x977F,
- 20403: 0x9780,
- 20404: 0x9781,
- 20405: 0x9782,
- 20406: 0x9783,
- 20407: 0x9784,
- 20408: 0x9786,
- 20409: 0x9787,
- 20410: 0x9788,
- 20411: 0x9789,
- 20412: 0x978A,
- 20413: 0x978C,
- 20414: 0x978E,
- 20415: 0x978F,
- 20416: 0x9790,
- 20417: 0x9793,
- 20418: 0x9795,
- 20419: 0x9796,
- 20420: 0x9797,
- 20421: 0x9799,
- 20422: 0x979A,
- 20423: 0x979B,
- 20424: 0x979C,
- 20425: 0x979D,
- 20426: 0x81C1,
- 20427: 0x81A6,
- 20428: 0x6B24,
- 20429: 0x6B37,
- 20430: 0x6B39,
- 20431: 0x6B43,
- 20432: 0x6B46,
- 20433: 0x6B59,
- 20434: 0x98D1,
- 20435: 0x98D2,
- 20436: 0x98D3,
- 20437: 0x98D5,
- 20438: 0x98D9,
- 20439: 0x98DA,
- 20440: 0x6BB3,
- 20441: 0x5F40,
- 20442: 0x6BC2,
- 20443: 0x89F3,
- 20444: 0x6590,
- 20445: 0x9F51,
- 20446: 0x6593,
- 20447: 0x65BC,
- 20448: 0x65C6,
- 20449: 0x65C4,
- 20450: 0x65C3,
- 20451: 0x65CC,
- 20452: 0x65CE,
- 20453: 0x65D2,
- 20454: 0x65D6,
- 20455: 0x7080,
- 20456: 0x709C,
- 20457: 0x7096,
- 20458: 0x709D,
- 20459: 0x70BB,
- 20460: 0x70C0,
- 20461: 0x70B7,
- 20462: 0x70AB,
- 20463: 0x70B1,
- 20464: 0x70E8,
- 20465: 0x70CA,
- 20466: 0x7110,
- 20467: 0x7113,
- 20468: 0x7116,
- 20469: 0x712F,
- 20470: 0x7131,
- 20471: 0x7173,
- 20472: 0x715C,
- 20473: 0x7168,
- 20474: 0x7145,
- 20475: 0x7172,
- 20476: 0x714A,
- 20477: 0x7178,
- 20478: 0x717A,
- 20479: 0x7198,
- 20480: 0x71B3,
- 20481: 0x71B5,
- 20482: 0x71A8,
- 20483: 0x71A0,
- 20484: 0x71E0,
- 20485: 0x71D4,
- 20486: 0x71E7,
- 20487: 0x71F9,
- 20488: 0x721D,
- 20489: 0x7228,
- 20490: 0x706C,
- 20491: 0x7118,
- 20492: 0x7166,
- 20493: 0x71B9,
- 20494: 0x623E,
- 20495: 0x623D,
- 20496: 0x6243,
- 20497: 0x6248,
- 20498: 0x6249,
- 20499: 0x793B,
- 20500: 0x7940,
- 20501: 0x7946,
- 20502: 0x7949,
- 20503: 0x795B,
- 20504: 0x795C,
- 20505: 0x7953,
- 20506: 0x795A,
- 20507: 0x7962,
- 20508: 0x7957,
- 20509: 0x7960,
- 20510: 0x796F,
- 20511: 0x7967,
- 20512: 0x797A,
- 20513: 0x7985,
- 20514: 0x798A,
- 20515: 0x799A,
- 20516: 0x79A7,
- 20517: 0x79B3,
- 20518: 0x5FD1,
- 20519: 0x5FD0,
- 20520: 0x979E,
- 20521: 0x979F,
- 20522: 0x97A1,
- 20523: 0x97A2,
- 20524: 0x97A4,
- 20525: 0x97A5,
- 20526: 0x97A6,
- 20527: 0x97A7,
- 20528: 0x97A8,
- 20529: 0x97A9,
- 20530: 0x97AA,
- 20531: 0x97AC,
- 20532: 0x97AE,
- 20533: 0x97B0,
- 20534: 0x97B1,
- 20535: 0x97B3,
- 20536: 0x97B5,
- 20537: 0x97B6,
- 20538: 0x97B7,
- 20539: 0x97B8,
- 20540: 0x97B9,
- 20541: 0x97BA,
- 20542: 0x97BB,
- 20543: 0x97BC,
- 20544: 0x97BD,
- 20545: 0x97BE,
- 20546: 0x97BF,
- 20547: 0x97C0,
- 20548: 0x97C1,
- 20549: 0x97C2,
- 20550: 0x97C3,
- 20551: 0x97C4,
- 20552: 0x97C5,
- 20553: 0x97C6,
- 20554: 0x97C7,
- 20555: 0x97C8,
- 20556: 0x97C9,
- 20557: 0x97CA,
- 20558: 0x97CB,
- 20559: 0x97CC,
- 20560: 0x97CD,
- 20561: 0x97CE,
- 20562: 0x97CF,
- 20563: 0x97D0,
- 20564: 0x97D1,
- 20565: 0x97D2,
- 20566: 0x97D3,
- 20567: 0x97D4,
- 20568: 0x97D5,
- 20569: 0x97D6,
- 20570: 0x97D7,
- 20571: 0x97D8,
- 20572: 0x97D9,
- 20573: 0x97DA,
- 20574: 0x97DB,
- 20575: 0x97DC,
- 20576: 0x97DD,
- 20577: 0x97DE,
- 20578: 0x97DF,
- 20579: 0x97E0,
- 20580: 0x97E1,
- 20581: 0x97E2,
- 20582: 0x97E3,
- 20583: 0x97E4,
- 20584: 0x97E5,
- 20585: 0x97E8,
- 20586: 0x97EE,
- 20587: 0x97EF,
- 20588: 0x97F0,
- 20589: 0x97F1,
- 20590: 0x97F2,
- 20591: 0x97F4,
- 20592: 0x97F7,
- 20593: 0x97F8,
- 20594: 0x97F9,
- 20595: 0x97FA,
- 20596: 0x97FB,
- 20597: 0x97FC,
- 20598: 0x97FD,
- 20599: 0x97FE,
- 20600: 0x97FF,
- 20601: 0x9800,
- 20602: 0x9801,
- 20603: 0x9802,
- 20604: 0x9803,
- 20605: 0x9804,
- 20606: 0x9805,
- 20607: 0x9806,
- 20608: 0x9807,
- 20609: 0x9808,
- 20610: 0x9809,
- 20611: 0x980A,
- 20612: 0x980B,
- 20613: 0x980C,
- 20614: 0x980D,
- 20615: 0x980E,
- 20616: 0x603C,
- 20617: 0x605D,
- 20618: 0x605A,
- 20619: 0x6067,
- 20620: 0x6041,
- 20621: 0x6059,
- 20622: 0x6063,
- 20623: 0x60AB,
- 20624: 0x6106,
- 20625: 0x610D,
- 20626: 0x615D,
- 20627: 0x61A9,
- 20628: 0x619D,
- 20629: 0x61CB,
- 20630: 0x61D1,
- 20631: 0x6206,
- 20632: 0x8080,
- 20633: 0x807F,
- 20634: 0x6C93,
- 20635: 0x6CF6,
- 20636: 0x6DFC,
- 20637: 0x77F6,
- 20638: 0x77F8,
- 20639: 0x7800,
- 20640: 0x7809,
- 20641: 0x7817,
- 20642: 0x7818,
- 20643: 0x7811,
- 20644: 0x65AB,
- 20645: 0x782D,
- 20646: 0x781C,
- 20647: 0x781D,
- 20648: 0x7839,
- 20649: 0x783A,
- 20650: 0x783B,
- 20651: 0x781F,
- 20652: 0x783C,
- 20653: 0x7825,
- 20654: 0x782C,
- 20655: 0x7823,
- 20656: 0x7829,
- 20657: 0x784E,
- 20658: 0x786D,
- 20659: 0x7856,
- 20660: 0x7857,
- 20661: 0x7826,
- 20662: 0x7850,
- 20663: 0x7847,
- 20664: 0x784C,
- 20665: 0x786A,
- 20666: 0x789B,
- 20667: 0x7893,
- 20668: 0x789A,
- 20669: 0x7887,
- 20670: 0x789C,
- 20671: 0x78A1,
- 20672: 0x78A3,
- 20673: 0x78B2,
- 20674: 0x78B9,
- 20675: 0x78A5,
- 20676: 0x78D4,
- 20677: 0x78D9,
- 20678: 0x78C9,
- 20679: 0x78EC,
- 20680: 0x78F2,
- 20681: 0x7905,
- 20682: 0x78F4,
- 20683: 0x7913,
- 20684: 0x7924,
- 20685: 0x791E,
- 20686: 0x7934,
- 20687: 0x9F9B,
- 20688: 0x9EF9,
- 20689: 0x9EFB,
- 20690: 0x9EFC,
- 20691: 0x76F1,
- 20692: 0x7704,
- 20693: 0x770D,
- 20694: 0x76F9,
- 20695: 0x7707,
- 20696: 0x7708,
- 20697: 0x771A,
- 20698: 0x7722,
- 20699: 0x7719,
- 20700: 0x772D,
- 20701: 0x7726,
- 20702: 0x7735,
- 20703: 0x7738,
- 20704: 0x7750,
- 20705: 0x7751,
- 20706: 0x7747,
- 20707: 0x7743,
- 20708: 0x775A,
- 20709: 0x7768,
- 20710: 0x980F,
- 20711: 0x9810,
- 20712: 0x9811,
- 20713: 0x9812,
- 20714: 0x9813,
- 20715: 0x9814,
- 20716: 0x9815,
- 20717: 0x9816,
- 20718: 0x9817,
- 20719: 0x9818,
- 20720: 0x9819,
- 20721: 0x981A,
- 20722: 0x981B,
- 20723: 0x981C,
- 20724: 0x981D,
- 20725: 0x981E,
- 20726: 0x981F,
- 20727: 0x9820,
- 20728: 0x9821,
- 20729: 0x9822,
- 20730: 0x9823,
- 20731: 0x9824,
- 20732: 0x9825,
- 20733: 0x9826,
- 20734: 0x9827,
- 20735: 0x9828,
- 20736: 0x9829,
- 20737: 0x982A,
- 20738: 0x982B,
- 20739: 0x982C,
- 20740: 0x982D,
- 20741: 0x982E,
- 20742: 0x982F,
- 20743: 0x9830,
- 20744: 0x9831,
- 20745: 0x9832,
- 20746: 0x9833,
- 20747: 0x9834,
- 20748: 0x9835,
- 20749: 0x9836,
- 20750: 0x9837,
- 20751: 0x9838,
- 20752: 0x9839,
- 20753: 0x983A,
- 20754: 0x983B,
- 20755: 0x983C,
- 20756: 0x983D,
- 20757: 0x983E,
- 20758: 0x983F,
- 20759: 0x9840,
- 20760: 0x9841,
- 20761: 0x9842,
- 20762: 0x9843,
- 20763: 0x9844,
- 20764: 0x9845,
- 20765: 0x9846,
- 20766: 0x9847,
- 20767: 0x9848,
- 20768: 0x9849,
- 20769: 0x984A,
- 20770: 0x984B,
- 20771: 0x984C,
- 20772: 0x984D,
- 20773: 0x984E,
- 20774: 0x984F,
- 20775: 0x9850,
- 20776: 0x9851,
- 20777: 0x9852,
- 20778: 0x9853,
- 20779: 0x9854,
- 20780: 0x9855,
- 20781: 0x9856,
- 20782: 0x9857,
- 20783: 0x9858,
- 20784: 0x9859,
- 20785: 0x985A,
- 20786: 0x985B,
- 20787: 0x985C,
- 20788: 0x985D,
- 20789: 0x985E,
- 20790: 0x985F,
- 20791: 0x9860,
- 20792: 0x9861,
- 20793: 0x9862,
- 20794: 0x9863,
- 20795: 0x9864,
- 20796: 0x9865,
- 20797: 0x9866,
- 20798: 0x9867,
- 20799: 0x9868,
- 20800: 0x9869,
- 20801: 0x986A,
- 20802: 0x986B,
- 20803: 0x986C,
- 20804: 0x986D,
- 20805: 0x986E,
- 20806: 0x7762,
- 20807: 0x7765,
- 20808: 0x777F,
- 20809: 0x778D,
- 20810: 0x777D,
- 20811: 0x7780,
- 20812: 0x778C,
- 20813: 0x7791,
- 20814: 0x779F,
- 20815: 0x77A0,
- 20816: 0x77B0,
- 20817: 0x77B5,
- 20818: 0x77BD,
- 20819: 0x753A,
- 20820: 0x7540,
- 20821: 0x754E,
- 20822: 0x754B,
- 20823: 0x7548,
- 20824: 0x755B,
- 20825: 0x7572,
- 20826: 0x7579,
- 20827: 0x7583,
- 20828: 0x7F58,
- 20829: 0x7F61,
- 20830: 0x7F5F,
- 20831: 0x8A48,
- 20832: 0x7F68,
- 20833: 0x7F74,
- 20834: 0x7F71,
- 20835: 0x7F79,
- 20836: 0x7F81,
- 20837: 0x7F7E,
- 20838: 0x76CD,
- 20839: 0x76E5,
- 20840: 0x8832,
- 20841: 0x9485,
- 20842: 0x9486,
- 20843: 0x9487,
- 20844: 0x948B,
- 20845: 0x948A,
- 20846: 0x948C,
- 20847: 0x948D,
- 20848: 0x948F,
- 20849: 0x9490,
- 20850: 0x9494,
- 20851: 0x9497,
- 20852: 0x9495,
- 20853: 0x949A,
- 20854: 0x949B,
- 20855: 0x949C,
- 20856: 0x94A3,
- 20857: 0x94A4,
- 20858: 0x94AB,
- 20859: 0x94AA,
- 20860: 0x94AD,
- 20861: 0x94AC,
- 20862: 0x94AF,
- 20863: 0x94B0,
- 20864: 0x94B2,
- 20865: 0x94B4,
- 20866: 0x94B6,
- 20867: 0x94B7,
- 20868: 0x94B8,
- 20869: 0x94B9,
- 20870: 0x94BA,
- 20871: 0x94BC,
- 20872: 0x94BD,
- 20873: 0x94BF,
- 20874: 0x94C4,
- 20875: 0x94C8,
- 20876: 0x94C9,
- 20877: 0x94CA,
- 20878: 0x94CB,
- 20879: 0x94CC,
- 20880: 0x94CD,
- 20881: 0x94CE,
- 20882: 0x94D0,
- 20883: 0x94D1,
- 20884: 0x94D2,
- 20885: 0x94D5,
- 20886: 0x94D6,
- 20887: 0x94D7,
- 20888: 0x94D9,
- 20889: 0x94D8,
- 20890: 0x94DB,
- 20891: 0x94DE,
- 20892: 0x94DF,
- 20893: 0x94E0,
- 20894: 0x94E2,
- 20895: 0x94E4,
- 20896: 0x94E5,
- 20897: 0x94E7,
- 20898: 0x94E8,
- 20899: 0x94EA,
- 20900: 0x986F,
- 20901: 0x9870,
- 20902: 0x9871,
- 20903: 0x9872,
- 20904: 0x9873,
- 20905: 0x9874,
- 20906: 0x988B,
- 20907: 0x988E,
- 20908: 0x9892,
- 20909: 0x9895,
- 20910: 0x9899,
- 20911: 0x98A3,
- 20912: 0x98A8,
- 20913: 0x98A9,
- 20914: 0x98AA,
- 20915: 0x98AB,
- 20916: 0x98AC,
- 20917: 0x98AD,
- 20918: 0x98AE,
- 20919: 0x98AF,
- 20920: 0x98B0,
- 20921: 0x98B1,
- 20922: 0x98B2,
- 20923: 0x98B3,
- 20924: 0x98B4,
- 20925: 0x98B5,
- 20926: 0x98B6,
- 20927: 0x98B7,
- 20928: 0x98B8,
- 20929: 0x98B9,
- 20930: 0x98BA,
- 20931: 0x98BB,
- 20932: 0x98BC,
- 20933: 0x98BD,
- 20934: 0x98BE,
- 20935: 0x98BF,
- 20936: 0x98C0,
- 20937: 0x98C1,
- 20938: 0x98C2,
- 20939: 0x98C3,
- 20940: 0x98C4,
- 20941: 0x98C5,
- 20942: 0x98C6,
- 20943: 0x98C7,
- 20944: 0x98C8,
- 20945: 0x98C9,
- 20946: 0x98CA,
- 20947: 0x98CB,
- 20948: 0x98CC,
- 20949: 0x98CD,
- 20950: 0x98CF,
- 20951: 0x98D0,
- 20952: 0x98D4,
- 20953: 0x98D6,
- 20954: 0x98D7,
- 20955: 0x98DB,
- 20956: 0x98DC,
- 20957: 0x98DD,
- 20958: 0x98E0,
- 20959: 0x98E1,
- 20960: 0x98E2,
- 20961: 0x98E3,
- 20962: 0x98E4,
- 20963: 0x98E5,
- 20964: 0x98E6,
- 20965: 0x98E9,
- 20966: 0x98EA,
- 20967: 0x98EB,
- 20968: 0x98EC,
- 20969: 0x98ED,
- 20970: 0x98EE,
- 20971: 0x98EF,
- 20972: 0x98F0,
- 20973: 0x98F1,
- 20974: 0x98F2,
- 20975: 0x98F3,
- 20976: 0x98F4,
- 20977: 0x98F5,
- 20978: 0x98F6,
- 20979: 0x98F7,
- 20980: 0x98F8,
- 20981: 0x98F9,
- 20982: 0x98FA,
- 20983: 0x98FB,
- 20984: 0x98FC,
- 20985: 0x98FD,
- 20986: 0x98FE,
- 20987: 0x98FF,
- 20988: 0x9900,
- 20989: 0x9901,
- 20990: 0x9902,
- 20991: 0x9903,
- 20992: 0x9904,
- 20993: 0x9905,
- 20994: 0x9906,
- 20995: 0x9907,
- 20996: 0x94E9,
- 20997: 0x94EB,
- 20998: 0x94EE,
- 20999: 0x94EF,
- 21000: 0x94F3,
- 21001: 0x94F4,
- 21002: 0x94F5,
- 21003: 0x94F7,
- 21004: 0x94F9,
- 21005: 0x94FC,
- 21006: 0x94FD,
- 21007: 0x94FF,
- 21008: 0x9503,
- 21009: 0x9502,
- 21010: 0x9506,
- 21011: 0x9507,
- 21012: 0x9509,
- 21013: 0x950A,
- 21014: 0x950D,
- 21015: 0x950E,
- 21016: 0x950F,
- 21017: 0x9512,
- 21018: 0x9513,
- 21019: 0x9514,
- 21020: 0x9515,
- 21021: 0x9516,
- 21022: 0x9518,
- 21023: 0x951B,
- 21024: 0x951D,
- 21025: 0x951E,
- 21026: 0x951F,
- 21027: 0x9522,
- 21028: 0x952A,
- 21029: 0x952B,
- 21030: 0x9529,
- 21031: 0x952C,
- 21032: 0x9531,
- 21033: 0x9532,
- 21034: 0x9534,
- 21035: 0x9536,
- 21036: 0x9537,
- 21037: 0x9538,
- 21038: 0x953C,
- 21039: 0x953E,
- 21040: 0x953F,
- 21041: 0x9542,
- 21042: 0x9535,
- 21043: 0x9544,
- 21044: 0x9545,
- 21045: 0x9546,
- 21046: 0x9549,
- 21047: 0x954C,
- 21048: 0x954E,
- 21049: 0x954F,
- 21050: 0x9552,
- 21051: 0x9553,
- 21052: 0x9554,
- 21053: 0x9556,
- 21054: 0x9557,
- 21055: 0x9558,
- 21056: 0x9559,
- 21057: 0x955B,
- 21058: 0x955E,
- 21059: 0x955F,
- 21060: 0x955D,
- 21061: 0x9561,
- 21062: 0x9562,
- 21063: 0x9564,
- 21064: 0x9565,
- 21065: 0x9566,
- 21066: 0x9567,
- 21067: 0x9568,
- 21068: 0x9569,
- 21069: 0x956A,
- 21070: 0x956B,
- 21071: 0x956C,
- 21072: 0x956F,
- 21073: 0x9571,
- 21074: 0x9572,
- 21075: 0x9573,
- 21076: 0x953A,
- 21077: 0x77E7,
- 21078: 0x77EC,
- 21079: 0x96C9,
- 21080: 0x79D5,
- 21081: 0x79ED,
- 21082: 0x79E3,
- 21083: 0x79EB,
- 21084: 0x7A06,
- 21085: 0x5D47,
- 21086: 0x7A03,
- 21087: 0x7A02,
- 21088: 0x7A1E,
- 21089: 0x7A14,
- 21090: 0x9908,
- 21091: 0x9909,
- 21092: 0x990A,
- 21093: 0x990B,
- 21094: 0x990C,
- 21095: 0x990E,
- 21096: 0x990F,
- 21097: 0x9911,
- 21098: 0x9912,
- 21099: 0x9913,
- 21100: 0x9914,
- 21101: 0x9915,
- 21102: 0x9916,
- 21103: 0x9917,
- 21104: 0x9918,
- 21105: 0x9919,
- 21106: 0x991A,
- 21107: 0x991B,
- 21108: 0x991C,
- 21109: 0x991D,
- 21110: 0x991E,
- 21111: 0x991F,
- 21112: 0x9920,
- 21113: 0x9921,
- 21114: 0x9922,
- 21115: 0x9923,
- 21116: 0x9924,
- 21117: 0x9925,
- 21118: 0x9926,
- 21119: 0x9927,
- 21120: 0x9928,
- 21121: 0x9929,
- 21122: 0x992A,
- 21123: 0x992B,
- 21124: 0x992C,
- 21125: 0x992D,
- 21126: 0x992F,
- 21127: 0x9930,
- 21128: 0x9931,
- 21129: 0x9932,
- 21130: 0x9933,
- 21131: 0x9934,
- 21132: 0x9935,
- 21133: 0x9936,
- 21134: 0x9937,
- 21135: 0x9938,
- 21136: 0x9939,
- 21137: 0x993A,
- 21138: 0x993B,
- 21139: 0x993C,
- 21140: 0x993D,
- 21141: 0x993E,
- 21142: 0x993F,
- 21143: 0x9940,
- 21144: 0x9941,
- 21145: 0x9942,
- 21146: 0x9943,
- 21147: 0x9944,
- 21148: 0x9945,
- 21149: 0x9946,
- 21150: 0x9947,
- 21151: 0x9948,
- 21152: 0x9949,
- 21153: 0x994A,
- 21154: 0x994B,
- 21155: 0x994C,
- 21156: 0x994D,
- 21157: 0x994E,
- 21158: 0x994F,
- 21159: 0x9950,
- 21160: 0x9951,
- 21161: 0x9952,
- 21162: 0x9953,
- 21163: 0x9956,
- 21164: 0x9957,
- 21165: 0x9958,
- 21166: 0x9959,
- 21167: 0x995A,
- 21168: 0x995B,
- 21169: 0x995C,
- 21170: 0x995D,
- 21171: 0x995E,
- 21172: 0x995F,
- 21173: 0x9960,
- 21174: 0x9961,
- 21175: 0x9962,
- 21176: 0x9964,
- 21177: 0x9966,
- 21178: 0x9973,
- 21179: 0x9978,
- 21180: 0x9979,
- 21181: 0x997B,
- 21182: 0x997E,
- 21183: 0x9982,
- 21184: 0x9983,
- 21185: 0x9989,
- 21186: 0x7A39,
- 21187: 0x7A37,
- 21188: 0x7A51,
- 21189: 0x9ECF,
- 21190: 0x99A5,
- 21191: 0x7A70,
- 21192: 0x7688,
- 21193: 0x768E,
- 21194: 0x7693,
- 21195: 0x7699,
- 21196: 0x76A4,
- 21197: 0x74DE,
- 21198: 0x74E0,
- 21199: 0x752C,
- 21200: 0x9E20,
- 21201: 0x9E22,
- 21202: 0x9E28,
- 21203: 0x9E29,
- 21204: 0x9E2A,
- 21205: 0x9E2B,
- 21206: 0x9E2C,
- 21207: 0x9E32,
- 21208: 0x9E31,
- 21209: 0x9E36,
- 21210: 0x9E38,
- 21211: 0x9E37,
- 21212: 0x9E39,
- 21213: 0x9E3A,
- 21214: 0x9E3E,
- 21215: 0x9E41,
- 21216: 0x9E42,
- 21217: 0x9E44,
- 21218: 0x9E46,
- 21219: 0x9E47,
- 21220: 0x9E48,
- 21221: 0x9E49,
- 21222: 0x9E4B,
- 21223: 0x9E4C,
- 21224: 0x9E4E,
- 21225: 0x9E51,
- 21226: 0x9E55,
- 21227: 0x9E57,
- 21228: 0x9E5A,
- 21229: 0x9E5B,
- 21230: 0x9E5C,
- 21231: 0x9E5E,
- 21232: 0x9E63,
- 21233: 0x9E66,
- 21234: 0x9E67,
- 21235: 0x9E68,
- 21236: 0x9E69,
- 21237: 0x9E6A,
- 21238: 0x9E6B,
- 21239: 0x9E6C,
- 21240: 0x9E71,
- 21241: 0x9E6D,
- 21242: 0x9E73,
- 21243: 0x7592,
- 21244: 0x7594,
- 21245: 0x7596,
- 21246: 0x75A0,
- 21247: 0x759D,
- 21248: 0x75AC,
- 21249: 0x75A3,
- 21250: 0x75B3,
- 21251: 0x75B4,
- 21252: 0x75B8,
- 21253: 0x75C4,
- 21254: 0x75B1,
- 21255: 0x75B0,
- 21256: 0x75C3,
- 21257: 0x75C2,
- 21258: 0x75D6,
- 21259: 0x75CD,
- 21260: 0x75E3,
- 21261: 0x75E8,
- 21262: 0x75E6,
- 21263: 0x75E4,
- 21264: 0x75EB,
- 21265: 0x75E7,
- 21266: 0x7603,
- 21267: 0x75F1,
- 21268: 0x75FC,
- 21269: 0x75FF,
- 21270: 0x7610,
- 21271: 0x7600,
- 21272: 0x7605,
- 21273: 0x760C,
- 21274: 0x7617,
- 21275: 0x760A,
- 21276: 0x7625,
- 21277: 0x7618,
- 21278: 0x7615,
- 21279: 0x7619,
- 21280: 0x998C,
- 21281: 0x998E,
- 21282: 0x999A,
- 21283: 0x999B,
- 21284: 0x999C,
- 21285: 0x999D,
- 21286: 0x999E,
- 21287: 0x999F,
- 21288: 0x99A0,
- 21289: 0x99A1,
- 21290: 0x99A2,
- 21291: 0x99A3,
- 21292: 0x99A4,
- 21293: 0x99A6,
- 21294: 0x99A7,
- 21295: 0x99A9,
- 21296: 0x99AA,
- 21297: 0x99AB,
- 21298: 0x99AC,
- 21299: 0x99AD,
- 21300: 0x99AE,
- 21301: 0x99AF,
- 21302: 0x99B0,
- 21303: 0x99B1,
- 21304: 0x99B2,
- 21305: 0x99B3,
- 21306: 0x99B4,
- 21307: 0x99B5,
- 21308: 0x99B6,
- 21309: 0x99B7,
- 21310: 0x99B8,
- 21311: 0x99B9,
- 21312: 0x99BA,
- 21313: 0x99BB,
- 21314: 0x99BC,
- 21315: 0x99BD,
- 21316: 0x99BE,
- 21317: 0x99BF,
- 21318: 0x99C0,
- 21319: 0x99C1,
- 21320: 0x99C2,
- 21321: 0x99C3,
- 21322: 0x99C4,
- 21323: 0x99C5,
- 21324: 0x99C6,
- 21325: 0x99C7,
- 21326: 0x99C8,
- 21327: 0x99C9,
- 21328: 0x99CA,
- 21329: 0x99CB,
- 21330: 0x99CC,
- 21331: 0x99CD,
- 21332: 0x99CE,
- 21333: 0x99CF,
- 21334: 0x99D0,
- 21335: 0x99D1,
- 21336: 0x99D2,
- 21337: 0x99D3,
- 21338: 0x99D4,
- 21339: 0x99D5,
- 21340: 0x99D6,
- 21341: 0x99D7,
- 21342: 0x99D8,
- 21343: 0x99D9,
- 21344: 0x99DA,
- 21345: 0x99DB,
- 21346: 0x99DC,
- 21347: 0x99DD,
- 21348: 0x99DE,
- 21349: 0x99DF,
- 21350: 0x99E0,
- 21351: 0x99E1,
- 21352: 0x99E2,
- 21353: 0x99E3,
- 21354: 0x99E4,
- 21355: 0x99E5,
- 21356: 0x99E6,
- 21357: 0x99E7,
- 21358: 0x99E8,
- 21359: 0x99E9,
- 21360: 0x99EA,
- 21361: 0x99EB,
- 21362: 0x99EC,
- 21363: 0x99ED,
- 21364: 0x99EE,
- 21365: 0x99EF,
- 21366: 0x99F0,
- 21367: 0x99F1,
- 21368: 0x99F2,
- 21369: 0x99F3,
- 21370: 0x99F4,
- 21371: 0x99F5,
- 21372: 0x99F6,
- 21373: 0x99F7,
- 21374: 0x99F8,
- 21375: 0x99F9,
- 21376: 0x761B,
- 21377: 0x763C,
- 21378: 0x7622,
- 21379: 0x7620,
- 21380: 0x7640,
- 21381: 0x762D,
- 21382: 0x7630,
- 21383: 0x763F,
- 21384: 0x7635,
- 21385: 0x7643,
- 21386: 0x763E,
- 21387: 0x7633,
- 21388: 0x764D,
- 21389: 0x765E,
- 21390: 0x7654,
- 21391: 0x765C,
- 21392: 0x7656,
- 21393: 0x766B,
- 21394: 0x766F,
- 21395: 0x7FCA,
- 21396: 0x7AE6,
- 21397: 0x7A78,
- 21398: 0x7A79,
- 21399: 0x7A80,
- 21400: 0x7A86,
- 21401: 0x7A88,
- 21402: 0x7A95,
- 21403: 0x7AA6,
- 21404: 0x7AA0,
- 21405: 0x7AAC,
- 21406: 0x7AA8,
- 21407: 0x7AAD,
- 21408: 0x7AB3,
- 21409: 0x8864,
- 21410: 0x8869,
- 21411: 0x8872,
- 21412: 0x887D,
- 21413: 0x887F,
- 21414: 0x8882,
- 21415: 0x88A2,
- 21416: 0x88C6,
- 21417: 0x88B7,
- 21418: 0x88BC,
- 21419: 0x88C9,
- 21420: 0x88E2,
- 21421: 0x88CE,
- 21422: 0x88E3,
- 21423: 0x88E5,
- 21424: 0x88F1,
- 21425: 0x891A,
- 21426: 0x88FC,
- 21427: 0x88E8,
- 21428: 0x88FE,
- 21429: 0x88F0,
- 21430: 0x8921,
- 21431: 0x8919,
- 21432: 0x8913,
- 21433: 0x891B,
- 21434: 0x890A,
- 21435: 0x8934,
- 21436: 0x892B,
- 21437: 0x8936,
- 21438: 0x8941,
- 21439: 0x8966,
- 21440: 0x897B,
- 21441: 0x758B,
- 21442: 0x80E5,
- 21443: 0x76B2,
- 21444: 0x76B4,
- 21445: 0x77DC,
- 21446: 0x8012,
- 21447: 0x8014,
- 21448: 0x8016,
- 21449: 0x801C,
- 21450: 0x8020,
- 21451: 0x8022,
- 21452: 0x8025,
- 21453: 0x8026,
- 21454: 0x8027,
- 21455: 0x8029,
- 21456: 0x8028,
- 21457: 0x8031,
- 21458: 0x800B,
- 21459: 0x8035,
- 21460: 0x8043,
- 21461: 0x8046,
- 21462: 0x804D,
- 21463: 0x8052,
- 21464: 0x8069,
- 21465: 0x8071,
- 21466: 0x8983,
- 21467: 0x9878,
- 21468: 0x9880,
- 21469: 0x9883,
- 21470: 0x99FA,
- 21471: 0x99FB,
- 21472: 0x99FC,
- 21473: 0x99FD,
- 21474: 0x99FE,
- 21475: 0x99FF,
- 21476: 0x9A00,
- 21477: 0x9A01,
- 21478: 0x9A02,
- 21479: 0x9A03,
- 21480: 0x9A04,
- 21481: 0x9A05,
- 21482: 0x9A06,
- 21483: 0x9A07,
- 21484: 0x9A08,
- 21485: 0x9A09,
- 21486: 0x9A0A,
- 21487: 0x9A0B,
- 21488: 0x9A0C,
- 21489: 0x9A0D,
- 21490: 0x9A0E,
- 21491: 0x9A0F,
- 21492: 0x9A10,
- 21493: 0x9A11,
- 21494: 0x9A12,
- 21495: 0x9A13,
- 21496: 0x9A14,
- 21497: 0x9A15,
- 21498: 0x9A16,
- 21499: 0x9A17,
- 21500: 0x9A18,
- 21501: 0x9A19,
- 21502: 0x9A1A,
- 21503: 0x9A1B,
- 21504: 0x9A1C,
- 21505: 0x9A1D,
- 21506: 0x9A1E,
- 21507: 0x9A1F,
- 21508: 0x9A20,
- 21509: 0x9A21,
- 21510: 0x9A22,
- 21511: 0x9A23,
- 21512: 0x9A24,
- 21513: 0x9A25,
- 21514: 0x9A26,
- 21515: 0x9A27,
- 21516: 0x9A28,
- 21517: 0x9A29,
- 21518: 0x9A2A,
- 21519: 0x9A2B,
- 21520: 0x9A2C,
- 21521: 0x9A2D,
- 21522: 0x9A2E,
- 21523: 0x9A2F,
- 21524: 0x9A30,
- 21525: 0x9A31,
- 21526: 0x9A32,
- 21527: 0x9A33,
- 21528: 0x9A34,
- 21529: 0x9A35,
- 21530: 0x9A36,
- 21531: 0x9A37,
- 21532: 0x9A38,
- 21533: 0x9A39,
- 21534: 0x9A3A,
- 21535: 0x9A3B,
- 21536: 0x9A3C,
- 21537: 0x9A3D,
- 21538: 0x9A3E,
- 21539: 0x9A3F,
- 21540: 0x9A40,
- 21541: 0x9A41,
- 21542: 0x9A42,
- 21543: 0x9A43,
- 21544: 0x9A44,
- 21545: 0x9A45,
- 21546: 0x9A46,
- 21547: 0x9A47,
- 21548: 0x9A48,
- 21549: 0x9A49,
- 21550: 0x9A4A,
- 21551: 0x9A4B,
- 21552: 0x9A4C,
- 21553: 0x9A4D,
- 21554: 0x9A4E,
- 21555: 0x9A4F,
- 21556: 0x9A50,
- 21557: 0x9A51,
- 21558: 0x9A52,
- 21559: 0x9A53,
- 21560: 0x9A54,
- 21561: 0x9A55,
- 21562: 0x9A56,
- 21563: 0x9A57,
- 21564: 0x9A58,
- 21565: 0x9A59,
- 21566: 0x9889,
- 21567: 0x988C,
- 21568: 0x988D,
- 21569: 0x988F,
- 21570: 0x9894,
- 21571: 0x989A,
- 21572: 0x989B,
- 21573: 0x989E,
- 21574: 0x989F,
- 21575: 0x98A1,
- 21576: 0x98A2,
- 21577: 0x98A5,
- 21578: 0x98A6,
- 21579: 0x864D,
- 21580: 0x8654,
- 21581: 0x866C,
- 21582: 0x866E,
- 21583: 0x867F,
- 21584: 0x867A,
- 21585: 0x867C,
- 21586: 0x867B,
- 21587: 0x86A8,
- 21588: 0x868D,
- 21589: 0x868B,
- 21590: 0x86AC,
- 21591: 0x869D,
- 21592: 0x86A7,
- 21593: 0x86A3,
- 21594: 0x86AA,
- 21595: 0x8693,
- 21596: 0x86A9,
- 21597: 0x86B6,
- 21598: 0x86C4,
- 21599: 0x86B5,
- 21600: 0x86CE,
- 21601: 0x86B0,
- 21602: 0x86BA,
- 21603: 0x86B1,
- 21604: 0x86AF,
- 21605: 0x86C9,
- 21606: 0x86CF,
- 21607: 0x86B4,
- 21608: 0x86E9,
- 21609: 0x86F1,
- 21610: 0x86F2,
- 21611: 0x86ED,
- 21612: 0x86F3,
- 21613: 0x86D0,
- 21614: 0x8713,
- 21615: 0x86DE,
- 21616: 0x86F4,
- 21617: 0x86DF,
- 21618: 0x86D8,
- 21619: 0x86D1,
- 21620: 0x8703,
- 21621: 0x8707,
- 21622: 0x86F8,
- 21623: 0x8708,
- 21624: 0x870A,
- 21625: 0x870D,
- 21626: 0x8709,
- 21627: 0x8723,
- 21628: 0x873B,
- 21629: 0x871E,
- 21630: 0x8725,
- 21631: 0x872E,
- 21632: 0x871A,
- 21633: 0x873E,
- 21634: 0x8748,
- 21635: 0x8734,
- 21636: 0x8731,
- 21637: 0x8729,
- 21638: 0x8737,
- 21639: 0x873F,
- 21640: 0x8782,
- 21641: 0x8722,
- 21642: 0x877D,
- 21643: 0x877E,
- 21644: 0x877B,
- 21645: 0x8760,
- 21646: 0x8770,
- 21647: 0x874C,
- 21648: 0x876E,
- 21649: 0x878B,
- 21650: 0x8753,
- 21651: 0x8763,
- 21652: 0x877C,
- 21653: 0x8764,
- 21654: 0x8759,
- 21655: 0x8765,
- 21656: 0x8793,
- 21657: 0x87AF,
- 21658: 0x87A8,
- 21659: 0x87D2,
- 21660: 0x9A5A,
- 21661: 0x9A5B,
- 21662: 0x9A5C,
- 21663: 0x9A5D,
- 21664: 0x9A5E,
- 21665: 0x9A5F,
- 21666: 0x9A60,
- 21667: 0x9A61,
- 21668: 0x9A62,
- 21669: 0x9A63,
- 21670: 0x9A64,
- 21671: 0x9A65,
- 21672: 0x9A66,
- 21673: 0x9A67,
- 21674: 0x9A68,
- 21675: 0x9A69,
- 21676: 0x9A6A,
- 21677: 0x9A6B,
- 21678: 0x9A72,
- 21679: 0x9A83,
- 21680: 0x9A89,
- 21681: 0x9A8D,
- 21682: 0x9A8E,
- 21683: 0x9A94,
- 21684: 0x9A95,
- 21685: 0x9A99,
- 21686: 0x9AA6,
- 21687: 0x9AA9,
- 21688: 0x9AAA,
- 21689: 0x9AAB,
- 21690: 0x9AAC,
- 21691: 0x9AAD,
- 21692: 0x9AAE,
- 21693: 0x9AAF,
- 21694: 0x9AB2,
- 21695: 0x9AB3,
- 21696: 0x9AB4,
- 21697: 0x9AB5,
- 21698: 0x9AB9,
- 21699: 0x9ABB,
- 21700: 0x9ABD,
- 21701: 0x9ABE,
- 21702: 0x9ABF,
- 21703: 0x9AC3,
- 21704: 0x9AC4,
- 21705: 0x9AC6,
- 21706: 0x9AC7,
- 21707: 0x9AC8,
- 21708: 0x9AC9,
- 21709: 0x9ACA,
- 21710: 0x9ACD,
- 21711: 0x9ACE,
- 21712: 0x9ACF,
- 21713: 0x9AD0,
- 21714: 0x9AD2,
- 21715: 0x9AD4,
- 21716: 0x9AD5,
- 21717: 0x9AD6,
- 21718: 0x9AD7,
- 21719: 0x9AD9,
- 21720: 0x9ADA,
- 21721: 0x9ADB,
- 21722: 0x9ADC,
- 21723: 0x9ADD,
- 21724: 0x9ADE,
- 21725: 0x9AE0,
- 21726: 0x9AE2,
- 21727: 0x9AE3,
- 21728: 0x9AE4,
- 21729: 0x9AE5,
- 21730: 0x9AE7,
- 21731: 0x9AE8,
- 21732: 0x9AE9,
- 21733: 0x9AEA,
- 21734: 0x9AEC,
- 21735: 0x9AEE,
- 21736: 0x9AF0,
- 21737: 0x9AF1,
- 21738: 0x9AF2,
- 21739: 0x9AF3,
- 21740: 0x9AF4,
- 21741: 0x9AF5,
- 21742: 0x9AF6,
- 21743: 0x9AF7,
- 21744: 0x9AF8,
- 21745: 0x9AFA,
- 21746: 0x9AFC,
- 21747: 0x9AFD,
- 21748: 0x9AFE,
- 21749: 0x9AFF,
- 21750: 0x9B00,
- 21751: 0x9B01,
- 21752: 0x9B02,
- 21753: 0x9B04,
- 21754: 0x9B05,
- 21755: 0x9B06,
- 21756: 0x87C6,
- 21757: 0x8788,
- 21758: 0x8785,
- 21759: 0x87AD,
- 21760: 0x8797,
- 21761: 0x8783,
- 21762: 0x87AB,
- 21763: 0x87E5,
- 21764: 0x87AC,
- 21765: 0x87B5,
- 21766: 0x87B3,
- 21767: 0x87CB,
- 21768: 0x87D3,
- 21769: 0x87BD,
- 21770: 0x87D1,
- 21771: 0x87C0,
- 21772: 0x87CA,
- 21773: 0x87DB,
- 21774: 0x87EA,
- 21775: 0x87E0,
- 21776: 0x87EE,
- 21777: 0x8816,
- 21778: 0x8813,
- 21779: 0x87FE,
- 21780: 0x880A,
- 21781: 0x881B,
- 21782: 0x8821,
- 21783: 0x8839,
- 21784: 0x883C,
- 21785: 0x7F36,
- 21786: 0x7F42,
- 21787: 0x7F44,
- 21788: 0x7F45,
- 21789: 0x8210,
- 21790: 0x7AFA,
- 21791: 0x7AFD,
- 21792: 0x7B08,
- 21793: 0x7B03,
- 21794: 0x7B04,
- 21795: 0x7B15,
- 21796: 0x7B0A,
- 21797: 0x7B2B,
- 21798: 0x7B0F,
- 21799: 0x7B47,
- 21800: 0x7B38,
- 21801: 0x7B2A,
- 21802: 0x7B19,
- 21803: 0x7B2E,
- 21804: 0x7B31,
- 21805: 0x7B20,
- 21806: 0x7B25,
- 21807: 0x7B24,
- 21808: 0x7B33,
- 21809: 0x7B3E,
- 21810: 0x7B1E,
- 21811: 0x7B58,
- 21812: 0x7B5A,
- 21813: 0x7B45,
- 21814: 0x7B75,
- 21815: 0x7B4C,
- 21816: 0x7B5D,
- 21817: 0x7B60,
- 21818: 0x7B6E,
- 21819: 0x7B7B,
- 21820: 0x7B62,
- 21821: 0x7B72,
- 21822: 0x7B71,
- 21823: 0x7B90,
- 21824: 0x7BA6,
- 21825: 0x7BA7,
- 21826: 0x7BB8,
- 21827: 0x7BAC,
- 21828: 0x7B9D,
- 21829: 0x7BA8,
- 21830: 0x7B85,
- 21831: 0x7BAA,
- 21832: 0x7B9C,
- 21833: 0x7BA2,
- 21834: 0x7BAB,
- 21835: 0x7BB4,
- 21836: 0x7BD1,
- 21837: 0x7BC1,
- 21838: 0x7BCC,
- 21839: 0x7BDD,
- 21840: 0x7BDA,
- 21841: 0x7BE5,
- 21842: 0x7BE6,
- 21843: 0x7BEA,
- 21844: 0x7C0C,
- 21845: 0x7BFE,
- 21846: 0x7BFC,
- 21847: 0x7C0F,
- 21848: 0x7C16,
- 21849: 0x7C0B,
- 21850: 0x9B07,
- 21851: 0x9B09,
- 21852: 0x9B0A,
- 21853: 0x9B0B,
- 21854: 0x9B0C,
- 21855: 0x9B0D,
- 21856: 0x9B0E,
- 21857: 0x9B10,
- 21858: 0x9B11,
- 21859: 0x9B12,
- 21860: 0x9B14,
- 21861: 0x9B15,
- 21862: 0x9B16,
- 21863: 0x9B17,
- 21864: 0x9B18,
- 21865: 0x9B19,
- 21866: 0x9B1A,
- 21867: 0x9B1B,
- 21868: 0x9B1C,
- 21869: 0x9B1D,
- 21870: 0x9B1E,
- 21871: 0x9B20,
- 21872: 0x9B21,
- 21873: 0x9B22,
- 21874: 0x9B24,
- 21875: 0x9B25,
- 21876: 0x9B26,
- 21877: 0x9B27,
- 21878: 0x9B28,
- 21879: 0x9B29,
- 21880: 0x9B2A,
- 21881: 0x9B2B,
- 21882: 0x9B2C,
- 21883: 0x9B2D,
- 21884: 0x9B2E,
- 21885: 0x9B30,
- 21886: 0x9B31,
- 21887: 0x9B33,
- 21888: 0x9B34,
- 21889: 0x9B35,
- 21890: 0x9B36,
- 21891: 0x9B37,
- 21892: 0x9B38,
- 21893: 0x9B39,
- 21894: 0x9B3A,
- 21895: 0x9B3D,
- 21896: 0x9B3E,
- 21897: 0x9B3F,
- 21898: 0x9B40,
- 21899: 0x9B46,
- 21900: 0x9B4A,
- 21901: 0x9B4B,
- 21902: 0x9B4C,
- 21903: 0x9B4E,
- 21904: 0x9B50,
- 21905: 0x9B52,
- 21906: 0x9B53,
- 21907: 0x9B55,
- 21908: 0x9B56,
- 21909: 0x9B57,
- 21910: 0x9B58,
- 21911: 0x9B59,
- 21912: 0x9B5A,
- 21913: 0x9B5B,
- 21914: 0x9B5C,
- 21915: 0x9B5D,
- 21916: 0x9B5E,
- 21917: 0x9B5F,
- 21918: 0x9B60,
- 21919: 0x9B61,
- 21920: 0x9B62,
- 21921: 0x9B63,
- 21922: 0x9B64,
- 21923: 0x9B65,
- 21924: 0x9B66,
- 21925: 0x9B67,
- 21926: 0x9B68,
- 21927: 0x9B69,
- 21928: 0x9B6A,
- 21929: 0x9B6B,
- 21930: 0x9B6C,
- 21931: 0x9B6D,
- 21932: 0x9B6E,
- 21933: 0x9B6F,
- 21934: 0x9B70,
- 21935: 0x9B71,
- 21936: 0x9B72,
- 21937: 0x9B73,
- 21938: 0x9B74,
- 21939: 0x9B75,
- 21940: 0x9B76,
- 21941: 0x9B77,
- 21942: 0x9B78,
- 21943: 0x9B79,
- 21944: 0x9B7A,
- 21945: 0x9B7B,
- 21946: 0x7C1F,
- 21947: 0x7C2A,
- 21948: 0x7C26,
- 21949: 0x7C38,
- 21950: 0x7C41,
- 21951: 0x7C40,
- 21952: 0x81FE,
- 21953: 0x8201,
- 21954: 0x8202,
- 21955: 0x8204,
- 21956: 0x81EC,
- 21957: 0x8844,
- 21958: 0x8221,
- 21959: 0x8222,
- 21960: 0x8223,
- 21961: 0x822D,
- 21962: 0x822F,
- 21963: 0x8228,
- 21964: 0x822B,
- 21965: 0x8238,
- 21966: 0x823B,
- 21967: 0x8233,
- 21968: 0x8234,
- 21969: 0x823E,
- 21970: 0x8244,
- 21971: 0x8249,
- 21972: 0x824B,
- 21973: 0x824F,
- 21974: 0x825A,
- 21975: 0x825F,
- 21976: 0x8268,
- 21977: 0x887E,
- 21978: 0x8885,
- 21979: 0x8888,
- 21980: 0x88D8,
- 21981: 0x88DF,
- 21982: 0x895E,
- 21983: 0x7F9D,
- 21984: 0x7F9F,
- 21985: 0x7FA7,
- 21986: 0x7FAF,
- 21987: 0x7FB0,
- 21988: 0x7FB2,
- 21989: 0x7C7C,
- 21990: 0x6549,
- 21991: 0x7C91,
- 21992: 0x7C9D,
- 21993: 0x7C9C,
- 21994: 0x7C9E,
- 21995: 0x7CA2,
- 21996: 0x7CB2,
- 21997: 0x7CBC,
- 21998: 0x7CBD,
- 21999: 0x7CC1,
- 22000: 0x7CC7,
- 22001: 0x7CCC,
- 22002: 0x7CCD,
- 22003: 0x7CC8,
- 22004: 0x7CC5,
- 22005: 0x7CD7,
- 22006: 0x7CE8,
- 22007: 0x826E,
- 22008: 0x66A8,
- 22009: 0x7FBF,
- 22010: 0x7FCE,
- 22011: 0x7FD5,
- 22012: 0x7FE5,
- 22013: 0x7FE1,
- 22014: 0x7FE6,
- 22015: 0x7FE9,
- 22016: 0x7FEE,
- 22017: 0x7FF3,
- 22018: 0x7CF8,
- 22019: 0x7D77,
- 22020: 0x7DA6,
- 22021: 0x7DAE,
- 22022: 0x7E47,
- 22023: 0x7E9B,
- 22024: 0x9EB8,
- 22025: 0x9EB4,
- 22026: 0x8D73,
- 22027: 0x8D84,
- 22028: 0x8D94,
- 22029: 0x8D91,
- 22030: 0x8DB1,
- 22031: 0x8D67,
- 22032: 0x8D6D,
- 22033: 0x8C47,
- 22034: 0x8C49,
- 22035: 0x914A,
- 22036: 0x9150,
- 22037: 0x914E,
- 22038: 0x914F,
- 22039: 0x9164,
- 22040: 0x9B7C,
- 22041: 0x9B7D,
- 22042: 0x9B7E,
- 22043: 0x9B7F,
- 22044: 0x9B80,
- 22045: 0x9B81,
- 22046: 0x9B82,
- 22047: 0x9B83,
- 22048: 0x9B84,
- 22049: 0x9B85,
- 22050: 0x9B86,
- 22051: 0x9B87,
- 22052: 0x9B88,
- 22053: 0x9B89,
- 22054: 0x9B8A,
- 22055: 0x9B8B,
- 22056: 0x9B8C,
- 22057: 0x9B8D,
- 22058: 0x9B8E,
- 22059: 0x9B8F,
- 22060: 0x9B90,
- 22061: 0x9B91,
- 22062: 0x9B92,
- 22063: 0x9B93,
- 22064: 0x9B94,
- 22065: 0x9B95,
- 22066: 0x9B96,
- 22067: 0x9B97,
- 22068: 0x9B98,
- 22069: 0x9B99,
- 22070: 0x9B9A,
- 22071: 0x9B9B,
- 22072: 0x9B9C,
- 22073: 0x9B9D,
- 22074: 0x9B9E,
- 22075: 0x9B9F,
- 22076: 0x9BA0,
- 22077: 0x9BA1,
- 22078: 0x9BA2,
- 22079: 0x9BA3,
- 22080: 0x9BA4,
- 22081: 0x9BA5,
- 22082: 0x9BA6,
- 22083: 0x9BA7,
- 22084: 0x9BA8,
- 22085: 0x9BA9,
- 22086: 0x9BAA,
- 22087: 0x9BAB,
- 22088: 0x9BAC,
- 22089: 0x9BAD,
- 22090: 0x9BAE,
- 22091: 0x9BAF,
- 22092: 0x9BB0,
- 22093: 0x9BB1,
- 22094: 0x9BB2,
- 22095: 0x9BB3,
- 22096: 0x9BB4,
- 22097: 0x9BB5,
- 22098: 0x9BB6,
- 22099: 0x9BB7,
- 22100: 0x9BB8,
- 22101: 0x9BB9,
- 22102: 0x9BBA,
- 22103: 0x9BBB,
- 22104: 0x9BBC,
- 22105: 0x9BBD,
- 22106: 0x9BBE,
- 22107: 0x9BBF,
- 22108: 0x9BC0,
- 22109: 0x9BC1,
- 22110: 0x9BC2,
- 22111: 0x9BC3,
- 22112: 0x9BC4,
- 22113: 0x9BC5,
- 22114: 0x9BC6,
- 22115: 0x9BC7,
- 22116: 0x9BC8,
- 22117: 0x9BC9,
- 22118: 0x9BCA,
- 22119: 0x9BCB,
- 22120: 0x9BCC,
- 22121: 0x9BCD,
- 22122: 0x9BCE,
- 22123: 0x9BCF,
- 22124: 0x9BD0,
- 22125: 0x9BD1,
- 22126: 0x9BD2,
- 22127: 0x9BD3,
- 22128: 0x9BD4,
- 22129: 0x9BD5,
- 22130: 0x9BD6,
- 22131: 0x9BD7,
- 22132: 0x9BD8,
- 22133: 0x9BD9,
- 22134: 0x9BDA,
- 22135: 0x9BDB,
- 22136: 0x9162,
- 22137: 0x9161,
- 22138: 0x9170,
- 22139: 0x9169,
- 22140: 0x916F,
- 22141: 0x917D,
- 22142: 0x917E,
- 22143: 0x9172,
- 22144: 0x9174,
- 22145: 0x9179,
- 22146: 0x918C,
- 22147: 0x9185,
- 22148: 0x9190,
- 22149: 0x918D,
- 22150: 0x9191,
- 22151: 0x91A2,
- 22152: 0x91A3,
- 22153: 0x91AA,
- 22154: 0x91AD,
- 22155: 0x91AE,
- 22156: 0x91AF,
- 22157: 0x91B5,
- 22158: 0x91B4,
- 22159: 0x91BA,
- 22160: 0x8C55,
- 22161: 0x9E7E,
- 22162: 0x8DB8,
- 22163: 0x8DEB,
- 22164: 0x8E05,
- 22165: 0x8E59,
- 22166: 0x8E69,
- 22167: 0x8DB5,
- 22168: 0x8DBF,
- 22169: 0x8DBC,
- 22170: 0x8DBA,
- 22171: 0x8DC4,
- 22172: 0x8DD6,
- 22173: 0x8DD7,
- 22174: 0x8DDA,
- 22175: 0x8DDE,
- 22176: 0x8DCE,
- 22177: 0x8DCF,
- 22178: 0x8DDB,
- 22179: 0x8DC6,
- 22180: 0x8DEC,
- 22181: 0x8DF7,
- 22182: 0x8DF8,
- 22183: 0x8DE3,
- 22184: 0x8DF9,
- 22185: 0x8DFB,
- 22186: 0x8DE4,
- 22187: 0x8E09,
- 22188: 0x8DFD,
- 22189: 0x8E14,
- 22190: 0x8E1D,
- 22191: 0x8E1F,
- 22192: 0x8E2C,
- 22193: 0x8E2E,
- 22194: 0x8E23,
- 22195: 0x8E2F,
- 22196: 0x8E3A,
- 22197: 0x8E40,
- 22198: 0x8E39,
- 22199: 0x8E35,
- 22200: 0x8E3D,
- 22201: 0x8E31,
- 22202: 0x8E49,
- 22203: 0x8E41,
- 22204: 0x8E42,
- 22205: 0x8E51,
- 22206: 0x8E52,
- 22207: 0x8E4A,
- 22208: 0x8E70,
- 22209: 0x8E76,
- 22210: 0x8E7C,
- 22211: 0x8E6F,
- 22212: 0x8E74,
- 22213: 0x8E85,
- 22214: 0x8E8F,
- 22215: 0x8E94,
- 22216: 0x8E90,
- 22217: 0x8E9C,
- 22218: 0x8E9E,
- 22219: 0x8C78,
- 22220: 0x8C82,
- 22221: 0x8C8A,
- 22222: 0x8C85,
- 22223: 0x8C98,
- 22224: 0x8C94,
- 22225: 0x659B,
- 22226: 0x89D6,
- 22227: 0x89DE,
- 22228: 0x89DA,
- 22229: 0x89DC,
- 22230: 0x9BDC,
- 22231: 0x9BDD,
- 22232: 0x9BDE,
- 22233: 0x9BDF,
- 22234: 0x9BE0,
- 22235: 0x9BE1,
- 22236: 0x9BE2,
- 22237: 0x9BE3,
- 22238: 0x9BE4,
- 22239: 0x9BE5,
- 22240: 0x9BE6,
- 22241: 0x9BE7,
- 22242: 0x9BE8,
- 22243: 0x9BE9,
- 22244: 0x9BEA,
- 22245: 0x9BEB,
- 22246: 0x9BEC,
- 22247: 0x9BED,
- 22248: 0x9BEE,
- 22249: 0x9BEF,
- 22250: 0x9BF0,
- 22251: 0x9BF1,
- 22252: 0x9BF2,
- 22253: 0x9BF3,
- 22254: 0x9BF4,
- 22255: 0x9BF5,
- 22256: 0x9BF6,
- 22257: 0x9BF7,
- 22258: 0x9BF8,
- 22259: 0x9BF9,
- 22260: 0x9BFA,
- 22261: 0x9BFB,
- 22262: 0x9BFC,
- 22263: 0x9BFD,
- 22264: 0x9BFE,
- 22265: 0x9BFF,
- 22266: 0x9C00,
- 22267: 0x9C01,
- 22268: 0x9C02,
- 22269: 0x9C03,
- 22270: 0x9C04,
- 22271: 0x9C05,
- 22272: 0x9C06,
- 22273: 0x9C07,
- 22274: 0x9C08,
- 22275: 0x9C09,
- 22276: 0x9C0A,
- 22277: 0x9C0B,
- 22278: 0x9C0C,
- 22279: 0x9C0D,
- 22280: 0x9C0E,
- 22281: 0x9C0F,
- 22282: 0x9C10,
- 22283: 0x9C11,
- 22284: 0x9C12,
- 22285: 0x9C13,
- 22286: 0x9C14,
- 22287: 0x9C15,
- 22288: 0x9C16,
- 22289: 0x9C17,
- 22290: 0x9C18,
- 22291: 0x9C19,
- 22292: 0x9C1A,
- 22293: 0x9C1B,
- 22294: 0x9C1C,
- 22295: 0x9C1D,
- 22296: 0x9C1E,
- 22297: 0x9C1F,
- 22298: 0x9C20,
- 22299: 0x9C21,
- 22300: 0x9C22,
- 22301: 0x9C23,
- 22302: 0x9C24,
- 22303: 0x9C25,
- 22304: 0x9C26,
- 22305: 0x9C27,
- 22306: 0x9C28,
- 22307: 0x9C29,
- 22308: 0x9C2A,
- 22309: 0x9C2B,
- 22310: 0x9C2C,
- 22311: 0x9C2D,
- 22312: 0x9C2E,
- 22313: 0x9C2F,
- 22314: 0x9C30,
- 22315: 0x9C31,
- 22316: 0x9C32,
- 22317: 0x9C33,
- 22318: 0x9C34,
- 22319: 0x9C35,
- 22320: 0x9C36,
- 22321: 0x9C37,
- 22322: 0x9C38,
- 22323: 0x9C39,
- 22324: 0x9C3A,
- 22325: 0x9C3B,
- 22326: 0x89E5,
- 22327: 0x89EB,
- 22328: 0x89EF,
- 22329: 0x8A3E,
- 22330: 0x8B26,
- 22331: 0x9753,
- 22332: 0x96E9,
- 22333: 0x96F3,
- 22334: 0x96EF,
- 22335: 0x9706,
- 22336: 0x9701,
- 22337: 0x9708,
- 22338: 0x970F,
- 22339: 0x970E,
- 22340: 0x972A,
- 22341: 0x972D,
- 22342: 0x9730,
- 22343: 0x973E,
- 22344: 0x9F80,
- 22345: 0x9F83,
- 22346: 0x9F85,
- 22347: 0x9F86,
- 22348: 0x9F87,
- 22349: 0x9F88,
- 22350: 0x9F89,
- 22351: 0x9F8A,
- 22352: 0x9F8C,
- 22353: 0x9EFE,
- 22354: 0x9F0B,
- 22355: 0x9F0D,
- 22356: 0x96B9,
- 22357: 0x96BC,
- 22358: 0x96BD,
- 22359: 0x96CE,
- 22360: 0x96D2,
- 22361: 0x77BF,
- 22362: 0x96E0,
- 22363: 0x928E,
- 22364: 0x92AE,
- 22365: 0x92C8,
- 22366: 0x933E,
- 22367: 0x936A,
- 22368: 0x93CA,
- 22369: 0x938F,
- 22370: 0x943E,
- 22371: 0x946B,
- 22372: 0x9C7F,
- 22373: 0x9C82,
- 22374: 0x9C85,
- 22375: 0x9C86,
- 22376: 0x9C87,
- 22377: 0x9C88,
- 22378: 0x7A23,
- 22379: 0x9C8B,
- 22380: 0x9C8E,
- 22381: 0x9C90,
- 22382: 0x9C91,
- 22383: 0x9C92,
- 22384: 0x9C94,
- 22385: 0x9C95,
- 22386: 0x9C9A,
- 22387: 0x9C9B,
- 22388: 0x9C9E,
- 22389: 0x9C9F,
- 22390: 0x9CA0,
- 22391: 0x9CA1,
- 22392: 0x9CA2,
- 22393: 0x9CA3,
- 22394: 0x9CA5,
- 22395: 0x9CA6,
- 22396: 0x9CA7,
- 22397: 0x9CA8,
- 22398: 0x9CA9,
- 22399: 0x9CAB,
- 22400: 0x9CAD,
- 22401: 0x9CAE,
- 22402: 0x9CB0,
- 22403: 0x9CB1,
- 22404: 0x9CB2,
- 22405: 0x9CB3,
- 22406: 0x9CB4,
- 22407: 0x9CB5,
- 22408: 0x9CB6,
- 22409: 0x9CB7,
- 22410: 0x9CBA,
- 22411: 0x9CBB,
- 22412: 0x9CBC,
- 22413: 0x9CBD,
- 22414: 0x9CC4,
- 22415: 0x9CC5,
- 22416: 0x9CC6,
- 22417: 0x9CC7,
- 22418: 0x9CCA,
- 22419: 0x9CCB,
- 22420: 0x9C3C,
- 22421: 0x9C3D,
- 22422: 0x9C3E,
- 22423: 0x9C3F,
- 22424: 0x9C40,
- 22425: 0x9C41,
- 22426: 0x9C42,
- 22427: 0x9C43,
- 22428: 0x9C44,
- 22429: 0x9C45,
- 22430: 0x9C46,
- 22431: 0x9C47,
- 22432: 0x9C48,
- 22433: 0x9C49,
- 22434: 0x9C4A,
- 22435: 0x9C4B,
- 22436: 0x9C4C,
- 22437: 0x9C4D,
- 22438: 0x9C4E,
- 22439: 0x9C4F,
- 22440: 0x9C50,
- 22441: 0x9C51,
- 22442: 0x9C52,
- 22443: 0x9C53,
- 22444: 0x9C54,
- 22445: 0x9C55,
- 22446: 0x9C56,
- 22447: 0x9C57,
- 22448: 0x9C58,
- 22449: 0x9C59,
- 22450: 0x9C5A,
- 22451: 0x9C5B,
- 22452: 0x9C5C,
- 22453: 0x9C5D,
- 22454: 0x9C5E,
- 22455: 0x9C5F,
- 22456: 0x9C60,
- 22457: 0x9C61,
- 22458: 0x9C62,
- 22459: 0x9C63,
- 22460: 0x9C64,
- 22461: 0x9C65,
- 22462: 0x9C66,
- 22463: 0x9C67,
- 22464: 0x9C68,
- 22465: 0x9C69,
- 22466: 0x9C6A,
- 22467: 0x9C6B,
- 22468: 0x9C6C,
- 22469: 0x9C6D,
- 22470: 0x9C6E,
- 22471: 0x9C6F,
- 22472: 0x9C70,
- 22473: 0x9C71,
- 22474: 0x9C72,
- 22475: 0x9C73,
- 22476: 0x9C74,
- 22477: 0x9C75,
- 22478: 0x9C76,
- 22479: 0x9C77,
- 22480: 0x9C78,
- 22481: 0x9C79,
- 22482: 0x9C7A,
- 22483: 0x9C7B,
- 22484: 0x9C7D,
- 22485: 0x9C7E,
- 22486: 0x9C80,
- 22487: 0x9C83,
- 22488: 0x9C84,
- 22489: 0x9C89,
- 22490: 0x9C8A,
- 22491: 0x9C8C,
- 22492: 0x9C8F,
- 22493: 0x9C93,
- 22494: 0x9C96,
- 22495: 0x9C97,
- 22496: 0x9C98,
- 22497: 0x9C99,
- 22498: 0x9C9D,
- 22499: 0x9CAA,
- 22500: 0x9CAC,
- 22501: 0x9CAF,
- 22502: 0x9CB9,
- 22503: 0x9CBE,
- 22504: 0x9CBF,
- 22505: 0x9CC0,
- 22506: 0x9CC1,
- 22507: 0x9CC2,
- 22508: 0x9CC8,
- 22509: 0x9CC9,
- 22510: 0x9CD1,
- 22511: 0x9CD2,
- 22512: 0x9CDA,
- 22513: 0x9CDB,
- 22514: 0x9CE0,
- 22515: 0x9CE1,
- 22516: 0x9CCC,
- 22517: 0x9CCD,
- 22518: 0x9CCE,
- 22519: 0x9CCF,
- 22520: 0x9CD0,
- 22521: 0x9CD3,
- 22522: 0x9CD4,
- 22523: 0x9CD5,
- 22524: 0x9CD7,
- 22525: 0x9CD8,
- 22526: 0x9CD9,
- 22527: 0x9CDC,
- 22528: 0x9CDD,
- 22529: 0x9CDF,
- 22530: 0x9CE2,
- 22531: 0x977C,
- 22532: 0x9785,
- 22533: 0x9791,
- 22534: 0x9792,
- 22535: 0x9794,
- 22536: 0x97AF,
- 22537: 0x97AB,
- 22538: 0x97A3,
- 22539: 0x97B2,
- 22540: 0x97B4,
- 22541: 0x9AB1,
- 22542: 0x9AB0,
- 22543: 0x9AB7,
- 22544: 0x9E58,
- 22545: 0x9AB6,
- 22546: 0x9ABA,
- 22547: 0x9ABC,
- 22548: 0x9AC1,
- 22549: 0x9AC0,
- 22550: 0x9AC5,
- 22551: 0x9AC2,
- 22552: 0x9ACB,
- 22553: 0x9ACC,
- 22554: 0x9AD1,
- 22555: 0x9B45,
- 22556: 0x9B43,
- 22557: 0x9B47,
- 22558: 0x9B49,
- 22559: 0x9B48,
- 22560: 0x9B4D,
- 22561: 0x9B51,
- 22562: 0x98E8,
- 22563: 0x990D,
- 22564: 0x992E,
- 22565: 0x9955,
- 22566: 0x9954,
- 22567: 0x9ADF,
- 22568: 0x9AE1,
- 22569: 0x9AE6,
- 22570: 0x9AEF,
- 22571: 0x9AEB,
- 22572: 0x9AFB,
- 22573: 0x9AED,
- 22574: 0x9AF9,
- 22575: 0x9B08,
- 22576: 0x9B0F,
- 22577: 0x9B13,
- 22578: 0x9B1F,
- 22579: 0x9B23,
- 22580: 0x9EBD,
- 22581: 0x9EBE,
- 22582: 0x7E3B,
- 22583: 0x9E82,
- 22584: 0x9E87,
- 22585: 0x9E88,
- 22586: 0x9E8B,
- 22587: 0x9E92,
- 22588: 0x93D6,
- 22589: 0x9E9D,
- 22590: 0x9E9F,
- 22591: 0x9EDB,
- 22592: 0x9EDC,
- 22593: 0x9EDD,
- 22594: 0x9EE0,
- 22595: 0x9EDF,
- 22596: 0x9EE2,
- 22597: 0x9EE9,
- 22598: 0x9EE7,
- 22599: 0x9EE5,
- 22600: 0x9EEA,
- 22601: 0x9EEF,
- 22602: 0x9F22,
- 22603: 0x9F2C,
- 22604: 0x9F2F,
- 22605: 0x9F39,
- 22606: 0x9F37,
- 22607: 0x9F3D,
- 22608: 0x9F3E,
- 22609: 0x9F44,
- 22610: 0x9CE3,
- 22611: 0x9CE4,
- 22612: 0x9CE5,
- 22613: 0x9CE6,
- 22614: 0x9CE7,
- 22615: 0x9CE8,
- 22616: 0x9CE9,
- 22617: 0x9CEA,
- 22618: 0x9CEB,
- 22619: 0x9CEC,
- 22620: 0x9CED,
- 22621: 0x9CEE,
- 22622: 0x9CEF,
- 22623: 0x9CF0,
- 22624: 0x9CF1,
- 22625: 0x9CF2,
- 22626: 0x9CF3,
- 22627: 0x9CF4,
- 22628: 0x9CF5,
- 22629: 0x9CF6,
- 22630: 0x9CF7,
- 22631: 0x9CF8,
- 22632: 0x9CF9,
- 22633: 0x9CFA,
- 22634: 0x9CFB,
- 22635: 0x9CFC,
- 22636: 0x9CFD,
- 22637: 0x9CFE,
- 22638: 0x9CFF,
- 22639: 0x9D00,
- 22640: 0x9D01,
- 22641: 0x9D02,
- 22642: 0x9D03,
- 22643: 0x9D04,
- 22644: 0x9D05,
- 22645: 0x9D06,
- 22646: 0x9D07,
- 22647: 0x9D08,
- 22648: 0x9D09,
- 22649: 0x9D0A,
- 22650: 0x9D0B,
- 22651: 0x9D0C,
- 22652: 0x9D0D,
- 22653: 0x9D0E,
- 22654: 0x9D0F,
- 22655: 0x9D10,
- 22656: 0x9D11,
- 22657: 0x9D12,
- 22658: 0x9D13,
- 22659: 0x9D14,
- 22660: 0x9D15,
- 22661: 0x9D16,
- 22662: 0x9D17,
- 22663: 0x9D18,
- 22664: 0x9D19,
- 22665: 0x9D1A,
- 22666: 0x9D1B,
- 22667: 0x9D1C,
- 22668: 0x9D1D,
- 22669: 0x9D1E,
- 22670: 0x9D1F,
- 22671: 0x9D20,
- 22672: 0x9D21,
- 22673: 0x9D22,
- 22674: 0x9D23,
- 22675: 0x9D24,
- 22676: 0x9D25,
- 22677: 0x9D26,
- 22678: 0x9D27,
- 22679: 0x9D28,
- 22680: 0x9D29,
- 22681: 0x9D2A,
- 22682: 0x9D2B,
- 22683: 0x9D2C,
- 22684: 0x9D2D,
- 22685: 0x9D2E,
- 22686: 0x9D2F,
- 22687: 0x9D30,
- 22688: 0x9D31,
- 22689: 0x9D32,
- 22690: 0x9D33,
- 22691: 0x9D34,
- 22692: 0x9D35,
- 22693: 0x9D36,
- 22694: 0x9D37,
- 22695: 0x9D38,
- 22696: 0x9D39,
- 22697: 0x9D3A,
- 22698: 0x9D3B,
- 22699: 0x9D3C,
- 22700: 0x9D3D,
- 22701: 0x9D3E,
- 22702: 0x9D3F,
- 22703: 0x9D40,
- 22704: 0x9D41,
- 22705: 0x9D42,
- 22800: 0x9D43,
- 22801: 0x9D44,
- 22802: 0x9D45,
- 22803: 0x9D46,
- 22804: 0x9D47,
- 22805: 0x9D48,
- 22806: 0x9D49,
- 22807: 0x9D4A,
- 22808: 0x9D4B,
- 22809: 0x9D4C,
- 22810: 0x9D4D,
- 22811: 0x9D4E,
- 22812: 0x9D4F,
- 22813: 0x9D50,
- 22814: 0x9D51,
- 22815: 0x9D52,
- 22816: 0x9D53,
- 22817: 0x9D54,
- 22818: 0x9D55,
- 22819: 0x9D56,
- 22820: 0x9D57,
- 22821: 0x9D58,
- 22822: 0x9D59,
- 22823: 0x9D5A,
- 22824: 0x9D5B,
- 22825: 0x9D5C,
- 22826: 0x9D5D,
- 22827: 0x9D5E,
- 22828: 0x9D5F,
- 22829: 0x9D60,
- 22830: 0x9D61,
- 22831: 0x9D62,
- 22832: 0x9D63,
- 22833: 0x9D64,
- 22834: 0x9D65,
- 22835: 0x9D66,
- 22836: 0x9D67,
- 22837: 0x9D68,
- 22838: 0x9D69,
- 22839: 0x9D6A,
- 22840: 0x9D6B,
- 22841: 0x9D6C,
- 22842: 0x9D6D,
- 22843: 0x9D6E,
- 22844: 0x9D6F,
- 22845: 0x9D70,
- 22846: 0x9D71,
- 22847: 0x9D72,
- 22848: 0x9D73,
- 22849: 0x9D74,
- 22850: 0x9D75,
- 22851: 0x9D76,
- 22852: 0x9D77,
- 22853: 0x9D78,
- 22854: 0x9D79,
- 22855: 0x9D7A,
- 22856: 0x9D7B,
- 22857: 0x9D7C,
- 22858: 0x9D7D,
- 22859: 0x9D7E,
- 22860: 0x9D7F,
- 22861: 0x9D80,
- 22862: 0x9D81,
- 22863: 0x9D82,
- 22864: 0x9D83,
- 22865: 0x9D84,
- 22866: 0x9D85,
- 22867: 0x9D86,
- 22868: 0x9D87,
- 22869: 0x9D88,
- 22870: 0x9D89,
- 22871: 0x9D8A,
- 22872: 0x9D8B,
- 22873: 0x9D8C,
- 22874: 0x9D8D,
- 22875: 0x9D8E,
- 22876: 0x9D8F,
- 22877: 0x9D90,
- 22878: 0x9D91,
- 22879: 0x9D92,
- 22880: 0x9D93,
- 22881: 0x9D94,
- 22882: 0x9D95,
- 22883: 0x9D96,
- 22884: 0x9D97,
- 22885: 0x9D98,
- 22886: 0x9D99,
- 22887: 0x9D9A,
- 22888: 0x9D9B,
- 22889: 0x9D9C,
- 22890: 0x9D9D,
- 22891: 0x9D9E,
- 22892: 0x9D9F,
- 22893: 0x9DA0,
- 22894: 0x9DA1,
- 22895: 0x9DA2,
- 22990: 0x9DA3,
- 22991: 0x9DA4,
- 22992: 0x9DA5,
- 22993: 0x9DA6,
- 22994: 0x9DA7,
- 22995: 0x9DA8,
- 22996: 0x9DA9,
- 22997: 0x9DAA,
- 22998: 0x9DAB,
- 22999: 0x9DAC,
- 23000: 0x9DAD,
- 23001: 0x9DAE,
- 23002: 0x9DAF,
- 23003: 0x9DB0,
- 23004: 0x9DB1,
- 23005: 0x9DB2,
- 23006: 0x9DB3,
- 23007: 0x9DB4,
- 23008: 0x9DB5,
- 23009: 0x9DB6,
- 23010: 0x9DB7,
- 23011: 0x9DB8,
- 23012: 0x9DB9,
- 23013: 0x9DBA,
- 23014: 0x9DBB,
- 23015: 0x9DBC,
- 23016: 0x9DBD,
- 23017: 0x9DBE,
- 23018: 0x9DBF,
- 23019: 0x9DC0,
- 23020: 0x9DC1,
- 23021: 0x9DC2,
- 23022: 0x9DC3,
- 23023: 0x9DC4,
- 23024: 0x9DC5,
- 23025: 0x9DC6,
- 23026: 0x9DC7,
- 23027: 0x9DC8,
- 23028: 0x9DC9,
- 23029: 0x9DCA,
- 23030: 0x9DCB,
- 23031: 0x9DCC,
- 23032: 0x9DCD,
- 23033: 0x9DCE,
- 23034: 0x9DCF,
- 23035: 0x9DD0,
- 23036: 0x9DD1,
- 23037: 0x9DD2,
- 23038: 0x9DD3,
- 23039: 0x9DD4,
- 23040: 0x9DD5,
- 23041: 0x9DD6,
- 23042: 0x9DD7,
- 23043: 0x9DD8,
- 23044: 0x9DD9,
- 23045: 0x9DDA,
- 23046: 0x9DDB,
- 23047: 0x9DDC,
- 23048: 0x9DDD,
- 23049: 0x9DDE,
- 23050: 0x9DDF,
- 23051: 0x9DE0,
- 23052: 0x9DE1,
- 23053: 0x9DE2,
- 23054: 0x9DE3,
- 23055: 0x9DE4,
- 23056: 0x9DE5,
- 23057: 0x9DE6,
- 23058: 0x9DE7,
- 23059: 0x9DE8,
- 23060: 0x9DE9,
- 23061: 0x9DEA,
- 23062: 0x9DEB,
- 23063: 0x9DEC,
- 23064: 0x9DED,
- 23065: 0x9DEE,
- 23066: 0x9DEF,
- 23067: 0x9DF0,
- 23068: 0x9DF1,
- 23069: 0x9DF2,
- 23070: 0x9DF3,
- 23071: 0x9DF4,
- 23072: 0x9DF5,
- 23073: 0x9DF6,
- 23074: 0x9DF7,
- 23075: 0x9DF8,
- 23076: 0x9DF9,
- 23077: 0x9DFA,
- 23078: 0x9DFB,
- 23079: 0x9DFC,
- 23080: 0x9DFD,
- 23081: 0x9DFE,
- 23082: 0x9DFF,
- 23083: 0x9E00,
- 23084: 0x9E01,
- 23085: 0x9E02,
- 23180: 0x9E03,
- 23181: 0x9E04,
- 23182: 0x9E05,
- 23183: 0x9E06,
- 23184: 0x9E07,
- 23185: 0x9E08,
- 23186: 0x9E09,
- 23187: 0x9E0A,
- 23188: 0x9E0B,
- 23189: 0x9E0C,
- 23190: 0x9E0D,
- 23191: 0x9E0E,
- 23192: 0x9E0F,
- 23193: 0x9E10,
- 23194: 0x9E11,
- 23195: 0x9E12,
- 23196: 0x9E13,
- 23197: 0x9E14,
- 23198: 0x9E15,
- 23199: 0x9E16,
- 23200: 0x9E17,
- 23201: 0x9E18,
- 23202: 0x9E19,
- 23203: 0x9E1A,
- 23204: 0x9E1B,
- 23205: 0x9E1C,
- 23206: 0x9E1D,
- 23207: 0x9E1E,
- 23208: 0x9E24,
- 23209: 0x9E27,
- 23210: 0x9E2E,
- 23211: 0x9E30,
- 23212: 0x9E34,
- 23213: 0x9E3B,
- 23214: 0x9E3C,
- 23215: 0x9E40,
- 23216: 0x9E4D,
- 23217: 0x9E50,
- 23218: 0x9E52,
- 23219: 0x9E53,
- 23220: 0x9E54,
- 23221: 0x9E56,
- 23222: 0x9E59,
- 23223: 0x9E5D,
- 23224: 0x9E5F,
- 23225: 0x9E60,
- 23226: 0x9E61,
- 23227: 0x9E62,
- 23228: 0x9E65,
- 23229: 0x9E6E,
- 23230: 0x9E6F,
- 23231: 0x9E72,
- 23232: 0x9E74,
- 23233: 0x9E75,
- 23234: 0x9E76,
- 23235: 0x9E77,
- 23236: 0x9E78,
- 23237: 0x9E79,
- 23238: 0x9E7A,
- 23239: 0x9E7B,
- 23240: 0x9E7C,
- 23241: 0x9E7D,
- 23242: 0x9E80,
- 23243: 0x9E81,
- 23244: 0x9E83,
- 23245: 0x9E84,
- 23246: 0x9E85,
- 23247: 0x9E86,
- 23248: 0x9E89,
- 23249: 0x9E8A,
- 23250: 0x9E8C,
- 23251: 0x9E8D,
- 23252: 0x9E8E,
- 23253: 0x9E8F,
- 23254: 0x9E90,
- 23255: 0x9E91,
- 23256: 0x9E94,
- 23257: 0x9E95,
- 23258: 0x9E96,
- 23259: 0x9E97,
- 23260: 0x9E98,
- 23261: 0x9E99,
- 23262: 0x9E9A,
- 23263: 0x9E9B,
- 23264: 0x9E9C,
- 23265: 0x9E9E,
- 23266: 0x9EA0,
- 23267: 0x9EA1,
- 23268: 0x9EA2,
- 23269: 0x9EA3,
- 23270: 0x9EA4,
- 23271: 0x9EA5,
- 23272: 0x9EA7,
- 23273: 0x9EA8,
- 23274: 0x9EA9,
- 23275: 0x9EAA,
- 23370: 0x9EAB,
- 23371: 0x9EAC,
- 23372: 0x9EAD,
- 23373: 0x9EAE,
- 23374: 0x9EAF,
- 23375: 0x9EB0,
- 23376: 0x9EB1,
- 23377: 0x9EB2,
- 23378: 0x9EB3,
- 23379: 0x9EB5,
- 23380: 0x9EB6,
- 23381: 0x9EB7,
- 23382: 0x9EB9,
- 23383: 0x9EBA,
- 23384: 0x9EBC,
- 23385: 0x9EBF,
- 23386: 0x9EC0,
- 23387: 0x9EC1,
- 23388: 0x9EC2,
- 23389: 0x9EC3,
- 23390: 0x9EC5,
- 23391: 0x9EC6,
- 23392: 0x9EC7,
- 23393: 0x9EC8,
- 23394: 0x9ECA,
- 23395: 0x9ECB,
- 23396: 0x9ECC,
- 23397: 0x9ED0,
- 23398: 0x9ED2,
- 23399: 0x9ED3,
- 23400: 0x9ED5,
- 23401: 0x9ED6,
- 23402: 0x9ED7,
- 23403: 0x9ED9,
- 23404: 0x9EDA,
- 23405: 0x9EDE,
- 23406: 0x9EE1,
- 23407: 0x9EE3,
- 23408: 0x9EE4,
- 23409: 0x9EE6,
- 23410: 0x9EE8,
- 23411: 0x9EEB,
- 23412: 0x9EEC,
- 23413: 0x9EED,
- 23414: 0x9EEE,
- 23415: 0x9EF0,
- 23416: 0x9EF1,
- 23417: 0x9EF2,
- 23418: 0x9EF3,
- 23419: 0x9EF4,
- 23420: 0x9EF5,
- 23421: 0x9EF6,
- 23422: 0x9EF7,
- 23423: 0x9EF8,
- 23424: 0x9EFA,
- 23425: 0x9EFD,
- 23426: 0x9EFF,
- 23427: 0x9F00,
- 23428: 0x9F01,
- 23429: 0x9F02,
- 23430: 0x9F03,
- 23431: 0x9F04,
- 23432: 0x9F05,
- 23433: 0x9F06,
- 23434: 0x9F07,
- 23435: 0x9F08,
- 23436: 0x9F09,
- 23437: 0x9F0A,
- 23438: 0x9F0C,
- 23439: 0x9F0F,
- 23440: 0x9F11,
- 23441: 0x9F12,
- 23442: 0x9F14,
- 23443: 0x9F15,
- 23444: 0x9F16,
- 23445: 0x9F18,
- 23446: 0x9F1A,
- 23447: 0x9F1B,
- 23448: 0x9F1C,
- 23449: 0x9F1D,
- 23450: 0x9F1E,
- 23451: 0x9F1F,
- 23452: 0x9F21,
- 23453: 0x9F23,
- 23454: 0x9F24,
- 23455: 0x9F25,
- 23456: 0x9F26,
- 23457: 0x9F27,
- 23458: 0x9F28,
- 23459: 0x9F29,
- 23460: 0x9F2A,
- 23461: 0x9F2B,
- 23462: 0x9F2D,
- 23463: 0x9F2E,
- 23464: 0x9F30,
- 23465: 0x9F31,
- 23560: 0x9F32,
- 23561: 0x9F33,
- 23562: 0x9F34,
- 23563: 0x9F35,
- 23564: 0x9F36,
- 23565: 0x9F38,
- 23566: 0x9F3A,
- 23567: 0x9F3C,
- 23568: 0x9F3F,
- 23569: 0x9F40,
- 23570: 0x9F41,
- 23571: 0x9F42,
- 23572: 0x9F43,
- 23573: 0x9F45,
- 23574: 0x9F46,
- 23575: 0x9F47,
- 23576: 0x9F48,
- 23577: 0x9F49,
- 23578: 0x9F4A,
- 23579: 0x9F4B,
- 23580: 0x9F4C,
- 23581: 0x9F4D,
- 23582: 0x9F4E,
- 23583: 0x9F4F,
- 23584: 0x9F52,
- 23585: 0x9F53,
- 23586: 0x9F54,
- 23587: 0x9F55,
- 23588: 0x9F56,
- 23589: 0x9F57,
- 23590: 0x9F58,
- 23591: 0x9F59,
- 23592: 0x9F5A,
- 23593: 0x9F5B,
- 23594: 0x9F5C,
- 23595: 0x9F5D,
- 23596: 0x9F5E,
- 23597: 0x9F5F,
- 23598: 0x9F60,
- 23599: 0x9F61,
- 23600: 0x9F62,
- 23601: 0x9F63,
- 23602: 0x9F64,
- 23603: 0x9F65,
- 23604: 0x9F66,
- 23605: 0x9F67,
- 23606: 0x9F68,
- 23607: 0x9F69,
- 23608: 0x9F6A,
- 23609: 0x9F6B,
- 23610: 0x9F6C,
- 23611: 0x9F6D,
- 23612: 0x9F6E,
- 23613: 0x9F6F,
- 23614: 0x9F70,
- 23615: 0x9F71,
- 23616: 0x9F72,
- 23617: 0x9F73,
- 23618: 0x9F74,
- 23619: 0x9F75,
- 23620: 0x9F76,
- 23621: 0x9F77,
- 23622: 0x9F78,
- 23623: 0x9F79,
- 23624: 0x9F7A,
- 23625: 0x9F7B,
- 23626: 0x9F7C,
- 23627: 0x9F7D,
- 23628: 0x9F7E,
- 23629: 0x9F81,
- 23630: 0x9F82,
- 23631: 0x9F8D,
- 23632: 0x9F8E,
- 23633: 0x9F8F,
- 23634: 0x9F90,
- 23635: 0x9F91,
- 23636: 0x9F92,
- 23637: 0x9F93,
- 23638: 0x9F94,
- 23639: 0x9F95,
- 23640: 0x9F96,
- 23641: 0x9F97,
- 23642: 0x9F98,
- 23643: 0x9F9C,
- 23644: 0x9F9D,
- 23645: 0x9F9E,
- 23646: 0x9FA1,
- 23647: 0x9FA2,
- 23648: 0x9FA3,
- 23649: 0x9FA4,
- 23650: 0x9FA5,
- 23651: 0xF92C,
- 23652: 0xF979,
- 23653: 0xF995,
- 23654: 0xF9E7,
- 23655: 0xF9F1,
- 23750: 0xFA0C,
- 23751: 0xFA0D,
- 23752: 0xFA0E,
- 23753: 0xFA0F,
- 23754: 0xFA11,
- 23755: 0xFA13,
- 23756: 0xFA14,
- 23757: 0xFA18,
- 23758: 0xFA1F,
- 23759: 0xFA20,
- 23760: 0xFA21,
- 23761: 0xFA23,
- 23762: 0xFA24,
- 23763: 0xFA27,
- 23764: 0xFA28,
- 23765: 0xFA29,
- 23766: 0x2E81,
- 23770: 0x2E84,
- 23771: 0x3473,
- 23772: 0x3447,
- 23773: 0x2E88,
- 23774: 0x2E8B,
- 23776: 0x359E,
- 23777: 0x361A,
- 23778: 0x360E,
- 23779: 0x2E8C,
- 23780: 0x2E97,
- 23781: 0x396E,
- 23782: 0x3918,
- 23784: 0x39CF,
- 23785: 0x39DF,
- 23786: 0x3A73,
- 23787: 0x39D0,
- 23790: 0x3B4E,
- 23791: 0x3C6E,
- 23792: 0x3CE0,
- 23793: 0x2EA7,
- 23796: 0x2EAA,
- 23797: 0x4056,
- 23798: 0x415F,
- 23799: 0x2EAE,
- 23800: 0x4337,
- 23801: 0x2EB3,
- 23802: 0x2EB6,
- 23803: 0x2EB7,
- 23805: 0x43B1,
- 23806: 0x43AC,
- 23807: 0x2EBB,
- 23808: 0x43DD,
- 23809: 0x44D6,
- 23810: 0x4661,
- 23811: 0x464C,
- 23813: 0x4723,
- 23814: 0x4729,
- 23815: 0x477C,
- 23816: 0x478D,
- 23817: 0x2ECA,
- 23818: 0x4947,
- 23819: 0x497A,
- 23820: 0x497D,
- 23821: 0x4982,
- 23822: 0x4983,
- 23823: 0x4985,
- 23824: 0x4986,
- 23825: 0x499F,
- 23826: 0x499B,
- 23827: 0x49B7,
- 23828: 0x49B6,
- 23831: 0x4CA3,
- 23832: 0x4C9F,
- 23833: 0x4CA0,
- 23834: 0x4CA1,
- 23835: 0x4C77,
- 23836: 0x4CA2,
- 23837: 0x4D13,
- 23838: 0x4D14,
- 23839: 0x4D15,
- 23840: 0x4D16,
- 23841: 0x4D17,
- 23842: 0x4D18,
- 23843: 0x4D19,
- 23844: 0x4DAE,
-}
-
-const numEncodeTables = 5
-
-// encodeX are the encoding tables from Unicode to GBK code,
-// sorted by decreasing length.
-// encode0: 28965 entries for runes in [11905, 40870).
-// encode1: 1587 entries for runes in [ 8208, 9795).
-// encode2: 942 entries for runes in [ 164, 1106).
-// encode3: 438 entries for runes in [65072, 65510).
-// encode4: 254 entries for runes in [63788, 64042).
-
-const encode0Low, encode0High = 11905, 40870
-
-var encode0 = [...]uint16{
- 11905 - 11905: 0xFE50,
- 11908 - 11905: 0xFE54,
- 11912 - 11905: 0xFE57,
- 11915 - 11905: 0xFE58,
- 11916 - 11905: 0xFE5D,
- 11927 - 11905: 0xFE5E,
- 11943 - 11905: 0xFE6B,
- 11946 - 11905: 0xFE6E,
- 11950 - 11905: 0xFE71,
- 11955 - 11905: 0xFE73,
- 11958 - 11905: 0xFE74,
- 11959 - 11905: 0xFE75,
- 11963 - 11905: 0xFE79,
- 11978 - 11905: 0xFE84,
- 12272 - 11905: 0xA98A,
- 12273 - 11905: 0xA98B,
- 12274 - 11905: 0xA98C,
- 12275 - 11905: 0xA98D,
- 12276 - 11905: 0xA98E,
- 12277 - 11905: 0xA98F,
- 12278 - 11905: 0xA990,
- 12279 - 11905: 0xA991,
- 12280 - 11905: 0xA992,
- 12281 - 11905: 0xA993,
- 12282 - 11905: 0xA994,
- 12283 - 11905: 0xA995,
- 12288 - 11905: 0xA1A1,
- 12289 - 11905: 0xA1A2,
- 12290 - 11905: 0xA1A3,
- 12291 - 11905: 0xA1A8,
- 12293 - 11905: 0xA1A9,
- 12294 - 11905: 0xA965,
- 12295 - 11905: 0xA996,
- 12296 - 11905: 0xA1B4,
- 12297 - 11905: 0xA1B5,
- 12298 - 11905: 0xA1B6,
- 12299 - 11905: 0xA1B7,
- 12300 - 11905: 0xA1B8,
- 12301 - 11905: 0xA1B9,
- 12302 - 11905: 0xA1BA,
- 12303 - 11905: 0xA1BB,
- 12304 - 11905: 0xA1BE,
- 12305 - 11905: 0xA1BF,
- 12306 - 11905: 0xA893,
- 12307 - 11905: 0xA1FE,
- 12308 - 11905: 0xA1B2,
- 12309 - 11905: 0xA1B3,
- 12310 - 11905: 0xA1BC,
- 12311 - 11905: 0xA1BD,
- 12317 - 11905: 0xA894,
- 12318 - 11905: 0xA895,
- 12321 - 11905: 0xA940,
- 12322 - 11905: 0xA941,
- 12323 - 11905: 0xA942,
- 12324 - 11905: 0xA943,
- 12325 - 11905: 0xA944,
- 12326 - 11905: 0xA945,
- 12327 - 11905: 0xA946,
- 12328 - 11905: 0xA947,
- 12329 - 11905: 0xA948,
- 12350 - 11905: 0xA989,
- 12353 - 11905: 0xA4A1,
- 12354 - 11905: 0xA4A2,
- 12355 - 11905: 0xA4A3,
- 12356 - 11905: 0xA4A4,
- 12357 - 11905: 0xA4A5,
- 12358 - 11905: 0xA4A6,
- 12359 - 11905: 0xA4A7,
- 12360 - 11905: 0xA4A8,
- 12361 - 11905: 0xA4A9,
- 12362 - 11905: 0xA4AA,
- 12363 - 11905: 0xA4AB,
- 12364 - 11905: 0xA4AC,
- 12365 - 11905: 0xA4AD,
- 12366 - 11905: 0xA4AE,
- 12367 - 11905: 0xA4AF,
- 12368 - 11905: 0xA4B0,
- 12369 - 11905: 0xA4B1,
- 12370 - 11905: 0xA4B2,
- 12371 - 11905: 0xA4B3,
- 12372 - 11905: 0xA4B4,
- 12373 - 11905: 0xA4B5,
- 12374 - 11905: 0xA4B6,
- 12375 - 11905: 0xA4B7,
- 12376 - 11905: 0xA4B8,
- 12377 - 11905: 0xA4B9,
- 12378 - 11905: 0xA4BA,
- 12379 - 11905: 0xA4BB,
- 12380 - 11905: 0xA4BC,
- 12381 - 11905: 0xA4BD,
- 12382 - 11905: 0xA4BE,
- 12383 - 11905: 0xA4BF,
- 12384 - 11905: 0xA4C0,
- 12385 - 11905: 0xA4C1,
- 12386 - 11905: 0xA4C2,
- 12387 - 11905: 0xA4C3,
- 12388 - 11905: 0xA4C4,
- 12389 - 11905: 0xA4C5,
- 12390 - 11905: 0xA4C6,
- 12391 - 11905: 0xA4C7,
- 12392 - 11905: 0xA4C8,
- 12393 - 11905: 0xA4C9,
- 12394 - 11905: 0xA4CA,
- 12395 - 11905: 0xA4CB,
- 12396 - 11905: 0xA4CC,
- 12397 - 11905: 0xA4CD,
- 12398 - 11905: 0xA4CE,
- 12399 - 11905: 0xA4CF,
- 12400 - 11905: 0xA4D0,
- 12401 - 11905: 0xA4D1,
- 12402 - 11905: 0xA4D2,
- 12403 - 11905: 0xA4D3,
- 12404 - 11905: 0xA4D4,
- 12405 - 11905: 0xA4D5,
- 12406 - 11905: 0xA4D6,
- 12407 - 11905: 0xA4D7,
- 12408 - 11905: 0xA4D8,
- 12409 - 11905: 0xA4D9,
- 12410 - 11905: 0xA4DA,
- 12411 - 11905: 0xA4DB,
- 12412 - 11905: 0xA4DC,
- 12413 - 11905: 0xA4DD,
- 12414 - 11905: 0xA4DE,
- 12415 - 11905: 0xA4DF,
- 12416 - 11905: 0xA4E0,
- 12417 - 11905: 0xA4E1,
- 12418 - 11905: 0xA4E2,
- 12419 - 11905: 0xA4E3,
- 12420 - 11905: 0xA4E4,
- 12421 - 11905: 0xA4E5,
- 12422 - 11905: 0xA4E6,
- 12423 - 11905: 0xA4E7,
- 12424 - 11905: 0xA4E8,
- 12425 - 11905: 0xA4E9,
- 12426 - 11905: 0xA4EA,
- 12427 - 11905: 0xA4EB,
- 12428 - 11905: 0xA4EC,
- 12429 - 11905: 0xA4ED,
- 12430 - 11905: 0xA4EE,
- 12431 - 11905: 0xA4EF,
- 12432 - 11905: 0xA4F0,
- 12433 - 11905: 0xA4F1,
- 12434 - 11905: 0xA4F2,
- 12435 - 11905: 0xA4F3,
- 12443 - 11905: 0xA961,
- 12444 - 11905: 0xA962,
- 12445 - 11905: 0xA966,
- 12446 - 11905: 0xA967,
- 12449 - 11905: 0xA5A1,
- 12450 - 11905: 0xA5A2,
- 12451 - 11905: 0xA5A3,
- 12452 - 11905: 0xA5A4,
- 12453 - 11905: 0xA5A5,
- 12454 - 11905: 0xA5A6,
- 12455 - 11905: 0xA5A7,
- 12456 - 11905: 0xA5A8,
- 12457 - 11905: 0xA5A9,
- 12458 - 11905: 0xA5AA,
- 12459 - 11905: 0xA5AB,
- 12460 - 11905: 0xA5AC,
- 12461 - 11905: 0xA5AD,
- 12462 - 11905: 0xA5AE,
- 12463 - 11905: 0xA5AF,
- 12464 - 11905: 0xA5B0,
- 12465 - 11905: 0xA5B1,
- 12466 - 11905: 0xA5B2,
- 12467 - 11905: 0xA5B3,
- 12468 - 11905: 0xA5B4,
- 12469 - 11905: 0xA5B5,
- 12470 - 11905: 0xA5B6,
- 12471 - 11905: 0xA5B7,
- 12472 - 11905: 0xA5B8,
- 12473 - 11905: 0xA5B9,
- 12474 - 11905: 0xA5BA,
- 12475 - 11905: 0xA5BB,
- 12476 - 11905: 0xA5BC,
- 12477 - 11905: 0xA5BD,
- 12478 - 11905: 0xA5BE,
- 12479 - 11905: 0xA5BF,
- 12480 - 11905: 0xA5C0,
- 12481 - 11905: 0xA5C1,
- 12482 - 11905: 0xA5C2,
- 12483 - 11905: 0xA5C3,
- 12484 - 11905: 0xA5C4,
- 12485 - 11905: 0xA5C5,
- 12486 - 11905: 0xA5C6,
- 12487 - 11905: 0xA5C7,
- 12488 - 11905: 0xA5C8,
- 12489 - 11905: 0xA5C9,
- 12490 - 11905: 0xA5CA,
- 12491 - 11905: 0xA5CB,
- 12492 - 11905: 0xA5CC,
- 12493 - 11905: 0xA5CD,
- 12494 - 11905: 0xA5CE,
- 12495 - 11905: 0xA5CF,
- 12496 - 11905: 0xA5D0,
- 12497 - 11905: 0xA5D1,
- 12498 - 11905: 0xA5D2,
- 12499 - 11905: 0xA5D3,
- 12500 - 11905: 0xA5D4,
- 12501 - 11905: 0xA5D5,
- 12502 - 11905: 0xA5D6,
- 12503 - 11905: 0xA5D7,
- 12504 - 11905: 0xA5D8,
- 12505 - 11905: 0xA5D9,
- 12506 - 11905: 0xA5DA,
- 12507 - 11905: 0xA5DB,
- 12508 - 11905: 0xA5DC,
- 12509 - 11905: 0xA5DD,
- 12510 - 11905: 0xA5DE,
- 12511 - 11905: 0xA5DF,
- 12512 - 11905: 0xA5E0,
- 12513 - 11905: 0xA5E1,
- 12514 - 11905: 0xA5E2,
- 12515 - 11905: 0xA5E3,
- 12516 - 11905: 0xA5E4,
- 12517 - 11905: 0xA5E5,
- 12518 - 11905: 0xA5E6,
- 12519 - 11905: 0xA5E7,
- 12520 - 11905: 0xA5E8,
- 12521 - 11905: 0xA5E9,
- 12522 - 11905: 0xA5EA,
- 12523 - 11905: 0xA5EB,
- 12524 - 11905: 0xA5EC,
- 12525 - 11905: 0xA5ED,
- 12526 - 11905: 0xA5EE,
- 12527 - 11905: 0xA5EF,
- 12528 - 11905: 0xA5F0,
- 12529 - 11905: 0xA5F1,
- 12530 - 11905: 0xA5F2,
- 12531 - 11905: 0xA5F3,
- 12532 - 11905: 0xA5F4,
- 12533 - 11905: 0xA5F5,
- 12534 - 11905: 0xA5F6,
- 12540 - 11905: 0xA960,
- 12541 - 11905: 0xA963,
- 12542 - 11905: 0xA964,
- 12549 - 11905: 0xA8C5,
- 12550 - 11905: 0xA8C6,
- 12551 - 11905: 0xA8C7,
- 12552 - 11905: 0xA8C8,
- 12553 - 11905: 0xA8C9,
- 12554 - 11905: 0xA8CA,
- 12555 - 11905: 0xA8CB,
- 12556 - 11905: 0xA8CC,
- 12557 - 11905: 0xA8CD,
- 12558 - 11905: 0xA8CE,
- 12559 - 11905: 0xA8CF,
- 12560 - 11905: 0xA8D0,
- 12561 - 11905: 0xA8D1,
- 12562 - 11905: 0xA8D2,
- 12563 - 11905: 0xA8D3,
- 12564 - 11905: 0xA8D4,
- 12565 - 11905: 0xA8D5,
- 12566 - 11905: 0xA8D6,
- 12567 - 11905: 0xA8D7,
- 12568 - 11905: 0xA8D8,
- 12569 - 11905: 0xA8D9,
- 12570 - 11905: 0xA8DA,
- 12571 - 11905: 0xA8DB,
- 12572 - 11905: 0xA8DC,
- 12573 - 11905: 0xA8DD,
- 12574 - 11905: 0xA8DE,
- 12575 - 11905: 0xA8DF,
- 12576 - 11905: 0xA8E0,
- 12577 - 11905: 0xA8E1,
- 12578 - 11905: 0xA8E2,
- 12579 - 11905: 0xA8E3,
- 12580 - 11905: 0xA8E4,
- 12581 - 11905: 0xA8E5,
- 12582 - 11905: 0xA8E6,
- 12583 - 11905: 0xA8E7,
- 12584 - 11905: 0xA8E8,
- 12585 - 11905: 0xA8E9,
- 12832 - 11905: 0xA2E5,
- 12833 - 11905: 0xA2E6,
- 12834 - 11905: 0xA2E7,
- 12835 - 11905: 0xA2E8,
- 12836 - 11905: 0xA2E9,
- 12837 - 11905: 0xA2EA,
- 12838 - 11905: 0xA2EB,
- 12839 - 11905: 0xA2EC,
- 12840 - 11905: 0xA2ED,
- 12841 - 11905: 0xA2EE,
- 12849 - 11905: 0xA95A,
- 12963 - 11905: 0xA949,
- 13198 - 11905: 0xA94A,
- 13199 - 11905: 0xA94B,
- 13212 - 11905: 0xA94C,
- 13213 - 11905: 0xA94D,
- 13214 - 11905: 0xA94E,
- 13217 - 11905: 0xA94F,
- 13252 - 11905: 0xA950,
- 13262 - 11905: 0xA951,
- 13265 - 11905: 0xA952,
- 13266 - 11905: 0xA953,
- 13269 - 11905: 0xA954,
- 13383 - 11905: 0xFE56,
- 13427 - 11905: 0xFE55,
- 13726 - 11905: 0xFE5A,
- 13838 - 11905: 0xFE5C,
- 13850 - 11905: 0xFE5B,
- 14616 - 11905: 0xFE60,
- 14702 - 11905: 0xFE5F,
- 14799 - 11905: 0xFE62,
- 14800 - 11905: 0xFE65,
- 14815 - 11905: 0xFE63,
- 14963 - 11905: 0xFE64,
- 15182 - 11905: 0xFE68,
- 15470 - 11905: 0xFE69,
- 15584 - 11905: 0xFE6A,
- 16470 - 11905: 0xFE6F,
- 16735 - 11905: 0xFE70,
- 17207 - 11905: 0xFE72,
- 17324 - 11905: 0xFE78,
- 17329 - 11905: 0xFE77,
- 17373 - 11905: 0xFE7A,
- 17622 - 11905: 0xFE7B,
- 17996 - 11905: 0xFE7D,
- 18017 - 11905: 0xFE7C,
- 18211 - 11905: 0xFE80,
- 18217 - 11905: 0xFE81,
- 18300 - 11905: 0xFE82,
- 18317 - 11905: 0xFE83,
- 18759 - 11905: 0xFE85,
- 18810 - 11905: 0xFE86,
- 18813 - 11905: 0xFE87,
- 18818 - 11905: 0xFE88,
- 18819 - 11905: 0xFE89,
- 18821 - 11905: 0xFE8A,
- 18822 - 11905: 0xFE8B,
- 18843 - 11905: 0xFE8D,
- 18847 - 11905: 0xFE8C,
- 18870 - 11905: 0xFE8F,
- 18871 - 11905: 0xFE8E,
- 19575 - 11905: 0xFE96,
- 19615 - 11905: 0xFE93,
- 19616 - 11905: 0xFE94,
- 19617 - 11905: 0xFE95,
- 19618 - 11905: 0xFE97,
- 19619 - 11905: 0xFE92,
- 19731 - 11905: 0xFE98,
- 19732 - 11905: 0xFE99,
- 19733 - 11905: 0xFE9A,
- 19734 - 11905: 0xFE9B,
- 19735 - 11905: 0xFE9C,
- 19736 - 11905: 0xFE9D,
- 19737 - 11905: 0xFE9E,
- 19886 - 11905: 0xFE9F,
- 19968 - 11905: 0xD2BB,
- 19969 - 11905: 0xB6A1,
- 19970 - 11905: 0x8140,
- 19971 - 11905: 0xC6DF,
- 19972 - 11905: 0x8141,
- 19973 - 11905: 0x8142,
- 19974 - 11905: 0x8143,
- 19975 - 11905: 0xCDF2,
- 19976 - 11905: 0xD5C9,
- 19977 - 11905: 0xC8FD,
- 19978 - 11905: 0xC9CF,
- 19979 - 11905: 0xCFC2,
- 19980 - 11905: 0xD8A2,
- 19981 - 11905: 0xB2BB,
- 19982 - 11905: 0xD3EB,
- 19983 - 11905: 0x8144,
- 19984 - 11905: 0xD8A4,
- 19985 - 11905: 0xB3F3,
- 19986 - 11905: 0x8145,
- 19987 - 11905: 0xD7A8,
- 19988 - 11905: 0xC7D2,
- 19989 - 11905: 0xD8A7,
- 19990 - 11905: 0xCAC0,
- 19991 - 11905: 0x8146,
- 19992 - 11905: 0xC7F0,
- 19993 - 11905: 0xB1FB,
- 19994 - 11905: 0xD2B5,
- 19995 - 11905: 0xB4D4,
- 19996 - 11905: 0xB6AB,
- 19997 - 11905: 0xCBBF,
- 19998 - 11905: 0xD8A9,
- 19999 - 11905: 0x8147,
- 20000 - 11905: 0x8148,
- 20001 - 11905: 0x8149,
- 20002 - 11905: 0xB6AA,
- 20003 - 11905: 0x814A,
- 20004 - 11905: 0xC1BD,
- 20005 - 11905: 0xD1CF,
- 20006 - 11905: 0x814B,
- 20007 - 11905: 0xC9A5,
- 20008 - 11905: 0xD8AD,
- 20009 - 11905: 0x814C,
- 20010 - 11905: 0xB8F6,
- 20011 - 11905: 0xD1BE,
- 20012 - 11905: 0xE3DC,
- 20013 - 11905: 0xD6D0,
- 20014 - 11905: 0x814D,
- 20015 - 11905: 0x814E,
- 20016 - 11905: 0xB7E1,
- 20017 - 11905: 0x814F,
- 20018 - 11905: 0xB4AE,
- 20019 - 11905: 0x8150,
- 20020 - 11905: 0xC1D9,
- 20021 - 11905: 0x8151,
- 20022 - 11905: 0xD8BC,
- 20023 - 11905: 0x8152,
- 20024 - 11905: 0xCDE8,
- 20025 - 11905: 0xB5A4,
- 20026 - 11905: 0xCEAA,
- 20027 - 11905: 0xD6F7,
- 20028 - 11905: 0x8153,
- 20029 - 11905: 0xC0F6,
- 20030 - 11905: 0xBED9,
- 20031 - 11905: 0xD8AF,
- 20032 - 11905: 0x8154,
- 20033 - 11905: 0x8155,
- 20034 - 11905: 0x8156,
- 20035 - 11905: 0xC4CB,
- 20036 - 11905: 0x8157,
- 20037 - 11905: 0xBEC3,
- 20038 - 11905: 0x8158,
- 20039 - 11905: 0xD8B1,
- 20040 - 11905: 0xC3B4,
- 20041 - 11905: 0xD2E5,
- 20042 - 11905: 0x8159,
- 20043 - 11905: 0xD6AE,
- 20044 - 11905: 0xCEDA,
- 20045 - 11905: 0xD5A7,
- 20046 - 11905: 0xBAF5,
- 20047 - 11905: 0xB7A6,
- 20048 - 11905: 0xC0D6,
- 20049 - 11905: 0x815A,
- 20050 - 11905: 0xC6B9,
- 20051 - 11905: 0xC5D2,
- 20052 - 11905: 0xC7C7,
- 20053 - 11905: 0x815B,
- 20054 - 11905: 0xB9D4,
- 20055 - 11905: 0x815C,
- 20056 - 11905: 0xB3CB,
- 20057 - 11905: 0xD2D2,
- 20058 - 11905: 0x815D,
- 20059 - 11905: 0x815E,
- 20060 - 11905: 0xD8BF,
- 20061 - 11905: 0xBEC5,
- 20062 - 11905: 0xC6F2,
- 20063 - 11905: 0xD2B2,
- 20064 - 11905: 0xCFB0,
- 20065 - 11905: 0xCFE7,
- 20066 - 11905: 0x815F,
- 20067 - 11905: 0x8160,
- 20068 - 11905: 0x8161,
- 20069 - 11905: 0x8162,
- 20070 - 11905: 0xCAE9,
- 20071 - 11905: 0x8163,
- 20072 - 11905: 0x8164,
- 20073 - 11905: 0xD8C0,
- 20074 - 11905: 0x8165,
- 20075 - 11905: 0x8166,
- 20076 - 11905: 0x8167,
- 20077 - 11905: 0x8168,
- 20078 - 11905: 0x8169,
- 20079 - 11905: 0x816A,
- 20080 - 11905: 0xC2F2,
- 20081 - 11905: 0xC2D2,
- 20082 - 11905: 0x816B,
- 20083 - 11905: 0xC8E9,
- 20084 - 11905: 0x816C,
- 20085 - 11905: 0x816D,
- 20086 - 11905: 0x816E,
- 20087 - 11905: 0x816F,
- 20088 - 11905: 0x8170,
- 20089 - 11905: 0x8171,
- 20090 - 11905: 0x8172,
- 20091 - 11905: 0x8173,
- 20092 - 11905: 0x8174,
- 20093 - 11905: 0x8175,
- 20094 - 11905: 0xC7AC,
- 20095 - 11905: 0x8176,
- 20096 - 11905: 0x8177,
- 20097 - 11905: 0x8178,
- 20098 - 11905: 0x8179,
- 20099 - 11905: 0x817A,
- 20100 - 11905: 0x817B,
- 20101 - 11905: 0x817C,
- 20102 - 11905: 0xC1CB,
- 20103 - 11905: 0x817D,
- 20104 - 11905: 0xD3E8,
- 20105 - 11905: 0xD5F9,
- 20106 - 11905: 0x817E,
- 20107 - 11905: 0xCAC2,
- 20108 - 11905: 0xB6FE,
- 20109 - 11905: 0xD8A1,
- 20110 - 11905: 0xD3DA,
- 20111 - 11905: 0xBFF7,
- 20112 - 11905: 0x8180,
- 20113 - 11905: 0xD4C6,
- 20114 - 11905: 0xBBA5,
- 20115 - 11905: 0xD8C1,
- 20116 - 11905: 0xCEE5,
- 20117 - 11905: 0xBEAE,
- 20118 - 11905: 0x8181,
- 20119 - 11905: 0x8182,
- 20120 - 11905: 0xD8A8,
- 20121 - 11905: 0x8183,
- 20122 - 11905: 0xD1C7,
- 20123 - 11905: 0xD0A9,
- 20124 - 11905: 0x8184,
- 20125 - 11905: 0x8185,
- 20126 - 11905: 0x8186,
- 20127 - 11905: 0xD8BD,
- 20128 - 11905: 0xD9EF,
- 20129 - 11905: 0xCDF6,
- 20130 - 11905: 0xBFBA,
- 20131 - 11905: 0x8187,
- 20132 - 11905: 0xBDBB,
- 20133 - 11905: 0xBAA5,
- 20134 - 11905: 0xD2E0,
- 20135 - 11905: 0xB2FA,
- 20136 - 11905: 0xBAE0,
- 20137 - 11905: 0xC4B6,
- 20138 - 11905: 0x8188,
- 20139 - 11905: 0xCFED,
- 20140 - 11905: 0xBEA9,
- 20141 - 11905: 0xCDA4,
- 20142 - 11905: 0xC1C1,
- 20143 - 11905: 0x8189,
- 20144 - 11905: 0x818A,
- 20145 - 11905: 0x818B,
- 20146 - 11905: 0xC7D7,
- 20147 - 11905: 0xD9F1,
- 20148 - 11905: 0x818C,
- 20149 - 11905: 0xD9F4,
- 20150 - 11905: 0x818D,
- 20151 - 11905: 0x818E,
- 20152 - 11905: 0x818F,
- 20153 - 11905: 0x8190,
- 20154 - 11905: 0xC8CB,
- 20155 - 11905: 0xD8E9,
- 20156 - 11905: 0x8191,
- 20157 - 11905: 0x8192,
- 20158 - 11905: 0x8193,
- 20159 - 11905: 0xD2DA,
- 20160 - 11905: 0xCAB2,
- 20161 - 11905: 0xC8CA,
- 20162 - 11905: 0xD8EC,
- 20163 - 11905: 0xD8EA,
- 20164 - 11905: 0xD8C6,
- 20165 - 11905: 0xBDF6,
- 20166 - 11905: 0xC6CD,
- 20167 - 11905: 0xB3F0,
- 20168 - 11905: 0x8194,
- 20169 - 11905: 0xD8EB,
- 20170 - 11905: 0xBDF1,
- 20171 - 11905: 0xBDE9,
- 20172 - 11905: 0x8195,
- 20173 - 11905: 0xC8D4,
- 20174 - 11905: 0xB4D3,
- 20175 - 11905: 0x8196,
- 20176 - 11905: 0x8197,
- 20177 - 11905: 0xC2D8,
- 20178 - 11905: 0x8198,
- 20179 - 11905: 0xB2D6,
- 20180 - 11905: 0xD7D0,
- 20181 - 11905: 0xCACB,
- 20182 - 11905: 0xCBFB,
- 20183 - 11905: 0xD5CC,
- 20184 - 11905: 0xB8B6,
- 20185 - 11905: 0xCFC9,
- 20186 - 11905: 0x8199,
- 20187 - 11905: 0x819A,
- 20188 - 11905: 0x819B,
- 20189 - 11905: 0xD9DA,
- 20190 - 11905: 0xD8F0,
- 20191 - 11905: 0xC7AA,
- 20192 - 11905: 0x819C,
- 20193 - 11905: 0xD8EE,
- 20194 - 11905: 0x819D,
- 20195 - 11905: 0xB4FA,
- 20196 - 11905: 0xC1EE,
- 20197 - 11905: 0xD2D4,
- 20198 - 11905: 0x819E,
- 20199 - 11905: 0x819F,
- 20200 - 11905: 0xD8ED,
- 20201 - 11905: 0x81A0,
- 20202 - 11905: 0xD2C7,
- 20203 - 11905: 0xD8EF,
- 20204 - 11905: 0xC3C7,
- 20205 - 11905: 0x81A1,
- 20206 - 11905: 0x81A2,
- 20207 - 11905: 0x81A3,
- 20208 - 11905: 0xD1F6,
- 20209 - 11905: 0x81A4,
- 20210 - 11905: 0xD6D9,
- 20211 - 11905: 0xD8F2,
- 20212 - 11905: 0x81A5,
- 20213 - 11905: 0xD8F5,
- 20214 - 11905: 0xBCFE,
- 20215 - 11905: 0xBCDB,
- 20216 - 11905: 0x81A6,
- 20217 - 11905: 0x81A7,
- 20218 - 11905: 0x81A8,
- 20219 - 11905: 0xC8CE,
- 20220 - 11905: 0x81A9,
- 20221 - 11905: 0xB7DD,
- 20222 - 11905: 0x81AA,
- 20223 - 11905: 0xB7C2,
- 20224 - 11905: 0x81AB,
- 20225 - 11905: 0xC6F3,
- 20226 - 11905: 0x81AC,
- 20227 - 11905: 0x81AD,
- 20228 - 11905: 0x81AE,
- 20229 - 11905: 0x81AF,
- 20230 - 11905: 0x81B0,
- 20231 - 11905: 0x81B1,
- 20232 - 11905: 0x81B2,
- 20233 - 11905: 0xD8F8,
- 20234 - 11905: 0xD2C1,
- 20235 - 11905: 0x81B3,
- 20236 - 11905: 0x81B4,
- 20237 - 11905: 0xCEE9,
- 20238 - 11905: 0xBCBF,
- 20239 - 11905: 0xB7FC,
- 20240 - 11905: 0xB7A5,
- 20241 - 11905: 0xD0DD,
- 20242 - 11905: 0x81B5,
- 20243 - 11905: 0x81B6,
- 20244 - 11905: 0x81B7,
- 20245 - 11905: 0x81B8,
- 20246 - 11905: 0x81B9,
- 20247 - 11905: 0xD6DA,
- 20248 - 11905: 0xD3C5,
- 20249 - 11905: 0xBBEF,
- 20250 - 11905: 0xBBE1,
- 20251 - 11905: 0xD8F1,
- 20252 - 11905: 0x81BA,
- 20253 - 11905: 0x81BB,
- 20254 - 11905: 0xC9A1,
- 20255 - 11905: 0xCEB0,
- 20256 - 11905: 0xB4AB,
- 20257 - 11905: 0x81BC,
- 20258 - 11905: 0xD8F3,
- 20259 - 11905: 0x81BD,
- 20260 - 11905: 0xC9CB,
- 20261 - 11905: 0xD8F6,
- 20262 - 11905: 0xC2D7,
- 20263 - 11905: 0xD8F7,
- 20264 - 11905: 0x81BE,
- 20265 - 11905: 0x81BF,
- 20266 - 11905: 0xCEB1,
- 20267 - 11905: 0xD8F9,
- 20268 - 11905: 0x81C0,
- 20269 - 11905: 0x81C1,
- 20270 - 11905: 0x81C2,
- 20271 - 11905: 0xB2AE,
- 20272 - 11905: 0xB9C0,
- 20273 - 11905: 0x81C3,
- 20274 - 11905: 0xD9A3,
- 20275 - 11905: 0x81C4,
- 20276 - 11905: 0xB0E9,
- 20277 - 11905: 0x81C5,
- 20278 - 11905: 0xC1E6,
- 20279 - 11905: 0x81C6,
- 20280 - 11905: 0xC9EC,
- 20281 - 11905: 0x81C7,
- 20282 - 11905: 0xCBC5,
- 20283 - 11905: 0x81C8,
- 20284 - 11905: 0xCBC6,
- 20285 - 11905: 0xD9A4,
- 20286 - 11905: 0x81C9,
- 20287 - 11905: 0x81CA,
- 20288 - 11905: 0x81CB,
- 20289 - 11905: 0x81CC,
- 20290 - 11905: 0x81CD,
- 20291 - 11905: 0xB5E8,
- 20292 - 11905: 0x81CE,
- 20293 - 11905: 0x81CF,
- 20294 - 11905: 0xB5AB,
- 20295 - 11905: 0x81D0,
- 20296 - 11905: 0x81D1,
- 20297 - 11905: 0x81D2,
- 20298 - 11905: 0x81D3,
- 20299 - 11905: 0x81D4,
- 20300 - 11905: 0x81D5,
- 20301 - 11905: 0xCEBB,
- 20302 - 11905: 0xB5CD,
- 20303 - 11905: 0xD7A1,
- 20304 - 11905: 0xD7F4,
- 20305 - 11905: 0xD3D3,
- 20306 - 11905: 0x81D6,
- 20307 - 11905: 0xCCE5,
- 20308 - 11905: 0x81D7,
- 20309 - 11905: 0xBACE,
- 20310 - 11905: 0x81D8,
- 20311 - 11905: 0xD9A2,
- 20312 - 11905: 0xD9DC,
- 20313 - 11905: 0xD3E0,
- 20314 - 11905: 0xD8FD,
- 20315 - 11905: 0xB7F0,
- 20316 - 11905: 0xD7F7,
- 20317 - 11905: 0xD8FE,
- 20318 - 11905: 0xD8FA,
- 20319 - 11905: 0xD9A1,
- 20320 - 11905: 0xC4E3,
- 20321 - 11905: 0x81D9,
- 20322 - 11905: 0x81DA,
- 20323 - 11905: 0xD3B6,
- 20324 - 11905: 0xD8F4,
- 20325 - 11905: 0xD9DD,
- 20326 - 11905: 0x81DB,
- 20327 - 11905: 0xD8FB,
- 20328 - 11905: 0x81DC,
- 20329 - 11905: 0xC5E5,
- 20330 - 11905: 0x81DD,
- 20331 - 11905: 0x81DE,
- 20332 - 11905: 0xC0D0,
- 20333 - 11905: 0x81DF,
- 20334 - 11905: 0x81E0,
- 20335 - 11905: 0xD1F0,
- 20336 - 11905: 0xB0DB,
- 20337 - 11905: 0x81E1,
- 20338 - 11905: 0x81E2,
- 20339 - 11905: 0xBCD1,
- 20340 - 11905: 0xD9A6,
- 20341 - 11905: 0x81E3,
- 20342 - 11905: 0xD9A5,
- 20343 - 11905: 0x81E4,
- 20344 - 11905: 0x81E5,
- 20345 - 11905: 0x81E6,
- 20346 - 11905: 0x81E7,
- 20347 - 11905: 0xD9AC,
- 20348 - 11905: 0xD9AE,
- 20349 - 11905: 0x81E8,
- 20350 - 11905: 0xD9AB,
- 20351 - 11905: 0xCAB9,
- 20352 - 11905: 0x81E9,
- 20353 - 11905: 0x81EA,
- 20354 - 11905: 0x81EB,
- 20355 - 11905: 0xD9A9,
- 20356 - 11905: 0xD6B6,
- 20357 - 11905: 0x81EC,
- 20358 - 11905: 0x81ED,
- 20359 - 11905: 0x81EE,
- 20360 - 11905: 0xB3DE,
- 20361 - 11905: 0xD9A8,
- 20362 - 11905: 0x81EF,
- 20363 - 11905: 0xC0FD,
- 20364 - 11905: 0x81F0,
- 20365 - 11905: 0xCACC,
- 20366 - 11905: 0x81F1,
- 20367 - 11905: 0xD9AA,
- 20368 - 11905: 0x81F2,
- 20369 - 11905: 0xD9A7,
- 20370 - 11905: 0x81F3,
- 20371 - 11905: 0x81F4,
- 20372 - 11905: 0xD9B0,
- 20373 - 11905: 0x81F5,
- 20374 - 11905: 0x81F6,
- 20375 - 11905: 0xB6B1,
- 20376 - 11905: 0x81F7,
- 20377 - 11905: 0x81F8,
- 20378 - 11905: 0x81F9,
- 20379 - 11905: 0xB9A9,
- 20380 - 11905: 0x81FA,
- 20381 - 11905: 0xD2C0,
- 20382 - 11905: 0x81FB,
- 20383 - 11905: 0x81FC,
- 20384 - 11905: 0xCFC0,
- 20385 - 11905: 0x81FD,
- 20386 - 11905: 0x81FE,
- 20387 - 11905: 0xC2C2,
- 20388 - 11905: 0x8240,
- 20389 - 11905: 0xBDC4,
- 20390 - 11905: 0xD5EC,
- 20391 - 11905: 0xB2E0,
- 20392 - 11905: 0xC7C8,
- 20393 - 11905: 0xBFEB,
- 20394 - 11905: 0xD9AD,
- 20395 - 11905: 0x8241,
- 20396 - 11905: 0xD9AF,
- 20397 - 11905: 0x8242,
- 20398 - 11905: 0xCEEA,
- 20399 - 11905: 0xBAEE,
- 20400 - 11905: 0x8243,
- 20401 - 11905: 0x8244,
- 20402 - 11905: 0x8245,
- 20403 - 11905: 0x8246,
- 20404 - 11905: 0x8247,
- 20405 - 11905: 0xC7D6,
- 20406 - 11905: 0x8248,
- 20407 - 11905: 0x8249,
- 20408 - 11905: 0x824A,
- 20409 - 11905: 0x824B,
- 20410 - 11905: 0x824C,
- 20411 - 11905: 0x824D,
- 20412 - 11905: 0x824E,
- 20413 - 11905: 0x824F,
- 20414 - 11905: 0x8250,
- 20415 - 11905: 0xB1E3,
- 20416 - 11905: 0x8251,
- 20417 - 11905: 0x8252,
- 20418 - 11905: 0x8253,
- 20419 - 11905: 0xB4D9,
- 20420 - 11905: 0xB6ED,
- 20421 - 11905: 0xD9B4,
- 20422 - 11905: 0x8254,
- 20423 - 11905: 0x8255,
- 20424 - 11905: 0x8256,
- 20425 - 11905: 0x8257,
- 20426 - 11905: 0xBFA1,
- 20427 - 11905: 0x8258,
- 20428 - 11905: 0x8259,
- 20429 - 11905: 0x825A,
- 20430 - 11905: 0xD9DE,
- 20431 - 11905: 0xC7CE,
- 20432 - 11905: 0xC0FE,
- 20433 - 11905: 0xD9B8,
- 20434 - 11905: 0x825B,
- 20435 - 11905: 0x825C,
- 20436 - 11905: 0x825D,
- 20437 - 11905: 0x825E,
- 20438 - 11905: 0x825F,
- 20439 - 11905: 0xCBD7,
- 20440 - 11905: 0xB7FD,
- 20441 - 11905: 0x8260,
- 20442 - 11905: 0xD9B5,
- 20443 - 11905: 0x8261,
- 20444 - 11905: 0xD9B7,
- 20445 - 11905: 0xB1A3,
- 20446 - 11905: 0xD3E1,
- 20447 - 11905: 0xD9B9,
- 20448 - 11905: 0x8262,
- 20449 - 11905: 0xD0C5,
- 20450 - 11905: 0x8263,
- 20451 - 11905: 0xD9B6,
- 20452 - 11905: 0x8264,
- 20453 - 11905: 0x8265,
- 20454 - 11905: 0xD9B1,
- 20455 - 11905: 0x8266,
- 20456 - 11905: 0xD9B2,
- 20457 - 11905: 0xC1A9,
- 20458 - 11905: 0xD9B3,
- 20459 - 11905: 0x8267,
- 20460 - 11905: 0x8268,
- 20461 - 11905: 0xBCF3,
- 20462 - 11905: 0xD0DE,
- 20463 - 11905: 0xB8A9,
- 20464 - 11905: 0x8269,
- 20465 - 11905: 0xBEE3,
- 20466 - 11905: 0x826A,
- 20467 - 11905: 0xD9BD,
- 20468 - 11905: 0x826B,
- 20469 - 11905: 0x826C,
- 20470 - 11905: 0x826D,
- 20471 - 11905: 0x826E,
- 20472 - 11905: 0xD9BA,
- 20473 - 11905: 0x826F,
- 20474 - 11905: 0xB0B3,
- 20475 - 11905: 0x8270,
- 20476 - 11905: 0x8271,
- 20477 - 11905: 0x8272,
- 20478 - 11905: 0xD9C2,
- 20479 - 11905: 0x8273,
- 20480 - 11905: 0x8274,
- 20481 - 11905: 0x8275,
- 20482 - 11905: 0x8276,
- 20483 - 11905: 0x8277,
- 20484 - 11905: 0x8278,
- 20485 - 11905: 0x8279,
- 20486 - 11905: 0x827A,
- 20487 - 11905: 0x827B,
- 20488 - 11905: 0x827C,
- 20489 - 11905: 0x827D,
- 20490 - 11905: 0x827E,
- 20491 - 11905: 0x8280,
- 20492 - 11905: 0xD9C4,
- 20493 - 11905: 0xB1B6,
- 20494 - 11905: 0x8281,
- 20495 - 11905: 0xD9BF,
- 20496 - 11905: 0x8282,
- 20497 - 11905: 0x8283,
- 20498 - 11905: 0xB5B9,
- 20499 - 11905: 0x8284,
- 20500 - 11905: 0xBEF3,
- 20501 - 11905: 0x8285,
- 20502 - 11905: 0x8286,
- 20503 - 11905: 0x8287,
- 20504 - 11905: 0xCCC8,
- 20505 - 11905: 0xBAF2,
- 20506 - 11905: 0xD2D0,
- 20507 - 11905: 0x8288,
- 20508 - 11905: 0xD9C3,
- 20509 - 11905: 0x8289,
- 20510 - 11905: 0x828A,
- 20511 - 11905: 0xBDE8,
- 20512 - 11905: 0x828B,
- 20513 - 11905: 0xB3AB,
- 20514 - 11905: 0x828C,
- 20515 - 11905: 0x828D,
- 20516 - 11905: 0x828E,
- 20517 - 11905: 0xD9C5,
- 20518 - 11905: 0xBEEB,
- 20519 - 11905: 0x828F,
- 20520 - 11905: 0xD9C6,
- 20521 - 11905: 0xD9BB,
- 20522 - 11905: 0xC4DF,
- 20523 - 11905: 0x8290,
- 20524 - 11905: 0xD9BE,
- 20525 - 11905: 0xD9C1,
- 20526 - 11905: 0xD9C0,
- 20527 - 11905: 0x8291,
- 20528 - 11905: 0x8292,
- 20529 - 11905: 0x8293,
- 20530 - 11905: 0x8294,
- 20531 - 11905: 0x8295,
- 20532 - 11905: 0x8296,
- 20533 - 11905: 0x8297,
- 20534 - 11905: 0x8298,
- 20535 - 11905: 0x8299,
- 20536 - 11905: 0x829A,
- 20537 - 11905: 0x829B,
- 20538 - 11905: 0xD5AE,
- 20539 - 11905: 0x829C,
- 20540 - 11905: 0xD6B5,
- 20541 - 11905: 0x829D,
- 20542 - 11905: 0xC7E3,
- 20543 - 11905: 0x829E,
- 20544 - 11905: 0x829F,
- 20545 - 11905: 0x82A0,
- 20546 - 11905: 0x82A1,
- 20547 - 11905: 0xD9C8,
- 20548 - 11905: 0x82A2,
- 20549 - 11905: 0x82A3,
- 20550 - 11905: 0x82A4,
- 20551 - 11905: 0xBCD9,
- 20552 - 11905: 0xD9CA,
- 20553 - 11905: 0x82A5,
- 20554 - 11905: 0x82A6,
- 20555 - 11905: 0x82A7,
- 20556 - 11905: 0xD9BC,
- 20557 - 11905: 0x82A8,
- 20558 - 11905: 0xD9CB,
- 20559 - 11905: 0xC6AB,
- 20560 - 11905: 0x82A9,
- 20561 - 11905: 0x82AA,
- 20562 - 11905: 0x82AB,
- 20563 - 11905: 0x82AC,
- 20564 - 11905: 0x82AD,
- 20565 - 11905: 0xD9C9,
- 20566 - 11905: 0x82AE,
- 20567 - 11905: 0x82AF,
- 20568 - 11905: 0x82B0,
- 20569 - 11905: 0x82B1,
- 20570 - 11905: 0xD7F6,
- 20571 - 11905: 0x82B2,
- 20572 - 11905: 0xCDA3,
- 20573 - 11905: 0x82B3,
- 20574 - 11905: 0x82B4,
- 20575 - 11905: 0x82B5,
- 20576 - 11905: 0x82B6,
- 20577 - 11905: 0x82B7,
- 20578 - 11905: 0x82B8,
- 20579 - 11905: 0x82B9,
- 20580 - 11905: 0x82BA,
- 20581 - 11905: 0xBDA1,
- 20582 - 11905: 0x82BB,
- 20583 - 11905: 0x82BC,
- 20584 - 11905: 0x82BD,
- 20585 - 11905: 0x82BE,
- 20586 - 11905: 0x82BF,
- 20587 - 11905: 0x82C0,
- 20588 - 11905: 0xD9CC,
- 20589 - 11905: 0x82C1,
- 20590 - 11905: 0x82C2,
- 20591 - 11905: 0x82C3,
- 20592 - 11905: 0x82C4,
- 20593 - 11905: 0x82C5,
- 20594 - 11905: 0x82C6,
- 20595 - 11905: 0x82C7,
- 20596 - 11905: 0x82C8,
- 20597 - 11905: 0x82C9,
- 20598 - 11905: 0xC5BC,
- 20599 - 11905: 0xCDB5,
- 20600 - 11905: 0x82CA,
- 20601 - 11905: 0x82CB,
- 20602 - 11905: 0x82CC,
- 20603 - 11905: 0xD9CD,
- 20604 - 11905: 0x82CD,
- 20605 - 11905: 0x82CE,
- 20606 - 11905: 0xD9C7,
- 20607 - 11905: 0xB3A5,
- 20608 - 11905: 0xBFFE,
- 20609 - 11905: 0x82CF,
- 20610 - 11905: 0x82D0,
- 20611 - 11905: 0x82D1,
- 20612 - 11905: 0x82D2,
- 20613 - 11905: 0xB8B5,
- 20614 - 11905: 0x82D3,
- 20615 - 11905: 0x82D4,
- 20616 - 11905: 0xC0FC,
- 20617 - 11905: 0x82D5,
- 20618 - 11905: 0x82D6,
- 20619 - 11905: 0x82D7,
- 20620 - 11905: 0x82D8,
- 20621 - 11905: 0xB0F8,
- 20622 - 11905: 0x82D9,
- 20623 - 11905: 0x82DA,
- 20624 - 11905: 0x82DB,
- 20625 - 11905: 0x82DC,
- 20626 - 11905: 0x82DD,
- 20627 - 11905: 0x82DE,
- 20628 - 11905: 0x82DF,
- 20629 - 11905: 0x82E0,
- 20630 - 11905: 0x82E1,
- 20631 - 11905: 0x82E2,
- 20632 - 11905: 0x82E3,
- 20633 - 11905: 0x82E4,
- 20634 - 11905: 0x82E5,
- 20635 - 11905: 0x82E6,
- 20636 - 11905: 0x82E7,
- 20637 - 11905: 0x82E8,
- 20638 - 11905: 0x82E9,
- 20639 - 11905: 0x82EA,
- 20640 - 11905: 0x82EB,
- 20641 - 11905: 0x82EC,
- 20642 - 11905: 0x82ED,
- 20643 - 11905: 0xB4F6,
- 20644 - 11905: 0x82EE,
- 20645 - 11905: 0xD9CE,
- 20646 - 11905: 0x82EF,
- 20647 - 11905: 0xD9CF,
- 20648 - 11905: 0xB4A2,
- 20649 - 11905: 0xD9D0,
- 20650 - 11905: 0x82F0,
- 20651 - 11905: 0x82F1,
- 20652 - 11905: 0xB4DF,
- 20653 - 11905: 0x82F2,
- 20654 - 11905: 0x82F3,
- 20655 - 11905: 0x82F4,
- 20656 - 11905: 0x82F5,
- 20657 - 11905: 0x82F6,
- 20658 - 11905: 0xB0C1,
- 20659 - 11905: 0x82F7,
- 20660 - 11905: 0x82F8,
- 20661 - 11905: 0x82F9,
- 20662 - 11905: 0x82FA,
- 20663 - 11905: 0x82FB,
- 20664 - 11905: 0x82FC,
- 20665 - 11905: 0x82FD,
- 20666 - 11905: 0xD9D1,
- 20667 - 11905: 0xC9B5,
- 20668 - 11905: 0x82FE,
- 20669 - 11905: 0x8340,
- 20670 - 11905: 0x8341,
- 20671 - 11905: 0x8342,
- 20672 - 11905: 0x8343,
- 20673 - 11905: 0x8344,
- 20674 - 11905: 0x8345,
- 20675 - 11905: 0x8346,
- 20676 - 11905: 0x8347,
- 20677 - 11905: 0x8348,
- 20678 - 11905: 0x8349,
- 20679 - 11905: 0x834A,
- 20680 - 11905: 0x834B,
- 20681 - 11905: 0x834C,
- 20682 - 11905: 0x834D,
- 20683 - 11905: 0x834E,
- 20684 - 11905: 0x834F,
- 20685 - 11905: 0x8350,
- 20686 - 11905: 0x8351,
- 20687 - 11905: 0xCFF1,
- 20688 - 11905: 0x8352,
- 20689 - 11905: 0x8353,
- 20690 - 11905: 0x8354,
- 20691 - 11905: 0x8355,
- 20692 - 11905: 0x8356,
- 20693 - 11905: 0x8357,
- 20694 - 11905: 0xD9D2,
- 20695 - 11905: 0x8358,
- 20696 - 11905: 0x8359,
- 20697 - 11905: 0x835A,
- 20698 - 11905: 0xC1C5,
- 20699 - 11905: 0x835B,
- 20700 - 11905: 0x835C,
- 20701 - 11905: 0x835D,
- 20702 - 11905: 0x835E,
- 20703 - 11905: 0x835F,
- 20704 - 11905: 0x8360,
- 20705 - 11905: 0x8361,
- 20706 - 11905: 0x8362,
- 20707 - 11905: 0x8363,
- 20708 - 11905: 0x8364,
- 20709 - 11905: 0x8365,
- 20710 - 11905: 0xD9D6,
- 20711 - 11905: 0xC9AE,
- 20712 - 11905: 0x8366,
- 20713 - 11905: 0x8367,
- 20714 - 11905: 0x8368,
- 20715 - 11905: 0x8369,
- 20716 - 11905: 0xD9D5,
- 20717 - 11905: 0xD9D4,
- 20718 - 11905: 0xD9D7,
- 20719 - 11905: 0x836A,
- 20720 - 11905: 0x836B,
- 20721 - 11905: 0x836C,
- 20722 - 11905: 0x836D,
- 20723 - 11905: 0xCBDB,
- 20724 - 11905: 0x836E,
- 20725 - 11905: 0xBDA9,
- 20726 - 11905: 0x836F,
- 20727 - 11905: 0x8370,
- 20728 - 11905: 0x8371,
- 20729 - 11905: 0x8372,
- 20730 - 11905: 0x8373,
- 20731 - 11905: 0xC6A7,
- 20732 - 11905: 0x8374,
- 20733 - 11905: 0x8375,
- 20734 - 11905: 0x8376,
- 20735 - 11905: 0x8377,
- 20736 - 11905: 0x8378,
- 20737 - 11905: 0x8379,
- 20738 - 11905: 0x837A,
- 20739 - 11905: 0x837B,
- 20740 - 11905: 0x837C,
- 20741 - 11905: 0x837D,
- 20742 - 11905: 0xD9D3,
- 20743 - 11905: 0xD9D8,
- 20744 - 11905: 0x837E,
- 20745 - 11905: 0x8380,
- 20746 - 11905: 0x8381,
- 20747 - 11905: 0xD9D9,
- 20748 - 11905: 0x8382,
- 20749 - 11905: 0x8383,
- 20750 - 11905: 0x8384,
- 20751 - 11905: 0x8385,
- 20752 - 11905: 0x8386,
- 20753 - 11905: 0x8387,
- 20754 - 11905: 0xC8E5,
- 20755 - 11905: 0x8388,
- 20756 - 11905: 0x8389,
- 20757 - 11905: 0x838A,
- 20758 - 11905: 0x838B,
- 20759 - 11905: 0x838C,
- 20760 - 11905: 0x838D,
- 20761 - 11905: 0x838E,
- 20762 - 11905: 0x838F,
- 20763 - 11905: 0x8390,
- 20764 - 11905: 0x8391,
- 20765 - 11905: 0x8392,
- 20766 - 11905: 0x8393,
- 20767 - 11905: 0x8394,
- 20768 - 11905: 0x8395,
- 20769 - 11905: 0xC0DC,
- 20770 - 11905: 0x8396,
- 20771 - 11905: 0x8397,
- 20772 - 11905: 0x8398,
- 20773 - 11905: 0x8399,
- 20774 - 11905: 0x839A,
- 20775 - 11905: 0x839B,
- 20776 - 11905: 0x839C,
- 20777 - 11905: 0x839D,
- 20778 - 11905: 0x839E,
- 20779 - 11905: 0x839F,
- 20780 - 11905: 0x83A0,
- 20781 - 11905: 0x83A1,
- 20782 - 11905: 0x83A2,
- 20783 - 11905: 0x83A3,
- 20784 - 11905: 0x83A4,
- 20785 - 11905: 0x83A5,
- 20786 - 11905: 0x83A6,
- 20787 - 11905: 0x83A7,
- 20788 - 11905: 0x83A8,
- 20789 - 11905: 0x83A9,
- 20790 - 11905: 0x83AA,
- 20791 - 11905: 0x83AB,
- 20792 - 11905: 0x83AC,
- 20793 - 11905: 0x83AD,
- 20794 - 11905: 0x83AE,
- 20795 - 11905: 0x83AF,
- 20796 - 11905: 0x83B0,
- 20797 - 11905: 0x83B1,
- 20798 - 11905: 0x83B2,
- 20799 - 11905: 0xB6F9,
- 20800 - 11905: 0xD8A3,
- 20801 - 11905: 0xD4CA,
- 20802 - 11905: 0x83B3,
- 20803 - 11905: 0xD4AA,
- 20804 - 11905: 0xD0D6,
- 20805 - 11905: 0xB3E4,
- 20806 - 11905: 0xD5D7,
- 20807 - 11905: 0x83B4,
- 20808 - 11905: 0xCFC8,
- 20809 - 11905: 0xB9E2,
- 20810 - 11905: 0x83B5,
- 20811 - 11905: 0xBFCB,
- 20812 - 11905: 0x83B6,
- 20813 - 11905: 0xC3E2,
- 20814 - 11905: 0x83B7,
- 20815 - 11905: 0x83B8,
- 20816 - 11905: 0x83B9,
- 20817 - 11905: 0xB6D2,
- 20818 - 11905: 0x83BA,
- 20819 - 11905: 0x83BB,
- 20820 - 11905: 0xCDC3,
- 20821 - 11905: 0xD9EE,
- 20822 - 11905: 0xD9F0,
- 20823 - 11905: 0x83BC,
- 20824 - 11905: 0x83BD,
- 20825 - 11905: 0x83BE,
- 20826 - 11905: 0xB5B3,
- 20827 - 11905: 0x83BF,
- 20828 - 11905: 0xB6B5,
- 20829 - 11905: 0x83C0,
- 20830 - 11905: 0x83C1,
- 20831 - 11905: 0x83C2,
- 20832 - 11905: 0x83C3,
- 20833 - 11905: 0x83C4,
- 20834 - 11905: 0xBEA4,
- 20835 - 11905: 0x83C5,
- 20836 - 11905: 0x83C6,
- 20837 - 11905: 0xC8EB,
- 20838 - 11905: 0x83C7,
- 20839 - 11905: 0x83C8,
- 20840 - 11905: 0xC8AB,
- 20841 - 11905: 0x83C9,
- 20842 - 11905: 0x83CA,
- 20843 - 11905: 0xB0CB,
- 20844 - 11905: 0xB9AB,
- 20845 - 11905: 0xC1F9,
- 20846 - 11905: 0xD9E2,
- 20847 - 11905: 0x83CB,
- 20848 - 11905: 0xC0BC,
- 20849 - 11905: 0xB9B2,
- 20850 - 11905: 0x83CC,
- 20851 - 11905: 0xB9D8,
- 20852 - 11905: 0xD0CB,
- 20853 - 11905: 0xB1F8,
- 20854 - 11905: 0xC6E4,
- 20855 - 11905: 0xBEDF,
- 20856 - 11905: 0xB5E4,
- 20857 - 11905: 0xD7C8,
- 20858 - 11905: 0x83CD,
- 20859 - 11905: 0xD1F8,
- 20860 - 11905: 0xBCE6,
- 20861 - 11905: 0xCADE,
- 20862 - 11905: 0x83CE,
- 20863 - 11905: 0x83CF,
- 20864 - 11905: 0xBCBD,
- 20865 - 11905: 0xD9E6,
- 20866 - 11905: 0xD8E7,
- 20867 - 11905: 0x83D0,
- 20868 - 11905: 0x83D1,
- 20869 - 11905: 0xC4DA,
- 20870 - 11905: 0x83D2,
- 20871 - 11905: 0x83D3,
- 20872 - 11905: 0xB8D4,
- 20873 - 11905: 0xC8BD,
- 20874 - 11905: 0x83D4,
- 20875 - 11905: 0x83D5,
- 20876 - 11905: 0xB2E1,
- 20877 - 11905: 0xD4D9,
- 20878 - 11905: 0x83D6,
- 20879 - 11905: 0x83D7,
- 20880 - 11905: 0x83D8,
- 20881 - 11905: 0x83D9,
- 20882 - 11905: 0xC3B0,
- 20883 - 11905: 0x83DA,
- 20884 - 11905: 0x83DB,
- 20885 - 11905: 0xC3E1,
- 20886 - 11905: 0xDAA2,
- 20887 - 11905: 0xC8DF,
- 20888 - 11905: 0x83DC,
- 20889 - 11905: 0xD0B4,
- 20890 - 11905: 0x83DD,
- 20891 - 11905: 0xBEFC,
- 20892 - 11905: 0xC5A9,
- 20893 - 11905: 0x83DE,
- 20894 - 11905: 0x83DF,
- 20895 - 11905: 0x83E0,
- 20896 - 11905: 0xB9DA,
- 20897 - 11905: 0x83E1,
- 20898 - 11905: 0xDAA3,
- 20899 - 11905: 0x83E2,
- 20900 - 11905: 0xD4A9,
- 20901 - 11905: 0xDAA4,
- 20902 - 11905: 0x83E3,
- 20903 - 11905: 0x83E4,
- 20904 - 11905: 0x83E5,
- 20905 - 11905: 0x83E6,
- 20906 - 11905: 0x83E7,
- 20907 - 11905: 0xD9FB,
- 20908 - 11905: 0xB6AC,
- 20909 - 11905: 0x83E8,
- 20910 - 11905: 0x83E9,
- 20911 - 11905: 0xB7EB,
- 20912 - 11905: 0xB1F9,
- 20913 - 11905: 0xD9FC,
- 20914 - 11905: 0xB3E5,
- 20915 - 11905: 0xBEF6,
- 20916 - 11905: 0x83EA,
- 20917 - 11905: 0xBFF6,
- 20918 - 11905: 0xD2B1,
- 20919 - 11905: 0xC0E4,
- 20920 - 11905: 0x83EB,
- 20921 - 11905: 0x83EC,
- 20922 - 11905: 0x83ED,
- 20923 - 11905: 0xB6B3,
- 20924 - 11905: 0xD9FE,
- 20925 - 11905: 0xD9FD,
- 20926 - 11905: 0x83EE,
- 20927 - 11905: 0x83EF,
- 20928 - 11905: 0xBEBB,
- 20929 - 11905: 0x83F0,
- 20930 - 11905: 0x83F1,
- 20931 - 11905: 0x83F2,
- 20932 - 11905: 0xC6E0,
- 20933 - 11905: 0x83F3,
- 20934 - 11905: 0xD7BC,
- 20935 - 11905: 0xDAA1,
- 20936 - 11905: 0x83F4,
- 20937 - 11905: 0xC1B9,
- 20938 - 11905: 0x83F5,
- 20939 - 11905: 0xB5F2,
- 20940 - 11905: 0xC1E8,
- 20941 - 11905: 0x83F6,
- 20942 - 11905: 0x83F7,
- 20943 - 11905: 0xBCF5,
- 20944 - 11905: 0x83F8,
- 20945 - 11905: 0xB4D5,
- 20946 - 11905: 0x83F9,
- 20947 - 11905: 0x83FA,
- 20948 - 11905: 0x83FB,
- 20949 - 11905: 0x83FC,
- 20950 - 11905: 0x83FD,
- 20951 - 11905: 0x83FE,
- 20952 - 11905: 0x8440,
- 20953 - 11905: 0x8441,
- 20954 - 11905: 0x8442,
- 20955 - 11905: 0xC1DD,
- 20956 - 11905: 0x8443,
- 20957 - 11905: 0xC4FD,
- 20958 - 11905: 0x8444,
- 20959 - 11905: 0x8445,
- 20960 - 11905: 0xBCB8,
- 20961 - 11905: 0xB7B2,
- 20962 - 11905: 0x8446,
- 20963 - 11905: 0x8447,
- 20964 - 11905: 0xB7EF,
- 20965 - 11905: 0x8448,
- 20966 - 11905: 0x8449,
- 20967 - 11905: 0x844A,
- 20968 - 11905: 0x844B,
- 20969 - 11905: 0x844C,
- 20970 - 11905: 0x844D,
- 20971 - 11905: 0xD9EC,
- 20972 - 11905: 0x844E,
- 20973 - 11905: 0xC6BE,
- 20974 - 11905: 0x844F,
- 20975 - 11905: 0xBFAD,
- 20976 - 11905: 0xBBCB,
- 20977 - 11905: 0x8450,
- 20978 - 11905: 0x8451,
- 20979 - 11905: 0xB5CA,
- 20980 - 11905: 0x8452,
- 20981 - 11905: 0xDBC9,
- 20982 - 11905: 0xD0D7,
- 20983 - 11905: 0x8453,
- 20984 - 11905: 0xCDB9,
- 20985 - 11905: 0xB0BC,
- 20986 - 11905: 0xB3F6,
- 20987 - 11905: 0xBBF7,
- 20988 - 11905: 0xDBCA,
- 20989 - 11905: 0xBAAF,
- 20990 - 11905: 0x8454,
- 20991 - 11905: 0xD4E4,
- 20992 - 11905: 0xB5B6,
- 20993 - 11905: 0xB5F3,
- 20994 - 11905: 0xD8D6,
- 20995 - 11905: 0xC8D0,
- 20996 - 11905: 0x8455,
- 20997 - 11905: 0x8456,
- 20998 - 11905: 0xB7D6,
- 20999 - 11905: 0xC7D0,
- 21000 - 11905: 0xD8D7,
- 21001 - 11905: 0x8457,
- 21002 - 11905: 0xBFAF,
- 21003 - 11905: 0x8458,
- 21004 - 11905: 0x8459,
- 21005 - 11905: 0xDBBB,
- 21006 - 11905: 0xD8D8,
- 21007 - 11905: 0x845A,
- 21008 - 11905: 0x845B,
- 21009 - 11905: 0xD0CC,
- 21010 - 11905: 0xBBAE,
- 21011 - 11905: 0x845C,
- 21012 - 11905: 0x845D,
- 21013 - 11905: 0x845E,
- 21014 - 11905: 0xEBBE,
- 21015 - 11905: 0xC1D0,
- 21016 - 11905: 0xC1F5,
- 21017 - 11905: 0xD4F2,
- 21018 - 11905: 0xB8D5,
- 21019 - 11905: 0xB4B4,
- 21020 - 11905: 0x845F,
- 21021 - 11905: 0xB3F5,
- 21022 - 11905: 0x8460,
- 21023 - 11905: 0x8461,
- 21024 - 11905: 0xC9BE,
- 21025 - 11905: 0x8462,
- 21026 - 11905: 0x8463,
- 21027 - 11905: 0x8464,
- 21028 - 11905: 0xC5D0,
- 21029 - 11905: 0x8465,
- 21030 - 11905: 0x8466,
- 21031 - 11905: 0x8467,
- 21032 - 11905: 0xC5D9,
- 21033 - 11905: 0xC0FB,
- 21034 - 11905: 0x8468,
- 21035 - 11905: 0xB1F0,
- 21036 - 11905: 0x8469,
- 21037 - 11905: 0xD8D9,
- 21038 - 11905: 0xB9CE,
- 21039 - 11905: 0x846A,
- 21040 - 11905: 0xB5BD,
- 21041 - 11905: 0x846B,
- 21042 - 11905: 0x846C,
- 21043 - 11905: 0xD8DA,
- 21044 - 11905: 0x846D,
- 21045 - 11905: 0x846E,
- 21046 - 11905: 0xD6C6,
- 21047 - 11905: 0xCBA2,
- 21048 - 11905: 0xC8AF,
- 21049 - 11905: 0xC9B2,
- 21050 - 11905: 0xB4CC,
- 21051 - 11905: 0xBFCC,
- 21052 - 11905: 0x846F,
- 21053 - 11905: 0xB9F4,
- 21054 - 11905: 0x8470,
- 21055 - 11905: 0xD8DB,
- 21056 - 11905: 0xD8DC,
- 21057 - 11905: 0xB6E7,
- 21058 - 11905: 0xBCC1,
- 21059 - 11905: 0xCCEA,
- 21060 - 11905: 0x8471,
- 21061 - 11905: 0x8472,
- 21062 - 11905: 0x8473,
- 21063 - 11905: 0x8474,
- 21064 - 11905: 0x8475,
- 21065 - 11905: 0x8476,
- 21066 - 11905: 0xCFF7,
- 21067 - 11905: 0x8477,
- 21068 - 11905: 0xD8DD,
- 21069 - 11905: 0xC7B0,
- 21070 - 11905: 0x8478,
- 21071 - 11905: 0x8479,
- 21072 - 11905: 0xB9D0,
- 21073 - 11905: 0xBDA3,
- 21074 - 11905: 0x847A,
- 21075 - 11905: 0x847B,
- 21076 - 11905: 0xCCDE,
- 21077 - 11905: 0x847C,
- 21078 - 11905: 0xC6CA,
- 21079 - 11905: 0x847D,
- 21080 - 11905: 0x847E,
- 21081 - 11905: 0x8480,
- 21082 - 11905: 0x8481,
- 21083 - 11905: 0x8482,
- 21084 - 11905: 0xD8E0,
- 21085 - 11905: 0x8483,
- 21086 - 11905: 0xD8DE,
- 21087 - 11905: 0x8484,
- 21088 - 11905: 0x8485,
- 21089 - 11905: 0xD8DF,
- 21090 - 11905: 0x8486,
- 21091 - 11905: 0x8487,
- 21092 - 11905: 0x8488,
- 21093 - 11905: 0xB0FE,
- 21094 - 11905: 0x8489,
- 21095 - 11905: 0xBEE7,
- 21096 - 11905: 0x848A,
- 21097 - 11905: 0xCAA3,
- 21098 - 11905: 0xBCF4,
- 21099 - 11905: 0x848B,
- 21100 - 11905: 0x848C,
- 21101 - 11905: 0x848D,
- 21102 - 11905: 0x848E,
- 21103 - 11905: 0xB8B1,
- 21104 - 11905: 0x848F,
- 21105 - 11905: 0x8490,
- 21106 - 11905: 0xB8EE,
- 21107 - 11905: 0x8491,
- 21108 - 11905: 0x8492,
- 21109 - 11905: 0x8493,
- 21110 - 11905: 0x8494,
- 21111 - 11905: 0x8495,
- 21112 - 11905: 0x8496,
- 21113 - 11905: 0x8497,
- 21114 - 11905: 0x8498,
- 21115 - 11905: 0x8499,
- 21116 - 11905: 0x849A,
- 21117 - 11905: 0xD8E2,
- 21118 - 11905: 0x849B,
- 21119 - 11905: 0xBDCB,
- 21120 - 11905: 0x849C,
- 21121 - 11905: 0xD8E4,
- 21122 - 11905: 0xD8E3,
- 21123 - 11905: 0x849D,
- 21124 - 11905: 0x849E,
- 21125 - 11905: 0x849F,
- 21126 - 11905: 0x84A0,
- 21127 - 11905: 0x84A1,
- 21128 - 11905: 0xC5FC,
- 21129 - 11905: 0x84A2,
- 21130 - 11905: 0x84A3,
- 21131 - 11905: 0x84A4,
- 21132 - 11905: 0x84A5,
- 21133 - 11905: 0x84A6,
- 21134 - 11905: 0x84A7,
- 21135 - 11905: 0x84A8,
- 21136 - 11905: 0xD8E5,
- 21137 - 11905: 0x84A9,
- 21138 - 11905: 0x84AA,
- 21139 - 11905: 0xD8E6,
- 21140 - 11905: 0x84AB,
- 21141 - 11905: 0x84AC,
- 21142 - 11905: 0x84AD,
- 21143 - 11905: 0x84AE,
- 21144 - 11905: 0x84AF,
- 21145 - 11905: 0x84B0,
- 21146 - 11905: 0x84B1,
- 21147 - 11905: 0xC1A6,
- 21148 - 11905: 0x84B2,
- 21149 - 11905: 0xC8B0,
- 21150 - 11905: 0xB0EC,
- 21151 - 11905: 0xB9A6,
- 21152 - 11905: 0xBCD3,
- 21153 - 11905: 0xCEF1,
- 21154 - 11905: 0xDBBD,
- 21155 - 11905: 0xC1D3,
- 21156 - 11905: 0x84B3,
- 21157 - 11905: 0x84B4,
- 21158 - 11905: 0x84B5,
- 21159 - 11905: 0x84B6,
- 21160 - 11905: 0xB6AF,
- 21161 - 11905: 0xD6FA,
- 21162 - 11905: 0xC5AC,
- 21163 - 11905: 0xBDD9,
- 21164 - 11905: 0xDBBE,
- 21165 - 11905: 0xDBBF,
- 21166 - 11905: 0x84B7,
- 21167 - 11905: 0x84B8,
- 21168 - 11905: 0x84B9,
- 21169 - 11905: 0xC0F8,
- 21170 - 11905: 0xBEA2,
- 21171 - 11905: 0xC0CD,
- 21172 - 11905: 0x84BA,
- 21173 - 11905: 0x84BB,
- 21174 - 11905: 0x84BC,
- 21175 - 11905: 0x84BD,
- 21176 - 11905: 0x84BE,
- 21177 - 11905: 0x84BF,
- 21178 - 11905: 0x84C0,
- 21179 - 11905: 0x84C1,
- 21180 - 11905: 0x84C2,
- 21181 - 11905: 0x84C3,
- 21182 - 11905: 0xDBC0,
- 21183 - 11905: 0xCAC6,
- 21184 - 11905: 0x84C4,
- 21185 - 11905: 0x84C5,
- 21186 - 11905: 0x84C6,
- 21187 - 11905: 0xB2AA,
- 21188 - 11905: 0x84C7,
- 21189 - 11905: 0x84C8,
- 21190 - 11905: 0x84C9,
- 21191 - 11905: 0xD3C2,
- 21192 - 11905: 0x84CA,
- 21193 - 11905: 0xC3E3,
- 21194 - 11905: 0x84CB,
- 21195 - 11905: 0xD1AB,
- 21196 - 11905: 0x84CC,
- 21197 - 11905: 0x84CD,
- 21198 - 11905: 0x84CE,
- 21199 - 11905: 0x84CF,
- 21200 - 11905: 0xDBC2,
- 21201 - 11905: 0x84D0,
- 21202 - 11905: 0xC0D5,
- 21203 - 11905: 0x84D1,
- 21204 - 11905: 0x84D2,
- 21205 - 11905: 0x84D3,
- 21206 - 11905: 0xDBC3,
- 21207 - 11905: 0x84D4,
- 21208 - 11905: 0xBFB1,
- 21209 - 11905: 0x84D5,
- 21210 - 11905: 0x84D6,
- 21211 - 11905: 0x84D7,
- 21212 - 11905: 0x84D8,
- 21213 - 11905: 0x84D9,
- 21214 - 11905: 0x84DA,
- 21215 - 11905: 0xC4BC,
- 21216 - 11905: 0x84DB,
- 21217 - 11905: 0x84DC,
- 21218 - 11905: 0x84DD,
- 21219 - 11905: 0x84DE,
- 21220 - 11905: 0xC7DA,
- 21221 - 11905: 0x84DF,
- 21222 - 11905: 0x84E0,
- 21223 - 11905: 0x84E1,
- 21224 - 11905: 0x84E2,
- 21225 - 11905: 0x84E3,
- 21226 - 11905: 0x84E4,
- 21227 - 11905: 0x84E5,
- 21228 - 11905: 0x84E6,
- 21229 - 11905: 0x84E7,
- 21230 - 11905: 0x84E8,
- 21231 - 11905: 0x84E9,
- 21232 - 11905: 0xDBC4,
- 21233 - 11905: 0x84EA,
- 21234 - 11905: 0x84EB,
- 21235 - 11905: 0x84EC,
- 21236 - 11905: 0x84ED,
- 21237 - 11905: 0x84EE,
- 21238 - 11905: 0x84EF,
- 21239 - 11905: 0x84F0,
- 21240 - 11905: 0x84F1,
- 21241 - 11905: 0xD9E8,
- 21242 - 11905: 0xC9D7,
- 21243 - 11905: 0x84F2,
- 21244 - 11905: 0x84F3,
- 21245 - 11905: 0x84F4,
- 21246 - 11905: 0xB9B4,
- 21247 - 11905: 0xCEF0,
- 21248 - 11905: 0xD4C8,
- 21249 - 11905: 0x84F5,
- 21250 - 11905: 0x84F6,
- 21251 - 11905: 0x84F7,
- 21252 - 11905: 0x84F8,
- 21253 - 11905: 0xB0FC,
- 21254 - 11905: 0xB4D2,
- 21255 - 11905: 0x84F9,
- 21256 - 11905: 0xD0D9,
- 21257 - 11905: 0x84FA,
- 21258 - 11905: 0x84FB,
- 21259 - 11905: 0x84FC,
- 21260 - 11905: 0x84FD,
- 21261 - 11905: 0xD9E9,
- 21262 - 11905: 0x84FE,
- 21263 - 11905: 0xDECB,
- 21264 - 11905: 0xD9EB,
- 21265 - 11905: 0x8540,
- 21266 - 11905: 0x8541,
- 21267 - 11905: 0x8542,
- 21268 - 11905: 0x8543,
- 21269 - 11905: 0xD8B0,
- 21270 - 11905: 0xBBAF,
- 21271 - 11905: 0xB1B1,
- 21272 - 11905: 0x8544,
- 21273 - 11905: 0xB3D7,
- 21274 - 11905: 0xD8CE,
- 21275 - 11905: 0x8545,
- 21276 - 11905: 0x8546,
- 21277 - 11905: 0xD4D1,
- 21278 - 11905: 0x8547,
- 21279 - 11905: 0x8548,
- 21280 - 11905: 0xBDB3,
- 21281 - 11905: 0xBFEF,
- 21282 - 11905: 0x8549,
- 21283 - 11905: 0xCFBB,
- 21284 - 11905: 0x854A,
- 21285 - 11905: 0x854B,
- 21286 - 11905: 0xD8D0,
- 21287 - 11905: 0x854C,
- 21288 - 11905: 0x854D,
- 21289 - 11905: 0x854E,
- 21290 - 11905: 0xB7CB,
- 21291 - 11905: 0x854F,
- 21292 - 11905: 0x8550,
- 21293 - 11905: 0x8551,
- 21294 - 11905: 0xD8D1,
- 21295 - 11905: 0x8552,
- 21296 - 11905: 0x8553,
- 21297 - 11905: 0x8554,
- 21298 - 11905: 0x8555,
- 21299 - 11905: 0x8556,
- 21300 - 11905: 0x8557,
- 21301 - 11905: 0x8558,
- 21302 - 11905: 0x8559,
- 21303 - 11905: 0x855A,
- 21304 - 11905: 0x855B,
- 21305 - 11905: 0xC6A5,
- 21306 - 11905: 0xC7F8,
- 21307 - 11905: 0xD2BD,
- 21308 - 11905: 0x855C,
- 21309 - 11905: 0x855D,
- 21310 - 11905: 0xD8D2,
- 21311 - 11905: 0xC4E4,
- 21312 - 11905: 0x855E,
- 21313 - 11905: 0xCAAE,
- 21314 - 11905: 0x855F,
- 21315 - 11905: 0xC7A7,
- 21316 - 11905: 0x8560,
- 21317 - 11905: 0xD8A6,
- 21318 - 11905: 0x8561,
- 21319 - 11905: 0xC9FD,
- 21320 - 11905: 0xCEE7,
- 21321 - 11905: 0xBBDC,
- 21322 - 11905: 0xB0EB,
- 21323 - 11905: 0x8562,
- 21324 - 11905: 0x8563,
- 21325 - 11905: 0x8564,
- 21326 - 11905: 0xBBAA,
- 21327 - 11905: 0xD0AD,
- 21328 - 11905: 0x8565,
- 21329 - 11905: 0xB1B0,
- 21330 - 11905: 0xD7E4,
- 21331 - 11905: 0xD7BF,
- 21332 - 11905: 0x8566,
- 21333 - 11905: 0xB5A5,
- 21334 - 11905: 0xC2F4,
- 21335 - 11905: 0xC4CF,
- 21336 - 11905: 0x8567,
- 21337 - 11905: 0x8568,
- 21338 - 11905: 0xB2A9,
- 21339 - 11905: 0x8569,
- 21340 - 11905: 0xB2B7,
- 21341 - 11905: 0x856A,
- 21342 - 11905: 0xB1E5,
- 21343 - 11905: 0xDFB2,
- 21344 - 11905: 0xD5BC,
- 21345 - 11905: 0xBFA8,
- 21346 - 11905: 0xC2AC,
- 21347 - 11905: 0xD8D5,
- 21348 - 11905: 0xC2B1,
- 21349 - 11905: 0x856B,
- 21350 - 11905: 0xD8D4,
- 21351 - 11905: 0xCED4,
- 21352 - 11905: 0x856C,
- 21353 - 11905: 0xDAE0,
- 21354 - 11905: 0x856D,
- 21355 - 11905: 0xCEC0,
- 21356 - 11905: 0x856E,
- 21357 - 11905: 0x856F,
- 21358 - 11905: 0xD8B4,
- 21359 - 11905: 0xC3AE,
- 21360 - 11905: 0xD3A1,
- 21361 - 11905: 0xCEA3,
- 21362 - 11905: 0x8570,
- 21363 - 11905: 0xBCB4,
- 21364 - 11905: 0xC8B4,
- 21365 - 11905: 0xC2D1,
- 21366 - 11905: 0x8571,
- 21367 - 11905: 0xBEED,
- 21368 - 11905: 0xD0B6,
- 21369 - 11905: 0x8572,
- 21370 - 11905: 0xDAE1,
- 21371 - 11905: 0x8573,
- 21372 - 11905: 0x8574,
- 21373 - 11905: 0x8575,
- 21374 - 11905: 0x8576,
- 21375 - 11905: 0xC7E4,
- 21376 - 11905: 0x8577,
- 21377 - 11905: 0x8578,
- 21378 - 11905: 0xB3A7,
- 21379 - 11905: 0x8579,
- 21380 - 11905: 0xB6F2,
- 21381 - 11905: 0xCCFC,
- 21382 - 11905: 0xC0FA,
- 21383 - 11905: 0x857A,
- 21384 - 11905: 0x857B,
- 21385 - 11905: 0xC0F7,
- 21386 - 11905: 0x857C,
- 21387 - 11905: 0xD1B9,
- 21388 - 11905: 0xD1E1,
- 21389 - 11905: 0xD8C7,
- 21390 - 11905: 0x857D,
- 21391 - 11905: 0x857E,
- 21392 - 11905: 0x8580,
- 21393 - 11905: 0x8581,
- 21394 - 11905: 0x8582,
- 21395 - 11905: 0x8583,
- 21396 - 11905: 0x8584,
- 21397 - 11905: 0xB2DE,
- 21398 - 11905: 0x8585,
- 21399 - 11905: 0x8586,
- 21400 - 11905: 0xC0E5,
- 21401 - 11905: 0x8587,
- 21402 - 11905: 0xBAF1,
- 21403 - 11905: 0x8588,
- 21404 - 11905: 0x8589,
- 21405 - 11905: 0xD8C8,
- 21406 - 11905: 0x858A,
- 21407 - 11905: 0xD4AD,
- 21408 - 11905: 0x858B,
- 21409 - 11905: 0x858C,
- 21410 - 11905: 0xCFE1,
- 21411 - 11905: 0xD8C9,
- 21412 - 11905: 0x858D,
- 21413 - 11905: 0xD8CA,
- 21414 - 11905: 0xCFC3,
- 21415 - 11905: 0x858E,
- 21416 - 11905: 0xB3F8,
- 21417 - 11905: 0xBEC7,
- 21418 - 11905: 0x858F,
- 21419 - 11905: 0x8590,
- 21420 - 11905: 0x8591,
- 21421 - 11905: 0x8592,
- 21422 - 11905: 0xD8CB,
- 21423 - 11905: 0x8593,
- 21424 - 11905: 0x8594,
- 21425 - 11905: 0x8595,
- 21426 - 11905: 0x8596,
- 21427 - 11905: 0x8597,
- 21428 - 11905: 0x8598,
- 21429 - 11905: 0x8599,
- 21430 - 11905: 0xDBCC,
- 21431 - 11905: 0x859A,
- 21432 - 11905: 0x859B,
- 21433 - 11905: 0x859C,
- 21434 - 11905: 0x859D,
- 21435 - 11905: 0xC8A5,
- 21436 - 11905: 0x859E,
- 21437 - 11905: 0x859F,
- 21438 - 11905: 0x85A0,
- 21439 - 11905: 0xCFD8,
- 21440 - 11905: 0x85A1,
- 21441 - 11905: 0xC8FE,
- 21442 - 11905: 0xB2CE,
- 21443 - 11905: 0x85A2,
- 21444 - 11905: 0x85A3,
- 21445 - 11905: 0x85A4,
- 21446 - 11905: 0x85A5,
- 21447 - 11905: 0x85A6,
- 21448 - 11905: 0xD3D6,
- 21449 - 11905: 0xB2E6,
- 21450 - 11905: 0xBCB0,
- 21451 - 11905: 0xD3D1,
- 21452 - 11905: 0xCBAB,
- 21453 - 11905: 0xB7B4,
- 21454 - 11905: 0x85A7,
- 21455 - 11905: 0x85A8,
- 21456 - 11905: 0x85A9,
- 21457 - 11905: 0xB7A2,
- 21458 - 11905: 0x85AA,
- 21459 - 11905: 0x85AB,
- 21460 - 11905: 0xCAE5,
- 21461 - 11905: 0x85AC,
- 21462 - 11905: 0xC8A1,
- 21463 - 11905: 0xCADC,
- 21464 - 11905: 0xB1E4,
- 21465 - 11905: 0xD0F0,
- 21466 - 11905: 0x85AD,
- 21467 - 11905: 0xC5D1,
- 21468 - 11905: 0x85AE,
- 21469 - 11905: 0x85AF,
- 21470 - 11905: 0x85B0,
- 21471 - 11905: 0xDBC5,
- 21472 - 11905: 0xB5FE,
- 21473 - 11905: 0x85B1,
- 21474 - 11905: 0x85B2,
- 21475 - 11905: 0xBFDA,
- 21476 - 11905: 0xB9C5,
- 21477 - 11905: 0xBEE4,
- 21478 - 11905: 0xC1ED,
- 21479 - 11905: 0x85B3,
- 21480 - 11905: 0xDFB6,
- 21481 - 11905: 0xDFB5,
- 21482 - 11905: 0xD6BB,
- 21483 - 11905: 0xBDD0,
- 21484 - 11905: 0xD5D9,
- 21485 - 11905: 0xB0C8,
- 21486 - 11905: 0xB6A3,
- 21487 - 11905: 0xBFC9,
- 21488 - 11905: 0xCCA8,
- 21489 - 11905: 0xDFB3,
- 21490 - 11905: 0xCAB7,
- 21491 - 11905: 0xD3D2,
- 21492 - 11905: 0x85B4,
- 21493 - 11905: 0xD8CF,
- 21494 - 11905: 0xD2B6,
- 21495 - 11905: 0xBAC5,
- 21496 - 11905: 0xCBBE,
- 21497 - 11905: 0xCCBE,
- 21498 - 11905: 0x85B5,
- 21499 - 11905: 0xDFB7,
- 21500 - 11905: 0xB5F0,
- 21501 - 11905: 0xDFB4,
- 21502 - 11905: 0x85B6,
- 21503 - 11905: 0x85B7,
- 21504 - 11905: 0x85B8,
- 21505 - 11905: 0xD3F5,
- 21506 - 11905: 0x85B9,
- 21507 - 11905: 0xB3D4,
- 21508 - 11905: 0xB8F7,
- 21509 - 11905: 0x85BA,
- 21510 - 11905: 0xDFBA,
- 21511 - 11905: 0x85BB,
- 21512 - 11905: 0xBACF,
- 21513 - 11905: 0xBCAA,
- 21514 - 11905: 0xB5F5,
- 21515 - 11905: 0x85BC,
- 21516 - 11905: 0xCDAC,
- 21517 - 11905: 0xC3FB,
- 21518 - 11905: 0xBAF3,
- 21519 - 11905: 0xC0F4,
- 21520 - 11905: 0xCDC2,
- 21521 - 11905: 0xCFF2,
- 21522 - 11905: 0xDFB8,
- 21523 - 11905: 0xCFC5,
- 21524 - 11905: 0x85BD,
- 21525 - 11905: 0xC2C0,
- 21526 - 11905: 0xDFB9,
- 21527 - 11905: 0xC2F0,
- 21528 - 11905: 0x85BE,
- 21529 - 11905: 0x85BF,
- 21530 - 11905: 0x85C0,
- 21531 - 11905: 0xBEFD,
- 21532 - 11905: 0x85C1,
- 21533 - 11905: 0xC1DF,
- 21534 - 11905: 0xCDCC,
- 21535 - 11905: 0xD2F7,
- 21536 - 11905: 0xB7CD,
- 21537 - 11905: 0xDFC1,
- 21538 - 11905: 0x85C2,
- 21539 - 11905: 0xDFC4,
- 21540 - 11905: 0x85C3,
- 21541 - 11905: 0x85C4,
- 21542 - 11905: 0xB7F1,
- 21543 - 11905: 0xB0C9,
- 21544 - 11905: 0xB6D6,
- 21545 - 11905: 0xB7D4,
- 21546 - 11905: 0x85C5,
- 21547 - 11905: 0xBAAC,
- 21548 - 11905: 0xCCFD,
- 21549 - 11905: 0xBFD4,
- 21550 - 11905: 0xCBB1,
- 21551 - 11905: 0xC6F4,
- 21552 - 11905: 0x85C6,
- 21553 - 11905: 0xD6A8,
- 21554 - 11905: 0xDFC5,
- 21555 - 11905: 0x85C7,
- 21556 - 11905: 0xCEE2,
- 21557 - 11905: 0xB3B3,
- 21558 - 11905: 0x85C8,
- 21559 - 11905: 0x85C9,
- 21560 - 11905: 0xCEFC,
- 21561 - 11905: 0xB4B5,
- 21562 - 11905: 0x85CA,
- 21563 - 11905: 0xCEC7,
- 21564 - 11905: 0xBAF0,
- 21565 - 11905: 0x85CB,
- 21566 - 11905: 0xCEE1,
- 21567 - 11905: 0x85CC,
- 21568 - 11905: 0xD1BD,
- 21569 - 11905: 0x85CD,
- 21570 - 11905: 0x85CE,
- 21571 - 11905: 0xDFC0,
- 21572 - 11905: 0x85CF,
- 21573 - 11905: 0x85D0,
- 21574 - 11905: 0xB4F4,
- 21575 - 11905: 0x85D1,
- 21576 - 11905: 0xB3CA,
- 21577 - 11905: 0x85D2,
- 21578 - 11905: 0xB8E6,
- 21579 - 11905: 0xDFBB,
- 21580 - 11905: 0x85D3,
- 21581 - 11905: 0x85D4,
- 21582 - 11905: 0x85D5,
- 21583 - 11905: 0x85D6,
- 21584 - 11905: 0xC4C5,
- 21585 - 11905: 0x85D7,
- 21586 - 11905: 0xDFBC,
- 21587 - 11905: 0xDFBD,
- 21588 - 11905: 0xDFBE,
- 21589 - 11905: 0xC5BB,
- 21590 - 11905: 0xDFBF,
- 21591 - 11905: 0xDFC2,
- 21592 - 11905: 0xD4B1,
- 21593 - 11905: 0xDFC3,
- 21594 - 11905: 0x85D8,
- 21595 - 11905: 0xC7BA,
- 21596 - 11905: 0xCED8,
- 21597 - 11905: 0x85D9,
- 21598 - 11905: 0x85DA,
- 21599 - 11905: 0x85DB,
- 21600 - 11905: 0x85DC,
- 21601 - 11905: 0x85DD,
- 21602 - 11905: 0xC4D8,
- 21603 - 11905: 0x85DE,
- 21604 - 11905: 0xDFCA,
- 21605 - 11905: 0x85DF,
- 21606 - 11905: 0xDFCF,
- 21607 - 11905: 0x85E0,
- 21608 - 11905: 0xD6DC,
- 21609 - 11905: 0x85E1,
- 21610 - 11905: 0x85E2,
- 21611 - 11905: 0x85E3,
- 21612 - 11905: 0x85E4,
- 21613 - 11905: 0x85E5,
- 21614 - 11905: 0x85E6,
- 21615 - 11905: 0x85E7,
- 21616 - 11905: 0x85E8,
- 21617 - 11905: 0xDFC9,
- 21618 - 11905: 0xDFDA,
- 21619 - 11905: 0xCEB6,
- 21620 - 11905: 0x85E9,
- 21621 - 11905: 0xBAC7,
- 21622 - 11905: 0xDFCE,
- 21623 - 11905: 0xDFC8,
- 21624 - 11905: 0xC5DE,
- 21625 - 11905: 0x85EA,
- 21626 - 11905: 0x85EB,
- 21627 - 11905: 0xC9EB,
- 21628 - 11905: 0xBAF4,
- 21629 - 11905: 0xC3FC,
- 21630 - 11905: 0x85EC,
- 21631 - 11905: 0x85ED,
- 21632 - 11905: 0xBED7,
- 21633 - 11905: 0x85EE,
- 21634 - 11905: 0xDFC6,
- 21635 - 11905: 0x85EF,
- 21636 - 11905: 0xDFCD,
- 21637 - 11905: 0x85F0,
- 21638 - 11905: 0xC5D8,
- 21639 - 11905: 0x85F1,
- 21640 - 11905: 0x85F2,
- 21641 - 11905: 0x85F3,
- 21642 - 11905: 0x85F4,
- 21643 - 11905: 0xD5A6,
- 21644 - 11905: 0xBACD,
- 21645 - 11905: 0x85F5,
- 21646 - 11905: 0xBECC,
- 21647 - 11905: 0xD3BD,
- 21648 - 11905: 0xB8C0,
- 21649 - 11905: 0x85F6,
- 21650 - 11905: 0xD6E4,
- 21651 - 11905: 0x85F7,
- 21652 - 11905: 0xDFC7,
- 21653 - 11905: 0xB9BE,
- 21654 - 11905: 0xBFA7,
- 21655 - 11905: 0x85F8,
- 21656 - 11905: 0x85F9,
- 21657 - 11905: 0xC1FC,
- 21658 - 11905: 0xDFCB,
- 21659 - 11905: 0xDFCC,
- 21660 - 11905: 0x85FA,
- 21661 - 11905: 0xDFD0,
- 21662 - 11905: 0x85FB,
- 21663 - 11905: 0x85FC,
- 21664 - 11905: 0x85FD,
- 21665 - 11905: 0x85FE,
- 21666 - 11905: 0x8640,
- 21667 - 11905: 0xDFDB,
- 21668 - 11905: 0xDFE5,
- 21669 - 11905: 0x8641,
- 21670 - 11905: 0xDFD7,
- 21671 - 11905: 0xDFD6,
- 21672 - 11905: 0xD7C9,
- 21673 - 11905: 0xDFE3,
- 21674 - 11905: 0xDFE4,
- 21675 - 11905: 0xE5EB,
- 21676 - 11905: 0xD2A7,
- 21677 - 11905: 0xDFD2,
- 21678 - 11905: 0x8642,
- 21679 - 11905: 0xBFA9,
- 21680 - 11905: 0x8643,
- 21681 - 11905: 0xD4DB,
- 21682 - 11905: 0x8644,
- 21683 - 11905: 0xBFC8,
- 21684 - 11905: 0xDFD4,
- 21685 - 11905: 0x8645,
- 21686 - 11905: 0x8646,
- 21687 - 11905: 0x8647,
- 21688 - 11905: 0xCFCC,
- 21689 - 11905: 0x8648,
- 21690 - 11905: 0x8649,
- 21691 - 11905: 0xDFDD,
- 21692 - 11905: 0x864A,
- 21693 - 11905: 0xD1CA,
- 21694 - 11905: 0x864B,
- 21695 - 11905: 0xDFDE,
- 21696 - 11905: 0xB0A7,
- 21697 - 11905: 0xC6B7,
- 21698 - 11905: 0xDFD3,
- 21699 - 11905: 0x864C,
- 21700 - 11905: 0xBAE5,
- 21701 - 11905: 0x864D,
- 21702 - 11905: 0xB6DF,
- 21703 - 11905: 0xCDDB,
- 21704 - 11905: 0xB9FE,
- 21705 - 11905: 0xD4D5,
- 21706 - 11905: 0x864E,
- 21707 - 11905: 0x864F,
- 21708 - 11905: 0xDFDF,
- 21709 - 11905: 0xCFEC,
- 21710 - 11905: 0xB0A5,
- 21711 - 11905: 0xDFE7,
- 21712 - 11905: 0xDFD1,
- 21713 - 11905: 0xD1C6,
- 21714 - 11905: 0xDFD5,
- 21715 - 11905: 0xDFD8,
- 21716 - 11905: 0xDFD9,
- 21717 - 11905: 0xDFDC,
- 21718 - 11905: 0x8650,
- 21719 - 11905: 0xBBA9,
- 21720 - 11905: 0x8651,
- 21721 - 11905: 0xDFE0,
- 21722 - 11905: 0xDFE1,
- 21723 - 11905: 0x8652,
- 21724 - 11905: 0xDFE2,
- 21725 - 11905: 0xDFE6,
- 21726 - 11905: 0xDFE8,
- 21727 - 11905: 0xD3B4,
- 21728 - 11905: 0x8653,
- 21729 - 11905: 0x8654,
- 21730 - 11905: 0x8655,
- 21731 - 11905: 0x8656,
- 21732 - 11905: 0x8657,
- 21733 - 11905: 0xB8E7,
- 21734 - 11905: 0xC5B6,
- 21735 - 11905: 0xDFEA,
- 21736 - 11905: 0xC9DA,
- 21737 - 11905: 0xC1A8,
- 21738 - 11905: 0xC4C4,
- 21739 - 11905: 0x8658,
- 21740 - 11905: 0x8659,
- 21741 - 11905: 0xBFDE,
- 21742 - 11905: 0xCFF8,
- 21743 - 11905: 0x865A,
- 21744 - 11905: 0x865B,
- 21745 - 11905: 0x865C,
- 21746 - 11905: 0xD5DC,
- 21747 - 11905: 0xDFEE,
- 21748 - 11905: 0x865D,
- 21749 - 11905: 0x865E,
- 21750 - 11905: 0x865F,
- 21751 - 11905: 0x8660,
- 21752 - 11905: 0x8661,
- 21753 - 11905: 0x8662,
- 21754 - 11905: 0xB2B8,
- 21755 - 11905: 0x8663,
- 21756 - 11905: 0xBADF,
- 21757 - 11905: 0xDFEC,
- 21758 - 11905: 0x8664,
- 21759 - 11905: 0xDBC1,
- 21760 - 11905: 0x8665,
- 21761 - 11905: 0xD1E4,
- 21762 - 11905: 0x8666,
- 21763 - 11905: 0x8667,
- 21764 - 11905: 0x8668,
- 21765 - 11905: 0x8669,
- 21766 - 11905: 0xCBF4,
- 21767 - 11905: 0xB4BD,
- 21768 - 11905: 0x866A,
- 21769 - 11905: 0xB0A6,
- 21770 - 11905: 0x866B,
- 21771 - 11905: 0x866C,
- 21772 - 11905: 0x866D,
- 21773 - 11905: 0x866E,
- 21774 - 11905: 0x866F,
- 21775 - 11905: 0xDFF1,
- 21776 - 11905: 0xCCC6,
- 21777 - 11905: 0xDFF2,
- 21778 - 11905: 0x8670,
- 21779 - 11905: 0x8671,
- 21780 - 11905: 0xDFED,
- 21781 - 11905: 0x8672,
- 21782 - 11905: 0x8673,
- 21783 - 11905: 0x8674,
- 21784 - 11905: 0x8675,
- 21785 - 11905: 0x8676,
- 21786 - 11905: 0x8677,
- 21787 - 11905: 0xDFE9,
- 21788 - 11905: 0x8678,
- 21789 - 11905: 0x8679,
- 21790 - 11905: 0x867A,
- 21791 - 11905: 0x867B,
- 21792 - 11905: 0xDFEB,
- 21793 - 11905: 0x867C,
- 21794 - 11905: 0xDFEF,
- 21795 - 11905: 0xDFF0,
- 21796 - 11905: 0xBBBD,
- 21797 - 11905: 0x867D,
- 21798 - 11905: 0x867E,
- 21799 - 11905: 0xDFF3,
- 21800 - 11905: 0x8680,
- 21801 - 11905: 0x8681,
- 21802 - 11905: 0xDFF4,
- 21803 - 11905: 0x8682,
- 21804 - 11905: 0xBBA3,
- 21805 - 11905: 0x8683,
- 21806 - 11905: 0xCADB,
- 21807 - 11905: 0xCEA8,
- 21808 - 11905: 0xE0A7,
- 21809 - 11905: 0xB3AA,
- 21810 - 11905: 0x8684,
- 21811 - 11905: 0xE0A6,
- 21812 - 11905: 0x8685,
- 21813 - 11905: 0x8686,
- 21814 - 11905: 0x8687,
- 21815 - 11905: 0xE0A1,
- 21816 - 11905: 0x8688,
- 21817 - 11905: 0x8689,
- 21818 - 11905: 0x868A,
- 21819 - 11905: 0x868B,
- 21820 - 11905: 0xDFFE,
- 21821 - 11905: 0x868C,
- 21822 - 11905: 0xCDD9,
- 21823 - 11905: 0xDFFC,
- 21824 - 11905: 0x868D,
- 21825 - 11905: 0xDFFA,
- 21826 - 11905: 0x868E,
- 21827 - 11905: 0xBFD0,
- 21828 - 11905: 0xD7C4,
- 21829 - 11905: 0x868F,
- 21830 - 11905: 0xC9CC,
- 21831 - 11905: 0x8690,
- 21832 - 11905: 0x8691,
- 21833 - 11905: 0xDFF8,
- 21834 - 11905: 0xB0A1,
- 21835 - 11905: 0x8692,
- 21836 - 11905: 0x8693,
- 21837 - 11905: 0x8694,
- 21838 - 11905: 0x8695,
- 21839 - 11905: 0x8696,
- 21840 - 11905: 0xDFFD,
- 21841 - 11905: 0x8697,
- 21842 - 11905: 0x8698,
- 21843 - 11905: 0x8699,
- 21844 - 11905: 0x869A,
- 21845 - 11905: 0xDFFB,
- 21846 - 11905: 0xE0A2,
- 21847 - 11905: 0x869B,
- 21848 - 11905: 0x869C,
- 21849 - 11905: 0x869D,
- 21850 - 11905: 0x869E,
- 21851 - 11905: 0x869F,
- 21852 - 11905: 0xE0A8,
- 21853 - 11905: 0x86A0,
- 21854 - 11905: 0x86A1,
- 21855 - 11905: 0x86A2,
- 21856 - 11905: 0x86A3,
- 21857 - 11905: 0xB7C8,
- 21858 - 11905: 0x86A4,
- 21859 - 11905: 0x86A5,
- 21860 - 11905: 0xC6A1,
- 21861 - 11905: 0xC9B6,
- 21862 - 11905: 0xC0B2,
- 21863 - 11905: 0xDFF5,
- 21864 - 11905: 0x86A6,
- 21865 - 11905: 0x86A7,
- 21866 - 11905: 0xC5BE,
- 21867 - 11905: 0x86A8,
- 21868 - 11905: 0xD8C4,
- 21869 - 11905: 0xDFF9,
- 21870 - 11905: 0xC4F6,
- 21871 - 11905: 0x86A9,
- 21872 - 11905: 0x86AA,
- 21873 - 11905: 0x86AB,
- 21874 - 11905: 0x86AC,
- 21875 - 11905: 0x86AD,
- 21876 - 11905: 0x86AE,
- 21877 - 11905: 0xE0A3,
- 21878 - 11905: 0xE0A4,
- 21879 - 11905: 0xE0A5,
- 21880 - 11905: 0xD0A5,
- 21881 - 11905: 0x86AF,
- 21882 - 11905: 0x86B0,
- 21883 - 11905: 0xE0B4,
- 21884 - 11905: 0xCCE4,
- 21885 - 11905: 0x86B1,
- 21886 - 11905: 0xE0B1,
- 21887 - 11905: 0x86B2,
- 21888 - 11905: 0xBFA6,
- 21889 - 11905: 0xE0AF,
- 21890 - 11905: 0xCEB9,
- 21891 - 11905: 0xE0AB,
- 21892 - 11905: 0xC9C6,
- 21893 - 11905: 0x86B3,
- 21894 - 11905: 0x86B4,
- 21895 - 11905: 0xC0AE,
- 21896 - 11905: 0xE0AE,
- 21897 - 11905: 0xBAED,
- 21898 - 11905: 0xBAB0,
- 21899 - 11905: 0xE0A9,
- 21900 - 11905: 0x86B5,
- 21901 - 11905: 0x86B6,
- 21902 - 11905: 0x86B7,
- 21903 - 11905: 0xDFF6,
- 21904 - 11905: 0x86B8,
- 21905 - 11905: 0xE0B3,
- 21906 - 11905: 0x86B9,
- 21907 - 11905: 0x86BA,
- 21908 - 11905: 0xE0B8,
- 21909 - 11905: 0x86BB,
- 21910 - 11905: 0x86BC,
- 21911 - 11905: 0x86BD,
- 21912 - 11905: 0xB4AD,
- 21913 - 11905: 0xE0B9,
- 21914 - 11905: 0x86BE,
- 21915 - 11905: 0x86BF,
- 21916 - 11905: 0xCFB2,
- 21917 - 11905: 0xBAC8,
- 21918 - 11905: 0x86C0,
- 21919 - 11905: 0xE0B0,
- 21920 - 11905: 0x86C1,
- 21921 - 11905: 0x86C2,
- 21922 - 11905: 0x86C3,
- 21923 - 11905: 0x86C4,
- 21924 - 11905: 0x86C5,
- 21925 - 11905: 0x86C6,
- 21926 - 11905: 0x86C7,
- 21927 - 11905: 0xD0FA,
- 21928 - 11905: 0x86C8,
- 21929 - 11905: 0x86C9,
- 21930 - 11905: 0x86CA,
- 21931 - 11905: 0x86CB,
- 21932 - 11905: 0x86CC,
- 21933 - 11905: 0x86CD,
- 21934 - 11905: 0x86CE,
- 21935 - 11905: 0x86CF,
- 21936 - 11905: 0x86D0,
- 21937 - 11905: 0xE0AC,
- 21938 - 11905: 0x86D1,
- 21939 - 11905: 0xD4FB,
- 21940 - 11905: 0x86D2,
- 21941 - 11905: 0xDFF7,
- 21942 - 11905: 0x86D3,
- 21943 - 11905: 0xC5E7,
- 21944 - 11905: 0x86D4,
- 21945 - 11905: 0xE0AD,
- 21946 - 11905: 0x86D5,
- 21947 - 11905: 0xD3F7,
- 21948 - 11905: 0x86D6,
- 21949 - 11905: 0xE0B6,
- 21950 - 11905: 0xE0B7,
- 21951 - 11905: 0x86D7,
- 21952 - 11905: 0x86D8,
- 21953 - 11905: 0x86D9,
- 21954 - 11905: 0x86DA,
- 21955 - 11905: 0x86DB,
- 21956 - 11905: 0xE0C4,
- 21957 - 11905: 0xD0E1,
- 21958 - 11905: 0x86DC,
- 21959 - 11905: 0x86DD,
- 21960 - 11905: 0x86DE,
- 21961 - 11905: 0xE0BC,
- 21962 - 11905: 0x86DF,
- 21963 - 11905: 0x86E0,
- 21964 - 11905: 0xE0C9,
- 21965 - 11905: 0xE0CA,
- 21966 - 11905: 0x86E1,
- 21967 - 11905: 0x86E2,
- 21968 - 11905: 0x86E3,
- 21969 - 11905: 0xE0BE,
- 21970 - 11905: 0xE0AA,
- 21971 - 11905: 0xC9A4,
- 21972 - 11905: 0xE0C1,
- 21973 - 11905: 0x86E4,
- 21974 - 11905: 0xE0B2,
- 21975 - 11905: 0x86E5,
- 21976 - 11905: 0x86E6,
- 21977 - 11905: 0x86E7,
- 21978 - 11905: 0x86E8,
- 21979 - 11905: 0x86E9,
- 21980 - 11905: 0xCAC8,
- 21981 - 11905: 0xE0C3,
- 21982 - 11905: 0x86EA,
- 21983 - 11905: 0xE0B5,
- 21984 - 11905: 0x86EB,
- 21985 - 11905: 0xCECB,
- 21986 - 11905: 0x86EC,
- 21987 - 11905: 0xCBC3,
- 21988 - 11905: 0xE0CD,
- 21989 - 11905: 0xE0C6,
- 21990 - 11905: 0xE0C2,
- 21991 - 11905: 0x86ED,
- 21992 - 11905: 0xE0CB,
- 21993 - 11905: 0x86EE,
- 21994 - 11905: 0xE0BA,
- 21995 - 11905: 0xE0BF,
- 21996 - 11905: 0xE0C0,
- 21997 - 11905: 0x86EF,
- 21998 - 11905: 0x86F0,
- 21999 - 11905: 0xE0C5,
- 22000 - 11905: 0x86F1,
- 22001 - 11905: 0x86F2,
- 22002 - 11905: 0xE0C7,
- 22003 - 11905: 0xE0C8,
- 22004 - 11905: 0x86F3,
- 22005 - 11905: 0xE0CC,
- 22006 - 11905: 0x86F4,
- 22007 - 11905: 0xE0BB,
- 22008 - 11905: 0x86F5,
- 22009 - 11905: 0x86F6,
- 22010 - 11905: 0x86F7,
- 22011 - 11905: 0x86F8,
- 22012 - 11905: 0x86F9,
- 22013 - 11905: 0xCBD4,
- 22014 - 11905: 0xE0D5,
- 22015 - 11905: 0x86FA,
- 22016 - 11905: 0xE0D6,
- 22017 - 11905: 0xE0D2,
- 22018 - 11905: 0x86FB,
- 22019 - 11905: 0x86FC,
- 22020 - 11905: 0x86FD,
- 22021 - 11905: 0x86FE,
- 22022 - 11905: 0x8740,
- 22023 - 11905: 0x8741,
- 22024 - 11905: 0xE0D0,
- 22025 - 11905: 0xBCCE,
- 22026 - 11905: 0x8742,
- 22027 - 11905: 0x8743,
- 22028 - 11905: 0xE0D1,
- 22029 - 11905: 0x8744,
- 22030 - 11905: 0xB8C2,
- 22031 - 11905: 0xD8C5,
- 22032 - 11905: 0x8745,
- 22033 - 11905: 0x8746,
- 22034 - 11905: 0x8747,
- 22035 - 11905: 0x8748,
- 22036 - 11905: 0x8749,
- 22037 - 11905: 0x874A,
- 22038 - 11905: 0x874B,
- 22039 - 11905: 0x874C,
- 22040 - 11905: 0xD0EA,
- 22041 - 11905: 0x874D,
- 22042 - 11905: 0x874E,
- 22043 - 11905: 0xC2EF,
- 22044 - 11905: 0x874F,
- 22045 - 11905: 0x8750,
- 22046 - 11905: 0xE0CF,
- 22047 - 11905: 0xE0BD,
- 22048 - 11905: 0x8751,
- 22049 - 11905: 0x8752,
- 22050 - 11905: 0x8753,
- 22051 - 11905: 0xE0D4,
- 22052 - 11905: 0xE0D3,
- 22053 - 11905: 0x8754,
- 22054 - 11905: 0x8755,
- 22055 - 11905: 0xE0D7,
- 22056 - 11905: 0x8756,
- 22057 - 11905: 0x8757,
- 22058 - 11905: 0x8758,
- 22059 - 11905: 0x8759,
- 22060 - 11905: 0xE0DC,
- 22061 - 11905: 0xE0D8,
- 22062 - 11905: 0x875A,
- 22063 - 11905: 0x875B,
- 22064 - 11905: 0x875C,
- 22065 - 11905: 0xD6F6,
- 22066 - 11905: 0xB3B0,
- 22067 - 11905: 0x875D,
- 22068 - 11905: 0xD7EC,
- 22069 - 11905: 0x875E,
- 22070 - 11905: 0xCBBB,
- 22071 - 11905: 0x875F,
- 22072 - 11905: 0x8760,
- 22073 - 11905: 0xE0DA,
- 22074 - 11905: 0x8761,
- 22075 - 11905: 0xCEFB,
- 22076 - 11905: 0x8762,
- 22077 - 11905: 0x8763,
- 22078 - 11905: 0x8764,
- 22079 - 11905: 0xBAD9,
- 22080 - 11905: 0x8765,
- 22081 - 11905: 0x8766,
- 22082 - 11905: 0x8767,
- 22083 - 11905: 0x8768,
- 22084 - 11905: 0x8769,
- 22085 - 11905: 0x876A,
- 22086 - 11905: 0x876B,
- 22087 - 11905: 0x876C,
- 22088 - 11905: 0x876D,
- 22089 - 11905: 0x876E,
- 22090 - 11905: 0x876F,
- 22091 - 11905: 0x8770,
- 22092 - 11905: 0xE0E1,
- 22093 - 11905: 0xE0DD,
- 22094 - 11905: 0xD2AD,
- 22095 - 11905: 0x8771,
- 22096 - 11905: 0x8772,
- 22097 - 11905: 0x8773,
- 22098 - 11905: 0x8774,
- 22099 - 11905: 0x8775,
- 22100 - 11905: 0xE0E2,
- 22101 - 11905: 0x8776,
- 22102 - 11905: 0x8777,
- 22103 - 11905: 0xE0DB,
- 22104 - 11905: 0xE0D9,
- 22105 - 11905: 0xE0DF,
- 22106 - 11905: 0x8778,
- 22107 - 11905: 0x8779,
- 22108 - 11905: 0xE0E0,
- 22109 - 11905: 0x877A,
- 22110 - 11905: 0x877B,
- 22111 - 11905: 0x877C,
- 22112 - 11905: 0x877D,
- 22113 - 11905: 0x877E,
- 22114 - 11905: 0xE0DE,
- 22115 - 11905: 0x8780,
- 22116 - 11905: 0xE0E4,
- 22117 - 11905: 0x8781,
- 22118 - 11905: 0x8782,
- 22119 - 11905: 0x8783,
- 22120 - 11905: 0xC6F7,
- 22121 - 11905: 0xD8AC,
- 22122 - 11905: 0xD4EB,
- 22123 - 11905: 0xE0E6,
- 22124 - 11905: 0xCAC9,
- 22125 - 11905: 0x8784,
- 22126 - 11905: 0x8785,
- 22127 - 11905: 0x8786,
- 22128 - 11905: 0x8787,
- 22129 - 11905: 0xE0E5,
- 22130 - 11905: 0x8788,
- 22131 - 11905: 0x8789,
- 22132 - 11905: 0x878A,
- 22133 - 11905: 0x878B,
- 22134 - 11905: 0xB8C1,
- 22135 - 11905: 0x878C,
- 22136 - 11905: 0x878D,
- 22137 - 11905: 0x878E,
- 22138 - 11905: 0x878F,
- 22139 - 11905: 0xE0E7,
- 22140 - 11905: 0xE0E8,
- 22141 - 11905: 0x8790,
- 22142 - 11905: 0x8791,
- 22143 - 11905: 0x8792,
- 22144 - 11905: 0x8793,
- 22145 - 11905: 0x8794,
- 22146 - 11905: 0x8795,
- 22147 - 11905: 0x8796,
- 22148 - 11905: 0x8797,
- 22149 - 11905: 0xE0E9,
- 22150 - 11905: 0xE0E3,
- 22151 - 11905: 0x8798,
- 22152 - 11905: 0x8799,
- 22153 - 11905: 0x879A,
- 22154 - 11905: 0x879B,
- 22155 - 11905: 0x879C,
- 22156 - 11905: 0x879D,
- 22157 - 11905: 0x879E,
- 22158 - 11905: 0xBABF,
- 22159 - 11905: 0xCCE7,
- 22160 - 11905: 0x879F,
- 22161 - 11905: 0x87A0,
- 22162 - 11905: 0x87A1,
- 22163 - 11905: 0xE0EA,
- 22164 - 11905: 0x87A2,
- 22165 - 11905: 0x87A3,
- 22166 - 11905: 0x87A4,
- 22167 - 11905: 0x87A5,
- 22168 - 11905: 0x87A6,
- 22169 - 11905: 0x87A7,
- 22170 - 11905: 0x87A8,
- 22171 - 11905: 0x87A9,
- 22172 - 11905: 0x87AA,
- 22173 - 11905: 0x87AB,
- 22174 - 11905: 0x87AC,
- 22175 - 11905: 0x87AD,
- 22176 - 11905: 0x87AE,
- 22177 - 11905: 0x87AF,
- 22178 - 11905: 0x87B0,
- 22179 - 11905: 0xCFF9,
- 22180 - 11905: 0x87B1,
- 22181 - 11905: 0x87B2,
- 22182 - 11905: 0x87B3,
- 22183 - 11905: 0x87B4,
- 22184 - 11905: 0x87B5,
- 22185 - 11905: 0x87B6,
- 22186 - 11905: 0x87B7,
- 22187 - 11905: 0x87B8,
- 22188 - 11905: 0x87B9,
- 22189 - 11905: 0x87BA,
- 22190 - 11905: 0x87BB,
- 22191 - 11905: 0xE0EB,
- 22192 - 11905: 0x87BC,
- 22193 - 11905: 0x87BD,
- 22194 - 11905: 0x87BE,
- 22195 - 11905: 0x87BF,
- 22196 - 11905: 0x87C0,
- 22197 - 11905: 0x87C1,
- 22198 - 11905: 0x87C2,
- 22199 - 11905: 0xC8C2,
- 22200 - 11905: 0x87C3,
- 22201 - 11905: 0x87C4,
- 22202 - 11905: 0x87C5,
- 22203 - 11905: 0x87C6,
- 22204 - 11905: 0xBDC0,
- 22205 - 11905: 0x87C7,
- 22206 - 11905: 0x87C8,
- 22207 - 11905: 0x87C9,
- 22208 - 11905: 0x87CA,
- 22209 - 11905: 0x87CB,
- 22210 - 11905: 0x87CC,
- 22211 - 11905: 0x87CD,
- 22212 - 11905: 0x87CE,
- 22213 - 11905: 0x87CF,
- 22214 - 11905: 0x87D0,
- 22215 - 11905: 0x87D1,
- 22216 - 11905: 0x87D2,
- 22217 - 11905: 0x87D3,
- 22218 - 11905: 0xC4D2,
- 22219 - 11905: 0x87D4,
- 22220 - 11905: 0x87D5,
- 22221 - 11905: 0x87D6,
- 22222 - 11905: 0x87D7,
- 22223 - 11905: 0x87D8,
- 22224 - 11905: 0x87D9,
- 22225 - 11905: 0x87DA,
- 22226 - 11905: 0x87DB,
- 22227 - 11905: 0x87DC,
- 22228 - 11905: 0xE0EC,
- 22229 - 11905: 0x87DD,
- 22230 - 11905: 0x87DE,
- 22231 - 11905: 0xE0ED,
- 22232 - 11905: 0x87DF,
- 22233 - 11905: 0x87E0,
- 22234 - 11905: 0xC7F4,
- 22235 - 11905: 0xCBC4,
- 22236 - 11905: 0x87E1,
- 22237 - 11905: 0xE0EE,
- 22238 - 11905: 0xBBD8,
- 22239 - 11905: 0xD8B6,
- 22240 - 11905: 0xD2F2,
- 22241 - 11905: 0xE0EF,
- 22242 - 11905: 0xCDC5,
- 22243 - 11905: 0x87E2,
- 22244 - 11905: 0xB6DA,
- 22245 - 11905: 0x87E3,
- 22246 - 11905: 0x87E4,
- 22247 - 11905: 0x87E5,
- 22248 - 11905: 0x87E6,
- 22249 - 11905: 0x87E7,
- 22250 - 11905: 0x87E8,
- 22251 - 11905: 0xE0F1,
- 22252 - 11905: 0x87E9,
- 22253 - 11905: 0xD4B0,
- 22254 - 11905: 0x87EA,
- 22255 - 11905: 0x87EB,
- 22256 - 11905: 0xC0A7,
- 22257 - 11905: 0xB4D1,
- 22258 - 11905: 0x87EC,
- 22259 - 11905: 0x87ED,
- 22260 - 11905: 0xCEA7,
- 22261 - 11905: 0xE0F0,
- 22262 - 11905: 0x87EE,
- 22263 - 11905: 0x87EF,
- 22264 - 11905: 0x87F0,
- 22265 - 11905: 0xE0F2,
- 22266 - 11905: 0xB9CC,
- 22267 - 11905: 0x87F1,
- 22268 - 11905: 0x87F2,
- 22269 - 11905: 0xB9FA,
- 22270 - 11905: 0xCDBC,
- 22271 - 11905: 0xE0F3,
- 22272 - 11905: 0x87F3,
- 22273 - 11905: 0x87F4,
- 22274 - 11905: 0x87F5,
- 22275 - 11905: 0xC6D4,
- 22276 - 11905: 0xE0F4,
- 22277 - 11905: 0x87F6,
- 22278 - 11905: 0xD4B2,
- 22279 - 11905: 0x87F7,
- 22280 - 11905: 0xC8A6,
- 22281 - 11905: 0xE0F6,
- 22282 - 11905: 0xE0F5,
- 22283 - 11905: 0x87F8,
- 22284 - 11905: 0x87F9,
- 22285 - 11905: 0x87FA,
- 22286 - 11905: 0x87FB,
- 22287 - 11905: 0x87FC,
- 22288 - 11905: 0x87FD,
- 22289 - 11905: 0x87FE,
- 22290 - 11905: 0x8840,
- 22291 - 11905: 0x8841,
- 22292 - 11905: 0x8842,
- 22293 - 11905: 0x8843,
- 22294 - 11905: 0x8844,
- 22295 - 11905: 0x8845,
- 22296 - 11905: 0x8846,
- 22297 - 11905: 0x8847,
- 22298 - 11905: 0x8848,
- 22299 - 11905: 0x8849,
- 22300 - 11905: 0xE0F7,
- 22301 - 11905: 0x884A,
- 22302 - 11905: 0x884B,
- 22303 - 11905: 0xCDC1,
- 22304 - 11905: 0x884C,
- 22305 - 11905: 0x884D,
- 22306 - 11905: 0x884E,
- 22307 - 11905: 0xCAA5,
- 22308 - 11905: 0x884F,
- 22309 - 11905: 0x8850,
- 22310 - 11905: 0x8851,
- 22311 - 11905: 0x8852,
- 22312 - 11905: 0xD4DA,
- 22313 - 11905: 0xDBD7,
- 22314 - 11905: 0xDBD9,
- 22315 - 11905: 0x8853,
- 22316 - 11905: 0xDBD8,
- 22317 - 11905: 0xB9E7,
- 22318 - 11905: 0xDBDC,
- 22319 - 11905: 0xDBDD,
- 22320 - 11905: 0xB5D8,
- 22321 - 11905: 0x8854,
- 22322 - 11905: 0x8855,
- 22323 - 11905: 0xDBDA,
- 22324 - 11905: 0x8856,
- 22325 - 11905: 0x8857,
- 22326 - 11905: 0x8858,
- 22327 - 11905: 0x8859,
- 22328 - 11905: 0x885A,
- 22329 - 11905: 0xDBDB,
- 22330 - 11905: 0xB3A1,
- 22331 - 11905: 0xDBDF,
- 22332 - 11905: 0x885B,
- 22333 - 11905: 0x885C,
- 22334 - 11905: 0xBBF8,
- 22335 - 11905: 0x885D,
- 22336 - 11905: 0xD6B7,
- 22337 - 11905: 0x885E,
- 22338 - 11905: 0xDBE0,
- 22339 - 11905: 0x885F,
- 22340 - 11905: 0x8860,
- 22341 - 11905: 0x8861,
- 22342 - 11905: 0x8862,
- 22343 - 11905: 0xBEF9,
- 22344 - 11905: 0x8863,
- 22345 - 11905: 0x8864,
- 22346 - 11905: 0xB7BB,
- 22347 - 11905: 0x8865,
- 22348 - 11905: 0xDBD0,
- 22349 - 11905: 0xCCAE,
- 22350 - 11905: 0xBFB2,
- 22351 - 11905: 0xBBB5,
- 22352 - 11905: 0xD7F8,
- 22353 - 11905: 0xBFD3,
- 22354 - 11905: 0x8866,
- 22355 - 11905: 0x8867,
- 22356 - 11905: 0x8868,
- 22357 - 11905: 0x8869,
- 22358 - 11905: 0x886A,
- 22359 - 11905: 0xBFE9,
- 22360 - 11905: 0x886B,
- 22361 - 11905: 0x886C,
- 22362 - 11905: 0xBCE1,
- 22363 - 11905: 0xCCB3,
- 22364 - 11905: 0xDBDE,
- 22365 - 11905: 0xB0D3,
- 22366 - 11905: 0xCEEB,
- 22367 - 11905: 0xB7D8,
- 22368 - 11905: 0xD7B9,
- 22369 - 11905: 0xC6C2,
- 22370 - 11905: 0x886D,
- 22371 - 11905: 0x886E,
- 22372 - 11905: 0xC0A4,
- 22373 - 11905: 0x886F,
- 22374 - 11905: 0xCCB9,
- 22375 - 11905: 0x8870,
- 22376 - 11905: 0xDBE7,
- 22377 - 11905: 0xDBE1,
- 22378 - 11905: 0xC6BA,
- 22379 - 11905: 0xDBE3,
- 22380 - 11905: 0x8871,
- 22381 - 11905: 0xDBE8,
- 22382 - 11905: 0x8872,
- 22383 - 11905: 0xC5F7,
- 22384 - 11905: 0x8873,
- 22385 - 11905: 0x8874,
- 22386 - 11905: 0x8875,
- 22387 - 11905: 0xDBEA,
- 22388 - 11905: 0x8876,
- 22389 - 11905: 0x8877,
- 22390 - 11905: 0xDBE9,
- 22391 - 11905: 0xBFC0,
- 22392 - 11905: 0x8878,
- 22393 - 11905: 0x8879,
- 22394 - 11905: 0x887A,
- 22395 - 11905: 0xDBE6,
- 22396 - 11905: 0xDBE5,
- 22397 - 11905: 0x887B,
- 22398 - 11905: 0x887C,
- 22399 - 11905: 0x887D,
- 22400 - 11905: 0x887E,
- 22401 - 11905: 0x8880,
- 22402 - 11905: 0xB4B9,
- 22403 - 11905: 0xC0AC,
- 22404 - 11905: 0xC2A2,
- 22405 - 11905: 0xDBE2,
- 22406 - 11905: 0xDBE4,
- 22407 - 11905: 0x8881,
- 22408 - 11905: 0x8882,
- 22409 - 11905: 0x8883,
- 22410 - 11905: 0x8884,
- 22411 - 11905: 0xD0CD,
- 22412 - 11905: 0xDBED,
- 22413 - 11905: 0x8885,
- 22414 - 11905: 0x8886,
- 22415 - 11905: 0x8887,
- 22416 - 11905: 0x8888,
- 22417 - 11905: 0x8889,
- 22418 - 11905: 0xC0DD,
- 22419 - 11905: 0xDBF2,
- 22420 - 11905: 0x888A,
- 22421 - 11905: 0x888B,
- 22422 - 11905: 0x888C,
- 22423 - 11905: 0x888D,
- 22424 - 11905: 0x888E,
- 22425 - 11905: 0x888F,
- 22426 - 11905: 0x8890,
- 22427 - 11905: 0xB6E2,
- 22428 - 11905: 0x8891,
- 22429 - 11905: 0x8892,
- 22430 - 11905: 0x8893,
- 22431 - 11905: 0x8894,
- 22432 - 11905: 0xDBF3,
- 22433 - 11905: 0xDBD2,
- 22434 - 11905: 0xB9B8,
- 22435 - 11905: 0xD4AB,
- 22436 - 11905: 0xDBEC,
- 22437 - 11905: 0x8895,
- 22438 - 11905: 0xBFD1,
- 22439 - 11905: 0xDBF0,
- 22440 - 11905: 0x8896,
- 22441 - 11905: 0xDBD1,
- 22442 - 11905: 0x8897,
- 22443 - 11905: 0xB5E6,
- 22444 - 11905: 0x8898,
- 22445 - 11905: 0xDBEB,
- 22446 - 11905: 0xBFE5,
- 22447 - 11905: 0x8899,
- 22448 - 11905: 0x889A,
- 22449 - 11905: 0x889B,
- 22450 - 11905: 0xDBEE,
- 22451 - 11905: 0x889C,
- 22452 - 11905: 0xDBF1,
- 22453 - 11905: 0x889D,
- 22454 - 11905: 0x889E,
- 22455 - 11905: 0x889F,
- 22456 - 11905: 0xDBF9,
- 22457 - 11905: 0x88A0,
- 22458 - 11905: 0x88A1,
- 22459 - 11905: 0x88A2,
- 22460 - 11905: 0x88A3,
- 22461 - 11905: 0x88A4,
- 22462 - 11905: 0x88A5,
- 22463 - 11905: 0x88A6,
- 22464 - 11905: 0x88A7,
- 22465 - 11905: 0x88A8,
- 22466 - 11905: 0xB9A1,
- 22467 - 11905: 0xB0A3,
- 22468 - 11905: 0x88A9,
- 22469 - 11905: 0x88AA,
- 22470 - 11905: 0x88AB,
- 22471 - 11905: 0x88AC,
- 22472 - 11905: 0x88AD,
- 22473 - 11905: 0x88AE,
- 22474 - 11905: 0x88AF,
- 22475 - 11905: 0xC2F1,
- 22476 - 11905: 0x88B0,
- 22477 - 11905: 0x88B1,
- 22478 - 11905: 0xB3C7,
- 22479 - 11905: 0xDBEF,
- 22480 - 11905: 0x88B2,
- 22481 - 11905: 0x88B3,
- 22482 - 11905: 0xDBF8,
- 22483 - 11905: 0x88B4,
- 22484 - 11905: 0xC6D2,
- 22485 - 11905: 0xDBF4,
- 22486 - 11905: 0x88B5,
- 22487 - 11905: 0x88B6,
- 22488 - 11905: 0xDBF5,
- 22489 - 11905: 0xDBF7,
- 22490 - 11905: 0xDBF6,
- 22491 - 11905: 0x88B7,
- 22492 - 11905: 0x88B8,
- 22493 - 11905: 0xDBFE,
- 22494 - 11905: 0x88B9,
- 22495 - 11905: 0xD3F2,
- 22496 - 11905: 0xB2BA,
- 22497 - 11905: 0x88BA,
- 22498 - 11905: 0x88BB,
- 22499 - 11905: 0x88BC,
- 22500 - 11905: 0xDBFD,
- 22501 - 11905: 0x88BD,
- 22502 - 11905: 0x88BE,
- 22503 - 11905: 0x88BF,
- 22504 - 11905: 0x88C0,
- 22505 - 11905: 0x88C1,
- 22506 - 11905: 0x88C2,
- 22507 - 11905: 0x88C3,
- 22508 - 11905: 0x88C4,
- 22509 - 11905: 0xDCA4,
- 22510 - 11905: 0x88C5,
- 22511 - 11905: 0xDBFB,
- 22512 - 11905: 0x88C6,
- 22513 - 11905: 0x88C7,
- 22514 - 11905: 0x88C8,
- 22515 - 11905: 0x88C9,
- 22516 - 11905: 0xDBFA,
- 22517 - 11905: 0x88CA,
- 22518 - 11905: 0x88CB,
- 22519 - 11905: 0x88CC,
- 22520 - 11905: 0xDBFC,
- 22521 - 11905: 0xC5E0,
- 22522 - 11905: 0xBBF9,
- 22523 - 11905: 0x88CD,
- 22524 - 11905: 0x88CE,
- 22525 - 11905: 0xDCA3,
- 22526 - 11905: 0x88CF,
- 22527 - 11905: 0x88D0,
- 22528 - 11905: 0xDCA5,
- 22529 - 11905: 0x88D1,
- 22530 - 11905: 0xCCC3,
- 22531 - 11905: 0x88D2,
- 22532 - 11905: 0x88D3,
- 22533 - 11905: 0x88D4,
- 22534 - 11905: 0xB6D1,
- 22535 - 11905: 0xDDC0,
- 22536 - 11905: 0x88D5,
- 22537 - 11905: 0x88D6,
- 22538 - 11905: 0x88D7,
- 22539 - 11905: 0xDCA1,
- 22540 - 11905: 0x88D8,
- 22541 - 11905: 0xDCA2,
- 22542 - 11905: 0x88D9,
- 22543 - 11905: 0x88DA,
- 22544 - 11905: 0x88DB,
- 22545 - 11905: 0xC7B5,
- 22546 - 11905: 0x88DC,
- 22547 - 11905: 0x88DD,
- 22548 - 11905: 0x88DE,
- 22549 - 11905: 0xB6E9,
- 22550 - 11905: 0x88DF,
- 22551 - 11905: 0x88E0,
- 22552 - 11905: 0x88E1,
- 22553 - 11905: 0xDCA7,
- 22554 - 11905: 0x88E2,
- 22555 - 11905: 0x88E3,
- 22556 - 11905: 0x88E4,
- 22557 - 11905: 0x88E5,
- 22558 - 11905: 0xDCA6,
- 22559 - 11905: 0x88E6,
- 22560 - 11905: 0xDCA9,
- 22561 - 11905: 0xB1A4,
- 22562 - 11905: 0x88E7,
- 22563 - 11905: 0x88E8,
- 22564 - 11905: 0xB5CC,
- 22565 - 11905: 0x88E9,
- 22566 - 11905: 0x88EA,
- 22567 - 11905: 0x88EB,
- 22568 - 11905: 0x88EC,
- 22569 - 11905: 0x88ED,
- 22570 - 11905: 0xBFB0,
- 22571 - 11905: 0x88EE,
- 22572 - 11905: 0x88EF,
- 22573 - 11905: 0x88F0,
- 22574 - 11905: 0x88F1,
- 22575 - 11905: 0x88F2,
- 22576 - 11905: 0xD1DF,
- 22577 - 11905: 0x88F3,
- 22578 - 11905: 0x88F4,
- 22579 - 11905: 0x88F5,
- 22580 - 11905: 0x88F6,
- 22581 - 11905: 0xB6C2,
- 22582 - 11905: 0x88F7,
- 22583 - 11905: 0x88F8,
- 22584 - 11905: 0x88F9,
- 22585 - 11905: 0x88FA,
- 22586 - 11905: 0x88FB,
- 22587 - 11905: 0x88FC,
- 22588 - 11905: 0x88FD,
- 22589 - 11905: 0x88FE,
- 22590 - 11905: 0x8940,
- 22591 - 11905: 0x8941,
- 22592 - 11905: 0x8942,
- 22593 - 11905: 0x8943,
- 22594 - 11905: 0x8944,
- 22595 - 11905: 0x8945,
- 22596 - 11905: 0xDCA8,
- 22597 - 11905: 0x8946,
- 22598 - 11905: 0x8947,
- 22599 - 11905: 0x8948,
- 22600 - 11905: 0x8949,
- 22601 - 11905: 0x894A,
- 22602 - 11905: 0x894B,
- 22603 - 11905: 0x894C,
- 22604 - 11905: 0xCBFA,
- 22605 - 11905: 0xEBF3,
- 22606 - 11905: 0x894D,
- 22607 - 11905: 0x894E,
- 22608 - 11905: 0x894F,
- 22609 - 11905: 0xCBDC,
- 22610 - 11905: 0x8950,
- 22611 - 11905: 0x8951,
- 22612 - 11905: 0xCBFE,
- 22613 - 11905: 0x8952,
- 22614 - 11905: 0x8953,
- 22615 - 11905: 0x8954,
- 22616 - 11905: 0xCCC1,
- 22617 - 11905: 0x8955,
- 22618 - 11905: 0x8956,
- 22619 - 11905: 0x8957,
- 22620 - 11905: 0x8958,
- 22621 - 11905: 0x8959,
- 22622 - 11905: 0xC8FB,
- 22623 - 11905: 0x895A,
- 22624 - 11905: 0x895B,
- 22625 - 11905: 0x895C,
- 22626 - 11905: 0x895D,
- 22627 - 11905: 0x895E,
- 22628 - 11905: 0x895F,
- 22629 - 11905: 0xDCAA,
- 22630 - 11905: 0x8960,
- 22631 - 11905: 0x8961,
- 22632 - 11905: 0x8962,
- 22633 - 11905: 0x8963,
- 22634 - 11905: 0x8964,
- 22635 - 11905: 0xCCEE,
- 22636 - 11905: 0xDCAB,
- 22637 - 11905: 0x8965,
- 22638 - 11905: 0x8966,
- 22639 - 11905: 0x8967,
- 22640 - 11905: 0x8968,
- 22641 - 11905: 0x8969,
- 22642 - 11905: 0x896A,
- 22643 - 11905: 0x896B,
- 22644 - 11905: 0x896C,
- 22645 - 11905: 0x896D,
- 22646 - 11905: 0x896E,
- 22647 - 11905: 0x896F,
- 22648 - 11905: 0x8970,
- 22649 - 11905: 0x8971,
- 22650 - 11905: 0x8972,
- 22651 - 11905: 0x8973,
- 22652 - 11905: 0x8974,
- 22653 - 11905: 0x8975,
- 22654 - 11905: 0xDBD3,
- 22655 - 11905: 0x8976,
- 22656 - 11905: 0xDCAF,
- 22657 - 11905: 0xDCAC,
- 22658 - 11905: 0x8977,
- 22659 - 11905: 0xBEB3,
- 22660 - 11905: 0x8978,
- 22661 - 11905: 0xCAFB,
- 22662 - 11905: 0x8979,
- 22663 - 11905: 0x897A,
- 22664 - 11905: 0x897B,
- 22665 - 11905: 0xDCAD,
- 22666 - 11905: 0x897C,
- 22667 - 11905: 0x897D,
- 22668 - 11905: 0x897E,
- 22669 - 11905: 0x8980,
- 22670 - 11905: 0x8981,
- 22671 - 11905: 0x8982,
- 22672 - 11905: 0x8983,
- 22673 - 11905: 0x8984,
- 22674 - 11905: 0xC9CA,
- 22675 - 11905: 0xC4B9,
- 22676 - 11905: 0x8985,
- 22677 - 11905: 0x8986,
- 22678 - 11905: 0x8987,
- 22679 - 11905: 0x8988,
- 22680 - 11905: 0x8989,
- 22681 - 11905: 0xC7BD,
- 22682 - 11905: 0xDCAE,
- 22683 - 11905: 0x898A,
- 22684 - 11905: 0x898B,
- 22685 - 11905: 0x898C,
- 22686 - 11905: 0xD4F6,
- 22687 - 11905: 0xD0E6,
- 22688 - 11905: 0x898D,
- 22689 - 11905: 0x898E,
- 22690 - 11905: 0x898F,
- 22691 - 11905: 0x8990,
- 22692 - 11905: 0x8991,
- 22693 - 11905: 0x8992,
- 22694 - 11905: 0x8993,
- 22695 - 11905: 0x8994,
- 22696 - 11905: 0xC4AB,
- 22697 - 11905: 0xB6D5,
- 22698 - 11905: 0x8995,
- 22699 - 11905: 0x8996,
- 22700 - 11905: 0x8997,
- 22701 - 11905: 0x8998,
- 22702 - 11905: 0x8999,
- 22703 - 11905: 0x899A,
- 22704 - 11905: 0x899B,
- 22705 - 11905: 0x899C,
- 22706 - 11905: 0x899D,
- 22707 - 11905: 0x899E,
- 22708 - 11905: 0x899F,
- 22709 - 11905: 0x89A0,
- 22710 - 11905: 0x89A1,
- 22711 - 11905: 0x89A2,
- 22712 - 11905: 0x89A3,
- 22713 - 11905: 0x89A4,
- 22714 - 11905: 0x89A5,
- 22715 - 11905: 0x89A6,
- 22716 - 11905: 0xDBD4,
- 22717 - 11905: 0x89A7,
- 22718 - 11905: 0x89A8,
- 22719 - 11905: 0x89A9,
- 22720 - 11905: 0x89AA,
- 22721 - 11905: 0xB1DA,
- 22722 - 11905: 0x89AB,
- 22723 - 11905: 0x89AC,
- 22724 - 11905: 0x89AD,
- 22725 - 11905: 0xDBD5,
- 22726 - 11905: 0x89AE,
- 22727 - 11905: 0x89AF,
- 22728 - 11905: 0x89B0,
- 22729 - 11905: 0x89B1,
- 22730 - 11905: 0x89B2,
- 22731 - 11905: 0x89B3,
- 22732 - 11905: 0x89B4,
- 22733 - 11905: 0x89B5,
- 22734 - 11905: 0x89B6,
- 22735 - 11905: 0x89B7,
- 22736 - 11905: 0x89B8,
- 22737 - 11905: 0xDBD6,
- 22738 - 11905: 0x89B9,
- 22739 - 11905: 0x89BA,
- 22740 - 11905: 0x89BB,
- 22741 - 11905: 0xBABE,
- 22742 - 11905: 0x89BC,
- 22743 - 11905: 0x89BD,
- 22744 - 11905: 0x89BE,
- 22745 - 11905: 0x89BF,
- 22746 - 11905: 0x89C0,
- 22747 - 11905: 0x89C1,
- 22748 - 11905: 0x89C2,
- 22749 - 11905: 0x89C3,
- 22750 - 11905: 0x89C4,
- 22751 - 11905: 0x89C5,
- 22752 - 11905: 0x89C6,
- 22753 - 11905: 0x89C7,
- 22754 - 11905: 0x89C8,
- 22755 - 11905: 0x89C9,
- 22756 - 11905: 0xC8C0,
- 22757 - 11905: 0x89CA,
- 22758 - 11905: 0x89CB,
- 22759 - 11905: 0x89CC,
- 22760 - 11905: 0x89CD,
- 22761 - 11905: 0x89CE,
- 22762 - 11905: 0x89CF,
- 22763 - 11905: 0xCABF,
- 22764 - 11905: 0xC8C9,
- 22765 - 11905: 0x89D0,
- 22766 - 11905: 0xD7B3,
- 22767 - 11905: 0x89D1,
- 22768 - 11905: 0xC9F9,
- 22769 - 11905: 0x89D2,
- 22770 - 11905: 0x89D3,
- 22771 - 11905: 0xBFC7,
- 22772 - 11905: 0x89D4,
- 22773 - 11905: 0x89D5,
- 22774 - 11905: 0xBAF8,
- 22775 - 11905: 0x89D6,
- 22776 - 11905: 0x89D7,
- 22777 - 11905: 0xD2BC,
- 22778 - 11905: 0x89D8,
- 22779 - 11905: 0x89D9,
- 22780 - 11905: 0x89DA,
- 22781 - 11905: 0x89DB,
- 22782 - 11905: 0x89DC,
- 22783 - 11905: 0x89DD,
- 22784 - 11905: 0x89DE,
- 22785 - 11905: 0x89DF,
- 22786 - 11905: 0xE2BA,
- 22787 - 11905: 0x89E0,
- 22788 - 11905: 0xB4A6,
- 22789 - 11905: 0x89E1,
- 22790 - 11905: 0x89E2,
- 22791 - 11905: 0xB1B8,
- 22792 - 11905: 0x89E3,
- 22793 - 11905: 0x89E4,
- 22794 - 11905: 0x89E5,
- 22795 - 11905: 0x89E6,
- 22796 - 11905: 0x89E7,
- 22797 - 11905: 0xB8B4,
- 22798 - 11905: 0x89E8,
- 22799 - 11905: 0xCFC4,
- 22800 - 11905: 0x89E9,
- 22801 - 11905: 0x89EA,
- 22802 - 11905: 0x89EB,
- 22803 - 11905: 0x89EC,
- 22804 - 11905: 0xD9E7,
- 22805 - 11905: 0xCFA6,
- 22806 - 11905: 0xCDE2,
- 22807 - 11905: 0x89ED,
- 22808 - 11905: 0x89EE,
- 22809 - 11905: 0xD9ED,
- 22810 - 11905: 0xB6E0,
- 22811 - 11905: 0x89EF,
- 22812 - 11905: 0xD2B9,
- 22813 - 11905: 0x89F0,
- 22814 - 11905: 0x89F1,
- 22815 - 11905: 0xB9BB,
- 22816 - 11905: 0x89F2,
- 22817 - 11905: 0x89F3,
- 22818 - 11905: 0x89F4,
- 22819 - 11905: 0x89F5,
- 22820 - 11905: 0xE2B9,
- 22821 - 11905: 0xE2B7,
- 22822 - 11905: 0x89F6,
- 22823 - 11905: 0xB4F3,
- 22824 - 11905: 0x89F7,
- 22825 - 11905: 0xCCEC,
- 22826 - 11905: 0xCCAB,
- 22827 - 11905: 0xB7F2,
- 22828 - 11905: 0x89F8,
- 22829 - 11905: 0xD8B2,
- 22830 - 11905: 0xD1EB,
- 22831 - 11905: 0xBABB,
- 22832 - 11905: 0x89F9,
- 22833 - 11905: 0xCAA7,
- 22834 - 11905: 0x89FA,
- 22835 - 11905: 0x89FB,
- 22836 - 11905: 0xCDB7,
- 22837 - 11905: 0x89FC,
- 22838 - 11905: 0x89FD,
- 22839 - 11905: 0xD2C4,
- 22840 - 11905: 0xBFE4,
- 22841 - 11905: 0xBCD0,
- 22842 - 11905: 0xB6E1,
- 22843 - 11905: 0x89FE,
- 22844 - 11905: 0xDEC5,
- 22845 - 11905: 0x8A40,
- 22846 - 11905: 0x8A41,
- 22847 - 11905: 0x8A42,
- 22848 - 11905: 0x8A43,
- 22849 - 11905: 0xDEC6,
- 22850 - 11905: 0xDBBC,
- 22851 - 11905: 0x8A44,
- 22852 - 11905: 0xD1D9,
- 22853 - 11905: 0x8A45,
- 22854 - 11905: 0x8A46,
- 22855 - 11905: 0xC6E6,
- 22856 - 11905: 0xC4CE,
- 22857 - 11905: 0xB7EE,
- 22858 - 11905: 0x8A47,
- 22859 - 11905: 0xB7DC,
- 22860 - 11905: 0x8A48,
- 22861 - 11905: 0x8A49,
- 22862 - 11905: 0xBFFC,
- 22863 - 11905: 0xD7E0,
- 22864 - 11905: 0x8A4A,
- 22865 - 11905: 0xC6F5,
- 22866 - 11905: 0x8A4B,
- 22867 - 11905: 0x8A4C,
- 22868 - 11905: 0xB1BC,
- 22869 - 11905: 0xDEC8,
- 22870 - 11905: 0xBDB1,
- 22871 - 11905: 0xCCD7,
- 22872 - 11905: 0xDECA,
- 22873 - 11905: 0x8A4D,
- 22874 - 11905: 0xDEC9,
- 22875 - 11905: 0x8A4E,
- 22876 - 11905: 0x8A4F,
- 22877 - 11905: 0x8A50,
- 22878 - 11905: 0x8A51,
- 22879 - 11905: 0x8A52,
- 22880 - 11905: 0xB5EC,
- 22881 - 11905: 0x8A53,
- 22882 - 11905: 0xC9DD,
- 22883 - 11905: 0x8A54,
- 22884 - 11905: 0x8A55,
- 22885 - 11905: 0xB0C2,
- 22886 - 11905: 0x8A56,
- 22887 - 11905: 0x8A57,
- 22888 - 11905: 0x8A58,
- 22889 - 11905: 0x8A59,
- 22890 - 11905: 0x8A5A,
- 22891 - 11905: 0x8A5B,
- 22892 - 11905: 0x8A5C,
- 22893 - 11905: 0x8A5D,
- 22894 - 11905: 0x8A5E,
- 22895 - 11905: 0x8A5F,
- 22896 - 11905: 0x8A60,
- 22897 - 11905: 0x8A61,
- 22898 - 11905: 0x8A62,
- 22899 - 11905: 0xC5AE,
- 22900 - 11905: 0xC5AB,
- 22901 - 11905: 0x8A63,
- 22902 - 11905: 0xC4CC,
- 22903 - 11905: 0x8A64,
- 22904 - 11905: 0xBCE9,
- 22905 - 11905: 0xCBFD,
- 22906 - 11905: 0x8A65,
- 22907 - 11905: 0x8A66,
- 22908 - 11905: 0x8A67,
- 22909 - 11905: 0xBAC3,
- 22910 - 11905: 0x8A68,
- 22911 - 11905: 0x8A69,
- 22912 - 11905: 0x8A6A,
- 22913 - 11905: 0xE5F9,
- 22914 - 11905: 0xC8E7,
- 22915 - 11905: 0xE5FA,
- 22916 - 11905: 0xCDFD,
- 22917 - 11905: 0x8A6B,
- 22918 - 11905: 0xD7B1,
- 22919 - 11905: 0xB8BE,
- 22920 - 11905: 0xC2E8,
- 22921 - 11905: 0x8A6C,
- 22922 - 11905: 0xC8D1,
- 22923 - 11905: 0x8A6D,
- 22924 - 11905: 0x8A6E,
- 22925 - 11905: 0xE5FB,
- 22926 - 11905: 0x8A6F,
- 22927 - 11905: 0x8A70,
- 22928 - 11905: 0x8A71,
- 22929 - 11905: 0x8A72,
- 22930 - 11905: 0xB6CA,
- 22931 - 11905: 0xBCCB,
- 22932 - 11905: 0x8A73,
- 22933 - 11905: 0x8A74,
- 22934 - 11905: 0xD1FD,
- 22935 - 11905: 0xE6A1,
- 22936 - 11905: 0x8A75,
- 22937 - 11905: 0xC3EE,
- 22938 - 11905: 0x8A76,
- 22939 - 11905: 0x8A77,
- 22940 - 11905: 0x8A78,
- 22941 - 11905: 0x8A79,
- 22942 - 11905: 0xE6A4,
- 22943 - 11905: 0x8A7A,
- 22944 - 11905: 0x8A7B,
- 22945 - 11905: 0x8A7C,
- 22946 - 11905: 0x8A7D,
- 22947 - 11905: 0xE5FE,
- 22948 - 11905: 0xE6A5,
- 22949 - 11905: 0xCDD7,
- 22950 - 11905: 0x8A7E,
- 22951 - 11905: 0x8A80,
- 22952 - 11905: 0xB7C1,
- 22953 - 11905: 0xE5FC,
- 22954 - 11905: 0xE5FD,
- 22955 - 11905: 0xE6A3,
- 22956 - 11905: 0x8A81,
- 22957 - 11905: 0x8A82,
- 22958 - 11905: 0xC4DD,
- 22959 - 11905: 0xE6A8,
- 22960 - 11905: 0x8A83,
- 22961 - 11905: 0x8A84,
- 22962 - 11905: 0xE6A7,
- 22963 - 11905: 0x8A85,
- 22964 - 11905: 0x8A86,
- 22965 - 11905: 0x8A87,
- 22966 - 11905: 0x8A88,
- 22967 - 11905: 0x8A89,
- 22968 - 11905: 0x8A8A,
- 22969 - 11905: 0xC3C3,
- 22970 - 11905: 0x8A8B,
- 22971 - 11905: 0xC6DE,
- 22972 - 11905: 0x8A8C,
- 22973 - 11905: 0x8A8D,
- 22974 - 11905: 0xE6AA,
- 22975 - 11905: 0x8A8E,
- 22976 - 11905: 0x8A8F,
- 22977 - 11905: 0x8A90,
- 22978 - 11905: 0x8A91,
- 22979 - 11905: 0x8A92,
- 22980 - 11905: 0x8A93,
- 22981 - 11905: 0x8A94,
- 22982 - 11905: 0xC4B7,
- 22983 - 11905: 0x8A95,
- 22984 - 11905: 0x8A96,
- 22985 - 11905: 0x8A97,
- 22986 - 11905: 0xE6A2,
- 22987 - 11905: 0xCABC,
- 22988 - 11905: 0x8A98,
- 22989 - 11905: 0x8A99,
- 22990 - 11905: 0x8A9A,
- 22991 - 11905: 0x8A9B,
- 22992 - 11905: 0xBDE3,
- 22993 - 11905: 0xB9C3,
- 22994 - 11905: 0xE6A6,
- 22995 - 11905: 0xD0D5,
- 22996 - 11905: 0xCEAF,
- 22997 - 11905: 0x8A9C,
- 22998 - 11905: 0x8A9D,
- 22999 - 11905: 0xE6A9,
- 23000 - 11905: 0xE6B0,
- 23001 - 11905: 0x8A9E,
- 23002 - 11905: 0xD2A6,
- 23003 - 11905: 0x8A9F,
- 23004 - 11905: 0xBDAA,
- 23005 - 11905: 0xE6AD,
- 23006 - 11905: 0x8AA0,
- 23007 - 11905: 0x8AA1,
- 23008 - 11905: 0x8AA2,
- 23009 - 11905: 0x8AA3,
- 23010 - 11905: 0x8AA4,
- 23011 - 11905: 0xE6AF,
- 23012 - 11905: 0x8AA5,
- 23013 - 11905: 0xC0D1,
- 23014 - 11905: 0x8AA6,
- 23015 - 11905: 0x8AA7,
- 23016 - 11905: 0xD2CC,
- 23017 - 11905: 0x8AA8,
- 23018 - 11905: 0x8AA9,
- 23019 - 11905: 0x8AAA,
- 23020 - 11905: 0xBCA7,
- 23021 - 11905: 0x8AAB,
- 23022 - 11905: 0x8AAC,
- 23023 - 11905: 0x8AAD,
- 23024 - 11905: 0x8AAE,
- 23025 - 11905: 0x8AAF,
- 23026 - 11905: 0x8AB0,
- 23027 - 11905: 0x8AB1,
- 23028 - 11905: 0x8AB2,
- 23029 - 11905: 0x8AB3,
- 23030 - 11905: 0x8AB4,
- 23031 - 11905: 0x8AB5,
- 23032 - 11905: 0x8AB6,
- 23033 - 11905: 0xE6B1,
- 23034 - 11905: 0x8AB7,
- 23035 - 11905: 0xD2F6,
- 23036 - 11905: 0x8AB8,
- 23037 - 11905: 0x8AB9,
- 23038 - 11905: 0x8ABA,
- 23039 - 11905: 0xD7CB,
- 23040 - 11905: 0x8ABB,
- 23041 - 11905: 0xCDFE,
- 23042 - 11905: 0x8ABC,
- 23043 - 11905: 0xCDDE,
- 23044 - 11905: 0xC2A6,
- 23045 - 11905: 0xE6AB,
- 23046 - 11905: 0xE6AC,
- 23047 - 11905: 0xBDBF,
- 23048 - 11905: 0xE6AE,
- 23049 - 11905: 0xE6B3,
- 23050 - 11905: 0x8ABD,
- 23051 - 11905: 0x8ABE,
- 23052 - 11905: 0xE6B2,
- 23053 - 11905: 0x8ABF,
- 23054 - 11905: 0x8AC0,
- 23055 - 11905: 0x8AC1,
- 23056 - 11905: 0x8AC2,
- 23057 - 11905: 0xE6B6,
- 23058 - 11905: 0x8AC3,
- 23059 - 11905: 0xE6B8,
- 23060 - 11905: 0x8AC4,
- 23061 - 11905: 0x8AC5,
- 23062 - 11905: 0x8AC6,
- 23063 - 11905: 0x8AC7,
- 23064 - 11905: 0xC4EF,
- 23065 - 11905: 0x8AC8,
- 23066 - 11905: 0x8AC9,
- 23067 - 11905: 0x8ACA,
- 23068 - 11905: 0xC4C8,
- 23069 - 11905: 0x8ACB,
- 23070 - 11905: 0x8ACC,
- 23071 - 11905: 0xBEEA,
- 23072 - 11905: 0xC9EF,
- 23073 - 11905: 0x8ACD,
- 23074 - 11905: 0x8ACE,
- 23075 - 11905: 0xE6B7,
- 23076 - 11905: 0x8ACF,
- 23077 - 11905: 0xB6F0,
- 23078 - 11905: 0x8AD0,
- 23079 - 11905: 0x8AD1,
- 23080 - 11905: 0x8AD2,
- 23081 - 11905: 0xC3E4,
- 23082 - 11905: 0x8AD3,
- 23083 - 11905: 0x8AD4,
- 23084 - 11905: 0x8AD5,
- 23085 - 11905: 0x8AD6,
- 23086 - 11905: 0x8AD7,
- 23087 - 11905: 0x8AD8,
- 23088 - 11905: 0x8AD9,
- 23089 - 11905: 0xD3E9,
- 23090 - 11905: 0xE6B4,
- 23091 - 11905: 0x8ADA,
- 23092 - 11905: 0xE6B5,
- 23093 - 11905: 0x8ADB,
- 23094 - 11905: 0xC8A2,
- 23095 - 11905: 0x8ADC,
- 23096 - 11905: 0x8ADD,
- 23097 - 11905: 0x8ADE,
- 23098 - 11905: 0x8ADF,
- 23099 - 11905: 0x8AE0,
- 23100 - 11905: 0xE6BD,
- 23101 - 11905: 0x8AE1,
- 23102 - 11905: 0x8AE2,
- 23103 - 11905: 0x8AE3,
- 23104 - 11905: 0xE6B9,
- 23105 - 11905: 0x8AE4,
- 23106 - 11905: 0x8AE5,
- 23107 - 11905: 0x8AE6,
- 23108 - 11905: 0x8AE7,
- 23109 - 11905: 0x8AE8,
- 23110 - 11905: 0xC6C5,
- 23111 - 11905: 0x8AE9,
- 23112 - 11905: 0x8AEA,
- 23113 - 11905: 0xCDF1,
- 23114 - 11905: 0xE6BB,
- 23115 - 11905: 0x8AEB,
- 23116 - 11905: 0x8AEC,
- 23117 - 11905: 0x8AED,
- 23118 - 11905: 0x8AEE,
- 23119 - 11905: 0x8AEF,
- 23120 - 11905: 0x8AF0,
- 23121 - 11905: 0x8AF1,
- 23122 - 11905: 0x8AF2,
- 23123 - 11905: 0x8AF3,
- 23124 - 11905: 0x8AF4,
- 23125 - 11905: 0xE6BC,
- 23126 - 11905: 0x8AF5,
- 23127 - 11905: 0x8AF6,
- 23128 - 11905: 0x8AF7,
- 23129 - 11905: 0x8AF8,
- 23130 - 11905: 0xBBE9,
- 23131 - 11905: 0x8AF9,
- 23132 - 11905: 0x8AFA,
- 23133 - 11905: 0x8AFB,
- 23134 - 11905: 0x8AFC,
- 23135 - 11905: 0x8AFD,
- 23136 - 11905: 0x8AFE,
- 23137 - 11905: 0x8B40,
- 23138 - 11905: 0xE6BE,
- 23139 - 11905: 0x8B41,
- 23140 - 11905: 0x8B42,
- 23141 - 11905: 0x8B43,
- 23142 - 11905: 0x8B44,
- 23143 - 11905: 0xE6BA,
- 23144 - 11905: 0x8B45,
- 23145 - 11905: 0x8B46,
- 23146 - 11905: 0xC0B7,
- 23147 - 11905: 0x8B47,
- 23148 - 11905: 0x8B48,
- 23149 - 11905: 0x8B49,
- 23150 - 11905: 0x8B4A,
- 23151 - 11905: 0x8B4B,
- 23152 - 11905: 0x8B4C,
- 23153 - 11905: 0x8B4D,
- 23154 - 11905: 0x8B4E,
- 23155 - 11905: 0x8B4F,
- 23156 - 11905: 0xD3A4,
- 23157 - 11905: 0xE6BF,
- 23158 - 11905: 0xC9F4,
- 23159 - 11905: 0xE6C3,
- 23160 - 11905: 0x8B50,
- 23161 - 11905: 0x8B51,
- 23162 - 11905: 0xE6C4,
- 23163 - 11905: 0x8B52,
- 23164 - 11905: 0x8B53,
- 23165 - 11905: 0x8B54,
- 23166 - 11905: 0x8B55,
- 23167 - 11905: 0xD0F6,
- 23168 - 11905: 0x8B56,
- 23169 - 11905: 0x8B57,
- 23170 - 11905: 0x8B58,
- 23171 - 11905: 0x8B59,
- 23172 - 11905: 0x8B5A,
- 23173 - 11905: 0x8B5B,
- 23174 - 11905: 0x8B5C,
- 23175 - 11905: 0x8B5D,
- 23176 - 11905: 0x8B5E,
- 23177 - 11905: 0x8B5F,
- 23178 - 11905: 0x8B60,
- 23179 - 11905: 0x8B61,
- 23180 - 11905: 0x8B62,
- 23181 - 11905: 0x8B63,
- 23182 - 11905: 0x8B64,
- 23183 - 11905: 0x8B65,
- 23184 - 11905: 0x8B66,
- 23185 - 11905: 0x8B67,
- 23186 - 11905: 0xC3BD,
- 23187 - 11905: 0x8B68,
- 23188 - 11905: 0x8B69,
- 23189 - 11905: 0x8B6A,
- 23190 - 11905: 0x8B6B,
- 23191 - 11905: 0x8B6C,
- 23192 - 11905: 0x8B6D,
- 23193 - 11905: 0x8B6E,
- 23194 - 11905: 0xC3C4,
- 23195 - 11905: 0xE6C2,
- 23196 - 11905: 0x8B6F,
- 23197 - 11905: 0x8B70,
- 23198 - 11905: 0x8B71,
- 23199 - 11905: 0x8B72,
- 23200 - 11905: 0x8B73,
- 23201 - 11905: 0x8B74,
- 23202 - 11905: 0x8B75,
- 23203 - 11905: 0x8B76,
- 23204 - 11905: 0x8B77,
- 23205 - 11905: 0x8B78,
- 23206 - 11905: 0x8B79,
- 23207 - 11905: 0x8B7A,
- 23208 - 11905: 0x8B7B,
- 23209 - 11905: 0x8B7C,
- 23210 - 11905: 0xE6C1,
- 23211 - 11905: 0x8B7D,
- 23212 - 11905: 0x8B7E,
- 23213 - 11905: 0x8B80,
- 23214 - 11905: 0x8B81,
- 23215 - 11905: 0x8B82,
- 23216 - 11905: 0x8B83,
- 23217 - 11905: 0x8B84,
- 23218 - 11905: 0xE6C7,
- 23219 - 11905: 0xCFB1,
- 23220 - 11905: 0x8B85,
- 23221 - 11905: 0xEBF4,
- 23222 - 11905: 0x8B86,
- 23223 - 11905: 0x8B87,
- 23224 - 11905: 0xE6CA,
- 23225 - 11905: 0x8B88,
- 23226 - 11905: 0x8B89,
- 23227 - 11905: 0x8B8A,
- 23228 - 11905: 0x8B8B,
- 23229 - 11905: 0x8B8C,
- 23230 - 11905: 0xE6C5,
- 23231 - 11905: 0x8B8D,
- 23232 - 11905: 0x8B8E,
- 23233 - 11905: 0xBCDE,
- 23234 - 11905: 0xC9A9,
- 23235 - 11905: 0x8B8F,
- 23236 - 11905: 0x8B90,
- 23237 - 11905: 0x8B91,
- 23238 - 11905: 0x8B92,
- 23239 - 11905: 0x8B93,
- 23240 - 11905: 0x8B94,
- 23241 - 11905: 0xBCB5,
- 23242 - 11905: 0x8B95,
- 23243 - 11905: 0x8B96,
- 23244 - 11905: 0xCFD3,
- 23245 - 11905: 0x8B97,
- 23246 - 11905: 0x8B98,
- 23247 - 11905: 0x8B99,
- 23248 - 11905: 0x8B9A,
- 23249 - 11905: 0x8B9B,
- 23250 - 11905: 0xE6C8,
- 23251 - 11905: 0x8B9C,
- 23252 - 11905: 0xE6C9,
- 23253 - 11905: 0x8B9D,
- 23254 - 11905: 0xE6CE,
- 23255 - 11905: 0x8B9E,
- 23256 - 11905: 0xE6D0,
- 23257 - 11905: 0x8B9F,
- 23258 - 11905: 0x8BA0,
- 23259 - 11905: 0x8BA1,
- 23260 - 11905: 0xE6D1,
- 23261 - 11905: 0x8BA2,
- 23262 - 11905: 0x8BA3,
- 23263 - 11905: 0x8BA4,
- 23264 - 11905: 0xE6CB,
- 23265 - 11905: 0xB5D5,
- 23266 - 11905: 0x8BA5,
- 23267 - 11905: 0xE6CC,
- 23268 - 11905: 0x8BA6,
- 23269 - 11905: 0x8BA7,
- 23270 - 11905: 0xE6CF,
- 23271 - 11905: 0x8BA8,
- 23272 - 11905: 0x8BA9,
- 23273 - 11905: 0xC4DB,
- 23274 - 11905: 0x8BAA,
- 23275 - 11905: 0xE6C6,
- 23276 - 11905: 0x8BAB,
- 23277 - 11905: 0x8BAC,
- 23278 - 11905: 0x8BAD,
- 23279 - 11905: 0x8BAE,
- 23280 - 11905: 0x8BAF,
- 23281 - 11905: 0xE6CD,
- 23282 - 11905: 0x8BB0,
- 23283 - 11905: 0x8BB1,
- 23284 - 11905: 0x8BB2,
- 23285 - 11905: 0x8BB3,
- 23286 - 11905: 0x8BB4,
- 23287 - 11905: 0x8BB5,
- 23288 - 11905: 0x8BB6,
- 23289 - 11905: 0x8BB7,
- 23290 - 11905: 0x8BB8,
- 23291 - 11905: 0x8BB9,
- 23292 - 11905: 0x8BBA,
- 23293 - 11905: 0x8BBB,
- 23294 - 11905: 0x8BBC,
- 23295 - 11905: 0x8BBD,
- 23296 - 11905: 0x8BBE,
- 23297 - 11905: 0x8BBF,
- 23298 - 11905: 0x8BC0,
- 23299 - 11905: 0x8BC1,
- 23300 - 11905: 0x8BC2,
- 23301 - 11905: 0x8BC3,
- 23302 - 11905: 0x8BC4,
- 23303 - 11905: 0x8BC5,
- 23304 - 11905: 0x8BC6,
- 23305 - 11905: 0xE6D2,
- 23306 - 11905: 0x8BC7,
- 23307 - 11905: 0x8BC8,
- 23308 - 11905: 0x8BC9,
- 23309 - 11905: 0x8BCA,
- 23310 - 11905: 0x8BCB,
- 23311 - 11905: 0x8BCC,
- 23312 - 11905: 0x8BCD,
- 23313 - 11905: 0x8BCE,
- 23314 - 11905: 0x8BCF,
- 23315 - 11905: 0x8BD0,
- 23316 - 11905: 0x8BD1,
- 23317 - 11905: 0x8BD2,
- 23318 - 11905: 0xE6D4,
- 23319 - 11905: 0xE6D3,
- 23320 - 11905: 0x8BD3,
- 23321 - 11905: 0x8BD4,
- 23322 - 11905: 0x8BD5,
- 23323 - 11905: 0x8BD6,
- 23324 - 11905: 0x8BD7,
- 23325 - 11905: 0x8BD8,
- 23326 - 11905: 0x8BD9,
- 23327 - 11905: 0x8BDA,
- 23328 - 11905: 0x8BDB,
- 23329 - 11905: 0x8BDC,
- 23330 - 11905: 0x8BDD,
- 23331 - 11905: 0x8BDE,
- 23332 - 11905: 0x8BDF,
- 23333 - 11905: 0x8BE0,
- 23334 - 11905: 0x8BE1,
- 23335 - 11905: 0x8BE2,
- 23336 - 11905: 0x8BE3,
- 23337 - 11905: 0x8BE4,
- 23338 - 11905: 0x8BE5,
- 23339 - 11905: 0x8BE6,
- 23340 - 11905: 0x8BE7,
- 23341 - 11905: 0x8BE8,
- 23342 - 11905: 0x8BE9,
- 23343 - 11905: 0x8BEA,
- 23344 - 11905: 0x8BEB,
- 23345 - 11905: 0x8BEC,
- 23346 - 11905: 0xE6D5,
- 23347 - 11905: 0x8BED,
- 23348 - 11905: 0xD9F8,
- 23349 - 11905: 0x8BEE,
- 23350 - 11905: 0x8BEF,
- 23351 - 11905: 0xE6D6,
- 23352 - 11905: 0x8BF0,
- 23353 - 11905: 0x8BF1,
- 23354 - 11905: 0x8BF2,
- 23355 - 11905: 0x8BF3,
- 23356 - 11905: 0x8BF4,
- 23357 - 11905: 0x8BF5,
- 23358 - 11905: 0x8BF6,
- 23359 - 11905: 0x8BF7,
- 23360 - 11905: 0xE6D7,
- 23361 - 11905: 0x8BF8,
- 23362 - 11905: 0x8BF9,
- 23363 - 11905: 0x8BFA,
- 23364 - 11905: 0x8BFB,
- 23365 - 11905: 0x8BFC,
- 23366 - 11905: 0x8BFD,
- 23367 - 11905: 0x8BFE,
- 23368 - 11905: 0x8C40,
- 23369 - 11905: 0x8C41,
- 23370 - 11905: 0x8C42,
- 23371 - 11905: 0x8C43,
- 23372 - 11905: 0x8C44,
- 23373 - 11905: 0x8C45,
- 23374 - 11905: 0x8C46,
- 23375 - 11905: 0x8C47,
- 23376 - 11905: 0xD7D3,
- 23377 - 11905: 0xE6DD,
- 23378 - 11905: 0x8C48,
- 23379 - 11905: 0xE6DE,
- 23380 - 11905: 0xBFD7,
- 23381 - 11905: 0xD4D0,
- 23382 - 11905: 0x8C49,
- 23383 - 11905: 0xD7D6,
- 23384 - 11905: 0xB4E6,
- 23385 - 11905: 0xCBEF,
- 23386 - 11905: 0xE6DA,
- 23387 - 11905: 0xD8C3,
- 23388 - 11905: 0xD7CE,
- 23389 - 11905: 0xD0A2,
- 23390 - 11905: 0x8C4A,
- 23391 - 11905: 0xC3CF,
- 23392 - 11905: 0x8C4B,
- 23393 - 11905: 0x8C4C,
- 23394 - 11905: 0xE6DF,
- 23395 - 11905: 0xBCBE,
- 23396 - 11905: 0xB9C2,
- 23397 - 11905: 0xE6DB,
- 23398 - 11905: 0xD1A7,
- 23399 - 11905: 0x8C4D,
- 23400 - 11905: 0x8C4E,
- 23401 - 11905: 0xBAA2,
- 23402 - 11905: 0xC2CF,
- 23403 - 11905: 0x8C4F,
- 23404 - 11905: 0xD8AB,
- 23405 - 11905: 0x8C50,
- 23406 - 11905: 0x8C51,
- 23407 - 11905: 0x8C52,
- 23408 - 11905: 0xCAEB,
- 23409 - 11905: 0xE5EE,
- 23410 - 11905: 0x8C53,
- 23411 - 11905: 0xE6DC,
- 23412 - 11905: 0x8C54,
- 23413 - 11905: 0xB7F5,
- 23414 - 11905: 0x8C55,
- 23415 - 11905: 0x8C56,
- 23416 - 11905: 0x8C57,
- 23417 - 11905: 0x8C58,
- 23418 - 11905: 0xC8E6,
- 23419 - 11905: 0x8C59,
- 23420 - 11905: 0x8C5A,
- 23421 - 11905: 0xC4F5,
- 23422 - 11905: 0x8C5B,
- 23423 - 11905: 0x8C5C,
- 23424 - 11905: 0xE5B2,
- 23425 - 11905: 0xC4FE,
- 23426 - 11905: 0x8C5D,
- 23427 - 11905: 0xCBFC,
- 23428 - 11905: 0xE5B3,
- 23429 - 11905: 0xD5AC,
- 23430 - 11905: 0x8C5E,
- 23431 - 11905: 0xD3EE,
- 23432 - 11905: 0xCAD8,
- 23433 - 11905: 0xB0B2,
- 23434 - 11905: 0x8C5F,
- 23435 - 11905: 0xCBCE,
- 23436 - 11905: 0xCDEA,
- 23437 - 11905: 0x8C60,
- 23438 - 11905: 0x8C61,
- 23439 - 11905: 0xBAEA,
- 23440 - 11905: 0x8C62,
- 23441 - 11905: 0x8C63,
- 23442 - 11905: 0x8C64,
- 23443 - 11905: 0xE5B5,
- 23444 - 11905: 0x8C65,
- 23445 - 11905: 0xE5B4,
- 23446 - 11905: 0x8C66,
- 23447 - 11905: 0xD7DA,
- 23448 - 11905: 0xB9D9,
- 23449 - 11905: 0xD6E6,
- 23450 - 11905: 0xB6A8,
- 23451 - 11905: 0xCDF0,
- 23452 - 11905: 0xD2CB,
- 23453 - 11905: 0xB1A6,
- 23454 - 11905: 0xCAB5,
- 23455 - 11905: 0x8C67,
- 23456 - 11905: 0xB3E8,
- 23457 - 11905: 0xC9F3,
- 23458 - 11905: 0xBFCD,
- 23459 - 11905: 0xD0FB,
- 23460 - 11905: 0xCAD2,
- 23461 - 11905: 0xE5B6,
- 23462 - 11905: 0xBBC2,
- 23463 - 11905: 0x8C68,
- 23464 - 11905: 0x8C69,
- 23465 - 11905: 0x8C6A,
- 23466 - 11905: 0xCFDC,
- 23467 - 11905: 0xB9AC,
- 23468 - 11905: 0x8C6B,
- 23469 - 11905: 0x8C6C,
- 23470 - 11905: 0x8C6D,
- 23471 - 11905: 0x8C6E,
- 23472 - 11905: 0xD4D7,
- 23473 - 11905: 0x8C6F,
- 23474 - 11905: 0x8C70,
- 23475 - 11905: 0xBAA6,
- 23476 - 11905: 0xD1E7,
- 23477 - 11905: 0xCFFC,
- 23478 - 11905: 0xBCD2,
- 23479 - 11905: 0x8C71,
- 23480 - 11905: 0xE5B7,
- 23481 - 11905: 0xC8DD,
- 23482 - 11905: 0x8C72,
- 23483 - 11905: 0x8C73,
- 23484 - 11905: 0x8C74,
- 23485 - 11905: 0xBFED,
- 23486 - 11905: 0xB1F6,
- 23487 - 11905: 0xCBDE,
- 23488 - 11905: 0x8C75,
- 23489 - 11905: 0x8C76,
- 23490 - 11905: 0xBCC5,
- 23491 - 11905: 0x8C77,
- 23492 - 11905: 0xBCC4,
- 23493 - 11905: 0xD2FA,
- 23494 - 11905: 0xC3DC,
- 23495 - 11905: 0xBFDC,
- 23496 - 11905: 0x8C78,
- 23497 - 11905: 0x8C79,
- 23498 - 11905: 0x8C7A,
- 23499 - 11905: 0x8C7B,
- 23500 - 11905: 0xB8BB,
- 23501 - 11905: 0x8C7C,
- 23502 - 11905: 0x8C7D,
- 23503 - 11905: 0x8C7E,
- 23504 - 11905: 0xC3C2,
- 23505 - 11905: 0x8C80,
- 23506 - 11905: 0xBAAE,
- 23507 - 11905: 0xD4A2,
- 23508 - 11905: 0x8C81,
- 23509 - 11905: 0x8C82,
- 23510 - 11905: 0x8C83,
- 23511 - 11905: 0x8C84,
- 23512 - 11905: 0x8C85,
- 23513 - 11905: 0x8C86,
- 23514 - 11905: 0x8C87,
- 23515 - 11905: 0x8C88,
- 23516 - 11905: 0x8C89,
- 23517 - 11905: 0xC7DE,
- 23518 - 11905: 0xC4AF,
- 23519 - 11905: 0xB2EC,
- 23520 - 11905: 0x8C8A,
- 23521 - 11905: 0xB9D1,
- 23522 - 11905: 0x8C8B,
- 23523 - 11905: 0x8C8C,
- 23524 - 11905: 0xE5BB,
- 23525 - 11905: 0xC1C8,
- 23526 - 11905: 0x8C8D,
- 23527 - 11905: 0x8C8E,
- 23528 - 11905: 0xD5AF,
- 23529 - 11905: 0x8C8F,
- 23530 - 11905: 0x8C90,
- 23531 - 11905: 0x8C91,
- 23532 - 11905: 0x8C92,
- 23533 - 11905: 0x8C93,
- 23534 - 11905: 0xE5BC,
- 23535 - 11905: 0x8C94,
- 23536 - 11905: 0xE5BE,
- 23537 - 11905: 0x8C95,
- 23538 - 11905: 0x8C96,
- 23539 - 11905: 0x8C97,
- 23540 - 11905: 0x8C98,
- 23541 - 11905: 0x8C99,
- 23542 - 11905: 0x8C9A,
- 23543 - 11905: 0x8C9B,
- 23544 - 11905: 0xB4E7,
- 23545 - 11905: 0xB6D4,
- 23546 - 11905: 0xCBC2,
- 23547 - 11905: 0xD1B0,
- 23548 - 11905: 0xB5BC,
- 23549 - 11905: 0x8C9C,
- 23550 - 11905: 0x8C9D,
- 23551 - 11905: 0xCAD9,
- 23552 - 11905: 0x8C9E,
- 23553 - 11905: 0xB7E2,
- 23554 - 11905: 0x8C9F,
- 23555 - 11905: 0x8CA0,
- 23556 - 11905: 0xC9E4,
- 23557 - 11905: 0x8CA1,
- 23558 - 11905: 0xBDAB,
- 23559 - 11905: 0x8CA2,
- 23560 - 11905: 0x8CA3,
- 23561 - 11905: 0xCEBE,
- 23562 - 11905: 0xD7F0,
- 23563 - 11905: 0x8CA4,
- 23564 - 11905: 0x8CA5,
- 23565 - 11905: 0x8CA6,
- 23566 - 11905: 0x8CA7,
- 23567 - 11905: 0xD0A1,
- 23568 - 11905: 0x8CA8,
- 23569 - 11905: 0xC9D9,
- 23570 - 11905: 0x8CA9,
- 23571 - 11905: 0x8CAA,
- 23572 - 11905: 0xB6FB,
- 23573 - 11905: 0xE6D8,
- 23574 - 11905: 0xBCE2,
- 23575 - 11905: 0x8CAB,
- 23576 - 11905: 0xB3BE,
- 23577 - 11905: 0x8CAC,
- 23578 - 11905: 0xC9D0,
- 23579 - 11905: 0x8CAD,
- 23580 - 11905: 0xE6D9,
- 23581 - 11905: 0xB3A2,
- 23582 - 11905: 0x8CAE,
- 23583 - 11905: 0x8CAF,
- 23584 - 11905: 0x8CB0,
- 23585 - 11905: 0x8CB1,
- 23586 - 11905: 0xDECC,
- 23587 - 11905: 0x8CB2,
- 23588 - 11905: 0xD3C8,
- 23589 - 11905: 0xDECD,
- 23590 - 11905: 0x8CB3,
- 23591 - 11905: 0xD2A2,
- 23592 - 11905: 0x8CB4,
- 23593 - 11905: 0x8CB5,
- 23594 - 11905: 0x8CB6,
- 23595 - 11905: 0x8CB7,
- 23596 - 11905: 0xDECE,
- 23597 - 11905: 0x8CB8,
- 23598 - 11905: 0x8CB9,
- 23599 - 11905: 0x8CBA,
- 23600 - 11905: 0x8CBB,
- 23601 - 11905: 0xBECD,
- 23602 - 11905: 0x8CBC,
- 23603 - 11905: 0x8CBD,
- 23604 - 11905: 0xDECF,
- 23605 - 11905: 0x8CBE,
- 23606 - 11905: 0x8CBF,
- 23607 - 11905: 0x8CC0,
- 23608 - 11905: 0xCAAC,
- 23609 - 11905: 0xD2FC,
- 23610 - 11905: 0xB3DF,
- 23611 - 11905: 0xE5EA,
- 23612 - 11905: 0xC4E1,
- 23613 - 11905: 0xBEA1,
- 23614 - 11905: 0xCEB2,
- 23615 - 11905: 0xC4F2,
- 23616 - 11905: 0xBED6,
- 23617 - 11905: 0xC6A8,
- 23618 - 11905: 0xB2E3,
- 23619 - 11905: 0x8CC1,
- 23620 - 11905: 0x8CC2,
- 23621 - 11905: 0xBED3,
- 23622 - 11905: 0x8CC3,
- 23623 - 11905: 0x8CC4,
- 23624 - 11905: 0xC7FC,
- 23625 - 11905: 0xCCEB,
- 23626 - 11905: 0xBDEC,
- 23627 - 11905: 0xCEDD,
- 23628 - 11905: 0x8CC5,
- 23629 - 11905: 0x8CC6,
- 23630 - 11905: 0xCABA,
- 23631 - 11905: 0xC6C1,
- 23632 - 11905: 0xE5EC,
- 23633 - 11905: 0xD0BC,
- 23634 - 11905: 0x8CC7,
- 23635 - 11905: 0x8CC8,
- 23636 - 11905: 0x8CC9,
- 23637 - 11905: 0xD5B9,
- 23638 - 11905: 0x8CCA,
- 23639 - 11905: 0x8CCB,
- 23640 - 11905: 0x8CCC,
- 23641 - 11905: 0xE5ED,
- 23642 - 11905: 0x8CCD,
- 23643 - 11905: 0x8CCE,
- 23644 - 11905: 0x8CCF,
- 23645 - 11905: 0x8CD0,
- 23646 - 11905: 0xCAF4,
- 23647 - 11905: 0x8CD1,
- 23648 - 11905: 0xCDC0,
- 23649 - 11905: 0xC2C5,
- 23650 - 11905: 0x8CD2,
- 23651 - 11905: 0xE5EF,
- 23652 - 11905: 0x8CD3,
- 23653 - 11905: 0xC2C4,
- 23654 - 11905: 0xE5F0,
- 23655 - 11905: 0x8CD4,
- 23656 - 11905: 0x8CD5,
- 23657 - 11905: 0x8CD6,
- 23658 - 11905: 0x8CD7,
- 23659 - 11905: 0x8CD8,
- 23660 - 11905: 0x8CD9,
- 23661 - 11905: 0x8CDA,
- 23662 - 11905: 0xE5F8,
- 23663 - 11905: 0xCDCD,
- 23664 - 11905: 0x8CDB,
- 23665 - 11905: 0xC9BD,
- 23666 - 11905: 0x8CDC,
- 23667 - 11905: 0x8CDD,
- 23668 - 11905: 0x8CDE,
- 23669 - 11905: 0x8CDF,
- 23670 - 11905: 0x8CE0,
- 23671 - 11905: 0x8CE1,
- 23672 - 11905: 0x8CE2,
- 23673 - 11905: 0xD2D9,
- 23674 - 11905: 0xE1A8,
- 23675 - 11905: 0x8CE3,
- 23676 - 11905: 0x8CE4,
- 23677 - 11905: 0x8CE5,
- 23678 - 11905: 0x8CE6,
- 23679 - 11905: 0xD3EC,
- 23680 - 11905: 0x8CE7,
- 23681 - 11905: 0xCBEA,
- 23682 - 11905: 0xC6F1,
- 23683 - 11905: 0x8CE8,
- 23684 - 11905: 0x8CE9,
- 23685 - 11905: 0x8CEA,
- 23686 - 11905: 0x8CEB,
- 23687 - 11905: 0x8CEC,
- 23688 - 11905: 0xE1AC,
- 23689 - 11905: 0x8CED,
- 23690 - 11905: 0x8CEE,
- 23691 - 11905: 0x8CEF,
- 23692 - 11905: 0xE1A7,
- 23693 - 11905: 0xE1A9,
- 23694 - 11905: 0x8CF0,
- 23695 - 11905: 0x8CF1,
- 23696 - 11905: 0xE1AA,
- 23697 - 11905: 0xE1AF,
- 23698 - 11905: 0x8CF2,
- 23699 - 11905: 0x8CF3,
- 23700 - 11905: 0xB2ED,
- 23701 - 11905: 0x8CF4,
- 23702 - 11905: 0xE1AB,
- 23703 - 11905: 0xB8DA,
- 23704 - 11905: 0xE1AD,
- 23705 - 11905: 0xE1AE,
- 23706 - 11905: 0xE1B0,
- 23707 - 11905: 0xB5BA,
- 23708 - 11905: 0xE1B1,
- 23709 - 11905: 0x8CF5,
- 23710 - 11905: 0x8CF6,
- 23711 - 11905: 0x8CF7,
- 23712 - 11905: 0x8CF8,
- 23713 - 11905: 0x8CF9,
- 23714 - 11905: 0xE1B3,
- 23715 - 11905: 0xE1B8,
- 23716 - 11905: 0x8CFA,
- 23717 - 11905: 0x8CFB,
- 23718 - 11905: 0x8CFC,
- 23719 - 11905: 0x8CFD,
- 23720 - 11905: 0x8CFE,
- 23721 - 11905: 0xD1D2,
- 23722 - 11905: 0x8D40,
- 23723 - 11905: 0xE1B6,
- 23724 - 11905: 0xE1B5,
- 23725 - 11905: 0xC1EB,
- 23726 - 11905: 0x8D41,
- 23727 - 11905: 0x8D42,
- 23728 - 11905: 0x8D43,
- 23729 - 11905: 0xE1B7,
- 23730 - 11905: 0x8D44,
- 23731 - 11905: 0xD4C0,
- 23732 - 11905: 0x8D45,
- 23733 - 11905: 0xE1B2,
- 23734 - 11905: 0x8D46,
- 23735 - 11905: 0xE1BA,
- 23736 - 11905: 0xB0B6,
- 23737 - 11905: 0x8D47,
- 23738 - 11905: 0x8D48,
- 23739 - 11905: 0x8D49,
- 23740 - 11905: 0x8D4A,
- 23741 - 11905: 0xE1B4,
- 23742 - 11905: 0x8D4B,
- 23743 - 11905: 0xBFF9,
- 23744 - 11905: 0x8D4C,
- 23745 - 11905: 0xE1B9,
- 23746 - 11905: 0x8D4D,
- 23747 - 11905: 0x8D4E,
- 23748 - 11905: 0xE1BB,
- 23749 - 11905: 0x8D4F,
- 23750 - 11905: 0x8D50,
- 23751 - 11905: 0x8D51,
- 23752 - 11905: 0x8D52,
- 23753 - 11905: 0x8D53,
- 23754 - 11905: 0x8D54,
- 23755 - 11905: 0xE1BE,
- 23756 - 11905: 0x8D55,
- 23757 - 11905: 0x8D56,
- 23758 - 11905: 0x8D57,
- 23759 - 11905: 0x8D58,
- 23760 - 11905: 0x8D59,
- 23761 - 11905: 0x8D5A,
- 23762 - 11905: 0xE1BC,
- 23763 - 11905: 0x8D5B,
- 23764 - 11905: 0x8D5C,
- 23765 - 11905: 0x8D5D,
- 23766 - 11905: 0x8D5E,
- 23767 - 11905: 0x8D5F,
- 23768 - 11905: 0x8D60,
- 23769 - 11905: 0xD6C5,
- 23770 - 11905: 0x8D61,
- 23771 - 11905: 0x8D62,
- 23772 - 11905: 0x8D63,
- 23773 - 11905: 0x8D64,
- 23774 - 11905: 0x8D65,
- 23775 - 11905: 0x8D66,
- 23776 - 11905: 0x8D67,
- 23777 - 11905: 0xCFBF,
- 23778 - 11905: 0x8D68,
- 23779 - 11905: 0x8D69,
- 23780 - 11905: 0xE1BD,
- 23781 - 11905: 0xE1BF,
- 23782 - 11905: 0xC2CD,
- 23783 - 11905: 0x8D6A,
- 23784 - 11905: 0xB6EB,
- 23785 - 11905: 0x8D6B,
- 23786 - 11905: 0xD3F8,
- 23787 - 11905: 0x8D6C,
- 23788 - 11905: 0x8D6D,
- 23789 - 11905: 0xC7CD,
- 23790 - 11905: 0x8D6E,
- 23791 - 11905: 0x8D6F,
- 23792 - 11905: 0xB7E5,
- 23793 - 11905: 0x8D70,
- 23794 - 11905: 0x8D71,
- 23795 - 11905: 0x8D72,
- 23796 - 11905: 0x8D73,
- 23797 - 11905: 0x8D74,
- 23798 - 11905: 0x8D75,
- 23799 - 11905: 0x8D76,
- 23800 - 11905: 0x8D77,
- 23801 - 11905: 0x8D78,
- 23802 - 11905: 0x8D79,
- 23803 - 11905: 0xBEFE,
- 23804 - 11905: 0x8D7A,
- 23805 - 11905: 0x8D7B,
- 23806 - 11905: 0x8D7C,
- 23807 - 11905: 0x8D7D,
- 23808 - 11905: 0x8D7E,
- 23809 - 11905: 0x8D80,
- 23810 - 11905: 0xE1C0,
- 23811 - 11905: 0xE1C1,
- 23812 - 11905: 0x8D81,
- 23813 - 11905: 0x8D82,
- 23814 - 11905: 0xE1C7,
- 23815 - 11905: 0xB3E7,
- 23816 - 11905: 0x8D83,
- 23817 - 11905: 0x8D84,
- 23818 - 11905: 0x8D85,
- 23819 - 11905: 0x8D86,
- 23820 - 11905: 0x8D87,
- 23821 - 11905: 0x8D88,
- 23822 - 11905: 0xC6E9,
- 23823 - 11905: 0x8D89,
- 23824 - 11905: 0x8D8A,
- 23825 - 11905: 0x8D8B,
- 23826 - 11905: 0x8D8C,
- 23827 - 11905: 0x8D8D,
- 23828 - 11905: 0xB4DE,
- 23829 - 11905: 0x8D8E,
- 23830 - 11905: 0xD1C2,
- 23831 - 11905: 0x8D8F,
- 23832 - 11905: 0x8D90,
- 23833 - 11905: 0x8D91,
- 23834 - 11905: 0x8D92,
- 23835 - 11905: 0xE1C8,
- 23836 - 11905: 0x8D93,
- 23837 - 11905: 0x8D94,
- 23838 - 11905: 0xE1C6,
- 23839 - 11905: 0x8D95,
- 23840 - 11905: 0x8D96,
- 23841 - 11905: 0x8D97,
- 23842 - 11905: 0x8D98,
- 23843 - 11905: 0x8D99,
- 23844 - 11905: 0xE1C5,
- 23845 - 11905: 0x8D9A,
- 23846 - 11905: 0xE1C3,
- 23847 - 11905: 0xE1C2,
- 23848 - 11905: 0x8D9B,
- 23849 - 11905: 0xB1C0,
- 23850 - 11905: 0x8D9C,
- 23851 - 11905: 0x8D9D,
- 23852 - 11905: 0x8D9E,
- 23853 - 11905: 0xD5B8,
- 23854 - 11905: 0xE1C4,
- 23855 - 11905: 0x8D9F,
- 23856 - 11905: 0x8DA0,
- 23857 - 11905: 0x8DA1,
- 23858 - 11905: 0x8DA2,
- 23859 - 11905: 0x8DA3,
- 23860 - 11905: 0xE1CB,
- 23861 - 11905: 0x8DA4,
- 23862 - 11905: 0x8DA5,
- 23863 - 11905: 0x8DA6,
- 23864 - 11905: 0x8DA7,
- 23865 - 11905: 0x8DA8,
- 23866 - 11905: 0x8DA9,
- 23867 - 11905: 0x8DAA,
- 23868 - 11905: 0x8DAB,
- 23869 - 11905: 0xE1CC,
- 23870 - 11905: 0xE1CA,
- 23871 - 11905: 0x8DAC,
- 23872 - 11905: 0x8DAD,
- 23873 - 11905: 0x8DAE,
- 23874 - 11905: 0x8DAF,
- 23875 - 11905: 0x8DB0,
- 23876 - 11905: 0x8DB1,
- 23877 - 11905: 0x8DB2,
- 23878 - 11905: 0x8DB3,
- 23879 - 11905: 0xEFFA,
- 23880 - 11905: 0x8DB4,
- 23881 - 11905: 0x8DB5,
- 23882 - 11905: 0xE1D3,
- 23883 - 11905: 0xE1D2,
- 23884 - 11905: 0xC7B6,
- 23885 - 11905: 0x8DB6,
- 23886 - 11905: 0x8DB7,
- 23887 - 11905: 0x8DB8,
- 23888 - 11905: 0x8DB9,
- 23889 - 11905: 0x8DBA,
- 23890 - 11905: 0x8DBB,
- 23891 - 11905: 0x8DBC,
- 23892 - 11905: 0x8DBD,
- 23893 - 11905: 0x8DBE,
- 23894 - 11905: 0x8DBF,
- 23895 - 11905: 0x8DC0,
- 23896 - 11905: 0xE1C9,
- 23897 - 11905: 0x8DC1,
- 23898 - 11905: 0x8DC2,
- 23899 - 11905: 0xE1CE,
- 23900 - 11905: 0x8DC3,
- 23901 - 11905: 0xE1D0,
- 23902 - 11905: 0x8DC4,
- 23903 - 11905: 0x8DC5,
- 23904 - 11905: 0x8DC6,
- 23905 - 11905: 0x8DC7,
- 23906 - 11905: 0x8DC8,
- 23907 - 11905: 0x8DC9,
- 23908 - 11905: 0x8DCA,
- 23909 - 11905: 0x8DCB,
- 23910 - 11905: 0x8DCC,
- 23911 - 11905: 0x8DCD,
- 23912 - 11905: 0x8DCE,
- 23913 - 11905: 0xE1D4,
- 23914 - 11905: 0x8DCF,
- 23915 - 11905: 0xE1D1,
- 23916 - 11905: 0xE1CD,
- 23917 - 11905: 0x8DD0,
- 23918 - 11905: 0x8DD1,
- 23919 - 11905: 0xE1CF,
- 23920 - 11905: 0x8DD2,
- 23921 - 11905: 0x8DD3,
- 23922 - 11905: 0x8DD4,
- 23923 - 11905: 0x8DD5,
- 23924 - 11905: 0xE1D5,
- 23925 - 11905: 0x8DD6,
- 23926 - 11905: 0x8DD7,
- 23927 - 11905: 0x8DD8,
- 23928 - 11905: 0x8DD9,
- 23929 - 11905: 0x8DDA,
- 23930 - 11905: 0x8DDB,
- 23931 - 11905: 0x8DDC,
- 23932 - 11905: 0x8DDD,
- 23933 - 11905: 0x8DDE,
- 23934 - 11905: 0x8DDF,
- 23935 - 11905: 0x8DE0,
- 23936 - 11905: 0x8DE1,
- 23937 - 11905: 0x8DE2,
- 23938 - 11905: 0xE1D6,
- 23939 - 11905: 0x8DE3,
- 23940 - 11905: 0x8DE4,
- 23941 - 11905: 0x8DE5,
- 23942 - 11905: 0x8DE6,
- 23943 - 11905: 0x8DE7,
- 23944 - 11905: 0x8DE8,
- 23945 - 11905: 0x8DE9,
- 23946 - 11905: 0x8DEA,
- 23947 - 11905: 0x8DEB,
- 23948 - 11905: 0x8DEC,
- 23949 - 11905: 0x8DED,
- 23950 - 11905: 0x8DEE,
- 23951 - 11905: 0x8DEF,
- 23952 - 11905: 0x8DF0,
- 23953 - 11905: 0x8DF1,
- 23954 - 11905: 0x8DF2,
- 23955 - 11905: 0x8DF3,
- 23956 - 11905: 0x8DF4,
- 23957 - 11905: 0x8DF5,
- 23958 - 11905: 0x8DF6,
- 23959 - 11905: 0x8DF7,
- 23960 - 11905: 0x8DF8,
- 23961 - 11905: 0xE1D7,
- 23962 - 11905: 0x8DF9,
- 23963 - 11905: 0x8DFA,
- 23964 - 11905: 0x8DFB,
- 23965 - 11905: 0xE1D8,
- 23966 - 11905: 0x8DFC,
- 23967 - 11905: 0x8DFD,
- 23968 - 11905: 0x8DFE,
- 23969 - 11905: 0x8E40,
- 23970 - 11905: 0x8E41,
- 23971 - 11905: 0x8E42,
- 23972 - 11905: 0x8E43,
- 23973 - 11905: 0x8E44,
- 23974 - 11905: 0x8E45,
- 23975 - 11905: 0x8E46,
- 23976 - 11905: 0x8E47,
- 23977 - 11905: 0x8E48,
- 23978 - 11905: 0x8E49,
- 23979 - 11905: 0x8E4A,
- 23980 - 11905: 0x8E4B,
- 23981 - 11905: 0x8E4C,
- 23982 - 11905: 0x8E4D,
- 23983 - 11905: 0x8E4E,
- 23984 - 11905: 0x8E4F,
- 23985 - 11905: 0x8E50,
- 23986 - 11905: 0x8E51,
- 23987 - 11905: 0x8E52,
- 23988 - 11905: 0x8E53,
- 23989 - 11905: 0x8E54,
- 23990 - 11905: 0x8E55,
- 23991 - 11905: 0xE1DA,
- 23992 - 11905: 0x8E56,
- 23993 - 11905: 0x8E57,
- 23994 - 11905: 0x8E58,
- 23995 - 11905: 0x8E59,
- 23996 - 11905: 0x8E5A,
- 23997 - 11905: 0x8E5B,
- 23998 - 11905: 0x8E5C,
- 23999 - 11905: 0x8E5D,
- 24000 - 11905: 0x8E5E,
- 24001 - 11905: 0x8E5F,
- 24002 - 11905: 0x8E60,
- 24003 - 11905: 0x8E61,
- 24004 - 11905: 0x8E62,
- 24005 - 11905: 0xE1DB,
- 24006 - 11905: 0x8E63,
- 24007 - 11905: 0x8E64,
- 24008 - 11905: 0x8E65,
- 24009 - 11905: 0x8E66,
- 24010 - 11905: 0x8E67,
- 24011 - 11905: 0x8E68,
- 24012 - 11905: 0x8E69,
- 24013 - 11905: 0xCEA1,
- 24014 - 11905: 0x8E6A,
- 24015 - 11905: 0x8E6B,
- 24016 - 11905: 0x8E6C,
- 24017 - 11905: 0x8E6D,
- 24018 - 11905: 0x8E6E,
- 24019 - 11905: 0x8E6F,
- 24020 - 11905: 0x8E70,
- 24021 - 11905: 0x8E71,
- 24022 - 11905: 0x8E72,
- 24023 - 11905: 0x8E73,
- 24024 - 11905: 0x8E74,
- 24025 - 11905: 0x8E75,
- 24026 - 11905: 0x8E76,
- 24027 - 11905: 0xE7DD,
- 24028 - 11905: 0x8E77,
- 24029 - 11905: 0xB4A8,
- 24030 - 11905: 0xD6DD,
- 24031 - 11905: 0x8E78,
- 24032 - 11905: 0x8E79,
- 24033 - 11905: 0xD1B2,
- 24034 - 11905: 0xB3B2,
- 24035 - 11905: 0x8E7A,
- 24036 - 11905: 0x8E7B,
- 24037 - 11905: 0xB9A4,
- 24038 - 11905: 0xD7F3,
- 24039 - 11905: 0xC7C9,
- 24040 - 11905: 0xBEDE,
- 24041 - 11905: 0xB9AE,
- 24042 - 11905: 0x8E7C,
- 24043 - 11905: 0xCED7,
- 24044 - 11905: 0x8E7D,
- 24045 - 11905: 0x8E7E,
- 24046 - 11905: 0xB2EE,
- 24047 - 11905: 0xDBCF,
- 24048 - 11905: 0x8E80,
- 24049 - 11905: 0xBCBA,
- 24050 - 11905: 0xD2D1,
- 24051 - 11905: 0xCBC8,
- 24052 - 11905: 0xB0CD,
- 24053 - 11905: 0x8E81,
- 24054 - 11905: 0x8E82,
- 24055 - 11905: 0xCFEF,
- 24056 - 11905: 0x8E83,
- 24057 - 11905: 0x8E84,
- 24058 - 11905: 0x8E85,
- 24059 - 11905: 0x8E86,
- 24060 - 11905: 0x8E87,
- 24061 - 11905: 0xD9E3,
- 24062 - 11905: 0xBDED,
- 24063 - 11905: 0x8E88,
- 24064 - 11905: 0x8E89,
- 24065 - 11905: 0xB1D2,
- 24066 - 11905: 0xCAD0,
- 24067 - 11905: 0xB2BC,
- 24068 - 11905: 0x8E8A,
- 24069 - 11905: 0xCBA7,
- 24070 - 11905: 0xB7AB,
- 24071 - 11905: 0x8E8B,
- 24072 - 11905: 0xCAA6,
- 24073 - 11905: 0x8E8C,
- 24074 - 11905: 0x8E8D,
- 24075 - 11905: 0x8E8E,
- 24076 - 11905: 0xCFA3,
- 24077 - 11905: 0x8E8F,
- 24078 - 11905: 0x8E90,
- 24079 - 11905: 0xE0F8,
- 24080 - 11905: 0xD5CA,
- 24081 - 11905: 0xE0FB,
- 24082 - 11905: 0x8E91,
- 24083 - 11905: 0x8E92,
- 24084 - 11905: 0xE0FA,
- 24085 - 11905: 0xC5C1,
- 24086 - 11905: 0xCCFB,
- 24087 - 11905: 0x8E93,
- 24088 - 11905: 0xC1B1,
- 24089 - 11905: 0xE0F9,
- 24090 - 11905: 0xD6E3,
- 24091 - 11905: 0xB2AF,
- 24092 - 11905: 0xD6C4,
- 24093 - 11905: 0xB5DB,
- 24094 - 11905: 0x8E94,
- 24095 - 11905: 0x8E95,
- 24096 - 11905: 0x8E96,
- 24097 - 11905: 0x8E97,
- 24098 - 11905: 0x8E98,
- 24099 - 11905: 0x8E99,
- 24100 - 11905: 0x8E9A,
- 24101 - 11905: 0x8E9B,
- 24102 - 11905: 0xB4F8,
- 24103 - 11905: 0xD6A1,
- 24104 - 11905: 0x8E9C,
- 24105 - 11905: 0x8E9D,
- 24106 - 11905: 0x8E9E,
- 24107 - 11905: 0x8E9F,
- 24108 - 11905: 0x8EA0,
- 24109 - 11905: 0xCFAF,
- 24110 - 11905: 0xB0EF,
- 24111 - 11905: 0x8EA1,
- 24112 - 11905: 0x8EA2,
- 24113 - 11905: 0xE0FC,
- 24114 - 11905: 0x8EA3,
- 24115 - 11905: 0x8EA4,
- 24116 - 11905: 0x8EA5,
- 24117 - 11905: 0x8EA6,
- 24118 - 11905: 0x8EA7,
- 24119 - 11905: 0xE1A1,
- 24120 - 11905: 0xB3A3,
- 24121 - 11905: 0x8EA8,
- 24122 - 11905: 0x8EA9,
- 24123 - 11905: 0xE0FD,
- 24124 - 11905: 0xE0FE,
- 24125 - 11905: 0xC3B1,
- 24126 - 11905: 0x8EAA,
- 24127 - 11905: 0x8EAB,
- 24128 - 11905: 0x8EAC,
- 24129 - 11905: 0x8EAD,
- 24130 - 11905: 0xC3DD,
- 24131 - 11905: 0x8EAE,
- 24132 - 11905: 0xE1A2,
- 24133 - 11905: 0xB7F9,
- 24134 - 11905: 0x8EAF,
- 24135 - 11905: 0x8EB0,
- 24136 - 11905: 0x8EB1,
- 24137 - 11905: 0x8EB2,
- 24138 - 11905: 0x8EB3,
- 24139 - 11905: 0x8EB4,
- 24140 - 11905: 0xBBCF,
- 24141 - 11905: 0x8EB5,
- 24142 - 11905: 0x8EB6,
- 24143 - 11905: 0x8EB7,
- 24144 - 11905: 0x8EB8,
- 24145 - 11905: 0x8EB9,
- 24146 - 11905: 0x8EBA,
- 24147 - 11905: 0x8EBB,
- 24148 - 11905: 0xE1A3,
- 24149 - 11905: 0xC4BB,
- 24150 - 11905: 0x8EBC,
- 24151 - 11905: 0x8EBD,
- 24152 - 11905: 0x8EBE,
- 24153 - 11905: 0x8EBF,
- 24154 - 11905: 0x8EC0,
- 24155 - 11905: 0xE1A4,
- 24156 - 11905: 0x8EC1,
- 24157 - 11905: 0x8EC2,
- 24158 - 11905: 0xE1A5,
- 24159 - 11905: 0x8EC3,
- 24160 - 11905: 0x8EC4,
- 24161 - 11905: 0xE1A6,
- 24162 - 11905: 0xB4B1,
- 24163 - 11905: 0x8EC5,
- 24164 - 11905: 0x8EC6,
- 24165 - 11905: 0x8EC7,
- 24166 - 11905: 0x8EC8,
- 24167 - 11905: 0x8EC9,
- 24168 - 11905: 0x8ECA,
- 24169 - 11905: 0x8ECB,
- 24170 - 11905: 0x8ECC,
- 24171 - 11905: 0x8ECD,
- 24172 - 11905: 0x8ECE,
- 24173 - 11905: 0x8ECF,
- 24174 - 11905: 0x8ED0,
- 24175 - 11905: 0x8ED1,
- 24176 - 11905: 0x8ED2,
- 24177 - 11905: 0x8ED3,
- 24178 - 11905: 0xB8C9,
- 24179 - 11905: 0xC6BD,
- 24180 - 11905: 0xC4EA,
- 24181 - 11905: 0x8ED4,
- 24182 - 11905: 0xB2A2,
- 24183 - 11905: 0x8ED5,
- 24184 - 11905: 0xD0D2,
- 24185 - 11905: 0x8ED6,
- 24186 - 11905: 0xE7DB,
- 24187 - 11905: 0xBBC3,
- 24188 - 11905: 0xD3D7,
- 24189 - 11905: 0xD3C4,
- 24190 - 11905: 0x8ED7,
- 24191 - 11905: 0xB9E3,
- 24192 - 11905: 0xE2CF,
- 24193 - 11905: 0x8ED8,
- 24194 - 11905: 0x8ED9,
- 24195 - 11905: 0x8EDA,
- 24196 - 11905: 0xD7AF,
- 24197 - 11905: 0x8EDB,
- 24198 - 11905: 0xC7EC,
- 24199 - 11905: 0xB1D3,
- 24200 - 11905: 0x8EDC,
- 24201 - 11905: 0x8EDD,
- 24202 - 11905: 0xB4B2,
- 24203 - 11905: 0xE2D1,
- 24204 - 11905: 0x8EDE,
- 24205 - 11905: 0x8EDF,
- 24206 - 11905: 0x8EE0,
- 24207 - 11905: 0xD0F2,
- 24208 - 11905: 0xC2AE,
- 24209 - 11905: 0xE2D0,
- 24210 - 11905: 0x8EE1,
- 24211 - 11905: 0xBFE2,
- 24212 - 11905: 0xD3A6,
- 24213 - 11905: 0xB5D7,
- 24214 - 11905: 0xE2D2,
- 24215 - 11905: 0xB5EA,
- 24216 - 11905: 0x8EE2,
- 24217 - 11905: 0xC3ED,
- 24218 - 11905: 0xB8FD,
- 24219 - 11905: 0x8EE3,
- 24220 - 11905: 0xB8AE,
- 24221 - 11905: 0x8EE4,
- 24222 - 11905: 0xC5D3,
- 24223 - 11905: 0xB7CF,
- 24224 - 11905: 0xE2D4,
- 24225 - 11905: 0x8EE5,
- 24226 - 11905: 0x8EE6,
- 24227 - 11905: 0x8EE7,
- 24228 - 11905: 0x8EE8,
- 24229 - 11905: 0xE2D3,
- 24230 - 11905: 0xB6C8,
- 24231 - 11905: 0xD7F9,
- 24232 - 11905: 0x8EE9,
- 24233 - 11905: 0x8EEA,
- 24234 - 11905: 0x8EEB,
- 24235 - 11905: 0x8EEC,
- 24236 - 11905: 0x8EED,
- 24237 - 11905: 0xCDA5,
- 24238 - 11905: 0x8EEE,
- 24239 - 11905: 0x8EEF,
- 24240 - 11905: 0x8EF0,
- 24241 - 11905: 0x8EF1,
- 24242 - 11905: 0x8EF2,
- 24243 - 11905: 0xE2D8,
- 24244 - 11905: 0x8EF3,
- 24245 - 11905: 0xE2D6,
- 24246 - 11905: 0xCAFC,
- 24247 - 11905: 0xBFB5,
- 24248 - 11905: 0xD3B9,
- 24249 - 11905: 0xE2D5,
- 24250 - 11905: 0x8EF4,
- 24251 - 11905: 0x8EF5,
- 24252 - 11905: 0x8EF6,
- 24253 - 11905: 0x8EF7,
- 24254 - 11905: 0xE2D7,
- 24255 - 11905: 0x8EF8,
- 24256 - 11905: 0x8EF9,
- 24257 - 11905: 0x8EFA,
- 24258 - 11905: 0x8EFB,
- 24259 - 11905: 0x8EFC,
- 24260 - 11905: 0x8EFD,
- 24261 - 11905: 0x8EFE,
- 24262 - 11905: 0x8F40,
- 24263 - 11905: 0x8F41,
- 24264 - 11905: 0x8F42,
- 24265 - 11905: 0xC1AE,
- 24266 - 11905: 0xC0C8,
- 24267 - 11905: 0x8F43,
- 24268 - 11905: 0x8F44,
- 24269 - 11905: 0x8F45,
- 24270 - 11905: 0x8F46,
- 24271 - 11905: 0x8F47,
- 24272 - 11905: 0x8F48,
- 24273 - 11905: 0xE2DB,
- 24274 - 11905: 0xE2DA,
- 24275 - 11905: 0xC0AA,
- 24276 - 11905: 0x8F49,
- 24277 - 11905: 0x8F4A,
- 24278 - 11905: 0xC1CE,
- 24279 - 11905: 0x8F4B,
- 24280 - 11905: 0x8F4C,
- 24281 - 11905: 0x8F4D,
- 24282 - 11905: 0x8F4E,
- 24283 - 11905: 0xE2DC,
- 24284 - 11905: 0x8F4F,
- 24285 - 11905: 0x8F50,
- 24286 - 11905: 0x8F51,
- 24287 - 11905: 0x8F52,
- 24288 - 11905: 0x8F53,
- 24289 - 11905: 0x8F54,
- 24290 - 11905: 0x8F55,
- 24291 - 11905: 0x8F56,
- 24292 - 11905: 0x8F57,
- 24293 - 11905: 0x8F58,
- 24294 - 11905: 0x8F59,
- 24295 - 11905: 0x8F5A,
- 24296 - 11905: 0xE2DD,
- 24297 - 11905: 0x8F5B,
- 24298 - 11905: 0xE2DE,
- 24299 - 11905: 0x8F5C,
- 24300 - 11905: 0x8F5D,
- 24301 - 11905: 0x8F5E,
- 24302 - 11905: 0x8F5F,
- 24303 - 11905: 0x8F60,
- 24304 - 11905: 0x8F61,
- 24305 - 11905: 0x8F62,
- 24306 - 11905: 0x8F63,
- 24307 - 11905: 0x8F64,
- 24308 - 11905: 0xDBC8,
- 24309 - 11905: 0x8F65,
- 24310 - 11905: 0xD1D3,
- 24311 - 11905: 0xCDA2,
- 24312 - 11905: 0x8F66,
- 24313 - 11905: 0x8F67,
- 24314 - 11905: 0xBDA8,
- 24315 - 11905: 0x8F68,
- 24316 - 11905: 0x8F69,
- 24317 - 11905: 0x8F6A,
- 24318 - 11905: 0xDEC3,
- 24319 - 11905: 0xD8A5,
- 24320 - 11905: 0xBFAA,
- 24321 - 11905: 0xDBCD,
- 24322 - 11905: 0xD2EC,
- 24323 - 11905: 0xC6FA,
- 24324 - 11905: 0xC5AA,
- 24325 - 11905: 0x8F6B,
- 24326 - 11905: 0x8F6C,
- 24327 - 11905: 0x8F6D,
- 24328 - 11905: 0xDEC4,
- 24329 - 11905: 0x8F6E,
- 24330 - 11905: 0xB1D7,
- 24331 - 11905: 0xDFAE,
- 24332 - 11905: 0x8F6F,
- 24333 - 11905: 0x8F70,
- 24334 - 11905: 0x8F71,
- 24335 - 11905: 0xCABD,
- 24336 - 11905: 0x8F72,
- 24337 - 11905: 0xDFB1,
- 24338 - 11905: 0x8F73,
- 24339 - 11905: 0xB9AD,
- 24340 - 11905: 0x8F74,
- 24341 - 11905: 0xD2FD,
- 24342 - 11905: 0x8F75,
- 24343 - 11905: 0xB8A5,
- 24344 - 11905: 0xBAEB,
- 24345 - 11905: 0x8F76,
- 24346 - 11905: 0x8F77,
- 24347 - 11905: 0xB3DA,
- 24348 - 11905: 0x8F78,
- 24349 - 11905: 0x8F79,
- 24350 - 11905: 0x8F7A,
- 24351 - 11905: 0xB5DC,
- 24352 - 11905: 0xD5C5,
- 24353 - 11905: 0x8F7B,
- 24354 - 11905: 0x8F7C,
- 24355 - 11905: 0x8F7D,
- 24356 - 11905: 0x8F7E,
- 24357 - 11905: 0xC3D6,
- 24358 - 11905: 0xCFD2,
- 24359 - 11905: 0xBBA1,
- 24360 - 11905: 0x8F80,
- 24361 - 11905: 0xE5F3,
- 24362 - 11905: 0xE5F2,
- 24363 - 11905: 0x8F81,
- 24364 - 11905: 0x8F82,
- 24365 - 11905: 0xE5F4,
- 24366 - 11905: 0x8F83,
- 24367 - 11905: 0xCDE4,
- 24368 - 11905: 0x8F84,
- 24369 - 11905: 0xC8F5,
- 24370 - 11905: 0x8F85,
- 24371 - 11905: 0x8F86,
- 24372 - 11905: 0x8F87,
- 24373 - 11905: 0x8F88,
- 24374 - 11905: 0x8F89,
- 24375 - 11905: 0x8F8A,
- 24376 - 11905: 0x8F8B,
- 24377 - 11905: 0xB5AF,
- 24378 - 11905: 0xC7BF,
- 24379 - 11905: 0x8F8C,
- 24380 - 11905: 0xE5F6,
- 24381 - 11905: 0x8F8D,
- 24382 - 11905: 0x8F8E,
- 24383 - 11905: 0x8F8F,
- 24384 - 11905: 0xECB0,
- 24385 - 11905: 0x8F90,
- 24386 - 11905: 0x8F91,
- 24387 - 11905: 0x8F92,
- 24388 - 11905: 0x8F93,
- 24389 - 11905: 0x8F94,
- 24390 - 11905: 0x8F95,
- 24391 - 11905: 0x8F96,
- 24392 - 11905: 0x8F97,
- 24393 - 11905: 0x8F98,
- 24394 - 11905: 0x8F99,
- 24395 - 11905: 0x8F9A,
- 24396 - 11905: 0x8F9B,
- 24397 - 11905: 0x8F9C,
- 24398 - 11905: 0x8F9D,
- 24399 - 11905: 0x8F9E,
- 24400 - 11905: 0xE5E6,
- 24401 - 11905: 0x8F9F,
- 24402 - 11905: 0xB9E9,
- 24403 - 11905: 0xB5B1,
- 24404 - 11905: 0x8FA0,
- 24405 - 11905: 0xC2BC,
- 24406 - 11905: 0xE5E8,
- 24407 - 11905: 0xE5E7,
- 24408 - 11905: 0xE5E9,
- 24409 - 11905: 0x8FA1,
- 24410 - 11905: 0x8FA2,
- 24411 - 11905: 0x8FA3,
- 24412 - 11905: 0x8FA4,
- 24413 - 11905: 0xD2CD,
- 24414 - 11905: 0x8FA5,
- 24415 - 11905: 0x8FA6,
- 24416 - 11905: 0x8FA7,
- 24417 - 11905: 0xE1EA,
- 24418 - 11905: 0xD0CE,
- 24419 - 11905: 0x8FA8,
- 24420 - 11905: 0xCDAE,
- 24421 - 11905: 0x8FA9,
- 24422 - 11905: 0xD1E5,
- 24423 - 11905: 0x8FAA,
- 24424 - 11905: 0x8FAB,
- 24425 - 11905: 0xB2CA,
- 24426 - 11905: 0xB1EB,
- 24427 - 11905: 0x8FAC,
- 24428 - 11905: 0xB1F2,
- 24429 - 11905: 0xC5ED,
- 24430 - 11905: 0x8FAD,
- 24431 - 11905: 0x8FAE,
- 24432 - 11905: 0xD5C3,
- 24433 - 11905: 0xD3B0,
- 24434 - 11905: 0x8FAF,
- 24435 - 11905: 0xE1DC,
- 24436 - 11905: 0x8FB0,
- 24437 - 11905: 0x8FB1,
- 24438 - 11905: 0x8FB2,
- 24439 - 11905: 0xE1DD,
- 24440 - 11905: 0x8FB3,
- 24441 - 11905: 0xD2DB,
- 24442 - 11905: 0x8FB4,
- 24443 - 11905: 0xB3B9,
- 24444 - 11905: 0xB1CB,
- 24445 - 11905: 0x8FB5,
- 24446 - 11905: 0x8FB6,
- 24447 - 11905: 0x8FB7,
- 24448 - 11905: 0xCDF9,
- 24449 - 11905: 0xD5F7,
- 24450 - 11905: 0xE1DE,
- 24451 - 11905: 0x8FB8,
- 24452 - 11905: 0xBEB6,
- 24453 - 11905: 0xB4FD,
- 24454 - 11905: 0x8FB9,
- 24455 - 11905: 0xE1DF,
- 24456 - 11905: 0xBADC,
- 24457 - 11905: 0xE1E0,
- 24458 - 11905: 0xBBB2,
- 24459 - 11905: 0xC2C9,
- 24460 - 11905: 0xE1E1,
- 24461 - 11905: 0x8FBA,
- 24462 - 11905: 0x8FBB,
- 24463 - 11905: 0x8FBC,
- 24464 - 11905: 0xD0EC,
- 24465 - 11905: 0x8FBD,
- 24466 - 11905: 0xCDBD,
- 24467 - 11905: 0x8FBE,
- 24468 - 11905: 0x8FBF,
- 24469 - 11905: 0xE1E2,
- 24470 - 11905: 0x8FC0,
- 24471 - 11905: 0xB5C3,
- 24472 - 11905: 0xC5C7,
- 24473 - 11905: 0xE1E3,
- 24474 - 11905: 0x8FC1,
- 24475 - 11905: 0x8FC2,
- 24476 - 11905: 0xE1E4,
- 24477 - 11905: 0x8FC3,
- 24478 - 11905: 0x8FC4,
- 24479 - 11905: 0x8FC5,
- 24480 - 11905: 0x8FC6,
- 24481 - 11905: 0xD3F9,
- 24482 - 11905: 0x8FC7,
- 24483 - 11905: 0x8FC8,
- 24484 - 11905: 0x8FC9,
- 24485 - 11905: 0x8FCA,
- 24486 - 11905: 0x8FCB,
- 24487 - 11905: 0x8FCC,
- 24488 - 11905: 0xE1E5,
- 24489 - 11905: 0x8FCD,
- 24490 - 11905: 0xD1AD,
- 24491 - 11905: 0x8FCE,
- 24492 - 11905: 0x8FCF,
- 24493 - 11905: 0xE1E6,
- 24494 - 11905: 0xCEA2,
- 24495 - 11905: 0x8FD0,
- 24496 - 11905: 0x8FD1,
- 24497 - 11905: 0x8FD2,
- 24498 - 11905: 0x8FD3,
- 24499 - 11905: 0x8FD4,
- 24500 - 11905: 0x8FD5,
- 24501 - 11905: 0xE1E7,
- 24502 - 11905: 0x8FD6,
- 24503 - 11905: 0xB5C2,
- 24504 - 11905: 0x8FD7,
- 24505 - 11905: 0x8FD8,
- 24506 - 11905: 0x8FD9,
- 24507 - 11905: 0x8FDA,
- 24508 - 11905: 0xE1E8,
- 24509 - 11905: 0xBBD5,
- 24510 - 11905: 0x8FDB,
- 24511 - 11905: 0x8FDC,
- 24512 - 11905: 0x8FDD,
- 24513 - 11905: 0x8FDE,
- 24514 - 11905: 0x8FDF,
- 24515 - 11905: 0xD0C4,
- 24516 - 11905: 0xE2E0,
- 24517 - 11905: 0xB1D8,
- 24518 - 11905: 0xD2E4,
- 24519 - 11905: 0x8FE0,
- 24520 - 11905: 0x8FE1,
- 24521 - 11905: 0xE2E1,
- 24522 - 11905: 0x8FE2,
- 24523 - 11905: 0x8FE3,
- 24524 - 11905: 0xBCC9,
- 24525 - 11905: 0xC8CC,
- 24526 - 11905: 0x8FE4,
- 24527 - 11905: 0xE2E3,
- 24528 - 11905: 0xECFE,
- 24529 - 11905: 0xECFD,
- 24530 - 11905: 0xDFAF,
- 24531 - 11905: 0x8FE5,
- 24532 - 11905: 0x8FE6,
- 24533 - 11905: 0x8FE7,
- 24534 - 11905: 0xE2E2,
- 24535 - 11905: 0xD6BE,
- 24536 - 11905: 0xCDFC,
- 24537 - 11905: 0xC3A6,
- 24538 - 11905: 0x8FE8,
- 24539 - 11905: 0x8FE9,
- 24540 - 11905: 0x8FEA,
- 24541 - 11905: 0xE3C3,
- 24542 - 11905: 0x8FEB,
- 24543 - 11905: 0x8FEC,
- 24544 - 11905: 0xD6D2,
- 24545 - 11905: 0xE2E7,
- 24546 - 11905: 0x8FED,
- 24547 - 11905: 0x8FEE,
- 24548 - 11905: 0xE2E8,
- 24549 - 11905: 0x8FEF,
- 24550 - 11905: 0x8FF0,
- 24551 - 11905: 0xD3C7,
- 24552 - 11905: 0x8FF1,
- 24553 - 11905: 0x8FF2,
- 24554 - 11905: 0xE2EC,
- 24555 - 11905: 0xBFEC,
- 24556 - 11905: 0x8FF3,
- 24557 - 11905: 0xE2ED,
- 24558 - 11905: 0xE2E5,
- 24559 - 11905: 0x8FF4,
- 24560 - 11905: 0x8FF5,
- 24561 - 11905: 0xB3C0,
- 24562 - 11905: 0x8FF6,
- 24563 - 11905: 0x8FF7,
- 24564 - 11905: 0x8FF8,
- 24565 - 11905: 0xC4EE,
- 24566 - 11905: 0x8FF9,
- 24567 - 11905: 0x8FFA,
- 24568 - 11905: 0xE2EE,
- 24569 - 11905: 0x8FFB,
- 24570 - 11905: 0x8FFC,
- 24571 - 11905: 0xD0C3,
- 24572 - 11905: 0x8FFD,
- 24573 - 11905: 0xBAF6,
- 24574 - 11905: 0xE2E9,
- 24575 - 11905: 0xB7DE,
- 24576 - 11905: 0xBBB3,
- 24577 - 11905: 0xCCAC,
- 24578 - 11905: 0xCBCB,
- 24579 - 11905: 0xE2E4,
- 24580 - 11905: 0xE2E6,
- 24581 - 11905: 0xE2EA,
- 24582 - 11905: 0xE2EB,
- 24583 - 11905: 0x8FFE,
- 24584 - 11905: 0x9040,
- 24585 - 11905: 0x9041,
- 24586 - 11905: 0xE2F7,
- 24587 - 11905: 0x9042,
- 24588 - 11905: 0x9043,
- 24589 - 11905: 0xE2F4,
- 24590 - 11905: 0xD4F5,
- 24591 - 11905: 0xE2F3,
- 24592 - 11905: 0x9044,
- 24593 - 11905: 0x9045,
- 24594 - 11905: 0xC5AD,
- 24595 - 11905: 0x9046,
- 24596 - 11905: 0xD5FA,
- 24597 - 11905: 0xC5C2,
- 24598 - 11905: 0xB2C0,
- 24599 - 11905: 0x9047,
- 24600 - 11905: 0x9048,
- 24601 - 11905: 0xE2EF,
- 24602 - 11905: 0x9049,
- 24603 - 11905: 0xE2F2,
- 24604 - 11905: 0xC1AF,
- 24605 - 11905: 0xCBBC,
- 24606 - 11905: 0x904A,
- 24607 - 11905: 0x904B,
- 24608 - 11905: 0xB5A1,
- 24609 - 11905: 0xE2F9,
- 24610 - 11905: 0x904C,
- 24611 - 11905: 0x904D,
- 24612 - 11905: 0x904E,
- 24613 - 11905: 0xBCB1,
- 24614 - 11905: 0xE2F1,
- 24615 - 11905: 0xD0D4,
- 24616 - 11905: 0xD4B9,
- 24617 - 11905: 0xE2F5,
- 24618 - 11905: 0xB9D6,
- 24619 - 11905: 0xE2F6,
- 24620 - 11905: 0x904F,
- 24621 - 11905: 0x9050,
- 24622 - 11905: 0x9051,
- 24623 - 11905: 0xC7D3,
- 24624 - 11905: 0x9052,
- 24625 - 11905: 0x9053,
- 24626 - 11905: 0x9054,
- 24627 - 11905: 0x9055,
- 24628 - 11905: 0x9056,
- 24629 - 11905: 0xE2F0,
- 24630 - 11905: 0x9057,
- 24631 - 11905: 0x9058,
- 24632 - 11905: 0x9059,
- 24633 - 11905: 0x905A,
- 24634 - 11905: 0x905B,
- 24635 - 11905: 0xD7DC,
- 24636 - 11905: 0xEDA1,
- 24637 - 11905: 0x905C,
- 24638 - 11905: 0x905D,
- 24639 - 11905: 0xE2F8,
- 24640 - 11905: 0x905E,
- 24641 - 11905: 0xEDA5,
- 24642 - 11905: 0xE2FE,
- 24643 - 11905: 0xCAD1,
- 24644 - 11905: 0x905F,
- 24645 - 11905: 0x9060,
- 24646 - 11905: 0x9061,
- 24647 - 11905: 0x9062,
- 24648 - 11905: 0x9063,
- 24649 - 11905: 0x9064,
- 24650 - 11905: 0x9065,
- 24651 - 11905: 0xC1B5,
- 24652 - 11905: 0x9066,
- 24653 - 11905: 0xBBD0,
- 24654 - 11905: 0x9067,
- 24655 - 11905: 0x9068,
- 24656 - 11905: 0xBFD6,
- 24657 - 11905: 0x9069,
- 24658 - 11905: 0xBAE3,
- 24659 - 11905: 0x906A,
- 24660 - 11905: 0x906B,
- 24661 - 11905: 0xCBA1,
- 24662 - 11905: 0x906C,
- 24663 - 11905: 0x906D,
- 24664 - 11905: 0x906E,
- 24665 - 11905: 0xEDA6,
- 24666 - 11905: 0xEDA3,
- 24667 - 11905: 0x906F,
- 24668 - 11905: 0x9070,
- 24669 - 11905: 0xEDA2,
- 24670 - 11905: 0x9071,
- 24671 - 11905: 0x9072,
- 24672 - 11905: 0x9073,
- 24673 - 11905: 0x9074,
- 24674 - 11905: 0xBBD6,
- 24675 - 11905: 0xEDA7,
- 24676 - 11905: 0xD0F4,
- 24677 - 11905: 0x9075,
- 24678 - 11905: 0x9076,
- 24679 - 11905: 0xEDA4,
- 24680 - 11905: 0xBADE,
- 24681 - 11905: 0xB6F7,
- 24682 - 11905: 0xE3A1,
- 24683 - 11905: 0xB6B2,
- 24684 - 11905: 0xCCF1,
- 24685 - 11905: 0xB9A7,
- 24686 - 11905: 0x9077,
- 24687 - 11905: 0xCFA2,
- 24688 - 11905: 0xC7A1,
- 24689 - 11905: 0x9078,
- 24690 - 11905: 0x9079,
- 24691 - 11905: 0xBFD2,
- 24692 - 11905: 0x907A,
- 24693 - 11905: 0x907B,
- 24694 - 11905: 0xB6F1,
- 24695 - 11905: 0x907C,
- 24696 - 11905: 0xE2FA,
- 24697 - 11905: 0xE2FB,
- 24698 - 11905: 0xE2FD,
- 24699 - 11905: 0xE2FC,
- 24700 - 11905: 0xC4D5,
- 24701 - 11905: 0xE3A2,
- 24702 - 11905: 0x907D,
- 24703 - 11905: 0xD3C1,
- 24704 - 11905: 0x907E,
- 24705 - 11905: 0x9080,
- 24706 - 11905: 0x9081,
- 24707 - 11905: 0xE3A7,
- 24708 - 11905: 0xC7C4,
- 24709 - 11905: 0x9082,
- 24710 - 11905: 0x9083,
- 24711 - 11905: 0x9084,
- 24712 - 11905: 0x9085,
- 24713 - 11905: 0xCFA4,
- 24714 - 11905: 0x9086,
- 24715 - 11905: 0x9087,
- 24716 - 11905: 0xE3A9,
- 24717 - 11905: 0xBAB7,
- 24718 - 11905: 0x9088,
- 24719 - 11905: 0x9089,
- 24720 - 11905: 0x908A,
- 24721 - 11905: 0x908B,
- 24722 - 11905: 0xE3A8,
- 24723 - 11905: 0x908C,
- 24724 - 11905: 0xBBDA,
- 24725 - 11905: 0x908D,
- 24726 - 11905: 0xE3A3,
- 24727 - 11905: 0x908E,
- 24728 - 11905: 0x908F,
- 24729 - 11905: 0x9090,
- 24730 - 11905: 0xE3A4,
- 24731 - 11905: 0xE3AA,
- 24732 - 11905: 0x9091,
- 24733 - 11905: 0xE3A6,
- 24734 - 11905: 0x9092,
- 24735 - 11905: 0xCEF2,
- 24736 - 11905: 0xD3C6,
- 24737 - 11905: 0x9093,
- 24738 - 11905: 0x9094,
- 24739 - 11905: 0xBBBC,
- 24740 - 11905: 0x9095,
- 24741 - 11905: 0x9096,
- 24742 - 11905: 0xD4C3,
- 24743 - 11905: 0x9097,
- 24744 - 11905: 0xC4FA,
- 24745 - 11905: 0x9098,
- 24746 - 11905: 0x9099,
- 24747 - 11905: 0xEDA8,
- 24748 - 11905: 0xD0FC,
- 24749 - 11905: 0xE3A5,
- 24750 - 11905: 0x909A,
- 24751 - 11905: 0xC3F5,
- 24752 - 11905: 0x909B,
- 24753 - 11905: 0xE3AD,
- 24754 - 11905: 0xB1AF,
- 24755 - 11905: 0x909C,
- 24756 - 11905: 0xE3B2,
- 24757 - 11905: 0x909D,
- 24758 - 11905: 0x909E,
- 24759 - 11905: 0x909F,
- 24760 - 11905: 0xBCC2,
- 24761 - 11905: 0x90A0,
- 24762 - 11905: 0x90A1,
- 24763 - 11905: 0xE3AC,
- 24764 - 11905: 0xB5BF,
- 24765 - 11905: 0x90A2,
- 24766 - 11905: 0x90A3,
- 24767 - 11905: 0x90A4,
- 24768 - 11905: 0x90A5,
- 24769 - 11905: 0x90A6,
- 24770 - 11905: 0x90A7,
- 24771 - 11905: 0x90A8,
- 24772 - 11905: 0x90A9,
- 24773 - 11905: 0xC7E9,
- 24774 - 11905: 0xE3B0,
- 24775 - 11905: 0x90AA,
- 24776 - 11905: 0x90AB,
- 24777 - 11905: 0x90AC,
- 24778 - 11905: 0xBEAA,
- 24779 - 11905: 0xCDEF,
- 24780 - 11905: 0x90AD,
- 24781 - 11905: 0x90AE,
- 24782 - 11905: 0x90AF,
- 24783 - 11905: 0x90B0,
- 24784 - 11905: 0x90B1,
- 24785 - 11905: 0xBBF3,
- 24786 - 11905: 0x90B2,
- 24787 - 11905: 0x90B3,
- 24788 - 11905: 0x90B4,
- 24789 - 11905: 0xCCE8,
- 24790 - 11905: 0x90B5,
- 24791 - 11905: 0x90B6,
- 24792 - 11905: 0xE3AF,
- 24793 - 11905: 0x90B7,
- 24794 - 11905: 0xE3B1,
- 24795 - 11905: 0x90B8,
- 24796 - 11905: 0xCFA7,
- 24797 - 11905: 0xE3AE,
- 24798 - 11905: 0x90B9,
- 24799 - 11905: 0xCEA9,
- 24800 - 11905: 0xBBDD,
- 24801 - 11905: 0x90BA,
- 24802 - 11905: 0x90BB,
- 24803 - 11905: 0x90BC,
- 24804 - 11905: 0x90BD,
- 24805 - 11905: 0x90BE,
- 24806 - 11905: 0xB5EB,
- 24807 - 11905: 0xBEE5,
- 24808 - 11905: 0xB2D2,
- 24809 - 11905: 0xB3CD,
- 24810 - 11905: 0x90BF,
- 24811 - 11905: 0xB1B9,
- 24812 - 11905: 0xE3AB,
- 24813 - 11905: 0xB2D1,
- 24814 - 11905: 0xB5AC,
- 24815 - 11905: 0xB9DF,
- 24816 - 11905: 0xB6E8,
- 24817 - 11905: 0x90C0,
- 24818 - 11905: 0x90C1,
- 24819 - 11905: 0xCFEB,
- 24820 - 11905: 0xE3B7,
- 24821 - 11905: 0x90C2,
- 24822 - 11905: 0xBBCC,
- 24823 - 11905: 0x90C3,
- 24824 - 11905: 0x90C4,
- 24825 - 11905: 0xC8C7,
- 24826 - 11905: 0xD0CA,
- 24827 - 11905: 0x90C5,
- 24828 - 11905: 0x90C6,
- 24829 - 11905: 0x90C7,
- 24830 - 11905: 0x90C8,
- 24831 - 11905: 0x90C9,
- 24832 - 11905: 0xE3B8,
- 24833 - 11905: 0xB3EE,
- 24834 - 11905: 0x90CA,
- 24835 - 11905: 0x90CB,
- 24836 - 11905: 0x90CC,
- 24837 - 11905: 0x90CD,
- 24838 - 11905: 0xEDA9,
- 24839 - 11905: 0x90CE,
- 24840 - 11905: 0xD3FA,
- 24841 - 11905: 0xD3E4,
- 24842 - 11905: 0x90CF,
- 24843 - 11905: 0x90D0,
- 24844 - 11905: 0x90D1,
- 24845 - 11905: 0xEDAA,
- 24846 - 11905: 0xE3B9,
- 24847 - 11905: 0xD2E2,
- 24848 - 11905: 0x90D2,
- 24849 - 11905: 0x90D3,
- 24850 - 11905: 0x90D4,
- 24851 - 11905: 0x90D5,
- 24852 - 11905: 0x90D6,
- 24853 - 11905: 0xE3B5,
- 24854 - 11905: 0x90D7,
- 24855 - 11905: 0x90D8,
- 24856 - 11905: 0x90D9,
- 24857 - 11905: 0x90DA,
- 24858 - 11905: 0xD3DE,
- 24859 - 11905: 0x90DB,
- 24860 - 11905: 0x90DC,
- 24861 - 11905: 0x90DD,
- 24862 - 11905: 0x90DE,
- 24863 - 11905: 0xB8D0,
- 24864 - 11905: 0xE3B3,
- 24865 - 11905: 0x90DF,
- 24866 - 11905: 0x90E0,
- 24867 - 11905: 0xE3B6,
- 24868 - 11905: 0xB7DF,
- 24869 - 11905: 0x90E1,
- 24870 - 11905: 0xE3B4,
- 24871 - 11905: 0xC0A2,
- 24872 - 11905: 0x90E2,
- 24873 - 11905: 0x90E3,
- 24874 - 11905: 0x90E4,
- 24875 - 11905: 0xE3BA,
- 24876 - 11905: 0x90E5,
- 24877 - 11905: 0x90E6,
- 24878 - 11905: 0x90E7,
- 24879 - 11905: 0x90E8,
- 24880 - 11905: 0x90E9,
- 24881 - 11905: 0x90EA,
- 24882 - 11905: 0x90EB,
- 24883 - 11905: 0x90EC,
- 24884 - 11905: 0x90ED,
- 24885 - 11905: 0x90EE,
- 24886 - 11905: 0x90EF,
- 24887 - 11905: 0x90F0,
- 24888 - 11905: 0x90F1,
- 24889 - 11905: 0x90F2,
- 24890 - 11905: 0x90F3,
- 24891 - 11905: 0x90F4,
- 24892 - 11905: 0x90F5,
- 24893 - 11905: 0x90F6,
- 24894 - 11905: 0x90F7,
- 24895 - 11905: 0xD4B8,
- 24896 - 11905: 0x90F8,
- 24897 - 11905: 0x90F9,
- 24898 - 11905: 0x90FA,
- 24899 - 11905: 0x90FB,
- 24900 - 11905: 0x90FC,
- 24901 - 11905: 0x90FD,
- 24902 - 11905: 0x90FE,
- 24903 - 11905: 0x9140,
- 24904 - 11905: 0xB4C8,
- 24905 - 11905: 0x9141,
- 24906 - 11905: 0xE3BB,
- 24907 - 11905: 0x9142,
- 24908 - 11905: 0xBBC5,
- 24909 - 11905: 0x9143,
- 24910 - 11905: 0xC9F7,
- 24911 - 11905: 0x9144,
- 24912 - 11905: 0x9145,
- 24913 - 11905: 0xC9E5,
- 24914 - 11905: 0x9146,
- 24915 - 11905: 0x9147,
- 24916 - 11905: 0x9148,
- 24917 - 11905: 0xC4BD,
- 24918 - 11905: 0x9149,
- 24919 - 11905: 0x914A,
- 24920 - 11905: 0x914B,
- 24921 - 11905: 0x914C,
- 24922 - 11905: 0x914D,
- 24923 - 11905: 0x914E,
- 24924 - 11905: 0x914F,
- 24925 - 11905: 0xEDAB,
- 24926 - 11905: 0x9150,
- 24927 - 11905: 0x9151,
- 24928 - 11905: 0x9152,
- 24929 - 11905: 0x9153,
- 24930 - 11905: 0xC2FD,
- 24931 - 11905: 0x9154,
- 24932 - 11905: 0x9155,
- 24933 - 11905: 0x9156,
- 24934 - 11905: 0x9157,
- 24935 - 11905: 0xBBDB,
- 24936 - 11905: 0xBFAE,
- 24937 - 11905: 0x9158,
- 24938 - 11905: 0x9159,
- 24939 - 11905: 0x915A,
- 24940 - 11905: 0x915B,
- 24941 - 11905: 0x915C,
- 24942 - 11905: 0x915D,
- 24943 - 11905: 0x915E,
- 24944 - 11905: 0xCEBF,
- 24945 - 11905: 0x915F,
- 24946 - 11905: 0x9160,
- 24947 - 11905: 0x9161,
- 24948 - 11905: 0x9162,
- 24949 - 11905: 0xE3BC,
- 24950 - 11905: 0x9163,
- 24951 - 11905: 0xBFB6,
- 24952 - 11905: 0x9164,
- 24953 - 11905: 0x9165,
- 24954 - 11905: 0x9166,
- 24955 - 11905: 0x9167,
- 24956 - 11905: 0x9168,
- 24957 - 11905: 0x9169,
- 24958 - 11905: 0x916A,
- 24959 - 11905: 0x916B,
- 24960 - 11905: 0x916C,
- 24961 - 11905: 0x916D,
- 24962 - 11905: 0x916E,
- 24963 - 11905: 0x916F,
- 24964 - 11905: 0x9170,
- 24965 - 11905: 0x9171,
- 24966 - 11905: 0x9172,
- 24967 - 11905: 0x9173,
- 24968 - 11905: 0x9174,
- 24969 - 11905: 0x9175,
- 24970 - 11905: 0x9176,
- 24971 - 11905: 0xB1EF,
- 24972 - 11905: 0x9177,
- 24973 - 11905: 0x9178,
- 24974 - 11905: 0xD4F7,
- 24975 - 11905: 0x9179,
- 24976 - 11905: 0x917A,
- 24977 - 11905: 0x917B,
- 24978 - 11905: 0x917C,
- 24979 - 11905: 0x917D,
- 24980 - 11905: 0xE3BE,
- 24981 - 11905: 0x917E,
- 24982 - 11905: 0x9180,
- 24983 - 11905: 0x9181,
- 24984 - 11905: 0x9182,
- 24985 - 11905: 0x9183,
- 24986 - 11905: 0x9184,
- 24987 - 11905: 0x9185,
- 24988 - 11905: 0x9186,
- 24989 - 11905: 0xEDAD,
- 24990 - 11905: 0x9187,
- 24991 - 11905: 0x9188,
- 24992 - 11905: 0x9189,
- 24993 - 11905: 0x918A,
- 24994 - 11905: 0x918B,
- 24995 - 11905: 0x918C,
- 24996 - 11905: 0x918D,
- 24997 - 11905: 0x918E,
- 24998 - 11905: 0x918F,
- 24999 - 11905: 0xE3BF,
- 25000 - 11905: 0xBAA9,
- 25001 - 11905: 0xEDAC,
- 25002 - 11905: 0x9190,
- 25003 - 11905: 0x9191,
- 25004 - 11905: 0xE3BD,
- 25005 - 11905: 0x9192,
- 25006 - 11905: 0x9193,
- 25007 - 11905: 0x9194,
- 25008 - 11905: 0x9195,
- 25009 - 11905: 0x9196,
- 25010 - 11905: 0x9197,
- 25011 - 11905: 0x9198,
- 25012 - 11905: 0x9199,
- 25013 - 11905: 0x919A,
- 25014 - 11905: 0x919B,
- 25015 - 11905: 0xE3C0,
- 25016 - 11905: 0x919C,
- 25017 - 11905: 0x919D,
- 25018 - 11905: 0x919E,
- 25019 - 11905: 0x919F,
- 25020 - 11905: 0x91A0,
- 25021 - 11905: 0x91A1,
- 25022 - 11905: 0xBAB6,
- 25023 - 11905: 0x91A2,
- 25024 - 11905: 0x91A3,
- 25025 - 11905: 0x91A4,
- 25026 - 11905: 0xB6AE,
- 25027 - 11905: 0x91A5,
- 25028 - 11905: 0x91A6,
- 25029 - 11905: 0x91A7,
- 25030 - 11905: 0x91A8,
- 25031 - 11905: 0x91A9,
- 25032 - 11905: 0xD0B8,
- 25033 - 11905: 0x91AA,
- 25034 - 11905: 0xB0C3,
- 25035 - 11905: 0xEDAE,
- 25036 - 11905: 0x91AB,
- 25037 - 11905: 0x91AC,
- 25038 - 11905: 0x91AD,
- 25039 - 11905: 0x91AE,
- 25040 - 11905: 0x91AF,
- 25041 - 11905: 0xEDAF,
- 25042 - 11905: 0xC0C1,
- 25043 - 11905: 0x91B0,
- 25044 - 11905: 0xE3C1,
- 25045 - 11905: 0x91B1,
- 25046 - 11905: 0x91B2,
- 25047 - 11905: 0x91B3,
- 25048 - 11905: 0x91B4,
- 25049 - 11905: 0x91B5,
- 25050 - 11905: 0x91B6,
- 25051 - 11905: 0x91B7,
- 25052 - 11905: 0x91B8,
- 25053 - 11905: 0x91B9,
- 25054 - 11905: 0x91BA,
- 25055 - 11905: 0x91BB,
- 25056 - 11905: 0x91BC,
- 25057 - 11905: 0x91BD,
- 25058 - 11905: 0x91BE,
- 25059 - 11905: 0x91BF,
- 25060 - 11905: 0x91C0,
- 25061 - 11905: 0x91C1,
- 25062 - 11905: 0xC5B3,
- 25063 - 11905: 0x91C2,
- 25064 - 11905: 0x91C3,
- 25065 - 11905: 0x91C4,
- 25066 - 11905: 0x91C5,
- 25067 - 11905: 0x91C6,
- 25068 - 11905: 0x91C7,
- 25069 - 11905: 0x91C8,
- 25070 - 11905: 0x91C9,
- 25071 - 11905: 0x91CA,
- 25072 - 11905: 0x91CB,
- 25073 - 11905: 0x91CC,
- 25074 - 11905: 0x91CD,
- 25075 - 11905: 0x91CE,
- 25076 - 11905: 0x91CF,
- 25077 - 11905: 0xE3C2,
- 25078 - 11905: 0x91D0,
- 25079 - 11905: 0x91D1,
- 25080 - 11905: 0x91D2,
- 25081 - 11905: 0x91D3,
- 25082 - 11905: 0x91D4,
- 25083 - 11905: 0x91D5,
- 25084 - 11905: 0x91D6,
- 25085 - 11905: 0x91D7,
- 25086 - 11905: 0x91D8,
- 25087 - 11905: 0xDCB2,
- 25088 - 11905: 0x91D9,
- 25089 - 11905: 0x91DA,
- 25090 - 11905: 0x91DB,
- 25091 - 11905: 0x91DC,
- 25092 - 11905: 0x91DD,
- 25093 - 11905: 0x91DE,
- 25094 - 11905: 0xEDB0,
- 25095 - 11905: 0x91DF,
- 25096 - 11905: 0xB8EA,
- 25097 - 11905: 0x91E0,
- 25098 - 11905: 0xCEEC,
- 25099 - 11905: 0xEAA7,
- 25100 - 11905: 0xD0E7,
- 25101 - 11905: 0xCAF9,
- 25102 - 11905: 0xC8D6,
- 25103 - 11905: 0xCFB7,
- 25104 - 11905: 0xB3C9,
- 25105 - 11905: 0xCED2,
- 25106 - 11905: 0xBDE4,
- 25107 - 11905: 0x91E1,
- 25108 - 11905: 0x91E2,
- 25109 - 11905: 0xE3DE,
- 25110 - 11905: 0xBBF2,
- 25111 - 11905: 0xEAA8,
- 25112 - 11905: 0xD5BD,
- 25113 - 11905: 0x91E3,
- 25114 - 11905: 0xC6DD,
- 25115 - 11905: 0xEAA9,
- 25116 - 11905: 0x91E4,
- 25117 - 11905: 0x91E5,
- 25118 - 11905: 0x91E6,
- 25119 - 11905: 0xEAAA,
- 25120 - 11905: 0x91E7,
- 25121 - 11905: 0xEAAC,
- 25122 - 11905: 0xEAAB,
- 25123 - 11905: 0x91E8,
- 25124 - 11905: 0xEAAE,
- 25125 - 11905: 0xEAAD,
- 25126 - 11905: 0x91E9,
- 25127 - 11905: 0x91EA,
- 25128 - 11905: 0x91EB,
- 25129 - 11905: 0x91EC,
- 25130 - 11905: 0xBDD8,
- 25131 - 11905: 0x91ED,
- 25132 - 11905: 0xEAAF,
- 25133 - 11905: 0x91EE,
- 25134 - 11905: 0xC2BE,
- 25135 - 11905: 0x91EF,
- 25136 - 11905: 0x91F0,
- 25137 - 11905: 0x91F1,
- 25138 - 11905: 0x91F2,
- 25139 - 11905: 0xB4C1,
- 25140 - 11905: 0xB4F7,
- 25141 - 11905: 0x91F3,
- 25142 - 11905: 0x91F4,
- 25143 - 11905: 0xBBA7,
- 25144 - 11905: 0x91F5,
- 25145 - 11905: 0x91F6,
- 25146 - 11905: 0x91F7,
- 25147 - 11905: 0x91F8,
- 25148 - 11905: 0x91F9,
- 25149 - 11905: 0xECE6,
- 25150 - 11905: 0xECE5,
- 25151 - 11905: 0xB7BF,
- 25152 - 11905: 0xCBF9,
- 25153 - 11905: 0xB1E2,
- 25154 - 11905: 0x91FA,
- 25155 - 11905: 0xECE7,
- 25156 - 11905: 0x91FB,
- 25157 - 11905: 0x91FC,
- 25158 - 11905: 0x91FD,
- 25159 - 11905: 0xC9C8,
- 25160 - 11905: 0xECE8,
- 25161 - 11905: 0xECE9,
- 25162 - 11905: 0x91FE,
- 25163 - 11905: 0xCAD6,
- 25164 - 11905: 0xDED0,
- 25165 - 11905: 0xB2C5,
- 25166 - 11905: 0xD4FA,
- 25167 - 11905: 0x9240,
- 25168 - 11905: 0x9241,
- 25169 - 11905: 0xC6CB,
- 25170 - 11905: 0xB0C7,
- 25171 - 11905: 0xB4F2,
- 25172 - 11905: 0xC8D3,
- 25173 - 11905: 0x9242,
- 25174 - 11905: 0x9243,
- 25175 - 11905: 0x9244,
- 25176 - 11905: 0xCDD0,
- 25177 - 11905: 0x9245,
- 25178 - 11905: 0x9246,
- 25179 - 11905: 0xBFB8,
- 25180 - 11905: 0x9247,
- 25181 - 11905: 0x9248,
- 25182 - 11905: 0x9249,
- 25183 - 11905: 0x924A,
- 25184 - 11905: 0x924B,
- 25185 - 11905: 0x924C,
- 25186 - 11905: 0x924D,
- 25187 - 11905: 0xBFDB,
- 25188 - 11905: 0x924E,
- 25189 - 11905: 0x924F,
- 25190 - 11905: 0xC7A4,
- 25191 - 11905: 0xD6B4,
- 25192 - 11905: 0x9250,
- 25193 - 11905: 0xC0A9,
- 25194 - 11905: 0xDED1,
- 25195 - 11905: 0xC9A8,
- 25196 - 11905: 0xD1EF,
- 25197 - 11905: 0xC5A4,
- 25198 - 11905: 0xB0E7,
- 25199 - 11905: 0xB3B6,
- 25200 - 11905: 0xC8C5,
- 25201 - 11905: 0x9251,
- 25202 - 11905: 0x9252,
- 25203 - 11905: 0xB0E2,
- 25204 - 11905: 0x9253,
- 25205 - 11905: 0x9254,
- 25206 - 11905: 0xB7F6,
- 25207 - 11905: 0x9255,
- 25208 - 11905: 0x9256,
- 25209 - 11905: 0xC5FA,
- 25210 - 11905: 0x9257,
- 25211 - 11905: 0x9258,
- 25212 - 11905: 0xB6F3,
- 25213 - 11905: 0x9259,
- 25214 - 11905: 0xD5D2,
- 25215 - 11905: 0xB3D0,
- 25216 - 11905: 0xBCBC,
- 25217 - 11905: 0x925A,
- 25218 - 11905: 0x925B,
- 25219 - 11905: 0x925C,
- 25220 - 11905: 0xB3AD,
- 25221 - 11905: 0x925D,
- 25222 - 11905: 0x925E,
- 25223 - 11905: 0x925F,
- 25224 - 11905: 0x9260,
- 25225 - 11905: 0xBEF1,
- 25226 - 11905: 0xB0D1,
- 25227 - 11905: 0x9261,
- 25228 - 11905: 0x9262,
- 25229 - 11905: 0x9263,
- 25230 - 11905: 0x9264,
- 25231 - 11905: 0x9265,
- 25232 - 11905: 0x9266,
- 25233 - 11905: 0xD2D6,
- 25234 - 11905: 0xCAE3,
- 25235 - 11905: 0xD7A5,
- 25236 - 11905: 0x9267,
- 25237 - 11905: 0xCDB6,
- 25238 - 11905: 0xB6B6,
- 25239 - 11905: 0xBFB9,
- 25240 - 11905: 0xD5DB,
- 25241 - 11905: 0x9268,
- 25242 - 11905: 0xB8A7,
- 25243 - 11905: 0xC5D7,
- 25244 - 11905: 0x9269,
- 25245 - 11905: 0x926A,
- 25246 - 11905: 0x926B,
- 25247 - 11905: 0xDED2,
- 25248 - 11905: 0xBFD9,
- 25249 - 11905: 0xC2D5,
- 25250 - 11905: 0xC7C0,
- 25251 - 11905: 0x926C,
- 25252 - 11905: 0xBBA4,
- 25253 - 11905: 0xB1A8,
- 25254 - 11905: 0x926D,
- 25255 - 11905: 0x926E,
- 25256 - 11905: 0xC5EA,
- 25257 - 11905: 0x926F,
- 25258 - 11905: 0x9270,
- 25259 - 11905: 0xC5FB,
- 25260 - 11905: 0xCCA7,
- 25261 - 11905: 0x9271,
- 25262 - 11905: 0x9272,
- 25263 - 11905: 0x9273,
- 25264 - 11905: 0x9274,
- 25265 - 11905: 0xB1A7,
- 25266 - 11905: 0x9275,
- 25267 - 11905: 0x9276,
- 25268 - 11905: 0x9277,
- 25269 - 11905: 0xB5D6,
- 25270 - 11905: 0x9278,
- 25271 - 11905: 0x9279,
- 25272 - 11905: 0x927A,
- 25273 - 11905: 0xC4A8,
- 25274 - 11905: 0x927B,
- 25275 - 11905: 0xDED3,
- 25276 - 11905: 0xD1BA,
- 25277 - 11905: 0xB3E9,
- 25278 - 11905: 0x927C,
- 25279 - 11905: 0xC3F2,
- 25280 - 11905: 0x927D,
- 25281 - 11905: 0x927E,
- 25282 - 11905: 0xB7F7,
- 25283 - 11905: 0x9280,
- 25284 - 11905: 0xD6F4,
- 25285 - 11905: 0xB5A3,
- 25286 - 11905: 0xB2F0,
- 25287 - 11905: 0xC4B4,
- 25288 - 11905: 0xC4E9,
- 25289 - 11905: 0xC0AD,
- 25290 - 11905: 0xDED4,
- 25291 - 11905: 0x9281,
- 25292 - 11905: 0xB0E8,
- 25293 - 11905: 0xC5C4,
- 25294 - 11905: 0xC1E0,
- 25295 - 11905: 0x9282,
- 25296 - 11905: 0xB9D5,
- 25297 - 11905: 0x9283,
- 25298 - 11905: 0xBEDC,
- 25299 - 11905: 0xCDD8,
- 25300 - 11905: 0xB0CE,
- 25301 - 11905: 0x9284,
- 25302 - 11905: 0xCDCF,
- 25303 - 11905: 0xDED6,
- 25304 - 11905: 0xBED0,
- 25305 - 11905: 0xD7BE,
- 25306 - 11905: 0xDED5,
- 25307 - 11905: 0xD5D0,
- 25308 - 11905: 0xB0DD,
- 25309 - 11905: 0x9285,
- 25310 - 11905: 0x9286,
- 25311 - 11905: 0xC4E2,
- 25312 - 11905: 0x9287,
- 25313 - 11905: 0x9288,
- 25314 - 11905: 0xC2A3,
- 25315 - 11905: 0xBCF0,
- 25316 - 11905: 0x9289,
- 25317 - 11905: 0xD3B5,
- 25318 - 11905: 0xC0B9,
- 25319 - 11905: 0xC5A1,
- 25320 - 11905: 0xB2A6,
- 25321 - 11905: 0xD4F1,
- 25322 - 11905: 0x928A,
- 25323 - 11905: 0x928B,
- 25324 - 11905: 0xC0A8,
- 25325 - 11905: 0xCAC3,
- 25326 - 11905: 0xDED7,
- 25327 - 11905: 0xD5FC,
- 25328 - 11905: 0x928C,
- 25329 - 11905: 0xB9B0,
- 25330 - 11905: 0x928D,
- 25331 - 11905: 0xC8AD,
- 25332 - 11905: 0xCBA9,
- 25333 - 11905: 0x928E,
- 25334 - 11905: 0xDED9,
- 25335 - 11905: 0xBFBD,
- 25336 - 11905: 0x928F,
- 25337 - 11905: 0x9290,
- 25338 - 11905: 0x9291,
- 25339 - 11905: 0x9292,
- 25340 - 11905: 0xC6B4,
- 25341 - 11905: 0xD7A7,
- 25342 - 11905: 0xCAB0,
- 25343 - 11905: 0xC4C3,
- 25344 - 11905: 0x9293,
- 25345 - 11905: 0xB3D6,
- 25346 - 11905: 0xB9D2,
- 25347 - 11905: 0x9294,
- 25348 - 11905: 0x9295,
- 25349 - 11905: 0x9296,
- 25350 - 11905: 0x9297,
- 25351 - 11905: 0xD6B8,
- 25352 - 11905: 0xEAFC,
- 25353 - 11905: 0xB0B4,
- 25354 - 11905: 0x9298,
- 25355 - 11905: 0x9299,
- 25356 - 11905: 0x929A,
- 25357 - 11905: 0x929B,
- 25358 - 11905: 0xBFE6,
- 25359 - 11905: 0x929C,
- 25360 - 11905: 0x929D,
- 25361 - 11905: 0xCCF4,
- 25362 - 11905: 0x929E,
- 25363 - 11905: 0x929F,
- 25364 - 11905: 0x92A0,
- 25365 - 11905: 0x92A1,
- 25366 - 11905: 0xCDDA,
- 25367 - 11905: 0x92A2,
- 25368 - 11905: 0x92A3,
- 25369 - 11905: 0x92A4,
- 25370 - 11905: 0xD6BF,
- 25371 - 11905: 0xC2CE,
- 25372 - 11905: 0x92A5,
- 25373 - 11905: 0xCECE,
- 25374 - 11905: 0xCCA2,
- 25375 - 11905: 0xD0AE,
- 25376 - 11905: 0xC4D3,
- 25377 - 11905: 0xB5B2,
- 25378 - 11905: 0xDED8,
- 25379 - 11905: 0xD5F5,
- 25380 - 11905: 0xBCB7,
- 25381 - 11905: 0xBBD3,
- 25382 - 11905: 0x92A6,
- 25383 - 11905: 0x92A7,
- 25384 - 11905: 0xB0A4,
- 25385 - 11905: 0x92A8,
- 25386 - 11905: 0xC5B2,
- 25387 - 11905: 0xB4EC,
- 25388 - 11905: 0x92A9,
- 25389 - 11905: 0x92AA,
- 25390 - 11905: 0x92AB,
- 25391 - 11905: 0xD5F1,
- 25392 - 11905: 0x92AC,
- 25393 - 11905: 0x92AD,
- 25394 - 11905: 0xEAFD,
- 25395 - 11905: 0x92AE,
- 25396 - 11905: 0x92AF,
- 25397 - 11905: 0x92B0,
- 25398 - 11905: 0x92B1,
- 25399 - 11905: 0x92B2,
- 25400 - 11905: 0x92B3,
- 25401 - 11905: 0xDEDA,
- 25402 - 11905: 0xCDA6,
- 25403 - 11905: 0x92B4,
- 25404 - 11905: 0x92B5,
- 25405 - 11905: 0xCDEC,
- 25406 - 11905: 0x92B6,
- 25407 - 11905: 0x92B7,
- 25408 - 11905: 0x92B8,
- 25409 - 11905: 0x92B9,
- 25410 - 11905: 0xCEE6,
- 25411 - 11905: 0xDEDC,
- 25412 - 11905: 0x92BA,
- 25413 - 11905: 0xCDB1,
- 25414 - 11905: 0xC0A6,
- 25415 - 11905: 0x92BB,
- 25416 - 11905: 0x92BC,
- 25417 - 11905: 0xD7BD,
- 25418 - 11905: 0x92BD,
- 25419 - 11905: 0xDEDB,
- 25420 - 11905: 0xB0C6,
- 25421 - 11905: 0xBAB4,
- 25422 - 11905: 0xC9D3,
- 25423 - 11905: 0xC4F3,
- 25424 - 11905: 0xBEE8,
- 25425 - 11905: 0x92BE,
- 25426 - 11905: 0x92BF,
- 25427 - 11905: 0x92C0,
- 25428 - 11905: 0x92C1,
- 25429 - 11905: 0xB2B6,
- 25430 - 11905: 0x92C2,
- 25431 - 11905: 0x92C3,
- 25432 - 11905: 0x92C4,
- 25433 - 11905: 0x92C5,
- 25434 - 11905: 0x92C6,
- 25435 - 11905: 0x92C7,
- 25436 - 11905: 0x92C8,
- 25437 - 11905: 0x92C9,
- 25438 - 11905: 0xC0CC,
- 25439 - 11905: 0xCBF0,
- 25440 - 11905: 0x92CA,
- 25441 - 11905: 0xBCF1,
- 25442 - 11905: 0xBBBB,
- 25443 - 11905: 0xB5B7,
- 25444 - 11905: 0x92CB,
- 25445 - 11905: 0x92CC,
- 25446 - 11905: 0x92CD,
- 25447 - 11905: 0xC5F5,
- 25448 - 11905: 0x92CE,
- 25449 - 11905: 0xDEE6,
- 25450 - 11905: 0x92CF,
- 25451 - 11905: 0x92D0,
- 25452 - 11905: 0x92D1,
- 25453 - 11905: 0xDEE3,
- 25454 - 11905: 0xBEDD,
- 25455 - 11905: 0x92D2,
- 25456 - 11905: 0x92D3,
- 25457 - 11905: 0xDEDF,
- 25458 - 11905: 0x92D4,
- 25459 - 11905: 0x92D5,
- 25460 - 11905: 0x92D6,
- 25461 - 11905: 0x92D7,
- 25462 - 11905: 0xB4B7,
- 25463 - 11905: 0xBDDD,
- 25464 - 11905: 0x92D8,
- 25465 - 11905: 0x92D9,
- 25466 - 11905: 0xDEE0,
- 25467 - 11905: 0xC4ED,
- 25468 - 11905: 0x92DA,
- 25469 - 11905: 0x92DB,
- 25470 - 11905: 0x92DC,
- 25471 - 11905: 0x92DD,
- 25472 - 11905: 0xCFC6,
- 25473 - 11905: 0x92DE,
- 25474 - 11905: 0xB5E0,
- 25475 - 11905: 0x92DF,
- 25476 - 11905: 0x92E0,
- 25477 - 11905: 0x92E1,
- 25478 - 11905: 0x92E2,
- 25479 - 11905: 0xB6DE,
- 25480 - 11905: 0xCADA,
- 25481 - 11905: 0xB5F4,
- 25482 - 11905: 0xDEE5,
- 25483 - 11905: 0x92E3,
- 25484 - 11905: 0xD5C6,
- 25485 - 11905: 0x92E4,
- 25486 - 11905: 0xDEE1,
- 25487 - 11905: 0xCCCD,
- 25488 - 11905: 0xC6FE,
- 25489 - 11905: 0x92E5,
- 25490 - 11905: 0xC5C5,
- 25491 - 11905: 0x92E6,
- 25492 - 11905: 0x92E7,
- 25493 - 11905: 0x92E8,
- 25494 - 11905: 0xD2B4,
- 25495 - 11905: 0x92E9,
- 25496 - 11905: 0xBEF2,
- 25497 - 11905: 0x92EA,
- 25498 - 11905: 0x92EB,
- 25499 - 11905: 0x92EC,
- 25500 - 11905: 0x92ED,
- 25501 - 11905: 0x92EE,
- 25502 - 11905: 0x92EF,
- 25503 - 11905: 0x92F0,
- 25504 - 11905: 0xC2D3,
- 25505 - 11905: 0x92F1,
- 25506 - 11905: 0xCCBD,
- 25507 - 11905: 0xB3B8,
- 25508 - 11905: 0x92F2,
- 25509 - 11905: 0xBDD3,
- 25510 - 11905: 0x92F3,
- 25511 - 11905: 0xBFD8,
- 25512 - 11905: 0xCDC6,
- 25513 - 11905: 0xD1DA,
- 25514 - 11905: 0xB4EB,
- 25515 - 11905: 0x92F4,
- 25516 - 11905: 0xDEE4,
- 25517 - 11905: 0xDEDD,
- 25518 - 11905: 0xDEE7,
- 25519 - 11905: 0x92F5,
- 25520 - 11905: 0xEAFE,
- 25521 - 11905: 0x92F6,
- 25522 - 11905: 0x92F7,
- 25523 - 11905: 0xC2B0,
- 25524 - 11905: 0xDEE2,
- 25525 - 11905: 0x92F8,
- 25526 - 11905: 0x92F9,
- 25527 - 11905: 0xD6C0,
- 25528 - 11905: 0xB5A7,
- 25529 - 11905: 0x92FA,
- 25530 - 11905: 0xB2F4,
- 25531 - 11905: 0x92FB,
- 25532 - 11905: 0xDEE8,
- 25533 - 11905: 0x92FC,
- 25534 - 11905: 0xDEF2,
- 25535 - 11905: 0x92FD,
- 25536 - 11905: 0x92FE,
- 25537 - 11905: 0x9340,
- 25538 - 11905: 0x9341,
- 25539 - 11905: 0x9342,
- 25540 - 11905: 0xDEED,
- 25541 - 11905: 0x9343,
- 25542 - 11905: 0xDEF1,
- 25543 - 11905: 0x9344,
- 25544 - 11905: 0x9345,
- 25545 - 11905: 0xC8E0,
- 25546 - 11905: 0x9346,
- 25547 - 11905: 0x9347,
- 25548 - 11905: 0x9348,
- 25549 - 11905: 0xD7E1,
- 25550 - 11905: 0xDEEF,
- 25551 - 11905: 0xC3E8,
- 25552 - 11905: 0xCCE1,
- 25553 - 11905: 0x9349,
- 25554 - 11905: 0xB2E5,
- 25555 - 11905: 0x934A,
- 25556 - 11905: 0x934B,
- 25557 - 11905: 0x934C,
- 25558 - 11905: 0xD2BE,
- 25559 - 11905: 0x934D,
- 25560 - 11905: 0x934E,
- 25561 - 11905: 0x934F,
- 25562 - 11905: 0x9350,
- 25563 - 11905: 0x9351,
- 25564 - 11905: 0x9352,
- 25565 - 11905: 0x9353,
- 25566 - 11905: 0xDEEE,
- 25567 - 11905: 0x9354,
- 25568 - 11905: 0xDEEB,
- 25569 - 11905: 0xCED5,
- 25570 - 11905: 0x9355,
- 25571 - 11905: 0xB4A7,
- 25572 - 11905: 0x9356,
- 25573 - 11905: 0x9357,
- 25574 - 11905: 0x9358,
- 25575 - 11905: 0x9359,
- 25576 - 11905: 0x935A,
- 25577 - 11905: 0xBFAB,
- 25578 - 11905: 0xBEBE,
- 25579 - 11905: 0x935B,
- 25580 - 11905: 0x935C,
- 25581 - 11905: 0xBDD2,
- 25582 - 11905: 0x935D,
- 25583 - 11905: 0x935E,
- 25584 - 11905: 0x935F,
- 25585 - 11905: 0x9360,
- 25586 - 11905: 0xDEE9,
- 25587 - 11905: 0x9361,
- 25588 - 11905: 0xD4AE,
- 25589 - 11905: 0x9362,
- 25590 - 11905: 0xDEDE,
- 25591 - 11905: 0x9363,
- 25592 - 11905: 0xDEEA,
- 25593 - 11905: 0x9364,
- 25594 - 11905: 0x9365,
- 25595 - 11905: 0x9366,
- 25596 - 11905: 0x9367,
- 25597 - 11905: 0xC0BF,
- 25598 - 11905: 0x9368,
- 25599 - 11905: 0xDEEC,
- 25600 - 11905: 0xB2F3,
- 25601 - 11905: 0xB8E9,
- 25602 - 11905: 0xC2A7,
- 25603 - 11905: 0x9369,
- 25604 - 11905: 0x936A,
- 25605 - 11905: 0xBDC1,
- 25606 - 11905: 0x936B,
- 25607 - 11905: 0x936C,
- 25608 - 11905: 0x936D,
- 25609 - 11905: 0x936E,
- 25610 - 11905: 0x936F,
- 25611 - 11905: 0xDEF5,
- 25612 - 11905: 0xDEF8,
- 25613 - 11905: 0x9370,
- 25614 - 11905: 0x9371,
- 25615 - 11905: 0xB2AB,
- 25616 - 11905: 0xB4A4,
- 25617 - 11905: 0x9372,
- 25618 - 11905: 0x9373,
- 25619 - 11905: 0xB4EA,
- 25620 - 11905: 0xC9A6,
- 25621 - 11905: 0x9374,
- 25622 - 11905: 0x9375,
- 25623 - 11905: 0x9376,
- 25624 - 11905: 0x9377,
- 25625 - 11905: 0x9378,
- 25626 - 11905: 0x9379,
- 25627 - 11905: 0xDEF6,
- 25628 - 11905: 0xCBD1,
- 25629 - 11905: 0x937A,
- 25630 - 11905: 0xB8E3,
- 25631 - 11905: 0x937B,
- 25632 - 11905: 0xDEF7,
- 25633 - 11905: 0xDEFA,
- 25634 - 11905: 0x937C,
- 25635 - 11905: 0x937D,
- 25636 - 11905: 0x937E,
- 25637 - 11905: 0x9380,
- 25638 - 11905: 0xDEF9,
- 25639 - 11905: 0x9381,
- 25640 - 11905: 0x9382,
- 25641 - 11905: 0x9383,
- 25642 - 11905: 0xCCC2,
- 25643 - 11905: 0x9384,
- 25644 - 11905: 0xB0E1,
- 25645 - 11905: 0xB4EE,
- 25646 - 11905: 0x9385,
- 25647 - 11905: 0x9386,
- 25648 - 11905: 0x9387,
- 25649 - 11905: 0x9388,
- 25650 - 11905: 0x9389,
- 25651 - 11905: 0x938A,
- 25652 - 11905: 0xE5BA,
- 25653 - 11905: 0x938B,
- 25654 - 11905: 0x938C,
- 25655 - 11905: 0x938D,
- 25656 - 11905: 0x938E,
- 25657 - 11905: 0x938F,
- 25658 - 11905: 0xD0AF,
- 25659 - 11905: 0x9390,
- 25660 - 11905: 0x9391,
- 25661 - 11905: 0xB2EB,
- 25662 - 11905: 0x9392,
- 25663 - 11905: 0xEBA1,
- 25664 - 11905: 0x9393,
- 25665 - 11905: 0xDEF4,
- 25666 - 11905: 0x9394,
- 25667 - 11905: 0x9395,
- 25668 - 11905: 0xC9E3,
- 25669 - 11905: 0xDEF3,
- 25670 - 11905: 0xB0DA,
- 25671 - 11905: 0xD2A1,
- 25672 - 11905: 0xB1F7,
- 25673 - 11905: 0x9396,
- 25674 - 11905: 0xCCAF,
- 25675 - 11905: 0x9397,
- 25676 - 11905: 0x9398,
- 25677 - 11905: 0x9399,
- 25678 - 11905: 0x939A,
- 25679 - 11905: 0x939B,
- 25680 - 11905: 0x939C,
- 25681 - 11905: 0x939D,
- 25682 - 11905: 0xDEF0,
- 25683 - 11905: 0x939E,
- 25684 - 11905: 0xCBA4,
- 25685 - 11905: 0x939F,
- 25686 - 11905: 0x93A0,
- 25687 - 11905: 0x93A1,
- 25688 - 11905: 0xD5AA,
- 25689 - 11905: 0x93A2,
- 25690 - 11905: 0x93A3,
- 25691 - 11905: 0x93A4,
- 25692 - 11905: 0x93A5,
- 25693 - 11905: 0x93A6,
- 25694 - 11905: 0xDEFB,
- 25695 - 11905: 0x93A7,
- 25696 - 11905: 0x93A8,
- 25697 - 11905: 0x93A9,
- 25698 - 11905: 0x93AA,
- 25699 - 11905: 0x93AB,
- 25700 - 11905: 0x93AC,
- 25701 - 11905: 0x93AD,
- 25702 - 11905: 0x93AE,
- 25703 - 11905: 0xB4DD,
- 25704 - 11905: 0x93AF,
- 25705 - 11905: 0xC4A6,
- 25706 - 11905: 0x93B0,
- 25707 - 11905: 0x93B1,
- 25708 - 11905: 0x93B2,
- 25709 - 11905: 0xDEFD,
- 25710 - 11905: 0x93B3,
- 25711 - 11905: 0x93B4,
- 25712 - 11905: 0x93B5,
- 25713 - 11905: 0x93B6,
- 25714 - 11905: 0x93B7,
- 25715 - 11905: 0x93B8,
- 25716 - 11905: 0x93B9,
- 25717 - 11905: 0x93BA,
- 25718 - 11905: 0x93BB,
- 25719 - 11905: 0x93BC,
- 25720 - 11905: 0xC3FE,
- 25721 - 11905: 0xC4A1,
- 25722 - 11905: 0xDFA1,
- 25723 - 11905: 0x93BD,
- 25724 - 11905: 0x93BE,
- 25725 - 11905: 0x93BF,
- 25726 - 11905: 0x93C0,
- 25727 - 11905: 0x93C1,
- 25728 - 11905: 0x93C2,
- 25729 - 11905: 0x93C3,
- 25730 - 11905: 0xC1CC,
- 25731 - 11905: 0x93C4,
- 25732 - 11905: 0xDEFC,
- 25733 - 11905: 0xBEEF,
- 25734 - 11905: 0x93C5,
- 25735 - 11905: 0xC6B2,
- 25736 - 11905: 0x93C6,
- 25737 - 11905: 0x93C7,
- 25738 - 11905: 0x93C8,
- 25739 - 11905: 0x93C9,
- 25740 - 11905: 0x93CA,
- 25741 - 11905: 0x93CB,
- 25742 - 11905: 0x93CC,
- 25743 - 11905: 0x93CD,
- 25744 - 11905: 0x93CE,
- 25745 - 11905: 0xB3C5,
- 25746 - 11905: 0xC8F6,
- 25747 - 11905: 0x93CF,
- 25748 - 11905: 0x93D0,
- 25749 - 11905: 0xCBBA,
- 25750 - 11905: 0xDEFE,
- 25751 - 11905: 0x93D1,
- 25752 - 11905: 0x93D2,
- 25753 - 11905: 0xDFA4,
- 25754 - 11905: 0x93D3,
- 25755 - 11905: 0x93D4,
- 25756 - 11905: 0x93D5,
- 25757 - 11905: 0x93D6,
- 25758 - 11905: 0xD7B2,
- 25759 - 11905: 0x93D7,
- 25760 - 11905: 0x93D8,
- 25761 - 11905: 0x93D9,
- 25762 - 11905: 0x93DA,
- 25763 - 11905: 0x93DB,
- 25764 - 11905: 0xB3B7,
- 25765 - 11905: 0x93DC,
- 25766 - 11905: 0x93DD,
- 25767 - 11905: 0x93DE,
- 25768 - 11905: 0x93DF,
- 25769 - 11905: 0xC1C3,
- 25770 - 11905: 0x93E0,
- 25771 - 11905: 0x93E1,
- 25772 - 11905: 0xC7CB,
- 25773 - 11905: 0xB2A5,
- 25774 - 11905: 0xB4E9,
- 25775 - 11905: 0x93E2,
- 25776 - 11905: 0xD7AB,
- 25777 - 11905: 0x93E3,
- 25778 - 11905: 0x93E4,
- 25779 - 11905: 0x93E5,
- 25780 - 11905: 0x93E6,
- 25781 - 11905: 0xC4EC,
- 25782 - 11905: 0x93E7,
- 25783 - 11905: 0xDFA2,
- 25784 - 11905: 0xDFA3,
- 25785 - 11905: 0x93E8,
- 25786 - 11905: 0xDFA5,
- 25787 - 11905: 0x93E9,
- 25788 - 11905: 0xBAB3,
- 25789 - 11905: 0x93EA,
- 25790 - 11905: 0x93EB,
- 25791 - 11905: 0x93EC,
- 25792 - 11905: 0xDFA6,
- 25793 - 11905: 0x93ED,
- 25794 - 11905: 0xC0DE,
- 25795 - 11905: 0x93EE,
- 25796 - 11905: 0x93EF,
- 25797 - 11905: 0xC9C3,
- 25798 - 11905: 0x93F0,
- 25799 - 11905: 0x93F1,
- 25800 - 11905: 0x93F2,
- 25801 - 11905: 0x93F3,
- 25802 - 11905: 0x93F4,
- 25803 - 11905: 0x93F5,
- 25804 - 11905: 0x93F6,
- 25805 - 11905: 0xB2D9,
- 25806 - 11905: 0xC7E6,
- 25807 - 11905: 0x93F7,
- 25808 - 11905: 0xDFA7,
- 25809 - 11905: 0x93F8,
- 25810 - 11905: 0xC7DC,
- 25811 - 11905: 0x93F9,
- 25812 - 11905: 0x93FA,
- 25813 - 11905: 0x93FB,
- 25814 - 11905: 0x93FC,
- 25815 - 11905: 0xDFA8,
- 25816 - 11905: 0xEBA2,
- 25817 - 11905: 0x93FD,
- 25818 - 11905: 0x93FE,
- 25819 - 11905: 0x9440,
- 25820 - 11905: 0x9441,
- 25821 - 11905: 0x9442,
- 25822 - 11905: 0xCBD3,
- 25823 - 11905: 0x9443,
- 25824 - 11905: 0x9444,
- 25825 - 11905: 0x9445,
- 25826 - 11905: 0xDFAA,
- 25827 - 11905: 0x9446,
- 25828 - 11905: 0xDFA9,
- 25829 - 11905: 0x9447,
- 25830 - 11905: 0xB2C1,
- 25831 - 11905: 0x9448,
- 25832 - 11905: 0x9449,
- 25833 - 11905: 0x944A,
- 25834 - 11905: 0x944B,
- 25835 - 11905: 0x944C,
- 25836 - 11905: 0x944D,
- 25837 - 11905: 0x944E,
- 25838 - 11905: 0x944F,
- 25839 - 11905: 0x9450,
- 25840 - 11905: 0x9451,
- 25841 - 11905: 0x9452,
- 25842 - 11905: 0x9453,
- 25843 - 11905: 0x9454,
- 25844 - 11905: 0x9455,
- 25845 - 11905: 0x9456,
- 25846 - 11905: 0x9457,
- 25847 - 11905: 0x9458,
- 25848 - 11905: 0x9459,
- 25849 - 11905: 0x945A,
- 25850 - 11905: 0x945B,
- 25851 - 11905: 0x945C,
- 25852 - 11905: 0x945D,
- 25853 - 11905: 0x945E,
- 25854 - 11905: 0x945F,
- 25855 - 11905: 0x9460,
- 25856 - 11905: 0xC5CA,
- 25857 - 11905: 0x9461,
- 25858 - 11905: 0x9462,
- 25859 - 11905: 0x9463,
- 25860 - 11905: 0x9464,
- 25861 - 11905: 0x9465,
- 25862 - 11905: 0x9466,
- 25863 - 11905: 0x9467,
- 25864 - 11905: 0x9468,
- 25865 - 11905: 0xDFAB,
- 25866 - 11905: 0x9469,
- 25867 - 11905: 0x946A,
- 25868 - 11905: 0x946B,
- 25869 - 11905: 0x946C,
- 25870 - 11905: 0x946D,
- 25871 - 11905: 0x946E,
- 25872 - 11905: 0x946F,
- 25873 - 11905: 0x9470,
- 25874 - 11905: 0xD4DC,
- 25875 - 11905: 0x9471,
- 25876 - 11905: 0x9472,
- 25877 - 11905: 0x9473,
- 25878 - 11905: 0x9474,
- 25879 - 11905: 0x9475,
- 25880 - 11905: 0xC8C1,
- 25881 - 11905: 0x9476,
- 25882 - 11905: 0x9477,
- 25883 - 11905: 0x9478,
- 25884 - 11905: 0x9479,
- 25885 - 11905: 0x947A,
- 25886 - 11905: 0x947B,
- 25887 - 11905: 0x947C,
- 25888 - 11905: 0x947D,
- 25889 - 11905: 0x947E,
- 25890 - 11905: 0x9480,
- 25891 - 11905: 0x9481,
- 25892 - 11905: 0x9482,
- 25893 - 11905: 0xDFAC,
- 25894 - 11905: 0x9483,
- 25895 - 11905: 0x9484,
- 25896 - 11905: 0x9485,
- 25897 - 11905: 0x9486,
- 25898 - 11905: 0x9487,
- 25899 - 11905: 0xBEF0,
- 25900 - 11905: 0x9488,
- 25901 - 11905: 0x9489,
- 25902 - 11905: 0xDFAD,
- 25903 - 11905: 0xD6A7,
- 25904 - 11905: 0x948A,
- 25905 - 11905: 0x948B,
- 25906 - 11905: 0x948C,
- 25907 - 11905: 0x948D,
- 25908 - 11905: 0xEAB7,
- 25909 - 11905: 0xEBB6,
- 25910 - 11905: 0xCAD5,
- 25911 - 11905: 0x948E,
- 25912 - 11905: 0xD8FC,
- 25913 - 11905: 0xB8C4,
- 25914 - 11905: 0x948F,
- 25915 - 11905: 0xB9A5,
- 25916 - 11905: 0x9490,
- 25917 - 11905: 0x9491,
- 25918 - 11905: 0xB7C5,
- 25919 - 11905: 0xD5FE,
- 25920 - 11905: 0x9492,
- 25921 - 11905: 0x9493,
- 25922 - 11905: 0x9494,
- 25923 - 11905: 0x9495,
- 25924 - 11905: 0x9496,
- 25925 - 11905: 0xB9CA,
- 25926 - 11905: 0x9497,
- 25927 - 11905: 0x9498,
- 25928 - 11905: 0xD0A7,
- 25929 - 11905: 0xF4CD,
- 25930 - 11905: 0x9499,
- 25931 - 11905: 0x949A,
- 25932 - 11905: 0xB5D0,
- 25933 - 11905: 0x949B,
- 25934 - 11905: 0x949C,
- 25935 - 11905: 0xC3F4,
- 25936 - 11905: 0x949D,
- 25937 - 11905: 0xBEC8,
- 25938 - 11905: 0x949E,
- 25939 - 11905: 0x949F,
- 25940 - 11905: 0x94A0,
- 25941 - 11905: 0xEBB7,
- 25942 - 11905: 0xB0BD,
- 25943 - 11905: 0x94A1,
- 25944 - 11905: 0x94A2,
- 25945 - 11905: 0xBDCC,
- 25946 - 11905: 0x94A3,
- 25947 - 11905: 0xC1B2,
- 25948 - 11905: 0x94A4,
- 25949 - 11905: 0xB1D6,
- 25950 - 11905: 0xB3A8,
- 25951 - 11905: 0x94A5,
- 25952 - 11905: 0x94A6,
- 25953 - 11905: 0x94A7,
- 25954 - 11905: 0xB8D2,
- 25955 - 11905: 0xC9A2,
- 25956 - 11905: 0x94A8,
- 25957 - 11905: 0x94A9,
- 25958 - 11905: 0xB6D8,
- 25959 - 11905: 0x94AA,
- 25960 - 11905: 0x94AB,
- 25961 - 11905: 0x94AC,
- 25962 - 11905: 0x94AD,
- 25963 - 11905: 0xEBB8,
- 25964 - 11905: 0xBEB4,
- 25965 - 11905: 0x94AE,
- 25966 - 11905: 0x94AF,
- 25967 - 11905: 0x94B0,
- 25968 - 11905: 0xCAFD,
- 25969 - 11905: 0x94B1,
- 25970 - 11905: 0xC7C3,
- 25971 - 11905: 0x94B2,
- 25972 - 11905: 0xD5FB,
- 25973 - 11905: 0x94B3,
- 25974 - 11905: 0x94B4,
- 25975 - 11905: 0xB7F3,
- 25976 - 11905: 0x94B5,
- 25977 - 11905: 0x94B6,
- 25978 - 11905: 0x94B7,
- 25979 - 11905: 0x94B8,
- 25980 - 11905: 0x94B9,
- 25981 - 11905: 0x94BA,
- 25982 - 11905: 0x94BB,
- 25983 - 11905: 0x94BC,
- 25984 - 11905: 0x94BD,
- 25985 - 11905: 0x94BE,
- 25986 - 11905: 0x94BF,
- 25987 - 11905: 0x94C0,
- 25988 - 11905: 0x94C1,
- 25989 - 11905: 0x94C2,
- 25990 - 11905: 0x94C3,
- 25991 - 11905: 0xCEC4,
- 25992 - 11905: 0x94C4,
- 25993 - 11905: 0x94C5,
- 25994 - 11905: 0x94C6,
- 25995 - 11905: 0xD5AB,
- 25996 - 11905: 0xB1F3,
- 25997 - 11905: 0x94C7,
- 25998 - 11905: 0x94C8,
- 25999 - 11905: 0x94C9,
- 26000 - 11905: 0xECB3,
- 26001 - 11905: 0xB0DF,
- 26002 - 11905: 0x94CA,
- 26003 - 11905: 0xECB5,
- 26004 - 11905: 0x94CB,
- 26005 - 11905: 0x94CC,
- 26006 - 11905: 0x94CD,
- 26007 - 11905: 0xB6B7,
- 26008 - 11905: 0x94CE,
- 26009 - 11905: 0xC1CF,
- 26010 - 11905: 0x94CF,
- 26011 - 11905: 0xF5FA,
- 26012 - 11905: 0xD0B1,
- 26013 - 11905: 0x94D0,
- 26014 - 11905: 0x94D1,
- 26015 - 11905: 0xD5E5,
- 26016 - 11905: 0x94D2,
- 26017 - 11905: 0xCED3,
- 26018 - 11905: 0x94D3,
- 26019 - 11905: 0x94D4,
- 26020 - 11905: 0xBDEF,
- 26021 - 11905: 0xB3E2,
- 26022 - 11905: 0x94D5,
- 26023 - 11905: 0xB8AB,
- 26024 - 11905: 0x94D6,
- 26025 - 11905: 0xD5B6,
- 26026 - 11905: 0x94D7,
- 26027 - 11905: 0xEDBD,
- 26028 - 11905: 0x94D8,
- 26029 - 11905: 0xB6CF,
- 26030 - 11905: 0x94D9,
- 26031 - 11905: 0xCBB9,
- 26032 - 11905: 0xD0C2,
- 26033 - 11905: 0x94DA,
- 26034 - 11905: 0x94DB,
- 26035 - 11905: 0x94DC,
- 26036 - 11905: 0x94DD,
- 26037 - 11905: 0x94DE,
- 26038 - 11905: 0x94DF,
- 26039 - 11905: 0x94E0,
- 26040 - 11905: 0x94E1,
- 26041 - 11905: 0xB7BD,
- 26042 - 11905: 0x94E2,
- 26043 - 11905: 0x94E3,
- 26044 - 11905: 0xECB6,
- 26045 - 11905: 0xCAA9,
- 26046 - 11905: 0x94E4,
- 26047 - 11905: 0x94E5,
- 26048 - 11905: 0x94E6,
- 26049 - 11905: 0xC5D4,
- 26050 - 11905: 0x94E7,
- 26051 - 11905: 0xECB9,
- 26052 - 11905: 0xECB8,
- 26053 - 11905: 0xC2C3,
- 26054 - 11905: 0xECB7,
- 26055 - 11905: 0x94E8,
- 26056 - 11905: 0x94E9,
- 26057 - 11905: 0x94EA,
- 26058 - 11905: 0x94EB,
- 26059 - 11905: 0xD0FD,
- 26060 - 11905: 0xECBA,
- 26061 - 11905: 0x94EC,
- 26062 - 11905: 0xECBB,
- 26063 - 11905: 0xD7E5,
- 26064 - 11905: 0x94ED,
- 26065 - 11905: 0x94EE,
- 26066 - 11905: 0xECBC,
- 26067 - 11905: 0x94EF,
- 26068 - 11905: 0x94F0,
- 26069 - 11905: 0x94F1,
- 26070 - 11905: 0xECBD,
- 26071 - 11905: 0xC6EC,
- 26072 - 11905: 0x94F2,
- 26073 - 11905: 0x94F3,
- 26074 - 11905: 0x94F4,
- 26075 - 11905: 0x94F5,
- 26076 - 11905: 0x94F6,
- 26077 - 11905: 0x94F7,
- 26078 - 11905: 0x94F8,
- 26079 - 11905: 0x94F9,
- 26080 - 11905: 0xCEDE,
- 26081 - 11905: 0x94FA,
- 26082 - 11905: 0xBCC8,
- 26083 - 11905: 0x94FB,
- 26084 - 11905: 0x94FC,
- 26085 - 11905: 0xC8D5,
- 26086 - 11905: 0xB5A9,
- 26087 - 11905: 0xBEC9,
- 26088 - 11905: 0xD6BC,
- 26089 - 11905: 0xD4E7,
- 26090 - 11905: 0x94FD,
- 26091 - 11905: 0x94FE,
- 26092 - 11905: 0xD1AE,
- 26093 - 11905: 0xD0F1,
- 26094 - 11905: 0xEAB8,
- 26095 - 11905: 0xEAB9,
- 26096 - 11905: 0xEABA,
- 26097 - 11905: 0xBAB5,
- 26098 - 11905: 0x9540,
- 26099 - 11905: 0x9541,
- 26100 - 11905: 0x9542,
- 26101 - 11905: 0x9543,
- 26102 - 11905: 0xCAB1,
- 26103 - 11905: 0xBFF5,
- 26104 - 11905: 0x9544,
- 26105 - 11905: 0x9545,
- 26106 - 11905: 0xCDFA,
- 26107 - 11905: 0x9546,
- 26108 - 11905: 0x9547,
- 26109 - 11905: 0x9548,
- 26110 - 11905: 0x9549,
- 26111 - 11905: 0x954A,
- 26112 - 11905: 0xEAC0,
- 26113 - 11905: 0x954B,
- 26114 - 11905: 0xB0BA,
- 26115 - 11905: 0xEABE,
- 26116 - 11905: 0x954C,
- 26117 - 11905: 0x954D,
- 26118 - 11905: 0xC0A5,
- 26119 - 11905: 0x954E,
- 26120 - 11905: 0x954F,
- 26121 - 11905: 0x9550,
- 26122 - 11905: 0xEABB,
- 26123 - 11905: 0x9551,
- 26124 - 11905: 0xB2FD,
- 26125 - 11905: 0x9552,
- 26126 - 11905: 0xC3F7,
- 26127 - 11905: 0xBBE8,
- 26128 - 11905: 0x9553,
- 26129 - 11905: 0x9554,
- 26130 - 11905: 0x9555,
- 26131 - 11905: 0xD2D7,
- 26132 - 11905: 0xCEF4,
- 26133 - 11905: 0xEABF,
- 26134 - 11905: 0x9556,
- 26135 - 11905: 0x9557,
- 26136 - 11905: 0x9558,
- 26137 - 11905: 0xEABC,
- 26138 - 11905: 0x9559,
- 26139 - 11905: 0x955A,
- 26140 - 11905: 0x955B,
- 26141 - 11905: 0xEAC3,
- 26142 - 11905: 0x955C,
- 26143 - 11905: 0xD0C7,
- 26144 - 11905: 0xD3B3,
- 26145 - 11905: 0x955D,
- 26146 - 11905: 0x955E,
- 26147 - 11905: 0x955F,
- 26148 - 11905: 0x9560,
- 26149 - 11905: 0xB4BA,
- 26150 - 11905: 0x9561,
- 26151 - 11905: 0xC3C1,
- 26152 - 11905: 0xD7F2,
- 26153 - 11905: 0x9562,
- 26154 - 11905: 0x9563,
- 26155 - 11905: 0x9564,
- 26156 - 11905: 0x9565,
- 26157 - 11905: 0xD5D1,
- 26158 - 11905: 0x9566,
- 26159 - 11905: 0xCAC7,
- 26160 - 11905: 0x9567,
- 26161 - 11905: 0xEAC5,
- 26162 - 11905: 0x9568,
- 26163 - 11905: 0x9569,
- 26164 - 11905: 0xEAC4,
- 26165 - 11905: 0xEAC7,
- 26166 - 11905: 0xEAC6,
- 26167 - 11905: 0x956A,
- 26168 - 11905: 0x956B,
- 26169 - 11905: 0x956C,
- 26170 - 11905: 0x956D,
- 26171 - 11905: 0x956E,
- 26172 - 11905: 0xD6E7,
- 26173 - 11905: 0x956F,
- 26174 - 11905: 0xCFD4,
- 26175 - 11905: 0x9570,
- 26176 - 11905: 0x9571,
- 26177 - 11905: 0xEACB,
- 26178 - 11905: 0x9572,
- 26179 - 11905: 0xBBCE,
- 26180 - 11905: 0x9573,
- 26181 - 11905: 0x9574,
- 26182 - 11905: 0x9575,
- 26183 - 11905: 0x9576,
- 26184 - 11905: 0x9577,
- 26185 - 11905: 0x9578,
- 26186 - 11905: 0x9579,
- 26187 - 11905: 0xBDFA,
- 26188 - 11905: 0xC9CE,
- 26189 - 11905: 0x957A,
- 26190 - 11905: 0x957B,
- 26191 - 11905: 0xEACC,
- 26192 - 11905: 0x957C,
- 26193 - 11905: 0x957D,
- 26194 - 11905: 0xC9B9,
- 26195 - 11905: 0xCFFE,
- 26196 - 11905: 0xEACA,
- 26197 - 11905: 0xD4CE,
- 26198 - 11905: 0xEACD,
- 26199 - 11905: 0xEACF,
- 26200 - 11905: 0x957E,
- 26201 - 11905: 0x9580,
- 26202 - 11905: 0xCDED,
- 26203 - 11905: 0x9581,
- 26204 - 11905: 0x9582,
- 26205 - 11905: 0x9583,
- 26206 - 11905: 0x9584,
- 26207 - 11905: 0xEAC9,
- 26208 - 11905: 0x9585,
- 26209 - 11905: 0xEACE,
- 26210 - 11905: 0x9586,
- 26211 - 11905: 0x9587,
- 26212 - 11905: 0xCEEE,
- 26213 - 11905: 0x9588,
- 26214 - 11905: 0xBBDE,
- 26215 - 11905: 0x9589,
- 26216 - 11905: 0xB3BF,
- 26217 - 11905: 0x958A,
- 26218 - 11905: 0x958B,
- 26219 - 11905: 0x958C,
- 26220 - 11905: 0x958D,
- 26221 - 11905: 0x958E,
- 26222 - 11905: 0xC6D5,
- 26223 - 11905: 0xBEB0,
- 26224 - 11905: 0xCEFA,
- 26225 - 11905: 0x958F,
- 26226 - 11905: 0x9590,
- 26227 - 11905: 0x9591,
- 26228 - 11905: 0xC7E7,
- 26229 - 11905: 0x9592,
- 26230 - 11905: 0xBEA7,
- 26231 - 11905: 0xEAD0,
- 26232 - 11905: 0x9593,
- 26233 - 11905: 0x9594,
- 26234 - 11905: 0xD6C7,
- 26235 - 11905: 0x9595,
- 26236 - 11905: 0x9596,
- 26237 - 11905: 0x9597,
- 26238 - 11905: 0xC1C0,
- 26239 - 11905: 0x9598,
- 26240 - 11905: 0x9599,
- 26241 - 11905: 0x959A,
- 26242 - 11905: 0xD4DD,
- 26243 - 11905: 0x959B,
- 26244 - 11905: 0xEAD1,
- 26245 - 11905: 0x959C,
- 26246 - 11905: 0x959D,
- 26247 - 11905: 0xCFBE,
- 26248 - 11905: 0x959E,
- 26249 - 11905: 0x959F,
- 26250 - 11905: 0x95A0,
- 26251 - 11905: 0x95A1,
- 26252 - 11905: 0xEAD2,
- 26253 - 11905: 0x95A2,
- 26254 - 11905: 0x95A3,
- 26255 - 11905: 0x95A4,
- 26256 - 11905: 0x95A5,
- 26257 - 11905: 0xCAEE,
- 26258 - 11905: 0x95A6,
- 26259 - 11905: 0x95A7,
- 26260 - 11905: 0x95A8,
- 26261 - 11905: 0x95A9,
- 26262 - 11905: 0xC5AF,
- 26263 - 11905: 0xB0B5,
- 26264 - 11905: 0x95AA,
- 26265 - 11905: 0x95AB,
- 26266 - 11905: 0x95AC,
- 26267 - 11905: 0x95AD,
- 26268 - 11905: 0x95AE,
- 26269 - 11905: 0xEAD4,
- 26270 - 11905: 0x95AF,
- 26271 - 11905: 0x95B0,
- 26272 - 11905: 0x95B1,
- 26273 - 11905: 0x95B2,
- 26274 - 11905: 0x95B3,
- 26275 - 11905: 0x95B4,
- 26276 - 11905: 0x95B5,
- 26277 - 11905: 0x95B6,
- 26278 - 11905: 0x95B7,
- 26279 - 11905: 0xEAD3,
- 26280 - 11905: 0xF4DF,
- 26281 - 11905: 0x95B8,
- 26282 - 11905: 0x95B9,
- 26283 - 11905: 0x95BA,
- 26284 - 11905: 0x95BB,
- 26285 - 11905: 0x95BC,
- 26286 - 11905: 0xC4BA,
- 26287 - 11905: 0x95BD,
- 26288 - 11905: 0x95BE,
- 26289 - 11905: 0x95BF,
- 26290 - 11905: 0x95C0,
- 26291 - 11905: 0x95C1,
- 26292 - 11905: 0xB1A9,
- 26293 - 11905: 0x95C2,
- 26294 - 11905: 0x95C3,
- 26295 - 11905: 0x95C4,
- 26296 - 11905: 0x95C5,
- 26297 - 11905: 0xE5DF,
- 26298 - 11905: 0x95C6,
- 26299 - 11905: 0x95C7,
- 26300 - 11905: 0x95C8,
- 26301 - 11905: 0x95C9,
- 26302 - 11905: 0xEAD5,
- 26303 - 11905: 0x95CA,
- 26304 - 11905: 0x95CB,
- 26305 - 11905: 0x95CC,
- 26306 - 11905: 0x95CD,
- 26307 - 11905: 0x95CE,
- 26308 - 11905: 0x95CF,
- 26309 - 11905: 0x95D0,
- 26310 - 11905: 0x95D1,
- 26311 - 11905: 0x95D2,
- 26312 - 11905: 0x95D3,
- 26313 - 11905: 0x95D4,
- 26314 - 11905: 0x95D5,
- 26315 - 11905: 0x95D6,
- 26316 - 11905: 0x95D7,
- 26317 - 11905: 0x95D8,
- 26318 - 11905: 0x95D9,
- 26319 - 11905: 0x95DA,
- 26320 - 11905: 0x95DB,
- 26321 - 11905: 0x95DC,
- 26322 - 11905: 0x95DD,
- 26323 - 11905: 0x95DE,
- 26324 - 11905: 0x95DF,
- 26325 - 11905: 0x95E0,
- 26326 - 11905: 0x95E1,
- 26327 - 11905: 0x95E2,
- 26328 - 11905: 0x95E3,
- 26329 - 11905: 0xCAEF,
- 26330 - 11905: 0x95E4,
- 26331 - 11905: 0xEAD6,
- 26332 - 11905: 0xEAD7,
- 26333 - 11905: 0xC6D8,
- 26334 - 11905: 0x95E5,
- 26335 - 11905: 0x95E6,
- 26336 - 11905: 0x95E7,
- 26337 - 11905: 0x95E8,
- 26338 - 11905: 0x95E9,
- 26339 - 11905: 0x95EA,
- 26340 - 11905: 0x95EB,
- 26341 - 11905: 0x95EC,
- 26342 - 11905: 0xEAD8,
- 26343 - 11905: 0x95ED,
- 26344 - 11905: 0x95EE,
- 26345 - 11905: 0xEAD9,
- 26346 - 11905: 0x95EF,
- 26347 - 11905: 0x95F0,
- 26348 - 11905: 0x95F1,
- 26349 - 11905: 0x95F2,
- 26350 - 11905: 0x95F3,
- 26351 - 11905: 0x95F4,
- 26352 - 11905: 0xD4BB,
- 26353 - 11905: 0x95F5,
- 26354 - 11905: 0xC7FA,
- 26355 - 11905: 0xD2B7,
- 26356 - 11905: 0xB8FC,
- 26357 - 11905: 0x95F6,
- 26358 - 11905: 0x95F7,
- 26359 - 11905: 0xEAC2,
- 26360 - 11905: 0x95F8,
- 26361 - 11905: 0xB2DC,
- 26362 - 11905: 0x95F9,
- 26363 - 11905: 0x95FA,
- 26364 - 11905: 0xC2FC,
- 26365 - 11905: 0x95FB,
- 26366 - 11905: 0xD4F8,
- 26367 - 11905: 0xCCE6,
- 26368 - 11905: 0xD7EE,
- 26369 - 11905: 0x95FC,
- 26370 - 11905: 0x95FD,
- 26371 - 11905: 0x95FE,
- 26372 - 11905: 0x9640,
- 26373 - 11905: 0x9641,
- 26374 - 11905: 0x9642,
- 26375 - 11905: 0x9643,
- 26376 - 11905: 0xD4C2,
- 26377 - 11905: 0xD3D0,
- 26378 - 11905: 0xEBC3,
- 26379 - 11905: 0xC5F3,
- 26380 - 11905: 0x9644,
- 26381 - 11905: 0xB7FE,
- 26382 - 11905: 0x9645,
- 26383 - 11905: 0x9646,
- 26384 - 11905: 0xEBD4,
- 26385 - 11905: 0x9647,
- 26386 - 11905: 0x9648,
- 26387 - 11905: 0x9649,
- 26388 - 11905: 0xCBB7,
- 26389 - 11905: 0xEBDE,
- 26390 - 11905: 0x964A,
- 26391 - 11905: 0xC0CA,
- 26392 - 11905: 0x964B,
- 26393 - 11905: 0x964C,
- 26394 - 11905: 0x964D,
- 26395 - 11905: 0xCDFB,
- 26396 - 11905: 0x964E,
- 26397 - 11905: 0xB3AF,
- 26398 - 11905: 0x964F,
- 26399 - 11905: 0xC6DA,
- 26400 - 11905: 0x9650,
- 26401 - 11905: 0x9651,
- 26402 - 11905: 0x9652,
- 26403 - 11905: 0x9653,
- 26404 - 11905: 0x9654,
- 26405 - 11905: 0x9655,
- 26406 - 11905: 0xEBFC,
- 26407 - 11905: 0x9656,
- 26408 - 11905: 0xC4BE,
- 26409 - 11905: 0x9657,
- 26410 - 11905: 0xCEB4,
- 26411 - 11905: 0xC4A9,
- 26412 - 11905: 0xB1BE,
- 26413 - 11905: 0xD4FD,
- 26414 - 11905: 0x9658,
- 26415 - 11905: 0xCAF5,
- 26416 - 11905: 0x9659,
- 26417 - 11905: 0xD6EC,
- 26418 - 11905: 0x965A,
- 26419 - 11905: 0x965B,
- 26420 - 11905: 0xC6D3,
- 26421 - 11905: 0xB6E4,
- 26422 - 11905: 0x965C,
- 26423 - 11905: 0x965D,
- 26424 - 11905: 0x965E,
- 26425 - 11905: 0x965F,
- 26426 - 11905: 0xBBFA,
- 26427 - 11905: 0x9660,
- 26428 - 11905: 0x9661,
- 26429 - 11905: 0xD0E0,
- 26430 - 11905: 0x9662,
- 26431 - 11905: 0x9663,
- 26432 - 11905: 0xC9B1,
- 26433 - 11905: 0x9664,
- 26434 - 11905: 0xD4D3,
- 26435 - 11905: 0xC8A8,
- 26436 - 11905: 0x9665,
- 26437 - 11905: 0x9666,
- 26438 - 11905: 0xB8CB,
- 26439 - 11905: 0x9667,
- 26440 - 11905: 0xE8BE,
- 26441 - 11905: 0xC9BC,
- 26442 - 11905: 0x9668,
- 26443 - 11905: 0x9669,
- 26444 - 11905: 0xE8BB,
- 26445 - 11905: 0x966A,
- 26446 - 11905: 0xC0EE,
- 26447 - 11905: 0xD0D3,
- 26448 - 11905: 0xB2C4,
- 26449 - 11905: 0xB4E5,
- 26450 - 11905: 0x966B,
- 26451 - 11905: 0xE8BC,
- 26452 - 11905: 0x966C,
- 26453 - 11905: 0x966D,
- 26454 - 11905: 0xD5C8,
- 26455 - 11905: 0x966E,
- 26456 - 11905: 0x966F,
- 26457 - 11905: 0x9670,
- 26458 - 11905: 0x9671,
- 26459 - 11905: 0x9672,
- 26460 - 11905: 0xB6C5,
- 26461 - 11905: 0x9673,
- 26462 - 11905: 0xE8BD,
- 26463 - 11905: 0xCAF8,
- 26464 - 11905: 0xB8DC,
- 26465 - 11905: 0xCCF5,
- 26466 - 11905: 0x9674,
- 26467 - 11905: 0x9675,
- 26468 - 11905: 0x9676,
- 26469 - 11905: 0xC0B4,
- 26470 - 11905: 0x9677,
- 26471 - 11905: 0x9678,
- 26472 - 11905: 0xD1EE,
- 26473 - 11905: 0xE8BF,
- 26474 - 11905: 0xE8C2,
- 26475 - 11905: 0x9679,
- 26476 - 11905: 0x967A,
- 26477 - 11905: 0xBABC,
- 26478 - 11905: 0x967B,
- 26479 - 11905: 0xB1AD,
- 26480 - 11905: 0xBDDC,
- 26481 - 11905: 0x967C,
- 26482 - 11905: 0xEABD,
- 26483 - 11905: 0xE8C3,
- 26484 - 11905: 0x967D,
- 26485 - 11905: 0xE8C6,
- 26486 - 11905: 0x967E,
- 26487 - 11905: 0xE8CB,
- 26488 - 11905: 0x9680,
- 26489 - 11905: 0x9681,
- 26490 - 11905: 0x9682,
- 26491 - 11905: 0x9683,
- 26492 - 11905: 0xE8CC,
- 26493 - 11905: 0x9684,
- 26494 - 11905: 0xCBC9,
- 26495 - 11905: 0xB0E5,
- 26496 - 11905: 0x9685,
- 26497 - 11905: 0xBCAB,
- 26498 - 11905: 0x9686,
- 26499 - 11905: 0x9687,
- 26500 - 11905: 0xB9B9,
- 26501 - 11905: 0x9688,
- 26502 - 11905: 0x9689,
- 26503 - 11905: 0xE8C1,
- 26504 - 11905: 0x968A,
- 26505 - 11905: 0xCDF7,
- 26506 - 11905: 0x968B,
- 26507 - 11905: 0xE8CA,
- 26508 - 11905: 0x968C,
- 26509 - 11905: 0x968D,
- 26510 - 11905: 0x968E,
- 26511 - 11905: 0x968F,
- 26512 - 11905: 0xCEF6,
- 26513 - 11905: 0x9690,
- 26514 - 11905: 0x9691,
- 26515 - 11905: 0x9692,
- 26516 - 11905: 0x9693,
- 26517 - 11905: 0xD5ED,
- 26518 - 11905: 0x9694,
- 26519 - 11905: 0xC1D6,
- 26520 - 11905: 0xE8C4,
- 26521 - 11905: 0x9695,
- 26522 - 11905: 0xC3B6,
- 26523 - 11905: 0x9696,
- 26524 - 11905: 0xB9FB,
- 26525 - 11905: 0xD6A6,
- 26526 - 11905: 0xE8C8,
- 26527 - 11905: 0x9697,
- 26528 - 11905: 0x9698,
- 26529 - 11905: 0x9699,
- 26530 - 11905: 0xCAE0,
- 26531 - 11905: 0xD4E6,
- 26532 - 11905: 0x969A,
- 26533 - 11905: 0xE8C0,
- 26534 - 11905: 0x969B,
- 26535 - 11905: 0xE8C5,
- 26536 - 11905: 0xE8C7,
- 26537 - 11905: 0x969C,
- 26538 - 11905: 0xC7B9,
- 26539 - 11905: 0xB7E3,
- 26540 - 11905: 0x969D,
- 26541 - 11905: 0xE8C9,
- 26542 - 11905: 0x969E,
- 26543 - 11905: 0xBFDD,
- 26544 - 11905: 0xE8D2,
- 26545 - 11905: 0x969F,
- 26546 - 11905: 0x96A0,
- 26547 - 11905: 0xE8D7,
- 26548 - 11905: 0x96A1,
- 26549 - 11905: 0xE8D5,
- 26550 - 11905: 0xBCDC,
- 26551 - 11905: 0xBCCF,
- 26552 - 11905: 0xE8DB,
- 26553 - 11905: 0x96A2,
- 26554 - 11905: 0x96A3,
- 26555 - 11905: 0x96A4,
- 26556 - 11905: 0x96A5,
- 26557 - 11905: 0x96A6,
- 26558 - 11905: 0x96A7,
- 26559 - 11905: 0x96A8,
- 26560 - 11905: 0x96A9,
- 26561 - 11905: 0xE8DE,
- 26562 - 11905: 0x96AA,
- 26563 - 11905: 0xE8DA,
- 26564 - 11905: 0xB1FA,
- 26565 - 11905: 0x96AB,
- 26566 - 11905: 0x96AC,
- 26567 - 11905: 0x96AD,
- 26568 - 11905: 0x96AE,
- 26569 - 11905: 0x96AF,
- 26570 - 11905: 0x96B0,
- 26571 - 11905: 0x96B1,
- 26572 - 11905: 0x96B2,
- 26573 - 11905: 0x96B3,
- 26574 - 11905: 0x96B4,
- 26575 - 11905: 0xB0D8,
- 26576 - 11905: 0xC4B3,
- 26577 - 11905: 0xB8CC,
- 26578 - 11905: 0xC6E2,
- 26579 - 11905: 0xC8BE,
- 26580 - 11905: 0xC8E1,
- 26581 - 11905: 0x96B5,
- 26582 - 11905: 0x96B6,
- 26583 - 11905: 0x96B7,
- 26584 - 11905: 0xE8CF,
- 26585 - 11905: 0xE8D4,
- 26586 - 11905: 0xE8D6,
- 26587 - 11905: 0x96B8,
- 26588 - 11905: 0xB9F1,
- 26589 - 11905: 0xE8D8,
- 26590 - 11905: 0xD7F5,
- 26591 - 11905: 0x96B9,
- 26592 - 11905: 0xC4FB,
- 26593 - 11905: 0x96BA,
- 26594 - 11905: 0xE8DC,
- 26595 - 11905: 0x96BB,
- 26596 - 11905: 0x96BC,
- 26597 - 11905: 0xB2E9,
- 26598 - 11905: 0x96BD,
- 26599 - 11905: 0x96BE,
- 26600 - 11905: 0x96BF,
- 26601 - 11905: 0xE8D1,
- 26602 - 11905: 0x96C0,
- 26603 - 11905: 0x96C1,
- 26604 - 11905: 0xBCED,
- 26605 - 11905: 0x96C2,
- 26606 - 11905: 0x96C3,
- 26607 - 11905: 0xBFC2,
- 26608 - 11905: 0xE8CD,
- 26609 - 11905: 0xD6F9,
- 26610 - 11905: 0x96C4,
- 26611 - 11905: 0xC1F8,
- 26612 - 11905: 0xB2F1,
- 26613 - 11905: 0x96C5,
- 26614 - 11905: 0x96C6,
- 26615 - 11905: 0x96C7,
- 26616 - 11905: 0x96C8,
- 26617 - 11905: 0x96C9,
- 26618 - 11905: 0x96CA,
- 26619 - 11905: 0x96CB,
- 26620 - 11905: 0x96CC,
- 26621 - 11905: 0xE8DF,
- 26622 - 11905: 0x96CD,
- 26623 - 11905: 0xCAC1,
- 26624 - 11905: 0xE8D9,
- 26625 - 11905: 0x96CE,
- 26626 - 11905: 0x96CF,
- 26627 - 11905: 0x96D0,
- 26628 - 11905: 0x96D1,
- 26629 - 11905: 0xD5A4,
- 26630 - 11905: 0x96D2,
- 26631 - 11905: 0xB1EA,
- 26632 - 11905: 0xD5BB,
- 26633 - 11905: 0xE8CE,
- 26634 - 11905: 0xE8D0,
- 26635 - 11905: 0xB6B0,
- 26636 - 11905: 0xE8D3,
- 26637 - 11905: 0x96D3,
- 26638 - 11905: 0xE8DD,
- 26639 - 11905: 0xC0B8,
- 26640 - 11905: 0x96D4,
- 26641 - 11905: 0xCAF7,
- 26642 - 11905: 0x96D5,
- 26643 - 11905: 0xCBA8,
- 26644 - 11905: 0x96D6,
- 26645 - 11905: 0x96D7,
- 26646 - 11905: 0xC6DC,
- 26647 - 11905: 0xC0F5,
- 26648 - 11905: 0x96D8,
- 26649 - 11905: 0x96D9,
- 26650 - 11905: 0x96DA,
- 26651 - 11905: 0x96DB,
- 26652 - 11905: 0x96DC,
- 26653 - 11905: 0xE8E9,
- 26654 - 11905: 0x96DD,
- 26655 - 11905: 0x96DE,
- 26656 - 11905: 0x96DF,
- 26657 - 11905: 0xD0A3,
- 26658 - 11905: 0x96E0,
- 26659 - 11905: 0x96E1,
- 26660 - 11905: 0x96E2,
- 26661 - 11905: 0x96E3,
- 26662 - 11905: 0x96E4,
- 26663 - 11905: 0x96E5,
- 26664 - 11905: 0x96E6,
- 26665 - 11905: 0xE8F2,
- 26666 - 11905: 0xD6EA,
- 26667 - 11905: 0x96E7,
- 26668 - 11905: 0x96E8,
- 26669 - 11905: 0x96E9,
- 26670 - 11905: 0x96EA,
- 26671 - 11905: 0x96EB,
- 26672 - 11905: 0x96EC,
- 26673 - 11905: 0x96ED,
- 26674 - 11905: 0xE8E0,
- 26675 - 11905: 0xE8E1,
- 26676 - 11905: 0x96EE,
- 26677 - 11905: 0x96EF,
- 26678 - 11905: 0x96F0,
- 26679 - 11905: 0xD1F9,
- 26680 - 11905: 0xBACB,
- 26681 - 11905: 0xB8F9,
- 26682 - 11905: 0x96F1,
- 26683 - 11905: 0x96F2,
- 26684 - 11905: 0xB8F1,
- 26685 - 11905: 0xD4D4,
- 26686 - 11905: 0xE8EF,
- 26687 - 11905: 0x96F3,
- 26688 - 11905: 0xE8EE,
- 26689 - 11905: 0xE8EC,
- 26690 - 11905: 0xB9F0,
- 26691 - 11905: 0xCCD2,
- 26692 - 11905: 0xE8E6,
- 26693 - 11905: 0xCEA6,
- 26694 - 11905: 0xBFF2,
- 26695 - 11905: 0x96F4,
- 26696 - 11905: 0xB0B8,
- 26697 - 11905: 0xE8F1,
- 26698 - 11905: 0xE8F0,
- 26699 - 11905: 0x96F5,
- 26700 - 11905: 0xD7C0,
- 26701 - 11905: 0x96F6,
- 26702 - 11905: 0xE8E4,
- 26703 - 11905: 0x96F7,
- 26704 - 11905: 0xCDA9,
- 26705 - 11905: 0xC9A3,
- 26706 - 11905: 0x96F8,
- 26707 - 11905: 0xBBB8,
- 26708 - 11905: 0xBDDB,
- 26709 - 11905: 0xE8EA,
- 26710 - 11905: 0x96F9,
- 26711 - 11905: 0x96FA,
- 26712 - 11905: 0x96FB,
- 26713 - 11905: 0x96FC,
- 26714 - 11905: 0x96FD,
- 26715 - 11905: 0x96FE,
- 26716 - 11905: 0x9740,
- 26717 - 11905: 0x9741,
- 26718 - 11905: 0x9742,
- 26719 - 11905: 0x9743,
- 26720 - 11905: 0xE8E2,
- 26721 - 11905: 0xE8E3,
- 26722 - 11905: 0xE8E5,
- 26723 - 11905: 0xB5B5,
- 26724 - 11905: 0xE8E7,
- 26725 - 11905: 0xC7C5,
- 26726 - 11905: 0xE8EB,
- 26727 - 11905: 0xE8ED,
- 26728 - 11905: 0xBDB0,
- 26729 - 11905: 0xD7AE,
- 26730 - 11905: 0x9744,
- 26731 - 11905: 0xE8F8,
- 26732 - 11905: 0x9745,
- 26733 - 11905: 0x9746,
- 26734 - 11905: 0x9747,
- 26735 - 11905: 0x9748,
- 26736 - 11905: 0x9749,
- 26737 - 11905: 0x974A,
- 26738 - 11905: 0x974B,
- 26739 - 11905: 0x974C,
- 26740 - 11905: 0xE8F5,
- 26741 - 11905: 0x974D,
- 26742 - 11905: 0xCDB0,
- 26743 - 11905: 0xE8F6,
- 26744 - 11905: 0x974E,
- 26745 - 11905: 0x974F,
- 26746 - 11905: 0x9750,
- 26747 - 11905: 0x9751,
- 26748 - 11905: 0x9752,
- 26749 - 11905: 0x9753,
- 26750 - 11905: 0x9754,
- 26751 - 11905: 0x9755,
- 26752 - 11905: 0x9756,
- 26753 - 11905: 0xC1BA,
- 26754 - 11905: 0x9757,
- 26755 - 11905: 0xE8E8,
- 26756 - 11905: 0x9758,
- 26757 - 11905: 0xC3B7,
- 26758 - 11905: 0xB0F0,
- 26759 - 11905: 0x9759,
- 26760 - 11905: 0x975A,
- 26761 - 11905: 0x975B,
- 26762 - 11905: 0x975C,
- 26763 - 11905: 0x975D,
- 26764 - 11905: 0x975E,
- 26765 - 11905: 0x975F,
- 26766 - 11905: 0x9760,
- 26767 - 11905: 0xE8F4,
- 26768 - 11905: 0x9761,
- 26769 - 11905: 0x9762,
- 26770 - 11905: 0x9763,
- 26771 - 11905: 0xE8F7,
- 26772 - 11905: 0x9764,
- 26773 - 11905: 0x9765,
- 26774 - 11905: 0x9766,
- 26775 - 11905: 0xB9A3,
- 26776 - 11905: 0x9767,
- 26777 - 11905: 0x9768,
- 26778 - 11905: 0x9769,
- 26779 - 11905: 0x976A,
- 26780 - 11905: 0x976B,
- 26781 - 11905: 0x976C,
- 26782 - 11905: 0x976D,
- 26783 - 11905: 0x976E,
- 26784 - 11905: 0x976F,
- 26785 - 11905: 0x9770,
- 26786 - 11905: 0xC9D2,
- 26787 - 11905: 0x9771,
- 26788 - 11905: 0x9772,
- 26789 - 11905: 0x9773,
- 26790 - 11905: 0xC3CE,
- 26791 - 11905: 0xCEE0,
- 26792 - 11905: 0xC0E6,
- 26793 - 11905: 0x9774,
- 26794 - 11905: 0x9775,
- 26795 - 11905: 0x9776,
- 26796 - 11905: 0x9777,
- 26797 - 11905: 0xCBF3,
- 26798 - 11905: 0x9778,
- 26799 - 11905: 0xCCDD,
- 26800 - 11905: 0xD0B5,
- 26801 - 11905: 0x9779,
- 26802 - 11905: 0x977A,
- 26803 - 11905: 0xCAE1,
- 26804 - 11905: 0x977B,
- 26805 - 11905: 0xE8F3,
- 26806 - 11905: 0x977C,
- 26807 - 11905: 0x977D,
- 26808 - 11905: 0x977E,
- 26809 - 11905: 0x9780,
- 26810 - 11905: 0x9781,
- 26811 - 11905: 0x9782,
- 26812 - 11905: 0x9783,
- 26813 - 11905: 0x9784,
- 26814 - 11905: 0x9785,
- 26815 - 11905: 0x9786,
- 26816 - 11905: 0xBCEC,
- 26817 - 11905: 0x9787,
- 26818 - 11905: 0xE8F9,
- 26819 - 11905: 0x9788,
- 26820 - 11905: 0x9789,
- 26821 - 11905: 0x978A,
- 26822 - 11905: 0x978B,
- 26823 - 11905: 0x978C,
- 26824 - 11905: 0x978D,
- 26825 - 11905: 0xC3DE,
- 26826 - 11905: 0x978E,
- 26827 - 11905: 0xC6E5,
- 26828 - 11905: 0x978F,
- 26829 - 11905: 0xB9F7,
- 26830 - 11905: 0x9790,
- 26831 - 11905: 0x9791,
- 26832 - 11905: 0x9792,
- 26833 - 11905: 0x9793,
- 26834 - 11905: 0xB0F4,
- 26835 - 11905: 0x9794,
- 26836 - 11905: 0x9795,
- 26837 - 11905: 0xD7D8,
- 26838 - 11905: 0x9796,
- 26839 - 11905: 0x9797,
- 26840 - 11905: 0xBCAC,
- 26841 - 11905: 0x9798,
- 26842 - 11905: 0xC5EF,
- 26843 - 11905: 0x9799,
- 26844 - 11905: 0x979A,
- 26845 - 11905: 0x979B,
- 26846 - 11905: 0x979C,
- 26847 - 11905: 0x979D,
- 26848 - 11905: 0xCCC4,
- 26849 - 11905: 0x979E,
- 26850 - 11905: 0x979F,
- 26851 - 11905: 0xE9A6,
- 26852 - 11905: 0x97A0,
- 26853 - 11905: 0x97A1,
- 26854 - 11905: 0x97A2,
- 26855 - 11905: 0x97A3,
- 26856 - 11905: 0x97A4,
- 26857 - 11905: 0x97A5,
- 26858 - 11905: 0x97A6,
- 26859 - 11905: 0x97A7,
- 26860 - 11905: 0x97A8,
- 26861 - 11905: 0x97A9,
- 26862 - 11905: 0xC9AD,
- 26863 - 11905: 0x97AA,
- 26864 - 11905: 0xE9A2,
- 26865 - 11905: 0xC0E2,
- 26866 - 11905: 0x97AB,
- 26867 - 11905: 0x97AC,
- 26868 - 11905: 0x97AD,
- 26869 - 11905: 0xBFC3,
- 26870 - 11905: 0x97AE,
- 26871 - 11905: 0x97AF,
- 26872 - 11905: 0x97B0,
- 26873 - 11905: 0xE8FE,
- 26874 - 11905: 0xB9D7,
- 26875 - 11905: 0x97B1,
- 26876 - 11905: 0xE8FB,
- 26877 - 11905: 0x97B2,
- 26878 - 11905: 0x97B3,
- 26879 - 11905: 0x97B4,
- 26880 - 11905: 0x97B5,
- 26881 - 11905: 0xE9A4,
- 26882 - 11905: 0x97B6,
- 26883 - 11905: 0x97B7,
- 26884 - 11905: 0x97B8,
- 26885 - 11905: 0xD2CE,
- 26886 - 11905: 0x97B9,
- 26887 - 11905: 0x97BA,
- 26888 - 11905: 0x97BB,
- 26889 - 11905: 0x97BC,
- 26890 - 11905: 0x97BD,
- 26891 - 11905: 0xE9A3,
- 26892 - 11905: 0x97BE,
- 26893 - 11905: 0xD6B2,
- 26894 - 11905: 0xD7B5,
- 26895 - 11905: 0x97BF,
- 26896 - 11905: 0xE9A7,
- 26897 - 11905: 0x97C0,
- 26898 - 11905: 0xBDB7,
- 26899 - 11905: 0x97C1,
- 26900 - 11905: 0x97C2,
- 26901 - 11905: 0x97C3,
- 26902 - 11905: 0x97C4,
- 26903 - 11905: 0x97C5,
- 26904 - 11905: 0x97C6,
- 26905 - 11905: 0x97C7,
- 26906 - 11905: 0x97C8,
- 26907 - 11905: 0x97C9,
- 26908 - 11905: 0x97CA,
- 26909 - 11905: 0x97CB,
- 26910 - 11905: 0x97CC,
- 26911 - 11905: 0xE8FC,
- 26912 - 11905: 0xE8FD,
- 26913 - 11905: 0x97CD,
- 26914 - 11905: 0x97CE,
- 26915 - 11905: 0x97CF,
- 26916 - 11905: 0xE9A1,
- 26917 - 11905: 0x97D0,
- 26918 - 11905: 0x97D1,
- 26919 - 11905: 0x97D2,
- 26920 - 11905: 0x97D3,
- 26921 - 11905: 0x97D4,
- 26922 - 11905: 0x97D5,
- 26923 - 11905: 0x97D6,
- 26924 - 11905: 0x97D7,
- 26925 - 11905: 0xCDD6,
- 26926 - 11905: 0x97D8,
- 26927 - 11905: 0x97D9,
- 26928 - 11905: 0xD2AC,
- 26929 - 11905: 0x97DA,
- 26930 - 11905: 0x97DB,
- 26931 - 11905: 0x97DC,
- 26932 - 11905: 0xE9B2,
- 26933 - 11905: 0x97DD,
- 26934 - 11905: 0x97DE,
- 26935 - 11905: 0x97DF,
- 26936 - 11905: 0x97E0,
- 26937 - 11905: 0xE9A9,
- 26938 - 11905: 0x97E1,
- 26939 - 11905: 0x97E2,
- 26940 - 11905: 0x97E3,
- 26941 - 11905: 0xB4AA,
- 26942 - 11905: 0x97E4,
- 26943 - 11905: 0xB4BB,
- 26944 - 11905: 0x97E5,
- 26945 - 11905: 0x97E6,
- 26946 - 11905: 0xE9AB,
- 26947 - 11905: 0x97E7,
- 26948 - 11905: 0x97E8,
- 26949 - 11905: 0x97E9,
- 26950 - 11905: 0x97EA,
- 26951 - 11905: 0x97EB,
- 26952 - 11905: 0x97EC,
- 26953 - 11905: 0x97ED,
- 26954 - 11905: 0x97EE,
- 26955 - 11905: 0x97EF,
- 26956 - 11905: 0x97F0,
- 26957 - 11905: 0x97F1,
- 26958 - 11905: 0x97F2,
- 26959 - 11905: 0x97F3,
- 26960 - 11905: 0x97F4,
- 26961 - 11905: 0x97F5,
- 26962 - 11905: 0x97F6,
- 26963 - 11905: 0x97F7,
- 26964 - 11905: 0xD0A8,
- 26965 - 11905: 0x97F8,
- 26966 - 11905: 0x97F9,
- 26967 - 11905: 0xE9A5,
- 26968 - 11905: 0x97FA,
- 26969 - 11905: 0x97FB,
- 26970 - 11905: 0xB3FE,
- 26971 - 11905: 0x97FC,
- 26972 - 11905: 0x97FD,
- 26973 - 11905: 0xE9AC,
- 26974 - 11905: 0xC0E3,
- 26975 - 11905: 0x97FE,
- 26976 - 11905: 0xE9AA,
- 26977 - 11905: 0x9840,
- 26978 - 11905: 0x9841,
- 26979 - 11905: 0xE9B9,
- 26980 - 11905: 0x9842,
- 26981 - 11905: 0x9843,
- 26982 - 11905: 0xE9B8,
- 26983 - 11905: 0x9844,
- 26984 - 11905: 0x9845,
- 26985 - 11905: 0x9846,
- 26986 - 11905: 0x9847,
- 26987 - 11905: 0xE9AE,
- 26988 - 11905: 0x9848,
- 26989 - 11905: 0x9849,
- 26990 - 11905: 0xE8FA,
- 26991 - 11905: 0x984A,
- 26992 - 11905: 0x984B,
- 26993 - 11905: 0xE9A8,
- 26994 - 11905: 0x984C,
- 26995 - 11905: 0x984D,
- 26996 - 11905: 0x984E,
- 26997 - 11905: 0x984F,
- 26998 - 11905: 0x9850,
- 26999 - 11905: 0xBFAC,
- 27000 - 11905: 0xE9B1,
- 27001 - 11905: 0xE9BA,
- 27002 - 11905: 0x9851,
- 27003 - 11905: 0x9852,
- 27004 - 11905: 0xC2A5,
- 27005 - 11905: 0x9853,
- 27006 - 11905: 0x9854,
- 27007 - 11905: 0x9855,
- 27008 - 11905: 0xE9AF,
- 27009 - 11905: 0x9856,
- 27010 - 11905: 0xB8C5,
- 27011 - 11905: 0x9857,
- 27012 - 11905: 0xE9AD,
- 27013 - 11905: 0x9858,
- 27014 - 11905: 0xD3DC,
- 27015 - 11905: 0xE9B4,
- 27016 - 11905: 0xE9B5,
- 27017 - 11905: 0xE9B7,
- 27018 - 11905: 0x9859,
- 27019 - 11905: 0x985A,
- 27020 - 11905: 0x985B,
- 27021 - 11905: 0xE9C7,
- 27022 - 11905: 0x985C,
- 27023 - 11905: 0x985D,
- 27024 - 11905: 0x985E,
- 27025 - 11905: 0x985F,
- 27026 - 11905: 0x9860,
- 27027 - 11905: 0x9861,
- 27028 - 11905: 0xC0C6,
- 27029 - 11905: 0xE9C5,
- 27030 - 11905: 0x9862,
- 27031 - 11905: 0x9863,
- 27032 - 11905: 0xE9B0,
- 27033 - 11905: 0x9864,
- 27034 - 11905: 0x9865,
- 27035 - 11905: 0xE9BB,
- 27036 - 11905: 0xB0F1,
- 27037 - 11905: 0x9866,
- 27038 - 11905: 0x9867,
- 27039 - 11905: 0x9868,
- 27040 - 11905: 0x9869,
- 27041 - 11905: 0x986A,
- 27042 - 11905: 0x986B,
- 27043 - 11905: 0x986C,
- 27044 - 11905: 0x986D,
- 27045 - 11905: 0x986E,
- 27046 - 11905: 0x986F,
- 27047 - 11905: 0xE9BC,
- 27048 - 11905: 0xD5A5,
- 27049 - 11905: 0x9870,
- 27050 - 11905: 0x9871,
- 27051 - 11905: 0xE9BE,
- 27052 - 11905: 0x9872,
- 27053 - 11905: 0xE9BF,
- 27054 - 11905: 0x9873,
- 27055 - 11905: 0x9874,
- 27056 - 11905: 0x9875,
- 27057 - 11905: 0xE9C1,
- 27058 - 11905: 0x9876,
- 27059 - 11905: 0x9877,
- 27060 - 11905: 0xC1F1,
- 27061 - 11905: 0x9878,
- 27062 - 11905: 0x9879,
- 27063 - 11905: 0xC8B6,
- 27064 - 11905: 0x987A,
- 27065 - 11905: 0x987B,
- 27066 - 11905: 0x987C,
- 27067 - 11905: 0xE9BD,
- 27068 - 11905: 0x987D,
- 27069 - 11905: 0x987E,
- 27070 - 11905: 0x9880,
- 27071 - 11905: 0x9881,
- 27072 - 11905: 0x9882,
- 27073 - 11905: 0xE9C2,
- 27074 - 11905: 0x9883,
- 27075 - 11905: 0x9884,
- 27076 - 11905: 0x9885,
- 27077 - 11905: 0x9886,
- 27078 - 11905: 0x9887,
- 27079 - 11905: 0x9888,
- 27080 - 11905: 0x9889,
- 27081 - 11905: 0x988A,
- 27082 - 11905: 0xE9C3,
- 27083 - 11905: 0x988B,
- 27084 - 11905: 0xE9B3,
- 27085 - 11905: 0x988C,
- 27086 - 11905: 0xE9B6,
- 27087 - 11905: 0x988D,
- 27088 - 11905: 0xBBB1,
- 27089 - 11905: 0x988E,
- 27090 - 11905: 0x988F,
- 27091 - 11905: 0x9890,
- 27092 - 11905: 0xE9C0,
- 27093 - 11905: 0x9891,
- 27094 - 11905: 0x9892,
- 27095 - 11905: 0x9893,
- 27096 - 11905: 0x9894,
- 27097 - 11905: 0x9895,
- 27098 - 11905: 0x9896,
- 27099 - 11905: 0xBCF7,
- 27100 - 11905: 0x9897,
- 27101 - 11905: 0x9898,
- 27102 - 11905: 0x9899,
- 27103 - 11905: 0xE9C4,
- 27104 - 11905: 0xE9C6,
- 27105 - 11905: 0x989A,
- 27106 - 11905: 0x989B,
- 27107 - 11905: 0x989C,
- 27108 - 11905: 0x989D,
- 27109 - 11905: 0x989E,
- 27110 - 11905: 0x989F,
- 27111 - 11905: 0x98A0,
- 27112 - 11905: 0x98A1,
- 27113 - 11905: 0x98A2,
- 27114 - 11905: 0x98A3,
- 27115 - 11905: 0x98A4,
- 27116 - 11905: 0x98A5,
- 27117 - 11905: 0xE9CA,
- 27118 - 11905: 0x98A6,
- 27119 - 11905: 0x98A7,
- 27120 - 11905: 0x98A8,
- 27121 - 11905: 0x98A9,
- 27122 - 11905: 0xE9CE,
- 27123 - 11905: 0x98AA,
- 27124 - 11905: 0x98AB,
- 27125 - 11905: 0x98AC,
- 27126 - 11905: 0x98AD,
- 27127 - 11905: 0x98AE,
- 27128 - 11905: 0x98AF,
- 27129 - 11905: 0x98B0,
- 27130 - 11905: 0x98B1,
- 27131 - 11905: 0x98B2,
- 27132 - 11905: 0x98B3,
- 27133 - 11905: 0xB2DB,
- 27134 - 11905: 0x98B4,
- 27135 - 11905: 0xE9C8,
- 27136 - 11905: 0x98B5,
- 27137 - 11905: 0x98B6,
- 27138 - 11905: 0x98B7,
- 27139 - 11905: 0x98B8,
- 27140 - 11905: 0x98B9,
- 27141 - 11905: 0x98BA,
- 27142 - 11905: 0x98BB,
- 27143 - 11905: 0x98BC,
- 27144 - 11905: 0x98BD,
- 27145 - 11905: 0x98BE,
- 27146 - 11905: 0xB7AE,
- 27147 - 11905: 0x98BF,
- 27148 - 11905: 0x98C0,
- 27149 - 11905: 0x98C1,
- 27150 - 11905: 0x98C2,
- 27151 - 11905: 0x98C3,
- 27152 - 11905: 0x98C4,
- 27153 - 11905: 0x98C5,
- 27154 - 11905: 0x98C6,
- 27155 - 11905: 0x98C7,
- 27156 - 11905: 0x98C8,
- 27157 - 11905: 0x98C9,
- 27158 - 11905: 0x98CA,
- 27159 - 11905: 0xE9CB,
- 27160 - 11905: 0xE9CC,
- 27161 - 11905: 0x98CB,
- 27162 - 11905: 0x98CC,
- 27163 - 11905: 0x98CD,
- 27164 - 11905: 0x98CE,
- 27165 - 11905: 0x98CF,
- 27166 - 11905: 0x98D0,
- 27167 - 11905: 0xD5C1,
- 27168 - 11905: 0x98D1,
- 27169 - 11905: 0xC4A3,
- 27170 - 11905: 0x98D2,
- 27171 - 11905: 0x98D3,
- 27172 - 11905: 0x98D4,
- 27173 - 11905: 0x98D5,
- 27174 - 11905: 0x98D6,
- 27175 - 11905: 0x98D7,
- 27176 - 11905: 0xE9D8,
- 27177 - 11905: 0x98D8,
- 27178 - 11905: 0xBAE1,
- 27179 - 11905: 0x98D9,
- 27180 - 11905: 0x98DA,
- 27181 - 11905: 0x98DB,
- 27182 - 11905: 0x98DC,
- 27183 - 11905: 0xE9C9,
- 27184 - 11905: 0x98DD,
- 27185 - 11905: 0xD3A3,
- 27186 - 11905: 0x98DE,
- 27187 - 11905: 0x98DF,
- 27188 - 11905: 0x98E0,
- 27189 - 11905: 0xE9D4,
- 27190 - 11905: 0x98E1,
- 27191 - 11905: 0x98E2,
- 27192 - 11905: 0x98E3,
- 27193 - 11905: 0x98E4,
- 27194 - 11905: 0x98E5,
- 27195 - 11905: 0x98E6,
- 27196 - 11905: 0x98E7,
- 27197 - 11905: 0xE9D7,
- 27198 - 11905: 0xE9D0,
- 27199 - 11905: 0x98E8,
- 27200 - 11905: 0x98E9,
- 27201 - 11905: 0x98EA,
- 27202 - 11905: 0x98EB,
- 27203 - 11905: 0x98EC,
- 27204 - 11905: 0xE9CF,
- 27205 - 11905: 0x98ED,
- 27206 - 11905: 0x98EE,
- 27207 - 11905: 0xC7C1,
- 27208 - 11905: 0x98EF,
- 27209 - 11905: 0x98F0,
- 27210 - 11905: 0x98F1,
- 27211 - 11905: 0x98F2,
- 27212 - 11905: 0x98F3,
- 27213 - 11905: 0x98F4,
- 27214 - 11905: 0x98F5,
- 27215 - 11905: 0x98F6,
- 27216 - 11905: 0xE9D2,
- 27217 - 11905: 0x98F7,
- 27218 - 11905: 0x98F8,
- 27219 - 11905: 0x98F9,
- 27220 - 11905: 0x98FA,
- 27221 - 11905: 0x98FB,
- 27222 - 11905: 0x98FC,
- 27223 - 11905: 0x98FD,
- 27224 - 11905: 0xE9D9,
- 27225 - 11905: 0xB3C8,
- 27226 - 11905: 0x98FE,
- 27227 - 11905: 0xE9D3,
- 27228 - 11905: 0x9940,
- 27229 - 11905: 0x9941,
- 27230 - 11905: 0x9942,
- 27231 - 11905: 0x9943,
- 27232 - 11905: 0x9944,
- 27233 - 11905: 0xCFF0,
- 27234 - 11905: 0x9945,
- 27235 - 11905: 0x9946,
- 27236 - 11905: 0x9947,
- 27237 - 11905: 0xE9CD,
- 27238 - 11905: 0x9948,
- 27239 - 11905: 0x9949,
- 27240 - 11905: 0x994A,
- 27241 - 11905: 0x994B,
- 27242 - 11905: 0x994C,
- 27243 - 11905: 0x994D,
- 27244 - 11905: 0x994E,
- 27245 - 11905: 0x994F,
- 27246 - 11905: 0x9950,
- 27247 - 11905: 0x9951,
- 27248 - 11905: 0x9952,
- 27249 - 11905: 0xB3F7,
- 27250 - 11905: 0x9953,
- 27251 - 11905: 0x9954,
- 27252 - 11905: 0x9955,
- 27253 - 11905: 0x9956,
- 27254 - 11905: 0x9957,
- 27255 - 11905: 0x9958,
- 27256 - 11905: 0x9959,
- 27257 - 11905: 0xE9D6,
- 27258 - 11905: 0x995A,
- 27259 - 11905: 0x995B,
- 27260 - 11905: 0xE9DA,
- 27261 - 11905: 0x995C,
- 27262 - 11905: 0x995D,
- 27263 - 11905: 0x995E,
- 27264 - 11905: 0xCCB4,
- 27265 - 11905: 0x995F,
- 27266 - 11905: 0x9960,
- 27267 - 11905: 0x9961,
- 27268 - 11905: 0xCFAD,
- 27269 - 11905: 0x9962,
- 27270 - 11905: 0x9963,
- 27271 - 11905: 0x9964,
- 27272 - 11905: 0x9965,
- 27273 - 11905: 0x9966,
- 27274 - 11905: 0x9967,
- 27275 - 11905: 0x9968,
- 27276 - 11905: 0x9969,
- 27277 - 11905: 0x996A,
- 27278 - 11905: 0xE9D5,
- 27279 - 11905: 0x996B,
- 27280 - 11905: 0xE9DC,
- 27281 - 11905: 0xE9DB,
- 27282 - 11905: 0x996C,
- 27283 - 11905: 0x996D,
- 27284 - 11905: 0x996E,
- 27285 - 11905: 0x996F,
- 27286 - 11905: 0x9970,
- 27287 - 11905: 0xE9DE,
- 27288 - 11905: 0x9971,
- 27289 - 11905: 0x9972,
- 27290 - 11905: 0x9973,
- 27291 - 11905: 0x9974,
- 27292 - 11905: 0x9975,
- 27293 - 11905: 0x9976,
- 27294 - 11905: 0x9977,
- 27295 - 11905: 0x9978,
- 27296 - 11905: 0xE9D1,
- 27297 - 11905: 0x9979,
- 27298 - 11905: 0x997A,
- 27299 - 11905: 0x997B,
- 27300 - 11905: 0x997C,
- 27301 - 11905: 0x997D,
- 27302 - 11905: 0x997E,
- 27303 - 11905: 0x9980,
- 27304 - 11905: 0x9981,
- 27305 - 11905: 0xE9DD,
- 27306 - 11905: 0x9982,
- 27307 - 11905: 0xE9DF,
- 27308 - 11905: 0xC3CA,
- 27309 - 11905: 0x9983,
- 27310 - 11905: 0x9984,
- 27311 - 11905: 0x9985,
- 27312 - 11905: 0x9986,
- 27313 - 11905: 0x9987,
- 27314 - 11905: 0x9988,
- 27315 - 11905: 0x9989,
- 27316 - 11905: 0x998A,
- 27317 - 11905: 0x998B,
- 27318 - 11905: 0x998C,
- 27319 - 11905: 0x998D,
- 27320 - 11905: 0x998E,
- 27321 - 11905: 0x998F,
- 27322 - 11905: 0x9990,
- 27323 - 11905: 0x9991,
- 27324 - 11905: 0x9992,
- 27325 - 11905: 0x9993,
- 27326 - 11905: 0x9994,
- 27327 - 11905: 0x9995,
- 27328 - 11905: 0x9996,
- 27329 - 11905: 0x9997,
- 27330 - 11905: 0x9998,
- 27331 - 11905: 0x9999,
- 27332 - 11905: 0x999A,
- 27333 - 11905: 0x999B,
- 27334 - 11905: 0x999C,
- 27335 - 11905: 0x999D,
- 27336 - 11905: 0x999E,
- 27337 - 11905: 0x999F,
- 27338 - 11905: 0x99A0,
- 27339 - 11905: 0x99A1,
- 27340 - 11905: 0x99A2,
- 27341 - 11905: 0x99A3,
- 27342 - 11905: 0x99A4,
- 27343 - 11905: 0x99A5,
- 27344 - 11905: 0x99A6,
- 27345 - 11905: 0x99A7,
- 27346 - 11905: 0x99A8,
- 27347 - 11905: 0x99A9,
- 27348 - 11905: 0x99AA,
- 27349 - 11905: 0x99AB,
- 27350 - 11905: 0x99AC,
- 27351 - 11905: 0x99AD,
- 27352 - 11905: 0x99AE,
- 27353 - 11905: 0x99AF,
- 27354 - 11905: 0x99B0,
- 27355 - 11905: 0x99B1,
- 27356 - 11905: 0x99B2,
- 27357 - 11905: 0x99B3,
- 27358 - 11905: 0x99B4,
- 27359 - 11905: 0x99B5,
- 27360 - 11905: 0x99B6,
- 27361 - 11905: 0x99B7,
- 27362 - 11905: 0x99B8,
- 27363 - 11905: 0x99B9,
- 27364 - 11905: 0x99BA,
- 27365 - 11905: 0x99BB,
- 27366 - 11905: 0x99BC,
- 27367 - 11905: 0x99BD,
- 27368 - 11905: 0x99BE,
- 27369 - 11905: 0x99BF,
- 27370 - 11905: 0x99C0,
- 27371 - 11905: 0x99C1,
- 27372 - 11905: 0x99C2,
- 27373 - 11905: 0x99C3,
- 27374 - 11905: 0x99C4,
- 27375 - 11905: 0x99C5,
- 27376 - 11905: 0x99C6,
- 27377 - 11905: 0x99C7,
- 27378 - 11905: 0x99C8,
- 27379 - 11905: 0x99C9,
- 27380 - 11905: 0x99CA,
- 27381 - 11905: 0x99CB,
- 27382 - 11905: 0x99CC,
- 27383 - 11905: 0x99CD,
- 27384 - 11905: 0x99CE,
- 27385 - 11905: 0x99CF,
- 27386 - 11905: 0x99D0,
- 27387 - 11905: 0x99D1,
- 27388 - 11905: 0x99D2,
- 27389 - 11905: 0x99D3,
- 27390 - 11905: 0x99D4,
- 27391 - 11905: 0x99D5,
- 27392 - 11905: 0x99D6,
- 27393 - 11905: 0x99D7,
- 27394 - 11905: 0x99D8,
- 27395 - 11905: 0x99D9,
- 27396 - 11905: 0x99DA,
- 27397 - 11905: 0x99DB,
- 27398 - 11905: 0x99DC,
- 27399 - 11905: 0x99DD,
- 27400 - 11905: 0x99DE,
- 27401 - 11905: 0x99DF,
- 27402 - 11905: 0x99E0,
- 27403 - 11905: 0x99E1,
- 27404 - 11905: 0x99E2,
- 27405 - 11905: 0x99E3,
- 27406 - 11905: 0x99E4,
- 27407 - 11905: 0x99E5,
- 27408 - 11905: 0x99E6,
- 27409 - 11905: 0x99E7,
- 27410 - 11905: 0x99E8,
- 27411 - 11905: 0x99E9,
- 27412 - 11905: 0x99EA,
- 27413 - 11905: 0x99EB,
- 27414 - 11905: 0x99EC,
- 27415 - 11905: 0x99ED,
- 27416 - 11905: 0x99EE,
- 27417 - 11905: 0x99EF,
- 27418 - 11905: 0x99F0,
- 27419 - 11905: 0x99F1,
- 27420 - 11905: 0x99F2,
- 27421 - 11905: 0x99F3,
- 27422 - 11905: 0x99F4,
- 27423 - 11905: 0x99F5,
- 27424 - 11905: 0xC7B7,
- 27425 - 11905: 0xB4CE,
- 27426 - 11905: 0xBBB6,
- 27427 - 11905: 0xD0C0,
- 27428 - 11905: 0xECA3,
- 27429 - 11905: 0x99F6,
- 27430 - 11905: 0x99F7,
- 27431 - 11905: 0xC5B7,
- 27432 - 11905: 0x99F8,
- 27433 - 11905: 0x99F9,
- 27434 - 11905: 0x99FA,
- 27435 - 11905: 0x99FB,
- 27436 - 11905: 0x99FC,
- 27437 - 11905: 0x99FD,
- 27438 - 11905: 0x99FE,
- 27439 - 11905: 0x9A40,
- 27440 - 11905: 0x9A41,
- 27441 - 11905: 0x9A42,
- 27442 - 11905: 0xD3FB,
- 27443 - 11905: 0x9A43,
- 27444 - 11905: 0x9A44,
- 27445 - 11905: 0x9A45,
- 27446 - 11905: 0x9A46,
- 27447 - 11905: 0xECA4,
- 27448 - 11905: 0x9A47,
- 27449 - 11905: 0xECA5,
- 27450 - 11905: 0xC6DB,
- 27451 - 11905: 0x9A48,
- 27452 - 11905: 0x9A49,
- 27453 - 11905: 0x9A4A,
- 27454 - 11905: 0xBFEE,
- 27455 - 11905: 0x9A4B,
- 27456 - 11905: 0x9A4C,
- 27457 - 11905: 0x9A4D,
- 27458 - 11905: 0x9A4E,
- 27459 - 11905: 0xECA6,
- 27460 - 11905: 0x9A4F,
- 27461 - 11905: 0x9A50,
- 27462 - 11905: 0xECA7,
- 27463 - 11905: 0xD0AA,
- 27464 - 11905: 0x9A51,
- 27465 - 11905: 0xC7B8,
- 27466 - 11905: 0x9A52,
- 27467 - 11905: 0x9A53,
- 27468 - 11905: 0xB8E8,
- 27469 - 11905: 0x9A54,
- 27470 - 11905: 0x9A55,
- 27471 - 11905: 0x9A56,
- 27472 - 11905: 0x9A57,
- 27473 - 11905: 0x9A58,
- 27474 - 11905: 0x9A59,
- 27475 - 11905: 0x9A5A,
- 27476 - 11905: 0x9A5B,
- 27477 - 11905: 0x9A5C,
- 27478 - 11905: 0x9A5D,
- 27479 - 11905: 0x9A5E,
- 27480 - 11905: 0x9A5F,
- 27481 - 11905: 0xECA8,
- 27482 - 11905: 0x9A60,
- 27483 - 11905: 0x9A61,
- 27484 - 11905: 0x9A62,
- 27485 - 11905: 0x9A63,
- 27486 - 11905: 0x9A64,
- 27487 - 11905: 0x9A65,
- 27488 - 11905: 0x9A66,
- 27489 - 11905: 0x9A67,
- 27490 - 11905: 0xD6B9,
- 27491 - 11905: 0xD5FD,
- 27492 - 11905: 0xB4CB,
- 27493 - 11905: 0xB2BD,
- 27494 - 11905: 0xCEE4,
- 27495 - 11905: 0xC6E7,
- 27496 - 11905: 0x9A68,
- 27497 - 11905: 0x9A69,
- 27498 - 11905: 0xCDE1,
- 27499 - 11905: 0x9A6A,
- 27500 - 11905: 0x9A6B,
- 27501 - 11905: 0x9A6C,
- 27502 - 11905: 0x9A6D,
- 27503 - 11905: 0x9A6E,
- 27504 - 11905: 0x9A6F,
- 27505 - 11905: 0x9A70,
- 27506 - 11905: 0x9A71,
- 27507 - 11905: 0x9A72,
- 27508 - 11905: 0x9A73,
- 27509 - 11905: 0x9A74,
- 27510 - 11905: 0x9A75,
- 27511 - 11905: 0x9A76,
- 27512 - 11905: 0x9A77,
- 27513 - 11905: 0xB4F5,
- 27514 - 11905: 0x9A78,
- 27515 - 11905: 0xCBC0,
- 27516 - 11905: 0xBCDF,
- 27517 - 11905: 0x9A79,
- 27518 - 11905: 0x9A7A,
- 27519 - 11905: 0x9A7B,
- 27520 - 11905: 0x9A7C,
- 27521 - 11905: 0xE9E2,
- 27522 - 11905: 0xE9E3,
- 27523 - 11905: 0xD1EA,
- 27524 - 11905: 0xE9E5,
- 27525 - 11905: 0x9A7D,
- 27526 - 11905: 0xB4F9,
- 27527 - 11905: 0xE9E4,
- 27528 - 11905: 0x9A7E,
- 27529 - 11905: 0xD1B3,
- 27530 - 11905: 0xCAE2,
- 27531 - 11905: 0xB2D0,
- 27532 - 11905: 0x9A80,
- 27533 - 11905: 0xE9E8,
- 27534 - 11905: 0x9A81,
- 27535 - 11905: 0x9A82,
- 27536 - 11905: 0x9A83,
- 27537 - 11905: 0x9A84,
- 27538 - 11905: 0xE9E6,
- 27539 - 11905: 0xE9E7,
- 27540 - 11905: 0x9A85,
- 27541 - 11905: 0x9A86,
- 27542 - 11905: 0xD6B3,
- 27543 - 11905: 0x9A87,
- 27544 - 11905: 0x9A88,
- 27545 - 11905: 0x9A89,
- 27546 - 11905: 0xE9E9,
- 27547 - 11905: 0xE9EA,
- 27548 - 11905: 0x9A8A,
- 27549 - 11905: 0x9A8B,
- 27550 - 11905: 0x9A8C,
- 27551 - 11905: 0x9A8D,
- 27552 - 11905: 0x9A8E,
- 27553 - 11905: 0xE9EB,
- 27554 - 11905: 0x9A8F,
- 27555 - 11905: 0x9A90,
- 27556 - 11905: 0x9A91,
- 27557 - 11905: 0x9A92,
- 27558 - 11905: 0x9A93,
- 27559 - 11905: 0x9A94,
- 27560 - 11905: 0x9A95,
- 27561 - 11905: 0x9A96,
- 27562 - 11905: 0xE9EC,
- 27563 - 11905: 0x9A97,
- 27564 - 11905: 0x9A98,
- 27565 - 11905: 0x9A99,
- 27566 - 11905: 0x9A9A,
- 27567 - 11905: 0x9A9B,
- 27568 - 11905: 0x9A9C,
- 27569 - 11905: 0x9A9D,
- 27570 - 11905: 0x9A9E,
- 27571 - 11905: 0xECAF,
- 27572 - 11905: 0xC5B9,
- 27573 - 11905: 0xB6CE,
- 27574 - 11905: 0x9A9F,
- 27575 - 11905: 0xD2F3,
- 27576 - 11905: 0x9AA0,
- 27577 - 11905: 0x9AA1,
- 27578 - 11905: 0x9AA2,
- 27579 - 11905: 0x9AA3,
- 27580 - 11905: 0x9AA4,
- 27581 - 11905: 0x9AA5,
- 27582 - 11905: 0x9AA6,
- 27583 - 11905: 0xB5EE,
- 27584 - 11905: 0x9AA7,
- 27585 - 11905: 0xBBD9,
- 27586 - 11905: 0xECB1,
- 27587 - 11905: 0x9AA8,
- 27588 - 11905: 0x9AA9,
- 27589 - 11905: 0xD2E3,
- 27590 - 11905: 0x9AAA,
- 27591 - 11905: 0x9AAB,
- 27592 - 11905: 0x9AAC,
- 27593 - 11905: 0x9AAD,
- 27594 - 11905: 0x9AAE,
- 27595 - 11905: 0xCEE3,
- 27596 - 11905: 0x9AAF,
- 27597 - 11905: 0xC4B8,
- 27598 - 11905: 0x9AB0,
- 27599 - 11905: 0xC3BF,
- 27600 - 11905: 0x9AB1,
- 27601 - 11905: 0x9AB2,
- 27602 - 11905: 0xB6BE,
- 27603 - 11905: 0xD8B9,
- 27604 - 11905: 0xB1C8,
- 27605 - 11905: 0xB1CF,
- 27606 - 11905: 0xB1D1,
- 27607 - 11905: 0xC5FE,
- 27608 - 11905: 0x9AB3,
- 27609 - 11905: 0xB1D0,
- 27610 - 11905: 0x9AB4,
- 27611 - 11905: 0xC3AB,
- 27612 - 11905: 0x9AB5,
- 27613 - 11905: 0x9AB6,
- 27614 - 11905: 0x9AB7,
- 27615 - 11905: 0x9AB8,
- 27616 - 11905: 0x9AB9,
- 27617 - 11905: 0xD5B1,
- 27618 - 11905: 0x9ABA,
- 27619 - 11905: 0x9ABB,
- 27620 - 11905: 0x9ABC,
- 27621 - 11905: 0x9ABD,
- 27622 - 11905: 0x9ABE,
- 27623 - 11905: 0x9ABF,
- 27624 - 11905: 0x9AC0,
- 27625 - 11905: 0x9AC1,
- 27626 - 11905: 0xEBA4,
- 27627 - 11905: 0xBAC1,
- 27628 - 11905: 0x9AC2,
- 27629 - 11905: 0x9AC3,
- 27630 - 11905: 0x9AC4,
- 27631 - 11905: 0xCCBA,
- 27632 - 11905: 0x9AC5,
- 27633 - 11905: 0x9AC6,
- 27634 - 11905: 0x9AC7,
- 27635 - 11905: 0xEBA5,
- 27636 - 11905: 0x9AC8,
- 27637 - 11905: 0xEBA7,
- 27638 - 11905: 0x9AC9,
- 27639 - 11905: 0x9ACA,
- 27640 - 11905: 0x9ACB,
- 27641 - 11905: 0xEBA8,
- 27642 - 11905: 0x9ACC,
- 27643 - 11905: 0x9ACD,
- 27644 - 11905: 0x9ACE,
- 27645 - 11905: 0xEBA6,
- 27646 - 11905: 0x9ACF,
- 27647 - 11905: 0x9AD0,
- 27648 - 11905: 0x9AD1,
- 27649 - 11905: 0x9AD2,
- 27650 - 11905: 0x9AD3,
- 27651 - 11905: 0x9AD4,
- 27652 - 11905: 0x9AD5,
- 27653 - 11905: 0xEBA9,
- 27654 - 11905: 0xEBAB,
- 27655 - 11905: 0xEBAA,
- 27656 - 11905: 0x9AD6,
- 27657 - 11905: 0x9AD7,
- 27658 - 11905: 0x9AD8,
- 27659 - 11905: 0x9AD9,
- 27660 - 11905: 0x9ADA,
- 27661 - 11905: 0xEBAC,
- 27662 - 11905: 0x9ADB,
- 27663 - 11905: 0xCACF,
- 27664 - 11905: 0xD8B5,
- 27665 - 11905: 0xC3F1,
- 27666 - 11905: 0x9ADC,
- 27667 - 11905: 0xC3A5,
- 27668 - 11905: 0xC6F8,
- 27669 - 11905: 0xEBAD,
- 27670 - 11905: 0xC4CA,
- 27671 - 11905: 0x9ADD,
- 27672 - 11905: 0xEBAE,
- 27673 - 11905: 0xEBAF,
- 27674 - 11905: 0xEBB0,
- 27675 - 11905: 0xB7D5,
- 27676 - 11905: 0x9ADE,
- 27677 - 11905: 0x9ADF,
- 27678 - 11905: 0x9AE0,
- 27679 - 11905: 0xB7FA,
- 27680 - 11905: 0x9AE1,
- 27681 - 11905: 0xEBB1,
- 27682 - 11905: 0xC7E2,
- 27683 - 11905: 0x9AE2,
- 27684 - 11905: 0xEBB3,
- 27685 - 11905: 0x9AE3,
- 27686 - 11905: 0xBAA4,
- 27687 - 11905: 0xD1F5,
- 27688 - 11905: 0xB0B1,
- 27689 - 11905: 0xEBB2,
- 27690 - 11905: 0xEBB4,
- 27691 - 11905: 0x9AE4,
- 27692 - 11905: 0x9AE5,
- 27693 - 11905: 0x9AE6,
- 27694 - 11905: 0xB5AA,
- 27695 - 11905: 0xC2C8,
- 27696 - 11905: 0xC7E8,
- 27697 - 11905: 0x9AE7,
- 27698 - 11905: 0xEBB5,
- 27699 - 11905: 0x9AE8,
- 27700 - 11905: 0xCBAE,
- 27701 - 11905: 0xE3DF,
- 27702 - 11905: 0x9AE9,
- 27703 - 11905: 0x9AEA,
- 27704 - 11905: 0xD3C0,
- 27705 - 11905: 0x9AEB,
- 27706 - 11905: 0x9AEC,
- 27707 - 11905: 0x9AED,
- 27708 - 11905: 0x9AEE,
- 27709 - 11905: 0xD9DB,
- 27710 - 11905: 0x9AEF,
- 27711 - 11905: 0x9AF0,
- 27712 - 11905: 0xCDA1,
- 27713 - 11905: 0xD6AD,
- 27714 - 11905: 0xC7F3,
- 27715 - 11905: 0x9AF1,
- 27716 - 11905: 0x9AF2,
- 27717 - 11905: 0x9AF3,
- 27718 - 11905: 0xD9E0,
- 27719 - 11905: 0xBBE3,
- 27720 - 11905: 0x9AF4,
- 27721 - 11905: 0xBABA,
- 27722 - 11905: 0xE3E2,
- 27723 - 11905: 0x9AF5,
- 27724 - 11905: 0x9AF6,
- 27725 - 11905: 0x9AF7,
- 27726 - 11905: 0x9AF8,
- 27727 - 11905: 0x9AF9,
- 27728 - 11905: 0xCFAB,
- 27729 - 11905: 0x9AFA,
- 27730 - 11905: 0x9AFB,
- 27731 - 11905: 0x9AFC,
- 27732 - 11905: 0xE3E0,
- 27733 - 11905: 0xC9C7,
- 27734 - 11905: 0x9AFD,
- 27735 - 11905: 0xBAB9,
- 27736 - 11905: 0x9AFE,
- 27737 - 11905: 0x9B40,
- 27738 - 11905: 0x9B41,
- 27739 - 11905: 0xD1B4,
- 27740 - 11905: 0xE3E1,
- 27741 - 11905: 0xC8EA,
- 27742 - 11905: 0xB9AF,
- 27743 - 11905: 0xBDAD,
- 27744 - 11905: 0xB3D8,
- 27745 - 11905: 0xCEDB,
- 27746 - 11905: 0x9B42,
- 27747 - 11905: 0x9B43,
- 27748 - 11905: 0xCCC0,
- 27749 - 11905: 0x9B44,
- 27750 - 11905: 0x9B45,
- 27751 - 11905: 0x9B46,
- 27752 - 11905: 0xE3E8,
- 27753 - 11905: 0xE3E9,
- 27754 - 11905: 0xCDF4,
- 27755 - 11905: 0x9B47,
- 27756 - 11905: 0x9B48,
- 27757 - 11905: 0x9B49,
- 27758 - 11905: 0x9B4A,
- 27759 - 11905: 0x9B4B,
- 27760 - 11905: 0xCCAD,
- 27761 - 11905: 0x9B4C,
- 27762 - 11905: 0xBCB3,
- 27763 - 11905: 0x9B4D,
- 27764 - 11905: 0xE3EA,
- 27765 - 11905: 0x9B4E,
- 27766 - 11905: 0xE3EB,
- 27767 - 11905: 0x9B4F,
- 27768 - 11905: 0x9B50,
- 27769 - 11905: 0xD0DA,
- 27770 - 11905: 0x9B51,
- 27771 - 11905: 0x9B52,
- 27772 - 11905: 0x9B53,
- 27773 - 11905: 0xC6FB,
- 27774 - 11905: 0xB7DA,
- 27775 - 11905: 0x9B54,
- 27776 - 11905: 0x9B55,
- 27777 - 11905: 0xC7DF,
- 27778 - 11905: 0xD2CA,
- 27779 - 11905: 0xCED6,
- 27780 - 11905: 0x9B56,
- 27781 - 11905: 0xE3E4,
- 27782 - 11905: 0xE3EC,
- 27783 - 11905: 0x9B57,
- 27784 - 11905: 0xC9F2,
- 27785 - 11905: 0xB3C1,
- 27786 - 11905: 0x9B58,
- 27787 - 11905: 0x9B59,
- 27788 - 11905: 0xE3E7,
- 27789 - 11905: 0x9B5A,
- 27790 - 11905: 0x9B5B,
- 27791 - 11905: 0xC6E3,
- 27792 - 11905: 0xE3E5,
- 27793 - 11905: 0x9B5C,
- 27794 - 11905: 0x9B5D,
- 27795 - 11905: 0xEDB3,
- 27796 - 11905: 0xE3E6,
- 27797 - 11905: 0x9B5E,
- 27798 - 11905: 0x9B5F,
- 27799 - 11905: 0x9B60,
- 27800 - 11905: 0x9B61,
- 27801 - 11905: 0xC9B3,
- 27802 - 11905: 0x9B62,
- 27803 - 11905: 0xC5E6,
- 27804 - 11905: 0x9B63,
- 27805 - 11905: 0x9B64,
- 27806 - 11905: 0x9B65,
- 27807 - 11905: 0xB9B5,
- 27808 - 11905: 0x9B66,
- 27809 - 11905: 0xC3BB,
- 27810 - 11905: 0x9B67,
- 27811 - 11905: 0xE3E3,
- 27812 - 11905: 0xC5BD,
- 27813 - 11905: 0xC1A4,
- 27814 - 11905: 0xC2D9,
- 27815 - 11905: 0xB2D7,
- 27816 - 11905: 0x9B68,
- 27817 - 11905: 0xE3ED,
- 27818 - 11905: 0xBBA6,
- 27819 - 11905: 0xC4AD,
- 27820 - 11905: 0x9B69,
- 27821 - 11905: 0xE3F0,
- 27822 - 11905: 0xBEDA,
- 27823 - 11905: 0x9B6A,
- 27824 - 11905: 0x9B6B,
- 27825 - 11905: 0xE3FB,
- 27826 - 11905: 0xE3F5,
- 27827 - 11905: 0xBAD3,
- 27828 - 11905: 0x9B6C,
- 27829 - 11905: 0x9B6D,
- 27830 - 11905: 0x9B6E,
- 27831 - 11905: 0x9B6F,
- 27832 - 11905: 0xB7D0,
- 27833 - 11905: 0xD3CD,
- 27834 - 11905: 0x9B70,
- 27835 - 11905: 0xD6CE,
- 27836 - 11905: 0xD5D3,
- 27837 - 11905: 0xB9C1,
- 27838 - 11905: 0xD5B4,
- 27839 - 11905: 0xD1D8,
- 27840 - 11905: 0x9B71,
- 27841 - 11905: 0x9B72,
- 27842 - 11905: 0x9B73,
- 27843 - 11905: 0x9B74,
- 27844 - 11905: 0xD0B9,
- 27845 - 11905: 0xC7F6,
- 27846 - 11905: 0x9B75,
- 27847 - 11905: 0x9B76,
- 27848 - 11905: 0x9B77,
- 27849 - 11905: 0xC8AA,
- 27850 - 11905: 0xB2B4,
- 27851 - 11905: 0x9B78,
- 27852 - 11905: 0xC3DA,
- 27853 - 11905: 0x9B79,
- 27854 - 11905: 0x9B7A,
- 27855 - 11905: 0x9B7B,
- 27856 - 11905: 0xE3EE,
- 27857 - 11905: 0x9B7C,
- 27858 - 11905: 0x9B7D,
- 27859 - 11905: 0xE3FC,
- 27860 - 11905: 0xE3EF,
- 27861 - 11905: 0xB7A8,
- 27862 - 11905: 0xE3F7,
- 27863 - 11905: 0xE3F4,
- 27864 - 11905: 0x9B7E,
- 27865 - 11905: 0x9B80,
- 27866 - 11905: 0x9B81,
- 27867 - 11905: 0xB7BA,
- 27868 - 11905: 0x9B82,
- 27869 - 11905: 0x9B83,
- 27870 - 11905: 0xC5A2,
- 27871 - 11905: 0x9B84,
- 27872 - 11905: 0xE3F6,
- 27873 - 11905: 0xC5DD,
- 27874 - 11905: 0xB2A8,
- 27875 - 11905: 0xC6FC,
- 27876 - 11905: 0x9B85,
- 27877 - 11905: 0xC4E0,
- 27878 - 11905: 0x9B86,
- 27879 - 11905: 0x9B87,
- 27880 - 11905: 0xD7A2,
- 27881 - 11905: 0x9B88,
- 27882 - 11905: 0xC0E1,
- 27883 - 11905: 0xE3F9,
- 27884 - 11905: 0x9B89,
- 27885 - 11905: 0x9B8A,
- 27886 - 11905: 0xE3FA,
- 27887 - 11905: 0xE3FD,
- 27888 - 11905: 0xCCA9,
- 27889 - 11905: 0xE3F3,
- 27890 - 11905: 0x9B8B,
- 27891 - 11905: 0xD3BE,
- 27892 - 11905: 0x9B8C,
- 27893 - 11905: 0xB1C3,
- 27894 - 11905: 0xEDB4,
- 27895 - 11905: 0xE3F1,
- 27896 - 11905: 0xE3F2,
- 27897 - 11905: 0x9B8D,
- 27898 - 11905: 0xE3F8,
- 27899 - 11905: 0xD0BA,
- 27900 - 11905: 0xC6C3,
- 27901 - 11905: 0xD4F3,
- 27902 - 11905: 0xE3FE,
- 27903 - 11905: 0x9B8E,
- 27904 - 11905: 0x9B8F,
- 27905 - 11905: 0xBDE0,
- 27906 - 11905: 0x9B90,
- 27907 - 11905: 0x9B91,
- 27908 - 11905: 0xE4A7,
- 27909 - 11905: 0x9B92,
- 27910 - 11905: 0x9B93,
- 27911 - 11905: 0xE4A6,
- 27912 - 11905: 0x9B94,
- 27913 - 11905: 0x9B95,
- 27914 - 11905: 0x9B96,
- 27915 - 11905: 0xD1F3,
- 27916 - 11905: 0xE4A3,
- 27917 - 11905: 0x9B97,
- 27918 - 11905: 0xE4A9,
- 27919 - 11905: 0x9B98,
- 27920 - 11905: 0x9B99,
- 27921 - 11905: 0x9B9A,
- 27922 - 11905: 0xC8F7,
- 27923 - 11905: 0x9B9B,
- 27924 - 11905: 0x9B9C,
- 27925 - 11905: 0x9B9D,
- 27926 - 11905: 0x9B9E,
- 27927 - 11905: 0xCFB4,
- 27928 - 11905: 0x9B9F,
- 27929 - 11905: 0xE4A8,
- 27930 - 11905: 0xE4AE,
- 27931 - 11905: 0xC2E5,
- 27932 - 11905: 0x9BA0,
- 27933 - 11905: 0x9BA1,
- 27934 - 11905: 0xB6B4,
- 27935 - 11905: 0x9BA2,
- 27936 - 11905: 0x9BA3,
- 27937 - 11905: 0x9BA4,
- 27938 - 11905: 0x9BA5,
- 27939 - 11905: 0x9BA6,
- 27940 - 11905: 0x9BA7,
- 27941 - 11905: 0xBDF2,
- 27942 - 11905: 0x9BA8,
- 27943 - 11905: 0xE4A2,
- 27944 - 11905: 0x9BA9,
- 27945 - 11905: 0x9BAA,
- 27946 - 11905: 0xBAE9,
- 27947 - 11905: 0xE4AA,
- 27948 - 11905: 0x9BAB,
- 27949 - 11905: 0x9BAC,
- 27950 - 11905: 0xE4AC,
- 27951 - 11905: 0x9BAD,
- 27952 - 11905: 0x9BAE,
- 27953 - 11905: 0xB6FD,
- 27954 - 11905: 0xD6DE,
- 27955 - 11905: 0xE4B2,
- 27956 - 11905: 0x9BAF,
- 27957 - 11905: 0xE4AD,
- 27958 - 11905: 0x9BB0,
- 27959 - 11905: 0x9BB1,
- 27960 - 11905: 0x9BB2,
- 27961 - 11905: 0xE4A1,
- 27962 - 11905: 0x9BB3,
- 27963 - 11905: 0xBBEE,
- 27964 - 11905: 0xCDDD,
- 27965 - 11905: 0xC7A2,
- 27966 - 11905: 0xC5C9,
- 27967 - 11905: 0x9BB4,
- 27968 - 11905: 0x9BB5,
- 27969 - 11905: 0xC1F7,
- 27970 - 11905: 0x9BB6,
- 27971 - 11905: 0xE4A4,
- 27972 - 11905: 0x9BB7,
- 27973 - 11905: 0xC7B3,
- 27974 - 11905: 0xBDAC,
- 27975 - 11905: 0xBDBD,
- 27976 - 11905: 0xE4A5,
- 27977 - 11905: 0x9BB8,
- 27978 - 11905: 0xD7C7,
- 27979 - 11905: 0xB2E2,
- 27980 - 11905: 0x9BB9,
- 27981 - 11905: 0xE4AB,
- 27982 - 11905: 0xBCC3,
- 27983 - 11905: 0xE4AF,
- 27984 - 11905: 0x9BBA,
- 27985 - 11905: 0xBBEB,
- 27986 - 11905: 0xE4B0,
- 27987 - 11905: 0xC5A8,
- 27988 - 11905: 0xE4B1,
- 27989 - 11905: 0x9BBB,
- 27990 - 11905: 0x9BBC,
- 27991 - 11905: 0x9BBD,
- 27992 - 11905: 0x9BBE,
- 27993 - 11905: 0xD5E3,
- 27994 - 11905: 0xBFA3,
- 27995 - 11905: 0x9BBF,
- 27996 - 11905: 0xE4BA,
- 27997 - 11905: 0x9BC0,
- 27998 - 11905: 0xE4B7,
- 27999 - 11905: 0x9BC1,
- 28000 - 11905: 0xE4BB,
- 28001 - 11905: 0x9BC2,
- 28002 - 11905: 0x9BC3,
- 28003 - 11905: 0xE4BD,
- 28004 - 11905: 0x9BC4,
- 28005 - 11905: 0x9BC5,
- 28006 - 11905: 0xC6D6,
- 28007 - 11905: 0x9BC6,
- 28008 - 11905: 0x9BC7,
- 28009 - 11905: 0xBAC6,
- 28010 - 11905: 0xC0CB,
- 28011 - 11905: 0x9BC8,
- 28012 - 11905: 0x9BC9,
- 28013 - 11905: 0x9BCA,
- 28014 - 11905: 0xB8A1,
- 28015 - 11905: 0xE4B4,
- 28016 - 11905: 0x9BCB,
- 28017 - 11905: 0x9BCC,
- 28018 - 11905: 0x9BCD,
- 28019 - 11905: 0x9BCE,
- 28020 - 11905: 0xD4A1,
- 28021 - 11905: 0x9BCF,
- 28022 - 11905: 0x9BD0,
- 28023 - 11905: 0xBAA3,
- 28024 - 11905: 0xBDFE,
- 28025 - 11905: 0x9BD1,
- 28026 - 11905: 0x9BD2,
- 28027 - 11905: 0x9BD3,
- 28028 - 11905: 0xE4BC,
- 28029 - 11905: 0x9BD4,
- 28030 - 11905: 0x9BD5,
- 28031 - 11905: 0x9BD6,
- 28032 - 11905: 0x9BD7,
- 28033 - 11905: 0x9BD8,
- 28034 - 11905: 0xCDBF,
- 28035 - 11905: 0x9BD9,
- 28036 - 11905: 0x9BDA,
- 28037 - 11905: 0xC4F9,
- 28038 - 11905: 0x9BDB,
- 28039 - 11905: 0x9BDC,
- 28040 - 11905: 0xCFFB,
- 28041 - 11905: 0xC9E6,
- 28042 - 11905: 0x9BDD,
- 28043 - 11905: 0x9BDE,
- 28044 - 11905: 0xD3BF,
- 28045 - 11905: 0x9BDF,
- 28046 - 11905: 0xCFD1,
- 28047 - 11905: 0x9BE0,
- 28048 - 11905: 0x9BE1,
- 28049 - 11905: 0xE4B3,
- 28050 - 11905: 0x9BE2,
- 28051 - 11905: 0xE4B8,
- 28052 - 11905: 0xE4B9,
- 28053 - 11905: 0xCCE9,
- 28054 - 11905: 0x9BE3,
- 28055 - 11905: 0x9BE4,
- 28056 - 11905: 0x9BE5,
- 28057 - 11905: 0x9BE6,
- 28058 - 11905: 0x9BE7,
- 28059 - 11905: 0xCCCE,
- 28060 - 11905: 0x9BE8,
- 28061 - 11905: 0xC0D4,
- 28062 - 11905: 0xE4B5,
- 28063 - 11905: 0xC1B0,
- 28064 - 11905: 0xE4B6,
- 28065 - 11905: 0xCED0,
- 28066 - 11905: 0x9BE9,
- 28067 - 11905: 0xBBC1,
- 28068 - 11905: 0xB5D3,
- 28069 - 11905: 0x9BEA,
- 28070 - 11905: 0xC8F3,
- 28071 - 11905: 0xBDA7,
- 28072 - 11905: 0xD5C7,
- 28073 - 11905: 0xC9AC,
- 28074 - 11905: 0xB8A2,
- 28075 - 11905: 0xE4CA,
- 28076 - 11905: 0x9BEB,
- 28077 - 11905: 0x9BEC,
- 28078 - 11905: 0xE4CC,
- 28079 - 11905: 0xD1C4,
- 28080 - 11905: 0x9BED,
- 28081 - 11905: 0x9BEE,
- 28082 - 11905: 0xD2BA,
- 28083 - 11905: 0x9BEF,
- 28084 - 11905: 0x9BF0,
- 28085 - 11905: 0xBAAD,
- 28086 - 11905: 0x9BF1,
- 28087 - 11905: 0x9BF2,
- 28088 - 11905: 0xBAD4,
- 28089 - 11905: 0x9BF3,
- 28090 - 11905: 0x9BF4,
- 28091 - 11905: 0x9BF5,
- 28092 - 11905: 0x9BF6,
- 28093 - 11905: 0x9BF7,
- 28094 - 11905: 0x9BF8,
- 28095 - 11905: 0xE4C3,
- 28096 - 11905: 0xB5ED,
- 28097 - 11905: 0x9BF9,
- 28098 - 11905: 0x9BFA,
- 28099 - 11905: 0x9BFB,
- 28100 - 11905: 0xD7CD,
- 28101 - 11905: 0xE4C0,
- 28102 - 11905: 0xCFFD,
- 28103 - 11905: 0xE4BF,
- 28104 - 11905: 0x9BFC,
- 28105 - 11905: 0x9BFD,
- 28106 - 11905: 0x9BFE,
- 28107 - 11905: 0xC1DC,
- 28108 - 11905: 0xCCCA,
- 28109 - 11905: 0x9C40,
- 28110 - 11905: 0x9C41,
- 28111 - 11905: 0x9C42,
- 28112 - 11905: 0x9C43,
- 28113 - 11905: 0xCAE7,
- 28114 - 11905: 0x9C44,
- 28115 - 11905: 0x9C45,
- 28116 - 11905: 0x9C46,
- 28117 - 11905: 0x9C47,
- 28118 - 11905: 0xC4D7,
- 28119 - 11905: 0x9C48,
- 28120 - 11905: 0xCCD4,
- 28121 - 11905: 0xE4C8,
- 28122 - 11905: 0x9C49,
- 28123 - 11905: 0x9C4A,
- 28124 - 11905: 0x9C4B,
- 28125 - 11905: 0xE4C7,
- 28126 - 11905: 0xE4C1,
- 28127 - 11905: 0x9C4C,
- 28128 - 11905: 0xE4C4,
- 28129 - 11905: 0xB5AD,
- 28130 - 11905: 0x9C4D,
- 28131 - 11905: 0x9C4E,
- 28132 - 11905: 0xD3D9,
- 28133 - 11905: 0x9C4F,
- 28134 - 11905: 0xE4C6,
- 28135 - 11905: 0x9C50,
- 28136 - 11905: 0x9C51,
- 28137 - 11905: 0x9C52,
- 28138 - 11905: 0x9C53,
- 28139 - 11905: 0xD2F9,
- 28140 - 11905: 0xB4E3,
- 28141 - 11905: 0x9C54,
- 28142 - 11905: 0xBBB4,
- 28143 - 11905: 0x9C55,
- 28144 - 11905: 0x9C56,
- 28145 - 11905: 0xC9EE,
- 28146 - 11905: 0x9C57,
- 28147 - 11905: 0xB4BE,
- 28148 - 11905: 0x9C58,
- 28149 - 11905: 0x9C59,
- 28150 - 11905: 0x9C5A,
- 28151 - 11905: 0xBBEC,
- 28152 - 11905: 0x9C5B,
- 28153 - 11905: 0xD1CD,
- 28154 - 11905: 0x9C5C,
- 28155 - 11905: 0xCCED,
- 28156 - 11905: 0xEDB5,
- 28157 - 11905: 0x9C5D,
- 28158 - 11905: 0x9C5E,
- 28159 - 11905: 0x9C5F,
- 28160 - 11905: 0x9C60,
- 28161 - 11905: 0x9C61,
- 28162 - 11905: 0x9C62,
- 28163 - 11905: 0x9C63,
- 28164 - 11905: 0x9C64,
- 28165 - 11905: 0xC7E5,
- 28166 - 11905: 0x9C65,
- 28167 - 11905: 0x9C66,
- 28168 - 11905: 0x9C67,
- 28169 - 11905: 0x9C68,
- 28170 - 11905: 0xD4A8,
- 28171 - 11905: 0x9C69,
- 28172 - 11905: 0xE4CB,
- 28173 - 11905: 0xD7D5,
- 28174 - 11905: 0xE4C2,
- 28175 - 11905: 0x9C6A,
- 28176 - 11905: 0xBDA5,
- 28177 - 11905: 0xE4C5,
- 28178 - 11905: 0x9C6B,
- 28179 - 11905: 0x9C6C,
- 28180 - 11905: 0xD3E6,
- 28181 - 11905: 0x9C6D,
- 28182 - 11905: 0xE4C9,
- 28183 - 11905: 0xC9F8,
- 28184 - 11905: 0x9C6E,
- 28185 - 11905: 0x9C6F,
- 28186 - 11905: 0xE4BE,
- 28187 - 11905: 0x9C70,
- 28188 - 11905: 0x9C71,
- 28189 - 11905: 0xD3E5,
- 28190 - 11905: 0x9C72,
- 28191 - 11905: 0x9C73,
- 28192 - 11905: 0xC7FE,
- 28193 - 11905: 0xB6C9,
- 28194 - 11905: 0x9C74,
- 28195 - 11905: 0xD4FC,
- 28196 - 11905: 0xB2B3,
- 28197 - 11905: 0xE4D7,
- 28198 - 11905: 0x9C75,
- 28199 - 11905: 0x9C76,
- 28200 - 11905: 0x9C77,
- 28201 - 11905: 0xCEC2,
- 28202 - 11905: 0x9C78,
- 28203 - 11905: 0xE4CD,
- 28204 - 11905: 0x9C79,
- 28205 - 11905: 0xCEBC,
- 28206 - 11905: 0x9C7A,
- 28207 - 11905: 0xB8DB,
- 28208 - 11905: 0x9C7B,
- 28209 - 11905: 0x9C7C,
- 28210 - 11905: 0xE4D6,
- 28211 - 11905: 0x9C7D,
- 28212 - 11905: 0xBFCA,
- 28213 - 11905: 0x9C7E,
- 28214 - 11905: 0x9C80,
- 28215 - 11905: 0x9C81,
- 28216 - 11905: 0xD3CE,
- 28217 - 11905: 0x9C82,
- 28218 - 11905: 0xC3EC,
- 28219 - 11905: 0x9C83,
- 28220 - 11905: 0x9C84,
- 28221 - 11905: 0x9C85,
- 28222 - 11905: 0x9C86,
- 28223 - 11905: 0x9C87,
- 28224 - 11905: 0x9C88,
- 28225 - 11905: 0x9C89,
- 28226 - 11905: 0x9C8A,
- 28227 - 11905: 0xC5C8,
- 28228 - 11905: 0xE4D8,
- 28229 - 11905: 0x9C8B,
- 28230 - 11905: 0x9C8C,
- 28231 - 11905: 0x9C8D,
- 28232 - 11905: 0x9C8E,
- 28233 - 11905: 0x9C8F,
- 28234 - 11905: 0x9C90,
- 28235 - 11905: 0x9C91,
- 28236 - 11905: 0x9C92,
- 28237 - 11905: 0xCDC4,
- 28238 - 11905: 0xE4CF,
- 28239 - 11905: 0x9C93,
- 28240 - 11905: 0x9C94,
- 28241 - 11905: 0x9C95,
- 28242 - 11905: 0x9C96,
- 28243 - 11905: 0xE4D4,
- 28244 - 11905: 0xE4D5,
- 28245 - 11905: 0x9C97,
- 28246 - 11905: 0xBAFE,
- 28247 - 11905: 0x9C98,
- 28248 - 11905: 0xCFE6,
- 28249 - 11905: 0x9C99,
- 28250 - 11905: 0x9C9A,
- 28251 - 11905: 0xD5BF,
- 28252 - 11905: 0x9C9B,
- 28253 - 11905: 0x9C9C,
- 28254 - 11905: 0x9C9D,
- 28255 - 11905: 0xE4D2,
- 28256 - 11905: 0x9C9E,
- 28257 - 11905: 0x9C9F,
- 28258 - 11905: 0x9CA0,
- 28259 - 11905: 0x9CA1,
- 28260 - 11905: 0x9CA2,
- 28261 - 11905: 0x9CA3,
- 28262 - 11905: 0x9CA4,
- 28263 - 11905: 0x9CA5,
- 28264 - 11905: 0x9CA6,
- 28265 - 11905: 0x9CA7,
- 28266 - 11905: 0x9CA8,
- 28267 - 11905: 0xE4D0,
- 28268 - 11905: 0x9CA9,
- 28269 - 11905: 0x9CAA,
- 28270 - 11905: 0xE4CE,
- 28271 - 11905: 0x9CAB,
- 28272 - 11905: 0x9CAC,
- 28273 - 11905: 0x9CAD,
- 28274 - 11905: 0x9CAE,
- 28275 - 11905: 0x9CAF,
- 28276 - 11905: 0x9CB0,
- 28277 - 11905: 0x9CB1,
- 28278 - 11905: 0x9CB2,
- 28279 - 11905: 0x9CB3,
- 28280 - 11905: 0x9CB4,
- 28281 - 11905: 0x9CB5,
- 28282 - 11905: 0x9CB6,
- 28283 - 11905: 0x9CB7,
- 28284 - 11905: 0x9CB8,
- 28285 - 11905: 0x9CB9,
- 28286 - 11905: 0xCDE5,
- 28287 - 11905: 0xCAAA,
- 28288 - 11905: 0x9CBA,
- 28289 - 11905: 0x9CBB,
- 28290 - 11905: 0x9CBC,
- 28291 - 11905: 0xC0A3,
- 28292 - 11905: 0x9CBD,
- 28293 - 11905: 0xBDA6,
- 28294 - 11905: 0xE4D3,
- 28295 - 11905: 0x9CBE,
- 28296 - 11905: 0x9CBF,
- 28297 - 11905: 0xB8C8,
- 28298 - 11905: 0x9CC0,
- 28299 - 11905: 0x9CC1,
- 28300 - 11905: 0x9CC2,
- 28301 - 11905: 0x9CC3,
- 28302 - 11905: 0x9CC4,
- 28303 - 11905: 0xE4E7,
- 28304 - 11905: 0xD4B4,
- 28305 - 11905: 0x9CC5,
- 28306 - 11905: 0x9CC6,
- 28307 - 11905: 0x9CC7,
- 28308 - 11905: 0x9CC8,
- 28309 - 11905: 0x9CC9,
- 28310 - 11905: 0x9CCA,
- 28311 - 11905: 0x9CCB,
- 28312 - 11905: 0xE4DB,
- 28313 - 11905: 0x9CCC,
- 28314 - 11905: 0x9CCD,
- 28315 - 11905: 0x9CCE,
- 28316 - 11905: 0xC1EF,
- 28317 - 11905: 0x9CCF,
- 28318 - 11905: 0x9CD0,
- 28319 - 11905: 0xE4E9,
- 28320 - 11905: 0x9CD1,
- 28321 - 11905: 0x9CD2,
- 28322 - 11905: 0xD2E7,
- 28323 - 11905: 0x9CD3,
- 28324 - 11905: 0x9CD4,
- 28325 - 11905: 0xE4DF,
- 28326 - 11905: 0x9CD5,
- 28327 - 11905: 0xE4E0,
- 28328 - 11905: 0x9CD6,
- 28329 - 11905: 0x9CD7,
- 28330 - 11905: 0xCFAA,
- 28331 - 11905: 0x9CD8,
- 28332 - 11905: 0x9CD9,
- 28333 - 11905: 0x9CDA,
- 28334 - 11905: 0x9CDB,
- 28335 - 11905: 0xCBDD,
- 28336 - 11905: 0x9CDC,
- 28337 - 11905: 0xE4DA,
- 28338 - 11905: 0xE4D1,
- 28339 - 11905: 0x9CDD,
- 28340 - 11905: 0xE4E5,
- 28341 - 11905: 0x9CDE,
- 28342 - 11905: 0xC8DC,
- 28343 - 11905: 0xE4E3,
- 28344 - 11905: 0x9CDF,
- 28345 - 11905: 0x9CE0,
- 28346 - 11905: 0xC4E7,
- 28347 - 11905: 0xE4E2,
- 28348 - 11905: 0x9CE1,
- 28349 - 11905: 0xE4E1,
- 28350 - 11905: 0x9CE2,
- 28351 - 11905: 0x9CE3,
- 28352 - 11905: 0x9CE4,
- 28353 - 11905: 0xB3FC,
- 28354 - 11905: 0xE4E8,
- 28355 - 11905: 0x9CE5,
- 28356 - 11905: 0x9CE6,
- 28357 - 11905: 0x9CE7,
- 28358 - 11905: 0x9CE8,
- 28359 - 11905: 0xB5E1,
- 28360 - 11905: 0x9CE9,
- 28361 - 11905: 0x9CEA,
- 28362 - 11905: 0x9CEB,
- 28363 - 11905: 0xD7CC,
- 28364 - 11905: 0x9CEC,
- 28365 - 11905: 0x9CED,
- 28366 - 11905: 0x9CEE,
- 28367 - 11905: 0xE4E6,
- 28368 - 11905: 0x9CEF,
- 28369 - 11905: 0xBBAC,
- 28370 - 11905: 0x9CF0,
- 28371 - 11905: 0xD7D2,
- 28372 - 11905: 0xCCCF,
- 28373 - 11905: 0xEBF8,
- 28374 - 11905: 0x9CF1,
- 28375 - 11905: 0xE4E4,
- 28376 - 11905: 0x9CF2,
- 28377 - 11905: 0x9CF3,
- 28378 - 11905: 0xB9F6,
- 28379 - 11905: 0x9CF4,
- 28380 - 11905: 0x9CF5,
- 28381 - 11905: 0x9CF6,
- 28382 - 11905: 0xD6CD,
- 28383 - 11905: 0xE4D9,
- 28384 - 11905: 0xE4DC,
- 28385 - 11905: 0xC2FA,
- 28386 - 11905: 0xE4DE,
- 28387 - 11905: 0x9CF7,
- 28388 - 11905: 0xC2CB,
- 28389 - 11905: 0xC0C4,
- 28390 - 11905: 0xC2D0,
- 28391 - 11905: 0x9CF8,
- 28392 - 11905: 0xB1F5,
- 28393 - 11905: 0xCCB2,
- 28394 - 11905: 0x9CF9,
- 28395 - 11905: 0x9CFA,
- 28396 - 11905: 0x9CFB,
- 28397 - 11905: 0x9CFC,
- 28398 - 11905: 0x9CFD,
- 28399 - 11905: 0x9CFE,
- 28400 - 11905: 0x9D40,
- 28401 - 11905: 0x9D41,
- 28402 - 11905: 0x9D42,
- 28403 - 11905: 0x9D43,
- 28404 - 11905: 0xB5CE,
- 28405 - 11905: 0x9D44,
- 28406 - 11905: 0x9D45,
- 28407 - 11905: 0x9D46,
- 28408 - 11905: 0x9D47,
- 28409 - 11905: 0xE4EF,
- 28410 - 11905: 0x9D48,
- 28411 - 11905: 0x9D49,
- 28412 - 11905: 0x9D4A,
- 28413 - 11905: 0x9D4B,
- 28414 - 11905: 0x9D4C,
- 28415 - 11905: 0x9D4D,
- 28416 - 11905: 0x9D4E,
- 28417 - 11905: 0x9D4F,
- 28418 - 11905: 0xC6AF,
- 28419 - 11905: 0x9D50,
- 28420 - 11905: 0x9D51,
- 28421 - 11905: 0x9D52,
- 28422 - 11905: 0xC6E1,
- 28423 - 11905: 0x9D53,
- 28424 - 11905: 0x9D54,
- 28425 - 11905: 0xE4F5,
- 28426 - 11905: 0x9D55,
- 28427 - 11905: 0x9D56,
- 28428 - 11905: 0x9D57,
- 28429 - 11905: 0x9D58,
- 28430 - 11905: 0x9D59,
- 28431 - 11905: 0xC2A9,
- 28432 - 11905: 0x9D5A,
- 28433 - 11905: 0x9D5B,
- 28434 - 11905: 0x9D5C,
- 28435 - 11905: 0xC0EC,
- 28436 - 11905: 0xD1DD,
- 28437 - 11905: 0xE4EE,
- 28438 - 11905: 0x9D5D,
- 28439 - 11905: 0x9D5E,
- 28440 - 11905: 0x9D5F,
- 28441 - 11905: 0x9D60,
- 28442 - 11905: 0x9D61,
- 28443 - 11905: 0x9D62,
- 28444 - 11905: 0x9D63,
- 28445 - 11905: 0x9D64,
- 28446 - 11905: 0x9D65,
- 28447 - 11905: 0x9D66,
- 28448 - 11905: 0xC4AE,
- 28449 - 11905: 0x9D67,
- 28450 - 11905: 0x9D68,
- 28451 - 11905: 0x9D69,
- 28452 - 11905: 0xE4ED,
- 28453 - 11905: 0x9D6A,
- 28454 - 11905: 0x9D6B,
- 28455 - 11905: 0x9D6C,
- 28456 - 11905: 0x9D6D,
- 28457 - 11905: 0xE4F6,
- 28458 - 11905: 0xE4F4,
- 28459 - 11905: 0xC2FE,
- 28460 - 11905: 0x9D6E,
- 28461 - 11905: 0xE4DD,
- 28462 - 11905: 0x9D6F,
- 28463 - 11905: 0xE4F0,
- 28464 - 11905: 0x9D70,
- 28465 - 11905: 0xCAFE,
- 28466 - 11905: 0x9D71,
- 28467 - 11905: 0xD5C4,
- 28468 - 11905: 0x9D72,
- 28469 - 11905: 0x9D73,
- 28470 - 11905: 0xE4F1,
- 28471 - 11905: 0x9D74,
- 28472 - 11905: 0x9D75,
- 28473 - 11905: 0x9D76,
- 28474 - 11905: 0x9D77,
- 28475 - 11905: 0x9D78,
- 28476 - 11905: 0x9D79,
- 28477 - 11905: 0x9D7A,
- 28478 - 11905: 0xD1FA,
- 28479 - 11905: 0x9D7B,
- 28480 - 11905: 0x9D7C,
- 28481 - 11905: 0x9D7D,
- 28482 - 11905: 0x9D7E,
- 28483 - 11905: 0x9D80,
- 28484 - 11905: 0x9D81,
- 28485 - 11905: 0x9D82,
- 28486 - 11905: 0xE4EB,
- 28487 - 11905: 0xE4EC,
- 28488 - 11905: 0x9D83,
- 28489 - 11905: 0x9D84,
- 28490 - 11905: 0x9D85,
- 28491 - 11905: 0xE4F2,
- 28492 - 11905: 0x9D86,
- 28493 - 11905: 0xCEAB,
- 28494 - 11905: 0x9D87,
- 28495 - 11905: 0x9D88,
- 28496 - 11905: 0x9D89,
- 28497 - 11905: 0x9D8A,
- 28498 - 11905: 0x9D8B,
- 28499 - 11905: 0x9D8C,
- 28500 - 11905: 0x9D8D,
- 28501 - 11905: 0x9D8E,
- 28502 - 11905: 0x9D8F,
- 28503 - 11905: 0x9D90,
- 28504 - 11905: 0xC5CB,
- 28505 - 11905: 0x9D91,
- 28506 - 11905: 0x9D92,
- 28507 - 11905: 0x9D93,
- 28508 - 11905: 0xC7B1,
- 28509 - 11905: 0x9D94,
- 28510 - 11905: 0xC2BA,
- 28511 - 11905: 0x9D95,
- 28512 - 11905: 0x9D96,
- 28513 - 11905: 0x9D97,
- 28514 - 11905: 0xE4EA,
- 28515 - 11905: 0x9D98,
- 28516 - 11905: 0x9D99,
- 28517 - 11905: 0x9D9A,
- 28518 - 11905: 0xC1CA,
- 28519 - 11905: 0x9D9B,
- 28520 - 11905: 0x9D9C,
- 28521 - 11905: 0x9D9D,
- 28522 - 11905: 0x9D9E,
- 28523 - 11905: 0x9D9F,
- 28524 - 11905: 0x9DA0,
- 28525 - 11905: 0xCCB6,
- 28526 - 11905: 0xB3B1,
- 28527 - 11905: 0x9DA1,
- 28528 - 11905: 0x9DA2,
- 28529 - 11905: 0x9DA3,
- 28530 - 11905: 0xE4FB,
- 28531 - 11905: 0x9DA4,
- 28532 - 11905: 0xE4F3,
- 28533 - 11905: 0x9DA5,
- 28534 - 11905: 0x9DA6,
- 28535 - 11905: 0x9DA7,
- 28536 - 11905: 0xE4FA,
- 28537 - 11905: 0x9DA8,
- 28538 - 11905: 0xE4FD,
- 28539 - 11905: 0x9DA9,
- 28540 - 11905: 0xE4FC,
- 28541 - 11905: 0x9DAA,
- 28542 - 11905: 0x9DAB,
- 28543 - 11905: 0x9DAC,
- 28544 - 11905: 0x9DAD,
- 28545 - 11905: 0x9DAE,
- 28546 - 11905: 0x9DAF,
- 28547 - 11905: 0x9DB0,
- 28548 - 11905: 0xB3CE,
- 28549 - 11905: 0x9DB1,
- 28550 - 11905: 0x9DB2,
- 28551 - 11905: 0x9DB3,
- 28552 - 11905: 0xB3BA,
- 28553 - 11905: 0xE4F7,
- 28554 - 11905: 0x9DB4,
- 28555 - 11905: 0x9DB5,
- 28556 - 11905: 0xE4F9,
- 28557 - 11905: 0xE4F8,
- 28558 - 11905: 0xC5EC,
- 28559 - 11905: 0x9DB6,
- 28560 - 11905: 0x9DB7,
- 28561 - 11905: 0x9DB8,
- 28562 - 11905: 0x9DB9,
- 28563 - 11905: 0x9DBA,
- 28564 - 11905: 0x9DBB,
- 28565 - 11905: 0x9DBC,
- 28566 - 11905: 0x9DBD,
- 28567 - 11905: 0x9DBE,
- 28568 - 11905: 0x9DBF,
- 28569 - 11905: 0x9DC0,
- 28570 - 11905: 0x9DC1,
- 28571 - 11905: 0x9DC2,
- 28572 - 11905: 0xC0BD,
- 28573 - 11905: 0x9DC3,
- 28574 - 11905: 0x9DC4,
- 28575 - 11905: 0x9DC5,
- 28576 - 11905: 0x9DC6,
- 28577 - 11905: 0xD4E8,
- 28578 - 11905: 0x9DC7,
- 28579 - 11905: 0x9DC8,
- 28580 - 11905: 0x9DC9,
- 28581 - 11905: 0x9DCA,
- 28582 - 11905: 0x9DCB,
- 28583 - 11905: 0xE5A2,
- 28584 - 11905: 0x9DCC,
- 28585 - 11905: 0x9DCD,
- 28586 - 11905: 0x9DCE,
- 28587 - 11905: 0x9DCF,
- 28588 - 11905: 0x9DD0,
- 28589 - 11905: 0x9DD1,
- 28590 - 11905: 0x9DD2,
- 28591 - 11905: 0x9DD3,
- 28592 - 11905: 0x9DD4,
- 28593 - 11905: 0x9DD5,
- 28594 - 11905: 0x9DD6,
- 28595 - 11905: 0xB0C4,
- 28596 - 11905: 0x9DD7,
- 28597 - 11905: 0x9DD8,
- 28598 - 11905: 0xE5A4,
- 28599 - 11905: 0x9DD9,
- 28600 - 11905: 0x9DDA,
- 28601 - 11905: 0xE5A3,
- 28602 - 11905: 0x9DDB,
- 28603 - 11905: 0x9DDC,
- 28604 - 11905: 0x9DDD,
- 28605 - 11905: 0x9DDE,
- 28606 - 11905: 0x9DDF,
- 28607 - 11905: 0x9DE0,
- 28608 - 11905: 0xBCA4,
- 28609 - 11905: 0x9DE1,
- 28610 - 11905: 0xE5A5,
- 28611 - 11905: 0x9DE2,
- 28612 - 11905: 0x9DE3,
- 28613 - 11905: 0x9DE4,
- 28614 - 11905: 0x9DE5,
- 28615 - 11905: 0x9DE6,
- 28616 - 11905: 0x9DE7,
- 28617 - 11905: 0xE5A1,
- 28618 - 11905: 0x9DE8,
- 28619 - 11905: 0x9DE9,
- 28620 - 11905: 0x9DEA,
- 28621 - 11905: 0x9DEB,
- 28622 - 11905: 0x9DEC,
- 28623 - 11905: 0x9DED,
- 28624 - 11905: 0x9DEE,
- 28625 - 11905: 0xE4FE,
- 28626 - 11905: 0xB1F4,
- 28627 - 11905: 0x9DEF,
- 28628 - 11905: 0x9DF0,
- 28629 - 11905: 0x9DF1,
- 28630 - 11905: 0x9DF2,
- 28631 - 11905: 0x9DF3,
- 28632 - 11905: 0x9DF4,
- 28633 - 11905: 0x9DF5,
- 28634 - 11905: 0x9DF6,
- 28635 - 11905: 0x9DF7,
- 28636 - 11905: 0x9DF8,
- 28637 - 11905: 0x9DF9,
- 28638 - 11905: 0xE5A8,
- 28639 - 11905: 0x9DFA,
- 28640 - 11905: 0xE5A9,
- 28641 - 11905: 0xE5A6,
- 28642 - 11905: 0x9DFB,
- 28643 - 11905: 0x9DFC,
- 28644 - 11905: 0x9DFD,
- 28645 - 11905: 0x9DFE,
- 28646 - 11905: 0x9E40,
- 28647 - 11905: 0x9E41,
- 28648 - 11905: 0x9E42,
- 28649 - 11905: 0x9E43,
- 28650 - 11905: 0x9E44,
- 28651 - 11905: 0x9E45,
- 28652 - 11905: 0x9E46,
- 28653 - 11905: 0x9E47,
- 28654 - 11905: 0xE5A7,
- 28655 - 11905: 0xE5AA,
- 28656 - 11905: 0x9E48,
- 28657 - 11905: 0x9E49,
- 28658 - 11905: 0x9E4A,
- 28659 - 11905: 0x9E4B,
- 28660 - 11905: 0x9E4C,
- 28661 - 11905: 0x9E4D,
- 28662 - 11905: 0x9E4E,
- 28663 - 11905: 0x9E4F,
- 28664 - 11905: 0x9E50,
- 28665 - 11905: 0x9E51,
- 28666 - 11905: 0x9E52,
- 28667 - 11905: 0x9E53,
- 28668 - 11905: 0x9E54,
- 28669 - 11905: 0x9E55,
- 28670 - 11905: 0x9E56,
- 28671 - 11905: 0x9E57,
- 28672 - 11905: 0x9E58,
- 28673 - 11905: 0x9E59,
- 28674 - 11905: 0x9E5A,
- 28675 - 11905: 0x9E5B,
- 28676 - 11905: 0x9E5C,
- 28677 - 11905: 0x9E5D,
- 28678 - 11905: 0x9E5E,
- 28679 - 11905: 0x9E5F,
- 28680 - 11905: 0x9E60,
- 28681 - 11905: 0x9E61,
- 28682 - 11905: 0x9E62,
- 28683 - 11905: 0x9E63,
- 28684 - 11905: 0x9E64,
- 28685 - 11905: 0x9E65,
- 28686 - 11905: 0x9E66,
- 28687 - 11905: 0x9E67,
- 28688 - 11905: 0x9E68,
- 28689 - 11905: 0xC6D9,
- 28690 - 11905: 0x9E69,
- 28691 - 11905: 0x9E6A,
- 28692 - 11905: 0x9E6B,
- 28693 - 11905: 0x9E6C,
- 28694 - 11905: 0x9E6D,
- 28695 - 11905: 0x9E6E,
- 28696 - 11905: 0x9E6F,
- 28697 - 11905: 0x9E70,
- 28698 - 11905: 0xE5AB,
- 28699 - 11905: 0xE5AD,
- 28700 - 11905: 0x9E71,
- 28701 - 11905: 0x9E72,
- 28702 - 11905: 0x9E73,
- 28703 - 11905: 0x9E74,
- 28704 - 11905: 0x9E75,
- 28705 - 11905: 0x9E76,
- 28706 - 11905: 0x9E77,
- 28707 - 11905: 0xE5AC,
- 28708 - 11905: 0x9E78,
- 28709 - 11905: 0x9E79,
- 28710 - 11905: 0x9E7A,
- 28711 - 11905: 0x9E7B,
- 28712 - 11905: 0x9E7C,
- 28713 - 11905: 0x9E7D,
- 28714 - 11905: 0x9E7E,
- 28715 - 11905: 0x9E80,
- 28716 - 11905: 0x9E81,
- 28717 - 11905: 0x9E82,
- 28718 - 11905: 0x9E83,
- 28719 - 11905: 0x9E84,
- 28720 - 11905: 0x9E85,
- 28721 - 11905: 0x9E86,
- 28722 - 11905: 0x9E87,
- 28723 - 11905: 0x9E88,
- 28724 - 11905: 0x9E89,
- 28725 - 11905: 0xE5AF,
- 28726 - 11905: 0x9E8A,
- 28727 - 11905: 0x9E8B,
- 28728 - 11905: 0x9E8C,
- 28729 - 11905: 0xE5AE,
- 28730 - 11905: 0x9E8D,
- 28731 - 11905: 0x9E8E,
- 28732 - 11905: 0x9E8F,
- 28733 - 11905: 0x9E90,
- 28734 - 11905: 0x9E91,
- 28735 - 11905: 0x9E92,
- 28736 - 11905: 0x9E93,
- 28737 - 11905: 0x9E94,
- 28738 - 11905: 0x9E95,
- 28739 - 11905: 0x9E96,
- 28740 - 11905: 0x9E97,
- 28741 - 11905: 0x9E98,
- 28742 - 11905: 0x9E99,
- 28743 - 11905: 0x9E9A,
- 28744 - 11905: 0x9E9B,
- 28745 - 11905: 0x9E9C,
- 28746 - 11905: 0x9E9D,
- 28747 - 11905: 0x9E9E,
- 28748 - 11905: 0xB9E0,
- 28749 - 11905: 0x9E9F,
- 28750 - 11905: 0x9EA0,
- 28751 - 11905: 0xE5B0,
- 28752 - 11905: 0x9EA1,
- 28753 - 11905: 0x9EA2,
- 28754 - 11905: 0x9EA3,
- 28755 - 11905: 0x9EA4,
- 28756 - 11905: 0x9EA5,
- 28757 - 11905: 0x9EA6,
- 28758 - 11905: 0x9EA7,
- 28759 - 11905: 0x9EA8,
- 28760 - 11905: 0x9EA9,
- 28761 - 11905: 0x9EAA,
- 28762 - 11905: 0x9EAB,
- 28763 - 11905: 0x9EAC,
- 28764 - 11905: 0x9EAD,
- 28765 - 11905: 0x9EAE,
- 28766 - 11905: 0xE5B1,
- 28767 - 11905: 0x9EAF,
- 28768 - 11905: 0x9EB0,
- 28769 - 11905: 0x9EB1,
- 28770 - 11905: 0x9EB2,
- 28771 - 11905: 0x9EB3,
- 28772 - 11905: 0x9EB4,
- 28773 - 11905: 0x9EB5,
- 28774 - 11905: 0x9EB6,
- 28775 - 11905: 0x9EB7,
- 28776 - 11905: 0x9EB8,
- 28777 - 11905: 0x9EB9,
- 28778 - 11905: 0x9EBA,
- 28779 - 11905: 0xBBF0,
- 28780 - 11905: 0xECE1,
- 28781 - 11905: 0xC3F0,
- 28782 - 11905: 0x9EBB,
- 28783 - 11905: 0xB5C6,
- 28784 - 11905: 0xBBD2,
- 28785 - 11905: 0x9EBC,
- 28786 - 11905: 0x9EBD,
- 28787 - 11905: 0x9EBE,
- 28788 - 11905: 0x9EBF,
- 28789 - 11905: 0xC1E9,
- 28790 - 11905: 0xD4EE,
- 28791 - 11905: 0x9EC0,
- 28792 - 11905: 0xBEC4,
- 28793 - 11905: 0x9EC1,
- 28794 - 11905: 0x9EC2,
- 28795 - 11905: 0x9EC3,
- 28796 - 11905: 0xD7C6,
- 28797 - 11905: 0x9EC4,
- 28798 - 11905: 0xD4D6,
- 28799 - 11905: 0xB2D3,
- 28800 - 11905: 0xECBE,
- 28801 - 11905: 0x9EC5,
- 28802 - 11905: 0x9EC6,
- 28803 - 11905: 0x9EC7,
- 28804 - 11905: 0x9EC8,
- 28805 - 11905: 0xEAC1,
- 28806 - 11905: 0x9EC9,
- 28807 - 11905: 0x9ECA,
- 28808 - 11905: 0x9ECB,
- 28809 - 11905: 0xC2AF,
- 28810 - 11905: 0xB4B6,
- 28811 - 11905: 0x9ECC,
- 28812 - 11905: 0x9ECD,
- 28813 - 11905: 0x9ECE,
- 28814 - 11905: 0xD1D7,
- 28815 - 11905: 0x9ECF,
- 28816 - 11905: 0x9ED0,
- 28817 - 11905: 0x9ED1,
- 28818 - 11905: 0xB3B4,
- 28819 - 11905: 0x9ED2,
- 28820 - 11905: 0xC8B2,
- 28821 - 11905: 0xBFBB,
- 28822 - 11905: 0xECC0,
- 28823 - 11905: 0x9ED3,
- 28824 - 11905: 0x9ED4,
- 28825 - 11905: 0xD6CB,
- 28826 - 11905: 0x9ED5,
- 28827 - 11905: 0x9ED6,
- 28828 - 11905: 0xECBF,
- 28829 - 11905: 0xECC1,
- 28830 - 11905: 0x9ED7,
- 28831 - 11905: 0x9ED8,
- 28832 - 11905: 0x9ED9,
- 28833 - 11905: 0x9EDA,
- 28834 - 11905: 0x9EDB,
- 28835 - 11905: 0x9EDC,
- 28836 - 11905: 0x9EDD,
- 28837 - 11905: 0x9EDE,
- 28838 - 11905: 0x9EDF,
- 28839 - 11905: 0x9EE0,
- 28840 - 11905: 0x9EE1,
- 28841 - 11905: 0x9EE2,
- 28842 - 11905: 0x9EE3,
- 28843 - 11905: 0xECC5,
- 28844 - 11905: 0xBEE6,
- 28845 - 11905: 0xCCBF,
- 28846 - 11905: 0xC5DA,
- 28847 - 11905: 0xBEBC,
- 28848 - 11905: 0x9EE4,
- 28849 - 11905: 0xECC6,
- 28850 - 11905: 0x9EE5,
- 28851 - 11905: 0xB1FE,
- 28852 - 11905: 0x9EE6,
- 28853 - 11905: 0x9EE7,
- 28854 - 11905: 0x9EE8,
- 28855 - 11905: 0xECC4,
- 28856 - 11905: 0xD5A8,
- 28857 - 11905: 0xB5E3,
- 28858 - 11905: 0x9EE9,
- 28859 - 11905: 0xECC2,
- 28860 - 11905: 0xC1B6,
- 28861 - 11905: 0xB3E3,
- 28862 - 11905: 0x9EEA,
- 28863 - 11905: 0x9EEB,
- 28864 - 11905: 0xECC3,
- 28865 - 11905: 0xCBB8,
- 28866 - 11905: 0xC0C3,
- 28867 - 11905: 0xCCFE,
- 28868 - 11905: 0x9EEC,
- 28869 - 11905: 0x9EED,
- 28870 - 11905: 0x9EEE,
- 28871 - 11905: 0x9EEF,
- 28872 - 11905: 0xC1D2,
- 28873 - 11905: 0x9EF0,
- 28874 - 11905: 0xECC8,
- 28875 - 11905: 0x9EF1,
- 28876 - 11905: 0x9EF2,
- 28877 - 11905: 0x9EF3,
- 28878 - 11905: 0x9EF4,
- 28879 - 11905: 0x9EF5,
- 28880 - 11905: 0x9EF6,
- 28881 - 11905: 0x9EF7,
- 28882 - 11905: 0x9EF8,
- 28883 - 11905: 0x9EF9,
- 28884 - 11905: 0x9EFA,
- 28885 - 11905: 0x9EFB,
- 28886 - 11905: 0x9EFC,
- 28887 - 11905: 0x9EFD,
- 28888 - 11905: 0xBAE6,
- 28889 - 11905: 0xC0D3,
- 28890 - 11905: 0x9EFE,
- 28891 - 11905: 0xD6F2,
- 28892 - 11905: 0x9F40,
- 28893 - 11905: 0x9F41,
- 28894 - 11905: 0x9F42,
- 28895 - 11905: 0xD1CC,
- 28896 - 11905: 0x9F43,
- 28897 - 11905: 0x9F44,
- 28898 - 11905: 0x9F45,
- 28899 - 11905: 0x9F46,
- 28900 - 11905: 0xBFBE,
- 28901 - 11905: 0x9F47,
- 28902 - 11905: 0xB7B3,
- 28903 - 11905: 0xC9D5,
- 28904 - 11905: 0xECC7,
- 28905 - 11905: 0xBBE2,
- 28906 - 11905: 0x9F48,
- 28907 - 11905: 0xCCCC,
- 28908 - 11905: 0xBDFD,
- 28909 - 11905: 0xC8C8,
- 28910 - 11905: 0x9F49,
- 28911 - 11905: 0xCFA9,
- 28912 - 11905: 0x9F4A,
- 28913 - 11905: 0x9F4B,
- 28914 - 11905: 0x9F4C,
- 28915 - 11905: 0x9F4D,
- 28916 - 11905: 0x9F4E,
- 28917 - 11905: 0x9F4F,
- 28918 - 11905: 0x9F50,
- 28919 - 11905: 0xCDE9,
- 28920 - 11905: 0x9F51,
- 28921 - 11905: 0xC5EB,
- 28922 - 11905: 0x9F52,
- 28923 - 11905: 0x9F53,
- 28924 - 11905: 0x9F54,
- 28925 - 11905: 0xB7E9,
- 28926 - 11905: 0x9F55,
- 28927 - 11905: 0x9F56,
- 28928 - 11905: 0x9F57,
- 28929 - 11905: 0x9F58,
- 28930 - 11905: 0x9F59,
- 28931 - 11905: 0x9F5A,
- 28932 - 11905: 0x9F5B,
- 28933 - 11905: 0x9F5C,
- 28934 - 11905: 0x9F5D,
- 28935 - 11905: 0x9F5E,
- 28936 - 11905: 0x9F5F,
- 28937 - 11905: 0xD1C9,
- 28938 - 11905: 0xBAB8,
- 28939 - 11905: 0x9F60,
- 28940 - 11905: 0x9F61,
- 28941 - 11905: 0x9F62,
- 28942 - 11905: 0x9F63,
- 28943 - 11905: 0x9F64,
- 28944 - 11905: 0xECC9,
- 28945 - 11905: 0x9F65,
- 28946 - 11905: 0x9F66,
- 28947 - 11905: 0xECCA,
- 28948 - 11905: 0x9F67,
- 28949 - 11905: 0xBBC0,
- 28950 - 11905: 0xECCB,
- 28951 - 11905: 0x9F68,
- 28952 - 11905: 0xECE2,
- 28953 - 11905: 0xB1BA,
- 28954 - 11905: 0xB7D9,
- 28955 - 11905: 0x9F69,
- 28956 - 11905: 0x9F6A,
- 28957 - 11905: 0x9F6B,
- 28958 - 11905: 0x9F6C,
- 28959 - 11905: 0x9F6D,
- 28960 - 11905: 0x9F6E,
- 28961 - 11905: 0x9F6F,
- 28962 - 11905: 0x9F70,
- 28963 - 11905: 0x9F71,
- 28964 - 11905: 0x9F72,
- 28965 - 11905: 0x9F73,
- 28966 - 11905: 0xBDB9,
- 28967 - 11905: 0x9F74,
- 28968 - 11905: 0x9F75,
- 28969 - 11905: 0x9F76,
- 28970 - 11905: 0x9F77,
- 28971 - 11905: 0x9F78,
- 28972 - 11905: 0x9F79,
- 28973 - 11905: 0x9F7A,
- 28974 - 11905: 0x9F7B,
- 28975 - 11905: 0xECCC,
- 28976 - 11905: 0xD1E6,
- 28977 - 11905: 0xECCD,
- 28978 - 11905: 0x9F7C,
- 28979 - 11905: 0x9F7D,
- 28980 - 11905: 0x9F7E,
- 28981 - 11905: 0x9F80,
- 28982 - 11905: 0xC8BB,
- 28983 - 11905: 0x9F81,
- 28984 - 11905: 0x9F82,
- 28985 - 11905: 0x9F83,
- 28986 - 11905: 0x9F84,
- 28987 - 11905: 0x9F85,
- 28988 - 11905: 0x9F86,
- 28989 - 11905: 0x9F87,
- 28990 - 11905: 0x9F88,
- 28991 - 11905: 0x9F89,
- 28992 - 11905: 0x9F8A,
- 28993 - 11905: 0x9F8B,
- 28994 - 11905: 0x9F8C,
- 28995 - 11905: 0x9F8D,
- 28996 - 11905: 0x9F8E,
- 28997 - 11905: 0xECD1,
- 28998 - 11905: 0x9F8F,
- 28999 - 11905: 0x9F90,
- 29000 - 11905: 0x9F91,
- 29001 - 11905: 0x9F92,
- 29002 - 11905: 0xECD3,
- 29003 - 11905: 0x9F93,
- 29004 - 11905: 0xBBCD,
- 29005 - 11905: 0x9F94,
- 29006 - 11905: 0xBCE5,
- 29007 - 11905: 0x9F95,
- 29008 - 11905: 0x9F96,
- 29009 - 11905: 0x9F97,
- 29010 - 11905: 0x9F98,
- 29011 - 11905: 0x9F99,
- 29012 - 11905: 0x9F9A,
- 29013 - 11905: 0x9F9B,
- 29014 - 11905: 0x9F9C,
- 29015 - 11905: 0x9F9D,
- 29016 - 11905: 0x9F9E,
- 29017 - 11905: 0x9F9F,
- 29018 - 11905: 0x9FA0,
- 29019 - 11905: 0x9FA1,
- 29020 - 11905: 0xECCF,
- 29021 - 11905: 0x9FA2,
- 29022 - 11905: 0xC9B7,
- 29023 - 11905: 0x9FA3,
- 29024 - 11905: 0x9FA4,
- 29025 - 11905: 0x9FA5,
- 29026 - 11905: 0x9FA6,
- 29027 - 11905: 0x9FA7,
- 29028 - 11905: 0xC3BA,
- 29029 - 11905: 0x9FA8,
- 29030 - 11905: 0xECE3,
- 29031 - 11905: 0xD5D5,
- 29032 - 11905: 0xECD0,
- 29033 - 11905: 0x9FA9,
- 29034 - 11905: 0x9FAA,
- 29035 - 11905: 0x9FAB,
- 29036 - 11905: 0x9FAC,
- 29037 - 11905: 0x9FAD,
- 29038 - 11905: 0xD6F3,
- 29039 - 11905: 0x9FAE,
- 29040 - 11905: 0x9FAF,
- 29041 - 11905: 0x9FB0,
- 29042 - 11905: 0xECD2,
- 29043 - 11905: 0xECCE,
- 29044 - 11905: 0x9FB1,
- 29045 - 11905: 0x9FB2,
- 29046 - 11905: 0x9FB3,
- 29047 - 11905: 0x9FB4,
- 29048 - 11905: 0xECD4,
- 29049 - 11905: 0x9FB5,
- 29050 - 11905: 0xECD5,
- 29051 - 11905: 0x9FB6,
- 29052 - 11905: 0x9FB7,
- 29053 - 11905: 0xC9BF,
- 29054 - 11905: 0x9FB8,
- 29055 - 11905: 0x9FB9,
- 29056 - 11905: 0x9FBA,
- 29057 - 11905: 0x9FBB,
- 29058 - 11905: 0x9FBC,
- 29059 - 11905: 0x9FBD,
- 29060 - 11905: 0xCFA8,
- 29061 - 11905: 0x9FBE,
- 29062 - 11905: 0x9FBF,
- 29063 - 11905: 0x9FC0,
- 29064 - 11905: 0x9FC1,
- 29065 - 11905: 0x9FC2,
- 29066 - 11905: 0xD0DC,
- 29067 - 11905: 0x9FC3,
- 29068 - 11905: 0x9FC4,
- 29069 - 11905: 0x9FC5,
- 29070 - 11905: 0x9FC6,
- 29071 - 11905: 0xD1AC,
- 29072 - 11905: 0x9FC7,
- 29073 - 11905: 0x9FC8,
- 29074 - 11905: 0x9FC9,
- 29075 - 11905: 0x9FCA,
- 29076 - 11905: 0xC8DB,
- 29077 - 11905: 0x9FCB,
- 29078 - 11905: 0x9FCC,
- 29079 - 11905: 0x9FCD,
- 29080 - 11905: 0xECD6,
- 29081 - 11905: 0xCEF5,
- 29082 - 11905: 0x9FCE,
- 29083 - 11905: 0x9FCF,
- 29084 - 11905: 0x9FD0,
- 29085 - 11905: 0x9FD1,
- 29086 - 11905: 0x9FD2,
- 29087 - 11905: 0xCAEC,
- 29088 - 11905: 0xECDA,
- 29089 - 11905: 0x9FD3,
- 29090 - 11905: 0x9FD4,
- 29091 - 11905: 0x9FD5,
- 29092 - 11905: 0x9FD6,
- 29093 - 11905: 0x9FD7,
- 29094 - 11905: 0x9FD8,
- 29095 - 11905: 0x9FD9,
- 29096 - 11905: 0xECD9,
- 29097 - 11905: 0x9FDA,
- 29098 - 11905: 0x9FDB,
- 29099 - 11905: 0x9FDC,
- 29100 - 11905: 0xB0BE,
- 29101 - 11905: 0x9FDD,
- 29102 - 11905: 0x9FDE,
- 29103 - 11905: 0x9FDF,
- 29104 - 11905: 0x9FE0,
- 29105 - 11905: 0x9FE1,
- 29106 - 11905: 0x9FE2,
- 29107 - 11905: 0xECD7,
- 29108 - 11905: 0x9FE3,
- 29109 - 11905: 0xECD8,
- 29110 - 11905: 0x9FE4,
- 29111 - 11905: 0x9FE5,
- 29112 - 11905: 0x9FE6,
- 29113 - 11905: 0xECE4,
- 29114 - 11905: 0x9FE7,
- 29115 - 11905: 0x9FE8,
- 29116 - 11905: 0x9FE9,
- 29117 - 11905: 0x9FEA,
- 29118 - 11905: 0x9FEB,
- 29119 - 11905: 0x9FEC,
- 29120 - 11905: 0x9FED,
- 29121 - 11905: 0x9FEE,
- 29122 - 11905: 0x9FEF,
- 29123 - 11905: 0xC8BC,
- 29124 - 11905: 0x9FF0,
- 29125 - 11905: 0x9FF1,
- 29126 - 11905: 0x9FF2,
- 29127 - 11905: 0x9FF3,
- 29128 - 11905: 0x9FF4,
- 29129 - 11905: 0x9FF5,
- 29130 - 11905: 0x9FF6,
- 29131 - 11905: 0x9FF7,
- 29132 - 11905: 0x9FF8,
- 29133 - 11905: 0x9FF9,
- 29134 - 11905: 0xC1C7,
- 29135 - 11905: 0x9FFA,
- 29136 - 11905: 0x9FFB,
- 29137 - 11905: 0x9FFC,
- 29138 - 11905: 0x9FFD,
- 29139 - 11905: 0x9FFE,
- 29140 - 11905: 0xECDC,
- 29141 - 11905: 0xD1E0,
- 29142 - 11905: 0xA040,
- 29143 - 11905: 0xA041,
- 29144 - 11905: 0xA042,
- 29145 - 11905: 0xA043,
- 29146 - 11905: 0xA044,
- 29147 - 11905: 0xA045,
- 29148 - 11905: 0xA046,
- 29149 - 11905: 0xA047,
- 29150 - 11905: 0xA048,
- 29151 - 11905: 0xA049,
- 29152 - 11905: 0xECDB,
- 29153 - 11905: 0xA04A,
- 29154 - 11905: 0xA04B,
- 29155 - 11905: 0xA04C,
- 29156 - 11905: 0xA04D,
- 29157 - 11905: 0xD4EF,
- 29158 - 11905: 0xA04E,
- 29159 - 11905: 0xECDD,
- 29160 - 11905: 0xA04F,
- 29161 - 11905: 0xA050,
- 29162 - 11905: 0xA051,
- 29163 - 11905: 0xA052,
- 29164 - 11905: 0xA053,
- 29165 - 11905: 0xA054,
- 29166 - 11905: 0xDBC6,
- 29167 - 11905: 0xA055,
- 29168 - 11905: 0xA056,
- 29169 - 11905: 0xA057,
- 29170 - 11905: 0xA058,
- 29171 - 11905: 0xA059,
- 29172 - 11905: 0xA05A,
- 29173 - 11905: 0xA05B,
- 29174 - 11905: 0xA05C,
- 29175 - 11905: 0xA05D,
- 29176 - 11905: 0xA05E,
- 29177 - 11905: 0xECDE,
- 29178 - 11905: 0xA05F,
- 29179 - 11905: 0xA060,
- 29180 - 11905: 0xA061,
- 29181 - 11905: 0xA062,
- 29182 - 11905: 0xA063,
- 29183 - 11905: 0xA064,
- 29184 - 11905: 0xA065,
- 29185 - 11905: 0xA066,
- 29186 - 11905: 0xA067,
- 29187 - 11905: 0xA068,
- 29188 - 11905: 0xA069,
- 29189 - 11905: 0xA06A,
- 29190 - 11905: 0xB1AC,
- 29191 - 11905: 0xA06B,
- 29192 - 11905: 0xA06C,
- 29193 - 11905: 0xA06D,
- 29194 - 11905: 0xA06E,
- 29195 - 11905: 0xA06F,
- 29196 - 11905: 0xA070,
- 29197 - 11905: 0xA071,
- 29198 - 11905: 0xA072,
- 29199 - 11905: 0xA073,
- 29200 - 11905: 0xA074,
- 29201 - 11905: 0xA075,
- 29202 - 11905: 0xA076,
- 29203 - 11905: 0xA077,
- 29204 - 11905: 0xA078,
- 29205 - 11905: 0xA079,
- 29206 - 11905: 0xA07A,
- 29207 - 11905: 0xA07B,
- 29208 - 11905: 0xA07C,
- 29209 - 11905: 0xA07D,
- 29210 - 11905: 0xA07E,
- 29211 - 11905: 0xA080,
- 29212 - 11905: 0xA081,
- 29213 - 11905: 0xECDF,
- 29214 - 11905: 0xA082,
- 29215 - 11905: 0xA083,
- 29216 - 11905: 0xA084,
- 29217 - 11905: 0xA085,
- 29218 - 11905: 0xA086,
- 29219 - 11905: 0xA087,
- 29220 - 11905: 0xA088,
- 29221 - 11905: 0xA089,
- 29222 - 11905: 0xA08A,
- 29223 - 11905: 0xA08B,
- 29224 - 11905: 0xECE0,
- 29225 - 11905: 0xA08C,
- 29226 - 11905: 0xD7A6,
- 29227 - 11905: 0xA08D,
- 29228 - 11905: 0xC5C0,
- 29229 - 11905: 0xA08E,
- 29230 - 11905: 0xA08F,
- 29231 - 11905: 0xA090,
- 29232 - 11905: 0xEBBC,
- 29233 - 11905: 0xB0AE,
- 29234 - 11905: 0xA091,
- 29235 - 11905: 0xA092,
- 29236 - 11905: 0xA093,
- 29237 - 11905: 0xBEF4,
- 29238 - 11905: 0xB8B8,
- 29239 - 11905: 0xD2AF,
- 29240 - 11905: 0xB0D6,
- 29241 - 11905: 0xB5F9,
- 29242 - 11905: 0xA094,
- 29243 - 11905: 0xD8B3,
- 29244 - 11905: 0xA095,
- 29245 - 11905: 0xCBAC,
- 29246 - 11905: 0xA096,
- 29247 - 11905: 0xE3DD,
- 29248 - 11905: 0xA097,
- 29249 - 11905: 0xA098,
- 29250 - 11905: 0xA099,
- 29251 - 11905: 0xA09A,
- 29252 - 11905: 0xA09B,
- 29253 - 11905: 0xA09C,
- 29254 - 11905: 0xA09D,
- 29255 - 11905: 0xC6AC,
- 29256 - 11905: 0xB0E6,
- 29257 - 11905: 0xA09E,
- 29258 - 11905: 0xA09F,
- 29259 - 11905: 0xA0A0,
- 29260 - 11905: 0xC5C6,
- 29261 - 11905: 0xEBB9,
- 29262 - 11905: 0xA0A1,
- 29263 - 11905: 0xA0A2,
- 29264 - 11905: 0xA0A3,
- 29265 - 11905: 0xA0A4,
- 29266 - 11905: 0xEBBA,
- 29267 - 11905: 0xA0A5,
- 29268 - 11905: 0xA0A6,
- 29269 - 11905: 0xA0A7,
- 29270 - 11905: 0xEBBB,
- 29271 - 11905: 0xA0A8,
- 29272 - 11905: 0xA0A9,
- 29273 - 11905: 0xD1C0,
- 29274 - 11905: 0xA0AA,
- 29275 - 11905: 0xC5A3,
- 29276 - 11905: 0xA0AB,
- 29277 - 11905: 0xEAF2,
- 29278 - 11905: 0xA0AC,
- 29279 - 11905: 0xC4B2,
- 29280 - 11905: 0xA0AD,
- 29281 - 11905: 0xC4B5,
- 29282 - 11905: 0xC0CE,
- 29283 - 11905: 0xA0AE,
- 29284 - 11905: 0xA0AF,
- 29285 - 11905: 0xA0B0,
- 29286 - 11905: 0xEAF3,
- 29287 - 11905: 0xC4C1,
- 29288 - 11905: 0xA0B1,
- 29289 - 11905: 0xCEEF,
- 29290 - 11905: 0xA0B2,
- 29291 - 11905: 0xA0B3,
- 29292 - 11905: 0xA0B4,
- 29293 - 11905: 0xA0B5,
- 29294 - 11905: 0xEAF0,
- 29295 - 11905: 0xEAF4,
- 29296 - 11905: 0xA0B6,
- 29297 - 11905: 0xA0B7,
- 29298 - 11905: 0xC9FC,
- 29299 - 11905: 0xA0B8,
- 29300 - 11905: 0xA0B9,
- 29301 - 11905: 0xC7A3,
- 29302 - 11905: 0xA0BA,
- 29303 - 11905: 0xA0BB,
- 29304 - 11905: 0xA0BC,
- 29305 - 11905: 0xCCD8,
- 29306 - 11905: 0xCEFE,
- 29307 - 11905: 0xA0BD,
- 29308 - 11905: 0xA0BE,
- 29309 - 11905: 0xA0BF,
- 29310 - 11905: 0xEAF5,
- 29311 - 11905: 0xEAF6,
- 29312 - 11905: 0xCFAC,
- 29313 - 11905: 0xC0E7,
- 29314 - 11905: 0xA0C0,
- 29315 - 11905: 0xA0C1,
- 29316 - 11905: 0xEAF7,
- 29317 - 11905: 0xA0C2,
- 29318 - 11905: 0xA0C3,
- 29319 - 11905: 0xA0C4,
- 29320 - 11905: 0xA0C5,
- 29321 - 11905: 0xA0C6,
- 29322 - 11905: 0xB6BF,
- 29323 - 11905: 0xEAF8,
- 29324 - 11905: 0xA0C7,
- 29325 - 11905: 0xEAF9,
- 29326 - 11905: 0xA0C8,
- 29327 - 11905: 0xEAFA,
- 29328 - 11905: 0xA0C9,
- 29329 - 11905: 0xA0CA,
- 29330 - 11905: 0xEAFB,
- 29331 - 11905: 0xA0CB,
- 29332 - 11905: 0xA0CC,
- 29333 - 11905: 0xA0CD,
- 29334 - 11905: 0xA0CE,
- 29335 - 11905: 0xA0CF,
- 29336 - 11905: 0xA0D0,
- 29337 - 11905: 0xA0D1,
- 29338 - 11905: 0xA0D2,
- 29339 - 11905: 0xA0D3,
- 29340 - 11905: 0xA0D4,
- 29341 - 11905: 0xA0D5,
- 29342 - 11905: 0xA0D6,
- 29343 - 11905: 0xEAF1,
- 29344 - 11905: 0xA0D7,
- 29345 - 11905: 0xA0D8,
- 29346 - 11905: 0xA0D9,
- 29347 - 11905: 0xA0DA,
- 29348 - 11905: 0xA0DB,
- 29349 - 11905: 0xA0DC,
- 29350 - 11905: 0xA0DD,
- 29351 - 11905: 0xA0DE,
- 29352 - 11905: 0xA0DF,
- 29353 - 11905: 0xA0E0,
- 29354 - 11905: 0xA0E1,
- 29355 - 11905: 0xA0E2,
- 29356 - 11905: 0xC8AE,
- 29357 - 11905: 0xE1EB,
- 29358 - 11905: 0xA0E3,
- 29359 - 11905: 0xB7B8,
- 29360 - 11905: 0xE1EC,
- 29361 - 11905: 0xA0E4,
- 29362 - 11905: 0xA0E5,
- 29363 - 11905: 0xA0E6,
- 29364 - 11905: 0xE1ED,
- 29365 - 11905: 0xA0E7,
- 29366 - 11905: 0xD7B4,
- 29367 - 11905: 0xE1EE,
- 29368 - 11905: 0xE1EF,
- 29369 - 11905: 0xD3CC,
- 29370 - 11905: 0xA0E8,
- 29371 - 11905: 0xA0E9,
- 29372 - 11905: 0xA0EA,
- 29373 - 11905: 0xA0EB,
- 29374 - 11905: 0xA0EC,
- 29375 - 11905: 0xA0ED,
- 29376 - 11905: 0xA0EE,
- 29377 - 11905: 0xE1F1,
- 29378 - 11905: 0xBFF1,
- 29379 - 11905: 0xE1F0,
- 29380 - 11905: 0xB5D2,
- 29381 - 11905: 0xA0EF,
- 29382 - 11905: 0xA0F0,
- 29383 - 11905: 0xA0F1,
- 29384 - 11905: 0xB1B7,
- 29385 - 11905: 0xA0F2,
- 29386 - 11905: 0xA0F3,
- 29387 - 11905: 0xA0F4,
- 29388 - 11905: 0xA0F5,
- 29389 - 11905: 0xE1F3,
- 29390 - 11905: 0xE1F2,
- 29391 - 11905: 0xA0F6,
- 29392 - 11905: 0xBAFC,
- 29393 - 11905: 0xA0F7,
- 29394 - 11905: 0xE1F4,
- 29395 - 11905: 0xA0F8,
- 29396 - 11905: 0xA0F9,
- 29397 - 11905: 0xA0FA,
- 29398 - 11905: 0xA0FB,
- 29399 - 11905: 0xB9B7,
- 29400 - 11905: 0xA0FC,
- 29401 - 11905: 0xBED1,
- 29402 - 11905: 0xA0FD,
- 29403 - 11905: 0xA0FE,
- 29404 - 11905: 0xAA40,
- 29405 - 11905: 0xAA41,
- 29406 - 11905: 0xC4FC,
- 29407 - 11905: 0xAA42,
- 29408 - 11905: 0xBADD,
- 29409 - 11905: 0xBDC6,
- 29410 - 11905: 0xAA43,
- 29411 - 11905: 0xAA44,
- 29412 - 11905: 0xAA45,
- 29413 - 11905: 0xAA46,
- 29414 - 11905: 0xAA47,
- 29415 - 11905: 0xAA48,
- 29416 - 11905: 0xE1F5,
- 29417 - 11905: 0xE1F7,
- 29418 - 11905: 0xAA49,
- 29419 - 11905: 0xAA4A,
- 29420 - 11905: 0xB6C0,
- 29421 - 11905: 0xCFC1,
- 29422 - 11905: 0xCAA8,
- 29423 - 11905: 0xE1F6,
- 29424 - 11905: 0xD5F8,
- 29425 - 11905: 0xD3FC,
- 29426 - 11905: 0xE1F8,
- 29427 - 11905: 0xE1FC,
- 29428 - 11905: 0xE1F9,
- 29429 - 11905: 0xAA4B,
- 29430 - 11905: 0xAA4C,
- 29431 - 11905: 0xE1FA,
- 29432 - 11905: 0xC0EA,
- 29433 - 11905: 0xAA4D,
- 29434 - 11905: 0xE1FE,
- 29435 - 11905: 0xE2A1,
- 29436 - 11905: 0xC0C7,
- 29437 - 11905: 0xAA4E,
- 29438 - 11905: 0xAA4F,
- 29439 - 11905: 0xAA50,
- 29440 - 11905: 0xAA51,
- 29441 - 11905: 0xE1FB,
- 29442 - 11905: 0xAA52,
- 29443 - 11905: 0xE1FD,
- 29444 - 11905: 0xAA53,
- 29445 - 11905: 0xAA54,
- 29446 - 11905: 0xAA55,
- 29447 - 11905: 0xAA56,
- 29448 - 11905: 0xAA57,
- 29449 - 11905: 0xAA58,
- 29450 - 11905: 0xE2A5,
- 29451 - 11905: 0xAA59,
- 29452 - 11905: 0xAA5A,
- 29453 - 11905: 0xAA5B,
- 29454 - 11905: 0xC1D4,
- 29455 - 11905: 0xAA5C,
- 29456 - 11905: 0xAA5D,
- 29457 - 11905: 0xAA5E,
- 29458 - 11905: 0xAA5F,
- 29459 - 11905: 0xE2A3,
- 29460 - 11905: 0xAA60,
- 29461 - 11905: 0xE2A8,
- 29462 - 11905: 0xB2FE,
- 29463 - 11905: 0xE2A2,
- 29464 - 11905: 0xAA61,
- 29465 - 11905: 0xAA62,
- 29466 - 11905: 0xAA63,
- 29467 - 11905: 0xC3CD,
- 29468 - 11905: 0xB2C2,
- 29469 - 11905: 0xE2A7,
- 29470 - 11905: 0xE2A6,
- 29471 - 11905: 0xAA64,
- 29472 - 11905: 0xAA65,
- 29473 - 11905: 0xE2A4,
- 29474 - 11905: 0xE2A9,
- 29475 - 11905: 0xAA66,
- 29476 - 11905: 0xAA67,
- 29477 - 11905: 0xE2AB,
- 29478 - 11905: 0xAA68,
- 29479 - 11905: 0xAA69,
- 29480 - 11905: 0xAA6A,
- 29481 - 11905: 0xD0C9,
- 29482 - 11905: 0xD6ED,
- 29483 - 11905: 0xC3A8,
- 29484 - 11905: 0xE2AC,
- 29485 - 11905: 0xAA6B,
- 29486 - 11905: 0xCFD7,
- 29487 - 11905: 0xAA6C,
- 29488 - 11905: 0xAA6D,
- 29489 - 11905: 0xE2AE,
- 29490 - 11905: 0xAA6E,
- 29491 - 11905: 0xAA6F,
- 29492 - 11905: 0xBAEF,
- 29493 - 11905: 0xAA70,
- 29494 - 11905: 0xAA71,
- 29495 - 11905: 0xE9E0,
- 29496 - 11905: 0xE2AD,
- 29497 - 11905: 0xE2AA,
- 29498 - 11905: 0xAA72,
- 29499 - 11905: 0xAA73,
- 29500 - 11905: 0xAA74,
- 29501 - 11905: 0xAA75,
- 29502 - 11905: 0xBBAB,
- 29503 - 11905: 0xD4B3,
- 29504 - 11905: 0xAA76,
- 29505 - 11905: 0xAA77,
- 29506 - 11905: 0xAA78,
- 29507 - 11905: 0xAA79,
- 29508 - 11905: 0xAA7A,
- 29509 - 11905: 0xAA7B,
- 29510 - 11905: 0xAA7C,
- 29511 - 11905: 0xAA7D,
- 29512 - 11905: 0xAA7E,
- 29513 - 11905: 0xAA80,
- 29514 - 11905: 0xAA81,
- 29515 - 11905: 0xAA82,
- 29516 - 11905: 0xAA83,
- 29517 - 11905: 0xE2B0,
- 29518 - 11905: 0xAA84,
- 29519 - 11905: 0xAA85,
- 29520 - 11905: 0xE2AF,
- 29521 - 11905: 0xAA86,
- 29522 - 11905: 0xE9E1,
- 29523 - 11905: 0xAA87,
- 29524 - 11905: 0xAA88,
- 29525 - 11905: 0xAA89,
- 29526 - 11905: 0xAA8A,
- 29527 - 11905: 0xE2B1,
- 29528 - 11905: 0xAA8B,
- 29529 - 11905: 0xAA8C,
- 29530 - 11905: 0xAA8D,
- 29531 - 11905: 0xAA8E,
- 29532 - 11905: 0xAA8F,
- 29533 - 11905: 0xAA90,
- 29534 - 11905: 0xAA91,
- 29535 - 11905: 0xAA92,
- 29536 - 11905: 0xE2B2,
- 29537 - 11905: 0xAA93,
- 29538 - 11905: 0xAA94,
- 29539 - 11905: 0xAA95,
- 29540 - 11905: 0xAA96,
- 29541 - 11905: 0xAA97,
- 29542 - 11905: 0xAA98,
- 29543 - 11905: 0xAA99,
- 29544 - 11905: 0xAA9A,
- 29545 - 11905: 0xAA9B,
- 29546 - 11905: 0xAA9C,
- 29547 - 11905: 0xAA9D,
- 29548 - 11905: 0xE2B3,
- 29549 - 11905: 0xCCA1,
- 29550 - 11905: 0xAA9E,
- 29551 - 11905: 0xE2B4,
- 29552 - 11905: 0xAA9F,
- 29553 - 11905: 0xAAA0,
- 29554 - 11905: 0xAB40,
- 29555 - 11905: 0xAB41,
- 29556 - 11905: 0xAB42,
- 29557 - 11905: 0xAB43,
- 29558 - 11905: 0xAB44,
- 29559 - 11905: 0xAB45,
- 29560 - 11905: 0xAB46,
- 29561 - 11905: 0xAB47,
- 29562 - 11905: 0xAB48,
- 29563 - 11905: 0xAB49,
- 29564 - 11905: 0xAB4A,
- 29565 - 11905: 0xAB4B,
- 29566 - 11905: 0xE2B5,
- 29567 - 11905: 0xAB4C,
- 29568 - 11905: 0xAB4D,
- 29569 - 11905: 0xAB4E,
- 29570 - 11905: 0xAB4F,
- 29571 - 11905: 0xAB50,
- 29572 - 11905: 0xD0FE,
- 29573 - 11905: 0xAB51,
- 29574 - 11905: 0xAB52,
- 29575 - 11905: 0xC2CA,
- 29576 - 11905: 0xAB53,
- 29577 - 11905: 0xD3F1,
- 29578 - 11905: 0xAB54,
- 29579 - 11905: 0xCDF5,
- 29580 - 11905: 0xAB55,
- 29581 - 11905: 0xAB56,
- 29582 - 11905: 0xE7E0,
- 29583 - 11905: 0xAB57,
- 29584 - 11905: 0xAB58,
- 29585 - 11905: 0xE7E1,
- 29586 - 11905: 0xAB59,
- 29587 - 11905: 0xAB5A,
- 29588 - 11905: 0xAB5B,
- 29589 - 11905: 0xAB5C,
- 29590 - 11905: 0xBEC1,
- 29591 - 11905: 0xAB5D,
- 29592 - 11905: 0xAB5E,
- 29593 - 11905: 0xAB5F,
- 29594 - 11905: 0xAB60,
- 29595 - 11905: 0xC2EA,
- 29596 - 11905: 0xAB61,
- 29597 - 11905: 0xAB62,
- 29598 - 11905: 0xAB63,
- 29599 - 11905: 0xE7E4,
- 29600 - 11905: 0xAB64,
- 29601 - 11905: 0xAB65,
- 29602 - 11905: 0xE7E3,
- 29603 - 11905: 0xAB66,
- 29604 - 11905: 0xAB67,
- 29605 - 11905: 0xAB68,
- 29606 - 11905: 0xAB69,
- 29607 - 11905: 0xAB6A,
- 29608 - 11905: 0xAB6B,
- 29609 - 11905: 0xCDE6,
- 29610 - 11905: 0xAB6C,
- 29611 - 11905: 0xC3B5,
- 29612 - 11905: 0xAB6D,
- 29613 - 11905: 0xAB6E,
- 29614 - 11905: 0xE7E2,
- 29615 - 11905: 0xBBB7,
- 29616 - 11905: 0xCFD6,
- 29617 - 11905: 0xAB6F,
- 29618 - 11905: 0xC1E1,
- 29619 - 11905: 0xE7E9,
- 29620 - 11905: 0xAB70,
- 29621 - 11905: 0xAB71,
- 29622 - 11905: 0xAB72,
- 29623 - 11905: 0xE7E8,
- 29624 - 11905: 0xAB73,
- 29625 - 11905: 0xAB74,
- 29626 - 11905: 0xE7F4,
- 29627 - 11905: 0xB2A3,
- 29628 - 11905: 0xAB75,
- 29629 - 11905: 0xAB76,
- 29630 - 11905: 0xAB77,
- 29631 - 11905: 0xAB78,
- 29632 - 11905: 0xE7EA,
- 29633 - 11905: 0xAB79,
- 29634 - 11905: 0xE7E6,
- 29635 - 11905: 0xAB7A,
- 29636 - 11905: 0xAB7B,
- 29637 - 11905: 0xAB7C,
- 29638 - 11905: 0xAB7D,
- 29639 - 11905: 0xAB7E,
- 29640 - 11905: 0xE7EC,
- 29641 - 11905: 0xE7EB,
- 29642 - 11905: 0xC9BA,
- 29643 - 11905: 0xAB80,
- 29644 - 11905: 0xAB81,
- 29645 - 11905: 0xD5E4,
- 29646 - 11905: 0xAB82,
- 29647 - 11905: 0xE7E5,
- 29648 - 11905: 0xB7A9,
- 29649 - 11905: 0xE7E7,
- 29650 - 11905: 0xAB83,
- 29651 - 11905: 0xAB84,
- 29652 - 11905: 0xAB85,
- 29653 - 11905: 0xAB86,
- 29654 - 11905: 0xAB87,
- 29655 - 11905: 0xAB88,
- 29656 - 11905: 0xAB89,
- 29657 - 11905: 0xE7EE,
- 29658 - 11905: 0xAB8A,
- 29659 - 11905: 0xAB8B,
- 29660 - 11905: 0xAB8C,
- 29661 - 11905: 0xAB8D,
- 29662 - 11905: 0xE7F3,
- 29663 - 11905: 0xAB8E,
- 29664 - 11905: 0xD6E9,
- 29665 - 11905: 0xAB8F,
- 29666 - 11905: 0xAB90,
- 29667 - 11905: 0xAB91,
- 29668 - 11905: 0xAB92,
- 29669 - 11905: 0xE7ED,
- 29670 - 11905: 0xAB93,
- 29671 - 11905: 0xE7F2,
- 29672 - 11905: 0xAB94,
- 29673 - 11905: 0xE7F1,
- 29674 - 11905: 0xAB95,
- 29675 - 11905: 0xAB96,
- 29676 - 11905: 0xAB97,
- 29677 - 11905: 0xB0E0,
- 29678 - 11905: 0xAB98,
- 29679 - 11905: 0xAB99,
- 29680 - 11905: 0xAB9A,
- 29681 - 11905: 0xAB9B,
- 29682 - 11905: 0xE7F5,
- 29683 - 11905: 0xAB9C,
- 29684 - 11905: 0xAB9D,
- 29685 - 11905: 0xAB9E,
- 29686 - 11905: 0xAB9F,
- 29687 - 11905: 0xABA0,
- 29688 - 11905: 0xAC40,
- 29689 - 11905: 0xAC41,
- 29690 - 11905: 0xAC42,
- 29691 - 11905: 0xAC43,
- 29692 - 11905: 0xAC44,
- 29693 - 11905: 0xAC45,
- 29694 - 11905: 0xAC46,
- 29695 - 11905: 0xAC47,
- 29696 - 11905: 0xAC48,
- 29697 - 11905: 0xAC49,
- 29698 - 11905: 0xAC4A,
- 29699 - 11905: 0xC7F2,
- 29700 - 11905: 0xAC4B,
- 29701 - 11905: 0xC0C5,
- 29702 - 11905: 0xC0ED,
- 29703 - 11905: 0xAC4C,
- 29704 - 11905: 0xAC4D,
- 29705 - 11905: 0xC1F0,
- 29706 - 11905: 0xE7F0,
- 29707 - 11905: 0xAC4E,
- 29708 - 11905: 0xAC4F,
- 29709 - 11905: 0xAC50,
- 29710 - 11905: 0xAC51,
- 29711 - 11905: 0xE7F6,
- 29712 - 11905: 0xCBF6,
- 29713 - 11905: 0xAC52,
- 29714 - 11905: 0xAC53,
- 29715 - 11905: 0xAC54,
- 29716 - 11905: 0xAC55,
- 29717 - 11905: 0xAC56,
- 29718 - 11905: 0xAC57,
- 29719 - 11905: 0xAC58,
- 29720 - 11905: 0xAC59,
- 29721 - 11905: 0xAC5A,
- 29722 - 11905: 0xE8A2,
- 29723 - 11905: 0xE8A1,
- 29724 - 11905: 0xAC5B,
- 29725 - 11905: 0xAC5C,
- 29726 - 11905: 0xAC5D,
- 29727 - 11905: 0xAC5E,
- 29728 - 11905: 0xAC5F,
- 29729 - 11905: 0xAC60,
- 29730 - 11905: 0xD7C1,
- 29731 - 11905: 0xAC61,
- 29732 - 11905: 0xAC62,
- 29733 - 11905: 0xE7FA,
- 29734 - 11905: 0xE7F9,
- 29735 - 11905: 0xAC63,
- 29736 - 11905: 0xE7FB,
- 29737 - 11905: 0xAC64,
- 29738 - 11905: 0xE7F7,
- 29739 - 11905: 0xAC65,
- 29740 - 11905: 0xE7FE,
- 29741 - 11905: 0xAC66,
- 29742 - 11905: 0xE7FD,
- 29743 - 11905: 0xAC67,
- 29744 - 11905: 0xE7FC,
- 29745 - 11905: 0xAC68,
- 29746 - 11905: 0xAC69,
- 29747 - 11905: 0xC1D5,
- 29748 - 11905: 0xC7D9,
- 29749 - 11905: 0xC5FD,
- 29750 - 11905: 0xC5C3,
- 29751 - 11905: 0xAC6A,
- 29752 - 11905: 0xAC6B,
- 29753 - 11905: 0xAC6C,
- 29754 - 11905: 0xAC6D,
- 29755 - 11905: 0xAC6E,
- 29756 - 11905: 0xC7ED,
- 29757 - 11905: 0xAC6F,
- 29758 - 11905: 0xAC70,
- 29759 - 11905: 0xAC71,
- 29760 - 11905: 0xAC72,
- 29761 - 11905: 0xE8A3,
- 29762 - 11905: 0xAC73,
- 29763 - 11905: 0xAC74,
- 29764 - 11905: 0xAC75,
- 29765 - 11905: 0xAC76,
- 29766 - 11905: 0xAC77,
- 29767 - 11905: 0xAC78,
- 29768 - 11905: 0xAC79,
- 29769 - 11905: 0xAC7A,
- 29770 - 11905: 0xAC7B,
- 29771 - 11905: 0xAC7C,
- 29772 - 11905: 0xAC7D,
- 29773 - 11905: 0xAC7E,
- 29774 - 11905: 0xAC80,
- 29775 - 11905: 0xAC81,
- 29776 - 11905: 0xAC82,
- 29777 - 11905: 0xAC83,
- 29778 - 11905: 0xAC84,
- 29779 - 11905: 0xAC85,
- 29780 - 11905: 0xAC86,
- 29781 - 11905: 0xE8A6,
- 29782 - 11905: 0xAC87,
- 29783 - 11905: 0xE8A5,
- 29784 - 11905: 0xAC88,
- 29785 - 11905: 0xE8A7,
- 29786 - 11905: 0xBAF7,
- 29787 - 11905: 0xE7F8,
- 29788 - 11905: 0xE8A4,
- 29789 - 11905: 0xAC89,
- 29790 - 11905: 0xC8F0,
- 29791 - 11905: 0xC9AA,
- 29792 - 11905: 0xAC8A,
- 29793 - 11905: 0xAC8B,
- 29794 - 11905: 0xAC8C,
- 29795 - 11905: 0xAC8D,
- 29796 - 11905: 0xAC8E,
- 29797 - 11905: 0xAC8F,
- 29798 - 11905: 0xAC90,
- 29799 - 11905: 0xAC91,
- 29800 - 11905: 0xAC92,
- 29801 - 11905: 0xAC93,
- 29802 - 11905: 0xAC94,
- 29803 - 11905: 0xAC95,
- 29804 - 11905: 0xAC96,
- 29805 - 11905: 0xE8A9,
- 29806 - 11905: 0xAC97,
- 29807 - 11905: 0xAC98,
- 29808 - 11905: 0xB9E5,
- 29809 - 11905: 0xAC99,
- 29810 - 11905: 0xAC9A,
- 29811 - 11905: 0xAC9B,
- 29812 - 11905: 0xAC9C,
- 29813 - 11905: 0xAC9D,
- 29814 - 11905: 0xD1FE,
- 29815 - 11905: 0xE8A8,
- 29816 - 11905: 0xAC9E,
- 29817 - 11905: 0xAC9F,
- 29818 - 11905: 0xACA0,
- 29819 - 11905: 0xAD40,
- 29820 - 11905: 0xAD41,
- 29821 - 11905: 0xAD42,
- 29822 - 11905: 0xE8AA,
- 29823 - 11905: 0xAD43,
- 29824 - 11905: 0xE8AD,
- 29825 - 11905: 0xE8AE,
- 29826 - 11905: 0xAD44,
- 29827 - 11905: 0xC1A7,
- 29828 - 11905: 0xAD45,
- 29829 - 11905: 0xAD46,
- 29830 - 11905: 0xAD47,
- 29831 - 11905: 0xE8AF,
- 29832 - 11905: 0xAD48,
- 29833 - 11905: 0xAD49,
- 29834 - 11905: 0xAD4A,
- 29835 - 11905: 0xE8B0,
- 29836 - 11905: 0xAD4B,
- 29837 - 11905: 0xAD4C,
- 29838 - 11905: 0xE8AC,
- 29839 - 11905: 0xAD4D,
- 29840 - 11905: 0xE8B4,
- 29841 - 11905: 0xAD4E,
- 29842 - 11905: 0xAD4F,
- 29843 - 11905: 0xAD50,
- 29844 - 11905: 0xAD51,
- 29845 - 11905: 0xAD52,
- 29846 - 11905: 0xAD53,
- 29847 - 11905: 0xAD54,
- 29848 - 11905: 0xAD55,
- 29849 - 11905: 0xAD56,
- 29850 - 11905: 0xAD57,
- 29851 - 11905: 0xAD58,
- 29852 - 11905: 0xE8AB,
- 29853 - 11905: 0xAD59,
- 29854 - 11905: 0xE8B1,
- 29855 - 11905: 0xAD5A,
- 29856 - 11905: 0xAD5B,
- 29857 - 11905: 0xAD5C,
- 29858 - 11905: 0xAD5D,
- 29859 - 11905: 0xAD5E,
- 29860 - 11905: 0xAD5F,
- 29861 - 11905: 0xAD60,
- 29862 - 11905: 0xAD61,
- 29863 - 11905: 0xE8B5,
- 29864 - 11905: 0xE8B2,
- 29865 - 11905: 0xE8B3,
- 29866 - 11905: 0xAD62,
- 29867 - 11905: 0xAD63,
- 29868 - 11905: 0xAD64,
- 29869 - 11905: 0xAD65,
- 29870 - 11905: 0xAD66,
- 29871 - 11905: 0xAD67,
- 29872 - 11905: 0xAD68,
- 29873 - 11905: 0xAD69,
- 29874 - 11905: 0xAD6A,
- 29875 - 11905: 0xAD6B,
- 29876 - 11905: 0xAD6C,
- 29877 - 11905: 0xAD6D,
- 29878 - 11905: 0xAD6E,
- 29879 - 11905: 0xAD6F,
- 29880 - 11905: 0xAD70,
- 29881 - 11905: 0xAD71,
- 29882 - 11905: 0xE8B7,
- 29883 - 11905: 0xAD72,
- 29884 - 11905: 0xAD73,
- 29885 - 11905: 0xAD74,
- 29886 - 11905: 0xAD75,
- 29887 - 11905: 0xAD76,
- 29888 - 11905: 0xAD77,
- 29889 - 11905: 0xAD78,
- 29890 - 11905: 0xAD79,
- 29891 - 11905: 0xAD7A,
- 29892 - 11905: 0xAD7B,
- 29893 - 11905: 0xAD7C,
- 29894 - 11905: 0xAD7D,
- 29895 - 11905: 0xAD7E,
- 29896 - 11905: 0xAD80,
- 29897 - 11905: 0xAD81,
- 29898 - 11905: 0xAD82,
- 29899 - 11905: 0xAD83,
- 29900 - 11905: 0xAD84,
- 29901 - 11905: 0xAD85,
- 29902 - 11905: 0xAD86,
- 29903 - 11905: 0xAD87,
- 29904 - 11905: 0xAD88,
- 29905 - 11905: 0xAD89,
- 29906 - 11905: 0xE8B6,
- 29907 - 11905: 0xAD8A,
- 29908 - 11905: 0xAD8B,
- 29909 - 11905: 0xAD8C,
- 29910 - 11905: 0xAD8D,
- 29911 - 11905: 0xAD8E,
- 29912 - 11905: 0xAD8F,
- 29913 - 11905: 0xAD90,
- 29914 - 11905: 0xAD91,
- 29915 - 11905: 0xAD92,
- 29916 - 11905: 0xB9CF,
- 29917 - 11905: 0xAD93,
- 29918 - 11905: 0xF0AC,
- 29919 - 11905: 0xAD94,
- 29920 - 11905: 0xF0AD,
- 29921 - 11905: 0xAD95,
- 29922 - 11905: 0xC6B0,
- 29923 - 11905: 0xB0EA,
- 29924 - 11905: 0xC8BF,
- 29925 - 11905: 0xAD96,
- 29926 - 11905: 0xCDDF,
- 29927 - 11905: 0xAD97,
- 29928 - 11905: 0xAD98,
- 29929 - 11905: 0xAD99,
- 29930 - 11905: 0xAD9A,
- 29931 - 11905: 0xAD9B,
- 29932 - 11905: 0xAD9C,
- 29933 - 11905: 0xAD9D,
- 29934 - 11905: 0xCECD,
- 29935 - 11905: 0xEAB1,
- 29936 - 11905: 0xAD9E,
- 29937 - 11905: 0xAD9F,
- 29938 - 11905: 0xADA0,
- 29939 - 11905: 0xAE40,
- 29940 - 11905: 0xEAB2,
- 29941 - 11905: 0xAE41,
- 29942 - 11905: 0xC6BF,
- 29943 - 11905: 0xB4C9,
- 29944 - 11905: 0xAE42,
- 29945 - 11905: 0xAE43,
- 29946 - 11905: 0xAE44,
- 29947 - 11905: 0xAE45,
- 29948 - 11905: 0xAE46,
- 29949 - 11905: 0xAE47,
- 29950 - 11905: 0xAE48,
- 29951 - 11905: 0xEAB3,
- 29952 - 11905: 0xAE49,
- 29953 - 11905: 0xAE4A,
- 29954 - 11905: 0xAE4B,
- 29955 - 11905: 0xAE4C,
- 29956 - 11905: 0xD5E7,
- 29957 - 11905: 0xAE4D,
- 29958 - 11905: 0xAE4E,
- 29959 - 11905: 0xAE4F,
- 29960 - 11905: 0xAE50,
- 29961 - 11905: 0xAE51,
- 29962 - 11905: 0xAE52,
- 29963 - 11905: 0xAE53,
- 29964 - 11905: 0xAE54,
- 29965 - 11905: 0xDDF9,
- 29966 - 11905: 0xAE55,
- 29967 - 11905: 0xEAB4,
- 29968 - 11905: 0xAE56,
- 29969 - 11905: 0xEAB5,
- 29970 - 11905: 0xAE57,
- 29971 - 11905: 0xEAB6,
- 29972 - 11905: 0xAE58,
- 29973 - 11905: 0xAE59,
- 29974 - 11905: 0xAE5A,
- 29975 - 11905: 0xAE5B,
- 29976 - 11905: 0xB8CA,
- 29977 - 11905: 0xDFB0,
- 29978 - 11905: 0xC9F5,
- 29979 - 11905: 0xAE5C,
- 29980 - 11905: 0xCCF0,
- 29981 - 11905: 0xAE5D,
- 29982 - 11905: 0xAE5E,
- 29983 - 11905: 0xC9FA,
- 29984 - 11905: 0xAE5F,
- 29985 - 11905: 0xAE60,
- 29986 - 11905: 0xAE61,
- 29987 - 11905: 0xAE62,
- 29988 - 11905: 0xAE63,
- 29989 - 11905: 0xC9FB,
- 29990 - 11905: 0xAE64,
- 29991 - 11905: 0xAE65,
- 29992 - 11905: 0xD3C3,
- 29993 - 11905: 0xCBA6,
- 29994 - 11905: 0xAE66,
- 29995 - 11905: 0xB8A6,
- 29996 - 11905: 0xF0AE,
- 29997 - 11905: 0xB1C2,
- 29998 - 11905: 0xAE67,
- 29999 - 11905: 0xE5B8,
- 30000 - 11905: 0xCCEF,
- 30001 - 11905: 0xD3C9,
- 30002 - 11905: 0xBCD7,
- 30003 - 11905: 0xC9EA,
- 30004 - 11905: 0xAE68,
- 30005 - 11905: 0xB5E7,
- 30006 - 11905: 0xAE69,
- 30007 - 11905: 0xC4D0,
- 30008 - 11905: 0xB5E9,
- 30009 - 11905: 0xAE6A,
- 30010 - 11905: 0xEEAE,
- 30011 - 11905: 0xBBAD,
- 30012 - 11905: 0xAE6B,
- 30013 - 11905: 0xAE6C,
- 30014 - 11905: 0xE7DE,
- 30015 - 11905: 0xAE6D,
- 30016 - 11905: 0xEEAF,
- 30017 - 11905: 0xAE6E,
- 30018 - 11905: 0xAE6F,
- 30019 - 11905: 0xAE70,
- 30020 - 11905: 0xAE71,
- 30021 - 11905: 0xB3A9,
- 30022 - 11905: 0xAE72,
- 30023 - 11905: 0xAE73,
- 30024 - 11905: 0xEEB2,
- 30025 - 11905: 0xAE74,
- 30026 - 11905: 0xAE75,
- 30027 - 11905: 0xEEB1,
- 30028 - 11905: 0xBDE7,
- 30029 - 11905: 0xAE76,
- 30030 - 11905: 0xEEB0,
- 30031 - 11905: 0xCEB7,
- 30032 - 11905: 0xAE77,
- 30033 - 11905: 0xAE78,
- 30034 - 11905: 0xAE79,
- 30035 - 11905: 0xAE7A,
- 30036 - 11905: 0xC5CF,
- 30037 - 11905: 0xAE7B,
- 30038 - 11905: 0xAE7C,
- 30039 - 11905: 0xAE7D,
- 30040 - 11905: 0xAE7E,
- 30041 - 11905: 0xC1F4,
- 30042 - 11905: 0xDBCE,
- 30043 - 11905: 0xEEB3,
- 30044 - 11905: 0xD0F3,
- 30045 - 11905: 0xAE80,
- 30046 - 11905: 0xAE81,
- 30047 - 11905: 0xAE82,
- 30048 - 11905: 0xAE83,
- 30049 - 11905: 0xAE84,
- 30050 - 11905: 0xAE85,
- 30051 - 11905: 0xAE86,
- 30052 - 11905: 0xAE87,
- 30053 - 11905: 0xC2D4,
- 30054 - 11905: 0xC6E8,
- 30055 - 11905: 0xAE88,
- 30056 - 11905: 0xAE89,
- 30057 - 11905: 0xAE8A,
- 30058 - 11905: 0xB7AC,
- 30059 - 11905: 0xAE8B,
- 30060 - 11905: 0xAE8C,
- 30061 - 11905: 0xAE8D,
- 30062 - 11905: 0xAE8E,
- 30063 - 11905: 0xAE8F,
- 30064 - 11905: 0xAE90,
- 30065 - 11905: 0xAE91,
- 30066 - 11905: 0xEEB4,
- 30067 - 11905: 0xAE92,
- 30068 - 11905: 0xB3EB,
- 30069 - 11905: 0xAE93,
- 30070 - 11905: 0xAE94,
- 30071 - 11905: 0xAE95,
- 30072 - 11905: 0xBBFB,
- 30073 - 11905: 0xEEB5,
- 30074 - 11905: 0xAE96,
- 30075 - 11905: 0xAE97,
- 30076 - 11905: 0xAE98,
- 30077 - 11905: 0xAE99,
- 30078 - 11905: 0xAE9A,
- 30079 - 11905: 0xE7DC,
- 30080 - 11905: 0xAE9B,
- 30081 - 11905: 0xAE9C,
- 30082 - 11905: 0xAE9D,
- 30083 - 11905: 0xEEB6,
- 30084 - 11905: 0xAE9E,
- 30085 - 11905: 0xAE9F,
- 30086 - 11905: 0xBDAE,
- 30087 - 11905: 0xAEA0,
- 30088 - 11905: 0xAF40,
- 30089 - 11905: 0xAF41,
- 30090 - 11905: 0xAF42,
- 30091 - 11905: 0xF1E2,
- 30092 - 11905: 0xAF43,
- 30093 - 11905: 0xAF44,
- 30094 - 11905: 0xAF45,
- 30095 - 11905: 0xCAE8,
- 30096 - 11905: 0xAF46,
- 30097 - 11905: 0xD2C9,
- 30098 - 11905: 0xF0DA,
- 30099 - 11905: 0xAF47,
- 30100 - 11905: 0xF0DB,
- 30101 - 11905: 0xAF48,
- 30102 - 11905: 0xF0DC,
- 30103 - 11905: 0xC1C6,
- 30104 - 11905: 0xAF49,
- 30105 - 11905: 0xB8ED,
- 30106 - 11905: 0xBECE,
- 30107 - 11905: 0xAF4A,
- 30108 - 11905: 0xAF4B,
- 30109 - 11905: 0xF0DE,
- 30110 - 11905: 0xAF4C,
- 30111 - 11905: 0xC5B1,
- 30112 - 11905: 0xF0DD,
- 30113 - 11905: 0xD1F1,
- 30114 - 11905: 0xAF4D,
- 30115 - 11905: 0xF0E0,
- 30116 - 11905: 0xB0CC,
- 30117 - 11905: 0xBDEA,
- 30118 - 11905: 0xAF4E,
- 30119 - 11905: 0xAF4F,
- 30120 - 11905: 0xAF50,
- 30121 - 11905: 0xAF51,
- 30122 - 11905: 0xAF52,
- 30123 - 11905: 0xD2DF,
- 30124 - 11905: 0xF0DF,
- 30125 - 11905: 0xAF53,
- 30126 - 11905: 0xB4AF,
- 30127 - 11905: 0xB7E8,
- 30128 - 11905: 0xF0E6,
- 30129 - 11905: 0xF0E5,
- 30130 - 11905: 0xC6A3,
- 30131 - 11905: 0xF0E1,
- 30132 - 11905: 0xF0E2,
- 30133 - 11905: 0xB4C3,
- 30134 - 11905: 0xAF54,
- 30135 - 11905: 0xAF55,
- 30136 - 11905: 0xF0E3,
- 30137 - 11905: 0xD5EE,
- 30138 - 11905: 0xAF56,
- 30139 - 11905: 0xAF57,
- 30140 - 11905: 0xCCDB,
- 30141 - 11905: 0xBED2,
- 30142 - 11905: 0xBCB2,
- 30143 - 11905: 0xAF58,
- 30144 - 11905: 0xAF59,
- 30145 - 11905: 0xAF5A,
- 30146 - 11905: 0xF0E8,
- 30147 - 11905: 0xF0E7,
- 30148 - 11905: 0xF0E4,
- 30149 - 11905: 0xB2A1,
- 30150 - 11905: 0xAF5B,
- 30151 - 11905: 0xD6A2,
- 30152 - 11905: 0xD3B8,
- 30153 - 11905: 0xBEB7,
- 30154 - 11905: 0xC8AC,
- 30155 - 11905: 0xAF5C,
- 30156 - 11905: 0xAF5D,
- 30157 - 11905: 0xF0EA,
- 30158 - 11905: 0xAF5E,
- 30159 - 11905: 0xAF5F,
- 30160 - 11905: 0xAF60,
- 30161 - 11905: 0xAF61,
- 30162 - 11905: 0xD1F7,
- 30163 - 11905: 0xAF62,
- 30164 - 11905: 0xD6CC,
- 30165 - 11905: 0xBADB,
- 30166 - 11905: 0xF0E9,
- 30167 - 11905: 0xAF63,
- 30168 - 11905: 0xB6BB,
- 30169 - 11905: 0xAF64,
- 30170 - 11905: 0xAF65,
- 30171 - 11905: 0xCDB4,
- 30172 - 11905: 0xAF66,
- 30173 - 11905: 0xAF67,
- 30174 - 11905: 0xC6A6,
- 30175 - 11905: 0xAF68,
- 30176 - 11905: 0xAF69,
- 30177 - 11905: 0xAF6A,
- 30178 - 11905: 0xC1A1,
- 30179 - 11905: 0xF0EB,
- 30180 - 11905: 0xF0EE,
- 30181 - 11905: 0xAF6B,
- 30182 - 11905: 0xF0ED,
- 30183 - 11905: 0xF0F0,
- 30184 - 11905: 0xF0EC,
- 30185 - 11905: 0xAF6C,
- 30186 - 11905: 0xBBBE,
- 30187 - 11905: 0xF0EF,
- 30188 - 11905: 0xAF6D,
- 30189 - 11905: 0xAF6E,
- 30190 - 11905: 0xAF6F,
- 30191 - 11905: 0xAF70,
- 30192 - 11905: 0xCCB5,
- 30193 - 11905: 0xF0F2,
- 30194 - 11905: 0xAF71,
- 30195 - 11905: 0xAF72,
- 30196 - 11905: 0xB3D5,
- 30197 - 11905: 0xAF73,
- 30198 - 11905: 0xAF74,
- 30199 - 11905: 0xAF75,
- 30200 - 11905: 0xAF76,
- 30201 - 11905: 0xB1D4,
- 30202 - 11905: 0xAF77,
- 30203 - 11905: 0xAF78,
- 30204 - 11905: 0xF0F3,
- 30205 - 11905: 0xAF79,
- 30206 - 11905: 0xAF7A,
- 30207 - 11905: 0xF0F4,
- 30208 - 11905: 0xF0F6,
- 30209 - 11905: 0xB4E1,
- 30210 - 11905: 0xAF7B,
- 30211 - 11905: 0xF0F1,
- 30212 - 11905: 0xAF7C,
- 30213 - 11905: 0xF0F7,
- 30214 - 11905: 0xAF7D,
- 30215 - 11905: 0xAF7E,
- 30216 - 11905: 0xAF80,
- 30217 - 11905: 0xAF81,
- 30218 - 11905: 0xF0FA,
- 30219 - 11905: 0xAF82,
- 30220 - 11905: 0xF0F8,
- 30221 - 11905: 0xAF83,
- 30222 - 11905: 0xAF84,
- 30223 - 11905: 0xAF85,
- 30224 - 11905: 0xF0F5,
- 30225 - 11905: 0xAF86,
- 30226 - 11905: 0xAF87,
- 30227 - 11905: 0xAF88,
- 30228 - 11905: 0xAF89,
- 30229 - 11905: 0xF0FD,
- 30230 - 11905: 0xAF8A,
- 30231 - 11905: 0xF0F9,
- 30232 - 11905: 0xF0FC,
- 30233 - 11905: 0xF0FE,
- 30234 - 11905: 0xAF8B,
- 30235 - 11905: 0xF1A1,
- 30236 - 11905: 0xAF8C,
- 30237 - 11905: 0xAF8D,
- 30238 - 11905: 0xAF8E,
- 30239 - 11905: 0xCEC1,
- 30240 - 11905: 0xF1A4,
- 30241 - 11905: 0xAF8F,
- 30242 - 11905: 0xF1A3,
- 30243 - 11905: 0xAF90,
- 30244 - 11905: 0xC1F6,
- 30245 - 11905: 0xF0FB,
- 30246 - 11905: 0xCADD,
- 30247 - 11905: 0xAF91,
- 30248 - 11905: 0xAF92,
- 30249 - 11905: 0xB4F1,
- 30250 - 11905: 0xB1F1,
- 30251 - 11905: 0xCCB1,
- 30252 - 11905: 0xAF93,
- 30253 - 11905: 0xF1A6,
- 30254 - 11905: 0xAF94,
- 30255 - 11905: 0xAF95,
- 30256 - 11905: 0xF1A7,
- 30257 - 11905: 0xAF96,
- 30258 - 11905: 0xAF97,
- 30259 - 11905: 0xF1AC,
- 30260 - 11905: 0xD5CE,
- 30261 - 11905: 0xF1A9,
- 30262 - 11905: 0xAF98,
- 30263 - 11905: 0xAF99,
- 30264 - 11905: 0xC8B3,
- 30265 - 11905: 0xAF9A,
- 30266 - 11905: 0xAF9B,
- 30267 - 11905: 0xAF9C,
- 30268 - 11905: 0xF1A2,
- 30269 - 11905: 0xAF9D,
- 30270 - 11905: 0xF1AB,
- 30271 - 11905: 0xF1A8,
- 30272 - 11905: 0xF1A5,
- 30273 - 11905: 0xAF9E,
- 30274 - 11905: 0xAF9F,
- 30275 - 11905: 0xF1AA,
- 30276 - 11905: 0xAFA0,
- 30277 - 11905: 0xB040,
- 30278 - 11905: 0xB041,
- 30279 - 11905: 0xB042,
- 30280 - 11905: 0xB043,
- 30281 - 11905: 0xB044,
- 30282 - 11905: 0xB045,
- 30283 - 11905: 0xB046,
- 30284 - 11905: 0xB0A9,
- 30285 - 11905: 0xF1AD,
- 30286 - 11905: 0xB047,
- 30287 - 11905: 0xB048,
- 30288 - 11905: 0xB049,
- 30289 - 11905: 0xB04A,
- 30290 - 11905: 0xB04B,
- 30291 - 11905: 0xB04C,
- 30292 - 11905: 0xF1AF,
- 30293 - 11905: 0xB04D,
- 30294 - 11905: 0xF1B1,
- 30295 - 11905: 0xB04E,
- 30296 - 11905: 0xB04F,
- 30297 - 11905: 0xB050,
- 30298 - 11905: 0xB051,
- 30299 - 11905: 0xB052,
- 30300 - 11905: 0xF1B0,
- 30301 - 11905: 0xB053,
- 30302 - 11905: 0xF1AE,
- 30303 - 11905: 0xB054,
- 30304 - 11905: 0xB055,
- 30305 - 11905: 0xB056,
- 30306 - 11905: 0xB057,
- 30307 - 11905: 0xD1A2,
- 30308 - 11905: 0xB058,
- 30309 - 11905: 0xB059,
- 30310 - 11905: 0xB05A,
- 30311 - 11905: 0xB05B,
- 30312 - 11905: 0xB05C,
- 30313 - 11905: 0xB05D,
- 30314 - 11905: 0xB05E,
- 30315 - 11905: 0xF1B2,
- 30316 - 11905: 0xB05F,
- 30317 - 11905: 0xB060,
- 30318 - 11905: 0xB061,
- 30319 - 11905: 0xF1B3,
- 30320 - 11905: 0xB062,
- 30321 - 11905: 0xB063,
- 30322 - 11905: 0xB064,
- 30323 - 11905: 0xB065,
- 30324 - 11905: 0xB066,
- 30325 - 11905: 0xB067,
- 30326 - 11905: 0xB068,
- 30327 - 11905: 0xB069,
- 30328 - 11905: 0xB9EF,
- 30329 - 11905: 0xB06A,
- 30330 - 11905: 0xB06B,
- 30331 - 11905: 0xB5C7,
- 30332 - 11905: 0xB06C,
- 30333 - 11905: 0xB0D7,
- 30334 - 11905: 0xB0D9,
- 30335 - 11905: 0xB06D,
- 30336 - 11905: 0xB06E,
- 30337 - 11905: 0xB06F,
- 30338 - 11905: 0xD4ED,
- 30339 - 11905: 0xB070,
- 30340 - 11905: 0xB5C4,
- 30341 - 11905: 0xB071,
- 30342 - 11905: 0xBDD4,
- 30343 - 11905: 0xBBCA,
- 30344 - 11905: 0xF0A7,
- 30345 - 11905: 0xB072,
- 30346 - 11905: 0xB073,
- 30347 - 11905: 0xB8DE,
- 30348 - 11905: 0xB074,
- 30349 - 11905: 0xB075,
- 30350 - 11905: 0xF0A8,
- 30351 - 11905: 0xB076,
- 30352 - 11905: 0xB077,
- 30353 - 11905: 0xB0A8,
- 30354 - 11905: 0xB078,
- 30355 - 11905: 0xF0A9,
- 30356 - 11905: 0xB079,
- 30357 - 11905: 0xB07A,
- 30358 - 11905: 0xCDEE,
- 30359 - 11905: 0xB07B,
- 30360 - 11905: 0xB07C,
- 30361 - 11905: 0xF0AA,
- 30362 - 11905: 0xB07D,
- 30363 - 11905: 0xB07E,
- 30364 - 11905: 0xB080,
- 30365 - 11905: 0xB081,
- 30366 - 11905: 0xB082,
- 30367 - 11905: 0xB083,
- 30368 - 11905: 0xB084,
- 30369 - 11905: 0xB085,
- 30370 - 11905: 0xB086,
- 30371 - 11905: 0xB087,
- 30372 - 11905: 0xF0AB,
- 30373 - 11905: 0xB088,
- 30374 - 11905: 0xB089,
- 30375 - 11905: 0xB08A,
- 30376 - 11905: 0xB08B,
- 30377 - 11905: 0xB08C,
- 30378 - 11905: 0xB08D,
- 30379 - 11905: 0xB08E,
- 30380 - 11905: 0xB08F,
- 30381 - 11905: 0xB090,
- 30382 - 11905: 0xC6A4,
- 30383 - 11905: 0xB091,
- 30384 - 11905: 0xB092,
- 30385 - 11905: 0xD6E5,
- 30386 - 11905: 0xF1E4,
- 30387 - 11905: 0xB093,
- 30388 - 11905: 0xF1E5,
- 30389 - 11905: 0xB094,
- 30390 - 11905: 0xB095,
- 30391 - 11905: 0xB096,
- 30392 - 11905: 0xB097,
- 30393 - 11905: 0xB098,
- 30394 - 11905: 0xB099,
- 30395 - 11905: 0xB09A,
- 30396 - 11905: 0xB09B,
- 30397 - 11905: 0xB09C,
- 30398 - 11905: 0xB09D,
- 30399 - 11905: 0xC3F3,
- 30400 - 11905: 0xB09E,
- 30401 - 11905: 0xB09F,
- 30402 - 11905: 0xD3DB,
- 30403 - 11905: 0xB0A0,
- 30404 - 11905: 0xB140,
- 30405 - 11905: 0xD6D1,
- 30406 - 11905: 0xC5E8,
- 30407 - 11905: 0xB141,
- 30408 - 11905: 0xD3AF,
- 30409 - 11905: 0xB142,
- 30410 - 11905: 0xD2E6,
- 30411 - 11905: 0xB143,
- 30412 - 11905: 0xB144,
- 30413 - 11905: 0xEEC1,
- 30414 - 11905: 0xB0BB,
- 30415 - 11905: 0xD5B5,
- 30416 - 11905: 0xD1CE,
- 30417 - 11905: 0xBCE0,
- 30418 - 11905: 0xBAD0,
- 30419 - 11905: 0xB145,
- 30420 - 11905: 0xBFF8,
- 30421 - 11905: 0xB146,
- 30422 - 11905: 0xB8C7,
- 30423 - 11905: 0xB5C1,
- 30424 - 11905: 0xC5CC,
- 30425 - 11905: 0xB147,
- 30426 - 11905: 0xB148,
- 30427 - 11905: 0xCAA2,
- 30428 - 11905: 0xB149,
- 30429 - 11905: 0xB14A,
- 30430 - 11905: 0xB14B,
- 30431 - 11905: 0xC3CB,
- 30432 - 11905: 0xB14C,
- 30433 - 11905: 0xB14D,
- 30434 - 11905: 0xB14E,
- 30435 - 11905: 0xB14F,
- 30436 - 11905: 0xB150,
- 30437 - 11905: 0xEEC2,
- 30438 - 11905: 0xB151,
- 30439 - 11905: 0xB152,
- 30440 - 11905: 0xB153,
- 30441 - 11905: 0xB154,
- 30442 - 11905: 0xB155,
- 30443 - 11905: 0xB156,
- 30444 - 11905: 0xB157,
- 30445 - 11905: 0xB158,
- 30446 - 11905: 0xC4BF,
- 30447 - 11905: 0xB6A2,
- 30448 - 11905: 0xB159,
- 30449 - 11905: 0xEDEC,
- 30450 - 11905: 0xC3A4,
- 30451 - 11905: 0xB15A,
- 30452 - 11905: 0xD6B1,
- 30453 - 11905: 0xB15B,
- 30454 - 11905: 0xB15C,
- 30455 - 11905: 0xB15D,
- 30456 - 11905: 0xCFE0,
- 30457 - 11905: 0xEDEF,
- 30458 - 11905: 0xB15E,
- 30459 - 11905: 0xB15F,
- 30460 - 11905: 0xC5CE,
- 30461 - 11905: 0xB160,
- 30462 - 11905: 0xB6DC,
- 30463 - 11905: 0xB161,
- 30464 - 11905: 0xB162,
- 30465 - 11905: 0xCAA1,
- 30466 - 11905: 0xB163,
- 30467 - 11905: 0xB164,
- 30468 - 11905: 0xEDED,
- 30469 - 11905: 0xB165,
- 30470 - 11905: 0xB166,
- 30471 - 11905: 0xEDF0,
- 30472 - 11905: 0xEDF1,
- 30473 - 11905: 0xC3BC,
- 30474 - 11905: 0xB167,
- 30475 - 11905: 0xBFB4,
- 30476 - 11905: 0xB168,
- 30477 - 11905: 0xEDEE,
- 30478 - 11905: 0xB169,
- 30479 - 11905: 0xB16A,
- 30480 - 11905: 0xB16B,
- 30481 - 11905: 0xB16C,
- 30482 - 11905: 0xB16D,
- 30483 - 11905: 0xB16E,
- 30484 - 11905: 0xB16F,
- 30485 - 11905: 0xB170,
- 30486 - 11905: 0xB171,
- 30487 - 11905: 0xB172,
- 30488 - 11905: 0xB173,
- 30489 - 11905: 0xEDF4,
- 30490 - 11905: 0xEDF2,
- 30491 - 11905: 0xB174,
- 30492 - 11905: 0xB175,
- 30493 - 11905: 0xB176,
- 30494 - 11905: 0xB177,
- 30495 - 11905: 0xD5E6,
- 30496 - 11905: 0xC3DF,
- 30497 - 11905: 0xB178,
- 30498 - 11905: 0xEDF3,
- 30499 - 11905: 0xB179,
- 30500 - 11905: 0xB17A,
- 30501 - 11905: 0xB17B,
- 30502 - 11905: 0xEDF6,
- 30503 - 11905: 0xB17C,
- 30504 - 11905: 0xD5A3,
- 30505 - 11905: 0xD1A3,
- 30506 - 11905: 0xB17D,
- 30507 - 11905: 0xB17E,
- 30508 - 11905: 0xB180,
- 30509 - 11905: 0xEDF5,
- 30510 - 11905: 0xB181,
- 30511 - 11905: 0xC3D0,
- 30512 - 11905: 0xB182,
- 30513 - 11905: 0xB183,
- 30514 - 11905: 0xB184,
- 30515 - 11905: 0xB185,
- 30516 - 11905: 0xB186,
- 30517 - 11905: 0xEDF7,
- 30518 - 11905: 0xBFF4,
- 30519 - 11905: 0xBEEC,
- 30520 - 11905: 0xEDF8,
- 30521 - 11905: 0xB187,
- 30522 - 11905: 0xCCF7,
- 30523 - 11905: 0xB188,
- 30524 - 11905: 0xD1DB,
- 30525 - 11905: 0xB189,
- 30526 - 11905: 0xB18A,
- 30527 - 11905: 0xB18B,
- 30528 - 11905: 0xD7C5,
- 30529 - 11905: 0xD5F6,
- 30530 - 11905: 0xB18C,
- 30531 - 11905: 0xEDFC,
- 30532 - 11905: 0xB18D,
- 30533 - 11905: 0xB18E,
- 30534 - 11905: 0xB18F,
- 30535 - 11905: 0xEDFB,
- 30536 - 11905: 0xB190,
- 30537 - 11905: 0xB191,
- 30538 - 11905: 0xB192,
- 30539 - 11905: 0xB193,
- 30540 - 11905: 0xB194,
- 30541 - 11905: 0xB195,
- 30542 - 11905: 0xB196,
- 30543 - 11905: 0xB197,
- 30544 - 11905: 0xEDF9,
- 30545 - 11905: 0xEDFA,
- 30546 - 11905: 0xB198,
- 30547 - 11905: 0xB199,
- 30548 - 11905: 0xB19A,
- 30549 - 11905: 0xB19B,
- 30550 - 11905: 0xB19C,
- 30551 - 11905: 0xB19D,
- 30552 - 11905: 0xB19E,
- 30553 - 11905: 0xB19F,
- 30554 - 11905: 0xEDFD,
- 30555 - 11905: 0xBEA6,
- 30556 - 11905: 0xB1A0,
- 30557 - 11905: 0xB240,
- 30558 - 11905: 0xB241,
- 30559 - 11905: 0xB242,
- 30560 - 11905: 0xB243,
- 30561 - 11905: 0xCBAF,
- 30562 - 11905: 0xEEA1,
- 30563 - 11905: 0xB6BD,
- 30564 - 11905: 0xB244,
- 30565 - 11905: 0xEEA2,
- 30566 - 11905: 0xC4C0,
- 30567 - 11905: 0xB245,
- 30568 - 11905: 0xEDFE,
- 30569 - 11905: 0xB246,
- 30570 - 11905: 0xB247,
- 30571 - 11905: 0xBDDE,
- 30572 - 11905: 0xB2C7,
- 30573 - 11905: 0xB248,
- 30574 - 11905: 0xB249,
- 30575 - 11905: 0xB24A,
- 30576 - 11905: 0xB24B,
- 30577 - 11905: 0xB24C,
- 30578 - 11905: 0xB24D,
- 30579 - 11905: 0xB24E,
- 30580 - 11905: 0xB24F,
- 30581 - 11905: 0xB250,
- 30582 - 11905: 0xB251,
- 30583 - 11905: 0xB252,
- 30584 - 11905: 0xB253,
- 30585 - 11905: 0xB6C3,
- 30586 - 11905: 0xB254,
- 30587 - 11905: 0xB255,
- 30588 - 11905: 0xB256,
- 30589 - 11905: 0xEEA5,
- 30590 - 11905: 0xD8BA,
- 30591 - 11905: 0xEEA3,
- 30592 - 11905: 0xEEA6,
- 30593 - 11905: 0xB257,
- 30594 - 11905: 0xB258,
- 30595 - 11905: 0xB259,
- 30596 - 11905: 0xC3E9,
- 30597 - 11905: 0xB3F2,
- 30598 - 11905: 0xB25A,
- 30599 - 11905: 0xB25B,
- 30600 - 11905: 0xB25C,
- 30601 - 11905: 0xB25D,
- 30602 - 11905: 0xB25E,
- 30603 - 11905: 0xB25F,
- 30604 - 11905: 0xEEA7,
- 30605 - 11905: 0xEEA4,
- 30606 - 11905: 0xCFB9,
- 30607 - 11905: 0xB260,
- 30608 - 11905: 0xB261,
- 30609 - 11905: 0xEEA8,
- 30610 - 11905: 0xC2F7,
- 30611 - 11905: 0xB262,
- 30612 - 11905: 0xB263,
- 30613 - 11905: 0xB264,
- 30614 - 11905: 0xB265,
- 30615 - 11905: 0xB266,
- 30616 - 11905: 0xB267,
- 30617 - 11905: 0xB268,
- 30618 - 11905: 0xB269,
- 30619 - 11905: 0xB26A,
- 30620 - 11905: 0xB26B,
- 30621 - 11905: 0xB26C,
- 30622 - 11905: 0xB26D,
- 30623 - 11905: 0xEEA9,
- 30624 - 11905: 0xEEAA,
- 30625 - 11905: 0xB26E,
- 30626 - 11905: 0xDEAB,
- 30627 - 11905: 0xB26F,
- 30628 - 11905: 0xB270,
- 30629 - 11905: 0xC6B3,
- 30630 - 11905: 0xB271,
- 30631 - 11905: 0xC7C6,
- 30632 - 11905: 0xB272,
- 30633 - 11905: 0xD6F5,
- 30634 - 11905: 0xB5C9,
- 30635 - 11905: 0xB273,
- 30636 - 11905: 0xCBB2,
- 30637 - 11905: 0xB274,
- 30638 - 11905: 0xB275,
- 30639 - 11905: 0xB276,
- 30640 - 11905: 0xEEAB,
- 30641 - 11905: 0xB277,
- 30642 - 11905: 0xB278,
- 30643 - 11905: 0xCDAB,
- 30644 - 11905: 0xB279,
- 30645 - 11905: 0xEEAC,
- 30646 - 11905: 0xB27A,
- 30647 - 11905: 0xB27B,
- 30648 - 11905: 0xB27C,
- 30649 - 11905: 0xB27D,
- 30650 - 11905: 0xB27E,
- 30651 - 11905: 0xD5B0,
- 30652 - 11905: 0xB280,
- 30653 - 11905: 0xEEAD,
- 30654 - 11905: 0xB281,
- 30655 - 11905: 0xF6C4,
- 30656 - 11905: 0xB282,
- 30657 - 11905: 0xB283,
- 30658 - 11905: 0xB284,
- 30659 - 11905: 0xB285,
- 30660 - 11905: 0xB286,
- 30661 - 11905: 0xB287,
- 30662 - 11905: 0xB288,
- 30663 - 11905: 0xB289,
- 30664 - 11905: 0xB28A,
- 30665 - 11905: 0xB28B,
- 30666 - 11905: 0xB28C,
- 30667 - 11905: 0xB28D,
- 30668 - 11905: 0xB28E,
- 30669 - 11905: 0xDBC7,
- 30670 - 11905: 0xB28F,
- 30671 - 11905: 0xB290,
- 30672 - 11905: 0xB291,
- 30673 - 11905: 0xB292,
- 30674 - 11905: 0xB293,
- 30675 - 11905: 0xB294,
- 30676 - 11905: 0xB295,
- 30677 - 11905: 0xB296,
- 30678 - 11905: 0xB297,
- 30679 - 11905: 0xB4A3,
- 30680 - 11905: 0xB298,
- 30681 - 11905: 0xB299,
- 30682 - 11905: 0xB29A,
- 30683 - 11905: 0xC3AC,
- 30684 - 11905: 0xF1E6,
- 30685 - 11905: 0xB29B,
- 30686 - 11905: 0xB29C,
- 30687 - 11905: 0xB29D,
- 30688 - 11905: 0xB29E,
- 30689 - 11905: 0xB29F,
- 30690 - 11905: 0xCAB8,
- 30691 - 11905: 0xD2D3,
- 30692 - 11905: 0xB2A0,
- 30693 - 11905: 0xD6AA,
- 30694 - 11905: 0xB340,
- 30695 - 11905: 0xEFF2,
- 30696 - 11905: 0xB341,
- 30697 - 11905: 0xBED8,
- 30698 - 11905: 0xB342,
- 30699 - 11905: 0xBDC3,
- 30700 - 11905: 0xEFF3,
- 30701 - 11905: 0xB6CC,
- 30702 - 11905: 0xB0AB,
- 30703 - 11905: 0xB343,
- 30704 - 11905: 0xB344,
- 30705 - 11905: 0xB345,
- 30706 - 11905: 0xB346,
- 30707 - 11905: 0xCAAF,
- 30708 - 11905: 0xB347,
- 30709 - 11905: 0xB348,
- 30710 - 11905: 0xEDB6,
- 30711 - 11905: 0xB349,
- 30712 - 11905: 0xEDB7,
- 30713 - 11905: 0xB34A,
- 30714 - 11905: 0xB34B,
- 30715 - 11905: 0xB34C,
- 30716 - 11905: 0xB34D,
- 30717 - 11905: 0xCEF9,
- 30718 - 11905: 0xB7AF,
- 30719 - 11905: 0xBFF3,
- 30720 - 11905: 0xEDB8,
- 30721 - 11905: 0xC2EB,
- 30722 - 11905: 0xC9B0,
- 30723 - 11905: 0xB34E,
- 30724 - 11905: 0xB34F,
- 30725 - 11905: 0xB350,
- 30726 - 11905: 0xB351,
- 30727 - 11905: 0xB352,
- 30728 - 11905: 0xB353,
- 30729 - 11905: 0xEDB9,
- 30730 - 11905: 0xB354,
- 30731 - 11905: 0xB355,
- 30732 - 11905: 0xC6F6,
- 30733 - 11905: 0xBFB3,
- 30734 - 11905: 0xB356,
- 30735 - 11905: 0xB357,
- 30736 - 11905: 0xB358,
- 30737 - 11905: 0xEDBC,
- 30738 - 11905: 0xC5F8,
- 30739 - 11905: 0xB359,
- 30740 - 11905: 0xD1D0,
- 30741 - 11905: 0xB35A,
- 30742 - 11905: 0xD7A9,
- 30743 - 11905: 0xEDBA,
- 30744 - 11905: 0xEDBB,
- 30745 - 11905: 0xB35B,
- 30746 - 11905: 0xD1E2,
- 30747 - 11905: 0xB35C,
- 30748 - 11905: 0xEDBF,
- 30749 - 11905: 0xEDC0,
- 30750 - 11905: 0xB35D,
- 30751 - 11905: 0xEDC4,
- 30752 - 11905: 0xB35E,
- 30753 - 11905: 0xB35F,
- 30754 - 11905: 0xB360,
- 30755 - 11905: 0xEDC8,
- 30756 - 11905: 0xB361,
- 30757 - 11905: 0xEDC6,
- 30758 - 11905: 0xEDCE,
- 30759 - 11905: 0xD5E8,
- 30760 - 11905: 0xB362,
- 30761 - 11905: 0xEDC9,
- 30762 - 11905: 0xB363,
- 30763 - 11905: 0xB364,
- 30764 - 11905: 0xEDC7,
- 30765 - 11905: 0xEDBE,
- 30766 - 11905: 0xB365,
- 30767 - 11905: 0xB366,
- 30768 - 11905: 0xC5E9,
- 30769 - 11905: 0xB367,
- 30770 - 11905: 0xB368,
- 30771 - 11905: 0xB369,
- 30772 - 11905: 0xC6C6,
- 30773 - 11905: 0xB36A,
- 30774 - 11905: 0xB36B,
- 30775 - 11905: 0xC9E9,
- 30776 - 11905: 0xD4D2,
- 30777 - 11905: 0xEDC1,
- 30778 - 11905: 0xEDC2,
- 30779 - 11905: 0xEDC3,
- 30780 - 11905: 0xEDC5,
- 30781 - 11905: 0xB36C,
- 30782 - 11905: 0xC0F9,
- 30783 - 11905: 0xB36D,
- 30784 - 11905: 0xB4A1,
- 30785 - 11905: 0xB36E,
- 30786 - 11905: 0xB36F,
- 30787 - 11905: 0xB370,
- 30788 - 11905: 0xB371,
- 30789 - 11905: 0xB9E8,
- 30790 - 11905: 0xB372,
- 30791 - 11905: 0xEDD0,
- 30792 - 11905: 0xB373,
- 30793 - 11905: 0xB374,
- 30794 - 11905: 0xB375,
- 30795 - 11905: 0xB376,
- 30796 - 11905: 0xEDD1,
- 30797 - 11905: 0xB377,
- 30798 - 11905: 0xEDCA,
- 30799 - 11905: 0xB378,
- 30800 - 11905: 0xEDCF,
- 30801 - 11905: 0xB379,
- 30802 - 11905: 0xCEF8,
- 30803 - 11905: 0xB37A,
- 30804 - 11905: 0xB37B,
- 30805 - 11905: 0xCBB6,
- 30806 - 11905: 0xEDCC,
- 30807 - 11905: 0xEDCD,
- 30808 - 11905: 0xB37C,
- 30809 - 11905: 0xB37D,
- 30810 - 11905: 0xB37E,
- 30811 - 11905: 0xB380,
- 30812 - 11905: 0xB381,
- 30813 - 11905: 0xCFF5,
- 30814 - 11905: 0xB382,
- 30815 - 11905: 0xB383,
- 30816 - 11905: 0xB384,
- 30817 - 11905: 0xB385,
- 30818 - 11905: 0xB386,
- 30819 - 11905: 0xB387,
- 30820 - 11905: 0xB388,
- 30821 - 11905: 0xB389,
- 30822 - 11905: 0xB38A,
- 30823 - 11905: 0xB38B,
- 30824 - 11905: 0xB38C,
- 30825 - 11905: 0xB38D,
- 30826 - 11905: 0xEDD2,
- 30827 - 11905: 0xC1F2,
- 30828 - 11905: 0xD3B2,
- 30829 - 11905: 0xEDCB,
- 30830 - 11905: 0xC8B7,
- 30831 - 11905: 0xB38E,
- 30832 - 11905: 0xB38F,
- 30833 - 11905: 0xB390,
- 30834 - 11905: 0xB391,
- 30835 - 11905: 0xB392,
- 30836 - 11905: 0xB393,
- 30837 - 11905: 0xB394,
- 30838 - 11905: 0xB395,
- 30839 - 11905: 0xBCEF,
- 30840 - 11905: 0xB396,
- 30841 - 11905: 0xB397,
- 30842 - 11905: 0xB398,
- 30843 - 11905: 0xB399,
- 30844 - 11905: 0xC5F0,
- 30845 - 11905: 0xB39A,
- 30846 - 11905: 0xB39B,
- 30847 - 11905: 0xB39C,
- 30848 - 11905: 0xB39D,
- 30849 - 11905: 0xB39E,
- 30850 - 11905: 0xB39F,
- 30851 - 11905: 0xB3A0,
- 30852 - 11905: 0xB440,
- 30853 - 11905: 0xB441,
- 30854 - 11905: 0xB442,
- 30855 - 11905: 0xEDD6,
- 30856 - 11905: 0xB443,
- 30857 - 11905: 0xB5EF,
- 30858 - 11905: 0xB444,
- 30859 - 11905: 0xB445,
- 30860 - 11905: 0xC2B5,
- 30861 - 11905: 0xB0AD,
- 30862 - 11905: 0xCBE9,
- 30863 - 11905: 0xB446,
- 30864 - 11905: 0xB447,
- 30865 - 11905: 0xB1AE,
- 30866 - 11905: 0xB448,
- 30867 - 11905: 0xEDD4,
- 30868 - 11905: 0xB449,
- 30869 - 11905: 0xB44A,
- 30870 - 11905: 0xB44B,
- 30871 - 11905: 0xCDEB,
- 30872 - 11905: 0xB5E2,
- 30873 - 11905: 0xB44C,
- 30874 - 11905: 0xEDD5,
- 30875 - 11905: 0xEDD3,
- 30876 - 11905: 0xEDD7,
- 30877 - 11905: 0xB44D,
- 30878 - 11905: 0xB44E,
- 30879 - 11905: 0xB5FA,
- 30880 - 11905: 0xB44F,
- 30881 - 11905: 0xEDD8,
- 30882 - 11905: 0xB450,
- 30883 - 11905: 0xEDD9,
- 30884 - 11905: 0xB451,
- 30885 - 11905: 0xEDDC,
- 30886 - 11905: 0xB452,
- 30887 - 11905: 0xB1CC,
- 30888 - 11905: 0xB453,
- 30889 - 11905: 0xB454,
- 30890 - 11905: 0xB455,
- 30891 - 11905: 0xB456,
- 30892 - 11905: 0xB457,
- 30893 - 11905: 0xB458,
- 30894 - 11905: 0xB459,
- 30895 - 11905: 0xB45A,
- 30896 - 11905: 0xC5F6,
- 30897 - 11905: 0xBCEE,
- 30898 - 11905: 0xEDDA,
- 30899 - 11905: 0xCCBC,
- 30900 - 11905: 0xB2EA,
- 30901 - 11905: 0xB45B,
- 30902 - 11905: 0xB45C,
- 30903 - 11905: 0xB45D,
- 30904 - 11905: 0xB45E,
- 30905 - 11905: 0xEDDB,
- 30906 - 11905: 0xB45F,
- 30907 - 11905: 0xB460,
- 30908 - 11905: 0xB461,
- 30909 - 11905: 0xB462,
- 30910 - 11905: 0xC4EB,
- 30911 - 11905: 0xB463,
- 30912 - 11905: 0xB464,
- 30913 - 11905: 0xB4C5,
- 30914 - 11905: 0xB465,
- 30915 - 11905: 0xB466,
- 30916 - 11905: 0xB467,
- 30917 - 11905: 0xB0F5,
- 30918 - 11905: 0xB468,
- 30919 - 11905: 0xB469,
- 30920 - 11905: 0xB46A,
- 30921 - 11905: 0xEDDF,
- 30922 - 11905: 0xC0DA,
- 30923 - 11905: 0xB4E8,
- 30924 - 11905: 0xB46B,
- 30925 - 11905: 0xB46C,
- 30926 - 11905: 0xB46D,
- 30927 - 11905: 0xB46E,
- 30928 - 11905: 0xC5CD,
- 30929 - 11905: 0xB46F,
- 30930 - 11905: 0xB470,
- 30931 - 11905: 0xB471,
- 30932 - 11905: 0xEDDD,
- 30933 - 11905: 0xBFC4,
- 30934 - 11905: 0xB472,
- 30935 - 11905: 0xB473,
- 30936 - 11905: 0xB474,
- 30937 - 11905: 0xEDDE,
- 30938 - 11905: 0xB475,
- 30939 - 11905: 0xB476,
- 30940 - 11905: 0xB477,
- 30941 - 11905: 0xB478,
- 30942 - 11905: 0xB479,
- 30943 - 11905: 0xB47A,
- 30944 - 11905: 0xB47B,
- 30945 - 11905: 0xB47C,
- 30946 - 11905: 0xB47D,
- 30947 - 11905: 0xB47E,
- 30948 - 11905: 0xB480,
- 30949 - 11905: 0xB481,
- 30950 - 11905: 0xB482,
- 30951 - 11905: 0xB483,
- 30952 - 11905: 0xC4A5,
- 30953 - 11905: 0xB484,
- 30954 - 11905: 0xB485,
- 30955 - 11905: 0xB486,
- 30956 - 11905: 0xEDE0,
- 30957 - 11905: 0xB487,
- 30958 - 11905: 0xB488,
- 30959 - 11905: 0xB489,
- 30960 - 11905: 0xB48A,
- 30961 - 11905: 0xB48B,
- 30962 - 11905: 0xEDE1,
- 30963 - 11905: 0xB48C,
- 30964 - 11905: 0xEDE3,
- 30965 - 11905: 0xB48D,
- 30966 - 11905: 0xB48E,
- 30967 - 11905: 0xC1D7,
- 30968 - 11905: 0xB48F,
- 30969 - 11905: 0xB490,
- 30970 - 11905: 0xBBC7,
- 30971 - 11905: 0xB491,
- 30972 - 11905: 0xB492,
- 30973 - 11905: 0xB493,
- 30974 - 11905: 0xB494,
- 30975 - 11905: 0xB495,
- 30976 - 11905: 0xB496,
- 30977 - 11905: 0xBDB8,
- 30978 - 11905: 0xB497,
- 30979 - 11905: 0xB498,
- 30980 - 11905: 0xB499,
- 30981 - 11905: 0xEDE2,
- 30982 - 11905: 0xB49A,
- 30983 - 11905: 0xB49B,
- 30984 - 11905: 0xB49C,
- 30985 - 11905: 0xB49D,
- 30986 - 11905: 0xB49E,
- 30987 - 11905: 0xB49F,
- 30988 - 11905: 0xB4A0,
- 30989 - 11905: 0xB540,
- 30990 - 11905: 0xB541,
- 30991 - 11905: 0xB542,
- 30992 - 11905: 0xB543,
- 30993 - 11905: 0xB544,
- 30994 - 11905: 0xB545,
- 30995 - 11905: 0xEDE4,
- 30996 - 11905: 0xB546,
- 30997 - 11905: 0xB547,
- 30998 - 11905: 0xB548,
- 30999 - 11905: 0xB549,
- 31000 - 11905: 0xB54A,
- 31001 - 11905: 0xB54B,
- 31002 - 11905: 0xB54C,
- 31003 - 11905: 0xB54D,
- 31004 - 11905: 0xB54E,
- 31005 - 11905: 0xB54F,
- 31006 - 11905: 0xEDE6,
- 31007 - 11905: 0xB550,
- 31008 - 11905: 0xB551,
- 31009 - 11905: 0xB552,
- 31010 - 11905: 0xB553,
- 31011 - 11905: 0xB554,
- 31012 - 11905: 0xEDE5,
- 31013 - 11905: 0xB555,
- 31014 - 11905: 0xB556,
- 31015 - 11905: 0xB557,
- 31016 - 11905: 0xB558,
- 31017 - 11905: 0xB559,
- 31018 - 11905: 0xB55A,
- 31019 - 11905: 0xB55B,
- 31020 - 11905: 0xB55C,
- 31021 - 11905: 0xB55D,
- 31022 - 11905: 0xB55E,
- 31023 - 11905: 0xB55F,
- 31024 - 11905: 0xB560,
- 31025 - 11905: 0xB561,
- 31026 - 11905: 0xB562,
- 31027 - 11905: 0xB563,
- 31028 - 11905: 0xEDE7,
- 31029 - 11905: 0xB564,
- 31030 - 11905: 0xB565,
- 31031 - 11905: 0xB566,
- 31032 - 11905: 0xB567,
- 31033 - 11905: 0xB568,
- 31034 - 11905: 0xCABE,
- 31035 - 11905: 0xECEA,
- 31036 - 11905: 0xC0F1,
- 31037 - 11905: 0xB569,
- 31038 - 11905: 0xC9E7,
- 31039 - 11905: 0xB56A,
- 31040 - 11905: 0xECEB,
- 31041 - 11905: 0xC6EE,
- 31042 - 11905: 0xB56B,
- 31043 - 11905: 0xB56C,
- 31044 - 11905: 0xB56D,
- 31045 - 11905: 0xB56E,
- 31046 - 11905: 0xECEC,
- 31047 - 11905: 0xB56F,
- 31048 - 11905: 0xC6ED,
- 31049 - 11905: 0xECED,
- 31050 - 11905: 0xB570,
- 31051 - 11905: 0xB571,
- 31052 - 11905: 0xB572,
- 31053 - 11905: 0xB573,
- 31054 - 11905: 0xB574,
- 31055 - 11905: 0xB575,
- 31056 - 11905: 0xB576,
- 31057 - 11905: 0xB577,
- 31058 - 11905: 0xB578,
- 31059 - 11905: 0xECF0,
- 31060 - 11905: 0xB579,
- 31061 - 11905: 0xB57A,
- 31062 - 11905: 0xD7E6,
- 31063 - 11905: 0xECF3,
- 31064 - 11905: 0xB57B,
- 31065 - 11905: 0xB57C,
- 31066 - 11905: 0xECF1,
- 31067 - 11905: 0xECEE,
- 31068 - 11905: 0xECEF,
- 31069 - 11905: 0xD7A3,
- 31070 - 11905: 0xC9F1,
- 31071 - 11905: 0xCBEE,
- 31072 - 11905: 0xECF4,
- 31073 - 11905: 0xB57D,
- 31074 - 11905: 0xECF2,
- 31075 - 11905: 0xB57E,
- 31076 - 11905: 0xB580,
- 31077 - 11905: 0xCFE9,
- 31078 - 11905: 0xB581,
- 31079 - 11905: 0xECF6,
- 31080 - 11905: 0xC6B1,
- 31081 - 11905: 0xB582,
- 31082 - 11905: 0xB583,
- 31083 - 11905: 0xB584,
- 31084 - 11905: 0xB585,
- 31085 - 11905: 0xBCC0,
- 31086 - 11905: 0xB586,
- 31087 - 11905: 0xECF5,
- 31088 - 11905: 0xB587,
- 31089 - 11905: 0xB588,
- 31090 - 11905: 0xB589,
- 31091 - 11905: 0xB58A,
- 31092 - 11905: 0xB58B,
- 31093 - 11905: 0xB58C,
- 31094 - 11905: 0xB58D,
- 31095 - 11905: 0xB5BB,
- 31096 - 11905: 0xBBF6,
- 31097 - 11905: 0xB58E,
- 31098 - 11905: 0xECF7,
- 31099 - 11905: 0xB58F,
- 31100 - 11905: 0xB590,
- 31101 - 11905: 0xB591,
- 31102 - 11905: 0xB592,
- 31103 - 11905: 0xB593,
- 31104 - 11905: 0xD9F7,
- 31105 - 11905: 0xBDFB,
- 31106 - 11905: 0xB594,
- 31107 - 11905: 0xB595,
- 31108 - 11905: 0xC2BB,
- 31109 - 11905: 0xECF8,
- 31110 - 11905: 0xB596,
- 31111 - 11905: 0xB597,
- 31112 - 11905: 0xB598,
- 31113 - 11905: 0xB599,
- 31114 - 11905: 0xECF9,
- 31115 - 11905: 0xB59A,
- 31116 - 11905: 0xB59B,
- 31117 - 11905: 0xB59C,
- 31118 - 11905: 0xB59D,
- 31119 - 11905: 0xB8A3,
- 31120 - 11905: 0xB59E,
- 31121 - 11905: 0xB59F,
- 31122 - 11905: 0xB5A0,
- 31123 - 11905: 0xB640,
- 31124 - 11905: 0xB641,
- 31125 - 11905: 0xB642,
- 31126 - 11905: 0xB643,
- 31127 - 11905: 0xB644,
- 31128 - 11905: 0xB645,
- 31129 - 11905: 0xB646,
- 31130 - 11905: 0xECFA,
- 31131 - 11905: 0xB647,
- 31132 - 11905: 0xB648,
- 31133 - 11905: 0xB649,
- 31134 - 11905: 0xB64A,
- 31135 - 11905: 0xB64B,
- 31136 - 11905: 0xB64C,
- 31137 - 11905: 0xB64D,
- 31138 - 11905: 0xB64E,
- 31139 - 11905: 0xB64F,
- 31140 - 11905: 0xB650,
- 31141 - 11905: 0xB651,
- 31142 - 11905: 0xB652,
- 31143 - 11905: 0xECFB,
- 31144 - 11905: 0xB653,
- 31145 - 11905: 0xB654,
- 31146 - 11905: 0xB655,
- 31147 - 11905: 0xB656,
- 31148 - 11905: 0xB657,
- 31149 - 11905: 0xB658,
- 31150 - 11905: 0xB659,
- 31151 - 11905: 0xB65A,
- 31152 - 11905: 0xB65B,
- 31153 - 11905: 0xB65C,
- 31154 - 11905: 0xB65D,
- 31155 - 11905: 0xECFC,
- 31156 - 11905: 0xB65E,
- 31157 - 11905: 0xB65F,
- 31158 - 11905: 0xB660,
- 31159 - 11905: 0xB661,
- 31160 - 11905: 0xB662,
- 31161 - 11905: 0xD3ED,
- 31162 - 11905: 0xD8AE,
- 31163 - 11905: 0xC0EB,
- 31164 - 11905: 0xB663,
- 31165 - 11905: 0xC7DD,
- 31166 - 11905: 0xBACC,
- 31167 - 11905: 0xB664,
- 31168 - 11905: 0xD0E3,
- 31169 - 11905: 0xCBBD,
- 31170 - 11905: 0xB665,
- 31171 - 11905: 0xCDBA,
- 31172 - 11905: 0xB666,
- 31173 - 11905: 0xB667,
- 31174 - 11905: 0xB8D1,
- 31175 - 11905: 0xB668,
- 31176 - 11905: 0xB669,
- 31177 - 11905: 0xB1FC,
- 31178 - 11905: 0xB66A,
- 31179 - 11905: 0xC7EF,
- 31180 - 11905: 0xB66B,
- 31181 - 11905: 0xD6D6,
- 31182 - 11905: 0xB66C,
- 31183 - 11905: 0xB66D,
- 31184 - 11905: 0xB66E,
- 31185 - 11905: 0xBFC6,
- 31186 - 11905: 0xC3EB,
- 31187 - 11905: 0xB66F,
- 31188 - 11905: 0xB670,
- 31189 - 11905: 0xEFF5,
- 31190 - 11905: 0xB671,
- 31191 - 11905: 0xB672,
- 31192 - 11905: 0xC3D8,
- 31193 - 11905: 0xB673,
- 31194 - 11905: 0xB674,
- 31195 - 11905: 0xB675,
- 31196 - 11905: 0xB676,
- 31197 - 11905: 0xB677,
- 31198 - 11905: 0xB678,
- 31199 - 11905: 0xD7E2,
- 31200 - 11905: 0xB679,
- 31201 - 11905: 0xB67A,
- 31202 - 11905: 0xB67B,
- 31203 - 11905: 0xEFF7,
- 31204 - 11905: 0xB3D3,
- 31205 - 11905: 0xB67C,
- 31206 - 11905: 0xC7D8,
- 31207 - 11905: 0xD1ED,
- 31208 - 11905: 0xB67D,
- 31209 - 11905: 0xD6C8,
- 31210 - 11905: 0xB67E,
- 31211 - 11905: 0xEFF8,
- 31212 - 11905: 0xB680,
- 31213 - 11905: 0xEFF6,
- 31214 - 11905: 0xB681,
- 31215 - 11905: 0xBBFD,
- 31216 - 11905: 0xB3C6,
- 31217 - 11905: 0xB682,
- 31218 - 11905: 0xB683,
- 31219 - 11905: 0xB684,
- 31220 - 11905: 0xB685,
- 31221 - 11905: 0xB686,
- 31222 - 11905: 0xB687,
- 31223 - 11905: 0xB688,
- 31224 - 11905: 0xBDD5,
- 31225 - 11905: 0xB689,
- 31226 - 11905: 0xB68A,
- 31227 - 11905: 0xD2C6,
- 31228 - 11905: 0xB68B,
- 31229 - 11905: 0xBBE0,
- 31230 - 11905: 0xB68C,
- 31231 - 11905: 0xB68D,
- 31232 - 11905: 0xCFA1,
- 31233 - 11905: 0xB68E,
- 31234 - 11905: 0xEFFC,
- 31235 - 11905: 0xEFFB,
- 31236 - 11905: 0xB68F,
- 31237 - 11905: 0xB690,
- 31238 - 11905: 0xEFF9,
- 31239 - 11905: 0xB691,
- 31240 - 11905: 0xB692,
- 31241 - 11905: 0xB693,
- 31242 - 11905: 0xB694,
- 31243 - 11905: 0xB3CC,
- 31244 - 11905: 0xB695,
- 31245 - 11905: 0xC9D4,
- 31246 - 11905: 0xCBB0,
- 31247 - 11905: 0xB696,
- 31248 - 11905: 0xB697,
- 31249 - 11905: 0xB698,
- 31250 - 11905: 0xB699,
- 31251 - 11905: 0xB69A,
- 31252 - 11905: 0xEFFE,
- 31253 - 11905: 0xB69B,
- 31254 - 11905: 0xB69C,
- 31255 - 11905: 0xB0DE,
- 31256 - 11905: 0xB69D,
- 31257 - 11905: 0xB69E,
- 31258 - 11905: 0xD6C9,
- 31259 - 11905: 0xB69F,
- 31260 - 11905: 0xB6A0,
- 31261 - 11905: 0xB740,
- 31262 - 11905: 0xEFFD,
- 31263 - 11905: 0xB741,
- 31264 - 11905: 0xB3ED,
- 31265 - 11905: 0xB742,
- 31266 - 11905: 0xB743,
- 31267 - 11905: 0xF6D5,
- 31268 - 11905: 0xB744,
- 31269 - 11905: 0xB745,
- 31270 - 11905: 0xB746,
- 31271 - 11905: 0xB747,
- 31272 - 11905: 0xB748,
- 31273 - 11905: 0xB749,
- 31274 - 11905: 0xB74A,
- 31275 - 11905: 0xB74B,
- 31276 - 11905: 0xB74C,
- 31277 - 11905: 0xB74D,
- 31278 - 11905: 0xB74E,
- 31279 - 11905: 0xB74F,
- 31280 - 11905: 0xB750,
- 31281 - 11905: 0xB751,
- 31282 - 11905: 0xB752,
- 31283 - 11905: 0xCEC8,
- 31284 - 11905: 0xB753,
- 31285 - 11905: 0xB754,
- 31286 - 11905: 0xB755,
- 31287 - 11905: 0xF0A2,
- 31288 - 11905: 0xB756,
- 31289 - 11905: 0xF0A1,
- 31290 - 11905: 0xB757,
- 31291 - 11905: 0xB5BE,
- 31292 - 11905: 0xBCDA,
- 31293 - 11905: 0xBBFC,
- 31294 - 11905: 0xB758,
- 31295 - 11905: 0xB8E5,
- 31296 - 11905: 0xB759,
- 31297 - 11905: 0xB75A,
- 31298 - 11905: 0xB75B,
- 31299 - 11905: 0xB75C,
- 31300 - 11905: 0xB75D,
- 31301 - 11905: 0xB75E,
- 31302 - 11905: 0xC4C2,
- 31303 - 11905: 0xB75F,
- 31304 - 11905: 0xB760,
- 31305 - 11905: 0xB761,
- 31306 - 11905: 0xB762,
- 31307 - 11905: 0xB763,
- 31308 - 11905: 0xB764,
- 31309 - 11905: 0xB765,
- 31310 - 11905: 0xB766,
- 31311 - 11905: 0xB767,
- 31312 - 11905: 0xB768,
- 31313 - 11905: 0xF0A3,
- 31314 - 11905: 0xB769,
- 31315 - 11905: 0xB76A,
- 31316 - 11905: 0xB76B,
- 31317 - 11905: 0xB76C,
- 31318 - 11905: 0xB76D,
- 31319 - 11905: 0xCBEB,
- 31320 - 11905: 0xB76E,
- 31321 - 11905: 0xB76F,
- 31322 - 11905: 0xB770,
- 31323 - 11905: 0xB771,
- 31324 - 11905: 0xB772,
- 31325 - 11905: 0xB773,
- 31326 - 11905: 0xB774,
- 31327 - 11905: 0xB775,
- 31328 - 11905: 0xB776,
- 31329 - 11905: 0xB777,
- 31330 - 11905: 0xB778,
- 31331 - 11905: 0xB779,
- 31332 - 11905: 0xB77A,
- 31333 - 11905: 0xB77B,
- 31334 - 11905: 0xB77C,
- 31335 - 11905: 0xB77D,
- 31336 - 11905: 0xB77E,
- 31337 - 11905: 0xB780,
- 31338 - 11905: 0xB781,
- 31339 - 11905: 0xB782,
- 31340 - 11905: 0xB783,
- 31341 - 11905: 0xB784,
- 31342 - 11905: 0xB785,
- 31343 - 11905: 0xB786,
- 31344 - 11905: 0xF0A6,
- 31345 - 11905: 0xB787,
- 31346 - 11905: 0xB788,
- 31347 - 11905: 0xB789,
- 31348 - 11905: 0xD1A8,
- 31349 - 11905: 0xB78A,
- 31350 - 11905: 0xBEBF,
- 31351 - 11905: 0xC7EE,
- 31352 - 11905: 0xF1B6,
- 31353 - 11905: 0xF1B7,
- 31354 - 11905: 0xBFD5,
- 31355 - 11905: 0xB78B,
- 31356 - 11905: 0xB78C,
- 31357 - 11905: 0xB78D,
- 31358 - 11905: 0xB78E,
- 31359 - 11905: 0xB4A9,
- 31360 - 11905: 0xF1B8,
- 31361 - 11905: 0xCDBB,
- 31362 - 11905: 0xB78F,
- 31363 - 11905: 0xC7D4,
- 31364 - 11905: 0xD5AD,
- 31365 - 11905: 0xB790,
- 31366 - 11905: 0xF1B9,
- 31367 - 11905: 0xB791,
- 31368 - 11905: 0xF1BA,
- 31369 - 11905: 0xB792,
- 31370 - 11905: 0xB793,
- 31371 - 11905: 0xB794,
- 31372 - 11905: 0xB795,
- 31373 - 11905: 0xC7CF,
- 31374 - 11905: 0xB796,
- 31375 - 11905: 0xB797,
- 31376 - 11905: 0xB798,
- 31377 - 11905: 0xD2A4,
- 31378 - 11905: 0xD6CF,
- 31379 - 11905: 0xB799,
- 31380 - 11905: 0xB79A,
- 31381 - 11905: 0xF1BB,
- 31382 - 11905: 0xBDD1,
- 31383 - 11905: 0xB4B0,
- 31384 - 11905: 0xBEBD,
- 31385 - 11905: 0xB79B,
- 31386 - 11905: 0xB79C,
- 31387 - 11905: 0xB79D,
- 31388 - 11905: 0xB4DC,
- 31389 - 11905: 0xCED1,
- 31390 - 11905: 0xB79E,
- 31391 - 11905: 0xBFDF,
- 31392 - 11905: 0xF1BD,
- 31393 - 11905: 0xB79F,
- 31394 - 11905: 0xB7A0,
- 31395 - 11905: 0xB840,
- 31396 - 11905: 0xB841,
- 31397 - 11905: 0xBFFA,
- 31398 - 11905: 0xF1BC,
- 31399 - 11905: 0xB842,
- 31400 - 11905: 0xF1BF,
- 31401 - 11905: 0xB843,
- 31402 - 11905: 0xB844,
- 31403 - 11905: 0xB845,
- 31404 - 11905: 0xF1BE,
- 31405 - 11905: 0xF1C0,
- 31406 - 11905: 0xB846,
- 31407 - 11905: 0xB847,
- 31408 - 11905: 0xB848,
- 31409 - 11905: 0xB849,
- 31410 - 11905: 0xB84A,
- 31411 - 11905: 0xF1C1,
- 31412 - 11905: 0xB84B,
- 31413 - 11905: 0xB84C,
- 31414 - 11905: 0xB84D,
- 31415 - 11905: 0xB84E,
- 31416 - 11905: 0xB84F,
- 31417 - 11905: 0xB850,
- 31418 - 11905: 0xB851,
- 31419 - 11905: 0xB852,
- 31420 - 11905: 0xB853,
- 31421 - 11905: 0xB854,
- 31422 - 11905: 0xB855,
- 31423 - 11905: 0xC1FE,
- 31424 - 11905: 0xB856,
- 31425 - 11905: 0xB857,
- 31426 - 11905: 0xB858,
- 31427 - 11905: 0xB859,
- 31428 - 11905: 0xB85A,
- 31429 - 11905: 0xB85B,
- 31430 - 11905: 0xB85C,
- 31431 - 11905: 0xB85D,
- 31432 - 11905: 0xB85E,
- 31433 - 11905: 0xB85F,
- 31434 - 11905: 0xB860,
- 31435 - 11905: 0xC1A2,
- 31436 - 11905: 0xB861,
- 31437 - 11905: 0xB862,
- 31438 - 11905: 0xB863,
- 31439 - 11905: 0xB864,
- 31440 - 11905: 0xB865,
- 31441 - 11905: 0xB866,
- 31442 - 11905: 0xB867,
- 31443 - 11905: 0xB868,
- 31444 - 11905: 0xB869,
- 31445 - 11905: 0xB86A,
- 31446 - 11905: 0xCAFA,
- 31447 - 11905: 0xB86B,
- 31448 - 11905: 0xB86C,
- 31449 - 11905: 0xD5BE,
- 31450 - 11905: 0xB86D,
- 31451 - 11905: 0xB86E,
- 31452 - 11905: 0xB86F,
- 31453 - 11905: 0xB870,
- 31454 - 11905: 0xBEBA,
- 31455 - 11905: 0xBEB9,
- 31456 - 11905: 0xD5C2,
- 31457 - 11905: 0xB871,
- 31458 - 11905: 0xB872,
- 31459 - 11905: 0xBFA2,
- 31460 - 11905: 0xB873,
- 31461 - 11905: 0xCDAF,
- 31462 - 11905: 0xF1B5,
- 31463 - 11905: 0xB874,
- 31464 - 11905: 0xB875,
- 31465 - 11905: 0xB876,
- 31466 - 11905: 0xB877,
- 31467 - 11905: 0xB878,
- 31468 - 11905: 0xB879,
- 31469 - 11905: 0xBDDF,
- 31470 - 11905: 0xB87A,
- 31471 - 11905: 0xB6CB,
- 31472 - 11905: 0xB87B,
- 31473 - 11905: 0xB87C,
- 31474 - 11905: 0xB87D,
- 31475 - 11905: 0xB87E,
- 31476 - 11905: 0xB880,
- 31477 - 11905: 0xB881,
- 31478 - 11905: 0xB882,
- 31479 - 11905: 0xB883,
- 31480 - 11905: 0xB884,
- 31481 - 11905: 0xD6F1,
- 31482 - 11905: 0xF3C3,
- 31483 - 11905: 0xB885,
- 31484 - 11905: 0xB886,
- 31485 - 11905: 0xF3C4,
- 31486 - 11905: 0xB887,
- 31487 - 11905: 0xB8CD,
- 31488 - 11905: 0xB888,
- 31489 - 11905: 0xB889,
- 31490 - 11905: 0xB88A,
- 31491 - 11905: 0xF3C6,
- 31492 - 11905: 0xF3C7,
- 31493 - 11905: 0xB88B,
- 31494 - 11905: 0xB0CA,
- 31495 - 11905: 0xB88C,
- 31496 - 11905: 0xF3C5,
- 31497 - 11905: 0xB88D,
- 31498 - 11905: 0xF3C9,
- 31499 - 11905: 0xCBF1,
- 31500 - 11905: 0xB88E,
- 31501 - 11905: 0xB88F,
- 31502 - 11905: 0xB890,
- 31503 - 11905: 0xF3CB,
- 31504 - 11905: 0xB891,
- 31505 - 11905: 0xD0A6,
- 31506 - 11905: 0xB892,
- 31507 - 11905: 0xB893,
- 31508 - 11905: 0xB1CA,
- 31509 - 11905: 0xF3C8,
- 31510 - 11905: 0xB894,
- 31511 - 11905: 0xB895,
- 31512 - 11905: 0xB896,
- 31513 - 11905: 0xF3CF,
- 31514 - 11905: 0xB897,
- 31515 - 11905: 0xB5D1,
- 31516 - 11905: 0xB898,
- 31517 - 11905: 0xB899,
- 31518 - 11905: 0xF3D7,
- 31519 - 11905: 0xB89A,
- 31520 - 11905: 0xF3D2,
- 31521 - 11905: 0xB89B,
- 31522 - 11905: 0xB89C,
- 31523 - 11905: 0xB89D,
- 31524 - 11905: 0xF3D4,
- 31525 - 11905: 0xF3D3,
- 31526 - 11905: 0xB7FB,
- 31527 - 11905: 0xB89E,
- 31528 - 11905: 0xB1BF,
- 31529 - 11905: 0xB89F,
- 31530 - 11905: 0xF3CE,
- 31531 - 11905: 0xF3CA,
- 31532 - 11905: 0xB5DA,
- 31533 - 11905: 0xB8A0,
- 31534 - 11905: 0xF3D0,
- 31535 - 11905: 0xB940,
- 31536 - 11905: 0xB941,
- 31537 - 11905: 0xF3D1,
- 31538 - 11905: 0xB942,
- 31539 - 11905: 0xF3D5,
- 31540 - 11905: 0xB943,
- 31541 - 11905: 0xB944,
- 31542 - 11905: 0xB945,
- 31543 - 11905: 0xB946,
- 31544 - 11905: 0xF3CD,
- 31545 - 11905: 0xB947,
- 31546 - 11905: 0xBCE3,
- 31547 - 11905: 0xB948,
- 31548 - 11905: 0xC1FD,
- 31549 - 11905: 0xB949,
- 31550 - 11905: 0xF3D6,
- 31551 - 11905: 0xB94A,
- 31552 - 11905: 0xB94B,
- 31553 - 11905: 0xB94C,
- 31554 - 11905: 0xB94D,
- 31555 - 11905: 0xB94E,
- 31556 - 11905: 0xB94F,
- 31557 - 11905: 0xF3DA,
- 31558 - 11905: 0xB950,
- 31559 - 11905: 0xF3CC,
- 31560 - 11905: 0xB951,
- 31561 - 11905: 0xB5C8,
- 31562 - 11905: 0xB952,
- 31563 - 11905: 0xBDEE,
- 31564 - 11905: 0xF3DC,
- 31565 - 11905: 0xB953,
- 31566 - 11905: 0xB954,
- 31567 - 11905: 0xB7A4,
- 31568 - 11905: 0xBFF0,
- 31569 - 11905: 0xD6FE,
- 31570 - 11905: 0xCDB2,
- 31571 - 11905: 0xB955,
- 31572 - 11905: 0xB4F0,
- 31573 - 11905: 0xB956,
- 31574 - 11905: 0xB2DF,
- 31575 - 11905: 0xB957,
- 31576 - 11905: 0xF3D8,
- 31577 - 11905: 0xB958,
- 31578 - 11905: 0xF3D9,
- 31579 - 11905: 0xC9B8,
- 31580 - 11905: 0xB959,
- 31581 - 11905: 0xF3DD,
- 31582 - 11905: 0xB95A,
- 31583 - 11905: 0xB95B,
- 31584 - 11905: 0xF3DE,
- 31585 - 11905: 0xB95C,
- 31586 - 11905: 0xF3E1,
- 31587 - 11905: 0xB95D,
- 31588 - 11905: 0xB95E,
- 31589 - 11905: 0xB95F,
- 31590 - 11905: 0xB960,
- 31591 - 11905: 0xB961,
- 31592 - 11905: 0xB962,
- 31593 - 11905: 0xB963,
- 31594 - 11905: 0xB964,
- 31595 - 11905: 0xB965,
- 31596 - 11905: 0xB966,
- 31597 - 11905: 0xB967,
- 31598 - 11905: 0xF3DF,
- 31599 - 11905: 0xB968,
- 31600 - 11905: 0xB969,
- 31601 - 11905: 0xF3E3,
- 31602 - 11905: 0xF3E2,
- 31603 - 11905: 0xB96A,
- 31604 - 11905: 0xB96B,
- 31605 - 11905: 0xF3DB,
- 31606 - 11905: 0xB96C,
- 31607 - 11905: 0xBFEA,
- 31608 - 11905: 0xB96D,
- 31609 - 11905: 0xB3EF,
- 31610 - 11905: 0xB96E,
- 31611 - 11905: 0xF3E0,
- 31612 - 11905: 0xB96F,
- 31613 - 11905: 0xB970,
- 31614 - 11905: 0xC7A9,
- 31615 - 11905: 0xB971,
- 31616 - 11905: 0xBCF2,
- 31617 - 11905: 0xB972,
- 31618 - 11905: 0xB973,
- 31619 - 11905: 0xB974,
- 31620 - 11905: 0xB975,
- 31621 - 11905: 0xF3EB,
- 31622 - 11905: 0xB976,
- 31623 - 11905: 0xB977,
- 31624 - 11905: 0xB978,
- 31625 - 11905: 0xB979,
- 31626 - 11905: 0xB97A,
- 31627 - 11905: 0xB97B,
- 31628 - 11905: 0xB97C,
- 31629 - 11905: 0xB9BF,
- 31630 - 11905: 0xB97D,
- 31631 - 11905: 0xB97E,
- 31632 - 11905: 0xF3E4,
- 31633 - 11905: 0xB980,
- 31634 - 11905: 0xB981,
- 31635 - 11905: 0xB982,
- 31636 - 11905: 0xB2AD,
- 31637 - 11905: 0xBBFE,
- 31638 - 11905: 0xB983,
- 31639 - 11905: 0xCBE3,
- 31640 - 11905: 0xB984,
- 31641 - 11905: 0xB985,
- 31642 - 11905: 0xB986,
- 31643 - 11905: 0xB987,
- 31644 - 11905: 0xF3ED,
- 31645 - 11905: 0xF3E9,
- 31646 - 11905: 0xB988,
- 31647 - 11905: 0xB989,
- 31648 - 11905: 0xB98A,
- 31649 - 11905: 0xB9DC,
- 31650 - 11905: 0xF3EE,
- 31651 - 11905: 0xB98B,
- 31652 - 11905: 0xB98C,
- 31653 - 11905: 0xB98D,
- 31654 - 11905: 0xF3E5,
- 31655 - 11905: 0xF3E6,
- 31656 - 11905: 0xF3EA,
- 31657 - 11905: 0xC2E1,
- 31658 - 11905: 0xF3EC,
- 31659 - 11905: 0xF3EF,
- 31660 - 11905: 0xF3E8,
- 31661 - 11905: 0xBCFD,
- 31662 - 11905: 0xB98E,
- 31663 - 11905: 0xB98F,
- 31664 - 11905: 0xB990,
- 31665 - 11905: 0xCFE4,
- 31666 - 11905: 0xB991,
- 31667 - 11905: 0xB992,
- 31668 - 11905: 0xF3F0,
- 31669 - 11905: 0xB993,
- 31670 - 11905: 0xB994,
- 31671 - 11905: 0xB995,
- 31672 - 11905: 0xF3E7,
- 31673 - 11905: 0xB996,
- 31674 - 11905: 0xB997,
- 31675 - 11905: 0xB998,
- 31676 - 11905: 0xB999,
- 31677 - 11905: 0xB99A,
- 31678 - 11905: 0xB99B,
- 31679 - 11905: 0xB99C,
- 31680 - 11905: 0xB99D,
- 31681 - 11905: 0xF3F2,
- 31682 - 11905: 0xB99E,
- 31683 - 11905: 0xB99F,
- 31684 - 11905: 0xB9A0,
- 31685 - 11905: 0xBA40,
- 31686 - 11905: 0xD7AD,
- 31687 - 11905: 0xC6AA,
- 31688 - 11905: 0xBA41,
- 31689 - 11905: 0xBA42,
- 31690 - 11905: 0xBA43,
- 31691 - 11905: 0xBA44,
- 31692 - 11905: 0xF3F3,
- 31693 - 11905: 0xBA45,
- 31694 - 11905: 0xBA46,
- 31695 - 11905: 0xBA47,
- 31696 - 11905: 0xBA48,
- 31697 - 11905: 0xF3F1,
- 31698 - 11905: 0xBA49,
- 31699 - 11905: 0xC2A8,
- 31700 - 11905: 0xBA4A,
- 31701 - 11905: 0xBA4B,
- 31702 - 11905: 0xBA4C,
- 31703 - 11905: 0xBA4D,
- 31704 - 11905: 0xBA4E,
- 31705 - 11905: 0xB8DD,
- 31706 - 11905: 0xF3F5,
- 31707 - 11905: 0xBA4F,
- 31708 - 11905: 0xBA50,
- 31709 - 11905: 0xF3F4,
- 31710 - 11905: 0xBA51,
- 31711 - 11905: 0xBA52,
- 31712 - 11905: 0xBA53,
- 31713 - 11905: 0xB4DB,
- 31714 - 11905: 0xBA54,
- 31715 - 11905: 0xBA55,
- 31716 - 11905: 0xBA56,
- 31717 - 11905: 0xF3F6,
- 31718 - 11905: 0xF3F7,
- 31719 - 11905: 0xBA57,
- 31720 - 11905: 0xBA58,
- 31721 - 11905: 0xBA59,
- 31722 - 11905: 0xF3F8,
- 31723 - 11905: 0xBA5A,
- 31724 - 11905: 0xBA5B,
- 31725 - 11905: 0xBA5C,
- 31726 - 11905: 0xC0BA,
- 31727 - 11905: 0xBA5D,
- 31728 - 11905: 0xBA5E,
- 31729 - 11905: 0xC0E9,
- 31730 - 11905: 0xBA5F,
- 31731 - 11905: 0xBA60,
- 31732 - 11905: 0xBA61,
- 31733 - 11905: 0xBA62,
- 31734 - 11905: 0xBA63,
- 31735 - 11905: 0xC5F1,
- 31736 - 11905: 0xBA64,
- 31737 - 11905: 0xBA65,
- 31738 - 11905: 0xBA66,
- 31739 - 11905: 0xBA67,
- 31740 - 11905: 0xF3FB,
- 31741 - 11905: 0xBA68,
- 31742 - 11905: 0xF3FA,
- 31743 - 11905: 0xBA69,
- 31744 - 11905: 0xBA6A,
- 31745 - 11905: 0xBA6B,
- 31746 - 11905: 0xBA6C,
- 31747 - 11905: 0xBA6D,
- 31748 - 11905: 0xBA6E,
- 31749 - 11905: 0xBA6F,
- 31750 - 11905: 0xBA70,
- 31751 - 11905: 0xB4D8,
- 31752 - 11905: 0xBA71,
- 31753 - 11905: 0xBA72,
- 31754 - 11905: 0xBA73,
- 31755 - 11905: 0xF3FE,
- 31756 - 11905: 0xF3F9,
- 31757 - 11905: 0xBA74,
- 31758 - 11905: 0xBA75,
- 31759 - 11905: 0xF3FC,
- 31760 - 11905: 0xBA76,
- 31761 - 11905: 0xBA77,
- 31762 - 11905: 0xBA78,
- 31763 - 11905: 0xBA79,
- 31764 - 11905: 0xBA7A,
- 31765 - 11905: 0xBA7B,
- 31766 - 11905: 0xF3FD,
- 31767 - 11905: 0xBA7C,
- 31768 - 11905: 0xBA7D,
- 31769 - 11905: 0xBA7E,
- 31770 - 11905: 0xBA80,
- 31771 - 11905: 0xBA81,
- 31772 - 11905: 0xBA82,
- 31773 - 11905: 0xBA83,
- 31774 - 11905: 0xBA84,
- 31775 - 11905: 0xF4A1,
- 31776 - 11905: 0xBA85,
- 31777 - 11905: 0xBA86,
- 31778 - 11905: 0xBA87,
- 31779 - 11905: 0xBA88,
- 31780 - 11905: 0xBA89,
- 31781 - 11905: 0xBA8A,
- 31782 - 11905: 0xF4A3,
- 31783 - 11905: 0xBBC9,
- 31784 - 11905: 0xBA8B,
- 31785 - 11905: 0xBA8C,
- 31786 - 11905: 0xF4A2,
- 31787 - 11905: 0xBA8D,
- 31788 - 11905: 0xBA8E,
- 31789 - 11905: 0xBA8F,
- 31790 - 11905: 0xBA90,
- 31791 - 11905: 0xBA91,
- 31792 - 11905: 0xBA92,
- 31793 - 11905: 0xBA93,
- 31794 - 11905: 0xBA94,
- 31795 - 11905: 0xBA95,
- 31796 - 11905: 0xBA96,
- 31797 - 11905: 0xBA97,
- 31798 - 11905: 0xBA98,
- 31799 - 11905: 0xBA99,
- 31800 - 11905: 0xF4A4,
- 31801 - 11905: 0xBA9A,
- 31802 - 11905: 0xBA9B,
- 31803 - 11905: 0xBA9C,
- 31804 - 11905: 0xBA9D,
- 31805 - 11905: 0xBA9E,
- 31806 - 11905: 0xBA9F,
- 31807 - 11905: 0xB2BE,
- 31808 - 11905: 0xF4A6,
- 31809 - 11905: 0xF4A5,
- 31810 - 11905: 0xBAA0,
- 31811 - 11905: 0xBB40,
- 31812 - 11905: 0xBB41,
- 31813 - 11905: 0xBB42,
- 31814 - 11905: 0xBB43,
- 31815 - 11905: 0xBB44,
- 31816 - 11905: 0xBB45,
- 31817 - 11905: 0xBB46,
- 31818 - 11905: 0xBB47,
- 31819 - 11905: 0xBB48,
- 31820 - 11905: 0xBB49,
- 31821 - 11905: 0xBCAE,
- 31822 - 11905: 0xBB4A,
- 31823 - 11905: 0xBB4B,
- 31824 - 11905: 0xBB4C,
- 31825 - 11905: 0xBB4D,
- 31826 - 11905: 0xBB4E,
- 31827 - 11905: 0xBB4F,
- 31828 - 11905: 0xBB50,
- 31829 - 11905: 0xBB51,
- 31830 - 11905: 0xBB52,
- 31831 - 11905: 0xBB53,
- 31832 - 11905: 0xBB54,
- 31833 - 11905: 0xBB55,
- 31834 - 11905: 0xBB56,
- 31835 - 11905: 0xBB57,
- 31836 - 11905: 0xBB58,
- 31837 - 11905: 0xBB59,
- 31838 - 11905: 0xBB5A,
- 31839 - 11905: 0xBB5B,
- 31840 - 11905: 0xBB5C,
- 31841 - 11905: 0xBB5D,
- 31842 - 11905: 0xBB5E,
- 31843 - 11905: 0xBB5F,
- 31844 - 11905: 0xBB60,
- 31845 - 11905: 0xBB61,
- 31846 - 11905: 0xBB62,
- 31847 - 11905: 0xBB63,
- 31848 - 11905: 0xBB64,
- 31849 - 11905: 0xBB65,
- 31850 - 11905: 0xBB66,
- 31851 - 11905: 0xBB67,
- 31852 - 11905: 0xBB68,
- 31853 - 11905: 0xBB69,
- 31854 - 11905: 0xBB6A,
- 31855 - 11905: 0xBB6B,
- 31856 - 11905: 0xBB6C,
- 31857 - 11905: 0xBB6D,
- 31858 - 11905: 0xBB6E,
- 31859 - 11905: 0xC3D7,
- 31860 - 11905: 0xD9E1,
- 31861 - 11905: 0xBB6F,
- 31862 - 11905: 0xBB70,
- 31863 - 11905: 0xBB71,
- 31864 - 11905: 0xBB72,
- 31865 - 11905: 0xBB73,
- 31866 - 11905: 0xBB74,
- 31867 - 11905: 0xC0E0,
- 31868 - 11905: 0xF4CC,
- 31869 - 11905: 0xD7D1,
- 31870 - 11905: 0xBB75,
- 31871 - 11905: 0xBB76,
- 31872 - 11905: 0xBB77,
- 31873 - 11905: 0xBB78,
- 31874 - 11905: 0xBB79,
- 31875 - 11905: 0xBB7A,
- 31876 - 11905: 0xBB7B,
- 31877 - 11905: 0xBB7C,
- 31878 - 11905: 0xBB7D,
- 31879 - 11905: 0xBB7E,
- 31880 - 11905: 0xBB80,
- 31881 - 11905: 0xB7DB,
- 31882 - 11905: 0xBB81,
- 31883 - 11905: 0xBB82,
- 31884 - 11905: 0xBB83,
- 31885 - 11905: 0xBB84,
- 31886 - 11905: 0xBB85,
- 31887 - 11905: 0xBB86,
- 31888 - 11905: 0xBB87,
- 31889 - 11905: 0xF4CE,
- 31890 - 11905: 0xC1A3,
- 31891 - 11905: 0xBB88,
- 31892 - 11905: 0xBB89,
- 31893 - 11905: 0xC6C9,
- 31894 - 11905: 0xBB8A,
- 31895 - 11905: 0xB4D6,
- 31896 - 11905: 0xD5B3,
- 31897 - 11905: 0xBB8B,
- 31898 - 11905: 0xBB8C,
- 31899 - 11905: 0xBB8D,
- 31900 - 11905: 0xF4D0,
- 31901 - 11905: 0xF4CF,
- 31902 - 11905: 0xF4D1,
- 31903 - 11905: 0xCBDA,
- 31904 - 11905: 0xBB8E,
- 31905 - 11905: 0xBB8F,
- 31906 - 11905: 0xF4D2,
- 31907 - 11905: 0xBB90,
- 31908 - 11905: 0xD4C1,
- 31909 - 11905: 0xD6E0,
- 31910 - 11905: 0xBB91,
- 31911 - 11905: 0xBB92,
- 31912 - 11905: 0xBB93,
- 31913 - 11905: 0xBB94,
- 31914 - 11905: 0xB7E0,
- 31915 - 11905: 0xBB95,
- 31916 - 11905: 0xBB96,
- 31917 - 11905: 0xBB97,
- 31918 - 11905: 0xC1B8,
- 31919 - 11905: 0xBB98,
- 31920 - 11905: 0xBB99,
- 31921 - 11905: 0xC1BB,
- 31922 - 11905: 0xF4D3,
- 31923 - 11905: 0xBEAC,
- 31924 - 11905: 0xBB9A,
- 31925 - 11905: 0xBB9B,
- 31926 - 11905: 0xBB9C,
- 31927 - 11905: 0xBB9D,
- 31928 - 11905: 0xBB9E,
- 31929 - 11905: 0xB4E2,
- 31930 - 11905: 0xBB9F,
- 31931 - 11905: 0xBBA0,
- 31932 - 11905: 0xF4D4,
- 31933 - 11905: 0xF4D5,
- 31934 - 11905: 0xBEAB,
- 31935 - 11905: 0xBC40,
- 31936 - 11905: 0xBC41,
- 31937 - 11905: 0xF4D6,
- 31938 - 11905: 0xBC42,
- 31939 - 11905: 0xBC43,
- 31940 - 11905: 0xBC44,
- 31941 - 11905: 0xF4DB,
- 31942 - 11905: 0xBC45,
- 31943 - 11905: 0xF4D7,
- 31944 - 11905: 0xF4DA,
- 31945 - 11905: 0xBC46,
- 31946 - 11905: 0xBAFD,
- 31947 - 11905: 0xBC47,
- 31948 - 11905: 0xF4D8,
- 31949 - 11905: 0xF4D9,
- 31950 - 11905: 0xBC48,
- 31951 - 11905: 0xBC49,
- 31952 - 11905: 0xBC4A,
- 31953 - 11905: 0xBC4B,
- 31954 - 11905: 0xBC4C,
- 31955 - 11905: 0xBC4D,
- 31956 - 11905: 0xBC4E,
- 31957 - 11905: 0xB8E2,
- 31958 - 11905: 0xCCC7,
- 31959 - 11905: 0xF4DC,
- 31960 - 11905: 0xBC4F,
- 31961 - 11905: 0xB2DA,
- 31962 - 11905: 0xBC50,
- 31963 - 11905: 0xBC51,
- 31964 - 11905: 0xC3D3,
- 31965 - 11905: 0xBC52,
- 31966 - 11905: 0xBC53,
- 31967 - 11905: 0xD4E3,
- 31968 - 11905: 0xBFB7,
- 31969 - 11905: 0xBC54,
- 31970 - 11905: 0xBC55,
- 31971 - 11905: 0xBC56,
- 31972 - 11905: 0xBC57,
- 31973 - 11905: 0xBC58,
- 31974 - 11905: 0xBC59,
- 31975 - 11905: 0xBC5A,
- 31976 - 11905: 0xF4DD,
- 31977 - 11905: 0xBC5B,
- 31978 - 11905: 0xBC5C,
- 31979 - 11905: 0xBC5D,
- 31980 - 11905: 0xBC5E,
- 31981 - 11905: 0xBC5F,
- 31982 - 11905: 0xBC60,
- 31983 - 11905: 0xC5B4,
- 31984 - 11905: 0xBC61,
- 31985 - 11905: 0xBC62,
- 31986 - 11905: 0xBC63,
- 31987 - 11905: 0xBC64,
- 31988 - 11905: 0xBC65,
- 31989 - 11905: 0xBC66,
- 31990 - 11905: 0xBC67,
- 31991 - 11905: 0xBC68,
- 31992 - 11905: 0xF4E9,
- 31993 - 11905: 0xBC69,
- 31994 - 11905: 0xBC6A,
- 31995 - 11905: 0xCFB5,
- 31996 - 11905: 0xBC6B,
- 31997 - 11905: 0xBC6C,
- 31998 - 11905: 0xBC6D,
- 31999 - 11905: 0xBC6E,
- 32000 - 11905: 0xBC6F,
- 32001 - 11905: 0xBC70,
- 32002 - 11905: 0xBC71,
- 32003 - 11905: 0xBC72,
- 32004 - 11905: 0xBC73,
- 32005 - 11905: 0xBC74,
- 32006 - 11905: 0xBC75,
- 32007 - 11905: 0xBC76,
- 32008 - 11905: 0xBC77,
- 32009 - 11905: 0xBC78,
- 32010 - 11905: 0xCEC9,
- 32011 - 11905: 0xBC79,
- 32012 - 11905: 0xBC7A,
- 32013 - 11905: 0xBC7B,
- 32014 - 11905: 0xBC7C,
- 32015 - 11905: 0xBC7D,
- 32016 - 11905: 0xBC7E,
- 32017 - 11905: 0xBC80,
- 32018 - 11905: 0xBC81,
- 32019 - 11905: 0xBC82,
- 32020 - 11905: 0xBC83,
- 32021 - 11905: 0xBC84,
- 32022 - 11905: 0xBC85,
- 32023 - 11905: 0xBC86,
- 32024 - 11905: 0xBC87,
- 32025 - 11905: 0xBC88,
- 32026 - 11905: 0xBC89,
- 32027 - 11905: 0xBC8A,
- 32028 - 11905: 0xBC8B,
- 32029 - 11905: 0xBC8C,
- 32030 - 11905: 0xBC8D,
- 32031 - 11905: 0xBC8E,
- 32032 - 11905: 0xCBD8,
- 32033 - 11905: 0xBC8F,
- 32034 - 11905: 0xCBF7,
- 32035 - 11905: 0xBC90,
- 32036 - 11905: 0xBC91,
- 32037 - 11905: 0xBC92,
- 32038 - 11905: 0xBC93,
- 32039 - 11905: 0xBDF4,
- 32040 - 11905: 0xBC94,
- 32041 - 11905: 0xBC95,
- 32042 - 11905: 0xBC96,
- 32043 - 11905: 0xD7CF,
- 32044 - 11905: 0xBC97,
- 32045 - 11905: 0xBC98,
- 32046 - 11905: 0xBC99,
- 32047 - 11905: 0xC0DB,
- 32048 - 11905: 0xBC9A,
- 32049 - 11905: 0xBC9B,
- 32050 - 11905: 0xBC9C,
- 32051 - 11905: 0xBC9D,
- 32052 - 11905: 0xBC9E,
- 32053 - 11905: 0xBC9F,
- 32054 - 11905: 0xBCA0,
- 32055 - 11905: 0xBD40,
- 32056 - 11905: 0xBD41,
- 32057 - 11905: 0xBD42,
- 32058 - 11905: 0xBD43,
- 32059 - 11905: 0xBD44,
- 32060 - 11905: 0xBD45,
- 32061 - 11905: 0xBD46,
- 32062 - 11905: 0xBD47,
- 32063 - 11905: 0xBD48,
- 32064 - 11905: 0xBD49,
- 32065 - 11905: 0xBD4A,
- 32066 - 11905: 0xBD4B,
- 32067 - 11905: 0xBD4C,
- 32068 - 11905: 0xBD4D,
- 32069 - 11905: 0xBD4E,
- 32070 - 11905: 0xBD4F,
- 32071 - 11905: 0xBD50,
- 32072 - 11905: 0xBD51,
- 32073 - 11905: 0xBD52,
- 32074 - 11905: 0xBD53,
- 32075 - 11905: 0xBD54,
- 32076 - 11905: 0xBD55,
- 32077 - 11905: 0xBD56,
- 32078 - 11905: 0xBD57,
- 32079 - 11905: 0xBD58,
- 32080 - 11905: 0xBD59,
- 32081 - 11905: 0xBD5A,
- 32082 - 11905: 0xBD5B,
- 32083 - 11905: 0xBD5C,
- 32084 - 11905: 0xBD5D,
- 32085 - 11905: 0xBD5E,
- 32086 - 11905: 0xBD5F,
- 32087 - 11905: 0xBD60,
- 32088 - 11905: 0xBD61,
- 32089 - 11905: 0xBD62,
- 32090 - 11905: 0xBD63,
- 32091 - 11905: 0xBD64,
- 32092 - 11905: 0xBD65,
- 32093 - 11905: 0xBD66,
- 32094 - 11905: 0xBD67,
- 32095 - 11905: 0xBD68,
- 32096 - 11905: 0xBD69,
- 32097 - 11905: 0xBD6A,
- 32098 - 11905: 0xBD6B,
- 32099 - 11905: 0xBD6C,
- 32100 - 11905: 0xBD6D,
- 32101 - 11905: 0xBD6E,
- 32102 - 11905: 0xBD6F,
- 32103 - 11905: 0xBD70,
- 32104 - 11905: 0xBD71,
- 32105 - 11905: 0xBD72,
- 32106 - 11905: 0xBD73,
- 32107 - 11905: 0xBD74,
- 32108 - 11905: 0xBD75,
- 32109 - 11905: 0xBD76,
- 32110 - 11905: 0xD0F5,
- 32111 - 11905: 0xBD77,
- 32112 - 11905: 0xBD78,
- 32113 - 11905: 0xBD79,
- 32114 - 11905: 0xBD7A,
- 32115 - 11905: 0xBD7B,
- 32116 - 11905: 0xBD7C,
- 32117 - 11905: 0xBD7D,
- 32118 - 11905: 0xBD7E,
- 32119 - 11905: 0xF4EA,
- 32120 - 11905: 0xBD80,
- 32121 - 11905: 0xBD81,
- 32122 - 11905: 0xBD82,
- 32123 - 11905: 0xBD83,
- 32124 - 11905: 0xBD84,
- 32125 - 11905: 0xBD85,
- 32126 - 11905: 0xBD86,
- 32127 - 11905: 0xBD87,
- 32128 - 11905: 0xBD88,
- 32129 - 11905: 0xBD89,
- 32130 - 11905: 0xBD8A,
- 32131 - 11905: 0xBD8B,
- 32132 - 11905: 0xBD8C,
- 32133 - 11905: 0xBD8D,
- 32134 - 11905: 0xBD8E,
- 32135 - 11905: 0xBD8F,
- 32136 - 11905: 0xBD90,
- 32137 - 11905: 0xBD91,
- 32138 - 11905: 0xBD92,
- 32139 - 11905: 0xBD93,
- 32140 - 11905: 0xBD94,
- 32141 - 11905: 0xBD95,
- 32142 - 11905: 0xBD96,
- 32143 - 11905: 0xBD97,
- 32144 - 11905: 0xBD98,
- 32145 - 11905: 0xBD99,
- 32146 - 11905: 0xBD9A,
- 32147 - 11905: 0xBD9B,
- 32148 - 11905: 0xBD9C,
- 32149 - 11905: 0xBD9D,
- 32150 - 11905: 0xBD9E,
- 32151 - 11905: 0xBD9F,
- 32152 - 11905: 0xBDA0,
- 32153 - 11905: 0xBE40,
- 32154 - 11905: 0xBE41,
- 32155 - 11905: 0xBE42,
- 32156 - 11905: 0xBE43,
- 32157 - 11905: 0xBE44,
- 32158 - 11905: 0xBE45,
- 32159 - 11905: 0xBE46,
- 32160 - 11905: 0xBE47,
- 32161 - 11905: 0xBE48,
- 32162 - 11905: 0xBE49,
- 32163 - 11905: 0xBE4A,
- 32164 - 11905: 0xBE4B,
- 32165 - 11905: 0xBE4C,
- 32166 - 11905: 0xF4EB,
- 32167 - 11905: 0xBE4D,
- 32168 - 11905: 0xBE4E,
- 32169 - 11905: 0xBE4F,
- 32170 - 11905: 0xBE50,
- 32171 - 11905: 0xBE51,
- 32172 - 11905: 0xBE52,
- 32173 - 11905: 0xBE53,
- 32174 - 11905: 0xF4EC,
- 32175 - 11905: 0xBE54,
- 32176 - 11905: 0xBE55,
- 32177 - 11905: 0xBE56,
- 32178 - 11905: 0xBE57,
- 32179 - 11905: 0xBE58,
- 32180 - 11905: 0xBE59,
- 32181 - 11905: 0xBE5A,
- 32182 - 11905: 0xBE5B,
- 32183 - 11905: 0xBE5C,
- 32184 - 11905: 0xBE5D,
- 32185 - 11905: 0xBE5E,
- 32186 - 11905: 0xBE5F,
- 32187 - 11905: 0xBE60,
- 32188 - 11905: 0xBE61,
- 32189 - 11905: 0xBE62,
- 32190 - 11905: 0xBE63,
- 32191 - 11905: 0xBE64,
- 32192 - 11905: 0xBE65,
- 32193 - 11905: 0xBE66,
- 32194 - 11905: 0xBE67,
- 32195 - 11905: 0xBE68,
- 32196 - 11905: 0xBE69,
- 32197 - 11905: 0xBE6A,
- 32198 - 11905: 0xBE6B,
- 32199 - 11905: 0xBE6C,
- 32200 - 11905: 0xBE6D,
- 32201 - 11905: 0xBE6E,
- 32202 - 11905: 0xBE6F,
- 32203 - 11905: 0xBE70,
- 32204 - 11905: 0xBE71,
- 32205 - 11905: 0xBE72,
- 32206 - 11905: 0xBE73,
- 32207 - 11905: 0xBE74,
- 32208 - 11905: 0xBE75,
- 32209 - 11905: 0xBE76,
- 32210 - 11905: 0xBE77,
- 32211 - 11905: 0xBE78,
- 32212 - 11905: 0xBE79,
- 32213 - 11905: 0xBE7A,
- 32214 - 11905: 0xBE7B,
- 32215 - 11905: 0xBE7C,
- 32216 - 11905: 0xBE7D,
- 32217 - 11905: 0xBE7E,
- 32218 - 11905: 0xBE80,
- 32219 - 11905: 0xBE81,
- 32220 - 11905: 0xBE82,
- 32221 - 11905: 0xBE83,
- 32222 - 11905: 0xBE84,
- 32223 - 11905: 0xBE85,
- 32224 - 11905: 0xBE86,
- 32225 - 11905: 0xBE87,
- 32226 - 11905: 0xBE88,
- 32227 - 11905: 0xBE89,
- 32228 - 11905: 0xBE8A,
- 32229 - 11905: 0xBE8B,
- 32230 - 11905: 0xBE8C,
- 32231 - 11905: 0xBE8D,
- 32232 - 11905: 0xBE8E,
- 32233 - 11905: 0xBE8F,
- 32234 - 11905: 0xBE90,
- 32235 - 11905: 0xBE91,
- 32236 - 11905: 0xBE92,
- 32237 - 11905: 0xBE93,
- 32238 - 11905: 0xBE94,
- 32239 - 11905: 0xBE95,
- 32240 - 11905: 0xBE96,
- 32241 - 11905: 0xBE97,
- 32242 - 11905: 0xBE98,
- 32243 - 11905: 0xBE99,
- 32244 - 11905: 0xBE9A,
- 32245 - 11905: 0xBE9B,
- 32246 - 11905: 0xBE9C,
- 32247 - 11905: 0xBE9D,
- 32248 - 11905: 0xBE9E,
- 32249 - 11905: 0xBE9F,
- 32250 - 11905: 0xBEA0,
- 32251 - 11905: 0xBF40,
- 32252 - 11905: 0xBF41,
- 32253 - 11905: 0xBF42,
- 32254 - 11905: 0xBF43,
- 32255 - 11905: 0xBF44,
- 32256 - 11905: 0xBF45,
- 32257 - 11905: 0xBF46,
- 32258 - 11905: 0xBF47,
- 32259 - 11905: 0xBF48,
- 32260 - 11905: 0xBF49,
- 32261 - 11905: 0xBF4A,
- 32262 - 11905: 0xBF4B,
- 32263 - 11905: 0xBF4C,
- 32264 - 11905: 0xBF4D,
- 32265 - 11905: 0xBF4E,
- 32266 - 11905: 0xBF4F,
- 32267 - 11905: 0xBF50,
- 32268 - 11905: 0xBF51,
- 32269 - 11905: 0xBF52,
- 32270 - 11905: 0xBF53,
- 32271 - 11905: 0xBF54,
- 32272 - 11905: 0xBF55,
- 32273 - 11905: 0xBF56,
- 32274 - 11905: 0xBF57,
- 32275 - 11905: 0xBF58,
- 32276 - 11905: 0xBF59,
- 32277 - 11905: 0xBF5A,
- 32278 - 11905: 0xBF5B,
- 32279 - 11905: 0xBF5C,
- 32280 - 11905: 0xBF5D,
- 32281 - 11905: 0xBF5E,
- 32282 - 11905: 0xBF5F,
- 32283 - 11905: 0xBF60,
- 32284 - 11905: 0xBF61,
- 32285 - 11905: 0xBF62,
- 32286 - 11905: 0xBF63,
- 32287 - 11905: 0xBF64,
- 32288 - 11905: 0xBF65,
- 32289 - 11905: 0xBF66,
- 32290 - 11905: 0xBF67,
- 32291 - 11905: 0xBF68,
- 32292 - 11905: 0xBF69,
- 32293 - 11905: 0xBF6A,
- 32294 - 11905: 0xBF6B,
- 32295 - 11905: 0xBF6C,
- 32296 - 11905: 0xBF6D,
- 32297 - 11905: 0xBF6E,
- 32298 - 11905: 0xBF6F,
- 32299 - 11905: 0xBF70,
- 32300 - 11905: 0xBF71,
- 32301 - 11905: 0xBF72,
- 32302 - 11905: 0xBF73,
- 32303 - 11905: 0xBF74,
- 32304 - 11905: 0xBF75,
- 32305 - 11905: 0xBF76,
- 32306 - 11905: 0xBF77,
- 32307 - 11905: 0xBF78,
- 32308 - 11905: 0xBF79,
- 32309 - 11905: 0xBF7A,
- 32310 - 11905: 0xBF7B,
- 32311 - 11905: 0xBF7C,
- 32312 - 11905: 0xBF7D,
- 32313 - 11905: 0xBF7E,
- 32314 - 11905: 0xBF80,
- 32315 - 11905: 0xF7E3,
- 32316 - 11905: 0xBF81,
- 32317 - 11905: 0xBF82,
- 32318 - 11905: 0xBF83,
- 32319 - 11905: 0xBF84,
- 32320 - 11905: 0xBF85,
- 32321 - 11905: 0xB7B1,
- 32322 - 11905: 0xBF86,
- 32323 - 11905: 0xBF87,
- 32324 - 11905: 0xBF88,
- 32325 - 11905: 0xBF89,
- 32326 - 11905: 0xBF8A,
- 32327 - 11905: 0xF4ED,
- 32328 - 11905: 0xBF8B,
- 32329 - 11905: 0xBF8C,
- 32330 - 11905: 0xBF8D,
- 32331 - 11905: 0xBF8E,
- 32332 - 11905: 0xBF8F,
- 32333 - 11905: 0xBF90,
- 32334 - 11905: 0xBF91,
- 32335 - 11905: 0xBF92,
- 32336 - 11905: 0xBF93,
- 32337 - 11905: 0xBF94,
- 32338 - 11905: 0xBF95,
- 32339 - 11905: 0xBF96,
- 32340 - 11905: 0xBF97,
- 32341 - 11905: 0xBF98,
- 32342 - 11905: 0xBF99,
- 32343 - 11905: 0xBF9A,
- 32344 - 11905: 0xBF9B,
- 32345 - 11905: 0xBF9C,
- 32346 - 11905: 0xBF9D,
- 32347 - 11905: 0xBF9E,
- 32348 - 11905: 0xBF9F,
- 32349 - 11905: 0xBFA0,
- 32350 - 11905: 0xC040,
- 32351 - 11905: 0xC041,
- 32352 - 11905: 0xC042,
- 32353 - 11905: 0xC043,
- 32354 - 11905: 0xC044,
- 32355 - 11905: 0xC045,
- 32356 - 11905: 0xC046,
- 32357 - 11905: 0xC047,
- 32358 - 11905: 0xC048,
- 32359 - 11905: 0xC049,
- 32360 - 11905: 0xC04A,
- 32361 - 11905: 0xC04B,
- 32362 - 11905: 0xC04C,
- 32363 - 11905: 0xC04D,
- 32364 - 11905: 0xC04E,
- 32365 - 11905: 0xC04F,
- 32366 - 11905: 0xC050,
- 32367 - 11905: 0xC051,
- 32368 - 11905: 0xC052,
- 32369 - 11905: 0xC053,
- 32370 - 11905: 0xC054,
- 32371 - 11905: 0xC055,
- 32372 - 11905: 0xC056,
- 32373 - 11905: 0xC057,
- 32374 - 11905: 0xC058,
- 32375 - 11905: 0xC059,
- 32376 - 11905: 0xC05A,
- 32377 - 11905: 0xC05B,
- 32378 - 11905: 0xC05C,
- 32379 - 11905: 0xC05D,
- 32380 - 11905: 0xC05E,
- 32381 - 11905: 0xC05F,
- 32382 - 11905: 0xC060,
- 32383 - 11905: 0xC061,
- 32384 - 11905: 0xC062,
- 32385 - 11905: 0xC063,
- 32386 - 11905: 0xD7EB,
- 32387 - 11905: 0xC064,
- 32388 - 11905: 0xC065,
- 32389 - 11905: 0xC066,
- 32390 - 11905: 0xC067,
- 32391 - 11905: 0xC068,
- 32392 - 11905: 0xC069,
- 32393 - 11905: 0xC06A,
- 32394 - 11905: 0xC06B,
- 32395 - 11905: 0xC06C,
- 32396 - 11905: 0xC06D,
- 32397 - 11905: 0xC06E,
- 32398 - 11905: 0xC06F,
- 32399 - 11905: 0xC070,
- 32400 - 11905: 0xC071,
- 32401 - 11905: 0xC072,
- 32402 - 11905: 0xC073,
- 32403 - 11905: 0xC074,
- 32404 - 11905: 0xC075,
- 32405 - 11905: 0xC076,
- 32406 - 11905: 0xC077,
- 32407 - 11905: 0xC078,
- 32408 - 11905: 0xC079,
- 32409 - 11905: 0xC07A,
- 32410 - 11905: 0xC07B,
- 32411 - 11905: 0xF4EE,
- 32412 - 11905: 0xC07C,
- 32413 - 11905: 0xC07D,
- 32414 - 11905: 0xC07E,
- 32415 - 11905: 0xE6F9,
- 32416 - 11905: 0xBEC0,
- 32417 - 11905: 0xE6FA,
- 32418 - 11905: 0xBAEC,
- 32419 - 11905: 0xE6FB,
- 32420 - 11905: 0xCFCB,
- 32421 - 11905: 0xE6FC,
- 32422 - 11905: 0xD4BC,
- 32423 - 11905: 0xBCB6,
- 32424 - 11905: 0xE6FD,
- 32425 - 11905: 0xE6FE,
- 32426 - 11905: 0xBCCD,
- 32427 - 11905: 0xC8D2,
- 32428 - 11905: 0xCEB3,
- 32429 - 11905: 0xE7A1,
- 32430 - 11905: 0xC080,
- 32431 - 11905: 0xB4BF,
- 32432 - 11905: 0xE7A2,
- 32433 - 11905: 0xC9B4,
- 32434 - 11905: 0xB8D9,
- 32435 - 11905: 0xC4C9,
- 32436 - 11905: 0xC081,
- 32437 - 11905: 0xD7DD,
- 32438 - 11905: 0xC2DA,
- 32439 - 11905: 0xB7D7,
- 32440 - 11905: 0xD6BD,
- 32441 - 11905: 0xCEC6,
- 32442 - 11905: 0xB7C4,
- 32443 - 11905: 0xC082,
- 32444 - 11905: 0xC083,
- 32445 - 11905: 0xC5A6,
- 32446 - 11905: 0xE7A3,
- 32447 - 11905: 0xCFDF,
- 32448 - 11905: 0xE7A4,
- 32449 - 11905: 0xE7A5,
- 32450 - 11905: 0xE7A6,
- 32451 - 11905: 0xC1B7,
- 32452 - 11905: 0xD7E9,
- 32453 - 11905: 0xC9F0,
- 32454 - 11905: 0xCFB8,
- 32455 - 11905: 0xD6AF,
- 32456 - 11905: 0xD6D5,
- 32457 - 11905: 0xE7A7,
- 32458 - 11905: 0xB0ED,
- 32459 - 11905: 0xE7A8,
- 32460 - 11905: 0xE7A9,
- 32461 - 11905: 0xC9DC,
- 32462 - 11905: 0xD2EF,
- 32463 - 11905: 0xBEAD,
- 32464 - 11905: 0xE7AA,
- 32465 - 11905: 0xB0F3,
- 32466 - 11905: 0xC8DE,
- 32467 - 11905: 0xBDE1,
- 32468 - 11905: 0xE7AB,
- 32469 - 11905: 0xC8C6,
- 32470 - 11905: 0xC084,
- 32471 - 11905: 0xE7AC,
- 32472 - 11905: 0xBBE6,
- 32473 - 11905: 0xB8F8,
- 32474 - 11905: 0xD1A4,
- 32475 - 11905: 0xE7AD,
- 32476 - 11905: 0xC2E7,
- 32477 - 11905: 0xBEF8,
- 32478 - 11905: 0xBDCA,
- 32479 - 11905: 0xCDB3,
- 32480 - 11905: 0xE7AE,
- 32481 - 11905: 0xE7AF,
- 32482 - 11905: 0xBEEE,
- 32483 - 11905: 0xD0E5,
- 32484 - 11905: 0xC085,
- 32485 - 11905: 0xCBE7,
- 32486 - 11905: 0xCCD0,
- 32487 - 11905: 0xBCCC,
- 32488 - 11905: 0xE7B0,
- 32489 - 11905: 0xBCA8,
- 32490 - 11905: 0xD0F7,
- 32491 - 11905: 0xE7B1,
- 32492 - 11905: 0xC086,
- 32493 - 11905: 0xD0F8,
- 32494 - 11905: 0xE7B2,
- 32495 - 11905: 0xE7B3,
- 32496 - 11905: 0xB4C2,
- 32497 - 11905: 0xE7B4,
- 32498 - 11905: 0xE7B5,
- 32499 - 11905: 0xC9FE,
- 32500 - 11905: 0xCEAC,
- 32501 - 11905: 0xC3E0,
- 32502 - 11905: 0xE7B7,
- 32503 - 11905: 0xB1C1,
- 32504 - 11905: 0xB3F1,
- 32505 - 11905: 0xC087,
- 32506 - 11905: 0xE7B8,
- 32507 - 11905: 0xE7B9,
- 32508 - 11905: 0xD7DB,
- 32509 - 11905: 0xD5C0,
- 32510 - 11905: 0xE7BA,
- 32511 - 11905: 0xC2CC,
- 32512 - 11905: 0xD7BA,
- 32513 - 11905: 0xE7BB,
- 32514 - 11905: 0xE7BC,
- 32515 - 11905: 0xE7BD,
- 32516 - 11905: 0xBCEA,
- 32517 - 11905: 0xC3E5,
- 32518 - 11905: 0xC0C2,
- 32519 - 11905: 0xE7BE,
- 32520 - 11905: 0xE7BF,
- 32521 - 11905: 0xBCA9,
- 32522 - 11905: 0xC088,
- 32523 - 11905: 0xE7C0,
- 32524 - 11905: 0xE7C1,
- 32525 - 11905: 0xE7B6,
- 32526 - 11905: 0xB6D0,
- 32527 - 11905: 0xE7C2,
- 32528 - 11905: 0xC089,
- 32529 - 11905: 0xE7C3,
- 32530 - 11905: 0xE7C4,
- 32531 - 11905: 0xBBBA,
- 32532 - 11905: 0xB5DE,
- 32533 - 11905: 0xC2C6,
- 32534 - 11905: 0xB1E0,
- 32535 - 11905: 0xE7C5,
- 32536 - 11905: 0xD4B5,
- 32537 - 11905: 0xE7C6,
- 32538 - 11905: 0xB8BF,
- 32539 - 11905: 0xE7C8,
- 32540 - 11905: 0xE7C7,
- 32541 - 11905: 0xB7EC,
- 32542 - 11905: 0xC08A,
- 32543 - 11905: 0xE7C9,
- 32544 - 11905: 0xB2F8,
- 32545 - 11905: 0xE7CA,
- 32546 - 11905: 0xE7CB,
- 32547 - 11905: 0xE7CC,
- 32548 - 11905: 0xE7CD,
- 32549 - 11905: 0xE7CE,
- 32550 - 11905: 0xE7CF,
- 32551 - 11905: 0xE7D0,
- 32552 - 11905: 0xD3A7,
- 32553 - 11905: 0xCBF5,
- 32554 - 11905: 0xE7D1,
- 32555 - 11905: 0xE7D2,
- 32556 - 11905: 0xE7D3,
- 32557 - 11905: 0xE7D4,
- 32558 - 11905: 0xC9C9,
- 32559 - 11905: 0xE7D5,
- 32560 - 11905: 0xE7D6,
- 32561 - 11905: 0xE7D7,
- 32562 - 11905: 0xE7D8,
- 32563 - 11905: 0xE7D9,
- 32564 - 11905: 0xBDC9,
- 32565 - 11905: 0xE7DA,
- 32566 - 11905: 0xF3BE,
- 32567 - 11905: 0xC08B,
- 32568 - 11905: 0xB8D7,
- 32569 - 11905: 0xC08C,
- 32570 - 11905: 0xC8B1,
- 32571 - 11905: 0xC08D,
- 32572 - 11905: 0xC08E,
- 32573 - 11905: 0xC08F,
- 32574 - 11905: 0xC090,
- 32575 - 11905: 0xC091,
- 32576 - 11905: 0xC092,
- 32577 - 11905: 0xC093,
- 32578 - 11905: 0xF3BF,
- 32579 - 11905: 0xC094,
- 32580 - 11905: 0xF3C0,
- 32581 - 11905: 0xF3C1,
- 32582 - 11905: 0xC095,
- 32583 - 11905: 0xC096,
- 32584 - 11905: 0xC097,
- 32585 - 11905: 0xC098,
- 32586 - 11905: 0xC099,
- 32587 - 11905: 0xC09A,
- 32588 - 11905: 0xC09B,
- 32589 - 11905: 0xC09C,
- 32590 - 11905: 0xC09D,
- 32591 - 11905: 0xC09E,
- 32592 - 11905: 0xB9DE,
- 32593 - 11905: 0xCDF8,
- 32594 - 11905: 0xC09F,
- 32595 - 11905: 0xC0A0,
- 32596 - 11905: 0xD8E8,
- 32597 - 11905: 0xBAB1,
- 32598 - 11905: 0xC140,
- 32599 - 11905: 0xC2DE,
- 32600 - 11905: 0xEEB7,
- 32601 - 11905: 0xC141,
- 32602 - 11905: 0xB7A3,
- 32603 - 11905: 0xC142,
- 32604 - 11905: 0xC143,
- 32605 - 11905: 0xC144,
- 32606 - 11905: 0xC145,
- 32607 - 11905: 0xEEB9,
- 32608 - 11905: 0xC146,
- 32609 - 11905: 0xEEB8,
- 32610 - 11905: 0xB0D5,
- 32611 - 11905: 0xC147,
- 32612 - 11905: 0xC148,
- 32613 - 11905: 0xC149,
- 32614 - 11905: 0xC14A,
- 32615 - 11905: 0xC14B,
- 32616 - 11905: 0xEEBB,
- 32617 - 11905: 0xD5D6,
- 32618 - 11905: 0xD7EF,
- 32619 - 11905: 0xC14C,
- 32620 - 11905: 0xC14D,
- 32621 - 11905: 0xC14E,
- 32622 - 11905: 0xD6C3,
- 32623 - 11905: 0xC14F,
- 32624 - 11905: 0xC150,
- 32625 - 11905: 0xEEBD,
- 32626 - 11905: 0xCAF0,
- 32627 - 11905: 0xC151,
- 32628 - 11905: 0xEEBC,
- 32629 - 11905: 0xC152,
- 32630 - 11905: 0xC153,
- 32631 - 11905: 0xC154,
- 32632 - 11905: 0xC155,
- 32633 - 11905: 0xEEBE,
- 32634 - 11905: 0xC156,
- 32635 - 11905: 0xC157,
- 32636 - 11905: 0xC158,
- 32637 - 11905: 0xC159,
- 32638 - 11905: 0xEEC0,
- 32639 - 11905: 0xC15A,
- 32640 - 11905: 0xC15B,
- 32641 - 11905: 0xEEBF,
- 32642 - 11905: 0xC15C,
- 32643 - 11905: 0xC15D,
- 32644 - 11905: 0xC15E,
- 32645 - 11905: 0xC15F,
- 32646 - 11905: 0xC160,
- 32647 - 11905: 0xC161,
- 32648 - 11905: 0xC162,
- 32649 - 11905: 0xC163,
- 32650 - 11905: 0xD1F2,
- 32651 - 11905: 0xC164,
- 32652 - 11905: 0xC7BC,
- 32653 - 11905: 0xC165,
- 32654 - 11905: 0xC3C0,
- 32655 - 11905: 0xC166,
- 32656 - 11905: 0xC167,
- 32657 - 11905: 0xC168,
- 32658 - 11905: 0xC169,
- 32659 - 11905: 0xC16A,
- 32660 - 11905: 0xB8E1,
- 32661 - 11905: 0xC16B,
- 32662 - 11905: 0xC16C,
- 32663 - 11905: 0xC16D,
- 32664 - 11905: 0xC16E,
- 32665 - 11905: 0xC16F,
- 32666 - 11905: 0xC1E7,
- 32667 - 11905: 0xC170,
- 32668 - 11905: 0xC171,
- 32669 - 11905: 0xF4C6,
- 32670 - 11905: 0xD0DF,
- 32671 - 11905: 0xF4C7,
- 32672 - 11905: 0xC172,
- 32673 - 11905: 0xCFDB,
- 32674 - 11905: 0xC173,
- 32675 - 11905: 0xC174,
- 32676 - 11905: 0xC8BA,
- 32677 - 11905: 0xC175,
- 32678 - 11905: 0xC176,
- 32679 - 11905: 0xF4C8,
- 32680 - 11905: 0xC177,
- 32681 - 11905: 0xC178,
- 32682 - 11905: 0xC179,
- 32683 - 11905: 0xC17A,
- 32684 - 11905: 0xC17B,
- 32685 - 11905: 0xC17C,
- 32686 - 11905: 0xC17D,
- 32687 - 11905: 0xF4C9,
- 32688 - 11905: 0xF4CA,
- 32689 - 11905: 0xC17E,
- 32690 - 11905: 0xF4CB,
- 32691 - 11905: 0xC180,
- 32692 - 11905: 0xC181,
- 32693 - 11905: 0xC182,
- 32694 - 11905: 0xC183,
- 32695 - 11905: 0xC184,
- 32696 - 11905: 0xD9FA,
- 32697 - 11905: 0xB8FE,
- 32698 - 11905: 0xC185,
- 32699 - 11905: 0xC186,
- 32700 - 11905: 0xE5F1,
- 32701 - 11905: 0xD3F0,
- 32702 - 11905: 0xC187,
- 32703 - 11905: 0xF4E0,
- 32704 - 11905: 0xC188,
- 32705 - 11905: 0xCECC,
- 32706 - 11905: 0xC189,
- 32707 - 11905: 0xC18A,
- 32708 - 11905: 0xC18B,
- 32709 - 11905: 0xB3E1,
- 32710 - 11905: 0xC18C,
- 32711 - 11905: 0xC18D,
- 32712 - 11905: 0xC18E,
- 32713 - 11905: 0xC18F,
- 32714 - 11905: 0xF1B4,
- 32715 - 11905: 0xC190,
- 32716 - 11905: 0xD2EE,
- 32717 - 11905: 0xC191,
- 32718 - 11905: 0xF4E1,
- 32719 - 11905: 0xC192,
- 32720 - 11905: 0xC193,
- 32721 - 11905: 0xC194,
- 32722 - 11905: 0xC195,
- 32723 - 11905: 0xC196,
- 32724 - 11905: 0xCFE8,
- 32725 - 11905: 0xF4E2,
- 32726 - 11905: 0xC197,
- 32727 - 11905: 0xC198,
- 32728 - 11905: 0xC7CC,
- 32729 - 11905: 0xC199,
- 32730 - 11905: 0xC19A,
- 32731 - 11905: 0xC19B,
- 32732 - 11905: 0xC19C,
- 32733 - 11905: 0xC19D,
- 32734 - 11905: 0xC19E,
- 32735 - 11905: 0xB5D4,
- 32736 - 11905: 0xB4E4,
- 32737 - 11905: 0xF4E4,
- 32738 - 11905: 0xC19F,
- 32739 - 11905: 0xC1A0,
- 32740 - 11905: 0xC240,
- 32741 - 11905: 0xF4E3,
- 32742 - 11905: 0xF4E5,
- 32743 - 11905: 0xC241,
- 32744 - 11905: 0xC242,
- 32745 - 11905: 0xF4E6,
- 32746 - 11905: 0xC243,
- 32747 - 11905: 0xC244,
- 32748 - 11905: 0xC245,
- 32749 - 11905: 0xC246,
- 32750 - 11905: 0xF4E7,
- 32751 - 11905: 0xC247,
- 32752 - 11905: 0xBAB2,
- 32753 - 11905: 0xB0BF,
- 32754 - 11905: 0xC248,
- 32755 - 11905: 0xF4E8,
- 32756 - 11905: 0xC249,
- 32757 - 11905: 0xC24A,
- 32758 - 11905: 0xC24B,
- 32759 - 11905: 0xC24C,
- 32760 - 11905: 0xC24D,
- 32761 - 11905: 0xC24E,
- 32762 - 11905: 0xC24F,
- 32763 - 11905: 0xB7AD,
- 32764 - 11905: 0xD2ED,
- 32765 - 11905: 0xC250,
- 32766 - 11905: 0xC251,
- 32767 - 11905: 0xC252,
- 32768 - 11905: 0xD2AB,
- 32769 - 11905: 0xC0CF,
- 32770 - 11905: 0xC253,
- 32771 - 11905: 0xBFBC,
- 32772 - 11905: 0xEBA3,
- 32773 - 11905: 0xD5DF,
- 32774 - 11905: 0xEAC8,
- 32775 - 11905: 0xC254,
- 32776 - 11905: 0xC255,
- 32777 - 11905: 0xC256,
- 32778 - 11905: 0xC257,
- 32779 - 11905: 0xF1F3,
- 32780 - 11905: 0xB6F8,
- 32781 - 11905: 0xCBA3,
- 32782 - 11905: 0xC258,
- 32783 - 11905: 0xC259,
- 32784 - 11905: 0xC4CD,
- 32785 - 11905: 0xC25A,
- 32786 - 11905: 0xF1E7,
- 32787 - 11905: 0xC25B,
- 32788 - 11905: 0xF1E8,
- 32789 - 11905: 0xB8FB,
- 32790 - 11905: 0xF1E9,
- 32791 - 11905: 0xBAC4,
- 32792 - 11905: 0xD4C5,
- 32793 - 11905: 0xB0D2,
- 32794 - 11905: 0xC25C,
- 32795 - 11905: 0xC25D,
- 32796 - 11905: 0xF1EA,
- 32797 - 11905: 0xC25E,
- 32798 - 11905: 0xC25F,
- 32799 - 11905: 0xC260,
- 32800 - 11905: 0xF1EB,
- 32801 - 11905: 0xC261,
- 32802 - 11905: 0xF1EC,
- 32803 - 11905: 0xC262,
- 32804 - 11905: 0xC263,
- 32805 - 11905: 0xF1ED,
- 32806 - 11905: 0xF1EE,
- 32807 - 11905: 0xF1EF,
- 32808 - 11905: 0xF1F1,
- 32809 - 11905: 0xF1F0,
- 32810 - 11905: 0xC5D5,
- 32811 - 11905: 0xC264,
- 32812 - 11905: 0xC265,
- 32813 - 11905: 0xC266,
- 32814 - 11905: 0xC267,
- 32815 - 11905: 0xC268,
- 32816 - 11905: 0xC269,
- 32817 - 11905: 0xF1F2,
- 32818 - 11905: 0xC26A,
- 32819 - 11905: 0xB6FA,
- 32820 - 11905: 0xC26B,
- 32821 - 11905: 0xF1F4,
- 32822 - 11905: 0xD2AE,
- 32823 - 11905: 0xDEC7,
- 32824 - 11905: 0xCBCA,
- 32825 - 11905: 0xC26C,
- 32826 - 11905: 0xC26D,
- 32827 - 11905: 0xB3DC,
- 32828 - 11905: 0xC26E,
- 32829 - 11905: 0xB5A2,
- 32830 - 11905: 0xC26F,
- 32831 - 11905: 0xB9A2,
- 32832 - 11905: 0xC270,
- 32833 - 11905: 0xC271,
- 32834 - 11905: 0xC4F4,
- 32835 - 11905: 0xF1F5,
- 32836 - 11905: 0xC272,
- 32837 - 11905: 0xC273,
- 32838 - 11905: 0xF1F6,
- 32839 - 11905: 0xC274,
- 32840 - 11905: 0xC275,
- 32841 - 11905: 0xC276,
- 32842 - 11905: 0xC1C4,
- 32843 - 11905: 0xC1FB,
- 32844 - 11905: 0xD6B0,
- 32845 - 11905: 0xF1F7,
- 32846 - 11905: 0xC277,
- 32847 - 11905: 0xC278,
- 32848 - 11905: 0xC279,
- 32849 - 11905: 0xC27A,
- 32850 - 11905: 0xF1F8,
- 32851 - 11905: 0xC27B,
- 32852 - 11905: 0xC1AA,
- 32853 - 11905: 0xC27C,
- 32854 - 11905: 0xC27D,
- 32855 - 11905: 0xC27E,
- 32856 - 11905: 0xC6B8,
- 32857 - 11905: 0xC280,
- 32858 - 11905: 0xBEDB,
- 32859 - 11905: 0xC281,
- 32860 - 11905: 0xC282,
- 32861 - 11905: 0xC283,
- 32862 - 11905: 0xC284,
- 32863 - 11905: 0xC285,
- 32864 - 11905: 0xC286,
- 32865 - 11905: 0xC287,
- 32866 - 11905: 0xC288,
- 32867 - 11905: 0xC289,
- 32868 - 11905: 0xC28A,
- 32869 - 11905: 0xC28B,
- 32870 - 11905: 0xC28C,
- 32871 - 11905: 0xC28D,
- 32872 - 11905: 0xC28E,
- 32873 - 11905: 0xF1F9,
- 32874 - 11905: 0xB4CF,
- 32875 - 11905: 0xC28F,
- 32876 - 11905: 0xC290,
- 32877 - 11905: 0xC291,
- 32878 - 11905: 0xC292,
- 32879 - 11905: 0xC293,
- 32880 - 11905: 0xC294,
- 32881 - 11905: 0xF1FA,
- 32882 - 11905: 0xC295,
- 32883 - 11905: 0xC296,
- 32884 - 11905: 0xC297,
- 32885 - 11905: 0xC298,
- 32886 - 11905: 0xC299,
- 32887 - 11905: 0xC29A,
- 32888 - 11905: 0xC29B,
- 32889 - 11905: 0xC29C,
- 32890 - 11905: 0xC29D,
- 32891 - 11905: 0xC29E,
- 32892 - 11905: 0xC29F,
- 32893 - 11905: 0xC2A0,
- 32894 - 11905: 0xC340,
- 32895 - 11905: 0xEDB2,
- 32896 - 11905: 0xEDB1,
- 32897 - 11905: 0xC341,
- 32898 - 11905: 0xC342,
- 32899 - 11905: 0xCBE0,
- 32900 - 11905: 0xD2DE,
- 32901 - 11905: 0xC343,
- 32902 - 11905: 0xCBC1,
- 32903 - 11905: 0xD5D8,
- 32904 - 11905: 0xC344,
- 32905 - 11905: 0xC8E2,
- 32906 - 11905: 0xC345,
- 32907 - 11905: 0xC0DF,
- 32908 - 11905: 0xBCA1,
- 32909 - 11905: 0xC346,
- 32910 - 11905: 0xC347,
- 32911 - 11905: 0xC348,
- 32912 - 11905: 0xC349,
- 32913 - 11905: 0xC34A,
- 32914 - 11905: 0xC34B,
- 32915 - 11905: 0xEBC1,
- 32916 - 11905: 0xC34C,
- 32917 - 11905: 0xC34D,
- 32918 - 11905: 0xD0A4,
- 32919 - 11905: 0xC34E,
- 32920 - 11905: 0xD6E2,
- 32921 - 11905: 0xC34F,
- 32922 - 11905: 0xB6C7,
- 32923 - 11905: 0xB8D8,
- 32924 - 11905: 0xEBC0,
- 32925 - 11905: 0xB8CE,
- 32926 - 11905: 0xC350,
- 32927 - 11905: 0xEBBF,
- 32928 - 11905: 0xB3A6,
- 32929 - 11905: 0xB9C9,
- 32930 - 11905: 0xD6AB,
- 32931 - 11905: 0xC351,
- 32932 - 11905: 0xB7F4,
- 32933 - 11905: 0xB7CA,
- 32934 - 11905: 0xC352,
- 32935 - 11905: 0xC353,
- 32936 - 11905: 0xC354,
- 32937 - 11905: 0xBCE7,
- 32938 - 11905: 0xB7BE,
- 32939 - 11905: 0xEBC6,
- 32940 - 11905: 0xC355,
- 32941 - 11905: 0xEBC7,
- 32942 - 11905: 0xB0B9,
- 32943 - 11905: 0xBFCF,
- 32944 - 11905: 0xC356,
- 32945 - 11905: 0xEBC5,
- 32946 - 11905: 0xD3FD,
- 32947 - 11905: 0xC357,
- 32948 - 11905: 0xEBC8,
- 32949 - 11905: 0xC358,
- 32950 - 11905: 0xC359,
- 32951 - 11905: 0xEBC9,
- 32952 - 11905: 0xC35A,
- 32953 - 11905: 0xC35B,
- 32954 - 11905: 0xB7CE,
- 32955 - 11905: 0xC35C,
- 32956 - 11905: 0xEBC2,
- 32957 - 11905: 0xEBC4,
- 32958 - 11905: 0xC9F6,
- 32959 - 11905: 0xD6D7,
- 32960 - 11905: 0xD5CD,
- 32961 - 11905: 0xD0B2,
- 32962 - 11905: 0xEBCF,
- 32963 - 11905: 0xCEB8,
- 32964 - 11905: 0xEBD0,
- 32965 - 11905: 0xC35D,
- 32966 - 11905: 0xB5A8,
- 32967 - 11905: 0xC35E,
- 32968 - 11905: 0xC35F,
- 32969 - 11905: 0xC360,
- 32970 - 11905: 0xC361,
- 32971 - 11905: 0xC362,
- 32972 - 11905: 0xB1B3,
- 32973 - 11905: 0xEBD2,
- 32974 - 11905: 0xCCA5,
- 32975 - 11905: 0xC363,
- 32976 - 11905: 0xC364,
- 32977 - 11905: 0xC365,
- 32978 - 11905: 0xC366,
- 32979 - 11905: 0xC367,
- 32980 - 11905: 0xC368,
- 32981 - 11905: 0xC369,
- 32982 - 11905: 0xC5D6,
- 32983 - 11905: 0xEBD3,
- 32984 - 11905: 0xC36A,
- 32985 - 11905: 0xEBD1,
- 32986 - 11905: 0xC5DF,
- 32987 - 11905: 0xEBCE,
- 32988 - 11905: 0xCAA4,
- 32989 - 11905: 0xEBD5,
- 32990 - 11905: 0xB0FB,
- 32991 - 11905: 0xC36B,
- 32992 - 11905: 0xC36C,
- 32993 - 11905: 0xBAFA,
- 32994 - 11905: 0xC36D,
- 32995 - 11905: 0xC36E,
- 32996 - 11905: 0xD8B7,
- 32997 - 11905: 0xF1E3,
- 32998 - 11905: 0xC36F,
- 32999 - 11905: 0xEBCA,
- 33000 - 11905: 0xEBCB,
- 33001 - 11905: 0xEBCC,
- 33002 - 11905: 0xEBCD,
- 33003 - 11905: 0xEBD6,
- 33004 - 11905: 0xE6C0,
- 33005 - 11905: 0xEBD9,
- 33006 - 11905: 0xC370,
- 33007 - 11905: 0xBFE8,
- 33008 - 11905: 0xD2C8,
- 33009 - 11905: 0xEBD7,
- 33010 - 11905: 0xEBDC,
- 33011 - 11905: 0xB8EC,
- 33012 - 11905: 0xEBD8,
- 33013 - 11905: 0xC371,
- 33014 - 11905: 0xBDBA,
- 33015 - 11905: 0xC372,
- 33016 - 11905: 0xD0D8,
- 33017 - 11905: 0xC373,
- 33018 - 11905: 0xB0B7,
- 33019 - 11905: 0xC374,
- 33020 - 11905: 0xEBDD,
- 33021 - 11905: 0xC4DC,
- 33022 - 11905: 0xC375,
- 33023 - 11905: 0xC376,
- 33024 - 11905: 0xC377,
- 33025 - 11905: 0xC378,
- 33026 - 11905: 0xD6AC,
- 33027 - 11905: 0xC379,
- 33028 - 11905: 0xC37A,
- 33029 - 11905: 0xC37B,
- 33030 - 11905: 0xB4E0,
- 33031 - 11905: 0xC37C,
- 33032 - 11905: 0xC37D,
- 33033 - 11905: 0xC2F6,
- 33034 - 11905: 0xBCB9,
- 33035 - 11905: 0xC37E,
- 33036 - 11905: 0xC380,
- 33037 - 11905: 0xEBDA,
- 33038 - 11905: 0xEBDB,
- 33039 - 11905: 0xD4E0,
- 33040 - 11905: 0xC6EA,
- 33041 - 11905: 0xC4D4,
- 33042 - 11905: 0xEBDF,
- 33043 - 11905: 0xC5A7,
- 33044 - 11905: 0xD9F5,
- 33045 - 11905: 0xC381,
- 33046 - 11905: 0xB2B1,
- 33047 - 11905: 0xC382,
- 33048 - 11905: 0xEBE4,
- 33049 - 11905: 0xC383,
- 33050 - 11905: 0xBDC5,
- 33051 - 11905: 0xC384,
- 33052 - 11905: 0xC385,
- 33053 - 11905: 0xC386,
- 33054 - 11905: 0xEBE2,
- 33055 - 11905: 0xC387,
- 33056 - 11905: 0xC388,
- 33057 - 11905: 0xC389,
- 33058 - 11905: 0xC38A,
- 33059 - 11905: 0xC38B,
- 33060 - 11905: 0xC38C,
- 33061 - 11905: 0xC38D,
- 33062 - 11905: 0xC38E,
- 33063 - 11905: 0xC38F,
- 33064 - 11905: 0xC390,
- 33065 - 11905: 0xC391,
- 33066 - 11905: 0xC392,
- 33067 - 11905: 0xC393,
- 33068 - 11905: 0xEBE3,
- 33069 - 11905: 0xC394,
- 33070 - 11905: 0xC395,
- 33071 - 11905: 0xB8AC,
- 33072 - 11905: 0xC396,
- 33073 - 11905: 0xCDD1,
- 33074 - 11905: 0xEBE5,
- 33075 - 11905: 0xC397,
- 33076 - 11905: 0xC398,
- 33077 - 11905: 0xC399,
- 33078 - 11905: 0xEBE1,
- 33079 - 11905: 0xC39A,
- 33080 - 11905: 0xC1B3,
- 33081 - 11905: 0xC39B,
- 33082 - 11905: 0xC39C,
- 33083 - 11905: 0xC39D,
- 33084 - 11905: 0xC39E,
- 33085 - 11905: 0xC39F,
- 33086 - 11905: 0xC6A2,
- 33087 - 11905: 0xC3A0,
- 33088 - 11905: 0xC440,
- 33089 - 11905: 0xC441,
- 33090 - 11905: 0xC442,
- 33091 - 11905: 0xC443,
- 33092 - 11905: 0xC444,
- 33093 - 11905: 0xC445,
- 33094 - 11905: 0xCCF3,
- 33095 - 11905: 0xC446,
- 33096 - 11905: 0xEBE6,
- 33097 - 11905: 0xC447,
- 33098 - 11905: 0xC0B0,
- 33099 - 11905: 0xD2B8,
- 33100 - 11905: 0xEBE7,
- 33101 - 11905: 0xC448,
- 33102 - 11905: 0xC449,
- 33103 - 11905: 0xC44A,
- 33104 - 11905: 0xB8AF,
- 33105 - 11905: 0xB8AD,
- 33106 - 11905: 0xC44B,
- 33107 - 11905: 0xEBE8,
- 33108 - 11905: 0xC7BB,
- 33109 - 11905: 0xCDF3,
- 33110 - 11905: 0xC44C,
- 33111 - 11905: 0xC44D,
- 33112 - 11905: 0xC44E,
- 33113 - 11905: 0xEBEA,
- 33114 - 11905: 0xEBEB,
- 33115 - 11905: 0xC44F,
- 33116 - 11905: 0xC450,
- 33117 - 11905: 0xC451,
- 33118 - 11905: 0xC452,
- 33119 - 11905: 0xC453,
- 33120 - 11905: 0xEBED,
- 33121 - 11905: 0xC454,
- 33122 - 11905: 0xC455,
- 33123 - 11905: 0xC456,
- 33124 - 11905: 0xC457,
- 33125 - 11905: 0xD0C8,
- 33126 - 11905: 0xC458,
- 33127 - 11905: 0xEBF2,
- 33128 - 11905: 0xC459,
- 33129 - 11905: 0xEBEE,
- 33130 - 11905: 0xC45A,
- 33131 - 11905: 0xC45B,
- 33132 - 11905: 0xC45C,
- 33133 - 11905: 0xEBF1,
- 33134 - 11905: 0xC8F9,
- 33135 - 11905: 0xC45D,
- 33136 - 11905: 0xD1FC,
- 33137 - 11905: 0xEBEC,
- 33138 - 11905: 0xC45E,
- 33139 - 11905: 0xC45F,
- 33140 - 11905: 0xEBE9,
- 33141 - 11905: 0xC460,
- 33142 - 11905: 0xC461,
- 33143 - 11905: 0xC462,
- 33144 - 11905: 0xC463,
- 33145 - 11905: 0xB8B9,
- 33146 - 11905: 0xCFD9,
- 33147 - 11905: 0xC4E5,
- 33148 - 11905: 0xEBEF,
- 33149 - 11905: 0xEBF0,
- 33150 - 11905: 0xCCDA,
- 33151 - 11905: 0xCDC8,
- 33152 - 11905: 0xB0F2,
- 33153 - 11905: 0xC464,
- 33154 - 11905: 0xEBF6,
- 33155 - 11905: 0xC465,
- 33156 - 11905: 0xC466,
- 33157 - 11905: 0xC467,
- 33158 - 11905: 0xC468,
- 33159 - 11905: 0xC469,
- 33160 - 11905: 0xEBF5,
- 33161 - 11905: 0xC46A,
- 33162 - 11905: 0xB2B2,
- 33163 - 11905: 0xC46B,
- 33164 - 11905: 0xC46C,
- 33165 - 11905: 0xC46D,
- 33166 - 11905: 0xC46E,
- 33167 - 11905: 0xB8E0,
- 33168 - 11905: 0xC46F,
- 33169 - 11905: 0xEBF7,
- 33170 - 11905: 0xC470,
- 33171 - 11905: 0xC471,
- 33172 - 11905: 0xC472,
- 33173 - 11905: 0xC473,
- 33174 - 11905: 0xC474,
- 33175 - 11905: 0xC475,
- 33176 - 11905: 0xB1EC,
- 33177 - 11905: 0xC476,
- 33178 - 11905: 0xC477,
- 33179 - 11905: 0xCCC5,
- 33180 - 11905: 0xC4A4,
- 33181 - 11905: 0xCFA5,
- 33182 - 11905: 0xC478,
- 33183 - 11905: 0xC479,
- 33184 - 11905: 0xC47A,
- 33185 - 11905: 0xC47B,
- 33186 - 11905: 0xC47C,
- 33187 - 11905: 0xEBF9,
- 33188 - 11905: 0xC47D,
- 33189 - 11905: 0xC47E,
- 33190 - 11905: 0xECA2,
- 33191 - 11905: 0xC480,
- 33192 - 11905: 0xC5F2,
- 33193 - 11905: 0xC481,
- 33194 - 11905: 0xEBFA,
- 33195 - 11905: 0xC482,
- 33196 - 11905: 0xC483,
- 33197 - 11905: 0xC484,
- 33198 - 11905: 0xC485,
- 33199 - 11905: 0xC486,
- 33200 - 11905: 0xC487,
- 33201 - 11905: 0xC488,
- 33202 - 11905: 0xC489,
- 33203 - 11905: 0xC9C5,
- 33204 - 11905: 0xC48A,
- 33205 - 11905: 0xC48B,
- 33206 - 11905: 0xC48C,
- 33207 - 11905: 0xC48D,
- 33208 - 11905: 0xC48E,
- 33209 - 11905: 0xC48F,
- 33210 - 11905: 0xE2DF,
- 33211 - 11905: 0xEBFE,
- 33212 - 11905: 0xC490,
- 33213 - 11905: 0xC491,
- 33214 - 11905: 0xC492,
- 33215 - 11905: 0xC493,
- 33216 - 11905: 0xCDCE,
- 33217 - 11905: 0xECA1,
- 33218 - 11905: 0xB1DB,
- 33219 - 11905: 0xD3B7,
- 33220 - 11905: 0xC494,
- 33221 - 11905: 0xC495,
- 33222 - 11905: 0xD2DC,
- 33223 - 11905: 0xC496,
- 33224 - 11905: 0xC497,
- 33225 - 11905: 0xC498,
- 33226 - 11905: 0xEBFD,
- 33227 - 11905: 0xC499,
- 33228 - 11905: 0xEBFB,
- 33229 - 11905: 0xC49A,
- 33230 - 11905: 0xC49B,
- 33231 - 11905: 0xC49C,
- 33232 - 11905: 0xC49D,
- 33233 - 11905: 0xC49E,
- 33234 - 11905: 0xC49F,
- 33235 - 11905: 0xC4A0,
- 33236 - 11905: 0xC540,
- 33237 - 11905: 0xC541,
- 33238 - 11905: 0xC542,
- 33239 - 11905: 0xC543,
- 33240 - 11905: 0xC544,
- 33241 - 11905: 0xC545,
- 33242 - 11905: 0xC546,
- 33243 - 11905: 0xC547,
- 33244 - 11905: 0xC548,
- 33245 - 11905: 0xC549,
- 33246 - 11905: 0xC54A,
- 33247 - 11905: 0xC54B,
- 33248 - 11905: 0xC54C,
- 33249 - 11905: 0xC54D,
- 33250 - 11905: 0xC54E,
- 33251 - 11905: 0xB3BC,
- 33252 - 11905: 0xC54F,
- 33253 - 11905: 0xC550,
- 33254 - 11905: 0xC551,
- 33255 - 11905: 0xEAB0,
- 33256 - 11905: 0xC552,
- 33257 - 11905: 0xC553,
- 33258 - 11905: 0xD7D4,
- 33259 - 11905: 0xC554,
- 33260 - 11905: 0xF4AB,
- 33261 - 11905: 0xB3F4,
- 33262 - 11905: 0xC555,
- 33263 - 11905: 0xC556,
- 33264 - 11905: 0xC557,
- 33265 - 11905: 0xC558,
- 33266 - 11905: 0xC559,
- 33267 - 11905: 0xD6C1,
- 33268 - 11905: 0xD6C2,
- 33269 - 11905: 0xC55A,
- 33270 - 11905: 0xC55B,
- 33271 - 11905: 0xC55C,
- 33272 - 11905: 0xC55D,
- 33273 - 11905: 0xC55E,
- 33274 - 11905: 0xC55F,
- 33275 - 11905: 0xD5E9,
- 33276 - 11905: 0xBECA,
- 33277 - 11905: 0xC560,
- 33278 - 11905: 0xF4A7,
- 33279 - 11905: 0xC561,
- 33280 - 11905: 0xD2A8,
- 33281 - 11905: 0xF4A8,
- 33282 - 11905: 0xF4A9,
- 33283 - 11905: 0xC562,
- 33284 - 11905: 0xF4AA,
- 33285 - 11905: 0xBECB,
- 33286 - 11905: 0xD3DF,
- 33287 - 11905: 0xC563,
- 33288 - 11905: 0xC564,
- 33289 - 11905: 0xC565,
- 33290 - 11905: 0xC566,
- 33291 - 11905: 0xC567,
- 33292 - 11905: 0xC9E0,
- 33293 - 11905: 0xC9E1,
- 33294 - 11905: 0xC568,
- 33295 - 11905: 0xC569,
- 33296 - 11905: 0xF3C2,
- 33297 - 11905: 0xC56A,
- 33298 - 11905: 0xCAE6,
- 33299 - 11905: 0xC56B,
- 33300 - 11905: 0xCCF2,
- 33301 - 11905: 0xC56C,
- 33302 - 11905: 0xC56D,
- 33303 - 11905: 0xC56E,
- 33304 - 11905: 0xC56F,
- 33305 - 11905: 0xC570,
- 33306 - 11905: 0xC571,
- 33307 - 11905: 0xE2B6,
- 33308 - 11905: 0xCBB4,
- 33309 - 11905: 0xC572,
- 33310 - 11905: 0xCEE8,
- 33311 - 11905: 0xD6DB,
- 33312 - 11905: 0xC573,
- 33313 - 11905: 0xF4AD,
- 33314 - 11905: 0xF4AE,
- 33315 - 11905: 0xF4AF,
- 33316 - 11905: 0xC574,
- 33317 - 11905: 0xC575,
- 33318 - 11905: 0xC576,
- 33319 - 11905: 0xC577,
- 33320 - 11905: 0xF4B2,
- 33321 - 11905: 0xC578,
- 33322 - 11905: 0xBABD,
- 33323 - 11905: 0xF4B3,
- 33324 - 11905: 0xB0E3,
- 33325 - 11905: 0xF4B0,
- 33326 - 11905: 0xC579,
- 33327 - 11905: 0xF4B1,
- 33328 - 11905: 0xBDA2,
- 33329 - 11905: 0xB2D5,
- 33330 - 11905: 0xC57A,
- 33331 - 11905: 0xF4B6,
- 33332 - 11905: 0xF4B7,
- 33333 - 11905: 0xB6E6,
- 33334 - 11905: 0xB2B0,
- 33335 - 11905: 0xCFCF,
- 33336 - 11905: 0xF4B4,
- 33337 - 11905: 0xB4AC,
- 33338 - 11905: 0xC57B,
- 33339 - 11905: 0xF4B5,
- 33340 - 11905: 0xC57C,
- 33341 - 11905: 0xC57D,
- 33342 - 11905: 0xF4B8,
- 33343 - 11905: 0xC57E,
- 33344 - 11905: 0xC580,
- 33345 - 11905: 0xC581,
- 33346 - 11905: 0xC582,
- 33347 - 11905: 0xC583,
- 33348 - 11905: 0xF4B9,
- 33349 - 11905: 0xC584,
- 33350 - 11905: 0xC585,
- 33351 - 11905: 0xCDA7,
- 33352 - 11905: 0xC586,
- 33353 - 11905: 0xF4BA,
- 33354 - 11905: 0xC587,
- 33355 - 11905: 0xF4BB,
- 33356 - 11905: 0xC588,
- 33357 - 11905: 0xC589,
- 33358 - 11905: 0xC58A,
- 33359 - 11905: 0xF4BC,
- 33360 - 11905: 0xC58B,
- 33361 - 11905: 0xC58C,
- 33362 - 11905: 0xC58D,
- 33363 - 11905: 0xC58E,
- 33364 - 11905: 0xC58F,
- 33365 - 11905: 0xC590,
- 33366 - 11905: 0xC591,
- 33367 - 11905: 0xC592,
- 33368 - 11905: 0xCBD2,
- 33369 - 11905: 0xC593,
- 33370 - 11905: 0xF4BD,
- 33371 - 11905: 0xC594,
- 33372 - 11905: 0xC595,
- 33373 - 11905: 0xC596,
- 33374 - 11905: 0xC597,
- 33375 - 11905: 0xF4BE,
- 33376 - 11905: 0xC598,
- 33377 - 11905: 0xC599,
- 33378 - 11905: 0xC59A,
- 33379 - 11905: 0xC59B,
- 33380 - 11905: 0xC59C,
- 33381 - 11905: 0xC59D,
- 33382 - 11905: 0xC59E,
- 33383 - 11905: 0xC59F,
- 33384 - 11905: 0xF4BF,
- 33385 - 11905: 0xC5A0,
- 33386 - 11905: 0xC640,
- 33387 - 11905: 0xC641,
- 33388 - 11905: 0xC642,
- 33389 - 11905: 0xC643,
- 33390 - 11905: 0xF4DE,
- 33391 - 11905: 0xC1BC,
- 33392 - 11905: 0xBCE8,
- 33393 - 11905: 0xC644,
- 33394 - 11905: 0xC9AB,
- 33395 - 11905: 0xD1DE,
- 33396 - 11905: 0xE5F5,
- 33397 - 11905: 0xC645,
- 33398 - 11905: 0xC646,
- 33399 - 11905: 0xC647,
- 33400 - 11905: 0xC648,
- 33401 - 11905: 0xDCB3,
- 33402 - 11905: 0xD2D5,
- 33403 - 11905: 0xC649,
- 33404 - 11905: 0xC64A,
- 33405 - 11905: 0xDCB4,
- 33406 - 11905: 0xB0AC,
- 33407 - 11905: 0xDCB5,
- 33408 - 11905: 0xC64B,
- 33409 - 11905: 0xC64C,
- 33410 - 11905: 0xBDDA,
- 33411 - 11905: 0xC64D,
- 33412 - 11905: 0xDCB9,
- 33413 - 11905: 0xC64E,
- 33414 - 11905: 0xC64F,
- 33415 - 11905: 0xC650,
- 33416 - 11905: 0xD8C2,
- 33417 - 11905: 0xC651,
- 33418 - 11905: 0xDCB7,
- 33419 - 11905: 0xD3F3,
- 33420 - 11905: 0xC652,
- 33421 - 11905: 0xC9D6,
- 33422 - 11905: 0xDCBA,
- 33423 - 11905: 0xDCB6,
- 33424 - 11905: 0xC653,
- 33425 - 11905: 0xDCBB,
- 33426 - 11905: 0xC3A2,
- 33427 - 11905: 0xC654,
- 33428 - 11905: 0xC655,
- 33429 - 11905: 0xC656,
- 33430 - 11905: 0xC657,
- 33431 - 11905: 0xDCBC,
- 33432 - 11905: 0xDCC5,
- 33433 - 11905: 0xDCBD,
- 33434 - 11905: 0xC658,
- 33435 - 11905: 0xC659,
- 33436 - 11905: 0xCEDF,
- 33437 - 11905: 0xD6A5,
- 33438 - 11905: 0xC65A,
- 33439 - 11905: 0xDCCF,
- 33440 - 11905: 0xC65B,
- 33441 - 11905: 0xDCCD,
- 33442 - 11905: 0xC65C,
- 33443 - 11905: 0xC65D,
- 33444 - 11905: 0xDCD2,
- 33445 - 11905: 0xBDE6,
- 33446 - 11905: 0xC2AB,
- 33447 - 11905: 0xC65E,
- 33448 - 11905: 0xDCB8,
- 33449 - 11905: 0xDCCB,
- 33450 - 11905: 0xDCCE,
- 33451 - 11905: 0xDCBE,
- 33452 - 11905: 0xB7D2,
- 33453 - 11905: 0xB0C5,
- 33454 - 11905: 0xDCC7,
- 33455 - 11905: 0xD0BE,
- 33456 - 11905: 0xDCC1,
- 33457 - 11905: 0xBBA8,
- 33458 - 11905: 0xC65F,
- 33459 - 11905: 0xB7BC,
- 33460 - 11905: 0xDCCC,
- 33461 - 11905: 0xC660,
- 33462 - 11905: 0xC661,
- 33463 - 11905: 0xDCC6,
- 33464 - 11905: 0xDCBF,
- 33465 - 11905: 0xC7DB,
- 33466 - 11905: 0xC662,
- 33467 - 11905: 0xC663,
- 33468 - 11905: 0xC664,
- 33469 - 11905: 0xD1BF,
- 33470 - 11905: 0xDCC0,
- 33471 - 11905: 0xC665,
- 33472 - 11905: 0xC666,
- 33473 - 11905: 0xDCCA,
- 33474 - 11905: 0xC667,
- 33475 - 11905: 0xC668,
- 33476 - 11905: 0xDCD0,
- 33477 - 11905: 0xC669,
- 33478 - 11905: 0xC66A,
- 33479 - 11905: 0xCEAD,
- 33480 - 11905: 0xDCC2,
- 33481 - 11905: 0xC66B,
- 33482 - 11905: 0xDCC3,
- 33483 - 11905: 0xDCC8,
- 33484 - 11905: 0xDCC9,
- 33485 - 11905: 0xB2D4,
- 33486 - 11905: 0xDCD1,
- 33487 - 11905: 0xCBD5,
- 33488 - 11905: 0xC66C,
- 33489 - 11905: 0xD4B7,
- 33490 - 11905: 0xDCDB,
- 33491 - 11905: 0xDCDF,
- 33492 - 11905: 0xCCA6,
- 33493 - 11905: 0xDCE6,
- 33494 - 11905: 0xC66D,
- 33495 - 11905: 0xC3E7,
- 33496 - 11905: 0xDCDC,
- 33497 - 11905: 0xC66E,
- 33498 - 11905: 0xC66F,
- 33499 - 11905: 0xBFC1,
- 33500 - 11905: 0xDCD9,
- 33501 - 11905: 0xC670,
- 33502 - 11905: 0xB0FA,
- 33503 - 11905: 0xB9B6,
- 33504 - 11905: 0xDCE5,
- 33505 - 11905: 0xDCD3,
- 33506 - 11905: 0xC671,
- 33507 - 11905: 0xDCC4,
- 33508 - 11905: 0xDCD6,
- 33509 - 11905: 0xC8F4,
- 33510 - 11905: 0xBFE0,
- 33511 - 11905: 0xC672,
- 33512 - 11905: 0xC673,
- 33513 - 11905: 0xC674,
- 33514 - 11905: 0xC675,
- 33515 - 11905: 0xC9BB,
- 33516 - 11905: 0xC676,
- 33517 - 11905: 0xC677,
- 33518 - 11905: 0xC678,
- 33519 - 11905: 0xB1BD,
- 33520 - 11905: 0xC679,
- 33521 - 11905: 0xD3A2,
- 33522 - 11905: 0xC67A,
- 33523 - 11905: 0xC67B,
- 33524 - 11905: 0xDCDA,
- 33525 - 11905: 0xC67C,
- 33526 - 11905: 0xC67D,
- 33527 - 11905: 0xDCD5,
- 33528 - 11905: 0xC67E,
- 33529 - 11905: 0xC6BB,
- 33530 - 11905: 0xC680,
- 33531 - 11905: 0xDCDE,
- 33532 - 11905: 0xC681,
- 33533 - 11905: 0xC682,
- 33534 - 11905: 0xC683,
- 33535 - 11905: 0xC684,
- 33536 - 11905: 0xC685,
- 33537 - 11905: 0xD7C2,
- 33538 - 11905: 0xC3AF,
- 33539 - 11905: 0xB7B6,
- 33540 - 11905: 0xC7D1,
- 33541 - 11905: 0xC3A9,
- 33542 - 11905: 0xDCE2,
- 33543 - 11905: 0xDCD8,
- 33544 - 11905: 0xDCEB,
- 33545 - 11905: 0xDCD4,
- 33546 - 11905: 0xC686,
- 33547 - 11905: 0xC687,
- 33548 - 11905: 0xDCDD,
- 33549 - 11905: 0xC688,
- 33550 - 11905: 0xBEA5,
- 33551 - 11905: 0xDCD7,
- 33552 - 11905: 0xC689,
- 33553 - 11905: 0xDCE0,
- 33554 - 11905: 0xC68A,
- 33555 - 11905: 0xC68B,
- 33556 - 11905: 0xDCE3,
- 33557 - 11905: 0xDCE4,
- 33558 - 11905: 0xC68C,
- 33559 - 11905: 0xDCF8,
- 33560 - 11905: 0xC68D,
- 33561 - 11905: 0xC68E,
- 33562 - 11905: 0xDCE1,
- 33563 - 11905: 0xDDA2,
- 33564 - 11905: 0xDCE7,
- 33565 - 11905: 0xC68F,
- 33566 - 11905: 0xC690,
- 33567 - 11905: 0xC691,
- 33568 - 11905: 0xC692,
- 33569 - 11905: 0xC693,
- 33570 - 11905: 0xC694,
- 33571 - 11905: 0xC695,
- 33572 - 11905: 0xC696,
- 33573 - 11905: 0xC697,
- 33574 - 11905: 0xC698,
- 33575 - 11905: 0xBCEB,
- 33576 - 11905: 0xB4C4,
- 33577 - 11905: 0xC699,
- 33578 - 11905: 0xC69A,
- 33579 - 11905: 0xC3A3,
- 33580 - 11905: 0xB2E7,
- 33581 - 11905: 0xDCFA,
- 33582 - 11905: 0xC69B,
- 33583 - 11905: 0xDCF2,
- 33584 - 11905: 0xC69C,
- 33585 - 11905: 0xDCEF,
- 33586 - 11905: 0xC69D,
- 33587 - 11905: 0xDCFC,
- 33588 - 11905: 0xDCEE,
- 33589 - 11905: 0xD2F0,
- 33590 - 11905: 0xB2E8,
- 33591 - 11905: 0xC69E,
- 33592 - 11905: 0xC8D7,
- 33593 - 11905: 0xC8E3,
- 33594 - 11905: 0xDCFB,
- 33595 - 11905: 0xC69F,
- 33596 - 11905: 0xDCED,
- 33597 - 11905: 0xC6A0,
- 33598 - 11905: 0xC740,
- 33599 - 11905: 0xC741,
- 33600 - 11905: 0xDCF7,
- 33601 - 11905: 0xC742,
- 33602 - 11905: 0xC743,
- 33603 - 11905: 0xDCF5,
- 33604 - 11905: 0xC744,
- 33605 - 11905: 0xC745,
- 33606 - 11905: 0xBEA3,
- 33607 - 11905: 0xDCF4,
- 33608 - 11905: 0xC746,
- 33609 - 11905: 0xB2DD,
- 33610 - 11905: 0xC747,
- 33611 - 11905: 0xC748,
- 33612 - 11905: 0xC749,
- 33613 - 11905: 0xC74A,
- 33614 - 11905: 0xC74B,
- 33615 - 11905: 0xDCF3,
- 33616 - 11905: 0xBCF6,
- 33617 - 11905: 0xDCE8,
- 33618 - 11905: 0xBBC4,
- 33619 - 11905: 0xC74C,
- 33620 - 11905: 0xC0F3,
- 33621 - 11905: 0xC74D,
- 33622 - 11905: 0xC74E,
- 33623 - 11905: 0xC74F,
- 33624 - 11905: 0xC750,
- 33625 - 11905: 0xC751,
- 33626 - 11905: 0xBCD4,
- 33627 - 11905: 0xDCE9,
- 33628 - 11905: 0xDCEA,
- 33629 - 11905: 0xC752,
- 33630 - 11905: 0xDCF1,
- 33631 - 11905: 0xDCF6,
- 33632 - 11905: 0xDCF9,
- 33633 - 11905: 0xB5B4,
- 33634 - 11905: 0xC753,
- 33635 - 11905: 0xC8D9,
- 33636 - 11905: 0xBBE7,
- 33637 - 11905: 0xDCFE,
- 33638 - 11905: 0xDCFD,
- 33639 - 11905: 0xD3AB,
- 33640 - 11905: 0xDDA1,
- 33641 - 11905: 0xDDA3,
- 33642 - 11905: 0xDDA5,
- 33643 - 11905: 0xD2F1,
- 33644 - 11905: 0xDDA4,
- 33645 - 11905: 0xDDA6,
- 33646 - 11905: 0xDDA7,
- 33647 - 11905: 0xD2A9,
- 33648 - 11905: 0xC754,
- 33649 - 11905: 0xC755,
- 33650 - 11905: 0xC756,
- 33651 - 11905: 0xC757,
- 33652 - 11905: 0xC758,
- 33653 - 11905: 0xC759,
- 33654 - 11905: 0xC75A,
- 33655 - 11905: 0xBAC9,
- 33656 - 11905: 0xDDA9,
- 33657 - 11905: 0xC75B,
- 33658 - 11905: 0xC75C,
- 33659 - 11905: 0xDDB6,
- 33660 - 11905: 0xDDB1,
- 33661 - 11905: 0xDDB4,
- 33662 - 11905: 0xC75D,
- 33663 - 11905: 0xC75E,
- 33664 - 11905: 0xC75F,
- 33665 - 11905: 0xC760,
- 33666 - 11905: 0xC761,
- 33667 - 11905: 0xC762,
- 33668 - 11905: 0xC763,
- 33669 - 11905: 0xDDB0,
- 33670 - 11905: 0xC6CE,
- 33671 - 11905: 0xC764,
- 33672 - 11905: 0xC765,
- 33673 - 11905: 0xC0F2,
- 33674 - 11905: 0xC766,
- 33675 - 11905: 0xC767,
- 33676 - 11905: 0xC768,
- 33677 - 11905: 0xC769,
- 33678 - 11905: 0xC9AF,
- 33679 - 11905: 0xC76A,
- 33680 - 11905: 0xC76B,
- 33681 - 11905: 0xC76C,
- 33682 - 11905: 0xDCEC,
- 33683 - 11905: 0xDDAE,
- 33684 - 11905: 0xC76D,
- 33685 - 11905: 0xC76E,
- 33686 - 11905: 0xC76F,
- 33687 - 11905: 0xC770,
- 33688 - 11905: 0xDDB7,
- 33689 - 11905: 0xC771,
- 33690 - 11905: 0xC772,
- 33691 - 11905: 0xDCF0,
- 33692 - 11905: 0xDDAF,
- 33693 - 11905: 0xC773,
- 33694 - 11905: 0xDDB8,
- 33695 - 11905: 0xC774,
- 33696 - 11905: 0xDDAC,
- 33697 - 11905: 0xC775,
- 33698 - 11905: 0xC776,
- 33699 - 11905: 0xC777,
- 33700 - 11905: 0xC778,
- 33701 - 11905: 0xC779,
- 33702 - 11905: 0xC77A,
- 33703 - 11905: 0xC77B,
- 33704 - 11905: 0xDDB9,
- 33705 - 11905: 0xDDB3,
- 33706 - 11905: 0xDDAD,
- 33707 - 11905: 0xC4AA,
- 33708 - 11905: 0xC77C,
- 33709 - 11905: 0xC77D,
- 33710 - 11905: 0xC77E,
- 33711 - 11905: 0xC780,
- 33712 - 11905: 0xDDA8,
- 33713 - 11905: 0xC0B3,
- 33714 - 11905: 0xC1AB,
- 33715 - 11905: 0xDDAA,
- 33716 - 11905: 0xDDAB,
- 33717 - 11905: 0xC781,
- 33718 - 11905: 0xDDB2,
- 33719 - 11905: 0xBBF1,
- 33720 - 11905: 0xDDB5,
- 33721 - 11905: 0xD3A8,
- 33722 - 11905: 0xDDBA,
- 33723 - 11905: 0xC782,
- 33724 - 11905: 0xDDBB,
- 33725 - 11905: 0xC3A7,
- 33726 - 11905: 0xC783,
- 33727 - 11905: 0xC784,
- 33728 - 11905: 0xDDD2,
- 33729 - 11905: 0xDDBC,
- 33730 - 11905: 0xC785,
- 33731 - 11905: 0xC786,
- 33732 - 11905: 0xC787,
- 33733 - 11905: 0xDDD1,
- 33734 - 11905: 0xC788,
- 33735 - 11905: 0xB9BD,
- 33736 - 11905: 0xC789,
- 33737 - 11905: 0xC78A,
- 33738 - 11905: 0xBED5,
- 33739 - 11905: 0xC78B,
- 33740 - 11905: 0xBEFA,
- 33741 - 11905: 0xC78C,
- 33742 - 11905: 0xC78D,
- 33743 - 11905: 0xBACA,
- 33744 - 11905: 0xC78E,
- 33745 - 11905: 0xC78F,
- 33746 - 11905: 0xC790,
- 33747 - 11905: 0xC791,
- 33748 - 11905: 0xDDCA,
- 33749 - 11905: 0xC792,
- 33750 - 11905: 0xDDC5,
- 33751 - 11905: 0xC793,
- 33752 - 11905: 0xDDBF,
- 33753 - 11905: 0xC794,
- 33754 - 11905: 0xC795,
- 33755 - 11905: 0xC796,
- 33756 - 11905: 0xB2CB,
- 33757 - 11905: 0xDDC3,
- 33758 - 11905: 0xC797,
- 33759 - 11905: 0xDDCB,
- 33760 - 11905: 0xB2A4,
- 33761 - 11905: 0xDDD5,
- 33762 - 11905: 0xC798,
- 33763 - 11905: 0xC799,
- 33764 - 11905: 0xC79A,
- 33765 - 11905: 0xDDBE,
- 33766 - 11905: 0xC79B,
- 33767 - 11905: 0xC79C,
- 33768 - 11905: 0xC79D,
- 33769 - 11905: 0xC6D0,
- 33770 - 11905: 0xDDD0,
- 33771 - 11905: 0xC79E,
- 33772 - 11905: 0xC79F,
- 33773 - 11905: 0xC7A0,
- 33774 - 11905: 0xC840,
- 33775 - 11905: 0xC841,
- 33776 - 11905: 0xDDD4,
- 33777 - 11905: 0xC1E2,
- 33778 - 11905: 0xB7C6,
- 33779 - 11905: 0xC842,
- 33780 - 11905: 0xC843,
- 33781 - 11905: 0xC844,
- 33782 - 11905: 0xC845,
- 33783 - 11905: 0xC846,
- 33784 - 11905: 0xDDCE,
- 33785 - 11905: 0xDDCF,
- 33786 - 11905: 0xC847,
- 33787 - 11905: 0xC848,
- 33788 - 11905: 0xC849,
- 33789 - 11905: 0xDDC4,
- 33790 - 11905: 0xC84A,
- 33791 - 11905: 0xC84B,
- 33792 - 11905: 0xC84C,
- 33793 - 11905: 0xDDBD,
- 33794 - 11905: 0xC84D,
- 33795 - 11905: 0xDDCD,
- 33796 - 11905: 0xCCD1,
- 33797 - 11905: 0xC84E,
- 33798 - 11905: 0xDDC9,
- 33799 - 11905: 0xC84F,
- 33800 - 11905: 0xC850,
- 33801 - 11905: 0xC851,
- 33802 - 11905: 0xC852,
- 33803 - 11905: 0xDDC2,
- 33804 - 11905: 0xC3C8,
- 33805 - 11905: 0xC6BC,
- 33806 - 11905: 0xCEAE,
- 33807 - 11905: 0xDDCC,
- 33808 - 11905: 0xC853,
- 33809 - 11905: 0xDDC8,
- 33810 - 11905: 0xC854,
- 33811 - 11905: 0xC855,
- 33812 - 11905: 0xC856,
- 33813 - 11905: 0xC857,
- 33814 - 11905: 0xC858,
- 33815 - 11905: 0xC859,
- 33816 - 11905: 0xDDC1,
- 33817 - 11905: 0xC85A,
- 33818 - 11905: 0xC85B,
- 33819 - 11905: 0xC85C,
- 33820 - 11905: 0xDDC6,
- 33821 - 11905: 0xC2DC,
- 33822 - 11905: 0xC85D,
- 33823 - 11905: 0xC85E,
- 33824 - 11905: 0xC85F,
- 33825 - 11905: 0xC860,
- 33826 - 11905: 0xC861,
- 33827 - 11905: 0xC862,
- 33828 - 11905: 0xD3A9,
- 33829 - 11905: 0xD3AA,
- 33830 - 11905: 0xDDD3,
- 33831 - 11905: 0xCFF4,
- 33832 - 11905: 0xC8F8,
- 33833 - 11905: 0xC863,
- 33834 - 11905: 0xC864,
- 33835 - 11905: 0xC865,
- 33836 - 11905: 0xC866,
- 33837 - 11905: 0xC867,
- 33838 - 11905: 0xC868,
- 33839 - 11905: 0xC869,
- 33840 - 11905: 0xC86A,
- 33841 - 11905: 0xDDE6,
- 33842 - 11905: 0xC86B,
- 33843 - 11905: 0xC86C,
- 33844 - 11905: 0xC86D,
- 33845 - 11905: 0xC86E,
- 33846 - 11905: 0xC86F,
- 33847 - 11905: 0xC870,
- 33848 - 11905: 0xDDC7,
- 33849 - 11905: 0xC871,
- 33850 - 11905: 0xC872,
- 33851 - 11905: 0xC873,
- 33852 - 11905: 0xDDE0,
- 33853 - 11905: 0xC2E4,
- 33854 - 11905: 0xC874,
- 33855 - 11905: 0xC875,
- 33856 - 11905: 0xC876,
- 33857 - 11905: 0xC877,
- 33858 - 11905: 0xC878,
- 33859 - 11905: 0xC879,
- 33860 - 11905: 0xC87A,
- 33861 - 11905: 0xC87B,
- 33862 - 11905: 0xDDE1,
- 33863 - 11905: 0xC87C,
- 33864 - 11905: 0xC87D,
- 33865 - 11905: 0xC87E,
- 33866 - 11905: 0xC880,
- 33867 - 11905: 0xC881,
- 33868 - 11905: 0xC882,
- 33869 - 11905: 0xC883,
- 33870 - 11905: 0xC884,
- 33871 - 11905: 0xC885,
- 33872 - 11905: 0xC886,
- 33873 - 11905: 0xDDD7,
- 33874 - 11905: 0xC887,
- 33875 - 11905: 0xC888,
- 33876 - 11905: 0xC889,
- 33877 - 11905: 0xC88A,
- 33878 - 11905: 0xC88B,
- 33879 - 11905: 0xD6F8,
- 33880 - 11905: 0xC88C,
- 33881 - 11905: 0xDDD9,
- 33882 - 11905: 0xDDD8,
- 33883 - 11905: 0xB8F0,
- 33884 - 11905: 0xDDD6,
- 33885 - 11905: 0xC88D,
- 33886 - 11905: 0xC88E,
- 33887 - 11905: 0xC88F,
- 33888 - 11905: 0xC890,
- 33889 - 11905: 0xC6CF,
- 33890 - 11905: 0xC891,
- 33891 - 11905: 0xB6AD,
- 33892 - 11905: 0xC892,
- 33893 - 11905: 0xC893,
- 33894 - 11905: 0xC894,
- 33895 - 11905: 0xC895,
- 33896 - 11905: 0xC896,
- 33897 - 11905: 0xDDE2,
- 33898 - 11905: 0xC897,
- 33899 - 11905: 0xBAF9,
- 33900 - 11905: 0xD4E1,
- 33901 - 11905: 0xDDE7,
- 33902 - 11905: 0xC898,
- 33903 - 11905: 0xC899,
- 33904 - 11905: 0xC89A,
- 33905 - 11905: 0xB4D0,
- 33906 - 11905: 0xC89B,
- 33907 - 11905: 0xDDDA,
- 33908 - 11905: 0xC89C,
- 33909 - 11905: 0xBFFB,
- 33910 - 11905: 0xDDE3,
- 33911 - 11905: 0xC89D,
- 33912 - 11905: 0xDDDF,
- 33913 - 11905: 0xC89E,
- 33914 - 11905: 0xDDDD,
- 33915 - 11905: 0xC89F,
- 33916 - 11905: 0xC8A0,
- 33917 - 11905: 0xC940,
- 33918 - 11905: 0xC941,
- 33919 - 11905: 0xC942,
- 33920 - 11905: 0xC943,
- 33921 - 11905: 0xC944,
- 33922 - 11905: 0xB5D9,
- 33923 - 11905: 0xC945,
- 33924 - 11905: 0xC946,
- 33925 - 11905: 0xC947,
- 33926 - 11905: 0xC948,
- 33927 - 11905: 0xDDDB,
- 33928 - 11905: 0xDDDC,
- 33929 - 11905: 0xDDDE,
- 33930 - 11905: 0xC949,
- 33931 - 11905: 0xBDAF,
- 33932 - 11905: 0xDDE4,
- 33933 - 11905: 0xC94A,
- 33934 - 11905: 0xDDE5,
- 33935 - 11905: 0xC94B,
- 33936 - 11905: 0xC94C,
- 33937 - 11905: 0xC94D,
- 33938 - 11905: 0xC94E,
- 33939 - 11905: 0xC94F,
- 33940 - 11905: 0xC950,
- 33941 - 11905: 0xC951,
- 33942 - 11905: 0xC952,
- 33943 - 11905: 0xDDF5,
- 33944 - 11905: 0xC953,
- 33945 - 11905: 0xC3C9,
- 33946 - 11905: 0xC954,
- 33947 - 11905: 0xC955,
- 33948 - 11905: 0xCBE2,
- 33949 - 11905: 0xC956,
- 33950 - 11905: 0xC957,
- 33951 - 11905: 0xC958,
- 33952 - 11905: 0xC959,
- 33953 - 11905: 0xDDF2,
- 33954 - 11905: 0xC95A,
- 33955 - 11905: 0xC95B,
- 33956 - 11905: 0xC95C,
- 33957 - 11905: 0xC95D,
- 33958 - 11905: 0xC95E,
- 33959 - 11905: 0xC95F,
- 33960 - 11905: 0xC960,
- 33961 - 11905: 0xC961,
- 33962 - 11905: 0xC962,
- 33963 - 11905: 0xC963,
- 33964 - 11905: 0xC964,
- 33965 - 11905: 0xC965,
- 33966 - 11905: 0xC966,
- 33967 - 11905: 0xD8E1,
- 33968 - 11905: 0xC967,
- 33969 - 11905: 0xC968,
- 33970 - 11905: 0xC6D1,
- 33971 - 11905: 0xC969,
- 33972 - 11905: 0xDDF4,
- 33973 - 11905: 0xC96A,
- 33974 - 11905: 0xC96B,
- 33975 - 11905: 0xC96C,
- 33976 - 11905: 0xD5F4,
- 33977 - 11905: 0xDDF3,
- 33978 - 11905: 0xDDF0,
- 33979 - 11905: 0xC96D,
- 33980 - 11905: 0xC96E,
- 33981 - 11905: 0xDDEC,
- 33982 - 11905: 0xC96F,
- 33983 - 11905: 0xDDEF,
- 33984 - 11905: 0xC970,
- 33985 - 11905: 0xDDE8,
- 33986 - 11905: 0xC971,
- 33987 - 11905: 0xC972,
- 33988 - 11905: 0xD0EE,
- 33989 - 11905: 0xC973,
- 33990 - 11905: 0xC974,
- 33991 - 11905: 0xC975,
- 33992 - 11905: 0xC976,
- 33993 - 11905: 0xC8D8,
- 33994 - 11905: 0xDDEE,
- 33995 - 11905: 0xC977,
- 33996 - 11905: 0xC978,
- 33997 - 11905: 0xDDE9,
- 33998 - 11905: 0xC979,
- 33999 - 11905: 0xC97A,
- 34000 - 11905: 0xDDEA,
- 34001 - 11905: 0xCBF2,
- 34002 - 11905: 0xC97B,
- 34003 - 11905: 0xDDED,
- 34004 - 11905: 0xC97C,
- 34005 - 11905: 0xC97D,
- 34006 - 11905: 0xB1CD,
- 34007 - 11905: 0xC97E,
- 34008 - 11905: 0xC980,
- 34009 - 11905: 0xC981,
- 34010 - 11905: 0xC982,
- 34011 - 11905: 0xC983,
- 34012 - 11905: 0xC984,
- 34013 - 11905: 0xC0B6,
- 34014 - 11905: 0xC985,
- 34015 - 11905: 0xBCBB,
- 34016 - 11905: 0xDDF1,
- 34017 - 11905: 0xC986,
- 34018 - 11905: 0xC987,
- 34019 - 11905: 0xDDF7,
- 34020 - 11905: 0xC988,
- 34021 - 11905: 0xDDF6,
- 34022 - 11905: 0xDDEB,
- 34023 - 11905: 0xC989,
- 34024 - 11905: 0xC98A,
- 34025 - 11905: 0xC98B,
- 34026 - 11905: 0xC98C,
- 34027 - 11905: 0xC98D,
- 34028 - 11905: 0xC5EE,
- 34029 - 11905: 0xC98E,
- 34030 - 11905: 0xC98F,
- 34031 - 11905: 0xC990,
- 34032 - 11905: 0xDDFB,
- 34033 - 11905: 0xC991,
- 34034 - 11905: 0xC992,
- 34035 - 11905: 0xC993,
- 34036 - 11905: 0xC994,
- 34037 - 11905: 0xC995,
- 34038 - 11905: 0xC996,
- 34039 - 11905: 0xC997,
- 34040 - 11905: 0xC998,
- 34041 - 11905: 0xC999,
- 34042 - 11905: 0xC99A,
- 34043 - 11905: 0xC99B,
- 34044 - 11905: 0xDEA4,
- 34045 - 11905: 0xC99C,
- 34046 - 11905: 0xC99D,
- 34047 - 11905: 0xDEA3,
- 34048 - 11905: 0xC99E,
- 34049 - 11905: 0xC99F,
- 34050 - 11905: 0xC9A0,
- 34051 - 11905: 0xCA40,
- 34052 - 11905: 0xCA41,
- 34053 - 11905: 0xCA42,
- 34054 - 11905: 0xCA43,
- 34055 - 11905: 0xCA44,
- 34056 - 11905: 0xCA45,
- 34057 - 11905: 0xCA46,
- 34058 - 11905: 0xCA47,
- 34059 - 11905: 0xCA48,
- 34060 - 11905: 0xDDF8,
- 34061 - 11905: 0xCA49,
- 34062 - 11905: 0xCA4A,
- 34063 - 11905: 0xCA4B,
- 34064 - 11905: 0xCA4C,
- 34065 - 11905: 0xC3EF,
- 34066 - 11905: 0xCA4D,
- 34067 - 11905: 0xC2FB,
- 34068 - 11905: 0xCA4E,
- 34069 - 11905: 0xCA4F,
- 34070 - 11905: 0xCA50,
- 34071 - 11905: 0xD5E1,
- 34072 - 11905: 0xCA51,
- 34073 - 11905: 0xCA52,
- 34074 - 11905: 0xCEB5,
- 34075 - 11905: 0xCA53,
- 34076 - 11905: 0xCA54,
- 34077 - 11905: 0xCA55,
- 34078 - 11905: 0xCA56,
- 34079 - 11905: 0xDDFD,
- 34080 - 11905: 0xCA57,
- 34081 - 11905: 0xB2CC,
- 34082 - 11905: 0xCA58,
- 34083 - 11905: 0xCA59,
- 34084 - 11905: 0xCA5A,
- 34085 - 11905: 0xCA5B,
- 34086 - 11905: 0xCA5C,
- 34087 - 11905: 0xCA5D,
- 34088 - 11905: 0xCA5E,
- 34089 - 11905: 0xCA5F,
- 34090 - 11905: 0xCA60,
- 34091 - 11905: 0xC4E8,
- 34092 - 11905: 0xCADF,
- 34093 - 11905: 0xCA61,
- 34094 - 11905: 0xCA62,
- 34095 - 11905: 0xCA63,
- 34096 - 11905: 0xCA64,
- 34097 - 11905: 0xCA65,
- 34098 - 11905: 0xCA66,
- 34099 - 11905: 0xCA67,
- 34100 - 11905: 0xCA68,
- 34101 - 11905: 0xCA69,
- 34102 - 11905: 0xCA6A,
- 34103 - 11905: 0xC7BE,
- 34104 - 11905: 0xDDFA,
- 34105 - 11905: 0xDDFC,
- 34106 - 11905: 0xDDFE,
- 34107 - 11905: 0xDEA2,
- 34108 - 11905: 0xB0AA,
- 34109 - 11905: 0xB1CE,
- 34110 - 11905: 0xCA6B,
- 34111 - 11905: 0xCA6C,
- 34112 - 11905: 0xCA6D,
- 34113 - 11905: 0xCA6E,
- 34114 - 11905: 0xCA6F,
- 34115 - 11905: 0xDEAC,
- 34116 - 11905: 0xCA70,
- 34117 - 11905: 0xCA71,
- 34118 - 11905: 0xCA72,
- 34119 - 11905: 0xCA73,
- 34120 - 11905: 0xDEA6,
- 34121 - 11905: 0xBDB6,
- 34122 - 11905: 0xC8EF,
- 34123 - 11905: 0xCA74,
- 34124 - 11905: 0xCA75,
- 34125 - 11905: 0xCA76,
- 34126 - 11905: 0xCA77,
- 34127 - 11905: 0xCA78,
- 34128 - 11905: 0xCA79,
- 34129 - 11905: 0xCA7A,
- 34130 - 11905: 0xCA7B,
- 34131 - 11905: 0xCA7C,
- 34132 - 11905: 0xCA7D,
- 34133 - 11905: 0xCA7E,
- 34134 - 11905: 0xDEA1,
- 34135 - 11905: 0xCA80,
- 34136 - 11905: 0xCA81,
- 34137 - 11905: 0xDEA5,
- 34138 - 11905: 0xCA82,
- 34139 - 11905: 0xCA83,
- 34140 - 11905: 0xCA84,
- 34141 - 11905: 0xCA85,
- 34142 - 11905: 0xDEA9,
- 34143 - 11905: 0xCA86,
- 34144 - 11905: 0xCA87,
- 34145 - 11905: 0xCA88,
- 34146 - 11905: 0xCA89,
- 34147 - 11905: 0xCA8A,
- 34148 - 11905: 0xDEA8,
- 34149 - 11905: 0xCA8B,
- 34150 - 11905: 0xCA8C,
- 34151 - 11905: 0xCA8D,
- 34152 - 11905: 0xDEA7,
- 34153 - 11905: 0xCA8E,
- 34154 - 11905: 0xCA8F,
- 34155 - 11905: 0xCA90,
- 34156 - 11905: 0xCA91,
- 34157 - 11905: 0xCA92,
- 34158 - 11905: 0xCA93,
- 34159 - 11905: 0xCA94,
- 34160 - 11905: 0xCA95,
- 34161 - 11905: 0xCA96,
- 34162 - 11905: 0xDEAD,
- 34163 - 11905: 0xCA97,
- 34164 - 11905: 0xD4CC,
- 34165 - 11905: 0xCA98,
- 34166 - 11905: 0xCA99,
- 34167 - 11905: 0xCA9A,
- 34168 - 11905: 0xCA9B,
- 34169 - 11905: 0xDEB3,
- 34170 - 11905: 0xDEAA,
- 34171 - 11905: 0xDEAE,
- 34172 - 11905: 0xCA9C,
- 34173 - 11905: 0xCA9D,
- 34174 - 11905: 0xC0D9,
- 34175 - 11905: 0xCA9E,
- 34176 - 11905: 0xCA9F,
- 34177 - 11905: 0xCAA0,
- 34178 - 11905: 0xCB40,
- 34179 - 11905: 0xCB41,
- 34180 - 11905: 0xB1A1,
- 34181 - 11905: 0xDEB6,
- 34182 - 11905: 0xCB42,
- 34183 - 11905: 0xDEB1,
- 34184 - 11905: 0xCB43,
- 34185 - 11905: 0xCB44,
- 34186 - 11905: 0xCB45,
- 34187 - 11905: 0xCB46,
- 34188 - 11905: 0xCB47,
- 34189 - 11905: 0xCB48,
- 34190 - 11905: 0xCB49,
- 34191 - 11905: 0xDEB2,
- 34192 - 11905: 0xCB4A,
- 34193 - 11905: 0xCB4B,
- 34194 - 11905: 0xCB4C,
- 34195 - 11905: 0xCB4D,
- 34196 - 11905: 0xCB4E,
- 34197 - 11905: 0xCB4F,
- 34198 - 11905: 0xCB50,
- 34199 - 11905: 0xCB51,
- 34200 - 11905: 0xCB52,
- 34201 - 11905: 0xCB53,
- 34202 - 11905: 0xCB54,
- 34203 - 11905: 0xD1A6,
- 34204 - 11905: 0xDEB5,
- 34205 - 11905: 0xCB55,
- 34206 - 11905: 0xCB56,
- 34207 - 11905: 0xCB57,
- 34208 - 11905: 0xCB58,
- 34209 - 11905: 0xCB59,
- 34210 - 11905: 0xCB5A,
- 34211 - 11905: 0xCB5B,
- 34212 - 11905: 0xDEAF,
- 34213 - 11905: 0xCB5C,
- 34214 - 11905: 0xCB5D,
- 34215 - 11905: 0xCB5E,
- 34216 - 11905: 0xDEB0,
- 34217 - 11905: 0xCB5F,
- 34218 - 11905: 0xD0BD,
- 34219 - 11905: 0xCB60,
- 34220 - 11905: 0xCB61,
- 34221 - 11905: 0xCB62,
- 34222 - 11905: 0xDEB4,
- 34223 - 11905: 0xCAED,
- 34224 - 11905: 0xDEB9,
- 34225 - 11905: 0xCB63,
- 34226 - 11905: 0xCB64,
- 34227 - 11905: 0xCB65,
- 34228 - 11905: 0xCB66,
- 34229 - 11905: 0xCB67,
- 34230 - 11905: 0xCB68,
- 34231 - 11905: 0xDEB8,
- 34232 - 11905: 0xCB69,
- 34233 - 11905: 0xDEB7,
- 34234 - 11905: 0xCB6A,
- 34235 - 11905: 0xCB6B,
- 34236 - 11905: 0xCB6C,
- 34237 - 11905: 0xCB6D,
- 34238 - 11905: 0xCB6E,
- 34239 - 11905: 0xCB6F,
- 34240 - 11905: 0xCB70,
- 34241 - 11905: 0xDEBB,
- 34242 - 11905: 0xCB71,
- 34243 - 11905: 0xCB72,
- 34244 - 11905: 0xCB73,
- 34245 - 11905: 0xCB74,
- 34246 - 11905: 0xCB75,
- 34247 - 11905: 0xCB76,
- 34248 - 11905: 0xCB77,
- 34249 - 11905: 0xBDE5,
- 34250 - 11905: 0xCB78,
- 34251 - 11905: 0xCB79,
- 34252 - 11905: 0xCB7A,
- 34253 - 11905: 0xCB7B,
- 34254 - 11905: 0xCB7C,
- 34255 - 11905: 0xB2D8,
- 34256 - 11905: 0xC3EA,
- 34257 - 11905: 0xCB7D,
- 34258 - 11905: 0xCB7E,
- 34259 - 11905: 0xDEBA,
- 34260 - 11905: 0xCB80,
- 34261 - 11905: 0xC5BA,
- 34262 - 11905: 0xCB81,
- 34263 - 11905: 0xCB82,
- 34264 - 11905: 0xCB83,
- 34265 - 11905: 0xCB84,
- 34266 - 11905: 0xCB85,
- 34267 - 11905: 0xCB86,
- 34268 - 11905: 0xDEBC,
- 34269 - 11905: 0xCB87,
- 34270 - 11905: 0xCB88,
- 34271 - 11905: 0xCB89,
- 34272 - 11905: 0xCB8A,
- 34273 - 11905: 0xCB8B,
- 34274 - 11905: 0xCB8C,
- 34275 - 11905: 0xCB8D,
- 34276 - 11905: 0xCCD9,
- 34277 - 11905: 0xCB8E,
- 34278 - 11905: 0xCB8F,
- 34279 - 11905: 0xCB90,
- 34280 - 11905: 0xCB91,
- 34281 - 11905: 0xB7AA,
- 34282 - 11905: 0xCB92,
- 34283 - 11905: 0xCB93,
- 34284 - 11905: 0xCB94,
- 34285 - 11905: 0xCB95,
- 34286 - 11905: 0xCB96,
- 34287 - 11905: 0xCB97,
- 34288 - 11905: 0xCB98,
- 34289 - 11905: 0xCB99,
- 34290 - 11905: 0xCB9A,
- 34291 - 11905: 0xCB9B,
- 34292 - 11905: 0xCB9C,
- 34293 - 11905: 0xCB9D,
- 34294 - 11905: 0xCB9E,
- 34295 - 11905: 0xCB9F,
- 34296 - 11905: 0xCBA0,
- 34297 - 11905: 0xCC40,
- 34298 - 11905: 0xCC41,
- 34299 - 11905: 0xD4E5,
- 34300 - 11905: 0xCC42,
- 34301 - 11905: 0xCC43,
- 34302 - 11905: 0xCC44,
- 34303 - 11905: 0xDEBD,
- 34304 - 11905: 0xCC45,
- 34305 - 11905: 0xCC46,
- 34306 - 11905: 0xCC47,
- 34307 - 11905: 0xCC48,
- 34308 - 11905: 0xCC49,
- 34309 - 11905: 0xDEBF,
- 34310 - 11905: 0xCC4A,
- 34311 - 11905: 0xCC4B,
- 34312 - 11905: 0xCC4C,
- 34313 - 11905: 0xCC4D,
- 34314 - 11905: 0xCC4E,
- 34315 - 11905: 0xCC4F,
- 34316 - 11905: 0xCC50,
- 34317 - 11905: 0xCC51,
- 34318 - 11905: 0xCC52,
- 34319 - 11905: 0xCC53,
- 34320 - 11905: 0xCC54,
- 34321 - 11905: 0xC4A2,
- 34322 - 11905: 0xCC55,
- 34323 - 11905: 0xCC56,
- 34324 - 11905: 0xCC57,
- 34325 - 11905: 0xCC58,
- 34326 - 11905: 0xDEC1,
- 34327 - 11905: 0xCC59,
- 34328 - 11905: 0xCC5A,
- 34329 - 11905: 0xCC5B,
- 34330 - 11905: 0xCC5C,
- 34331 - 11905: 0xCC5D,
- 34332 - 11905: 0xCC5E,
- 34333 - 11905: 0xCC5F,
- 34334 - 11905: 0xCC60,
- 34335 - 11905: 0xCC61,
- 34336 - 11905: 0xCC62,
- 34337 - 11905: 0xCC63,
- 34338 - 11905: 0xCC64,
- 34339 - 11905: 0xCC65,
- 34340 - 11905: 0xCC66,
- 34341 - 11905: 0xCC67,
- 34342 - 11905: 0xCC68,
- 34343 - 11905: 0xDEBE,
- 34344 - 11905: 0xCC69,
- 34345 - 11905: 0xDEC0,
- 34346 - 11905: 0xCC6A,
- 34347 - 11905: 0xCC6B,
- 34348 - 11905: 0xCC6C,
- 34349 - 11905: 0xCC6D,
- 34350 - 11905: 0xCC6E,
- 34351 - 11905: 0xCC6F,
- 34352 - 11905: 0xCC70,
- 34353 - 11905: 0xCC71,
- 34354 - 11905: 0xCC72,
- 34355 - 11905: 0xCC73,
- 34356 - 11905: 0xCC74,
- 34357 - 11905: 0xCC75,
- 34358 - 11905: 0xCC76,
- 34359 - 11905: 0xCC77,
- 34360 - 11905: 0xD5BA,
- 34361 - 11905: 0xCC78,
- 34362 - 11905: 0xCC79,
- 34363 - 11905: 0xCC7A,
- 34364 - 11905: 0xDEC2,
- 34365 - 11905: 0xCC7B,
- 34366 - 11905: 0xCC7C,
- 34367 - 11905: 0xCC7D,
- 34368 - 11905: 0xCC7E,
- 34369 - 11905: 0xCC80,
- 34370 - 11905: 0xCC81,
- 34371 - 11905: 0xCC82,
- 34372 - 11905: 0xCC83,
- 34373 - 11905: 0xCC84,
- 34374 - 11905: 0xCC85,
- 34375 - 11905: 0xCC86,
- 34376 - 11905: 0xCC87,
- 34377 - 11905: 0xCC88,
- 34378 - 11905: 0xCC89,
- 34379 - 11905: 0xCC8A,
- 34380 - 11905: 0xCC8B,
- 34381 - 11905: 0xF2AE,
- 34382 - 11905: 0xBBA2,
- 34383 - 11905: 0xC2B2,
- 34384 - 11905: 0xC5B0,
- 34385 - 11905: 0xC2C7,
- 34386 - 11905: 0xCC8C,
- 34387 - 11905: 0xCC8D,
- 34388 - 11905: 0xF2AF,
- 34389 - 11905: 0xCC8E,
- 34390 - 11905: 0xCC8F,
- 34391 - 11905: 0xCC90,
- 34392 - 11905: 0xCC91,
- 34393 - 11905: 0xCC92,
- 34394 - 11905: 0xD0E9,
- 34395 - 11905: 0xCC93,
- 34396 - 11905: 0xCC94,
- 34397 - 11905: 0xCC95,
- 34398 - 11905: 0xD3DD,
- 34399 - 11905: 0xCC96,
- 34400 - 11905: 0xCC97,
- 34401 - 11905: 0xCC98,
- 34402 - 11905: 0xEBBD,
- 34403 - 11905: 0xCC99,
- 34404 - 11905: 0xCC9A,
- 34405 - 11905: 0xCC9B,
- 34406 - 11905: 0xCC9C,
- 34407 - 11905: 0xCC9D,
- 34408 - 11905: 0xCC9E,
- 34409 - 11905: 0xCC9F,
- 34410 - 11905: 0xCCA0,
- 34411 - 11905: 0xB3E6,
- 34412 - 11905: 0xF2B0,
- 34413 - 11905: 0xCD40,
- 34414 - 11905: 0xF2B1,
- 34415 - 11905: 0xCD41,
- 34416 - 11905: 0xCD42,
- 34417 - 11905: 0xCAAD,
- 34418 - 11905: 0xCD43,
- 34419 - 11905: 0xCD44,
- 34420 - 11905: 0xCD45,
- 34421 - 11905: 0xCD46,
- 34422 - 11905: 0xCD47,
- 34423 - 11905: 0xCD48,
- 34424 - 11905: 0xCD49,
- 34425 - 11905: 0xBAE7,
- 34426 - 11905: 0xF2B3,
- 34427 - 11905: 0xF2B5,
- 34428 - 11905: 0xF2B4,
- 34429 - 11905: 0xCBE4,
- 34430 - 11905: 0xCFBA,
- 34431 - 11905: 0xF2B2,
- 34432 - 11905: 0xCAB4,
- 34433 - 11905: 0xD2CF,
- 34434 - 11905: 0xC2EC,
- 34435 - 11905: 0xCD4A,
- 34436 - 11905: 0xCD4B,
- 34437 - 11905: 0xCD4C,
- 34438 - 11905: 0xCD4D,
- 34439 - 11905: 0xCD4E,
- 34440 - 11905: 0xCD4F,
- 34441 - 11905: 0xCD50,
- 34442 - 11905: 0xCEC3,
- 34443 - 11905: 0xF2B8,
- 34444 - 11905: 0xB0F6,
- 34445 - 11905: 0xF2B7,
- 34446 - 11905: 0xCD51,
- 34447 - 11905: 0xCD52,
- 34448 - 11905: 0xCD53,
- 34449 - 11905: 0xCD54,
- 34450 - 11905: 0xCD55,
- 34451 - 11905: 0xF2BE,
- 34452 - 11905: 0xCD56,
- 34453 - 11905: 0xB2CF,
- 34454 - 11905: 0xCD57,
- 34455 - 11905: 0xCD58,
- 34456 - 11905: 0xCD59,
- 34457 - 11905: 0xCD5A,
- 34458 - 11905: 0xCD5B,
- 34459 - 11905: 0xCD5C,
- 34460 - 11905: 0xD1C1,
- 34461 - 11905: 0xF2BA,
- 34462 - 11905: 0xCD5D,
- 34463 - 11905: 0xCD5E,
- 34464 - 11905: 0xCD5F,
- 34465 - 11905: 0xCD60,
- 34466 - 11905: 0xCD61,
- 34467 - 11905: 0xF2BC,
- 34468 - 11905: 0xD4E9,
- 34469 - 11905: 0xCD62,
- 34470 - 11905: 0xCD63,
- 34471 - 11905: 0xF2BB,
- 34472 - 11905: 0xF2B6,
- 34473 - 11905: 0xF2BF,
- 34474 - 11905: 0xF2BD,
- 34475 - 11905: 0xCD64,
- 34476 - 11905: 0xF2B9,
- 34477 - 11905: 0xCD65,
- 34478 - 11905: 0xCD66,
- 34479 - 11905: 0xF2C7,
- 34480 - 11905: 0xF2C4,
- 34481 - 11905: 0xF2C6,
- 34482 - 11905: 0xCD67,
- 34483 - 11905: 0xCD68,
- 34484 - 11905: 0xF2CA,
- 34485 - 11905: 0xF2C2,
- 34486 - 11905: 0xF2C0,
- 34487 - 11905: 0xCD69,
- 34488 - 11905: 0xCD6A,
- 34489 - 11905: 0xCD6B,
- 34490 - 11905: 0xF2C5,
- 34491 - 11905: 0xCD6C,
- 34492 - 11905: 0xCD6D,
- 34493 - 11905: 0xCD6E,
- 34494 - 11905: 0xCD6F,
- 34495 - 11905: 0xCD70,
- 34496 - 11905: 0xD6FB,
- 34497 - 11905: 0xCD71,
- 34498 - 11905: 0xCD72,
- 34499 - 11905: 0xCD73,
- 34500 - 11905: 0xF2C1,
- 34501 - 11905: 0xCD74,
- 34502 - 11905: 0xC7F9,
- 34503 - 11905: 0xC9DF,
- 34504 - 11905: 0xCD75,
- 34505 - 11905: 0xF2C8,
- 34506 - 11905: 0xB9C6,
- 34507 - 11905: 0xB5B0,
- 34508 - 11905: 0xCD76,
- 34509 - 11905: 0xCD77,
- 34510 - 11905: 0xF2C3,
- 34511 - 11905: 0xF2C9,
- 34512 - 11905: 0xF2D0,
- 34513 - 11905: 0xF2D6,
- 34514 - 11905: 0xCD78,
- 34515 - 11905: 0xCD79,
- 34516 - 11905: 0xBBD7,
- 34517 - 11905: 0xCD7A,
- 34518 - 11905: 0xCD7B,
- 34519 - 11905: 0xCD7C,
- 34520 - 11905: 0xF2D5,
- 34521 - 11905: 0xCDDC,
- 34522 - 11905: 0xCD7D,
- 34523 - 11905: 0xD6EB,
- 34524 - 11905: 0xCD7E,
- 34525 - 11905: 0xCD80,
- 34526 - 11905: 0xF2D2,
- 34527 - 11905: 0xF2D4,
- 34528 - 11905: 0xCD81,
- 34529 - 11905: 0xCD82,
- 34530 - 11905: 0xCD83,
- 34531 - 11905: 0xCD84,
- 34532 - 11905: 0xB8F2,
- 34533 - 11905: 0xCD85,
- 34534 - 11905: 0xCD86,
- 34535 - 11905: 0xCD87,
- 34536 - 11905: 0xCD88,
- 34537 - 11905: 0xF2CB,
- 34538 - 11905: 0xCD89,
- 34539 - 11905: 0xCD8A,
- 34540 - 11905: 0xCD8B,
- 34541 - 11905: 0xF2CE,
- 34542 - 11905: 0xC2F9,
- 34543 - 11905: 0xCD8C,
- 34544 - 11905: 0xD5DD,
- 34545 - 11905: 0xF2CC,
- 34546 - 11905: 0xF2CD,
- 34547 - 11905: 0xF2CF,
- 34548 - 11905: 0xF2D3,
- 34549 - 11905: 0xCD8D,
- 34550 - 11905: 0xCD8E,
- 34551 - 11905: 0xCD8F,
- 34552 - 11905: 0xF2D9,
- 34553 - 11905: 0xD3BC,
- 34554 - 11905: 0xCD90,
- 34555 - 11905: 0xCD91,
- 34556 - 11905: 0xCD92,
- 34557 - 11905: 0xCD93,
- 34558 - 11905: 0xB6EA,
- 34559 - 11905: 0xCD94,
- 34560 - 11905: 0xCAF1,
- 34561 - 11905: 0xCD95,
- 34562 - 11905: 0xB7E4,
- 34563 - 11905: 0xF2D7,
- 34564 - 11905: 0xCD96,
- 34565 - 11905: 0xCD97,
- 34566 - 11905: 0xCD98,
- 34567 - 11905: 0xF2D8,
- 34568 - 11905: 0xF2DA,
- 34569 - 11905: 0xF2DD,
- 34570 - 11905: 0xF2DB,
- 34571 - 11905: 0xCD99,
- 34572 - 11905: 0xCD9A,
- 34573 - 11905: 0xF2DC,
- 34574 - 11905: 0xCD9B,
- 34575 - 11905: 0xCD9C,
- 34576 - 11905: 0xCD9D,
- 34577 - 11905: 0xCD9E,
- 34578 - 11905: 0xD1D1,
- 34579 - 11905: 0xF2D1,
- 34580 - 11905: 0xCD9F,
- 34581 - 11905: 0xCDC9,
- 34582 - 11905: 0xCDA0,
- 34583 - 11905: 0xCECF,
- 34584 - 11905: 0xD6A9,
- 34585 - 11905: 0xCE40,
- 34586 - 11905: 0xF2E3,
- 34587 - 11905: 0xCE41,
- 34588 - 11905: 0xC3DB,
- 34589 - 11905: 0xCE42,
- 34590 - 11905: 0xF2E0,
- 34591 - 11905: 0xCE43,
- 34592 - 11905: 0xCE44,
- 34593 - 11905: 0xC0AF,
- 34594 - 11905: 0xF2EC,
- 34595 - 11905: 0xF2DE,
- 34596 - 11905: 0xCE45,
- 34597 - 11905: 0xF2E1,
- 34598 - 11905: 0xCE46,
- 34599 - 11905: 0xCE47,
- 34600 - 11905: 0xCE48,
- 34601 - 11905: 0xF2E8,
- 34602 - 11905: 0xCE49,
- 34603 - 11905: 0xCE4A,
- 34604 - 11905: 0xCE4B,
- 34605 - 11905: 0xCE4C,
- 34606 - 11905: 0xF2E2,
- 34607 - 11905: 0xCE4D,
- 34608 - 11905: 0xCE4E,
- 34609 - 11905: 0xF2E7,
- 34610 - 11905: 0xCE4F,
- 34611 - 11905: 0xCE50,
- 34612 - 11905: 0xF2E6,
- 34613 - 11905: 0xCE51,
- 34614 - 11905: 0xCE52,
- 34615 - 11905: 0xF2E9,
- 34616 - 11905: 0xCE53,
- 34617 - 11905: 0xCE54,
- 34618 - 11905: 0xCE55,
- 34619 - 11905: 0xF2DF,
- 34620 - 11905: 0xCE56,
- 34621 - 11905: 0xCE57,
- 34622 - 11905: 0xF2E4,
- 34623 - 11905: 0xF2EA,
- 34624 - 11905: 0xCE58,
- 34625 - 11905: 0xCE59,
- 34626 - 11905: 0xCE5A,
- 34627 - 11905: 0xCE5B,
- 34628 - 11905: 0xCE5C,
- 34629 - 11905: 0xCE5D,
- 34630 - 11905: 0xCE5E,
- 34631 - 11905: 0xD3AC,
- 34632 - 11905: 0xF2E5,
- 34633 - 11905: 0xB2F5,
- 34634 - 11905: 0xCE5F,
- 34635 - 11905: 0xCE60,
- 34636 - 11905: 0xF2F2,
- 34637 - 11905: 0xCE61,
- 34638 - 11905: 0xD0AB,
- 34639 - 11905: 0xCE62,
- 34640 - 11905: 0xCE63,
- 34641 - 11905: 0xCE64,
- 34642 - 11905: 0xCE65,
- 34643 - 11905: 0xF2F5,
- 34644 - 11905: 0xCE66,
- 34645 - 11905: 0xCE67,
- 34646 - 11905: 0xCE68,
- 34647 - 11905: 0xBBC8,
- 34648 - 11905: 0xCE69,
- 34649 - 11905: 0xF2F9,
- 34650 - 11905: 0xCE6A,
- 34651 - 11905: 0xCE6B,
- 34652 - 11905: 0xCE6C,
- 34653 - 11905: 0xCE6D,
- 34654 - 11905: 0xCE6E,
- 34655 - 11905: 0xCE6F,
- 34656 - 11905: 0xF2F0,
- 34657 - 11905: 0xCE70,
- 34658 - 11905: 0xCE71,
- 34659 - 11905: 0xF2F6,
- 34660 - 11905: 0xF2F8,
- 34661 - 11905: 0xF2FA,
- 34662 - 11905: 0xCE72,
- 34663 - 11905: 0xCE73,
- 34664 - 11905: 0xCE74,
- 34665 - 11905: 0xCE75,
- 34666 - 11905: 0xCE76,
- 34667 - 11905: 0xCE77,
- 34668 - 11905: 0xCE78,
- 34669 - 11905: 0xCE79,
- 34670 - 11905: 0xF2F3,
- 34671 - 11905: 0xCE7A,
- 34672 - 11905: 0xF2F1,
- 34673 - 11905: 0xCE7B,
- 34674 - 11905: 0xCE7C,
- 34675 - 11905: 0xCE7D,
- 34676 - 11905: 0xBAFB,
- 34677 - 11905: 0xCE7E,
- 34678 - 11905: 0xB5FB,
- 34679 - 11905: 0xCE80,
- 34680 - 11905: 0xCE81,
- 34681 - 11905: 0xCE82,
- 34682 - 11905: 0xCE83,
- 34683 - 11905: 0xF2EF,
- 34684 - 11905: 0xF2F7,
- 34685 - 11905: 0xF2ED,
- 34686 - 11905: 0xF2EE,
- 34687 - 11905: 0xCE84,
- 34688 - 11905: 0xCE85,
- 34689 - 11905: 0xCE86,
- 34690 - 11905: 0xF2EB,
- 34691 - 11905: 0xF3A6,
- 34692 - 11905: 0xCE87,
- 34693 - 11905: 0xF3A3,
- 34694 - 11905: 0xCE88,
- 34695 - 11905: 0xCE89,
- 34696 - 11905: 0xF3A2,
- 34697 - 11905: 0xCE8A,
- 34698 - 11905: 0xCE8B,
- 34699 - 11905: 0xF2F4,
- 34700 - 11905: 0xCE8C,
- 34701 - 11905: 0xC8DA,
- 34702 - 11905: 0xCE8D,
- 34703 - 11905: 0xCE8E,
- 34704 - 11905: 0xCE8F,
- 34705 - 11905: 0xCE90,
- 34706 - 11905: 0xCE91,
- 34707 - 11905: 0xF2FB,
- 34708 - 11905: 0xCE92,
- 34709 - 11905: 0xCE93,
- 34710 - 11905: 0xCE94,
- 34711 - 11905: 0xF3A5,
- 34712 - 11905: 0xCE95,
- 34713 - 11905: 0xCE96,
- 34714 - 11905: 0xCE97,
- 34715 - 11905: 0xCE98,
- 34716 - 11905: 0xCE99,
- 34717 - 11905: 0xCE9A,
- 34718 - 11905: 0xCE9B,
- 34719 - 11905: 0xC3F8,
- 34720 - 11905: 0xCE9C,
- 34721 - 11905: 0xCE9D,
- 34722 - 11905: 0xCE9E,
- 34723 - 11905: 0xCE9F,
- 34724 - 11905: 0xCEA0,
- 34725 - 11905: 0xCF40,
- 34726 - 11905: 0xCF41,
- 34727 - 11905: 0xCF42,
- 34728 - 11905: 0xF2FD,
- 34729 - 11905: 0xCF43,
- 34730 - 11905: 0xCF44,
- 34731 - 11905: 0xF3A7,
- 34732 - 11905: 0xF3A9,
- 34733 - 11905: 0xF3A4,
- 34734 - 11905: 0xCF45,
- 34735 - 11905: 0xF2FC,
- 34736 - 11905: 0xCF46,
- 34737 - 11905: 0xCF47,
- 34738 - 11905: 0xCF48,
- 34739 - 11905: 0xF3AB,
- 34740 - 11905: 0xCF49,
- 34741 - 11905: 0xF3AA,
- 34742 - 11905: 0xCF4A,
- 34743 - 11905: 0xCF4B,
- 34744 - 11905: 0xCF4C,
- 34745 - 11905: 0xCF4D,
- 34746 - 11905: 0xC2DD,
- 34747 - 11905: 0xCF4E,
- 34748 - 11905: 0xCF4F,
- 34749 - 11905: 0xF3AE,
- 34750 - 11905: 0xCF50,
- 34751 - 11905: 0xCF51,
- 34752 - 11905: 0xF3B0,
- 34753 - 11905: 0xCF52,
- 34754 - 11905: 0xCF53,
- 34755 - 11905: 0xCF54,
- 34756 - 11905: 0xCF55,
- 34757 - 11905: 0xCF56,
- 34758 - 11905: 0xF3A1,
- 34759 - 11905: 0xCF57,
- 34760 - 11905: 0xCF58,
- 34761 - 11905: 0xCF59,
- 34762 - 11905: 0xF3B1,
- 34763 - 11905: 0xF3AC,
- 34764 - 11905: 0xCF5A,
- 34765 - 11905: 0xCF5B,
- 34766 - 11905: 0xCF5C,
- 34767 - 11905: 0xCF5D,
- 34768 - 11905: 0xCF5E,
- 34769 - 11905: 0xF3AF,
- 34770 - 11905: 0xF2FE,
- 34771 - 11905: 0xF3AD,
- 34772 - 11905: 0xCF5F,
- 34773 - 11905: 0xCF60,
- 34774 - 11905: 0xCF61,
- 34775 - 11905: 0xCF62,
- 34776 - 11905: 0xCF63,
- 34777 - 11905: 0xCF64,
- 34778 - 11905: 0xCF65,
- 34779 - 11905: 0xF3B2,
- 34780 - 11905: 0xCF66,
- 34781 - 11905: 0xCF67,
- 34782 - 11905: 0xCF68,
- 34783 - 11905: 0xCF69,
- 34784 - 11905: 0xF3B4,
- 34785 - 11905: 0xCF6A,
- 34786 - 11905: 0xCF6B,
- 34787 - 11905: 0xCF6C,
- 34788 - 11905: 0xCF6D,
- 34789 - 11905: 0xF3A8,
- 34790 - 11905: 0xCF6E,
- 34791 - 11905: 0xCF6F,
- 34792 - 11905: 0xCF70,
- 34793 - 11905: 0xCF71,
- 34794 - 11905: 0xF3B3,
- 34795 - 11905: 0xCF72,
- 34796 - 11905: 0xCF73,
- 34797 - 11905: 0xCF74,
- 34798 - 11905: 0xF3B5,
- 34799 - 11905: 0xCF75,
- 34800 - 11905: 0xCF76,
- 34801 - 11905: 0xCF77,
- 34802 - 11905: 0xCF78,
- 34803 - 11905: 0xCF79,
- 34804 - 11905: 0xCF7A,
- 34805 - 11905: 0xCF7B,
- 34806 - 11905: 0xCF7C,
- 34807 - 11905: 0xCF7D,
- 34808 - 11905: 0xCF7E,
- 34809 - 11905: 0xD0B7,
- 34810 - 11905: 0xCF80,
- 34811 - 11905: 0xCF81,
- 34812 - 11905: 0xCF82,
- 34813 - 11905: 0xCF83,
- 34814 - 11905: 0xF3B8,
- 34815 - 11905: 0xCF84,
- 34816 - 11905: 0xCF85,
- 34817 - 11905: 0xCF86,
- 34818 - 11905: 0xCF87,
- 34819 - 11905: 0xD9F9,
- 34820 - 11905: 0xCF88,
- 34821 - 11905: 0xCF89,
- 34822 - 11905: 0xCF8A,
- 34823 - 11905: 0xCF8B,
- 34824 - 11905: 0xCF8C,
- 34825 - 11905: 0xCF8D,
- 34826 - 11905: 0xF3B9,
- 34827 - 11905: 0xCF8E,
- 34828 - 11905: 0xCF8F,
- 34829 - 11905: 0xCF90,
- 34830 - 11905: 0xCF91,
- 34831 - 11905: 0xCF92,
- 34832 - 11905: 0xCF93,
- 34833 - 11905: 0xCF94,
- 34834 - 11905: 0xCF95,
- 34835 - 11905: 0xF3B7,
- 34836 - 11905: 0xCF96,
- 34837 - 11905: 0xC8E4,
- 34838 - 11905: 0xF3B6,
- 34839 - 11905: 0xCF97,
- 34840 - 11905: 0xCF98,
- 34841 - 11905: 0xCF99,
- 34842 - 11905: 0xCF9A,
- 34843 - 11905: 0xF3BA,
- 34844 - 11905: 0xCF9B,
- 34845 - 11905: 0xCF9C,
- 34846 - 11905: 0xCF9D,
- 34847 - 11905: 0xCF9E,
- 34848 - 11905: 0xCF9F,
- 34849 - 11905: 0xF3BB,
- 34850 - 11905: 0xB4C0,
- 34851 - 11905: 0xCFA0,
- 34852 - 11905: 0xD040,
- 34853 - 11905: 0xD041,
- 34854 - 11905: 0xD042,
- 34855 - 11905: 0xD043,
- 34856 - 11905: 0xD044,
- 34857 - 11905: 0xD045,
- 34858 - 11905: 0xD046,
- 34859 - 11905: 0xD047,
- 34860 - 11905: 0xD048,
- 34861 - 11905: 0xD049,
- 34862 - 11905: 0xD04A,
- 34863 - 11905: 0xD04B,
- 34864 - 11905: 0xD04C,
- 34865 - 11905: 0xD04D,
- 34866 - 11905: 0xEEC3,
- 34867 - 11905: 0xD04E,
- 34868 - 11905: 0xD04F,
- 34869 - 11905: 0xD050,
- 34870 - 11905: 0xD051,
- 34871 - 11905: 0xD052,
- 34872 - 11905: 0xD053,
- 34873 - 11905: 0xF3BC,
- 34874 - 11905: 0xD054,
- 34875 - 11905: 0xD055,
- 34876 - 11905: 0xF3BD,
- 34877 - 11905: 0xD056,
- 34878 - 11905: 0xD057,
- 34879 - 11905: 0xD058,
- 34880 - 11905: 0xD1AA,
- 34881 - 11905: 0xD059,
- 34882 - 11905: 0xD05A,
- 34883 - 11905: 0xD05B,
- 34884 - 11905: 0xF4AC,
- 34885 - 11905: 0xD0C6,
- 34886 - 11905: 0xD05C,
- 34887 - 11905: 0xD05D,
- 34888 - 11905: 0xD05E,
- 34889 - 11905: 0xD05F,
- 34890 - 11905: 0xD060,
- 34891 - 11905: 0xD061,
- 34892 - 11905: 0xD0D0,
- 34893 - 11905: 0xD1DC,
- 34894 - 11905: 0xD062,
- 34895 - 11905: 0xD063,
- 34896 - 11905: 0xD064,
- 34897 - 11905: 0xD065,
- 34898 - 11905: 0xD066,
- 34899 - 11905: 0xD067,
- 34900 - 11905: 0xCFCE,
- 34901 - 11905: 0xD068,
- 34902 - 11905: 0xD069,
- 34903 - 11905: 0xBDD6,
- 34904 - 11905: 0xD06A,
- 34905 - 11905: 0xD1C3,
- 34906 - 11905: 0xD06B,
- 34907 - 11905: 0xD06C,
- 34908 - 11905: 0xD06D,
- 34909 - 11905: 0xD06E,
- 34910 - 11905: 0xD06F,
- 34911 - 11905: 0xD070,
- 34912 - 11905: 0xD071,
- 34913 - 11905: 0xBAE2,
- 34914 - 11905: 0xE1E9,
- 34915 - 11905: 0xD2C2,
- 34916 - 11905: 0xF1C2,
- 34917 - 11905: 0xB2B9,
- 34918 - 11905: 0xD072,
- 34919 - 11905: 0xD073,
- 34920 - 11905: 0xB1ED,
- 34921 - 11905: 0xF1C3,
- 34922 - 11905: 0xD074,
- 34923 - 11905: 0xC9C0,
- 34924 - 11905: 0xB3C4,
- 34925 - 11905: 0xD075,
- 34926 - 11905: 0xD9F2,
- 34927 - 11905: 0xD076,
- 34928 - 11905: 0xCBA5,
- 34929 - 11905: 0xD077,
- 34930 - 11905: 0xF1C4,
- 34931 - 11905: 0xD078,
- 34932 - 11905: 0xD079,
- 34933 - 11905: 0xD07A,
- 34934 - 11905: 0xD07B,
- 34935 - 11905: 0xD6D4,
- 34936 - 11905: 0xD07C,
- 34937 - 11905: 0xD07D,
- 34938 - 11905: 0xD07E,
- 34939 - 11905: 0xD080,
- 34940 - 11905: 0xD081,
- 34941 - 11905: 0xF1C5,
- 34942 - 11905: 0xF4C0,
- 34943 - 11905: 0xF1C6,
- 34944 - 11905: 0xD082,
- 34945 - 11905: 0xD4AC,
- 34946 - 11905: 0xF1C7,
- 34947 - 11905: 0xD083,
- 34948 - 11905: 0xB0C0,
- 34949 - 11905: 0xF4C1,
- 34950 - 11905: 0xD084,
- 34951 - 11905: 0xD085,
- 34952 - 11905: 0xF4C2,
- 34953 - 11905: 0xD086,
- 34954 - 11905: 0xD087,
- 34955 - 11905: 0xB4FC,
- 34956 - 11905: 0xD088,
- 34957 - 11905: 0xC5DB,
- 34958 - 11905: 0xD089,
- 34959 - 11905: 0xD08A,
- 34960 - 11905: 0xD08B,
- 34961 - 11905: 0xD08C,
- 34962 - 11905: 0xCCBB,
- 34963 - 11905: 0xD08D,
- 34964 - 11905: 0xD08E,
- 34965 - 11905: 0xD08F,
- 34966 - 11905: 0xD0E4,
- 34967 - 11905: 0xD090,
- 34968 - 11905: 0xD091,
- 34969 - 11905: 0xD092,
- 34970 - 11905: 0xD093,
- 34971 - 11905: 0xD094,
- 34972 - 11905: 0xCDE0,
- 34973 - 11905: 0xD095,
- 34974 - 11905: 0xD096,
- 34975 - 11905: 0xD097,
- 34976 - 11905: 0xD098,
- 34977 - 11905: 0xD099,
- 34978 - 11905: 0xF1C8,
- 34979 - 11905: 0xD09A,
- 34980 - 11905: 0xD9F3,
- 34981 - 11905: 0xD09B,
- 34982 - 11905: 0xD09C,
- 34983 - 11905: 0xD09D,
- 34984 - 11905: 0xD09E,
- 34985 - 11905: 0xD09F,
- 34986 - 11905: 0xD0A0,
- 34987 - 11905: 0xB1BB,
- 34988 - 11905: 0xD140,
- 34989 - 11905: 0xCFAE,
- 34990 - 11905: 0xD141,
- 34991 - 11905: 0xD142,
- 34992 - 11905: 0xD143,
- 34993 - 11905: 0xB8A4,
- 34994 - 11905: 0xD144,
- 34995 - 11905: 0xD145,
- 34996 - 11905: 0xD146,
- 34997 - 11905: 0xD147,
- 34998 - 11905: 0xD148,
- 34999 - 11905: 0xF1CA,
- 35000 - 11905: 0xD149,
- 35001 - 11905: 0xD14A,
- 35002 - 11905: 0xD14B,
- 35003 - 11905: 0xD14C,
- 35004 - 11905: 0xF1CB,
- 35005 - 11905: 0xD14D,
- 35006 - 11905: 0xD14E,
- 35007 - 11905: 0xD14F,
- 35008 - 11905: 0xD150,
- 35009 - 11905: 0xB2C3,
- 35010 - 11905: 0xC1D1,
- 35011 - 11905: 0xD151,
- 35012 - 11905: 0xD152,
- 35013 - 11905: 0xD7B0,
- 35014 - 11905: 0xF1C9,
- 35015 - 11905: 0xD153,
- 35016 - 11905: 0xD154,
- 35017 - 11905: 0xF1CC,
- 35018 - 11905: 0xD155,
- 35019 - 11905: 0xD156,
- 35020 - 11905: 0xD157,
- 35021 - 11905: 0xD158,
- 35022 - 11905: 0xF1CE,
- 35023 - 11905: 0xD159,
- 35024 - 11905: 0xD15A,
- 35025 - 11905: 0xD15B,
- 35026 - 11905: 0xD9F6,
- 35027 - 11905: 0xD15C,
- 35028 - 11905: 0xD2E1,
- 35029 - 11905: 0xD4A3,
- 35030 - 11905: 0xD15D,
- 35031 - 11905: 0xD15E,
- 35032 - 11905: 0xF4C3,
- 35033 - 11905: 0xC8B9,
- 35034 - 11905: 0xD15F,
- 35035 - 11905: 0xD160,
- 35036 - 11905: 0xD161,
- 35037 - 11905: 0xD162,
- 35038 - 11905: 0xD163,
- 35039 - 11905: 0xF4C4,
- 35040 - 11905: 0xD164,
- 35041 - 11905: 0xD165,
- 35042 - 11905: 0xF1CD,
- 35043 - 11905: 0xF1CF,
- 35044 - 11905: 0xBFE3,
- 35045 - 11905: 0xF1D0,
- 35046 - 11905: 0xD166,
- 35047 - 11905: 0xD167,
- 35048 - 11905: 0xF1D4,
- 35049 - 11905: 0xD168,
- 35050 - 11905: 0xD169,
- 35051 - 11905: 0xD16A,
- 35052 - 11905: 0xD16B,
- 35053 - 11905: 0xD16C,
- 35054 - 11905: 0xD16D,
- 35055 - 11905: 0xD16E,
- 35056 - 11905: 0xF1D6,
- 35057 - 11905: 0xF1D1,
- 35058 - 11905: 0xD16F,
- 35059 - 11905: 0xC9D1,
- 35060 - 11905: 0xC5E1,
- 35061 - 11905: 0xD170,
- 35062 - 11905: 0xD171,
- 35063 - 11905: 0xD172,
- 35064 - 11905: 0xC2E3,
- 35065 - 11905: 0xB9FC,
- 35066 - 11905: 0xD173,
- 35067 - 11905: 0xD174,
- 35068 - 11905: 0xF1D3,
- 35069 - 11905: 0xD175,
- 35070 - 11905: 0xF1D5,
- 35071 - 11905: 0xD176,
- 35072 - 11905: 0xD177,
- 35073 - 11905: 0xD178,
- 35074 - 11905: 0xB9D3,
- 35075 - 11905: 0xD179,
- 35076 - 11905: 0xD17A,
- 35077 - 11905: 0xD17B,
- 35078 - 11905: 0xD17C,
- 35079 - 11905: 0xD17D,
- 35080 - 11905: 0xD17E,
- 35081 - 11905: 0xD180,
- 35082 - 11905: 0xF1DB,
- 35083 - 11905: 0xD181,
- 35084 - 11905: 0xD182,
- 35085 - 11905: 0xD183,
- 35086 - 11905: 0xD184,
- 35087 - 11905: 0xD185,
- 35088 - 11905: 0xBAD6,
- 35089 - 11905: 0xD186,
- 35090 - 11905: 0xB0FD,
- 35091 - 11905: 0xF1D9,
- 35092 - 11905: 0xD187,
- 35093 - 11905: 0xD188,
- 35094 - 11905: 0xD189,
- 35095 - 11905: 0xD18A,
- 35096 - 11905: 0xD18B,
- 35097 - 11905: 0xF1D8,
- 35098 - 11905: 0xF1D2,
- 35099 - 11905: 0xF1DA,
- 35100 - 11905: 0xD18C,
- 35101 - 11905: 0xD18D,
- 35102 - 11905: 0xD18E,
- 35103 - 11905: 0xD18F,
- 35104 - 11905: 0xD190,
- 35105 - 11905: 0xF1D7,
- 35106 - 11905: 0xD191,
- 35107 - 11905: 0xD192,
- 35108 - 11905: 0xD193,
- 35109 - 11905: 0xC8EC,
- 35110 - 11905: 0xD194,
- 35111 - 11905: 0xD195,
- 35112 - 11905: 0xD196,
- 35113 - 11905: 0xD197,
- 35114 - 11905: 0xCDCA,
- 35115 - 11905: 0xF1DD,
- 35116 - 11905: 0xD198,
- 35117 - 11905: 0xD199,
- 35118 - 11905: 0xD19A,
- 35119 - 11905: 0xD19B,
- 35120 - 11905: 0xE5BD,
- 35121 - 11905: 0xD19C,
- 35122 - 11905: 0xD19D,
- 35123 - 11905: 0xD19E,
- 35124 - 11905: 0xF1DC,
- 35125 - 11905: 0xD19F,
- 35126 - 11905: 0xF1DE,
- 35127 - 11905: 0xD1A0,
- 35128 - 11905: 0xD240,
- 35129 - 11905: 0xD241,
- 35130 - 11905: 0xD242,
- 35131 - 11905: 0xD243,
- 35132 - 11905: 0xD244,
- 35133 - 11905: 0xD245,
- 35134 - 11905: 0xD246,
- 35135 - 11905: 0xD247,
- 35136 - 11905: 0xD248,
- 35137 - 11905: 0xF1DF,
- 35138 - 11905: 0xD249,
- 35139 - 11905: 0xD24A,
- 35140 - 11905: 0xCFE5,
- 35141 - 11905: 0xD24B,
- 35142 - 11905: 0xD24C,
- 35143 - 11905: 0xD24D,
- 35144 - 11905: 0xD24E,
- 35145 - 11905: 0xD24F,
- 35146 - 11905: 0xD250,
- 35147 - 11905: 0xD251,
- 35148 - 11905: 0xD252,
- 35149 - 11905: 0xD253,
- 35150 - 11905: 0xD254,
- 35151 - 11905: 0xD255,
- 35152 - 11905: 0xD256,
- 35153 - 11905: 0xD257,
- 35154 - 11905: 0xD258,
- 35155 - 11905: 0xD259,
- 35156 - 11905: 0xD25A,
- 35157 - 11905: 0xD25B,
- 35158 - 11905: 0xD25C,
- 35159 - 11905: 0xD25D,
- 35160 - 11905: 0xD25E,
- 35161 - 11905: 0xD25F,
- 35162 - 11905: 0xD260,
- 35163 - 11905: 0xD261,
- 35164 - 11905: 0xD262,
- 35165 - 11905: 0xD263,
- 35166 - 11905: 0xF4C5,
- 35167 - 11905: 0xBDF3,
- 35168 - 11905: 0xD264,
- 35169 - 11905: 0xD265,
- 35170 - 11905: 0xD266,
- 35171 - 11905: 0xD267,
- 35172 - 11905: 0xD268,
- 35173 - 11905: 0xD269,
- 35174 - 11905: 0xF1E0,
- 35175 - 11905: 0xD26A,
- 35176 - 11905: 0xD26B,
- 35177 - 11905: 0xD26C,
- 35178 - 11905: 0xD26D,
- 35179 - 11905: 0xD26E,
- 35180 - 11905: 0xD26F,
- 35181 - 11905: 0xD270,
- 35182 - 11905: 0xD271,
- 35183 - 11905: 0xD272,
- 35184 - 11905: 0xD273,
- 35185 - 11905: 0xD274,
- 35186 - 11905: 0xD275,
- 35187 - 11905: 0xD276,
- 35188 - 11905: 0xD277,
- 35189 - 11905: 0xD278,
- 35190 - 11905: 0xD279,
- 35191 - 11905: 0xD27A,
- 35192 - 11905: 0xD27B,
- 35193 - 11905: 0xD27C,
- 35194 - 11905: 0xD27D,
- 35195 - 11905: 0xF1E1,
- 35196 - 11905: 0xD27E,
- 35197 - 11905: 0xD280,
- 35198 - 11905: 0xD281,
- 35199 - 11905: 0xCEF7,
- 35200 - 11905: 0xD282,
- 35201 - 11905: 0xD2AA,
- 35202 - 11905: 0xD283,
- 35203 - 11905: 0xF1FB,
- 35204 - 11905: 0xD284,
- 35205 - 11905: 0xD285,
- 35206 - 11905: 0xB8B2,
- 35207 - 11905: 0xD286,
- 35208 - 11905: 0xD287,
- 35209 - 11905: 0xD288,
- 35210 - 11905: 0xD289,
- 35211 - 11905: 0xD28A,
- 35212 - 11905: 0xD28B,
- 35213 - 11905: 0xD28C,
- 35214 - 11905: 0xD28D,
- 35215 - 11905: 0xD28E,
- 35216 - 11905: 0xD28F,
- 35217 - 11905: 0xD290,
- 35218 - 11905: 0xD291,
- 35219 - 11905: 0xD292,
- 35220 - 11905: 0xD293,
- 35221 - 11905: 0xD294,
- 35222 - 11905: 0xD295,
- 35223 - 11905: 0xD296,
- 35224 - 11905: 0xD297,
- 35225 - 11905: 0xD298,
- 35226 - 11905: 0xD299,
- 35227 - 11905: 0xD29A,
- 35228 - 11905: 0xD29B,
- 35229 - 11905: 0xD29C,
- 35230 - 11905: 0xD29D,
- 35231 - 11905: 0xD29E,
- 35232 - 11905: 0xD29F,
- 35233 - 11905: 0xD2A0,
- 35234 - 11905: 0xD340,
- 35235 - 11905: 0xD341,
- 35236 - 11905: 0xD342,
- 35237 - 11905: 0xD343,
- 35238 - 11905: 0xD344,
- 35239 - 11905: 0xD345,
- 35240 - 11905: 0xD346,
- 35241 - 11905: 0xD347,
- 35242 - 11905: 0xD348,
- 35243 - 11905: 0xD349,
- 35244 - 11905: 0xD34A,
- 35245 - 11905: 0xD34B,
- 35246 - 11905: 0xD34C,
- 35247 - 11905: 0xD34D,
- 35248 - 11905: 0xD34E,
- 35249 - 11905: 0xD34F,
- 35250 - 11905: 0xD350,
- 35251 - 11905: 0xD351,
- 35252 - 11905: 0xD352,
- 35253 - 11905: 0xD353,
- 35254 - 11905: 0xD354,
- 35255 - 11905: 0xD355,
- 35256 - 11905: 0xD356,
- 35257 - 11905: 0xD357,
- 35258 - 11905: 0xD358,
- 35259 - 11905: 0xD359,
- 35260 - 11905: 0xD35A,
- 35261 - 11905: 0xD35B,
- 35262 - 11905: 0xD35C,
- 35263 - 11905: 0xD35D,
- 35264 - 11905: 0xD35E,
- 35265 - 11905: 0xBCFB,
- 35266 - 11905: 0xB9DB,
- 35267 - 11905: 0xD35F,
- 35268 - 11905: 0xB9E6,
- 35269 - 11905: 0xC3D9,
- 35270 - 11905: 0xCAD3,
- 35271 - 11905: 0xEAE8,
- 35272 - 11905: 0xC0C0,
- 35273 - 11905: 0xBEF5,
- 35274 - 11905: 0xEAE9,
- 35275 - 11905: 0xEAEA,
- 35276 - 11905: 0xEAEB,
- 35277 - 11905: 0xD360,
- 35278 - 11905: 0xEAEC,
- 35279 - 11905: 0xEAED,
- 35280 - 11905: 0xEAEE,
- 35281 - 11905: 0xEAEF,
- 35282 - 11905: 0xBDC7,
- 35283 - 11905: 0xD361,
- 35284 - 11905: 0xD362,
- 35285 - 11905: 0xD363,
- 35286 - 11905: 0xF5FB,
- 35287 - 11905: 0xD364,
- 35288 - 11905: 0xD365,
- 35289 - 11905: 0xD366,
- 35290 - 11905: 0xF5FD,
- 35291 - 11905: 0xD367,
- 35292 - 11905: 0xF5FE,
- 35293 - 11905: 0xD368,
- 35294 - 11905: 0xF5FC,
- 35295 - 11905: 0xD369,
- 35296 - 11905: 0xD36A,
- 35297 - 11905: 0xD36B,
- 35298 - 11905: 0xD36C,
- 35299 - 11905: 0xBDE2,
- 35300 - 11905: 0xD36D,
- 35301 - 11905: 0xF6A1,
- 35302 - 11905: 0xB4A5,
- 35303 - 11905: 0xD36E,
- 35304 - 11905: 0xD36F,
- 35305 - 11905: 0xD370,
- 35306 - 11905: 0xD371,
- 35307 - 11905: 0xF6A2,
- 35308 - 11905: 0xD372,
- 35309 - 11905: 0xD373,
- 35310 - 11905: 0xD374,
- 35311 - 11905: 0xF6A3,
- 35312 - 11905: 0xD375,
- 35313 - 11905: 0xD376,
- 35314 - 11905: 0xD377,
- 35315 - 11905: 0xECB2,
- 35316 - 11905: 0xD378,
- 35317 - 11905: 0xD379,
- 35318 - 11905: 0xD37A,
- 35319 - 11905: 0xD37B,
- 35320 - 11905: 0xD37C,
- 35321 - 11905: 0xD37D,
- 35322 - 11905: 0xD37E,
- 35323 - 11905: 0xD380,
- 35324 - 11905: 0xD381,
- 35325 - 11905: 0xD382,
- 35326 - 11905: 0xD383,
- 35327 - 11905: 0xD384,
- 35328 - 11905: 0xD1D4,
- 35329 - 11905: 0xD385,
- 35330 - 11905: 0xD386,
- 35331 - 11905: 0xD387,
- 35332 - 11905: 0xD388,
- 35333 - 11905: 0xD389,
- 35334 - 11905: 0xD38A,
- 35335 - 11905: 0xD9EA,
- 35336 - 11905: 0xD38B,
- 35337 - 11905: 0xD38C,
- 35338 - 11905: 0xD38D,
- 35339 - 11905: 0xD38E,
- 35340 - 11905: 0xD38F,
- 35341 - 11905: 0xD390,
- 35342 - 11905: 0xD391,
- 35343 - 11905: 0xD392,
- 35344 - 11905: 0xD393,
- 35345 - 11905: 0xD394,
- 35346 - 11905: 0xD395,
- 35347 - 11905: 0xD396,
- 35348 - 11905: 0xD397,
- 35349 - 11905: 0xD398,
- 35350 - 11905: 0xD399,
- 35351 - 11905: 0xD39A,
- 35352 - 11905: 0xD39B,
- 35353 - 11905: 0xD39C,
- 35354 - 11905: 0xD39D,
- 35355 - 11905: 0xD39E,
- 35356 - 11905: 0xD39F,
- 35357 - 11905: 0xD3A0,
- 35358 - 11905: 0xD440,
- 35359 - 11905: 0xD441,
- 35360 - 11905: 0xD442,
- 35361 - 11905: 0xD443,
- 35362 - 11905: 0xD444,
- 35363 - 11905: 0xD445,
- 35364 - 11905: 0xD446,
- 35365 - 11905: 0xD447,
- 35366 - 11905: 0xD448,
- 35367 - 11905: 0xD449,
- 35368 - 11905: 0xD44A,
- 35369 - 11905: 0xD44B,
- 35370 - 11905: 0xD44C,
- 35371 - 11905: 0xD44D,
- 35372 - 11905: 0xD44E,
- 35373 - 11905: 0xD44F,
- 35374 - 11905: 0xD450,
- 35375 - 11905: 0xD451,
- 35376 - 11905: 0xD452,
- 35377 - 11905: 0xD453,
- 35378 - 11905: 0xD454,
- 35379 - 11905: 0xD455,
- 35380 - 11905: 0xD456,
- 35381 - 11905: 0xD457,
- 35382 - 11905: 0xD458,
- 35383 - 11905: 0xD459,
- 35384 - 11905: 0xD45A,
- 35385 - 11905: 0xD45B,
- 35386 - 11905: 0xD45C,
- 35387 - 11905: 0xD45D,
- 35388 - 11905: 0xD45E,
- 35389 - 11905: 0xD45F,
- 35390 - 11905: 0xF6A4,
- 35391 - 11905: 0xD460,
- 35392 - 11905: 0xD461,
- 35393 - 11905: 0xD462,
- 35394 - 11905: 0xD463,
- 35395 - 11905: 0xD464,
- 35396 - 11905: 0xD465,
- 35397 - 11905: 0xD466,
- 35398 - 11905: 0xD467,
- 35399 - 11905: 0xD468,
- 35400 - 11905: 0xEEBA,
- 35401 - 11905: 0xD469,
- 35402 - 11905: 0xD46A,
- 35403 - 11905: 0xD46B,
- 35404 - 11905: 0xD46C,
- 35405 - 11905: 0xD46D,
- 35406 - 11905: 0xD46E,
- 35407 - 11905: 0xD46F,
- 35408 - 11905: 0xD470,
- 35409 - 11905: 0xD471,
- 35410 - 11905: 0xD472,
- 35411 - 11905: 0xD473,
- 35412 - 11905: 0xD474,
- 35413 - 11905: 0xD475,
- 35414 - 11905: 0xD476,
- 35415 - 11905: 0xD477,
- 35416 - 11905: 0xD478,
- 35417 - 11905: 0xD479,
- 35418 - 11905: 0xD47A,
- 35419 - 11905: 0xD47B,
- 35420 - 11905: 0xD47C,
- 35421 - 11905: 0xD47D,
- 35422 - 11905: 0xD47E,
- 35423 - 11905: 0xD480,
- 35424 - 11905: 0xD481,
- 35425 - 11905: 0xD482,
- 35426 - 11905: 0xD483,
- 35427 - 11905: 0xD484,
- 35428 - 11905: 0xD485,
- 35429 - 11905: 0xD486,
- 35430 - 11905: 0xD487,
- 35431 - 11905: 0xD488,
- 35432 - 11905: 0xD489,
- 35433 - 11905: 0xD48A,
- 35434 - 11905: 0xD48B,
- 35435 - 11905: 0xD48C,
- 35436 - 11905: 0xD48D,
- 35437 - 11905: 0xD48E,
- 35438 - 11905: 0xD48F,
- 35439 - 11905: 0xD490,
- 35440 - 11905: 0xD491,
- 35441 - 11905: 0xD492,
- 35442 - 11905: 0xD493,
- 35443 - 11905: 0xD494,
- 35444 - 11905: 0xD495,
- 35445 - 11905: 0xD496,
- 35446 - 11905: 0xD497,
- 35447 - 11905: 0xD498,
- 35448 - 11905: 0xD499,
- 35449 - 11905: 0xD5B2,
- 35450 - 11905: 0xD49A,
- 35451 - 11905: 0xD49B,
- 35452 - 11905: 0xD49C,
- 35453 - 11905: 0xD49D,
- 35454 - 11905: 0xD49E,
- 35455 - 11905: 0xD49F,
- 35456 - 11905: 0xD4A0,
- 35457 - 11905: 0xD540,
- 35458 - 11905: 0xD541,
- 35459 - 11905: 0xD542,
- 35460 - 11905: 0xD543,
- 35461 - 11905: 0xD544,
- 35462 - 11905: 0xD545,
- 35463 - 11905: 0xD546,
- 35464 - 11905: 0xD547,
- 35465 - 11905: 0xD3FE,
- 35466 - 11905: 0xCCDC,
- 35467 - 11905: 0xD548,
- 35468 - 11905: 0xD549,
- 35469 - 11905: 0xD54A,
- 35470 - 11905: 0xD54B,
- 35471 - 11905: 0xD54C,
- 35472 - 11905: 0xD54D,
- 35473 - 11905: 0xD54E,
- 35474 - 11905: 0xD54F,
- 35475 - 11905: 0xCAC4,
- 35476 - 11905: 0xD550,
- 35477 - 11905: 0xD551,
- 35478 - 11905: 0xD552,
- 35479 - 11905: 0xD553,
- 35480 - 11905: 0xD554,
- 35481 - 11905: 0xD555,
- 35482 - 11905: 0xD556,
- 35483 - 11905: 0xD557,
- 35484 - 11905: 0xD558,
- 35485 - 11905: 0xD559,
- 35486 - 11905: 0xD55A,
- 35487 - 11905: 0xD55B,
- 35488 - 11905: 0xD55C,
- 35489 - 11905: 0xD55D,
- 35490 - 11905: 0xD55E,
- 35491 - 11905: 0xD55F,
- 35492 - 11905: 0xD560,
- 35493 - 11905: 0xD561,
- 35494 - 11905: 0xD562,
- 35495 - 11905: 0xD563,
- 35496 - 11905: 0xD564,
- 35497 - 11905: 0xD565,
- 35498 - 11905: 0xD566,
- 35499 - 11905: 0xD567,
- 35500 - 11905: 0xD568,
- 35501 - 11905: 0xD569,
- 35502 - 11905: 0xD56A,
- 35503 - 11905: 0xD56B,
- 35504 - 11905: 0xD56C,
- 35505 - 11905: 0xD56D,
- 35506 - 11905: 0xD56E,
- 35507 - 11905: 0xD56F,
- 35508 - 11905: 0xD570,
- 35509 - 11905: 0xD571,
- 35510 - 11905: 0xD572,
- 35511 - 11905: 0xD573,
- 35512 - 11905: 0xD574,
- 35513 - 11905: 0xD575,
- 35514 - 11905: 0xD576,
- 35515 - 11905: 0xD577,
- 35516 - 11905: 0xD578,
- 35517 - 11905: 0xD579,
- 35518 - 11905: 0xD57A,
- 35519 - 11905: 0xD57B,
- 35520 - 11905: 0xD57C,
- 35521 - 11905: 0xD57D,
- 35522 - 11905: 0xD57E,
- 35523 - 11905: 0xD580,
- 35524 - 11905: 0xD581,
- 35525 - 11905: 0xD582,
- 35526 - 11905: 0xD583,
- 35527 - 11905: 0xD584,
- 35528 - 11905: 0xD585,
- 35529 - 11905: 0xD586,
- 35530 - 11905: 0xD587,
- 35531 - 11905: 0xD588,
- 35532 - 11905: 0xD589,
- 35533 - 11905: 0xD58A,
- 35534 - 11905: 0xD58B,
- 35535 - 11905: 0xD58C,
- 35536 - 11905: 0xD58D,
- 35537 - 11905: 0xD58E,
- 35538 - 11905: 0xD58F,
- 35539 - 11905: 0xD590,
- 35540 - 11905: 0xD591,
- 35541 - 11905: 0xD592,
- 35542 - 11905: 0xD593,
- 35543 - 11905: 0xD594,
- 35544 - 11905: 0xD595,
- 35545 - 11905: 0xD596,
- 35546 - 11905: 0xD597,
- 35547 - 11905: 0xD598,
- 35548 - 11905: 0xD599,
- 35549 - 11905: 0xD59A,
- 35550 - 11905: 0xD59B,
- 35551 - 11905: 0xD59C,
- 35552 - 11905: 0xD59D,
- 35553 - 11905: 0xD59E,
- 35554 - 11905: 0xD59F,
- 35555 - 11905: 0xD5A0,
- 35556 - 11905: 0xD640,
- 35557 - 11905: 0xD641,
- 35558 - 11905: 0xD642,
- 35559 - 11905: 0xD643,
- 35560 - 11905: 0xD644,
- 35561 - 11905: 0xD645,
- 35562 - 11905: 0xD646,
- 35563 - 11905: 0xD647,
- 35564 - 11905: 0xD648,
- 35565 - 11905: 0xD649,
- 35566 - 11905: 0xD64A,
- 35567 - 11905: 0xD64B,
- 35568 - 11905: 0xD64C,
- 35569 - 11905: 0xD64D,
- 35570 - 11905: 0xD64E,
- 35571 - 11905: 0xD64F,
- 35572 - 11905: 0xD650,
- 35573 - 11905: 0xD651,
- 35574 - 11905: 0xD652,
- 35575 - 11905: 0xD653,
- 35576 - 11905: 0xD654,
- 35577 - 11905: 0xD655,
- 35578 - 11905: 0xD656,
- 35579 - 11905: 0xD657,
- 35580 - 11905: 0xD658,
- 35581 - 11905: 0xD659,
- 35582 - 11905: 0xD65A,
- 35583 - 11905: 0xD65B,
- 35584 - 11905: 0xD65C,
- 35585 - 11905: 0xD65D,
- 35586 - 11905: 0xD65E,
- 35587 - 11905: 0xD65F,
- 35588 - 11905: 0xD660,
- 35589 - 11905: 0xD661,
- 35590 - 11905: 0xD662,
- 35591 - 11905: 0xE5C0,
- 35592 - 11905: 0xD663,
- 35593 - 11905: 0xD664,
- 35594 - 11905: 0xD665,
- 35595 - 11905: 0xD666,
- 35596 - 11905: 0xD667,
- 35597 - 11905: 0xD668,
- 35598 - 11905: 0xD669,
- 35599 - 11905: 0xD66A,
- 35600 - 11905: 0xD66B,
- 35601 - 11905: 0xD66C,
- 35602 - 11905: 0xD66D,
- 35603 - 11905: 0xD66E,
- 35604 - 11905: 0xD66F,
- 35605 - 11905: 0xD670,
- 35606 - 11905: 0xD671,
- 35607 - 11905: 0xD672,
- 35608 - 11905: 0xD673,
- 35609 - 11905: 0xD674,
- 35610 - 11905: 0xD675,
- 35611 - 11905: 0xD676,
- 35612 - 11905: 0xD677,
- 35613 - 11905: 0xD678,
- 35614 - 11905: 0xD679,
- 35615 - 11905: 0xD67A,
- 35616 - 11905: 0xD67B,
- 35617 - 11905: 0xD67C,
- 35618 - 11905: 0xD67D,
- 35619 - 11905: 0xD67E,
- 35620 - 11905: 0xD680,
- 35621 - 11905: 0xD681,
- 35622 - 11905: 0xF6A5,
- 35623 - 11905: 0xD682,
- 35624 - 11905: 0xD683,
- 35625 - 11905: 0xD684,
- 35626 - 11905: 0xD685,
- 35627 - 11905: 0xD686,
- 35628 - 11905: 0xD687,
- 35629 - 11905: 0xD688,
- 35630 - 11905: 0xD689,
- 35631 - 11905: 0xD68A,
- 35632 - 11905: 0xD68B,
- 35633 - 11905: 0xD68C,
- 35634 - 11905: 0xD68D,
- 35635 - 11905: 0xD68E,
- 35636 - 11905: 0xD68F,
- 35637 - 11905: 0xD690,
- 35638 - 11905: 0xD691,
- 35639 - 11905: 0xD692,
- 35640 - 11905: 0xD693,
- 35641 - 11905: 0xD694,
- 35642 - 11905: 0xD695,
- 35643 - 11905: 0xD696,
- 35644 - 11905: 0xD697,
- 35645 - 11905: 0xD698,
- 35646 - 11905: 0xD699,
- 35647 - 11905: 0xD69A,
- 35648 - 11905: 0xD69B,
- 35649 - 11905: 0xD69C,
- 35650 - 11905: 0xD69D,
- 35651 - 11905: 0xD69E,
- 35652 - 11905: 0xD69F,
- 35653 - 11905: 0xD6A0,
- 35654 - 11905: 0xD740,
- 35655 - 11905: 0xD741,
- 35656 - 11905: 0xD742,
- 35657 - 11905: 0xD743,
- 35658 - 11905: 0xD744,
- 35659 - 11905: 0xD745,
- 35660 - 11905: 0xD746,
- 35661 - 11905: 0xD747,
- 35662 - 11905: 0xD748,
- 35663 - 11905: 0xD749,
- 35664 - 11905: 0xD74A,
- 35665 - 11905: 0xD74B,
- 35666 - 11905: 0xD74C,
- 35667 - 11905: 0xD74D,
- 35668 - 11905: 0xD74E,
- 35669 - 11905: 0xD74F,
- 35670 - 11905: 0xD750,
- 35671 - 11905: 0xD751,
- 35672 - 11905: 0xD752,
- 35673 - 11905: 0xD753,
- 35674 - 11905: 0xD754,
- 35675 - 11905: 0xD755,
- 35676 - 11905: 0xD756,
- 35677 - 11905: 0xD757,
- 35678 - 11905: 0xD758,
- 35679 - 11905: 0xD759,
- 35680 - 11905: 0xD75A,
- 35681 - 11905: 0xD75B,
- 35682 - 11905: 0xD75C,
- 35683 - 11905: 0xD75D,
- 35684 - 11905: 0xD75E,
- 35685 - 11905: 0xD75F,
- 35686 - 11905: 0xBEAF,
- 35687 - 11905: 0xD760,
- 35688 - 11905: 0xD761,
- 35689 - 11905: 0xD762,
- 35690 - 11905: 0xD763,
- 35691 - 11905: 0xD764,
- 35692 - 11905: 0xC6A9,
- 35693 - 11905: 0xD765,
- 35694 - 11905: 0xD766,
- 35695 - 11905: 0xD767,
- 35696 - 11905: 0xD768,
- 35697 - 11905: 0xD769,
- 35698 - 11905: 0xD76A,
- 35699 - 11905: 0xD76B,
- 35700 - 11905: 0xD76C,
- 35701 - 11905: 0xD76D,
- 35702 - 11905: 0xD76E,
- 35703 - 11905: 0xD76F,
- 35704 - 11905: 0xD770,
- 35705 - 11905: 0xD771,
- 35706 - 11905: 0xD772,
- 35707 - 11905: 0xD773,
- 35708 - 11905: 0xD774,
- 35709 - 11905: 0xD775,
- 35710 - 11905: 0xD776,
- 35711 - 11905: 0xD777,
- 35712 - 11905: 0xD778,
- 35713 - 11905: 0xD779,
- 35714 - 11905: 0xD77A,
- 35715 - 11905: 0xD77B,
- 35716 - 11905: 0xD77C,
- 35717 - 11905: 0xD77D,
- 35718 - 11905: 0xD77E,
- 35719 - 11905: 0xD780,
- 35720 - 11905: 0xD781,
- 35721 - 11905: 0xD782,
- 35722 - 11905: 0xD783,
- 35723 - 11905: 0xD784,
- 35724 - 11905: 0xD785,
- 35725 - 11905: 0xD786,
- 35726 - 11905: 0xD787,
- 35727 - 11905: 0xD788,
- 35728 - 11905: 0xD789,
- 35729 - 11905: 0xD78A,
- 35730 - 11905: 0xD78B,
- 35731 - 11905: 0xD78C,
- 35732 - 11905: 0xD78D,
- 35733 - 11905: 0xD78E,
- 35734 - 11905: 0xD78F,
- 35735 - 11905: 0xD790,
- 35736 - 11905: 0xD791,
- 35737 - 11905: 0xD792,
- 35738 - 11905: 0xD793,
- 35739 - 11905: 0xD794,
- 35740 - 11905: 0xD795,
- 35741 - 11905: 0xD796,
- 35742 - 11905: 0xD797,
- 35743 - 11905: 0xD798,
- 35744 - 11905: 0xDAA5,
- 35745 - 11905: 0xBCC6,
- 35746 - 11905: 0xB6A9,
- 35747 - 11905: 0xB8BC,
- 35748 - 11905: 0xC8CF,
- 35749 - 11905: 0xBCA5,
- 35750 - 11905: 0xDAA6,
- 35751 - 11905: 0xDAA7,
- 35752 - 11905: 0xCCD6,
- 35753 - 11905: 0xC8C3,
- 35754 - 11905: 0xDAA8,
- 35755 - 11905: 0xC6FD,
- 35756 - 11905: 0xD799,
- 35757 - 11905: 0xD1B5,
- 35758 - 11905: 0xD2E9,
- 35759 - 11905: 0xD1B6,
- 35760 - 11905: 0xBCC7,
- 35761 - 11905: 0xD79A,
- 35762 - 11905: 0xBDB2,
- 35763 - 11905: 0xBBE4,
- 35764 - 11905: 0xDAA9,
- 35765 - 11905: 0xDAAA,
- 35766 - 11905: 0xD1C8,
- 35767 - 11905: 0xDAAB,
- 35768 - 11905: 0xD0ED,
- 35769 - 11905: 0xB6EF,
- 35770 - 11905: 0xC2DB,
- 35771 - 11905: 0xD79B,
- 35772 - 11905: 0xCBCF,
- 35773 - 11905: 0xB7ED,
- 35774 - 11905: 0xC9E8,
- 35775 - 11905: 0xB7C3,
- 35776 - 11905: 0xBEF7,
- 35777 - 11905: 0xD6A4,
- 35778 - 11905: 0xDAAC,
- 35779 - 11905: 0xDAAD,
- 35780 - 11905: 0xC6C0,
- 35781 - 11905: 0xD7E7,
- 35782 - 11905: 0xCAB6,
- 35783 - 11905: 0xD79C,
- 35784 - 11905: 0xD5A9,
- 35785 - 11905: 0xCBDF,
- 35786 - 11905: 0xD5EF,
- 35787 - 11905: 0xDAAE,
- 35788 - 11905: 0xD6DF,
- 35789 - 11905: 0xB4CA,
- 35790 - 11905: 0xDAB0,
- 35791 - 11905: 0xDAAF,
- 35792 - 11905: 0xD79D,
- 35793 - 11905: 0xD2EB,
- 35794 - 11905: 0xDAB1,
- 35795 - 11905: 0xDAB2,
- 35796 - 11905: 0xDAB3,
- 35797 - 11905: 0xCAD4,
- 35798 - 11905: 0xDAB4,
- 35799 - 11905: 0xCAAB,
- 35800 - 11905: 0xDAB5,
- 35801 - 11905: 0xDAB6,
- 35802 - 11905: 0xB3CF,
- 35803 - 11905: 0xD6EF,
- 35804 - 11905: 0xDAB7,
- 35805 - 11905: 0xBBB0,
- 35806 - 11905: 0xB5AE,
- 35807 - 11905: 0xDAB8,
- 35808 - 11905: 0xDAB9,
- 35809 - 11905: 0xB9EE,
- 35810 - 11905: 0xD1AF,
- 35811 - 11905: 0xD2E8,
- 35812 - 11905: 0xDABA,
- 35813 - 11905: 0xB8C3,
- 35814 - 11905: 0xCFEA,
- 35815 - 11905: 0xB2EF,
- 35816 - 11905: 0xDABB,
- 35817 - 11905: 0xDABC,
- 35818 - 11905: 0xD79E,
- 35819 - 11905: 0xBDEB,
- 35820 - 11905: 0xCEDC,
- 35821 - 11905: 0xD3EF,
- 35822 - 11905: 0xDABD,
- 35823 - 11905: 0xCEF3,
- 35824 - 11905: 0xDABE,
- 35825 - 11905: 0xD3D5,
- 35826 - 11905: 0xBBE5,
- 35827 - 11905: 0xDABF,
- 35828 - 11905: 0xCBB5,
- 35829 - 11905: 0xCBD0,
- 35830 - 11905: 0xDAC0,
- 35831 - 11905: 0xC7EB,
- 35832 - 11905: 0xD6EE,
- 35833 - 11905: 0xDAC1,
- 35834 - 11905: 0xC5B5,
- 35835 - 11905: 0xB6C1,
- 35836 - 11905: 0xDAC2,
- 35837 - 11905: 0xB7CC,
- 35838 - 11905: 0xBFCE,
- 35839 - 11905: 0xDAC3,
- 35840 - 11905: 0xDAC4,
- 35841 - 11905: 0xCBAD,
- 35842 - 11905: 0xDAC5,
- 35843 - 11905: 0xB5F7,
- 35844 - 11905: 0xDAC6,
- 35845 - 11905: 0xC1C2,
- 35846 - 11905: 0xD7BB,
- 35847 - 11905: 0xDAC7,
- 35848 - 11905: 0xCCB8,
- 35849 - 11905: 0xD79F,
- 35850 - 11905: 0xD2EA,
- 35851 - 11905: 0xC4B1,
- 35852 - 11905: 0xDAC8,
- 35853 - 11905: 0xB5FD,
- 35854 - 11905: 0xBBD1,
- 35855 - 11905: 0xDAC9,
- 35856 - 11905: 0xD0B3,
- 35857 - 11905: 0xDACA,
- 35858 - 11905: 0xDACB,
- 35859 - 11905: 0xCEBD,
- 35860 - 11905: 0xDACC,
- 35861 - 11905: 0xDACD,
- 35862 - 11905: 0xDACE,
- 35863 - 11905: 0xB2F7,
- 35864 - 11905: 0xDAD1,
- 35865 - 11905: 0xDACF,
- 35866 - 11905: 0xD1E8,
- 35867 - 11905: 0xDAD0,
- 35868 - 11905: 0xC3D5,
- 35869 - 11905: 0xDAD2,
- 35870 - 11905: 0xD7A0,
- 35871 - 11905: 0xDAD3,
- 35872 - 11905: 0xDAD4,
- 35873 - 11905: 0xDAD5,
- 35874 - 11905: 0xD0BB,
- 35875 - 11905: 0xD2A5,
- 35876 - 11905: 0xB0F9,
- 35877 - 11905: 0xDAD6,
- 35878 - 11905: 0xC7AB,
- 35879 - 11905: 0xDAD7,
- 35880 - 11905: 0xBDF7,
- 35881 - 11905: 0xC3A1,
- 35882 - 11905: 0xDAD8,
- 35883 - 11905: 0xDAD9,
- 35884 - 11905: 0xC3FD,
- 35885 - 11905: 0xCCB7,
- 35886 - 11905: 0xDADA,
- 35887 - 11905: 0xDADB,
- 35888 - 11905: 0xC0BE,
- 35889 - 11905: 0xC6D7,
- 35890 - 11905: 0xDADC,
- 35891 - 11905: 0xDADD,
- 35892 - 11905: 0xC7B4,
- 35893 - 11905: 0xDADE,
- 35894 - 11905: 0xDADF,
- 35895 - 11905: 0xB9C8,
- 35896 - 11905: 0xD840,
- 35897 - 11905: 0xD841,
- 35898 - 11905: 0xD842,
- 35899 - 11905: 0xD843,
- 35900 - 11905: 0xD844,
- 35901 - 11905: 0xD845,
- 35902 - 11905: 0xD846,
- 35903 - 11905: 0xD847,
- 35904 - 11905: 0xD848,
- 35905 - 11905: 0xBBED,
- 35906 - 11905: 0xD849,
- 35907 - 11905: 0xD84A,
- 35908 - 11905: 0xD84B,
- 35909 - 11905: 0xD84C,
- 35910 - 11905: 0xB6B9,
- 35911 - 11905: 0xF4F8,
- 35912 - 11905: 0xD84D,
- 35913 - 11905: 0xF4F9,
- 35914 - 11905: 0xD84E,
- 35915 - 11905: 0xD84F,
- 35916 - 11905: 0xCDE3,
- 35917 - 11905: 0xD850,
- 35918 - 11905: 0xD851,
- 35919 - 11905: 0xD852,
- 35920 - 11905: 0xD853,
- 35921 - 11905: 0xD854,
- 35922 - 11905: 0xD855,
- 35923 - 11905: 0xD856,
- 35924 - 11905: 0xD857,
- 35925 - 11905: 0xF5B9,
- 35926 - 11905: 0xD858,
- 35927 - 11905: 0xD859,
- 35928 - 11905: 0xD85A,
- 35929 - 11905: 0xD85B,
- 35930 - 11905: 0xEBE0,
- 35931 - 11905: 0xD85C,
- 35932 - 11905: 0xD85D,
- 35933 - 11905: 0xD85E,
- 35934 - 11905: 0xD85F,
- 35935 - 11905: 0xD860,
- 35936 - 11905: 0xD861,
- 35937 - 11905: 0xCFF3,
- 35938 - 11905: 0xBBBF,
- 35939 - 11905: 0xD862,
- 35940 - 11905: 0xD863,
- 35941 - 11905: 0xD864,
- 35942 - 11905: 0xD865,
- 35943 - 11905: 0xD866,
- 35944 - 11905: 0xD867,
- 35945 - 11905: 0xD868,
- 35946 - 11905: 0xBAC0,
- 35947 - 11905: 0xD4A5,
- 35948 - 11905: 0xD869,
- 35949 - 11905: 0xD86A,
- 35950 - 11905: 0xD86B,
- 35951 - 11905: 0xD86C,
- 35952 - 11905: 0xD86D,
- 35953 - 11905: 0xD86E,
- 35954 - 11905: 0xD86F,
- 35955 - 11905: 0xE1D9,
- 35956 - 11905: 0xD870,
- 35957 - 11905: 0xD871,
- 35958 - 11905: 0xD872,
- 35959 - 11905: 0xD873,
- 35960 - 11905: 0xF5F4,
- 35961 - 11905: 0xB1AA,
- 35962 - 11905: 0xB2F2,
- 35963 - 11905: 0xD874,
- 35964 - 11905: 0xD875,
- 35965 - 11905: 0xD876,
- 35966 - 11905: 0xD877,
- 35967 - 11905: 0xD878,
- 35968 - 11905: 0xD879,
- 35969 - 11905: 0xD87A,
- 35970 - 11905: 0xF5F5,
- 35971 - 11905: 0xD87B,
- 35972 - 11905: 0xD87C,
- 35973 - 11905: 0xF5F7,
- 35974 - 11905: 0xD87D,
- 35975 - 11905: 0xD87E,
- 35976 - 11905: 0xD880,
- 35977 - 11905: 0xBAD1,
- 35978 - 11905: 0xF5F6,
- 35979 - 11905: 0xD881,
- 35980 - 11905: 0xC3B2,
- 35981 - 11905: 0xD882,
- 35982 - 11905: 0xD883,
- 35983 - 11905: 0xD884,
- 35984 - 11905: 0xD885,
- 35985 - 11905: 0xD886,
- 35986 - 11905: 0xD887,
- 35987 - 11905: 0xD888,
- 35988 - 11905: 0xF5F9,
- 35989 - 11905: 0xD889,
- 35990 - 11905: 0xD88A,
- 35991 - 11905: 0xD88B,
- 35992 - 11905: 0xF5F8,
- 35993 - 11905: 0xD88C,
- 35994 - 11905: 0xD88D,
- 35995 - 11905: 0xD88E,
- 35996 - 11905: 0xD88F,
- 35997 - 11905: 0xD890,
- 35998 - 11905: 0xD891,
- 35999 - 11905: 0xD892,
- 36000 - 11905: 0xD893,
- 36001 - 11905: 0xD894,
- 36002 - 11905: 0xD895,
- 36003 - 11905: 0xD896,
- 36004 - 11905: 0xD897,
- 36005 - 11905: 0xD898,
- 36006 - 11905: 0xD899,
- 36007 - 11905: 0xD89A,
- 36008 - 11905: 0xD89B,
- 36009 - 11905: 0xD89C,
- 36010 - 11905: 0xD89D,
- 36011 - 11905: 0xD89E,
- 36012 - 11905: 0xD89F,
- 36013 - 11905: 0xD8A0,
- 36014 - 11905: 0xD940,
- 36015 - 11905: 0xD941,
- 36016 - 11905: 0xD942,
- 36017 - 11905: 0xD943,
- 36018 - 11905: 0xD944,
- 36019 - 11905: 0xD945,
- 36020 - 11905: 0xD946,
- 36021 - 11905: 0xD947,
- 36022 - 11905: 0xD948,
- 36023 - 11905: 0xD949,
- 36024 - 11905: 0xD94A,
- 36025 - 11905: 0xD94B,
- 36026 - 11905: 0xD94C,
- 36027 - 11905: 0xD94D,
- 36028 - 11905: 0xD94E,
- 36029 - 11905: 0xD94F,
- 36030 - 11905: 0xD950,
- 36031 - 11905: 0xD951,
- 36032 - 11905: 0xD952,
- 36033 - 11905: 0xD953,
- 36034 - 11905: 0xD954,
- 36035 - 11905: 0xD955,
- 36036 - 11905: 0xD956,
- 36037 - 11905: 0xD957,
- 36038 - 11905: 0xD958,
- 36039 - 11905: 0xD959,
- 36040 - 11905: 0xD95A,
- 36041 - 11905: 0xD95B,
- 36042 - 11905: 0xD95C,
- 36043 - 11905: 0xD95D,
- 36044 - 11905: 0xD95E,
- 36045 - 11905: 0xD95F,
- 36046 - 11905: 0xD960,
- 36047 - 11905: 0xD961,
- 36048 - 11905: 0xD962,
- 36049 - 11905: 0xD963,
- 36050 - 11905: 0xD964,
- 36051 - 11905: 0xD965,
- 36052 - 11905: 0xD966,
- 36053 - 11905: 0xD967,
- 36054 - 11905: 0xD968,
- 36055 - 11905: 0xD969,
- 36056 - 11905: 0xD96A,
- 36057 - 11905: 0xD96B,
- 36058 - 11905: 0xD96C,
- 36059 - 11905: 0xD96D,
- 36060 - 11905: 0xD96E,
- 36061 - 11905: 0xD96F,
- 36062 - 11905: 0xD970,
- 36063 - 11905: 0xD971,
- 36064 - 11905: 0xD972,
- 36065 - 11905: 0xD973,
- 36066 - 11905: 0xD974,
- 36067 - 11905: 0xD975,
- 36068 - 11905: 0xD976,
- 36069 - 11905: 0xD977,
- 36070 - 11905: 0xD978,
- 36071 - 11905: 0xD979,
- 36072 - 11905: 0xD97A,
- 36073 - 11905: 0xD97B,
- 36074 - 11905: 0xD97C,
- 36075 - 11905: 0xD97D,
- 36076 - 11905: 0xD97E,
- 36077 - 11905: 0xD980,
- 36078 - 11905: 0xD981,
- 36079 - 11905: 0xD982,
- 36080 - 11905: 0xD983,
- 36081 - 11905: 0xD984,
- 36082 - 11905: 0xD985,
- 36083 - 11905: 0xD986,
- 36084 - 11905: 0xD987,
- 36085 - 11905: 0xD988,
- 36086 - 11905: 0xD989,
- 36087 - 11905: 0xD98A,
- 36088 - 11905: 0xD98B,
- 36089 - 11905: 0xD98C,
- 36090 - 11905: 0xD98D,
- 36091 - 11905: 0xD98E,
- 36092 - 11905: 0xD98F,
- 36093 - 11905: 0xD990,
- 36094 - 11905: 0xD991,
- 36095 - 11905: 0xD992,
- 36096 - 11905: 0xD993,
- 36097 - 11905: 0xD994,
- 36098 - 11905: 0xD995,
- 36099 - 11905: 0xD996,
- 36100 - 11905: 0xD997,
- 36101 - 11905: 0xD998,
- 36102 - 11905: 0xD999,
- 36103 - 11905: 0xD99A,
- 36104 - 11905: 0xD99B,
- 36105 - 11905: 0xD99C,
- 36106 - 11905: 0xD99D,
- 36107 - 11905: 0xD99E,
- 36108 - 11905: 0xD99F,
- 36109 - 11905: 0xD9A0,
- 36110 - 11905: 0xDA40,
- 36111 - 11905: 0xDA41,
- 36112 - 11905: 0xDA42,
- 36113 - 11905: 0xDA43,
- 36114 - 11905: 0xDA44,
- 36115 - 11905: 0xDA45,
- 36116 - 11905: 0xDA46,
- 36117 - 11905: 0xDA47,
- 36118 - 11905: 0xDA48,
- 36119 - 11905: 0xDA49,
- 36120 - 11905: 0xDA4A,
- 36121 - 11905: 0xDA4B,
- 36122 - 11905: 0xDA4C,
- 36123 - 11905: 0xDA4D,
- 36124 - 11905: 0xDA4E,
- 36125 - 11905: 0xB1B4,
- 36126 - 11905: 0xD5EA,
- 36127 - 11905: 0xB8BA,
- 36128 - 11905: 0xDA4F,
- 36129 - 11905: 0xB9B1,
- 36130 - 11905: 0xB2C6,
- 36131 - 11905: 0xD4F0,
- 36132 - 11905: 0xCFCD,
- 36133 - 11905: 0xB0DC,
- 36134 - 11905: 0xD5CB,
- 36135 - 11905: 0xBBF5,
- 36136 - 11905: 0xD6CA,
- 36137 - 11905: 0xB7B7,
- 36138 - 11905: 0xCCB0,
- 36139 - 11905: 0xC6B6,
- 36140 - 11905: 0xB1E1,
- 36141 - 11905: 0xB9BA,
- 36142 - 11905: 0xD6FC,
- 36143 - 11905: 0xB9E1,
- 36144 - 11905: 0xB7A1,
- 36145 - 11905: 0xBCFA,
- 36146 - 11905: 0xEADA,
- 36147 - 11905: 0xEADB,
- 36148 - 11905: 0xCCF9,
- 36149 - 11905: 0xB9F3,
- 36150 - 11905: 0xEADC,
- 36151 - 11905: 0xB4FB,
- 36152 - 11905: 0xC3B3,
- 36153 - 11905: 0xB7D1,
- 36154 - 11905: 0xBAD8,
- 36155 - 11905: 0xEADD,
- 36156 - 11905: 0xD4F4,
- 36157 - 11905: 0xEADE,
- 36158 - 11905: 0xBCD6,
- 36159 - 11905: 0xBBDF,
- 36160 - 11905: 0xEADF,
- 36161 - 11905: 0xC1DE,
- 36162 - 11905: 0xC2B8,
- 36163 - 11905: 0xD4DF,
- 36164 - 11905: 0xD7CA,
- 36165 - 11905: 0xEAE0,
- 36166 - 11905: 0xEAE1,
- 36167 - 11905: 0xEAE4,
- 36168 - 11905: 0xEAE2,
- 36169 - 11905: 0xEAE3,
- 36170 - 11905: 0xC9DE,
- 36171 - 11905: 0xB8B3,
- 36172 - 11905: 0xB6C4,
- 36173 - 11905: 0xEAE5,
- 36174 - 11905: 0xCAEA,
- 36175 - 11905: 0xC9CD,
- 36176 - 11905: 0xB4CD,
- 36177 - 11905: 0xDA50,
- 36178 - 11905: 0xDA51,
- 36179 - 11905: 0xE2D9,
- 36180 - 11905: 0xC5E2,
- 36181 - 11905: 0xEAE6,
- 36182 - 11905: 0xC0B5,
- 36183 - 11905: 0xDA52,
- 36184 - 11905: 0xD7B8,
- 36185 - 11905: 0xEAE7,
- 36186 - 11905: 0xD7AC,
- 36187 - 11905: 0xC8FC,
- 36188 - 11905: 0xD8D3,
- 36189 - 11905: 0xD8CD,
- 36190 - 11905: 0xD4DE,
- 36191 - 11905: 0xDA53,
- 36192 - 11905: 0xD4F9,
- 36193 - 11905: 0xC9C4,
- 36194 - 11905: 0xD3AE,
- 36195 - 11905: 0xB8D3,
- 36196 - 11905: 0xB3E0,
- 36197 - 11905: 0xDA54,
- 36198 - 11905: 0xC9E2,
- 36199 - 11905: 0xF4F6,
- 36200 - 11905: 0xDA55,
- 36201 - 11905: 0xDA56,
- 36202 - 11905: 0xDA57,
- 36203 - 11905: 0xBAD5,
- 36204 - 11905: 0xDA58,
- 36205 - 11905: 0xF4F7,
- 36206 - 11905: 0xDA59,
- 36207 - 11905: 0xDA5A,
- 36208 - 11905: 0xD7DF,
- 36209 - 11905: 0xDA5B,
- 36210 - 11905: 0xDA5C,
- 36211 - 11905: 0xF4F1,
- 36212 - 11905: 0xB8B0,
- 36213 - 11905: 0xD5D4,
- 36214 - 11905: 0xB8CF,
- 36215 - 11905: 0xC6F0,
- 36216 - 11905: 0xDA5D,
- 36217 - 11905: 0xDA5E,
- 36218 - 11905: 0xDA5F,
- 36219 - 11905: 0xDA60,
- 36220 - 11905: 0xDA61,
- 36221 - 11905: 0xDA62,
- 36222 - 11905: 0xDA63,
- 36223 - 11905: 0xDA64,
- 36224 - 11905: 0xDA65,
- 36225 - 11905: 0xB3C3,
- 36226 - 11905: 0xDA66,
- 36227 - 11905: 0xDA67,
- 36228 - 11905: 0xF4F2,
- 36229 - 11905: 0xB3AC,
- 36230 - 11905: 0xDA68,
- 36231 - 11905: 0xDA69,
- 36232 - 11905: 0xDA6A,
- 36233 - 11905: 0xDA6B,
- 36234 - 11905: 0xD4BD,
- 36235 - 11905: 0xC7F7,
- 36236 - 11905: 0xDA6C,
- 36237 - 11905: 0xDA6D,
- 36238 - 11905: 0xDA6E,
- 36239 - 11905: 0xDA6F,
- 36240 - 11905: 0xDA70,
- 36241 - 11905: 0xF4F4,
- 36242 - 11905: 0xDA71,
- 36243 - 11905: 0xDA72,
- 36244 - 11905: 0xF4F3,
- 36245 - 11905: 0xDA73,
- 36246 - 11905: 0xDA74,
- 36247 - 11905: 0xDA75,
- 36248 - 11905: 0xDA76,
- 36249 - 11905: 0xDA77,
- 36250 - 11905: 0xDA78,
- 36251 - 11905: 0xDA79,
- 36252 - 11905: 0xDA7A,
- 36253 - 11905: 0xDA7B,
- 36254 - 11905: 0xDA7C,
- 36255 - 11905: 0xCCCB,
- 36256 - 11905: 0xDA7D,
- 36257 - 11905: 0xDA7E,
- 36258 - 11905: 0xDA80,
- 36259 - 11905: 0xC8A4,
- 36260 - 11905: 0xDA81,
- 36261 - 11905: 0xDA82,
- 36262 - 11905: 0xDA83,
- 36263 - 11905: 0xDA84,
- 36264 - 11905: 0xDA85,
- 36265 - 11905: 0xDA86,
- 36266 - 11905: 0xDA87,
- 36267 - 11905: 0xDA88,
- 36268 - 11905: 0xDA89,
- 36269 - 11905: 0xDA8A,
- 36270 - 11905: 0xDA8B,
- 36271 - 11905: 0xDA8C,
- 36272 - 11905: 0xDA8D,
- 36273 - 11905: 0xF4F5,
- 36274 - 11905: 0xDA8E,
- 36275 - 11905: 0xD7E3,
- 36276 - 11905: 0xC5BF,
- 36277 - 11905: 0xF5C0,
- 36278 - 11905: 0xDA8F,
- 36279 - 11905: 0xDA90,
- 36280 - 11905: 0xF5BB,
- 36281 - 11905: 0xDA91,
- 36282 - 11905: 0xF5C3,
- 36283 - 11905: 0xDA92,
- 36284 - 11905: 0xF5C2,
- 36285 - 11905: 0xDA93,
- 36286 - 11905: 0xD6BA,
- 36287 - 11905: 0xF5C1,
- 36288 - 11905: 0xDA94,
- 36289 - 11905: 0xDA95,
- 36290 - 11905: 0xDA96,
- 36291 - 11905: 0xD4BE,
- 36292 - 11905: 0xF5C4,
- 36293 - 11905: 0xDA97,
- 36294 - 11905: 0xF5CC,
- 36295 - 11905: 0xDA98,
- 36296 - 11905: 0xDA99,
- 36297 - 11905: 0xDA9A,
- 36298 - 11905: 0xDA9B,
- 36299 - 11905: 0xB0CF,
- 36300 - 11905: 0xB5F8,
- 36301 - 11905: 0xDA9C,
- 36302 - 11905: 0xF5C9,
- 36303 - 11905: 0xF5CA,
- 36304 - 11905: 0xDA9D,
- 36305 - 11905: 0xC5DC,
- 36306 - 11905: 0xDA9E,
- 36307 - 11905: 0xDA9F,
- 36308 - 11905: 0xDAA0,
- 36309 - 11905: 0xDB40,
- 36310 - 11905: 0xF5C5,
- 36311 - 11905: 0xF5C6,
- 36312 - 11905: 0xDB41,
- 36313 - 11905: 0xDB42,
- 36314 - 11905: 0xF5C7,
- 36315 - 11905: 0xF5CB,
- 36316 - 11905: 0xDB43,
- 36317 - 11905: 0xBEE0,
- 36318 - 11905: 0xF5C8,
- 36319 - 11905: 0xB8FA,
- 36320 - 11905: 0xDB44,
- 36321 - 11905: 0xDB45,
- 36322 - 11905: 0xDB46,
- 36323 - 11905: 0xF5D0,
- 36324 - 11905: 0xF5D3,
- 36325 - 11905: 0xDB47,
- 36326 - 11905: 0xDB48,
- 36327 - 11905: 0xDB49,
- 36328 - 11905: 0xBFE7,
- 36329 - 11905: 0xDB4A,
- 36330 - 11905: 0xB9F2,
- 36331 - 11905: 0xF5BC,
- 36332 - 11905: 0xF5CD,
- 36333 - 11905: 0xDB4B,
- 36334 - 11905: 0xDB4C,
- 36335 - 11905: 0xC2B7,
- 36336 - 11905: 0xDB4D,
- 36337 - 11905: 0xDB4E,
- 36338 - 11905: 0xDB4F,
- 36339 - 11905: 0xCCF8,
- 36340 - 11905: 0xDB50,
- 36341 - 11905: 0xBCF9,
- 36342 - 11905: 0xDB51,
- 36343 - 11905: 0xF5CE,
- 36344 - 11905: 0xF5CF,
- 36345 - 11905: 0xF5D1,
- 36346 - 11905: 0xB6E5,
- 36347 - 11905: 0xF5D2,
- 36348 - 11905: 0xDB52,
- 36349 - 11905: 0xF5D5,
- 36350 - 11905: 0xDB53,
- 36351 - 11905: 0xDB54,
- 36352 - 11905: 0xDB55,
- 36353 - 11905: 0xDB56,
- 36354 - 11905: 0xDB57,
- 36355 - 11905: 0xDB58,
- 36356 - 11905: 0xDB59,
- 36357 - 11905: 0xF5BD,
- 36358 - 11905: 0xDB5A,
- 36359 - 11905: 0xDB5B,
- 36360 - 11905: 0xDB5C,
- 36361 - 11905: 0xF5D4,
- 36362 - 11905: 0xD3BB,
- 36363 - 11905: 0xDB5D,
- 36364 - 11905: 0xB3EC,
- 36365 - 11905: 0xDB5E,
- 36366 - 11905: 0xDB5F,
- 36367 - 11905: 0xCCA4,
- 36368 - 11905: 0xDB60,
- 36369 - 11905: 0xDB61,
- 36370 - 11905: 0xDB62,
- 36371 - 11905: 0xDB63,
- 36372 - 11905: 0xF5D6,
- 36373 - 11905: 0xDB64,
- 36374 - 11905: 0xDB65,
- 36375 - 11905: 0xDB66,
- 36376 - 11905: 0xDB67,
- 36377 - 11905: 0xDB68,
- 36378 - 11905: 0xDB69,
- 36379 - 11905: 0xDB6A,
- 36380 - 11905: 0xDB6B,
- 36381 - 11905: 0xF5D7,
- 36382 - 11905: 0xBEE1,
- 36383 - 11905: 0xF5D8,
- 36384 - 11905: 0xDB6C,
- 36385 - 11905: 0xDB6D,
- 36386 - 11905: 0xCCDF,
- 36387 - 11905: 0xF5DB,
- 36388 - 11905: 0xDB6E,
- 36389 - 11905: 0xDB6F,
- 36390 - 11905: 0xDB70,
- 36391 - 11905: 0xDB71,
- 36392 - 11905: 0xDB72,
- 36393 - 11905: 0xB2C8,
- 36394 - 11905: 0xD7D9,
- 36395 - 11905: 0xDB73,
- 36396 - 11905: 0xF5D9,
- 36397 - 11905: 0xDB74,
- 36398 - 11905: 0xF5DA,
- 36399 - 11905: 0xF5DC,
- 36400 - 11905: 0xDB75,
- 36401 - 11905: 0xF5E2,
- 36402 - 11905: 0xDB76,
- 36403 - 11905: 0xDB77,
- 36404 - 11905: 0xDB78,
- 36405 - 11905: 0xF5E0,
- 36406 - 11905: 0xDB79,
- 36407 - 11905: 0xDB7A,
- 36408 - 11905: 0xDB7B,
- 36409 - 11905: 0xF5DF,
- 36410 - 11905: 0xF5DD,
- 36411 - 11905: 0xDB7C,
- 36412 - 11905: 0xDB7D,
- 36413 - 11905: 0xF5E1,
- 36414 - 11905: 0xDB7E,
- 36415 - 11905: 0xDB80,
- 36416 - 11905: 0xF5DE,
- 36417 - 11905: 0xF5E4,
- 36418 - 11905: 0xF5E5,
- 36419 - 11905: 0xDB81,
- 36420 - 11905: 0xCCE3,
- 36421 - 11905: 0xDB82,
- 36422 - 11905: 0xDB83,
- 36423 - 11905: 0xE5BF,
- 36424 - 11905: 0xB5B8,
- 36425 - 11905: 0xF5E3,
- 36426 - 11905: 0xF5E8,
- 36427 - 11905: 0xCCA3,
- 36428 - 11905: 0xDB84,
- 36429 - 11905: 0xDB85,
- 36430 - 11905: 0xDB86,
- 36431 - 11905: 0xDB87,
- 36432 - 11905: 0xDB88,
- 36433 - 11905: 0xF5E6,
- 36434 - 11905: 0xF5E7,
- 36435 - 11905: 0xDB89,
- 36436 - 11905: 0xDB8A,
- 36437 - 11905: 0xDB8B,
- 36438 - 11905: 0xDB8C,
- 36439 - 11905: 0xDB8D,
- 36440 - 11905: 0xDB8E,
- 36441 - 11905: 0xF5BE,
- 36442 - 11905: 0xDB8F,
- 36443 - 11905: 0xDB90,
- 36444 - 11905: 0xDB91,
- 36445 - 11905: 0xDB92,
- 36446 - 11905: 0xDB93,
- 36447 - 11905: 0xDB94,
- 36448 - 11905: 0xDB95,
- 36449 - 11905: 0xDB96,
- 36450 - 11905: 0xDB97,
- 36451 - 11905: 0xDB98,
- 36452 - 11905: 0xDB99,
- 36453 - 11905: 0xDB9A,
- 36454 - 11905: 0xB1C4,
- 36455 - 11905: 0xDB9B,
- 36456 - 11905: 0xDB9C,
- 36457 - 11905: 0xF5BF,
- 36458 - 11905: 0xDB9D,
- 36459 - 11905: 0xDB9E,
- 36460 - 11905: 0xB5C5,
- 36461 - 11905: 0xB2E4,
- 36462 - 11905: 0xDB9F,
- 36463 - 11905: 0xF5EC,
- 36464 - 11905: 0xF5E9,
- 36465 - 11905: 0xDBA0,
- 36466 - 11905: 0xB6D7,
- 36467 - 11905: 0xDC40,
- 36468 - 11905: 0xF5ED,
- 36469 - 11905: 0xDC41,
- 36470 - 11905: 0xF5EA,
- 36471 - 11905: 0xDC42,
- 36472 - 11905: 0xDC43,
- 36473 - 11905: 0xDC44,
- 36474 - 11905: 0xDC45,
- 36475 - 11905: 0xDC46,
- 36476 - 11905: 0xF5EB,
- 36477 - 11905: 0xDC47,
- 36478 - 11905: 0xDC48,
- 36479 - 11905: 0xB4DA,
- 36480 - 11905: 0xDC49,
- 36481 - 11905: 0xD4EA,
- 36482 - 11905: 0xDC4A,
- 36483 - 11905: 0xDC4B,
- 36484 - 11905: 0xDC4C,
- 36485 - 11905: 0xF5EE,
- 36486 - 11905: 0xDC4D,
- 36487 - 11905: 0xB3F9,
- 36488 - 11905: 0xDC4E,
- 36489 - 11905: 0xDC4F,
- 36490 - 11905: 0xDC50,
- 36491 - 11905: 0xDC51,
- 36492 - 11905: 0xDC52,
- 36493 - 11905: 0xDC53,
- 36494 - 11905: 0xDC54,
- 36495 - 11905: 0xF5EF,
- 36496 - 11905: 0xF5F1,
- 36497 - 11905: 0xDC55,
- 36498 - 11905: 0xDC56,
- 36499 - 11905: 0xDC57,
- 36500 - 11905: 0xF5F0,
- 36501 - 11905: 0xDC58,
- 36502 - 11905: 0xDC59,
- 36503 - 11905: 0xDC5A,
- 36504 - 11905: 0xDC5B,
- 36505 - 11905: 0xDC5C,
- 36506 - 11905: 0xDC5D,
- 36507 - 11905: 0xDC5E,
- 36508 - 11905: 0xF5F2,
- 36509 - 11905: 0xDC5F,
- 36510 - 11905: 0xF5F3,
- 36511 - 11905: 0xDC60,
- 36512 - 11905: 0xDC61,
- 36513 - 11905: 0xDC62,
- 36514 - 11905: 0xDC63,
- 36515 - 11905: 0xDC64,
- 36516 - 11905: 0xDC65,
- 36517 - 11905: 0xDC66,
- 36518 - 11905: 0xDC67,
- 36519 - 11905: 0xDC68,
- 36520 - 11905: 0xDC69,
- 36521 - 11905: 0xDC6A,
- 36522 - 11905: 0xDC6B,
- 36523 - 11905: 0xC9ED,
- 36524 - 11905: 0xB9AA,
- 36525 - 11905: 0xDC6C,
- 36526 - 11905: 0xDC6D,
- 36527 - 11905: 0xC7FB,
- 36528 - 11905: 0xDC6E,
- 36529 - 11905: 0xDC6F,
- 36530 - 11905: 0xB6E3,
- 36531 - 11905: 0xDC70,
- 36532 - 11905: 0xDC71,
- 36533 - 11905: 0xDC72,
- 36534 - 11905: 0xDC73,
- 36535 - 11905: 0xDC74,
- 36536 - 11905: 0xDC75,
- 36537 - 11905: 0xDC76,
- 36538 - 11905: 0xCCC9,
- 36539 - 11905: 0xDC77,
- 36540 - 11905: 0xDC78,
- 36541 - 11905: 0xDC79,
- 36542 - 11905: 0xDC7A,
- 36543 - 11905: 0xDC7B,
- 36544 - 11905: 0xDC7C,
- 36545 - 11905: 0xDC7D,
- 36546 - 11905: 0xDC7E,
- 36547 - 11905: 0xDC80,
- 36548 - 11905: 0xDC81,
- 36549 - 11905: 0xDC82,
- 36550 - 11905: 0xDC83,
- 36551 - 11905: 0xDC84,
- 36552 - 11905: 0xDC85,
- 36553 - 11905: 0xDC86,
- 36554 - 11905: 0xDC87,
- 36555 - 11905: 0xDC88,
- 36556 - 11905: 0xDC89,
- 36557 - 11905: 0xDC8A,
- 36558 - 11905: 0xEAA6,
- 36559 - 11905: 0xDC8B,
- 36560 - 11905: 0xDC8C,
- 36561 - 11905: 0xDC8D,
- 36562 - 11905: 0xDC8E,
- 36563 - 11905: 0xDC8F,
- 36564 - 11905: 0xDC90,
- 36565 - 11905: 0xDC91,
- 36566 - 11905: 0xDC92,
- 36567 - 11905: 0xDC93,
- 36568 - 11905: 0xDC94,
- 36569 - 11905: 0xDC95,
- 36570 - 11905: 0xDC96,
- 36571 - 11905: 0xDC97,
- 36572 - 11905: 0xDC98,
- 36573 - 11905: 0xDC99,
- 36574 - 11905: 0xDC9A,
- 36575 - 11905: 0xDC9B,
- 36576 - 11905: 0xDC9C,
- 36577 - 11905: 0xDC9D,
- 36578 - 11905: 0xDC9E,
- 36579 - 11905: 0xDC9F,
- 36580 - 11905: 0xDCA0,
- 36581 - 11905: 0xDD40,
- 36582 - 11905: 0xDD41,
- 36583 - 11905: 0xDD42,
- 36584 - 11905: 0xDD43,
- 36585 - 11905: 0xDD44,
- 36586 - 11905: 0xDD45,
- 36587 - 11905: 0xDD46,
- 36588 - 11905: 0xDD47,
- 36589 - 11905: 0xDD48,
- 36590 - 11905: 0xDD49,
- 36591 - 11905: 0xDD4A,
- 36592 - 11905: 0xDD4B,
- 36593 - 11905: 0xDD4C,
- 36594 - 11905: 0xDD4D,
- 36595 - 11905: 0xDD4E,
- 36596 - 11905: 0xDD4F,
- 36597 - 11905: 0xDD50,
- 36598 - 11905: 0xDD51,
- 36599 - 11905: 0xDD52,
- 36600 - 11905: 0xDD53,
- 36601 - 11905: 0xDD54,
- 36602 - 11905: 0xDD55,
- 36603 - 11905: 0xDD56,
- 36604 - 11905: 0xDD57,
- 36605 - 11905: 0xDD58,
- 36606 - 11905: 0xDD59,
- 36607 - 11905: 0xDD5A,
- 36608 - 11905: 0xDD5B,
- 36609 - 11905: 0xDD5C,
- 36610 - 11905: 0xDD5D,
- 36611 - 11905: 0xDD5E,
- 36612 - 11905: 0xDD5F,
- 36613 - 11905: 0xDD60,
- 36614 - 11905: 0xDD61,
- 36615 - 11905: 0xDD62,
- 36616 - 11905: 0xDD63,
- 36617 - 11905: 0xDD64,
- 36618 - 11905: 0xDD65,
- 36619 - 11905: 0xDD66,
- 36620 - 11905: 0xDD67,
- 36621 - 11905: 0xDD68,
- 36622 - 11905: 0xDD69,
- 36623 - 11905: 0xDD6A,
- 36624 - 11905: 0xDD6B,
- 36625 - 11905: 0xDD6C,
- 36626 - 11905: 0xDD6D,
- 36627 - 11905: 0xDD6E,
- 36628 - 11905: 0xDD6F,
- 36629 - 11905: 0xDD70,
- 36630 - 11905: 0xDD71,
- 36631 - 11905: 0xDD72,
- 36632 - 11905: 0xDD73,
- 36633 - 11905: 0xDD74,
- 36634 - 11905: 0xDD75,
- 36635 - 11905: 0xDD76,
- 36636 - 11905: 0xDD77,
- 36637 - 11905: 0xDD78,
- 36638 - 11905: 0xDD79,
- 36639 - 11905: 0xDD7A,
- 36640 - 11905: 0xDD7B,
- 36641 - 11905: 0xDD7C,
- 36642 - 11905: 0xDD7D,
- 36643 - 11905: 0xDD7E,
- 36644 - 11905: 0xDD80,
- 36645 - 11905: 0xDD81,
- 36646 - 11905: 0xDD82,
- 36647 - 11905: 0xDD83,
- 36648 - 11905: 0xDD84,
- 36649 - 11905: 0xDD85,
- 36650 - 11905: 0xDD86,
- 36651 - 11905: 0xDD87,
- 36652 - 11905: 0xDD88,
- 36653 - 11905: 0xDD89,
- 36654 - 11905: 0xDD8A,
- 36655 - 11905: 0xDD8B,
- 36656 - 11905: 0xDD8C,
- 36657 - 11905: 0xDD8D,
- 36658 - 11905: 0xDD8E,
- 36659 - 11905: 0xDD8F,
- 36660 - 11905: 0xDD90,
- 36661 - 11905: 0xDD91,
- 36662 - 11905: 0xDD92,
- 36663 - 11905: 0xDD93,
- 36664 - 11905: 0xDD94,
- 36665 - 11905: 0xDD95,
- 36666 - 11905: 0xDD96,
- 36667 - 11905: 0xDD97,
- 36668 - 11905: 0xDD98,
- 36669 - 11905: 0xDD99,
- 36670 - 11905: 0xDD9A,
- 36671 - 11905: 0xDD9B,
- 36672 - 11905: 0xDD9C,
- 36673 - 11905: 0xDD9D,
- 36674 - 11905: 0xDD9E,
- 36675 - 11905: 0xDD9F,
- 36676 - 11905: 0xDDA0,
- 36677 - 11905: 0xDE40,
- 36678 - 11905: 0xDE41,
- 36679 - 11905: 0xDE42,
- 36680 - 11905: 0xDE43,
- 36681 - 11905: 0xDE44,
- 36682 - 11905: 0xDE45,
- 36683 - 11905: 0xDE46,
- 36684 - 11905: 0xDE47,
- 36685 - 11905: 0xDE48,
- 36686 - 11905: 0xDE49,
- 36687 - 11905: 0xDE4A,
- 36688 - 11905: 0xDE4B,
- 36689 - 11905: 0xDE4C,
- 36690 - 11905: 0xDE4D,
- 36691 - 11905: 0xDE4E,
- 36692 - 11905: 0xDE4F,
- 36693 - 11905: 0xDE50,
- 36694 - 11905: 0xDE51,
- 36695 - 11905: 0xDE52,
- 36696 - 11905: 0xDE53,
- 36697 - 11905: 0xDE54,
- 36698 - 11905: 0xDE55,
- 36699 - 11905: 0xDE56,
- 36700 - 11905: 0xDE57,
- 36701 - 11905: 0xDE58,
- 36702 - 11905: 0xDE59,
- 36703 - 11905: 0xDE5A,
- 36704 - 11905: 0xDE5B,
- 36705 - 11905: 0xDE5C,
- 36706 - 11905: 0xDE5D,
- 36707 - 11905: 0xDE5E,
- 36708 - 11905: 0xDE5F,
- 36709 - 11905: 0xDE60,
- 36710 - 11905: 0xB3B5,
- 36711 - 11905: 0xD4FE,
- 36712 - 11905: 0xB9EC,
- 36713 - 11905: 0xD0F9,
- 36714 - 11905: 0xDE61,
- 36715 - 11905: 0xE9ED,
- 36716 - 11905: 0xD7AA,
- 36717 - 11905: 0xE9EE,
- 36718 - 11905: 0xC2D6,
- 36719 - 11905: 0xC8ED,
- 36720 - 11905: 0xBAE4,
- 36721 - 11905: 0xE9EF,
- 36722 - 11905: 0xE9F0,
- 36723 - 11905: 0xE9F1,
- 36724 - 11905: 0xD6E1,
- 36725 - 11905: 0xE9F2,
- 36726 - 11905: 0xE9F3,
- 36727 - 11905: 0xE9F5,
- 36728 - 11905: 0xE9F4,
- 36729 - 11905: 0xE9F6,
- 36730 - 11905: 0xE9F7,
- 36731 - 11905: 0xC7E1,
- 36732 - 11905: 0xE9F8,
- 36733 - 11905: 0xD4D8,
- 36734 - 11905: 0xE9F9,
- 36735 - 11905: 0xBDCE,
- 36736 - 11905: 0xDE62,
- 36737 - 11905: 0xE9FA,
- 36738 - 11905: 0xE9FB,
- 36739 - 11905: 0xBDCF,
- 36740 - 11905: 0xE9FC,
- 36741 - 11905: 0xB8A8,
- 36742 - 11905: 0xC1BE,
- 36743 - 11905: 0xE9FD,
- 36744 - 11905: 0xB1B2,
- 36745 - 11905: 0xBBD4,
- 36746 - 11905: 0xB9F5,
- 36747 - 11905: 0xE9FE,
- 36748 - 11905: 0xDE63,
- 36749 - 11905: 0xEAA1,
- 36750 - 11905: 0xEAA2,
- 36751 - 11905: 0xEAA3,
- 36752 - 11905: 0xB7F8,
- 36753 - 11905: 0xBCAD,
- 36754 - 11905: 0xDE64,
- 36755 - 11905: 0xCAE4,
- 36756 - 11905: 0xE0CE,
- 36757 - 11905: 0xD4AF,
- 36758 - 11905: 0xCFBD,
- 36759 - 11905: 0xD5B7,
- 36760 - 11905: 0xEAA4,
- 36761 - 11905: 0xD5DE,
- 36762 - 11905: 0xEAA5,
- 36763 - 11905: 0xD0C1,
- 36764 - 11905: 0xB9BC,
- 36765 - 11905: 0xDE65,
- 36766 - 11905: 0xB4C7,
- 36767 - 11905: 0xB1D9,
- 36768 - 11905: 0xDE66,
- 36769 - 11905: 0xDE67,
- 36770 - 11905: 0xDE68,
- 36771 - 11905: 0xC0B1,
- 36772 - 11905: 0xDE69,
- 36773 - 11905: 0xDE6A,
- 36774 - 11905: 0xDE6B,
- 36775 - 11905: 0xDE6C,
- 36776 - 11905: 0xB1E6,
- 36777 - 11905: 0xB1E7,
- 36778 - 11905: 0xDE6D,
- 36779 - 11905: 0xB1E8,
- 36780 - 11905: 0xDE6E,
- 36781 - 11905: 0xDE6F,
- 36782 - 11905: 0xDE70,
- 36783 - 11905: 0xDE71,
- 36784 - 11905: 0xB3BD,
- 36785 - 11905: 0xC8E8,
- 36786 - 11905: 0xDE72,
- 36787 - 11905: 0xDE73,
- 36788 - 11905: 0xDE74,
- 36789 - 11905: 0xDE75,
- 36790 - 11905: 0xE5C1,
- 36791 - 11905: 0xDE76,
- 36792 - 11905: 0xDE77,
- 36793 - 11905: 0xB1DF,
- 36794 - 11905: 0xDE78,
- 36795 - 11905: 0xDE79,
- 36796 - 11905: 0xDE7A,
- 36797 - 11905: 0xC1C9,
- 36798 - 11905: 0xB4EF,
- 36799 - 11905: 0xDE7B,
- 36800 - 11905: 0xDE7C,
- 36801 - 11905: 0xC7A8,
- 36802 - 11905: 0xD3D8,
- 36803 - 11905: 0xDE7D,
- 36804 - 11905: 0xC6F9,
- 36805 - 11905: 0xD1B8,
- 36806 - 11905: 0xDE7E,
- 36807 - 11905: 0xB9FD,
- 36808 - 11905: 0xC2F5,
- 36809 - 11905: 0xDE80,
- 36810 - 11905: 0xDE81,
- 36811 - 11905: 0xDE82,
- 36812 - 11905: 0xDE83,
- 36813 - 11905: 0xDE84,
- 36814 - 11905: 0xD3AD,
- 36815 - 11905: 0xDE85,
- 36816 - 11905: 0xD4CB,
- 36817 - 11905: 0xBDFC,
- 36818 - 11905: 0xDE86,
- 36819 - 11905: 0xE5C2,
- 36820 - 11905: 0xB7B5,
- 36821 - 11905: 0xE5C3,
- 36822 - 11905: 0xDE87,
- 36823 - 11905: 0xDE88,
- 36824 - 11905: 0xBBB9,
- 36825 - 11905: 0xD5E2,
- 36826 - 11905: 0xDE89,
- 36827 - 11905: 0xBDF8,
- 36828 - 11905: 0xD4B6,
- 36829 - 11905: 0xCEA5,
- 36830 - 11905: 0xC1AC,
- 36831 - 11905: 0xB3D9,
- 36832 - 11905: 0xDE8A,
- 36833 - 11905: 0xDE8B,
- 36834 - 11905: 0xCCF6,
- 36835 - 11905: 0xDE8C,
- 36836 - 11905: 0xE5C6,
- 36837 - 11905: 0xE5C4,
- 36838 - 11905: 0xE5C8,
- 36839 - 11905: 0xDE8D,
- 36840 - 11905: 0xE5CA,
- 36841 - 11905: 0xE5C7,
- 36842 - 11905: 0xB5CF,
- 36843 - 11905: 0xC6C8,
- 36844 - 11905: 0xDE8E,
- 36845 - 11905: 0xB5FC,
- 36846 - 11905: 0xE5C5,
- 36847 - 11905: 0xDE8F,
- 36848 - 11905: 0xCAF6,
- 36849 - 11905: 0xDE90,
- 36850 - 11905: 0xDE91,
- 36851 - 11905: 0xE5C9,
- 36852 - 11905: 0xDE92,
- 36853 - 11905: 0xDE93,
- 36854 - 11905: 0xDE94,
- 36855 - 11905: 0xC3D4,
- 36856 - 11905: 0xB1C5,
- 36857 - 11905: 0xBCA3,
- 36858 - 11905: 0xDE95,
- 36859 - 11905: 0xDE96,
- 36860 - 11905: 0xDE97,
- 36861 - 11905: 0xD7B7,
- 36862 - 11905: 0xDE98,
- 36863 - 11905: 0xDE99,
- 36864 - 11905: 0xCDCB,
- 36865 - 11905: 0xCBCD,
- 36866 - 11905: 0xCACA,
- 36867 - 11905: 0xCCD3,
- 36868 - 11905: 0xE5CC,
- 36869 - 11905: 0xE5CB,
- 36870 - 11905: 0xC4E6,
- 36871 - 11905: 0xDE9A,
- 36872 - 11905: 0xDE9B,
- 36873 - 11905: 0xD1A1,
- 36874 - 11905: 0xD1B7,
- 36875 - 11905: 0xE5CD,
- 36876 - 11905: 0xDE9C,
- 36877 - 11905: 0xE5D0,
- 36878 - 11905: 0xDE9D,
- 36879 - 11905: 0xCDB8,
- 36880 - 11905: 0xD6F0,
- 36881 - 11905: 0xE5CF,
- 36882 - 11905: 0xB5DD,
- 36883 - 11905: 0xDE9E,
- 36884 - 11905: 0xCDBE,
- 36885 - 11905: 0xDE9F,
- 36886 - 11905: 0xE5D1,
- 36887 - 11905: 0xB6BA,
- 36888 - 11905: 0xDEA0,
- 36889 - 11905: 0xDF40,
- 36890 - 11905: 0xCDA8,
- 36891 - 11905: 0xB9E4,
- 36892 - 11905: 0xDF41,
- 36893 - 11905: 0xCAC5,
- 36894 - 11905: 0xB3D1,
- 36895 - 11905: 0xCBD9,
- 36896 - 11905: 0xD4EC,
- 36897 - 11905: 0xE5D2,
- 36898 - 11905: 0xB7EA,
- 36899 - 11905: 0xDF42,
- 36900 - 11905: 0xDF43,
- 36901 - 11905: 0xDF44,
- 36902 - 11905: 0xE5CE,
- 36903 - 11905: 0xDF45,
- 36904 - 11905: 0xDF46,
- 36905 - 11905: 0xDF47,
- 36906 - 11905: 0xDF48,
- 36907 - 11905: 0xDF49,
- 36908 - 11905: 0xDF4A,
- 36909 - 11905: 0xE5D5,
- 36910 - 11905: 0xB4FE,
- 36911 - 11905: 0xE5D6,
- 36912 - 11905: 0xDF4B,
- 36913 - 11905: 0xDF4C,
- 36914 - 11905: 0xDF4D,
- 36915 - 11905: 0xDF4E,
- 36916 - 11905: 0xDF4F,
- 36917 - 11905: 0xE5D3,
- 36918 - 11905: 0xE5D4,
- 36919 - 11905: 0xDF50,
- 36920 - 11905: 0xD2DD,
- 36921 - 11905: 0xDF51,
- 36922 - 11905: 0xDF52,
- 36923 - 11905: 0xC2DF,
- 36924 - 11905: 0xB1C6,
- 36925 - 11905: 0xDF53,
- 36926 - 11905: 0xD3E2,
- 36927 - 11905: 0xDF54,
- 36928 - 11905: 0xDF55,
- 36929 - 11905: 0xB6DD,
- 36930 - 11905: 0xCBEC,
- 36931 - 11905: 0xDF56,
- 36932 - 11905: 0xE5D7,
- 36933 - 11905: 0xDF57,
- 36934 - 11905: 0xDF58,
- 36935 - 11905: 0xD3F6,
- 36936 - 11905: 0xDF59,
- 36937 - 11905: 0xDF5A,
- 36938 - 11905: 0xDF5B,
- 36939 - 11905: 0xDF5C,
- 36940 - 11905: 0xDF5D,
- 36941 - 11905: 0xB1E9,
- 36942 - 11905: 0xDF5E,
- 36943 - 11905: 0xB6F4,
- 36944 - 11905: 0xE5DA,
- 36945 - 11905: 0xE5D8,
- 36946 - 11905: 0xE5D9,
- 36947 - 11905: 0xB5C0,
- 36948 - 11905: 0xDF5F,
- 36949 - 11905: 0xDF60,
- 36950 - 11905: 0xDF61,
- 36951 - 11905: 0xD2C5,
- 36952 - 11905: 0xE5DC,
- 36953 - 11905: 0xDF62,
- 36954 - 11905: 0xDF63,
- 36955 - 11905: 0xE5DE,
- 36956 - 11905: 0xDF64,
- 36957 - 11905: 0xDF65,
- 36958 - 11905: 0xDF66,
- 36959 - 11905: 0xDF67,
- 36960 - 11905: 0xDF68,
- 36961 - 11905: 0xDF69,
- 36962 - 11905: 0xE5DD,
- 36963 - 11905: 0xC7B2,
- 36964 - 11905: 0xDF6A,
- 36965 - 11905: 0xD2A3,
- 36966 - 11905: 0xDF6B,
- 36967 - 11905: 0xDF6C,
- 36968 - 11905: 0xE5DB,
- 36969 - 11905: 0xDF6D,
- 36970 - 11905: 0xDF6E,
- 36971 - 11905: 0xDF6F,
- 36972 - 11905: 0xDF70,
- 36973 - 11905: 0xD4E2,
- 36974 - 11905: 0xD5DA,
- 36975 - 11905: 0xDF71,
- 36976 - 11905: 0xDF72,
- 36977 - 11905: 0xDF73,
- 36978 - 11905: 0xDF74,
- 36979 - 11905: 0xDF75,
- 36980 - 11905: 0xE5E0,
- 36981 - 11905: 0xD7F1,
- 36982 - 11905: 0xDF76,
- 36983 - 11905: 0xDF77,
- 36984 - 11905: 0xDF78,
- 36985 - 11905: 0xDF79,
- 36986 - 11905: 0xDF7A,
- 36987 - 11905: 0xDF7B,
- 36988 - 11905: 0xDF7C,
- 36989 - 11905: 0xE5E1,
- 36990 - 11905: 0xDF7D,
- 36991 - 11905: 0xB1DC,
- 36992 - 11905: 0xD1FB,
- 36993 - 11905: 0xDF7E,
- 36994 - 11905: 0xE5E2,
- 36995 - 11905: 0xE5E4,
- 36996 - 11905: 0xDF80,
- 36997 - 11905: 0xDF81,
- 36998 - 11905: 0xDF82,
- 36999 - 11905: 0xDF83,
- 37000 - 11905: 0xE5E3,
- 37001 - 11905: 0xDF84,
- 37002 - 11905: 0xDF85,
- 37003 - 11905: 0xE5E5,
- 37004 - 11905: 0xDF86,
- 37005 - 11905: 0xDF87,
- 37006 - 11905: 0xDF88,
- 37007 - 11905: 0xDF89,
- 37008 - 11905: 0xDF8A,
- 37009 - 11905: 0xD2D8,
- 37010 - 11905: 0xDF8B,
- 37011 - 11905: 0xB5CB,
- 37012 - 11905: 0xDF8C,
- 37013 - 11905: 0xE7DF,
- 37014 - 11905: 0xDF8D,
- 37015 - 11905: 0xDAF5,
- 37016 - 11905: 0xDF8E,
- 37017 - 11905: 0xDAF8,
- 37018 - 11905: 0xDF8F,
- 37019 - 11905: 0xDAF6,
- 37020 - 11905: 0xDF90,
- 37021 - 11905: 0xDAF7,
- 37022 - 11905: 0xDF91,
- 37023 - 11905: 0xDF92,
- 37024 - 11905: 0xDF93,
- 37025 - 11905: 0xDAFA,
- 37026 - 11905: 0xD0CF,
- 37027 - 11905: 0xC4C7,
- 37028 - 11905: 0xDF94,
- 37029 - 11905: 0xDF95,
- 37030 - 11905: 0xB0EE,
- 37031 - 11905: 0xDF96,
- 37032 - 11905: 0xDF97,
- 37033 - 11905: 0xDF98,
- 37034 - 11905: 0xD0B0,
- 37035 - 11905: 0xDF99,
- 37036 - 11905: 0xDAF9,
- 37037 - 11905: 0xDF9A,
- 37038 - 11905: 0xD3CA,
- 37039 - 11905: 0xBAAA,
- 37040 - 11905: 0xDBA2,
- 37041 - 11905: 0xC7F1,
- 37042 - 11905: 0xDF9B,
- 37043 - 11905: 0xDAFC,
- 37044 - 11905: 0xDAFB,
- 37045 - 11905: 0xC9DB,
- 37046 - 11905: 0xDAFD,
- 37047 - 11905: 0xDF9C,
- 37048 - 11905: 0xDBA1,
- 37049 - 11905: 0xD7DE,
- 37050 - 11905: 0xDAFE,
- 37051 - 11905: 0xC1DA,
- 37052 - 11905: 0xDF9D,
- 37053 - 11905: 0xDF9E,
- 37054 - 11905: 0xDBA5,
- 37055 - 11905: 0xDF9F,
- 37056 - 11905: 0xDFA0,
- 37057 - 11905: 0xD3F4,
- 37058 - 11905: 0xE040,
- 37059 - 11905: 0xE041,
- 37060 - 11905: 0xDBA7,
- 37061 - 11905: 0xDBA4,
- 37062 - 11905: 0xE042,
- 37063 - 11905: 0xDBA8,
- 37064 - 11905: 0xE043,
- 37065 - 11905: 0xE044,
- 37066 - 11905: 0xBDBC,
- 37067 - 11905: 0xE045,
- 37068 - 11905: 0xE046,
- 37069 - 11905: 0xE047,
- 37070 - 11905: 0xC0C9,
- 37071 - 11905: 0xDBA3,
- 37072 - 11905: 0xDBA6,
- 37073 - 11905: 0xD6A3,
- 37074 - 11905: 0xE048,
- 37075 - 11905: 0xDBA9,
- 37076 - 11905: 0xE049,
- 37077 - 11905: 0xE04A,
- 37078 - 11905: 0xE04B,
- 37079 - 11905: 0xDBAD,
- 37080 - 11905: 0xE04C,
- 37081 - 11905: 0xE04D,
- 37082 - 11905: 0xE04E,
- 37083 - 11905: 0xDBAE,
- 37084 - 11905: 0xDBAC,
- 37085 - 11905: 0xBAC2,
- 37086 - 11905: 0xE04F,
- 37087 - 11905: 0xE050,
- 37088 - 11905: 0xE051,
- 37089 - 11905: 0xBFA4,
- 37090 - 11905: 0xDBAB,
- 37091 - 11905: 0xE052,
- 37092 - 11905: 0xE053,
- 37093 - 11905: 0xE054,
- 37094 - 11905: 0xDBAA,
- 37095 - 11905: 0xD4C7,
- 37096 - 11905: 0xB2BF,
- 37097 - 11905: 0xE055,
- 37098 - 11905: 0xE056,
- 37099 - 11905: 0xDBAF,
- 37100 - 11905: 0xE057,
- 37101 - 11905: 0xB9F9,
- 37102 - 11905: 0xE058,
- 37103 - 11905: 0xDBB0,
- 37104 - 11905: 0xE059,
- 37105 - 11905: 0xE05A,
- 37106 - 11905: 0xE05B,
- 37107 - 11905: 0xE05C,
- 37108 - 11905: 0xB3BB,
- 37109 - 11905: 0xE05D,
- 37110 - 11905: 0xE05E,
- 37111 - 11905: 0xE05F,
- 37112 - 11905: 0xB5A6,
- 37113 - 11905: 0xE060,
- 37114 - 11905: 0xE061,
- 37115 - 11905: 0xE062,
- 37116 - 11905: 0xE063,
- 37117 - 11905: 0xB6BC,
- 37118 - 11905: 0xDBB1,
- 37119 - 11905: 0xE064,
- 37120 - 11905: 0xE065,
- 37121 - 11905: 0xE066,
- 37122 - 11905: 0xB6F5,
- 37123 - 11905: 0xE067,
- 37124 - 11905: 0xDBB2,
- 37125 - 11905: 0xE068,
- 37126 - 11905: 0xE069,
- 37127 - 11905: 0xE06A,
- 37128 - 11905: 0xE06B,
- 37129 - 11905: 0xE06C,
- 37130 - 11905: 0xE06D,
- 37131 - 11905: 0xE06E,
- 37132 - 11905: 0xE06F,
- 37133 - 11905: 0xE070,
- 37134 - 11905: 0xE071,
- 37135 - 11905: 0xE072,
- 37136 - 11905: 0xE073,
- 37137 - 11905: 0xE074,
- 37138 - 11905: 0xE075,
- 37139 - 11905: 0xE076,
- 37140 - 11905: 0xE077,
- 37141 - 11905: 0xE078,
- 37142 - 11905: 0xE079,
- 37143 - 11905: 0xE07A,
- 37144 - 11905: 0xE07B,
- 37145 - 11905: 0xB1C9,
- 37146 - 11905: 0xE07C,
- 37147 - 11905: 0xE07D,
- 37148 - 11905: 0xE07E,
- 37149 - 11905: 0xE080,
- 37150 - 11905: 0xDBB4,
- 37151 - 11905: 0xE081,
- 37152 - 11905: 0xE082,
- 37153 - 11905: 0xE083,
- 37154 - 11905: 0xDBB3,
- 37155 - 11905: 0xDBB5,
- 37156 - 11905: 0xE084,
- 37157 - 11905: 0xE085,
- 37158 - 11905: 0xE086,
- 37159 - 11905: 0xE087,
- 37160 - 11905: 0xE088,
- 37161 - 11905: 0xE089,
- 37162 - 11905: 0xE08A,
- 37163 - 11905: 0xE08B,
- 37164 - 11905: 0xE08C,
- 37165 - 11905: 0xE08D,
- 37166 - 11905: 0xE08E,
- 37167 - 11905: 0xDBB7,
- 37168 - 11905: 0xE08F,
- 37169 - 11905: 0xDBB6,
- 37170 - 11905: 0xE090,
- 37171 - 11905: 0xE091,
- 37172 - 11905: 0xE092,
- 37173 - 11905: 0xE093,
- 37174 - 11905: 0xE094,
- 37175 - 11905: 0xE095,
- 37176 - 11905: 0xE096,
- 37177 - 11905: 0xDBB8,
- 37178 - 11905: 0xE097,
- 37179 - 11905: 0xE098,
- 37180 - 11905: 0xE099,
- 37181 - 11905: 0xE09A,
- 37182 - 11905: 0xE09B,
- 37183 - 11905: 0xE09C,
- 37184 - 11905: 0xE09D,
- 37185 - 11905: 0xE09E,
- 37186 - 11905: 0xE09F,
- 37187 - 11905: 0xDBB9,
- 37188 - 11905: 0xE0A0,
- 37189 - 11905: 0xE140,
- 37190 - 11905: 0xDBBA,
- 37191 - 11905: 0xE141,
- 37192 - 11905: 0xE142,
- 37193 - 11905: 0xD3CF,
- 37194 - 11905: 0xF4FA,
- 37195 - 11905: 0xC7F5,
- 37196 - 11905: 0xD7C3,
- 37197 - 11905: 0xC5E4,
- 37198 - 11905: 0xF4FC,
- 37199 - 11905: 0xF4FD,
- 37200 - 11905: 0xF4FB,
- 37201 - 11905: 0xE143,
- 37202 - 11905: 0xBEC6,
- 37203 - 11905: 0xE144,
- 37204 - 11905: 0xE145,
- 37205 - 11905: 0xE146,
- 37206 - 11905: 0xE147,
- 37207 - 11905: 0xD0EF,
- 37208 - 11905: 0xE148,
- 37209 - 11905: 0xE149,
- 37210 - 11905: 0xB7D3,
- 37211 - 11905: 0xE14A,
- 37212 - 11905: 0xE14B,
- 37213 - 11905: 0xD4CD,
- 37214 - 11905: 0xCCAA,
- 37215 - 11905: 0xE14C,
- 37216 - 11905: 0xE14D,
- 37217 - 11905: 0xF5A2,
- 37218 - 11905: 0xF5A1,
- 37219 - 11905: 0xBAA8,
- 37220 - 11905: 0xF4FE,
- 37221 - 11905: 0xCBD6,
- 37222 - 11905: 0xE14E,
- 37223 - 11905: 0xE14F,
- 37224 - 11905: 0xE150,
- 37225 - 11905: 0xF5A4,
- 37226 - 11905: 0xC0D2,
- 37227 - 11905: 0xE151,
- 37228 - 11905: 0xB3EA,
- 37229 - 11905: 0xE152,
- 37230 - 11905: 0xCDAA,
- 37231 - 11905: 0xF5A5,
- 37232 - 11905: 0xF5A3,
- 37233 - 11905: 0xBDB4,
- 37234 - 11905: 0xF5A8,
- 37235 - 11905: 0xE153,
- 37236 - 11905: 0xF5A9,
- 37237 - 11905: 0xBDCD,
- 37238 - 11905: 0xC3B8,
- 37239 - 11905: 0xBFE1,
- 37240 - 11905: 0xCBE1,
- 37241 - 11905: 0xF5AA,
- 37242 - 11905: 0xE154,
- 37243 - 11905: 0xE155,
- 37244 - 11905: 0xE156,
- 37245 - 11905: 0xF5A6,
- 37246 - 11905: 0xF5A7,
- 37247 - 11905: 0xC4F0,
- 37248 - 11905: 0xE157,
- 37249 - 11905: 0xE158,
- 37250 - 11905: 0xE159,
- 37251 - 11905: 0xE15A,
- 37252 - 11905: 0xE15B,
- 37253 - 11905: 0xF5AC,
- 37254 - 11905: 0xE15C,
- 37255 - 11905: 0xB4BC,
- 37256 - 11905: 0xE15D,
- 37257 - 11905: 0xD7ED,
- 37258 - 11905: 0xE15E,
- 37259 - 11905: 0xB4D7,
- 37260 - 11905: 0xF5AB,
- 37261 - 11905: 0xF5AE,
- 37262 - 11905: 0xE15F,
- 37263 - 11905: 0xE160,
- 37264 - 11905: 0xF5AD,
- 37265 - 11905: 0xF5AF,
- 37266 - 11905: 0xD0D1,
- 37267 - 11905: 0xE161,
- 37268 - 11905: 0xE162,
- 37269 - 11905: 0xE163,
- 37270 - 11905: 0xE164,
- 37271 - 11905: 0xE165,
- 37272 - 11905: 0xE166,
- 37273 - 11905: 0xE167,
- 37274 - 11905: 0xC3D1,
- 37275 - 11905: 0xC8A9,
- 37276 - 11905: 0xE168,
- 37277 - 11905: 0xE169,
- 37278 - 11905: 0xE16A,
- 37279 - 11905: 0xE16B,
- 37280 - 11905: 0xE16C,
- 37281 - 11905: 0xE16D,
- 37282 - 11905: 0xF5B0,
- 37283 - 11905: 0xF5B1,
- 37284 - 11905: 0xE16E,
- 37285 - 11905: 0xE16F,
- 37286 - 11905: 0xE170,
- 37287 - 11905: 0xE171,
- 37288 - 11905: 0xE172,
- 37289 - 11905: 0xE173,
- 37290 - 11905: 0xF5B2,
- 37291 - 11905: 0xE174,
- 37292 - 11905: 0xE175,
- 37293 - 11905: 0xF5B3,
- 37294 - 11905: 0xF5B4,
- 37295 - 11905: 0xF5B5,
- 37296 - 11905: 0xE176,
- 37297 - 11905: 0xE177,
- 37298 - 11905: 0xE178,
- 37299 - 11905: 0xE179,
- 37300 - 11905: 0xF5B7,
- 37301 - 11905: 0xF5B6,
- 37302 - 11905: 0xE17A,
- 37303 - 11905: 0xE17B,
- 37304 - 11905: 0xE17C,
- 37305 - 11905: 0xE17D,
- 37306 - 11905: 0xF5B8,
- 37307 - 11905: 0xE17E,
- 37308 - 11905: 0xE180,
- 37309 - 11905: 0xE181,
- 37310 - 11905: 0xE182,
- 37311 - 11905: 0xE183,
- 37312 - 11905: 0xE184,
- 37313 - 11905: 0xE185,
- 37314 - 11905: 0xE186,
- 37315 - 11905: 0xE187,
- 37316 - 11905: 0xE188,
- 37317 - 11905: 0xE189,
- 37318 - 11905: 0xE18A,
- 37319 - 11905: 0xB2C9,
- 37320 - 11905: 0xE18B,
- 37321 - 11905: 0xD3D4,
- 37322 - 11905: 0xCACD,
- 37323 - 11905: 0xE18C,
- 37324 - 11905: 0xC0EF,
- 37325 - 11905: 0xD6D8,
- 37326 - 11905: 0xD2B0,
- 37327 - 11905: 0xC1BF,
- 37328 - 11905: 0xE18D,
- 37329 - 11905: 0xBDF0,
- 37330 - 11905: 0xE18E,
- 37331 - 11905: 0xE18F,
- 37332 - 11905: 0xE190,
- 37333 - 11905: 0xE191,
- 37334 - 11905: 0xE192,
- 37335 - 11905: 0xE193,
- 37336 - 11905: 0xE194,
- 37337 - 11905: 0xE195,
- 37338 - 11905: 0xE196,
- 37339 - 11905: 0xE197,
- 37340 - 11905: 0xB8AA,
- 37341 - 11905: 0xE198,
- 37342 - 11905: 0xE199,
- 37343 - 11905: 0xE19A,
- 37344 - 11905: 0xE19B,
- 37345 - 11905: 0xE19C,
- 37346 - 11905: 0xE19D,
- 37347 - 11905: 0xE19E,
- 37348 - 11905: 0xE19F,
- 37349 - 11905: 0xE1A0,
- 37350 - 11905: 0xE240,
- 37351 - 11905: 0xE241,
- 37352 - 11905: 0xE242,
- 37353 - 11905: 0xE243,
- 37354 - 11905: 0xE244,
- 37355 - 11905: 0xE245,
- 37356 - 11905: 0xE246,
- 37357 - 11905: 0xE247,
- 37358 - 11905: 0xE248,
- 37359 - 11905: 0xE249,
- 37360 - 11905: 0xE24A,
- 37361 - 11905: 0xE24B,
- 37362 - 11905: 0xE24C,
- 37363 - 11905: 0xE24D,
- 37364 - 11905: 0xE24E,
- 37365 - 11905: 0xE24F,
- 37366 - 11905: 0xE250,
- 37367 - 11905: 0xE251,
- 37368 - 11905: 0xE252,
- 37369 - 11905: 0xE253,
- 37370 - 11905: 0xE254,
- 37371 - 11905: 0xE255,
- 37372 - 11905: 0xE256,
- 37373 - 11905: 0xE257,
- 37374 - 11905: 0xE258,
- 37375 - 11905: 0xE259,
- 37376 - 11905: 0xE25A,
- 37377 - 11905: 0xE25B,
- 37378 - 11905: 0xE25C,
- 37379 - 11905: 0xE25D,
- 37380 - 11905: 0xE25E,
- 37381 - 11905: 0xE25F,
- 37382 - 11905: 0xE260,
- 37383 - 11905: 0xE261,
- 37384 - 11905: 0xE262,
- 37385 - 11905: 0xE263,
- 37386 - 11905: 0xE264,
- 37387 - 11905: 0xE265,
- 37388 - 11905: 0xE266,
- 37389 - 11905: 0xE267,
- 37390 - 11905: 0xE268,
- 37391 - 11905: 0xE269,
- 37392 - 11905: 0xE26A,
- 37393 - 11905: 0xE26B,
- 37394 - 11905: 0xE26C,
- 37395 - 11905: 0xE26D,
- 37396 - 11905: 0xE26E,
- 37397 - 11905: 0xE26F,
- 37398 - 11905: 0xE270,
- 37399 - 11905: 0xE271,
- 37400 - 11905: 0xE272,
- 37401 - 11905: 0xE273,
- 37402 - 11905: 0xE274,
- 37403 - 11905: 0xE275,
- 37404 - 11905: 0xE276,
- 37405 - 11905: 0xE277,
- 37406 - 11905: 0xE278,
- 37407 - 11905: 0xE279,
- 37408 - 11905: 0xE27A,
- 37409 - 11905: 0xE27B,
- 37410 - 11905: 0xE27C,
- 37411 - 11905: 0xE27D,
- 37412 - 11905: 0xE27E,
- 37413 - 11905: 0xE280,
- 37414 - 11905: 0xE281,
- 37415 - 11905: 0xE282,
- 37416 - 11905: 0xE283,
- 37417 - 11905: 0xE284,
- 37418 - 11905: 0xE285,
- 37419 - 11905: 0xE286,
- 37420 - 11905: 0xE287,
- 37421 - 11905: 0xE288,
- 37422 - 11905: 0xE289,
- 37423 - 11905: 0xE28A,
- 37424 - 11905: 0xE28B,
- 37425 - 11905: 0xE28C,
- 37426 - 11905: 0xE28D,
- 37427 - 11905: 0xE28E,
- 37428 - 11905: 0xE28F,
- 37429 - 11905: 0xE290,
- 37430 - 11905: 0xE291,
- 37431 - 11905: 0xE292,
- 37432 - 11905: 0xE293,
- 37433 - 11905: 0xE294,
- 37434 - 11905: 0xE295,
- 37435 - 11905: 0xE296,
- 37436 - 11905: 0xE297,
- 37437 - 11905: 0xE298,
- 37438 - 11905: 0xE299,
- 37439 - 11905: 0xE29A,
- 37440 - 11905: 0xE29B,
- 37441 - 11905: 0xE29C,
- 37442 - 11905: 0xE29D,
- 37443 - 11905: 0xE29E,
- 37444 - 11905: 0xE29F,
- 37445 - 11905: 0xE2A0,
- 37446 - 11905: 0xE340,
- 37447 - 11905: 0xE341,
- 37448 - 11905: 0xE342,
- 37449 - 11905: 0xE343,
- 37450 - 11905: 0xE344,
- 37451 - 11905: 0xE345,
- 37452 - 11905: 0xE346,
- 37453 - 11905: 0xE347,
- 37454 - 11905: 0xE348,
- 37455 - 11905: 0xE349,
- 37456 - 11905: 0xE34A,
- 37457 - 11905: 0xE34B,
- 37458 - 11905: 0xE34C,
- 37459 - 11905: 0xE34D,
- 37460 - 11905: 0xE34E,
- 37461 - 11905: 0xE34F,
- 37462 - 11905: 0xE350,
- 37463 - 11905: 0xE351,
- 37464 - 11905: 0xE352,
- 37465 - 11905: 0xE353,
- 37466 - 11905: 0xE354,
- 37467 - 11905: 0xE355,
- 37468 - 11905: 0xE356,
- 37469 - 11905: 0xE357,
- 37470 - 11905: 0xE358,
- 37471 - 11905: 0xE359,
- 37472 - 11905: 0xE35A,
- 37473 - 11905: 0xE35B,
- 37474 - 11905: 0xE35C,
- 37475 - 11905: 0xE35D,
- 37476 - 11905: 0xE35E,
- 37477 - 11905: 0xE35F,
- 37478 - 11905: 0xE360,
- 37479 - 11905: 0xE361,
- 37480 - 11905: 0xE362,
- 37481 - 11905: 0xE363,
- 37482 - 11905: 0xE364,
- 37483 - 11905: 0xE365,
- 37484 - 11905: 0xE366,
- 37485 - 11905: 0xE367,
- 37486 - 11905: 0xE368,
- 37487 - 11905: 0xE369,
- 37488 - 11905: 0xE36A,
- 37489 - 11905: 0xE36B,
- 37490 - 11905: 0xE36C,
- 37491 - 11905: 0xE36D,
- 37492 - 11905: 0xBCF8,
- 37493 - 11905: 0xE36E,
- 37494 - 11905: 0xE36F,
- 37495 - 11905: 0xE370,
- 37496 - 11905: 0xE371,
- 37497 - 11905: 0xE372,
- 37498 - 11905: 0xE373,
- 37499 - 11905: 0xE374,
- 37500 - 11905: 0xE375,
- 37501 - 11905: 0xE376,
- 37502 - 11905: 0xE377,
- 37503 - 11905: 0xE378,
- 37504 - 11905: 0xE379,
- 37505 - 11905: 0xE37A,
- 37506 - 11905: 0xE37B,
- 37507 - 11905: 0xE37C,
- 37508 - 11905: 0xE37D,
- 37509 - 11905: 0xE37E,
- 37510 - 11905: 0xE380,
- 37511 - 11905: 0xE381,
- 37512 - 11905: 0xE382,
- 37513 - 11905: 0xE383,
- 37514 - 11905: 0xE384,
- 37515 - 11905: 0xE385,
- 37516 - 11905: 0xE386,
- 37517 - 11905: 0xE387,
- 37518 - 11905: 0xF6C6,
- 37519 - 11905: 0xE388,
- 37520 - 11905: 0xE389,
- 37521 - 11905: 0xE38A,
- 37522 - 11905: 0xE38B,
- 37523 - 11905: 0xE38C,
- 37524 - 11905: 0xE38D,
- 37525 - 11905: 0xE38E,
- 37526 - 11905: 0xE38F,
- 37527 - 11905: 0xE390,
- 37528 - 11905: 0xE391,
- 37529 - 11905: 0xE392,
- 37530 - 11905: 0xE393,
- 37531 - 11905: 0xE394,
- 37532 - 11905: 0xE395,
- 37533 - 11905: 0xE396,
- 37534 - 11905: 0xE397,
- 37535 - 11905: 0xE398,
- 37536 - 11905: 0xE399,
- 37537 - 11905: 0xE39A,
- 37538 - 11905: 0xE39B,
- 37539 - 11905: 0xE39C,
- 37540 - 11905: 0xE39D,
- 37541 - 11905: 0xE39E,
- 37542 - 11905: 0xE39F,
- 37543 - 11905: 0xE3A0,
- 37544 - 11905: 0xE440,
- 37545 - 11905: 0xE441,
- 37546 - 11905: 0xE442,
- 37547 - 11905: 0xE443,
- 37548 - 11905: 0xE444,
- 37549 - 11905: 0xE445,
- 37550 - 11905: 0xF6C7,
- 37551 - 11905: 0xE446,
- 37552 - 11905: 0xE447,
- 37553 - 11905: 0xE448,
- 37554 - 11905: 0xE449,
- 37555 - 11905: 0xE44A,
- 37556 - 11905: 0xE44B,
- 37557 - 11905: 0xE44C,
- 37558 - 11905: 0xE44D,
- 37559 - 11905: 0xE44E,
- 37560 - 11905: 0xE44F,
- 37561 - 11905: 0xE450,
- 37562 - 11905: 0xE451,
- 37563 - 11905: 0xE452,
- 37564 - 11905: 0xE453,
- 37565 - 11905: 0xE454,
- 37566 - 11905: 0xE455,
- 37567 - 11905: 0xE456,
- 37568 - 11905: 0xE457,
- 37569 - 11905: 0xE458,
- 37570 - 11905: 0xE459,
- 37571 - 11905: 0xE45A,
- 37572 - 11905: 0xE45B,
- 37573 - 11905: 0xE45C,
- 37574 - 11905: 0xE45D,
- 37575 - 11905: 0xE45E,
- 37576 - 11905: 0xF6C8,
- 37577 - 11905: 0xE45F,
- 37578 - 11905: 0xE460,
- 37579 - 11905: 0xE461,
- 37580 - 11905: 0xE462,
- 37581 - 11905: 0xE463,
- 37582 - 11905: 0xE464,
- 37583 - 11905: 0xE465,
- 37584 - 11905: 0xE466,
- 37585 - 11905: 0xE467,
- 37586 - 11905: 0xE468,
- 37587 - 11905: 0xE469,
- 37588 - 11905: 0xE46A,
- 37589 - 11905: 0xE46B,
- 37590 - 11905: 0xE46C,
- 37591 - 11905: 0xE46D,
- 37592 - 11905: 0xE46E,
- 37593 - 11905: 0xE46F,
- 37594 - 11905: 0xE470,
- 37595 - 11905: 0xE471,
- 37596 - 11905: 0xE472,
- 37597 - 11905: 0xE473,
- 37598 - 11905: 0xE474,
- 37599 - 11905: 0xE475,
- 37600 - 11905: 0xE476,
- 37601 - 11905: 0xE477,
- 37602 - 11905: 0xE478,
- 37603 - 11905: 0xE479,
- 37604 - 11905: 0xE47A,
- 37605 - 11905: 0xE47B,
- 37606 - 11905: 0xE47C,
- 37607 - 11905: 0xE47D,
- 37608 - 11905: 0xE47E,
- 37609 - 11905: 0xE480,
- 37610 - 11905: 0xE481,
- 37611 - 11905: 0xE482,
- 37612 - 11905: 0xE483,
- 37613 - 11905: 0xE484,
- 37614 - 11905: 0xE485,
- 37615 - 11905: 0xE486,
- 37616 - 11905: 0xE487,
- 37617 - 11905: 0xE488,
- 37618 - 11905: 0xE489,
- 37619 - 11905: 0xE48A,
- 37620 - 11905: 0xE48B,
- 37621 - 11905: 0xE48C,
- 37622 - 11905: 0xE48D,
- 37623 - 11905: 0xE48E,
- 37624 - 11905: 0xE48F,
- 37625 - 11905: 0xE490,
- 37626 - 11905: 0xE491,
- 37627 - 11905: 0xE492,
- 37628 - 11905: 0xE493,
- 37629 - 11905: 0xE494,
- 37630 - 11905: 0xE495,
- 37631 - 11905: 0xE496,
- 37632 - 11905: 0xE497,
- 37633 - 11905: 0xE498,
- 37634 - 11905: 0xE499,
- 37635 - 11905: 0xE49A,
- 37636 - 11905: 0xE49B,
- 37637 - 11905: 0xE49C,
- 37638 - 11905: 0xE49D,
- 37639 - 11905: 0xE49E,
- 37640 - 11905: 0xE49F,
- 37641 - 11905: 0xE4A0,
- 37642 - 11905: 0xE540,
- 37643 - 11905: 0xE541,
- 37644 - 11905: 0xE542,
- 37645 - 11905: 0xE543,
- 37646 - 11905: 0xE544,
- 37647 - 11905: 0xE545,
- 37648 - 11905: 0xE546,
- 37649 - 11905: 0xE547,
- 37650 - 11905: 0xE548,
- 37651 - 11905: 0xE549,
- 37652 - 11905: 0xE54A,
- 37653 - 11905: 0xE54B,
- 37654 - 11905: 0xE54C,
- 37655 - 11905: 0xE54D,
- 37656 - 11905: 0xE54E,
- 37657 - 11905: 0xE54F,
- 37658 - 11905: 0xE550,
- 37659 - 11905: 0xE551,
- 37660 - 11905: 0xE552,
- 37661 - 11905: 0xE553,
- 37662 - 11905: 0xE554,
- 37663 - 11905: 0xE555,
- 37664 - 11905: 0xE556,
- 37665 - 11905: 0xE557,
- 37666 - 11905: 0xE558,
- 37667 - 11905: 0xE559,
- 37668 - 11905: 0xE55A,
- 37669 - 11905: 0xE55B,
- 37670 - 11905: 0xE55C,
- 37671 - 11905: 0xE55D,
- 37672 - 11905: 0xE55E,
- 37673 - 11905: 0xE55F,
- 37674 - 11905: 0xE560,
- 37675 - 11905: 0xE561,
- 37676 - 11905: 0xE562,
- 37677 - 11905: 0xE563,
- 37678 - 11905: 0xE564,
- 37679 - 11905: 0xE565,
- 37680 - 11905: 0xE566,
- 37681 - 11905: 0xE567,
- 37682 - 11905: 0xE568,
- 37683 - 11905: 0xE569,
- 37684 - 11905: 0xE56A,
- 37685 - 11905: 0xE56B,
- 37686 - 11905: 0xE56C,
- 37687 - 11905: 0xE56D,
- 37688 - 11905: 0xE56E,
- 37689 - 11905: 0xE56F,
- 37690 - 11905: 0xE570,
- 37691 - 11905: 0xE571,
- 37692 - 11905: 0xE572,
- 37693 - 11905: 0xE573,
- 37694 - 11905: 0xF6C9,
- 37695 - 11905: 0xE574,
- 37696 - 11905: 0xE575,
- 37697 - 11905: 0xE576,
- 37698 - 11905: 0xE577,
- 37699 - 11905: 0xE578,
- 37700 - 11905: 0xE579,
- 37701 - 11905: 0xE57A,
- 37702 - 11905: 0xE57B,
- 37703 - 11905: 0xE57C,
- 37704 - 11905: 0xE57D,
- 37705 - 11905: 0xE57E,
- 37706 - 11905: 0xE580,
- 37707 - 11905: 0xE581,
- 37708 - 11905: 0xE582,
- 37709 - 11905: 0xE583,
- 37710 - 11905: 0xE584,
- 37711 - 11905: 0xE585,
- 37712 - 11905: 0xE586,
- 37713 - 11905: 0xE587,
- 37714 - 11905: 0xE588,
- 37715 - 11905: 0xE589,
- 37716 - 11905: 0xE58A,
- 37717 - 11905: 0xE58B,
- 37718 - 11905: 0xE58C,
- 37719 - 11905: 0xE58D,
- 37720 - 11905: 0xE58E,
- 37721 - 11905: 0xE58F,
- 37722 - 11905: 0xE590,
- 37723 - 11905: 0xE591,
- 37724 - 11905: 0xE592,
- 37725 - 11905: 0xE593,
- 37726 - 11905: 0xE594,
- 37727 - 11905: 0xE595,
- 37728 - 11905: 0xE596,
- 37729 - 11905: 0xE597,
- 37730 - 11905: 0xE598,
- 37731 - 11905: 0xE599,
- 37732 - 11905: 0xE59A,
- 37733 - 11905: 0xE59B,
- 37734 - 11905: 0xE59C,
- 37735 - 11905: 0xE59D,
- 37736 - 11905: 0xE59E,
- 37737 - 11905: 0xE59F,
- 37738 - 11905: 0xF6CA,
- 37739 - 11905: 0xE5A0,
- 37740 - 11905: 0xE640,
- 37741 - 11905: 0xE641,
- 37742 - 11905: 0xE642,
- 37743 - 11905: 0xE643,
- 37744 - 11905: 0xE644,
- 37745 - 11905: 0xE645,
- 37746 - 11905: 0xE646,
- 37747 - 11905: 0xE647,
- 37748 - 11905: 0xE648,
- 37749 - 11905: 0xE649,
- 37750 - 11905: 0xE64A,
- 37751 - 11905: 0xE64B,
- 37752 - 11905: 0xE64C,
- 37753 - 11905: 0xE64D,
- 37754 - 11905: 0xE64E,
- 37755 - 11905: 0xE64F,
- 37756 - 11905: 0xE650,
- 37757 - 11905: 0xE651,
- 37758 - 11905: 0xE652,
- 37759 - 11905: 0xE653,
- 37760 - 11905: 0xE654,
- 37761 - 11905: 0xE655,
- 37762 - 11905: 0xE656,
- 37763 - 11905: 0xE657,
- 37764 - 11905: 0xE658,
- 37765 - 11905: 0xE659,
- 37766 - 11905: 0xE65A,
- 37767 - 11905: 0xE65B,
- 37768 - 11905: 0xE65C,
- 37769 - 11905: 0xE65D,
- 37770 - 11905: 0xE65E,
- 37771 - 11905: 0xE65F,
- 37772 - 11905: 0xE660,
- 37773 - 11905: 0xE661,
- 37774 - 11905: 0xE662,
- 37775 - 11905: 0xF6CC,
- 37776 - 11905: 0xE663,
- 37777 - 11905: 0xE664,
- 37778 - 11905: 0xE665,
- 37779 - 11905: 0xE666,
- 37780 - 11905: 0xE667,
- 37781 - 11905: 0xE668,
- 37782 - 11905: 0xE669,
- 37783 - 11905: 0xE66A,
- 37784 - 11905: 0xE66B,
- 37785 - 11905: 0xE66C,
- 37786 - 11905: 0xE66D,
- 37787 - 11905: 0xE66E,
- 37788 - 11905: 0xE66F,
- 37789 - 11905: 0xE670,
- 37790 - 11905: 0xE671,
- 37791 - 11905: 0xE672,
- 37792 - 11905: 0xE673,
- 37793 - 11905: 0xE674,
- 37794 - 11905: 0xE675,
- 37795 - 11905: 0xE676,
- 37796 - 11905: 0xE677,
- 37797 - 11905: 0xE678,
- 37798 - 11905: 0xE679,
- 37799 - 11905: 0xE67A,
- 37800 - 11905: 0xE67B,
- 37801 - 11905: 0xE67C,
- 37802 - 11905: 0xE67D,
- 37803 - 11905: 0xE67E,
- 37804 - 11905: 0xE680,
- 37805 - 11905: 0xE681,
- 37806 - 11905: 0xE682,
- 37807 - 11905: 0xE683,
- 37808 - 11905: 0xE684,
- 37809 - 11905: 0xE685,
- 37810 - 11905: 0xE686,
- 37811 - 11905: 0xE687,
- 37812 - 11905: 0xE688,
- 37813 - 11905: 0xE689,
- 37814 - 11905: 0xE68A,
- 37815 - 11905: 0xE68B,
- 37816 - 11905: 0xE68C,
- 37817 - 11905: 0xE68D,
- 37818 - 11905: 0xE68E,
- 37819 - 11905: 0xE68F,
- 37820 - 11905: 0xE690,
- 37821 - 11905: 0xE691,
- 37822 - 11905: 0xE692,
- 37823 - 11905: 0xE693,
- 37824 - 11905: 0xE694,
- 37825 - 11905: 0xE695,
- 37826 - 11905: 0xE696,
- 37827 - 11905: 0xE697,
- 37828 - 11905: 0xE698,
- 37829 - 11905: 0xE699,
- 37830 - 11905: 0xE69A,
- 37831 - 11905: 0xE69B,
- 37832 - 11905: 0xE69C,
- 37833 - 11905: 0xE69D,
- 37834 - 11905: 0xF6CB,
- 37835 - 11905: 0xE69E,
- 37836 - 11905: 0xE69F,
- 37837 - 11905: 0xE6A0,
- 37838 - 11905: 0xE740,
- 37839 - 11905: 0xE741,
- 37840 - 11905: 0xE742,
- 37841 - 11905: 0xE743,
- 37842 - 11905: 0xE744,
- 37843 - 11905: 0xE745,
- 37844 - 11905: 0xE746,
- 37845 - 11905: 0xE747,
- 37846 - 11905: 0xF7E9,
- 37847 - 11905: 0xE748,
- 37848 - 11905: 0xE749,
- 37849 - 11905: 0xE74A,
- 37850 - 11905: 0xE74B,
- 37851 - 11905: 0xE74C,
- 37852 - 11905: 0xE74D,
- 37853 - 11905: 0xE74E,
- 37854 - 11905: 0xE74F,
- 37855 - 11905: 0xE750,
- 37856 - 11905: 0xE751,
- 37857 - 11905: 0xE752,
- 37858 - 11905: 0xE753,
- 37859 - 11905: 0xE754,
- 37860 - 11905: 0xE755,
- 37861 - 11905: 0xE756,
- 37862 - 11905: 0xE757,
- 37863 - 11905: 0xE758,
- 37864 - 11905: 0xE759,
- 37865 - 11905: 0xE75A,
- 37866 - 11905: 0xE75B,
- 37867 - 11905: 0xE75C,
- 37868 - 11905: 0xE75D,
- 37869 - 11905: 0xE75E,
- 37870 - 11905: 0xE75F,
- 37871 - 11905: 0xE760,
- 37872 - 11905: 0xE761,
- 37873 - 11905: 0xE762,
- 37874 - 11905: 0xE763,
- 37875 - 11905: 0xE764,
- 37876 - 11905: 0xE765,
- 37877 - 11905: 0xE766,
- 37878 - 11905: 0xE767,
- 37879 - 11905: 0xE768,
- 37880 - 11905: 0xE769,
- 37881 - 11905: 0xE76A,
- 37882 - 11905: 0xE76B,
- 37883 - 11905: 0xE76C,
- 37884 - 11905: 0xE76D,
- 37885 - 11905: 0xE76E,
- 37886 - 11905: 0xE76F,
- 37887 - 11905: 0xE770,
- 37888 - 11905: 0xE771,
- 37889 - 11905: 0xE772,
- 37890 - 11905: 0xE773,
- 37891 - 11905: 0xE774,
- 37892 - 11905: 0xE775,
- 37893 - 11905: 0xE776,
- 37894 - 11905: 0xE777,
- 37895 - 11905: 0xE778,
- 37896 - 11905: 0xE779,
- 37897 - 11905: 0xE77A,
- 37898 - 11905: 0xE77B,
- 37899 - 11905: 0xE77C,
- 37900 - 11905: 0xE77D,
- 37901 - 11905: 0xE77E,
- 37902 - 11905: 0xE780,
- 37903 - 11905: 0xE781,
- 37904 - 11905: 0xE782,
- 37905 - 11905: 0xE783,
- 37906 - 11905: 0xE784,
- 37907 - 11905: 0xE785,
- 37908 - 11905: 0xE786,
- 37909 - 11905: 0xE787,
- 37910 - 11905: 0xE788,
- 37911 - 11905: 0xE789,
- 37912 - 11905: 0xE78A,
- 37913 - 11905: 0xE78B,
- 37914 - 11905: 0xE78C,
- 37915 - 11905: 0xE78D,
- 37916 - 11905: 0xE78E,
- 37917 - 11905: 0xE78F,
- 37918 - 11905: 0xE790,
- 37919 - 11905: 0xE791,
- 37920 - 11905: 0xE792,
- 37921 - 11905: 0xE793,
- 37922 - 11905: 0xE794,
- 37923 - 11905: 0xE795,
- 37924 - 11905: 0xE796,
- 37925 - 11905: 0xE797,
- 37926 - 11905: 0xE798,
- 37927 - 11905: 0xE799,
- 37928 - 11905: 0xE79A,
- 37929 - 11905: 0xE79B,
- 37930 - 11905: 0xE79C,
- 37931 - 11905: 0xE79D,
- 37932 - 11905: 0xE79E,
- 37933 - 11905: 0xE79F,
- 37934 - 11905: 0xE7A0,
- 37935 - 11905: 0xE840,
- 37936 - 11905: 0xE841,
- 37937 - 11905: 0xE842,
- 37938 - 11905: 0xE843,
- 37939 - 11905: 0xE844,
- 37940 - 11905: 0xE845,
- 37941 - 11905: 0xE846,
- 37942 - 11905: 0xE847,
- 37943 - 11905: 0xE848,
- 37944 - 11905: 0xE849,
- 37945 - 11905: 0xE84A,
- 37946 - 11905: 0xE84B,
- 37947 - 11905: 0xE84C,
- 37948 - 11905: 0xE84D,
- 37949 - 11905: 0xE84E,
- 37950 - 11905: 0xF6CD,
- 37951 - 11905: 0xE84F,
- 37952 - 11905: 0xE850,
- 37953 - 11905: 0xE851,
- 37954 - 11905: 0xE852,
- 37955 - 11905: 0xE853,
- 37956 - 11905: 0xE854,
- 37957 - 11905: 0xE855,
- 37958 - 11905: 0xE856,
- 37959 - 11905: 0xE857,
- 37960 - 11905: 0xE858,
- 37961 - 11905: 0xE859,
- 37962 - 11905: 0xE85A,
- 37963 - 11905: 0xE85B,
- 37964 - 11905: 0xE85C,
- 37965 - 11905: 0xE85D,
- 37966 - 11905: 0xE85E,
- 37967 - 11905: 0xE85F,
- 37968 - 11905: 0xE860,
- 37969 - 11905: 0xE861,
- 37970 - 11905: 0xE862,
- 37971 - 11905: 0xE863,
- 37972 - 11905: 0xE864,
- 37973 - 11905: 0xE865,
- 37974 - 11905: 0xE866,
- 37975 - 11905: 0xE867,
- 37976 - 11905: 0xE868,
- 37977 - 11905: 0xE869,
- 37978 - 11905: 0xE86A,
- 37979 - 11905: 0xE86B,
- 37980 - 11905: 0xE86C,
- 37981 - 11905: 0xE86D,
- 37982 - 11905: 0xE86E,
- 37983 - 11905: 0xE86F,
- 37984 - 11905: 0xE870,
- 37985 - 11905: 0xE871,
- 37986 - 11905: 0xE872,
- 37987 - 11905: 0xE873,
- 37988 - 11905: 0xE874,
- 37989 - 11905: 0xE875,
- 37990 - 11905: 0xE876,
- 37991 - 11905: 0xE877,
- 37992 - 11905: 0xE878,
- 37993 - 11905: 0xE879,
- 37994 - 11905: 0xE87A,
- 37995 - 11905: 0xF6CE,
- 37996 - 11905: 0xE87B,
- 37997 - 11905: 0xE87C,
- 37998 - 11905: 0xE87D,
- 37999 - 11905: 0xE87E,
- 38000 - 11905: 0xE880,
- 38001 - 11905: 0xE881,
- 38002 - 11905: 0xE882,
- 38003 - 11905: 0xE883,
- 38004 - 11905: 0xE884,
- 38005 - 11905: 0xE885,
- 38006 - 11905: 0xE886,
- 38007 - 11905: 0xE887,
- 38008 - 11905: 0xE888,
- 38009 - 11905: 0xE889,
- 38010 - 11905: 0xE88A,
- 38011 - 11905: 0xE88B,
- 38012 - 11905: 0xE88C,
- 38013 - 11905: 0xE88D,
- 38014 - 11905: 0xE88E,
- 38015 - 11905: 0xE88F,
- 38016 - 11905: 0xE890,
- 38017 - 11905: 0xE891,
- 38018 - 11905: 0xE892,
- 38019 - 11905: 0xE893,
- 38020 - 11905: 0xE894,
- 38021 - 11905: 0xEEC4,
- 38022 - 11905: 0xEEC5,
- 38023 - 11905: 0xEEC6,
- 38024 - 11905: 0xD5EB,
- 38025 - 11905: 0xB6A4,
- 38026 - 11905: 0xEEC8,
- 38027 - 11905: 0xEEC7,
- 38028 - 11905: 0xEEC9,
- 38029 - 11905: 0xEECA,
- 38030 - 11905: 0xC7A5,
- 38031 - 11905: 0xEECB,
- 38032 - 11905: 0xEECC,
- 38033 - 11905: 0xE895,
- 38034 - 11905: 0xB7B0,
- 38035 - 11905: 0xB5F6,
- 38036 - 11905: 0xEECD,
- 38037 - 11905: 0xEECF,
- 38038 - 11905: 0xE896,
- 38039 - 11905: 0xEECE,
- 38040 - 11905: 0xE897,
- 38041 - 11905: 0xB8C6,
- 38042 - 11905: 0xEED0,
- 38043 - 11905: 0xEED1,
- 38044 - 11905: 0xEED2,
- 38045 - 11905: 0xB6DB,
- 38046 - 11905: 0xB3AE,
- 38047 - 11905: 0xD6D3,
- 38048 - 11905: 0xC4C6,
- 38049 - 11905: 0xB1B5,
- 38050 - 11905: 0xB8D6,
- 38051 - 11905: 0xEED3,
- 38052 - 11905: 0xEED4,
- 38053 - 11905: 0xD4BF,
- 38054 - 11905: 0xC7D5,
- 38055 - 11905: 0xBEFB,
- 38056 - 11905: 0xCED9,
- 38057 - 11905: 0xB9B3,
- 38058 - 11905: 0xEED6,
- 38059 - 11905: 0xEED5,
- 38060 - 11905: 0xEED8,
- 38061 - 11905: 0xEED7,
- 38062 - 11905: 0xC5A5,
- 38063 - 11905: 0xEED9,
- 38064 - 11905: 0xEEDA,
- 38065 - 11905: 0xC7AE,
- 38066 - 11905: 0xEEDB,
- 38067 - 11905: 0xC7AF,
- 38068 - 11905: 0xEEDC,
- 38069 - 11905: 0xB2A7,
- 38070 - 11905: 0xEEDD,
- 38071 - 11905: 0xEEDE,
- 38072 - 11905: 0xEEDF,
- 38073 - 11905: 0xEEE0,
- 38074 - 11905: 0xEEE1,
- 38075 - 11905: 0xD7EA,
- 38076 - 11905: 0xEEE2,
- 38077 - 11905: 0xEEE3,
- 38078 - 11905: 0xBCD8,
- 38079 - 11905: 0xEEE4,
- 38080 - 11905: 0xD3CB,
- 38081 - 11905: 0xCCFA,
- 38082 - 11905: 0xB2AC,
- 38083 - 11905: 0xC1E5,
- 38084 - 11905: 0xEEE5,
- 38085 - 11905: 0xC7A6,
- 38086 - 11905: 0xC3AD,
- 38087 - 11905: 0xE898,
- 38088 - 11905: 0xEEE6,
- 38089 - 11905: 0xEEE7,
- 38090 - 11905: 0xEEE8,
- 38091 - 11905: 0xEEE9,
- 38092 - 11905: 0xEEEA,
- 38093 - 11905: 0xEEEB,
- 38094 - 11905: 0xEEEC,
- 38095 - 11905: 0xE899,
- 38096 - 11905: 0xEEED,
- 38097 - 11905: 0xEEEE,
- 38098 - 11905: 0xEEEF,
- 38099 - 11905: 0xE89A,
- 38100 - 11905: 0xE89B,
- 38101 - 11905: 0xEEF0,
- 38102 - 11905: 0xEEF1,
- 38103 - 11905: 0xEEF2,
- 38104 - 11905: 0xEEF4,
- 38105 - 11905: 0xEEF3,
- 38106 - 11905: 0xE89C,
- 38107 - 11905: 0xEEF5,
- 38108 - 11905: 0xCDAD,
- 38109 - 11905: 0xC2C1,
- 38110 - 11905: 0xEEF6,
- 38111 - 11905: 0xEEF7,
- 38112 - 11905: 0xEEF8,
- 38113 - 11905: 0xD5A1,
- 38114 - 11905: 0xEEF9,
- 38115 - 11905: 0xCFB3,
- 38116 - 11905: 0xEEFA,
- 38117 - 11905: 0xEEFB,
- 38118 - 11905: 0xE89D,
- 38119 - 11905: 0xEEFC,
- 38120 - 11905: 0xEEFD,
- 38121 - 11905: 0xEFA1,
- 38122 - 11905: 0xEEFE,
- 38123 - 11905: 0xEFA2,
- 38124 - 11905: 0xB8F5,
- 38125 - 11905: 0xC3FA,
- 38126 - 11905: 0xEFA3,
- 38127 - 11905: 0xEFA4,
- 38128 - 11905: 0xBDC2,
- 38129 - 11905: 0xD2BF,
- 38130 - 11905: 0xB2F9,
- 38131 - 11905: 0xEFA5,
- 38132 - 11905: 0xEFA6,
- 38133 - 11905: 0xEFA7,
- 38134 - 11905: 0xD2F8,
- 38135 - 11905: 0xEFA8,
- 38136 - 11905: 0xD6FD,
- 38137 - 11905: 0xEFA9,
- 38138 - 11905: 0xC6CC,
- 38139 - 11905: 0xE89E,
- 38140 - 11905: 0xEFAA,
- 38141 - 11905: 0xEFAB,
- 38142 - 11905: 0xC1B4,
- 38143 - 11905: 0xEFAC,
- 38144 - 11905: 0xCFFA,
- 38145 - 11905: 0xCBF8,
- 38146 - 11905: 0xEFAE,
- 38147 - 11905: 0xEFAD,
- 38148 - 11905: 0xB3FA,
- 38149 - 11905: 0xB9F8,
- 38150 - 11905: 0xEFAF,
- 38151 - 11905: 0xEFB0,
- 38152 - 11905: 0xD0E2,
- 38153 - 11905: 0xEFB1,
- 38154 - 11905: 0xEFB2,
- 38155 - 11905: 0xB7E6,
- 38156 - 11905: 0xD0BF,
- 38157 - 11905: 0xEFB3,
- 38158 - 11905: 0xEFB4,
- 38159 - 11905: 0xEFB5,
- 38160 - 11905: 0xC8F1,
- 38161 - 11905: 0xCCE0,
- 38162 - 11905: 0xEFB6,
- 38163 - 11905: 0xEFB7,
- 38164 - 11905: 0xEFB8,
- 38165 - 11905: 0xEFB9,
- 38166 - 11905: 0xEFBA,
- 38167 - 11905: 0xD5E0,
- 38168 - 11905: 0xEFBB,
- 38169 - 11905: 0xB4ED,
- 38170 - 11905: 0xC3AA,
- 38171 - 11905: 0xEFBC,
- 38172 - 11905: 0xE89F,
- 38173 - 11905: 0xEFBD,
- 38174 - 11905: 0xEFBE,
- 38175 - 11905: 0xEFBF,
- 38176 - 11905: 0xE8A0,
- 38177 - 11905: 0xCEFD,
- 38178 - 11905: 0xEFC0,
- 38179 - 11905: 0xC2E0,
- 38180 - 11905: 0xB4B8,
- 38181 - 11905: 0xD7B6,
- 38182 - 11905: 0xBDF5,
- 38183 - 11905: 0xE940,
- 38184 - 11905: 0xCFC7,
- 38185 - 11905: 0xEFC3,
- 38186 - 11905: 0xEFC1,
- 38187 - 11905: 0xEFC2,
- 38188 - 11905: 0xEFC4,
- 38189 - 11905: 0xB6A7,
- 38190 - 11905: 0xBCFC,
- 38191 - 11905: 0xBEE2,
- 38192 - 11905: 0xC3CC,
- 38193 - 11905: 0xEFC5,
- 38194 - 11905: 0xEFC6,
- 38195 - 11905: 0xE941,
- 38196 - 11905: 0xEFC7,
- 38197 - 11905: 0xEFCF,
- 38198 - 11905: 0xEFC8,
- 38199 - 11905: 0xEFC9,
- 38200 - 11905: 0xEFCA,
- 38201 - 11905: 0xC7C2,
- 38202 - 11905: 0xEFF1,
- 38203 - 11905: 0xB6CD,
- 38204 - 11905: 0xEFCB,
- 38205 - 11905: 0xE942,
- 38206 - 11905: 0xEFCC,
- 38207 - 11905: 0xEFCD,
- 38208 - 11905: 0xB6C6,
- 38209 - 11905: 0xC3BE,
- 38210 - 11905: 0xEFCE,
- 38211 - 11905: 0xE943,
- 38212 - 11905: 0xEFD0,
- 38213 - 11905: 0xEFD1,
- 38214 - 11905: 0xEFD2,
- 38215 - 11905: 0xD5F2,
- 38216 - 11905: 0xE944,
- 38217 - 11905: 0xEFD3,
- 38218 - 11905: 0xC4F7,
- 38219 - 11905: 0xE945,
- 38220 - 11905: 0xEFD4,
- 38221 - 11905: 0xC4F8,
- 38222 - 11905: 0xEFD5,
- 38223 - 11905: 0xEFD6,
- 38224 - 11905: 0xB8E4,
- 38225 - 11905: 0xB0F7,
- 38226 - 11905: 0xEFD7,
- 38227 - 11905: 0xEFD8,
- 38228 - 11905: 0xEFD9,
- 38229 - 11905: 0xE946,
- 38230 - 11905: 0xEFDA,
- 38231 - 11905: 0xEFDB,
- 38232 - 11905: 0xEFDC,
- 38233 - 11905: 0xEFDD,
- 38234 - 11905: 0xE947,
- 38235 - 11905: 0xEFDE,
- 38236 - 11905: 0xBEB5,
- 38237 - 11905: 0xEFE1,
- 38238 - 11905: 0xEFDF,
- 38239 - 11905: 0xEFE0,
- 38240 - 11905: 0xE948,
- 38241 - 11905: 0xEFE2,
- 38242 - 11905: 0xEFE3,
- 38243 - 11905: 0xC1CD,
- 38244 - 11905: 0xEFE4,
- 38245 - 11905: 0xEFE5,
- 38246 - 11905: 0xEFE6,
- 38247 - 11905: 0xEFE7,
- 38248 - 11905: 0xEFE8,
- 38249 - 11905: 0xEFE9,
- 38250 - 11905: 0xEFEA,
- 38251 - 11905: 0xEFEB,
- 38252 - 11905: 0xEFEC,
- 38253 - 11905: 0xC0D8,
- 38254 - 11905: 0xE949,
- 38255 - 11905: 0xEFED,
- 38256 - 11905: 0xC1AD,
- 38257 - 11905: 0xEFEE,
- 38258 - 11905: 0xEFEF,
- 38259 - 11905: 0xEFF0,
- 38260 - 11905: 0xE94A,
- 38261 - 11905: 0xE94B,
- 38262 - 11905: 0xCFE2,
- 38263 - 11905: 0xE94C,
- 38264 - 11905: 0xE94D,
- 38265 - 11905: 0xE94E,
- 38266 - 11905: 0xE94F,
- 38267 - 11905: 0xE950,
- 38268 - 11905: 0xE951,
- 38269 - 11905: 0xE952,
- 38270 - 11905: 0xE953,
- 38271 - 11905: 0xB3A4,
- 38272 - 11905: 0xE954,
- 38273 - 11905: 0xE955,
- 38274 - 11905: 0xE956,
- 38275 - 11905: 0xE957,
- 38276 - 11905: 0xE958,
- 38277 - 11905: 0xE959,
- 38278 - 11905: 0xE95A,
- 38279 - 11905: 0xE95B,
- 38280 - 11905: 0xE95C,
- 38281 - 11905: 0xE95D,
- 38282 - 11905: 0xE95E,
- 38283 - 11905: 0xE95F,
- 38284 - 11905: 0xE960,
- 38285 - 11905: 0xE961,
- 38286 - 11905: 0xE962,
- 38287 - 11905: 0xE963,
- 38288 - 11905: 0xE964,
- 38289 - 11905: 0xE965,
- 38290 - 11905: 0xE966,
- 38291 - 11905: 0xE967,
- 38292 - 11905: 0xE968,
- 38293 - 11905: 0xE969,
- 38294 - 11905: 0xE96A,
- 38295 - 11905: 0xE96B,
- 38296 - 11905: 0xE96C,
- 38297 - 11905: 0xE96D,
- 38298 - 11905: 0xE96E,
- 38299 - 11905: 0xE96F,
- 38300 - 11905: 0xE970,
- 38301 - 11905: 0xE971,
- 38302 - 11905: 0xE972,
- 38303 - 11905: 0xE973,
- 38304 - 11905: 0xE974,
- 38305 - 11905: 0xE975,
- 38306 - 11905: 0xE976,
- 38307 - 11905: 0xE977,
- 38308 - 11905: 0xE978,
- 38309 - 11905: 0xE979,
- 38310 - 11905: 0xE97A,
- 38311 - 11905: 0xE97B,
- 38312 - 11905: 0xE97C,
- 38313 - 11905: 0xE97D,
- 38314 - 11905: 0xE97E,
- 38315 - 11905: 0xE980,
- 38316 - 11905: 0xE981,
- 38317 - 11905: 0xE982,
- 38318 - 11905: 0xE983,
- 38319 - 11905: 0xE984,
- 38320 - 11905: 0xE985,
- 38321 - 11905: 0xE986,
- 38322 - 11905: 0xE987,
- 38323 - 11905: 0xE988,
- 38324 - 11905: 0xE989,
- 38325 - 11905: 0xE98A,
- 38326 - 11905: 0xE98B,
- 38327 - 11905: 0xE98C,
- 38328 - 11905: 0xE98D,
- 38329 - 11905: 0xE98E,
- 38330 - 11905: 0xE98F,
- 38331 - 11905: 0xE990,
- 38332 - 11905: 0xE991,
- 38333 - 11905: 0xE992,
- 38334 - 11905: 0xE993,
- 38335 - 11905: 0xE994,
- 38336 - 11905: 0xE995,
- 38337 - 11905: 0xE996,
- 38338 - 11905: 0xE997,
- 38339 - 11905: 0xE998,
- 38340 - 11905: 0xE999,
- 38341 - 11905: 0xE99A,
- 38342 - 11905: 0xE99B,
- 38343 - 11905: 0xE99C,
- 38344 - 11905: 0xE99D,
- 38345 - 11905: 0xE99E,
- 38346 - 11905: 0xE99F,
- 38347 - 11905: 0xE9A0,
- 38348 - 11905: 0xEA40,
- 38349 - 11905: 0xEA41,
- 38350 - 11905: 0xEA42,
- 38351 - 11905: 0xEA43,
- 38352 - 11905: 0xEA44,
- 38353 - 11905: 0xEA45,
- 38354 - 11905: 0xEA46,
- 38355 - 11905: 0xEA47,
- 38356 - 11905: 0xEA48,
- 38357 - 11905: 0xEA49,
- 38358 - 11905: 0xEA4A,
- 38359 - 11905: 0xEA4B,
- 38360 - 11905: 0xEA4C,
- 38361 - 11905: 0xEA4D,
- 38362 - 11905: 0xEA4E,
- 38363 - 11905: 0xEA4F,
- 38364 - 11905: 0xEA50,
- 38365 - 11905: 0xEA51,
- 38366 - 11905: 0xEA52,
- 38367 - 11905: 0xEA53,
- 38368 - 11905: 0xEA54,
- 38369 - 11905: 0xEA55,
- 38370 - 11905: 0xEA56,
- 38371 - 11905: 0xEA57,
- 38372 - 11905: 0xEA58,
- 38373 - 11905: 0xEA59,
- 38374 - 11905: 0xEA5A,
- 38375 - 11905: 0xEA5B,
- 38376 - 11905: 0xC3C5,
- 38377 - 11905: 0xE3C5,
- 38378 - 11905: 0xC9C1,
- 38379 - 11905: 0xE3C6,
- 38380 - 11905: 0xEA5C,
- 38381 - 11905: 0xB1D5,
- 38382 - 11905: 0xCECA,
- 38383 - 11905: 0xB4B3,
- 38384 - 11905: 0xC8F2,
- 38385 - 11905: 0xE3C7,
- 38386 - 11905: 0xCFD0,
- 38387 - 11905: 0xE3C8,
- 38388 - 11905: 0xBCE4,
- 38389 - 11905: 0xE3C9,
- 38390 - 11905: 0xE3CA,
- 38391 - 11905: 0xC3C6,
- 38392 - 11905: 0xD5A2,
- 38393 - 11905: 0xC4D6,
- 38394 - 11905: 0xB9EB,
- 38395 - 11905: 0xCEC5,
- 38396 - 11905: 0xE3CB,
- 38397 - 11905: 0xC3F6,
- 38398 - 11905: 0xE3CC,
- 38399 - 11905: 0xEA5D,
- 38400 - 11905: 0xB7A7,
- 38401 - 11905: 0xB8F3,
- 38402 - 11905: 0xBAD2,
- 38403 - 11905: 0xE3CD,
- 38404 - 11905: 0xE3CE,
- 38405 - 11905: 0xD4C4,
- 38406 - 11905: 0xE3CF,
- 38407 - 11905: 0xEA5E,
- 38408 - 11905: 0xE3D0,
- 38409 - 11905: 0xD1CB,
- 38410 - 11905: 0xE3D1,
- 38411 - 11905: 0xE3D2,
- 38412 - 11905: 0xE3D3,
- 38413 - 11905: 0xE3D4,
- 38414 - 11905: 0xD1D6,
- 38415 - 11905: 0xE3D5,
- 38416 - 11905: 0xB2FB,
- 38417 - 11905: 0xC0BB,
- 38418 - 11905: 0xE3D6,
- 38419 - 11905: 0xEA5F,
- 38420 - 11905: 0xC0AB,
- 38421 - 11905: 0xE3D7,
- 38422 - 11905: 0xE3D8,
- 38423 - 11905: 0xE3D9,
- 38424 - 11905: 0xEA60,
- 38425 - 11905: 0xE3DA,
- 38426 - 11905: 0xE3DB,
- 38427 - 11905: 0xEA61,
- 38428 - 11905: 0xB8B7,
- 38429 - 11905: 0xDAE2,
- 38430 - 11905: 0xEA62,
- 38431 - 11905: 0xB6D3,
- 38432 - 11905: 0xEA63,
- 38433 - 11905: 0xDAE4,
- 38434 - 11905: 0xDAE3,
- 38435 - 11905: 0xEA64,
- 38436 - 11905: 0xEA65,
- 38437 - 11905: 0xEA66,
- 38438 - 11905: 0xEA67,
- 38439 - 11905: 0xEA68,
- 38440 - 11905: 0xEA69,
- 38441 - 11905: 0xEA6A,
- 38442 - 11905: 0xDAE6,
- 38443 - 11905: 0xEA6B,
- 38444 - 11905: 0xEA6C,
- 38445 - 11905: 0xEA6D,
- 38446 - 11905: 0xC8EE,
- 38447 - 11905: 0xEA6E,
- 38448 - 11905: 0xEA6F,
- 38449 - 11905: 0xDAE5,
- 38450 - 11905: 0xB7C0,
- 38451 - 11905: 0xD1F4,
- 38452 - 11905: 0xD2F5,
- 38453 - 11905: 0xD5F3,
- 38454 - 11905: 0xBDD7,
- 38455 - 11905: 0xEA70,
- 38456 - 11905: 0xEA71,
- 38457 - 11905: 0xEA72,
- 38458 - 11905: 0xEA73,
- 38459 - 11905: 0xD7E8,
- 38460 - 11905: 0xDAE8,
- 38461 - 11905: 0xDAE7,
- 38462 - 11905: 0xEA74,
- 38463 - 11905: 0xB0A2,
- 38464 - 11905: 0xCDD3,
- 38465 - 11905: 0xEA75,
- 38466 - 11905: 0xDAE9,
- 38467 - 11905: 0xEA76,
- 38468 - 11905: 0xB8BD,
- 38469 - 11905: 0xBCCA,
- 38470 - 11905: 0xC2BD,
- 38471 - 11905: 0xC2A4,
- 38472 - 11905: 0xB3C2,
- 38473 - 11905: 0xDAEA,
- 38474 - 11905: 0xEA77,
- 38475 - 11905: 0xC2AA,
- 38476 - 11905: 0xC4B0,
- 38477 - 11905: 0xBDB5,
- 38478 - 11905: 0xEA78,
- 38479 - 11905: 0xEA79,
- 38480 - 11905: 0xCFDE,
- 38481 - 11905: 0xEA7A,
- 38482 - 11905: 0xEA7B,
- 38483 - 11905: 0xEA7C,
- 38484 - 11905: 0xDAEB,
- 38485 - 11905: 0xC9C2,
- 38486 - 11905: 0xEA7D,
- 38487 - 11905: 0xEA7E,
- 38488 - 11905: 0xEA80,
- 38489 - 11905: 0xEA81,
- 38490 - 11905: 0xEA82,
- 38491 - 11905: 0xB1DD,
- 38492 - 11905: 0xEA83,
- 38493 - 11905: 0xEA84,
- 38494 - 11905: 0xEA85,
- 38495 - 11905: 0xDAEC,
- 38496 - 11905: 0xEA86,
- 38497 - 11905: 0xB6B8,
- 38498 - 11905: 0xD4BA,
- 38499 - 11905: 0xEA87,
- 38500 - 11905: 0xB3FD,
- 38501 - 11905: 0xEA88,
- 38502 - 11905: 0xEA89,
- 38503 - 11905: 0xDAED,
- 38504 - 11905: 0xD4C9,
- 38505 - 11905: 0xCFD5,
- 38506 - 11905: 0xC5E3,
- 38507 - 11905: 0xEA8A,
- 38508 - 11905: 0xDAEE,
- 38509 - 11905: 0xEA8B,
- 38510 - 11905: 0xEA8C,
- 38511 - 11905: 0xEA8D,
- 38512 - 11905: 0xEA8E,
- 38513 - 11905: 0xEA8F,
- 38514 - 11905: 0xDAEF,
- 38515 - 11905: 0xEA90,
- 38516 - 11905: 0xDAF0,
- 38517 - 11905: 0xC1EA,
- 38518 - 11905: 0xCCD5,
- 38519 - 11905: 0xCFDD,
- 38520 - 11905: 0xEA91,
- 38521 - 11905: 0xEA92,
- 38522 - 11905: 0xEA93,
- 38523 - 11905: 0xEA94,
- 38524 - 11905: 0xEA95,
- 38525 - 11905: 0xEA96,
- 38526 - 11905: 0xEA97,
- 38527 - 11905: 0xEA98,
- 38528 - 11905: 0xEA99,
- 38529 - 11905: 0xEA9A,
- 38530 - 11905: 0xEA9B,
- 38531 - 11905: 0xEA9C,
- 38532 - 11905: 0xEA9D,
- 38533 - 11905: 0xD3E7,
- 38534 - 11905: 0xC2A1,
- 38535 - 11905: 0xEA9E,
- 38536 - 11905: 0xDAF1,
- 38537 - 11905: 0xEA9F,
- 38538 - 11905: 0xEAA0,
- 38539 - 11905: 0xCBE5,
- 38540 - 11905: 0xEB40,
- 38541 - 11905: 0xDAF2,
- 38542 - 11905: 0xEB41,
- 38543 - 11905: 0xCBE6,
- 38544 - 11905: 0xD2FE,
- 38545 - 11905: 0xEB42,
- 38546 - 11905: 0xEB43,
- 38547 - 11905: 0xEB44,
- 38548 - 11905: 0xB8F4,
- 38549 - 11905: 0xEB45,
- 38550 - 11905: 0xEB46,
- 38551 - 11905: 0xDAF3,
- 38552 - 11905: 0xB0AF,
- 38553 - 11905: 0xCFB6,
- 38554 - 11905: 0xEB47,
- 38555 - 11905: 0xEB48,
- 38556 - 11905: 0xD5CF,
- 38557 - 11905: 0xEB49,
- 38558 - 11905: 0xEB4A,
- 38559 - 11905: 0xEB4B,
- 38560 - 11905: 0xEB4C,
- 38561 - 11905: 0xEB4D,
- 38562 - 11905: 0xEB4E,
- 38563 - 11905: 0xEB4F,
- 38564 - 11905: 0xEB50,
- 38565 - 11905: 0xEB51,
- 38566 - 11905: 0xEB52,
- 38567 - 11905: 0xCBED,
- 38568 - 11905: 0xEB53,
- 38569 - 11905: 0xEB54,
- 38570 - 11905: 0xEB55,
- 38571 - 11905: 0xEB56,
- 38572 - 11905: 0xEB57,
- 38573 - 11905: 0xEB58,
- 38574 - 11905: 0xEB59,
- 38575 - 11905: 0xEB5A,
- 38576 - 11905: 0xDAF4,
- 38577 - 11905: 0xEB5B,
- 38578 - 11905: 0xEB5C,
- 38579 - 11905: 0xE3C4,
- 38580 - 11905: 0xEB5D,
- 38581 - 11905: 0xEB5E,
- 38582 - 11905: 0xC1A5,
- 38583 - 11905: 0xEB5F,
- 38584 - 11905: 0xEB60,
- 38585 - 11905: 0xF6BF,
- 38586 - 11905: 0xEB61,
- 38587 - 11905: 0xEB62,
- 38588 - 11905: 0xF6C0,
- 38589 - 11905: 0xF6C1,
- 38590 - 11905: 0xC4D1,
- 38591 - 11905: 0xEB63,
- 38592 - 11905: 0xC8B8,
- 38593 - 11905: 0xD1E3,
- 38594 - 11905: 0xEB64,
- 38595 - 11905: 0xEB65,
- 38596 - 11905: 0xD0DB,
- 38597 - 11905: 0xD1C5,
- 38598 - 11905: 0xBCAF,
- 38599 - 11905: 0xB9CD,
- 38600 - 11905: 0xEB66,
- 38601 - 11905: 0xEFF4,
- 38602 - 11905: 0xEB67,
- 38603 - 11905: 0xEB68,
- 38604 - 11905: 0xB4C6,
- 38605 - 11905: 0xD3BA,
- 38606 - 11905: 0xF6C2,
- 38607 - 11905: 0xB3FB,
- 38608 - 11905: 0xEB69,
- 38609 - 11905: 0xEB6A,
- 38610 - 11905: 0xF6C3,
- 38611 - 11905: 0xEB6B,
- 38612 - 11905: 0xEB6C,
- 38613 - 11905: 0xB5F1,
- 38614 - 11905: 0xEB6D,
- 38615 - 11905: 0xEB6E,
- 38616 - 11905: 0xEB6F,
- 38617 - 11905: 0xEB70,
- 38618 - 11905: 0xEB71,
- 38619 - 11905: 0xEB72,
- 38620 - 11905: 0xEB73,
- 38621 - 11905: 0xEB74,
- 38622 - 11905: 0xEB75,
- 38623 - 11905: 0xEB76,
- 38624 - 11905: 0xF6C5,
- 38625 - 11905: 0xEB77,
- 38626 - 11905: 0xEB78,
- 38627 - 11905: 0xEB79,
- 38628 - 11905: 0xEB7A,
- 38629 - 11905: 0xEB7B,
- 38630 - 11905: 0xEB7C,
- 38631 - 11905: 0xEB7D,
- 38632 - 11905: 0xD3EA,
- 38633 - 11905: 0xF6A7,
- 38634 - 11905: 0xD1A9,
- 38635 - 11905: 0xEB7E,
- 38636 - 11905: 0xEB80,
- 38637 - 11905: 0xEB81,
- 38638 - 11905: 0xEB82,
- 38639 - 11905: 0xF6A9,
- 38640 - 11905: 0xEB83,
- 38641 - 11905: 0xEB84,
- 38642 - 11905: 0xEB85,
- 38643 - 11905: 0xF6A8,
- 38644 - 11905: 0xEB86,
- 38645 - 11905: 0xEB87,
- 38646 - 11905: 0xC1E3,
- 38647 - 11905: 0xC0D7,
- 38648 - 11905: 0xEB88,
- 38649 - 11905: 0xB1A2,
- 38650 - 11905: 0xEB89,
- 38651 - 11905: 0xEB8A,
- 38652 - 11905: 0xEB8B,
- 38653 - 11905: 0xEB8C,
- 38654 - 11905: 0xCEED,
- 38655 - 11905: 0xEB8D,
- 38656 - 11905: 0xD0E8,
- 38657 - 11905: 0xF6AB,
- 38658 - 11905: 0xEB8E,
- 38659 - 11905: 0xEB8F,
- 38660 - 11905: 0xCFF6,
- 38661 - 11905: 0xEB90,
- 38662 - 11905: 0xF6AA,
- 38663 - 11905: 0xD5F0,
- 38664 - 11905: 0xF6AC,
- 38665 - 11905: 0xC3B9,
- 38666 - 11905: 0xEB91,
- 38667 - 11905: 0xEB92,
- 38668 - 11905: 0xEB93,
- 38669 - 11905: 0xBBF4,
- 38670 - 11905: 0xF6AE,
- 38671 - 11905: 0xF6AD,
- 38672 - 11905: 0xEB94,
- 38673 - 11905: 0xEB95,
- 38674 - 11905: 0xEB96,
- 38675 - 11905: 0xC4DE,
- 38676 - 11905: 0xEB97,
- 38677 - 11905: 0xEB98,
- 38678 - 11905: 0xC1D8,
- 38679 - 11905: 0xEB99,
- 38680 - 11905: 0xEB9A,
- 38681 - 11905: 0xEB9B,
- 38682 - 11905: 0xEB9C,
- 38683 - 11905: 0xEB9D,
- 38684 - 11905: 0xCBAA,
- 38685 - 11905: 0xEB9E,
- 38686 - 11905: 0xCFBC,
- 38687 - 11905: 0xEB9F,
- 38688 - 11905: 0xEBA0,
- 38689 - 11905: 0xEC40,
- 38690 - 11905: 0xEC41,
- 38691 - 11905: 0xEC42,
- 38692 - 11905: 0xEC43,
- 38693 - 11905: 0xEC44,
- 38694 - 11905: 0xEC45,
- 38695 - 11905: 0xEC46,
- 38696 - 11905: 0xEC47,
- 38697 - 11905: 0xEC48,
- 38698 - 11905: 0xF6AF,
- 38699 - 11905: 0xEC49,
- 38700 - 11905: 0xEC4A,
- 38701 - 11905: 0xF6B0,
- 38702 - 11905: 0xEC4B,
- 38703 - 11905: 0xEC4C,
- 38704 - 11905: 0xF6B1,
- 38705 - 11905: 0xEC4D,
- 38706 - 11905: 0xC2B6,
- 38707 - 11905: 0xEC4E,
- 38708 - 11905: 0xEC4F,
- 38709 - 11905: 0xEC50,
- 38710 - 11905: 0xEC51,
- 38711 - 11905: 0xEC52,
- 38712 - 11905: 0xB0D4,
- 38713 - 11905: 0xC5F9,
- 38714 - 11905: 0xEC53,
- 38715 - 11905: 0xEC54,
- 38716 - 11905: 0xEC55,
- 38717 - 11905: 0xEC56,
- 38718 - 11905: 0xF6B2,
- 38719 - 11905: 0xEC57,
- 38720 - 11905: 0xEC58,
- 38721 - 11905: 0xEC59,
- 38722 - 11905: 0xEC5A,
- 38723 - 11905: 0xEC5B,
- 38724 - 11905: 0xEC5C,
- 38725 - 11905: 0xEC5D,
- 38726 - 11905: 0xEC5E,
- 38727 - 11905: 0xEC5F,
- 38728 - 11905: 0xEC60,
- 38729 - 11905: 0xEC61,
- 38730 - 11905: 0xEC62,
- 38731 - 11905: 0xEC63,
- 38732 - 11905: 0xEC64,
- 38733 - 11905: 0xEC65,
- 38734 - 11905: 0xEC66,
- 38735 - 11905: 0xEC67,
- 38736 - 11905: 0xEC68,
- 38737 - 11905: 0xEC69,
- 38738 - 11905: 0xC7E0,
- 38739 - 11905: 0xF6A6,
- 38740 - 11905: 0xEC6A,
- 38741 - 11905: 0xEC6B,
- 38742 - 11905: 0xBEB8,
- 38743 - 11905: 0xEC6C,
- 38744 - 11905: 0xEC6D,
- 38745 - 11905: 0xBEB2,
- 38746 - 11905: 0xEC6E,
- 38747 - 11905: 0xB5E5,
- 38748 - 11905: 0xEC6F,
- 38749 - 11905: 0xEC70,
- 38750 - 11905: 0xB7C7,
- 38751 - 11905: 0xEC71,
- 38752 - 11905: 0xBFBF,
- 38753 - 11905: 0xC3D2,
- 38754 - 11905: 0xC3E6,
- 38755 - 11905: 0xEC72,
- 38756 - 11905: 0xEC73,
- 38757 - 11905: 0xD8CC,
- 38758 - 11905: 0xEC74,
- 38759 - 11905: 0xEC75,
- 38760 - 11905: 0xEC76,
- 38761 - 11905: 0xB8EF,
- 38762 - 11905: 0xEC77,
- 38763 - 11905: 0xEC78,
- 38764 - 11905: 0xEC79,
- 38765 - 11905: 0xEC7A,
- 38766 - 11905: 0xEC7B,
- 38767 - 11905: 0xEC7C,
- 38768 - 11905: 0xEC7D,
- 38769 - 11905: 0xEC7E,
- 38770 - 11905: 0xEC80,
- 38771 - 11905: 0xBDF9,
- 38772 - 11905: 0xD1A5,
- 38773 - 11905: 0xEC81,
- 38774 - 11905: 0xB0D0,
- 38775 - 11905: 0xEC82,
- 38776 - 11905: 0xEC83,
- 38777 - 11905: 0xEC84,
- 38778 - 11905: 0xEC85,
- 38779 - 11905: 0xEC86,
- 38780 - 11905: 0xF7B0,
- 38781 - 11905: 0xEC87,
- 38782 - 11905: 0xEC88,
- 38783 - 11905: 0xEC89,
- 38784 - 11905: 0xEC8A,
- 38785 - 11905: 0xEC8B,
- 38786 - 11905: 0xEC8C,
- 38787 - 11905: 0xEC8D,
- 38788 - 11905: 0xEC8E,
- 38789 - 11905: 0xF7B1,
- 38790 - 11905: 0xEC8F,
- 38791 - 11905: 0xEC90,
- 38792 - 11905: 0xEC91,
- 38793 - 11905: 0xEC92,
- 38794 - 11905: 0xEC93,
- 38795 - 11905: 0xD0AC,
- 38796 - 11905: 0xEC94,
- 38797 - 11905: 0xB0B0,
- 38798 - 11905: 0xEC95,
- 38799 - 11905: 0xEC96,
- 38800 - 11905: 0xEC97,
- 38801 - 11905: 0xF7B2,
- 38802 - 11905: 0xF7B3,
- 38803 - 11905: 0xEC98,
- 38804 - 11905: 0xF7B4,
- 38805 - 11905: 0xEC99,
- 38806 - 11905: 0xEC9A,
- 38807 - 11905: 0xEC9B,
- 38808 - 11905: 0xC7CA,
- 38809 - 11905: 0xEC9C,
- 38810 - 11905: 0xEC9D,
- 38811 - 11905: 0xEC9E,
- 38812 - 11905: 0xEC9F,
- 38813 - 11905: 0xECA0,
- 38814 - 11905: 0xED40,
- 38815 - 11905: 0xED41,
- 38816 - 11905: 0xBECF,
- 38817 - 11905: 0xED42,
- 38818 - 11905: 0xED43,
- 38819 - 11905: 0xF7B7,
- 38820 - 11905: 0xED44,
- 38821 - 11905: 0xED45,
- 38822 - 11905: 0xED46,
- 38823 - 11905: 0xED47,
- 38824 - 11905: 0xED48,
- 38825 - 11905: 0xED49,
- 38826 - 11905: 0xED4A,
- 38827 - 11905: 0xF7B6,
- 38828 - 11905: 0xED4B,
- 38829 - 11905: 0xB1DE,
- 38830 - 11905: 0xED4C,
- 38831 - 11905: 0xF7B5,
- 38832 - 11905: 0xED4D,
- 38833 - 11905: 0xED4E,
- 38834 - 11905: 0xF7B8,
- 38835 - 11905: 0xED4F,
- 38836 - 11905: 0xF7B9,
- 38837 - 11905: 0xED50,
- 38838 - 11905: 0xED51,
- 38839 - 11905: 0xED52,
- 38840 - 11905: 0xED53,
- 38841 - 11905: 0xED54,
- 38842 - 11905: 0xED55,
- 38843 - 11905: 0xED56,
- 38844 - 11905: 0xED57,
- 38845 - 11905: 0xED58,
- 38846 - 11905: 0xED59,
- 38847 - 11905: 0xED5A,
- 38848 - 11905: 0xED5B,
- 38849 - 11905: 0xED5C,
- 38850 - 11905: 0xED5D,
- 38851 - 11905: 0xED5E,
- 38852 - 11905: 0xED5F,
- 38853 - 11905: 0xED60,
- 38854 - 11905: 0xED61,
- 38855 - 11905: 0xED62,
- 38856 - 11905: 0xED63,
- 38857 - 11905: 0xED64,
- 38858 - 11905: 0xED65,
- 38859 - 11905: 0xED66,
- 38860 - 11905: 0xED67,
- 38861 - 11905: 0xED68,
- 38862 - 11905: 0xED69,
- 38863 - 11905: 0xED6A,
- 38864 - 11905: 0xED6B,
- 38865 - 11905: 0xED6C,
- 38866 - 11905: 0xED6D,
- 38867 - 11905: 0xED6E,
- 38868 - 11905: 0xED6F,
- 38869 - 11905: 0xED70,
- 38870 - 11905: 0xED71,
- 38871 - 11905: 0xED72,
- 38872 - 11905: 0xED73,
- 38873 - 11905: 0xED74,
- 38874 - 11905: 0xED75,
- 38875 - 11905: 0xED76,
- 38876 - 11905: 0xED77,
- 38877 - 11905: 0xED78,
- 38878 - 11905: 0xED79,
- 38879 - 11905: 0xED7A,
- 38880 - 11905: 0xED7B,
- 38881 - 11905: 0xED7C,
- 38882 - 11905: 0xED7D,
- 38883 - 11905: 0xED7E,
- 38884 - 11905: 0xED80,
- 38885 - 11905: 0xED81,
- 38886 - 11905: 0xCEA4,
- 38887 - 11905: 0xC8CD,
- 38888 - 11905: 0xED82,
- 38889 - 11905: 0xBAAB,
- 38890 - 11905: 0xE8B8,
- 38891 - 11905: 0xE8B9,
- 38892 - 11905: 0xE8BA,
- 38893 - 11905: 0xBEC2,
- 38894 - 11905: 0xED83,
- 38895 - 11905: 0xED84,
- 38896 - 11905: 0xED85,
- 38897 - 11905: 0xED86,
- 38898 - 11905: 0xED87,
- 38899 - 11905: 0xD2F4,
- 38900 - 11905: 0xED88,
- 38901 - 11905: 0xD4CF,
- 38902 - 11905: 0xC9D8,
- 38903 - 11905: 0xED89,
- 38904 - 11905: 0xED8A,
- 38905 - 11905: 0xED8B,
- 38906 - 11905: 0xED8C,
- 38907 - 11905: 0xED8D,
- 38908 - 11905: 0xED8E,
- 38909 - 11905: 0xED8F,
- 38910 - 11905: 0xED90,
- 38911 - 11905: 0xED91,
- 38912 - 11905: 0xED92,
- 38913 - 11905: 0xED93,
- 38914 - 11905: 0xED94,
- 38915 - 11905: 0xED95,
- 38916 - 11905: 0xED96,
- 38917 - 11905: 0xED97,
- 38918 - 11905: 0xED98,
- 38919 - 11905: 0xED99,
- 38920 - 11905: 0xED9A,
- 38921 - 11905: 0xED9B,
- 38922 - 11905: 0xED9C,
- 38923 - 11905: 0xED9D,
- 38924 - 11905: 0xED9E,
- 38925 - 11905: 0xED9F,
- 38926 - 11905: 0xEDA0,
- 38927 - 11905: 0xEE40,
- 38928 - 11905: 0xEE41,
- 38929 - 11905: 0xEE42,
- 38930 - 11905: 0xEE43,
- 38931 - 11905: 0xEE44,
- 38932 - 11905: 0xEE45,
- 38933 - 11905: 0xEE46,
- 38934 - 11905: 0xEE47,
- 38935 - 11905: 0xEE48,
- 38936 - 11905: 0xEE49,
- 38937 - 11905: 0xEE4A,
- 38938 - 11905: 0xEE4B,
- 38939 - 11905: 0xEE4C,
- 38940 - 11905: 0xEE4D,
- 38941 - 11905: 0xEE4E,
- 38942 - 11905: 0xEE4F,
- 38943 - 11905: 0xEE50,
- 38944 - 11905: 0xEE51,
- 38945 - 11905: 0xEE52,
- 38946 - 11905: 0xEE53,
- 38947 - 11905: 0xEE54,
- 38948 - 11905: 0xEE55,
- 38949 - 11905: 0xEE56,
- 38950 - 11905: 0xEE57,
- 38951 - 11905: 0xEE58,
- 38952 - 11905: 0xEE59,
- 38953 - 11905: 0xEE5A,
- 38954 - 11905: 0xEE5B,
- 38955 - 11905: 0xEE5C,
- 38956 - 11905: 0xEE5D,
- 38957 - 11905: 0xEE5E,
- 38958 - 11905: 0xEE5F,
- 38959 - 11905: 0xEE60,
- 38960 - 11905: 0xEE61,
- 38961 - 11905: 0xEE62,
- 38962 - 11905: 0xEE63,
- 38963 - 11905: 0xEE64,
- 38964 - 11905: 0xEE65,
- 38965 - 11905: 0xEE66,
- 38966 - 11905: 0xEE67,
- 38967 - 11905: 0xEE68,
- 38968 - 11905: 0xEE69,
- 38969 - 11905: 0xEE6A,
- 38970 - 11905: 0xEE6B,
- 38971 - 11905: 0xEE6C,
- 38972 - 11905: 0xEE6D,
- 38973 - 11905: 0xEE6E,
- 38974 - 11905: 0xEE6F,
- 38975 - 11905: 0xEE70,
- 38976 - 11905: 0xEE71,
- 38977 - 11905: 0xEE72,
- 38978 - 11905: 0xEE73,
- 38979 - 11905: 0xEE74,
- 38980 - 11905: 0xEE75,
- 38981 - 11905: 0xEE76,
- 38982 - 11905: 0xEE77,
- 38983 - 11905: 0xEE78,
- 38984 - 11905: 0xEE79,
- 38985 - 11905: 0xEE7A,
- 38986 - 11905: 0xEE7B,
- 38987 - 11905: 0xEE7C,
- 38988 - 11905: 0xEE7D,
- 38989 - 11905: 0xEE7E,
- 38990 - 11905: 0xEE80,
- 38991 - 11905: 0xEE81,
- 38992 - 11905: 0xEE82,
- 38993 - 11905: 0xEE83,
- 38994 - 11905: 0xEE84,
- 38995 - 11905: 0xEE85,
- 38996 - 11905: 0xEE86,
- 38997 - 11905: 0xEE87,
- 38998 - 11905: 0xEE88,
- 38999 - 11905: 0xEE89,
- 39000 - 11905: 0xEE8A,
- 39001 - 11905: 0xEE8B,
- 39002 - 11905: 0xEE8C,
- 39003 - 11905: 0xEE8D,
- 39004 - 11905: 0xEE8E,
- 39005 - 11905: 0xEE8F,
- 39006 - 11905: 0xEE90,
- 39007 - 11905: 0xEE91,
- 39008 - 11905: 0xEE92,
- 39009 - 11905: 0xEE93,
- 39010 - 11905: 0xEE94,
- 39011 - 11905: 0xEE95,
- 39012 - 11905: 0xEE96,
- 39013 - 11905: 0xEE97,
- 39014 - 11905: 0xEE98,
- 39015 - 11905: 0xEE99,
- 39016 - 11905: 0xEE9A,
- 39017 - 11905: 0xEE9B,
- 39018 - 11905: 0xEE9C,
- 39019 - 11905: 0xEE9D,
- 39020 - 11905: 0xEE9E,
- 39021 - 11905: 0xEE9F,
- 39022 - 11905: 0xEEA0,
- 39023 - 11905: 0xEF40,
- 39024 - 11905: 0xEF41,
- 39025 - 11905: 0xEF42,
- 39026 - 11905: 0xEF43,
- 39027 - 11905: 0xEF44,
- 39028 - 11905: 0xEF45,
- 39029 - 11905: 0xD2B3,
- 39030 - 11905: 0xB6A5,
- 39031 - 11905: 0xC7EA,
- 39032 - 11905: 0xF1FC,
- 39033 - 11905: 0xCFEE,
- 39034 - 11905: 0xCBB3,
- 39035 - 11905: 0xD0EB,
- 39036 - 11905: 0xE7EF,
- 39037 - 11905: 0xCDE7,
- 39038 - 11905: 0xB9CB,
- 39039 - 11905: 0xB6D9,
- 39040 - 11905: 0xF1FD,
- 39041 - 11905: 0xB0E4,
- 39042 - 11905: 0xCBCC,
- 39043 - 11905: 0xF1FE,
- 39044 - 11905: 0xD4A4,
- 39045 - 11905: 0xC2AD,
- 39046 - 11905: 0xC1EC,
- 39047 - 11905: 0xC6C4,
- 39048 - 11905: 0xBEB1,
- 39049 - 11905: 0xF2A1,
- 39050 - 11905: 0xBCD5,
- 39051 - 11905: 0xEF46,
- 39052 - 11905: 0xF2A2,
- 39053 - 11905: 0xF2A3,
- 39054 - 11905: 0xEF47,
- 39055 - 11905: 0xF2A4,
- 39056 - 11905: 0xD2C3,
- 39057 - 11905: 0xC6B5,
- 39058 - 11905: 0xEF48,
- 39059 - 11905: 0xCDC7,
- 39060 - 11905: 0xF2A5,
- 39061 - 11905: 0xEF49,
- 39062 - 11905: 0xD3B1,
- 39063 - 11905: 0xBFC5,
- 39064 - 11905: 0xCCE2,
- 39065 - 11905: 0xEF4A,
- 39066 - 11905: 0xF2A6,
- 39067 - 11905: 0xF2A7,
- 39068 - 11905: 0xD1D5,
- 39069 - 11905: 0xB6EE,
- 39070 - 11905: 0xF2A8,
- 39071 - 11905: 0xF2A9,
- 39072 - 11905: 0xB5DF,
- 39073 - 11905: 0xF2AA,
- 39074 - 11905: 0xF2AB,
- 39075 - 11905: 0xEF4B,
- 39076 - 11905: 0xB2FC,
- 39077 - 11905: 0xF2AC,
- 39078 - 11905: 0xF2AD,
- 39079 - 11905: 0xC8A7,
- 39080 - 11905: 0xEF4C,
- 39081 - 11905: 0xEF4D,
- 39082 - 11905: 0xEF4E,
- 39083 - 11905: 0xEF4F,
- 39084 - 11905: 0xEF50,
- 39085 - 11905: 0xEF51,
- 39086 - 11905: 0xEF52,
- 39087 - 11905: 0xEF53,
- 39088 - 11905: 0xEF54,
- 39089 - 11905: 0xEF55,
- 39090 - 11905: 0xEF56,
- 39091 - 11905: 0xEF57,
- 39092 - 11905: 0xEF58,
- 39093 - 11905: 0xEF59,
- 39094 - 11905: 0xEF5A,
- 39095 - 11905: 0xEF5B,
- 39096 - 11905: 0xEF5C,
- 39097 - 11905: 0xEF5D,
- 39098 - 11905: 0xEF5E,
- 39099 - 11905: 0xEF5F,
- 39100 - 11905: 0xEF60,
- 39101 - 11905: 0xEF61,
- 39102 - 11905: 0xEF62,
- 39103 - 11905: 0xEF63,
- 39104 - 11905: 0xEF64,
- 39105 - 11905: 0xEF65,
- 39106 - 11905: 0xEF66,
- 39107 - 11905: 0xEF67,
- 39108 - 11905: 0xEF68,
- 39109 - 11905: 0xEF69,
- 39110 - 11905: 0xEF6A,
- 39111 - 11905: 0xEF6B,
- 39112 - 11905: 0xEF6C,
- 39113 - 11905: 0xEF6D,
- 39114 - 11905: 0xEF6E,
- 39115 - 11905: 0xEF6F,
- 39116 - 11905: 0xEF70,
- 39117 - 11905: 0xEF71,
- 39118 - 11905: 0xB7E7,
- 39119 - 11905: 0xEF72,
- 39120 - 11905: 0xEF73,
- 39121 - 11905: 0xECA9,
- 39122 - 11905: 0xECAA,
- 39123 - 11905: 0xECAB,
- 39124 - 11905: 0xEF74,
- 39125 - 11905: 0xECAC,
- 39126 - 11905: 0xEF75,
- 39127 - 11905: 0xEF76,
- 39128 - 11905: 0xC6AE,
- 39129 - 11905: 0xECAD,
- 39130 - 11905: 0xECAE,
- 39131 - 11905: 0xEF77,
- 39132 - 11905: 0xEF78,
- 39133 - 11905: 0xEF79,
- 39134 - 11905: 0xB7C9,
- 39135 - 11905: 0xCAB3,
- 39136 - 11905: 0xEF7A,
- 39137 - 11905: 0xEF7B,
- 39138 - 11905: 0xEF7C,
- 39139 - 11905: 0xEF7D,
- 39140 - 11905: 0xEF7E,
- 39141 - 11905: 0xEF80,
- 39142 - 11905: 0xEF81,
- 39143 - 11905: 0xE2B8,
- 39144 - 11905: 0xF7CF,
- 39145 - 11905: 0xEF82,
- 39146 - 11905: 0xEF83,
- 39147 - 11905: 0xEF84,
- 39148 - 11905: 0xEF85,
- 39149 - 11905: 0xEF86,
- 39150 - 11905: 0xEF87,
- 39151 - 11905: 0xEF88,
- 39152 - 11905: 0xEF89,
- 39153 - 11905: 0xEF8A,
- 39154 - 11905: 0xEF8B,
- 39155 - 11905: 0xEF8C,
- 39156 - 11905: 0xEF8D,
- 39157 - 11905: 0xEF8E,
- 39158 - 11905: 0xEF8F,
- 39159 - 11905: 0xEF90,
- 39160 - 11905: 0xEF91,
- 39161 - 11905: 0xEF92,
- 39162 - 11905: 0xEF93,
- 39163 - 11905: 0xEF94,
- 39164 - 11905: 0xEF95,
- 39165 - 11905: 0xEF96,
- 39166 - 11905: 0xEF97,
- 39167 - 11905: 0xEF98,
- 39168 - 11905: 0xEF99,
- 39169 - 11905: 0xEF9A,
- 39170 - 11905: 0xEF9B,
- 39171 - 11905: 0xEF9C,
- 39172 - 11905: 0xEF9D,
- 39173 - 11905: 0xEF9E,
- 39174 - 11905: 0xEF9F,
- 39175 - 11905: 0xEFA0,
- 39176 - 11905: 0xF040,
- 39177 - 11905: 0xF041,
- 39178 - 11905: 0xF042,
- 39179 - 11905: 0xF043,
- 39180 - 11905: 0xF044,
- 39181 - 11905: 0xF7D0,
- 39182 - 11905: 0xF045,
- 39183 - 11905: 0xF046,
- 39184 - 11905: 0xB2CD,
- 39185 - 11905: 0xF047,
- 39186 - 11905: 0xF048,
- 39187 - 11905: 0xF049,
- 39188 - 11905: 0xF04A,
- 39189 - 11905: 0xF04B,
- 39190 - 11905: 0xF04C,
- 39191 - 11905: 0xF04D,
- 39192 - 11905: 0xF04E,
- 39193 - 11905: 0xF04F,
- 39194 - 11905: 0xF050,
- 39195 - 11905: 0xF051,
- 39196 - 11905: 0xF052,
- 39197 - 11905: 0xF053,
- 39198 - 11905: 0xF054,
- 39199 - 11905: 0xF055,
- 39200 - 11905: 0xF056,
- 39201 - 11905: 0xF057,
- 39202 - 11905: 0xF058,
- 39203 - 11905: 0xF059,
- 39204 - 11905: 0xF05A,
- 39205 - 11905: 0xF05B,
- 39206 - 11905: 0xF05C,
- 39207 - 11905: 0xF05D,
- 39208 - 11905: 0xF05E,
- 39209 - 11905: 0xF05F,
- 39210 - 11905: 0xF060,
- 39211 - 11905: 0xF061,
- 39212 - 11905: 0xF062,
- 39213 - 11905: 0xF063,
- 39214 - 11905: 0xF7D1,
- 39215 - 11905: 0xF064,
- 39216 - 11905: 0xF065,
- 39217 - 11905: 0xF066,
- 39218 - 11905: 0xF067,
- 39219 - 11905: 0xF068,
- 39220 - 11905: 0xF069,
- 39221 - 11905: 0xF06A,
- 39222 - 11905: 0xF06B,
- 39223 - 11905: 0xF06C,
- 39224 - 11905: 0xF06D,
- 39225 - 11905: 0xF06E,
- 39226 - 11905: 0xF06F,
- 39227 - 11905: 0xF070,
- 39228 - 11905: 0xF071,
- 39229 - 11905: 0xF072,
- 39230 - 11905: 0xF073,
- 39231 - 11905: 0xF074,
- 39232 - 11905: 0xF075,
- 39233 - 11905: 0xF076,
- 39234 - 11905: 0xF077,
- 39235 - 11905: 0xF078,
- 39236 - 11905: 0xF079,
- 39237 - 11905: 0xF07A,
- 39238 - 11905: 0xF07B,
- 39239 - 11905: 0xF07C,
- 39240 - 11905: 0xF07D,
- 39241 - 11905: 0xF07E,
- 39242 - 11905: 0xF080,
- 39243 - 11905: 0xF081,
- 39244 - 11905: 0xF082,
- 39245 - 11905: 0xF083,
- 39246 - 11905: 0xF084,
- 39247 - 11905: 0xF085,
- 39248 - 11905: 0xF086,
- 39249 - 11905: 0xF087,
- 39250 - 11905: 0xF088,
- 39251 - 11905: 0xF089,
- 39252 - 11905: 0xF7D3,
- 39253 - 11905: 0xF7D2,
- 39254 - 11905: 0xF08A,
- 39255 - 11905: 0xF08B,
- 39256 - 11905: 0xF08C,
- 39257 - 11905: 0xF08D,
- 39258 - 11905: 0xF08E,
- 39259 - 11905: 0xF08F,
- 39260 - 11905: 0xF090,
- 39261 - 11905: 0xF091,
- 39262 - 11905: 0xF092,
- 39263 - 11905: 0xF093,
- 39264 - 11905: 0xF094,
- 39265 - 11905: 0xF095,
- 39266 - 11905: 0xF096,
- 39267 - 11905: 0xE2BB,
- 39268 - 11905: 0xF097,
- 39269 - 11905: 0xBCA2,
- 39270 - 11905: 0xF098,
- 39271 - 11905: 0xE2BC,
- 39272 - 11905: 0xE2BD,
- 39273 - 11905: 0xE2BE,
- 39274 - 11905: 0xE2BF,
- 39275 - 11905: 0xE2C0,
- 39276 - 11905: 0xE2C1,
- 39277 - 11905: 0xB7B9,
- 39278 - 11905: 0xD2FB,
- 39279 - 11905: 0xBDA4,
- 39280 - 11905: 0xCACE,
- 39281 - 11905: 0xB1A5,
- 39282 - 11905: 0xCBC7,
- 39283 - 11905: 0xF099,
- 39284 - 11905: 0xE2C2,
- 39285 - 11905: 0xB6FC,
- 39286 - 11905: 0xC8C4,
- 39287 - 11905: 0xE2C3,
- 39288 - 11905: 0xF09A,
- 39289 - 11905: 0xF09B,
- 39290 - 11905: 0xBDC8,
- 39291 - 11905: 0xF09C,
- 39292 - 11905: 0xB1FD,
- 39293 - 11905: 0xE2C4,
- 39294 - 11905: 0xF09D,
- 39295 - 11905: 0xB6F6,
- 39296 - 11905: 0xE2C5,
- 39297 - 11905: 0xC4D9,
- 39298 - 11905: 0xF09E,
- 39299 - 11905: 0xF09F,
- 39300 - 11905: 0xE2C6,
- 39301 - 11905: 0xCFDA,
- 39302 - 11905: 0xB9DD,
- 39303 - 11905: 0xE2C7,
- 39304 - 11905: 0xC0A1,
- 39305 - 11905: 0xF0A0,
- 39306 - 11905: 0xE2C8,
- 39307 - 11905: 0xB2F6,
- 39308 - 11905: 0xF140,
- 39309 - 11905: 0xE2C9,
- 39310 - 11905: 0xF141,
- 39311 - 11905: 0xC1F3,
- 39312 - 11905: 0xE2CA,
- 39313 - 11905: 0xE2CB,
- 39314 - 11905: 0xC2F8,
- 39315 - 11905: 0xE2CC,
- 39316 - 11905: 0xE2CD,
- 39317 - 11905: 0xE2CE,
- 39318 - 11905: 0xCAD7,
- 39319 - 11905: 0xD8B8,
- 39320 - 11905: 0xD9E5,
- 39321 - 11905: 0xCFE3,
- 39322 - 11905: 0xF142,
- 39323 - 11905: 0xF143,
- 39324 - 11905: 0xF144,
- 39325 - 11905: 0xF145,
- 39326 - 11905: 0xF146,
- 39327 - 11905: 0xF147,
- 39328 - 11905: 0xF148,
- 39329 - 11905: 0xF149,
- 39330 - 11905: 0xF14A,
- 39331 - 11905: 0xF14B,
- 39332 - 11905: 0xF14C,
- 39333 - 11905: 0xF0A5,
- 39334 - 11905: 0xF14D,
- 39335 - 11905: 0xF14E,
- 39336 - 11905: 0xDCB0,
- 39337 - 11905: 0xF14F,
- 39338 - 11905: 0xF150,
- 39339 - 11905: 0xF151,
- 39340 - 11905: 0xF152,
- 39341 - 11905: 0xF153,
- 39342 - 11905: 0xF154,
- 39343 - 11905: 0xF155,
- 39344 - 11905: 0xF156,
- 39345 - 11905: 0xF157,
- 39346 - 11905: 0xF158,
- 39347 - 11905: 0xF159,
- 39348 - 11905: 0xF15A,
- 39349 - 11905: 0xF15B,
- 39350 - 11905: 0xF15C,
- 39351 - 11905: 0xF15D,
- 39352 - 11905: 0xF15E,
- 39353 - 11905: 0xF15F,
- 39354 - 11905: 0xF160,
- 39355 - 11905: 0xF161,
- 39356 - 11905: 0xF162,
- 39357 - 11905: 0xF163,
- 39358 - 11905: 0xF164,
- 39359 - 11905: 0xF165,
- 39360 - 11905: 0xF166,
- 39361 - 11905: 0xF167,
- 39362 - 11905: 0xF168,
- 39363 - 11905: 0xF169,
- 39364 - 11905: 0xF16A,
- 39365 - 11905: 0xF16B,
- 39366 - 11905: 0xF16C,
- 39367 - 11905: 0xF16D,
- 39368 - 11905: 0xF16E,
- 39369 - 11905: 0xF16F,
- 39370 - 11905: 0xF170,
- 39371 - 11905: 0xF171,
- 39372 - 11905: 0xF172,
- 39373 - 11905: 0xF173,
- 39374 - 11905: 0xF174,
- 39375 - 11905: 0xF175,
- 39376 - 11905: 0xF176,
- 39377 - 11905: 0xF177,
- 39378 - 11905: 0xF178,
- 39379 - 11905: 0xF179,
- 39380 - 11905: 0xF17A,
- 39381 - 11905: 0xF17B,
- 39382 - 11905: 0xF17C,
- 39383 - 11905: 0xF17D,
- 39384 - 11905: 0xF17E,
- 39385 - 11905: 0xF180,
- 39386 - 11905: 0xF181,
- 39387 - 11905: 0xF182,
- 39388 - 11905: 0xF183,
- 39389 - 11905: 0xF184,
- 39390 - 11905: 0xF185,
- 39391 - 11905: 0xF186,
- 39392 - 11905: 0xF187,
- 39393 - 11905: 0xF188,
- 39394 - 11905: 0xF189,
- 39395 - 11905: 0xF18A,
- 39396 - 11905: 0xF18B,
- 39397 - 11905: 0xF18C,
- 39398 - 11905: 0xF18D,
- 39399 - 11905: 0xF18E,
- 39400 - 11905: 0xF18F,
- 39401 - 11905: 0xF190,
- 39402 - 11905: 0xF191,
- 39403 - 11905: 0xF192,
- 39404 - 11905: 0xF193,
- 39405 - 11905: 0xF194,
- 39406 - 11905: 0xF195,
- 39407 - 11905: 0xF196,
- 39408 - 11905: 0xF197,
- 39409 - 11905: 0xF198,
- 39410 - 11905: 0xF199,
- 39411 - 11905: 0xF19A,
- 39412 - 11905: 0xF19B,
- 39413 - 11905: 0xF19C,
- 39414 - 11905: 0xF19D,
- 39415 - 11905: 0xF19E,
- 39416 - 11905: 0xF19F,
- 39417 - 11905: 0xF1A0,
- 39418 - 11905: 0xF240,
- 39419 - 11905: 0xF241,
- 39420 - 11905: 0xF242,
- 39421 - 11905: 0xF243,
- 39422 - 11905: 0xF244,
- 39423 - 11905: 0xF245,
- 39424 - 11905: 0xF246,
- 39425 - 11905: 0xF247,
- 39426 - 11905: 0xF248,
- 39427 - 11905: 0xF249,
- 39428 - 11905: 0xF24A,
- 39429 - 11905: 0xF24B,
- 39430 - 11905: 0xF24C,
- 39431 - 11905: 0xF24D,
- 39432 - 11905: 0xF24E,
- 39433 - 11905: 0xF24F,
- 39434 - 11905: 0xF250,
- 39435 - 11905: 0xF251,
- 39436 - 11905: 0xF252,
- 39437 - 11905: 0xF253,
- 39438 - 11905: 0xF254,
- 39439 - 11905: 0xF255,
- 39440 - 11905: 0xF256,
- 39441 - 11905: 0xF257,
- 39442 - 11905: 0xF258,
- 39443 - 11905: 0xF259,
- 39444 - 11905: 0xF25A,
- 39445 - 11905: 0xF25B,
- 39446 - 11905: 0xF25C,
- 39447 - 11905: 0xF25D,
- 39448 - 11905: 0xF25E,
- 39449 - 11905: 0xF25F,
- 39450 - 11905: 0xF260,
- 39451 - 11905: 0xF261,
- 39452 - 11905: 0xF262,
- 39453 - 11905: 0xF263,
- 39454 - 11905: 0xF264,
- 39455 - 11905: 0xF265,
- 39456 - 11905: 0xF266,
- 39457 - 11905: 0xF267,
- 39458 - 11905: 0xF268,
- 39459 - 11905: 0xF269,
- 39460 - 11905: 0xF26A,
- 39461 - 11905: 0xF26B,
- 39462 - 11905: 0xF26C,
- 39463 - 11905: 0xF26D,
- 39464 - 11905: 0xF26E,
- 39465 - 11905: 0xF26F,
- 39466 - 11905: 0xF270,
- 39467 - 11905: 0xF271,
- 39468 - 11905: 0xF272,
- 39469 - 11905: 0xF273,
- 39470 - 11905: 0xF274,
- 39471 - 11905: 0xF275,
- 39472 - 11905: 0xF276,
- 39473 - 11905: 0xF277,
- 39474 - 11905: 0xF278,
- 39475 - 11905: 0xF279,
- 39476 - 11905: 0xF27A,
- 39477 - 11905: 0xF27B,
- 39478 - 11905: 0xF27C,
- 39479 - 11905: 0xF27D,
- 39480 - 11905: 0xF27E,
- 39481 - 11905: 0xF280,
- 39482 - 11905: 0xF281,
- 39483 - 11905: 0xF282,
- 39484 - 11905: 0xF283,
- 39485 - 11905: 0xF284,
- 39486 - 11905: 0xF285,
- 39487 - 11905: 0xF286,
- 39488 - 11905: 0xF287,
- 39489 - 11905: 0xF288,
- 39490 - 11905: 0xF289,
- 39491 - 11905: 0xF28A,
- 39492 - 11905: 0xF28B,
- 39493 - 11905: 0xF28C,
- 39494 - 11905: 0xF28D,
- 39495 - 11905: 0xF28E,
- 39496 - 11905: 0xF28F,
- 39497 - 11905: 0xF290,
- 39498 - 11905: 0xF291,
- 39499 - 11905: 0xF292,
- 39500 - 11905: 0xF293,
- 39501 - 11905: 0xF294,
- 39502 - 11905: 0xF295,
- 39503 - 11905: 0xF296,
- 39504 - 11905: 0xF297,
- 39505 - 11905: 0xF298,
- 39506 - 11905: 0xF299,
- 39507 - 11905: 0xF29A,
- 39508 - 11905: 0xF29B,
- 39509 - 11905: 0xF29C,
- 39510 - 11905: 0xF29D,
- 39511 - 11905: 0xF29E,
- 39512 - 11905: 0xF29F,
- 39513 - 11905: 0xF2A0,
- 39514 - 11905: 0xF340,
- 39515 - 11905: 0xF341,
- 39516 - 11905: 0xF342,
- 39517 - 11905: 0xF343,
- 39518 - 11905: 0xF344,
- 39519 - 11905: 0xF345,
- 39520 - 11905: 0xF346,
- 39521 - 11905: 0xF347,
- 39522 - 11905: 0xF348,
- 39523 - 11905: 0xF349,
- 39524 - 11905: 0xF34A,
- 39525 - 11905: 0xF34B,
- 39526 - 11905: 0xF34C,
- 39527 - 11905: 0xF34D,
- 39528 - 11905: 0xF34E,
- 39529 - 11905: 0xF34F,
- 39530 - 11905: 0xF350,
- 39531 - 11905: 0xF351,
- 39532 - 11905: 0xC2ED,
- 39533 - 11905: 0xD4A6,
- 39534 - 11905: 0xCDD4,
- 39535 - 11905: 0xD1B1,
- 39536 - 11905: 0xB3DB,
- 39537 - 11905: 0xC7FD,
- 39538 - 11905: 0xF352,
- 39539 - 11905: 0xB2B5,
- 39540 - 11905: 0xC2BF,
- 39541 - 11905: 0xE6E0,
- 39542 - 11905: 0xCABB,
- 39543 - 11905: 0xE6E1,
- 39544 - 11905: 0xE6E2,
- 39545 - 11905: 0xBED4,
- 39546 - 11905: 0xE6E3,
- 39547 - 11905: 0xD7A4,
- 39548 - 11905: 0xCDD5,
- 39549 - 11905: 0xE6E5,
- 39550 - 11905: 0xBCDD,
- 39551 - 11905: 0xE6E4,
- 39552 - 11905: 0xE6E6,
- 39553 - 11905: 0xE6E7,
- 39554 - 11905: 0xC2EE,
- 39555 - 11905: 0xF353,
- 39556 - 11905: 0xBDBE,
- 39557 - 11905: 0xE6E8,
- 39558 - 11905: 0xC2E6,
- 39559 - 11905: 0xBAA7,
- 39560 - 11905: 0xE6E9,
- 39561 - 11905: 0xF354,
- 39562 - 11905: 0xE6EA,
- 39563 - 11905: 0xB3D2,
- 39564 - 11905: 0xD1E9,
- 39565 - 11905: 0xF355,
- 39566 - 11905: 0xF356,
- 39567 - 11905: 0xBFA5,
- 39568 - 11905: 0xE6EB,
- 39569 - 11905: 0xC6EF,
- 39570 - 11905: 0xE6EC,
- 39571 - 11905: 0xE6ED,
- 39572 - 11905: 0xF357,
- 39573 - 11905: 0xF358,
- 39574 - 11905: 0xE6EE,
- 39575 - 11905: 0xC6AD,
- 39576 - 11905: 0xE6EF,
- 39577 - 11905: 0xF359,
- 39578 - 11905: 0xC9A7,
- 39579 - 11905: 0xE6F0,
- 39580 - 11905: 0xE6F1,
- 39581 - 11905: 0xE6F2,
- 39582 - 11905: 0xE5B9,
- 39583 - 11905: 0xE6F3,
- 39584 - 11905: 0xE6F4,
- 39585 - 11905: 0xC2E2,
- 39586 - 11905: 0xE6F5,
- 39587 - 11905: 0xE6F6,
- 39588 - 11905: 0xD6E8,
- 39589 - 11905: 0xE6F7,
- 39590 - 11905: 0xF35A,
- 39591 - 11905: 0xE6F8,
- 39592 - 11905: 0xB9C7,
- 39593 - 11905: 0xF35B,
- 39594 - 11905: 0xF35C,
- 39595 - 11905: 0xF35D,
- 39596 - 11905: 0xF35E,
- 39597 - 11905: 0xF35F,
- 39598 - 11905: 0xF360,
- 39599 - 11905: 0xF361,
- 39600 - 11905: 0xF7BB,
- 39601 - 11905: 0xF7BA,
- 39602 - 11905: 0xF362,
- 39603 - 11905: 0xF363,
- 39604 - 11905: 0xF364,
- 39605 - 11905: 0xF365,
- 39606 - 11905: 0xF7BE,
- 39607 - 11905: 0xF7BC,
- 39608 - 11905: 0xBAA1,
- 39609 - 11905: 0xF366,
- 39610 - 11905: 0xF7BF,
- 39611 - 11905: 0xF367,
- 39612 - 11905: 0xF7C0,
- 39613 - 11905: 0xF368,
- 39614 - 11905: 0xF369,
- 39615 - 11905: 0xF36A,
- 39616 - 11905: 0xF7C2,
- 39617 - 11905: 0xF7C1,
- 39618 - 11905: 0xF7C4,
- 39619 - 11905: 0xF36B,
- 39620 - 11905: 0xF36C,
- 39621 - 11905: 0xF7C3,
- 39622 - 11905: 0xF36D,
- 39623 - 11905: 0xF36E,
- 39624 - 11905: 0xF36F,
- 39625 - 11905: 0xF370,
- 39626 - 11905: 0xF371,
- 39627 - 11905: 0xF7C5,
- 39628 - 11905: 0xF7C6,
- 39629 - 11905: 0xF372,
- 39630 - 11905: 0xF373,
- 39631 - 11905: 0xF374,
- 39632 - 11905: 0xF375,
- 39633 - 11905: 0xF7C7,
- 39634 - 11905: 0xF376,
- 39635 - 11905: 0xCBE8,
- 39636 - 11905: 0xF377,
- 39637 - 11905: 0xF378,
- 39638 - 11905: 0xF379,
- 39639 - 11905: 0xF37A,
- 39640 - 11905: 0xB8DF,
- 39641 - 11905: 0xF37B,
- 39642 - 11905: 0xF37C,
- 39643 - 11905: 0xF37D,
- 39644 - 11905: 0xF37E,
- 39645 - 11905: 0xF380,
- 39646 - 11905: 0xF381,
- 39647 - 11905: 0xF7D4,
- 39648 - 11905: 0xF382,
- 39649 - 11905: 0xF7D5,
- 39650 - 11905: 0xF383,
- 39651 - 11905: 0xF384,
- 39652 - 11905: 0xF385,
- 39653 - 11905: 0xF386,
- 39654 - 11905: 0xF7D6,
- 39655 - 11905: 0xF387,
- 39656 - 11905: 0xF388,
- 39657 - 11905: 0xF389,
- 39658 - 11905: 0xF38A,
- 39659 - 11905: 0xF7D8,
- 39660 - 11905: 0xF38B,
- 39661 - 11905: 0xF7DA,
- 39662 - 11905: 0xF38C,
- 39663 - 11905: 0xF7D7,
- 39664 - 11905: 0xF38D,
- 39665 - 11905: 0xF38E,
- 39666 - 11905: 0xF38F,
- 39667 - 11905: 0xF390,
- 39668 - 11905: 0xF391,
- 39669 - 11905: 0xF392,
- 39670 - 11905: 0xF393,
- 39671 - 11905: 0xF394,
- 39672 - 11905: 0xF395,
- 39673 - 11905: 0xF7DB,
- 39674 - 11905: 0xF396,
- 39675 - 11905: 0xF7D9,
- 39676 - 11905: 0xF397,
- 39677 - 11905: 0xF398,
- 39678 - 11905: 0xF399,
- 39679 - 11905: 0xF39A,
- 39680 - 11905: 0xF39B,
- 39681 - 11905: 0xF39C,
- 39682 - 11905: 0xF39D,
- 39683 - 11905: 0xD7D7,
- 39684 - 11905: 0xF39E,
- 39685 - 11905: 0xF39F,
- 39686 - 11905: 0xF3A0,
- 39687 - 11905: 0xF440,
- 39688 - 11905: 0xF7DC,
- 39689 - 11905: 0xF441,
- 39690 - 11905: 0xF442,
- 39691 - 11905: 0xF443,
- 39692 - 11905: 0xF444,
- 39693 - 11905: 0xF445,
- 39694 - 11905: 0xF446,
- 39695 - 11905: 0xF7DD,
- 39696 - 11905: 0xF447,
- 39697 - 11905: 0xF448,
- 39698 - 11905: 0xF449,
- 39699 - 11905: 0xF7DE,
- 39700 - 11905: 0xF44A,
- 39701 - 11905: 0xF44B,
- 39702 - 11905: 0xF44C,
- 39703 - 11905: 0xF44D,
- 39704 - 11905: 0xF44E,
- 39705 - 11905: 0xF44F,
- 39706 - 11905: 0xF450,
- 39707 - 11905: 0xF451,
- 39708 - 11905: 0xF452,
- 39709 - 11905: 0xF453,
- 39710 - 11905: 0xF454,
- 39711 - 11905: 0xF7DF,
- 39712 - 11905: 0xF455,
- 39713 - 11905: 0xF456,
- 39714 - 11905: 0xF457,
- 39715 - 11905: 0xF7E0,
- 39716 - 11905: 0xF458,
- 39717 - 11905: 0xF459,
- 39718 - 11905: 0xF45A,
- 39719 - 11905: 0xF45B,
- 39720 - 11905: 0xF45C,
- 39721 - 11905: 0xF45D,
- 39722 - 11905: 0xF45E,
- 39723 - 11905: 0xF45F,
- 39724 - 11905: 0xF460,
- 39725 - 11905: 0xF461,
- 39726 - 11905: 0xF462,
- 39727 - 11905: 0xDBCB,
- 39728 - 11905: 0xF463,
- 39729 - 11905: 0xF464,
- 39730 - 11905: 0xD8AA,
- 39731 - 11905: 0xF465,
- 39732 - 11905: 0xF466,
- 39733 - 11905: 0xF467,
- 39734 - 11905: 0xF468,
- 39735 - 11905: 0xF469,
- 39736 - 11905: 0xF46A,
- 39737 - 11905: 0xF46B,
- 39738 - 11905: 0xF46C,
- 39739 - 11905: 0xE5F7,
- 39740 - 11905: 0xB9ED,
- 39741 - 11905: 0xF46D,
- 39742 - 11905: 0xF46E,
- 39743 - 11905: 0xF46F,
- 39744 - 11905: 0xF470,
- 39745 - 11905: 0xBFFD,
- 39746 - 11905: 0xBBEA,
- 39747 - 11905: 0xF7C9,
- 39748 - 11905: 0xC6C7,
- 39749 - 11905: 0xF7C8,
- 39750 - 11905: 0xF471,
- 39751 - 11905: 0xF7CA,
- 39752 - 11905: 0xF7CC,
- 39753 - 11905: 0xF7CB,
- 39754 - 11905: 0xF472,
- 39755 - 11905: 0xF473,
- 39756 - 11905: 0xF474,
- 39757 - 11905: 0xF7CD,
- 39758 - 11905: 0xF475,
- 39759 - 11905: 0xCEBA,
- 39760 - 11905: 0xF476,
- 39761 - 11905: 0xF7CE,
- 39762 - 11905: 0xF477,
- 39763 - 11905: 0xF478,
- 39764 - 11905: 0xC4A7,
- 39765 - 11905: 0xF479,
- 39766 - 11905: 0xF47A,
- 39767 - 11905: 0xF47B,
- 39768 - 11905: 0xF47C,
- 39769 - 11905: 0xF47D,
- 39770 - 11905: 0xF47E,
- 39771 - 11905: 0xF480,
- 39772 - 11905: 0xF481,
- 39773 - 11905: 0xF482,
- 39774 - 11905: 0xF483,
- 39775 - 11905: 0xF484,
- 39776 - 11905: 0xF485,
- 39777 - 11905: 0xF486,
- 39778 - 11905: 0xF487,
- 39779 - 11905: 0xF488,
- 39780 - 11905: 0xF489,
- 39781 - 11905: 0xF48A,
- 39782 - 11905: 0xF48B,
- 39783 - 11905: 0xF48C,
- 39784 - 11905: 0xF48D,
- 39785 - 11905: 0xF48E,
- 39786 - 11905: 0xF48F,
- 39787 - 11905: 0xF490,
- 39788 - 11905: 0xF491,
- 39789 - 11905: 0xF492,
- 39790 - 11905: 0xF493,
- 39791 - 11905: 0xF494,
- 39792 - 11905: 0xF495,
- 39793 - 11905: 0xF496,
- 39794 - 11905: 0xF497,
- 39795 - 11905: 0xF498,
- 39796 - 11905: 0xF499,
- 39797 - 11905: 0xF49A,
- 39798 - 11905: 0xF49B,
- 39799 - 11905: 0xF49C,
- 39800 - 11905: 0xF49D,
- 39801 - 11905: 0xF49E,
- 39802 - 11905: 0xF49F,
- 39803 - 11905: 0xF4A0,
- 39804 - 11905: 0xF540,
- 39805 - 11905: 0xF541,
- 39806 - 11905: 0xF542,
- 39807 - 11905: 0xF543,
- 39808 - 11905: 0xF544,
- 39809 - 11905: 0xF545,
- 39810 - 11905: 0xF546,
- 39811 - 11905: 0xF547,
- 39812 - 11905: 0xF548,
- 39813 - 11905: 0xF549,
- 39814 - 11905: 0xF54A,
- 39815 - 11905: 0xF54B,
- 39816 - 11905: 0xF54C,
- 39817 - 11905: 0xF54D,
- 39818 - 11905: 0xF54E,
- 39819 - 11905: 0xF54F,
- 39820 - 11905: 0xF550,
- 39821 - 11905: 0xF551,
- 39822 - 11905: 0xF552,
- 39823 - 11905: 0xF553,
- 39824 - 11905: 0xF554,
- 39825 - 11905: 0xF555,
- 39826 - 11905: 0xF556,
- 39827 - 11905: 0xF557,
- 39828 - 11905: 0xF558,
- 39829 - 11905: 0xF559,
- 39830 - 11905: 0xF55A,
- 39831 - 11905: 0xF55B,
- 39832 - 11905: 0xF55C,
- 39833 - 11905: 0xF55D,
- 39834 - 11905: 0xF55E,
- 39835 - 11905: 0xF55F,
- 39836 - 11905: 0xF560,
- 39837 - 11905: 0xF561,
- 39838 - 11905: 0xF562,
- 39839 - 11905: 0xF563,
- 39840 - 11905: 0xF564,
- 39841 - 11905: 0xF565,
- 39842 - 11905: 0xF566,
- 39843 - 11905: 0xF567,
- 39844 - 11905: 0xF568,
- 39845 - 11905: 0xF569,
- 39846 - 11905: 0xF56A,
- 39847 - 11905: 0xF56B,
- 39848 - 11905: 0xF56C,
- 39849 - 11905: 0xF56D,
- 39850 - 11905: 0xF56E,
- 39851 - 11905: 0xF56F,
- 39852 - 11905: 0xF570,
- 39853 - 11905: 0xF571,
- 39854 - 11905: 0xF572,
- 39855 - 11905: 0xF573,
- 39856 - 11905: 0xF574,
- 39857 - 11905: 0xF575,
- 39858 - 11905: 0xF576,
- 39859 - 11905: 0xF577,
- 39860 - 11905: 0xF578,
- 39861 - 11905: 0xF579,
- 39862 - 11905: 0xF57A,
- 39863 - 11905: 0xF57B,
- 39864 - 11905: 0xF57C,
- 39865 - 11905: 0xF57D,
- 39866 - 11905: 0xF57E,
- 39867 - 11905: 0xF580,
- 39868 - 11905: 0xF581,
- 39869 - 11905: 0xF582,
- 39870 - 11905: 0xF583,
- 39871 - 11905: 0xF584,
- 39872 - 11905: 0xF585,
- 39873 - 11905: 0xF586,
- 39874 - 11905: 0xF587,
- 39875 - 11905: 0xF588,
- 39876 - 11905: 0xF589,
- 39877 - 11905: 0xF58A,
- 39878 - 11905: 0xF58B,
- 39879 - 11905: 0xF58C,
- 39880 - 11905: 0xF58D,
- 39881 - 11905: 0xF58E,
- 39882 - 11905: 0xF58F,
- 39883 - 11905: 0xF590,
- 39884 - 11905: 0xF591,
- 39885 - 11905: 0xF592,
- 39886 - 11905: 0xF593,
- 39887 - 11905: 0xF594,
- 39888 - 11905: 0xF595,
- 39889 - 11905: 0xF596,
- 39890 - 11905: 0xF597,
- 39891 - 11905: 0xF598,
- 39892 - 11905: 0xF599,
- 39893 - 11905: 0xF59A,
- 39894 - 11905: 0xF59B,
- 39895 - 11905: 0xF59C,
- 39896 - 11905: 0xF59D,
- 39897 - 11905: 0xF59E,
- 39898 - 11905: 0xF59F,
- 39899 - 11905: 0xF5A0,
- 39900 - 11905: 0xF640,
- 39901 - 11905: 0xF641,
- 39902 - 11905: 0xF642,
- 39903 - 11905: 0xF643,
- 39904 - 11905: 0xF644,
- 39905 - 11905: 0xF645,
- 39906 - 11905: 0xF646,
- 39907 - 11905: 0xF647,
- 39908 - 11905: 0xF648,
- 39909 - 11905: 0xF649,
- 39910 - 11905: 0xF64A,
- 39911 - 11905: 0xF64B,
- 39912 - 11905: 0xF64C,
- 39913 - 11905: 0xF64D,
- 39914 - 11905: 0xF64E,
- 39915 - 11905: 0xF64F,
- 39916 - 11905: 0xF650,
- 39917 - 11905: 0xF651,
- 39918 - 11905: 0xF652,
- 39919 - 11905: 0xF653,
- 39920 - 11905: 0xF654,
- 39921 - 11905: 0xF655,
- 39922 - 11905: 0xF656,
- 39923 - 11905: 0xF657,
- 39924 - 11905: 0xF658,
- 39925 - 11905: 0xF659,
- 39926 - 11905: 0xF65A,
- 39927 - 11905: 0xF65B,
- 39928 - 11905: 0xF65C,
- 39929 - 11905: 0xF65D,
- 39930 - 11905: 0xF65E,
- 39931 - 11905: 0xF65F,
- 39932 - 11905: 0xF660,
- 39933 - 11905: 0xF661,
- 39934 - 11905: 0xF662,
- 39935 - 11905: 0xF663,
- 39936 - 11905: 0xF664,
- 39937 - 11905: 0xF665,
- 39938 - 11905: 0xF666,
- 39939 - 11905: 0xF667,
- 39940 - 11905: 0xF668,
- 39941 - 11905: 0xF669,
- 39942 - 11905: 0xF66A,
- 39943 - 11905: 0xF66B,
- 39944 - 11905: 0xF66C,
- 39945 - 11905: 0xF66D,
- 39946 - 11905: 0xF66E,
- 39947 - 11905: 0xF66F,
- 39948 - 11905: 0xF670,
- 39949 - 11905: 0xF671,
- 39950 - 11905: 0xF672,
- 39951 - 11905: 0xF673,
- 39952 - 11905: 0xF674,
- 39953 - 11905: 0xF675,
- 39954 - 11905: 0xF676,
- 39955 - 11905: 0xF677,
- 39956 - 11905: 0xF678,
- 39957 - 11905: 0xF679,
- 39958 - 11905: 0xF67A,
- 39959 - 11905: 0xF67B,
- 39960 - 11905: 0xF67C,
- 39961 - 11905: 0xF67D,
- 39962 - 11905: 0xF67E,
- 39963 - 11905: 0xF680,
- 39964 - 11905: 0xF681,
- 39965 - 11905: 0xF682,
- 39966 - 11905: 0xF683,
- 39967 - 11905: 0xF684,
- 39968 - 11905: 0xF685,
- 39969 - 11905: 0xF686,
- 39970 - 11905: 0xF687,
- 39971 - 11905: 0xF688,
- 39972 - 11905: 0xF689,
- 39973 - 11905: 0xF68A,
- 39974 - 11905: 0xF68B,
- 39975 - 11905: 0xF68C,
- 39976 - 11905: 0xF68D,
- 39977 - 11905: 0xF68E,
- 39978 - 11905: 0xF68F,
- 39979 - 11905: 0xF690,
- 39980 - 11905: 0xF691,
- 39981 - 11905: 0xF692,
- 39982 - 11905: 0xF693,
- 39983 - 11905: 0xF694,
- 39984 - 11905: 0xF695,
- 39985 - 11905: 0xF696,
- 39986 - 11905: 0xF697,
- 39987 - 11905: 0xF698,
- 39988 - 11905: 0xF699,
- 39989 - 11905: 0xF69A,
- 39990 - 11905: 0xF69B,
- 39991 - 11905: 0xF69C,
- 39992 - 11905: 0xF69D,
- 39993 - 11905: 0xF69E,
- 39994 - 11905: 0xF69F,
- 39995 - 11905: 0xF6A0,
- 39996 - 11905: 0xF740,
- 39997 - 11905: 0xF741,
- 39998 - 11905: 0xF742,
- 39999 - 11905: 0xF743,
- 40000 - 11905: 0xF744,
- 40001 - 11905: 0xF745,
- 40002 - 11905: 0xF746,
- 40003 - 11905: 0xF747,
- 40004 - 11905: 0xF748,
- 40005 - 11905: 0xF749,
- 40006 - 11905: 0xF74A,
- 40007 - 11905: 0xF74B,
- 40008 - 11905: 0xF74C,
- 40009 - 11905: 0xF74D,
- 40010 - 11905: 0xF74E,
- 40011 - 11905: 0xF74F,
- 40012 - 11905: 0xF750,
- 40013 - 11905: 0xF751,
- 40014 - 11905: 0xF752,
- 40015 - 11905: 0xF753,
- 40016 - 11905: 0xF754,
- 40017 - 11905: 0xF755,
- 40018 - 11905: 0xF756,
- 40019 - 11905: 0xF757,
- 40020 - 11905: 0xF758,
- 40021 - 11905: 0xF759,
- 40022 - 11905: 0xF75A,
- 40023 - 11905: 0xF75B,
- 40024 - 11905: 0xF75C,
- 40025 - 11905: 0xF75D,
- 40026 - 11905: 0xF75E,
- 40027 - 11905: 0xF75F,
- 40028 - 11905: 0xF760,
- 40029 - 11905: 0xF761,
- 40030 - 11905: 0xF762,
- 40031 - 11905: 0xF763,
- 40032 - 11905: 0xF764,
- 40033 - 11905: 0xF765,
- 40034 - 11905: 0xF766,
- 40035 - 11905: 0xF767,
- 40036 - 11905: 0xF768,
- 40037 - 11905: 0xF769,
- 40038 - 11905: 0xF76A,
- 40039 - 11905: 0xF76B,
- 40040 - 11905: 0xF76C,
- 40041 - 11905: 0xF76D,
- 40042 - 11905: 0xF76E,
- 40043 - 11905: 0xF76F,
- 40044 - 11905: 0xF770,
- 40045 - 11905: 0xF771,
- 40046 - 11905: 0xF772,
- 40047 - 11905: 0xF773,
- 40048 - 11905: 0xF774,
- 40049 - 11905: 0xF775,
- 40050 - 11905: 0xF776,
- 40051 - 11905: 0xF777,
- 40052 - 11905: 0xF778,
- 40053 - 11905: 0xF779,
- 40054 - 11905: 0xF77A,
- 40055 - 11905: 0xF77B,
- 40056 - 11905: 0xF77C,
- 40057 - 11905: 0xF77D,
- 40058 - 11905: 0xF77E,
- 40059 - 11905: 0xF780,
- 40060 - 11905: 0xD3E3,
- 40061 - 11905: 0xF781,
- 40062 - 11905: 0xF782,
- 40063 - 11905: 0xF6CF,
- 40064 - 11905: 0xF783,
- 40065 - 11905: 0xC2B3,
- 40066 - 11905: 0xF6D0,
- 40067 - 11905: 0xF784,
- 40068 - 11905: 0xF785,
- 40069 - 11905: 0xF6D1,
- 40070 - 11905: 0xF6D2,
- 40071 - 11905: 0xF6D3,
- 40072 - 11905: 0xF6D4,
- 40073 - 11905: 0xF786,
- 40074 - 11905: 0xF787,
- 40075 - 11905: 0xF6D6,
- 40076 - 11905: 0xF788,
- 40077 - 11905: 0xB1AB,
- 40078 - 11905: 0xF6D7,
- 40079 - 11905: 0xF789,
- 40080 - 11905: 0xF6D8,
- 40081 - 11905: 0xF6D9,
- 40082 - 11905: 0xF6DA,
- 40083 - 11905: 0xF78A,
- 40084 - 11905: 0xF6DB,
- 40085 - 11905: 0xF6DC,
- 40086 - 11905: 0xF78B,
- 40087 - 11905: 0xF78C,
- 40088 - 11905: 0xF78D,
- 40089 - 11905: 0xF78E,
- 40090 - 11905: 0xF6DD,
- 40091 - 11905: 0xF6DE,
- 40092 - 11905: 0xCFCA,
- 40093 - 11905: 0xF78F,
- 40094 - 11905: 0xF6DF,
- 40095 - 11905: 0xF6E0,
- 40096 - 11905: 0xF6E1,
- 40097 - 11905: 0xF6E2,
- 40098 - 11905: 0xF6E3,
- 40099 - 11905: 0xF6E4,
- 40100 - 11905: 0xC0F0,
- 40101 - 11905: 0xF6E5,
- 40102 - 11905: 0xF6E6,
- 40103 - 11905: 0xF6E7,
- 40104 - 11905: 0xF6E8,
- 40105 - 11905: 0xF6E9,
- 40106 - 11905: 0xF790,
- 40107 - 11905: 0xF6EA,
- 40108 - 11905: 0xF791,
- 40109 - 11905: 0xF6EB,
- 40110 - 11905: 0xF6EC,
- 40111 - 11905: 0xF792,
- 40112 - 11905: 0xF6ED,
- 40113 - 11905: 0xF6EE,
- 40114 - 11905: 0xF6EF,
- 40115 - 11905: 0xF6F0,
- 40116 - 11905: 0xF6F1,
- 40117 - 11905: 0xF6F2,
- 40118 - 11905: 0xF6F3,
- 40119 - 11905: 0xF6F4,
- 40120 - 11905: 0xBEA8,
- 40121 - 11905: 0xF793,
- 40122 - 11905: 0xF6F5,
- 40123 - 11905: 0xF6F6,
- 40124 - 11905: 0xF6F7,
- 40125 - 11905: 0xF6F8,
- 40126 - 11905: 0xF794,
- 40127 - 11905: 0xF795,
- 40128 - 11905: 0xF796,
- 40129 - 11905: 0xF797,
- 40130 - 11905: 0xF798,
- 40131 - 11905: 0xC8FA,
- 40132 - 11905: 0xF6F9,
- 40133 - 11905: 0xF6FA,
- 40134 - 11905: 0xF6FB,
- 40135 - 11905: 0xF6FC,
- 40136 - 11905: 0xF799,
- 40137 - 11905: 0xF79A,
- 40138 - 11905: 0xF6FD,
- 40139 - 11905: 0xF6FE,
- 40140 - 11905: 0xF7A1,
- 40141 - 11905: 0xF7A2,
- 40142 - 11905: 0xF7A3,
- 40143 - 11905: 0xF7A4,
- 40144 - 11905: 0xF7A5,
- 40145 - 11905: 0xF79B,
- 40146 - 11905: 0xF79C,
- 40147 - 11905: 0xF7A6,
- 40148 - 11905: 0xF7A7,
- 40149 - 11905: 0xF7A8,
- 40150 - 11905: 0xB1EE,
- 40151 - 11905: 0xF7A9,
- 40152 - 11905: 0xF7AA,
- 40153 - 11905: 0xF7AB,
- 40154 - 11905: 0xF79D,
- 40155 - 11905: 0xF79E,
- 40156 - 11905: 0xF7AC,
- 40157 - 11905: 0xF7AD,
- 40158 - 11905: 0xC1DB,
- 40159 - 11905: 0xF7AE,
- 40160 - 11905: 0xF79F,
- 40161 - 11905: 0xF7A0,
- 40162 - 11905: 0xF7AF,
- 40163 - 11905: 0xF840,
- 40164 - 11905: 0xF841,
- 40165 - 11905: 0xF842,
- 40166 - 11905: 0xF843,
- 40167 - 11905: 0xF844,
- 40168 - 11905: 0xF845,
- 40169 - 11905: 0xF846,
- 40170 - 11905: 0xF847,
- 40171 - 11905: 0xF848,
- 40172 - 11905: 0xF849,
- 40173 - 11905: 0xF84A,
- 40174 - 11905: 0xF84B,
- 40175 - 11905: 0xF84C,
- 40176 - 11905: 0xF84D,
- 40177 - 11905: 0xF84E,
- 40178 - 11905: 0xF84F,
- 40179 - 11905: 0xF850,
- 40180 - 11905: 0xF851,
- 40181 - 11905: 0xF852,
- 40182 - 11905: 0xF853,
- 40183 - 11905: 0xF854,
- 40184 - 11905: 0xF855,
- 40185 - 11905: 0xF856,
- 40186 - 11905: 0xF857,
- 40187 - 11905: 0xF858,
- 40188 - 11905: 0xF859,
- 40189 - 11905: 0xF85A,
- 40190 - 11905: 0xF85B,
- 40191 - 11905: 0xF85C,
- 40192 - 11905: 0xF85D,
- 40193 - 11905: 0xF85E,
- 40194 - 11905: 0xF85F,
- 40195 - 11905: 0xF860,
- 40196 - 11905: 0xF861,
- 40197 - 11905: 0xF862,
- 40198 - 11905: 0xF863,
- 40199 - 11905: 0xF864,
- 40200 - 11905: 0xF865,
- 40201 - 11905: 0xF866,
- 40202 - 11905: 0xF867,
- 40203 - 11905: 0xF868,
- 40204 - 11905: 0xF869,
- 40205 - 11905: 0xF86A,
- 40206 - 11905: 0xF86B,
- 40207 - 11905: 0xF86C,
- 40208 - 11905: 0xF86D,
- 40209 - 11905: 0xF86E,
- 40210 - 11905: 0xF86F,
- 40211 - 11905: 0xF870,
- 40212 - 11905: 0xF871,
- 40213 - 11905: 0xF872,
- 40214 - 11905: 0xF873,
- 40215 - 11905: 0xF874,
- 40216 - 11905: 0xF875,
- 40217 - 11905: 0xF876,
- 40218 - 11905: 0xF877,
- 40219 - 11905: 0xF878,
- 40220 - 11905: 0xF879,
- 40221 - 11905: 0xF87A,
- 40222 - 11905: 0xF87B,
- 40223 - 11905: 0xF87C,
- 40224 - 11905: 0xF87D,
- 40225 - 11905: 0xF87E,
- 40226 - 11905: 0xF880,
- 40227 - 11905: 0xF881,
- 40228 - 11905: 0xF882,
- 40229 - 11905: 0xF883,
- 40230 - 11905: 0xF884,
- 40231 - 11905: 0xF885,
- 40232 - 11905: 0xF886,
- 40233 - 11905: 0xF887,
- 40234 - 11905: 0xF888,
- 40235 - 11905: 0xF889,
- 40236 - 11905: 0xF88A,
- 40237 - 11905: 0xF88B,
- 40238 - 11905: 0xF88C,
- 40239 - 11905: 0xF88D,
- 40240 - 11905: 0xF88E,
- 40241 - 11905: 0xF88F,
- 40242 - 11905: 0xF890,
- 40243 - 11905: 0xF891,
- 40244 - 11905: 0xF892,
- 40245 - 11905: 0xF893,
- 40246 - 11905: 0xF894,
- 40247 - 11905: 0xF895,
- 40248 - 11905: 0xF896,
- 40249 - 11905: 0xF897,
- 40250 - 11905: 0xF898,
- 40251 - 11905: 0xF899,
- 40252 - 11905: 0xF89A,
- 40253 - 11905: 0xF89B,
- 40254 - 11905: 0xF89C,
- 40255 - 11905: 0xF89D,
- 40256 - 11905: 0xF89E,
- 40257 - 11905: 0xF89F,
- 40258 - 11905: 0xF8A0,
- 40259 - 11905: 0xF940,
- 40260 - 11905: 0xF941,
- 40261 - 11905: 0xF942,
- 40262 - 11905: 0xF943,
- 40263 - 11905: 0xF944,
- 40264 - 11905: 0xF945,
- 40265 - 11905: 0xF946,
- 40266 - 11905: 0xF947,
- 40267 - 11905: 0xF948,
- 40268 - 11905: 0xF949,
- 40269 - 11905: 0xF94A,
- 40270 - 11905: 0xF94B,
- 40271 - 11905: 0xF94C,
- 40272 - 11905: 0xF94D,
- 40273 - 11905: 0xF94E,
- 40274 - 11905: 0xF94F,
- 40275 - 11905: 0xF950,
- 40276 - 11905: 0xF951,
- 40277 - 11905: 0xF952,
- 40278 - 11905: 0xF953,
- 40279 - 11905: 0xF954,
- 40280 - 11905: 0xF955,
- 40281 - 11905: 0xF956,
- 40282 - 11905: 0xF957,
- 40283 - 11905: 0xF958,
- 40284 - 11905: 0xF959,
- 40285 - 11905: 0xF95A,
- 40286 - 11905: 0xF95B,
- 40287 - 11905: 0xF95C,
- 40288 - 11905: 0xF95D,
- 40289 - 11905: 0xF95E,
- 40290 - 11905: 0xF95F,
- 40291 - 11905: 0xF960,
- 40292 - 11905: 0xF961,
- 40293 - 11905: 0xF962,
- 40294 - 11905: 0xF963,
- 40295 - 11905: 0xF964,
- 40296 - 11905: 0xF965,
- 40297 - 11905: 0xF966,
- 40298 - 11905: 0xF967,
- 40299 - 11905: 0xF968,
- 40300 - 11905: 0xF969,
- 40301 - 11905: 0xF96A,
- 40302 - 11905: 0xF96B,
- 40303 - 11905: 0xF96C,
- 40304 - 11905: 0xF96D,
- 40305 - 11905: 0xF96E,
- 40306 - 11905: 0xF96F,
- 40307 - 11905: 0xF970,
- 40308 - 11905: 0xF971,
- 40309 - 11905: 0xF972,
- 40310 - 11905: 0xF973,
- 40311 - 11905: 0xF974,
- 40312 - 11905: 0xF975,
- 40313 - 11905: 0xF976,
- 40314 - 11905: 0xF977,
- 40315 - 11905: 0xF978,
- 40316 - 11905: 0xF979,
- 40317 - 11905: 0xF97A,
- 40318 - 11905: 0xF97B,
- 40319 - 11905: 0xF97C,
- 40320 - 11905: 0xF97D,
- 40321 - 11905: 0xF97E,
- 40322 - 11905: 0xF980,
- 40323 - 11905: 0xF981,
- 40324 - 11905: 0xF982,
- 40325 - 11905: 0xF983,
- 40326 - 11905: 0xF984,
- 40327 - 11905: 0xF985,
- 40328 - 11905: 0xF986,
- 40329 - 11905: 0xF987,
- 40330 - 11905: 0xF988,
- 40331 - 11905: 0xF989,
- 40332 - 11905: 0xF98A,
- 40333 - 11905: 0xF98B,
- 40334 - 11905: 0xF98C,
- 40335 - 11905: 0xF98D,
- 40336 - 11905: 0xF98E,
- 40337 - 11905: 0xF98F,
- 40338 - 11905: 0xF990,
- 40339 - 11905: 0xF991,
- 40340 - 11905: 0xF992,
- 40341 - 11905: 0xF993,
- 40342 - 11905: 0xF994,
- 40343 - 11905: 0xF995,
- 40344 - 11905: 0xF996,
- 40345 - 11905: 0xF997,
- 40346 - 11905: 0xF998,
- 40347 - 11905: 0xF999,
- 40348 - 11905: 0xF99A,
- 40349 - 11905: 0xF99B,
- 40350 - 11905: 0xF99C,
- 40351 - 11905: 0xF99D,
- 40352 - 11905: 0xF99E,
- 40353 - 11905: 0xF99F,
- 40354 - 11905: 0xF9A0,
- 40355 - 11905: 0xFA40,
- 40356 - 11905: 0xFA41,
- 40357 - 11905: 0xFA42,
- 40358 - 11905: 0xFA43,
- 40359 - 11905: 0xFA44,
- 40360 - 11905: 0xFA45,
- 40361 - 11905: 0xFA46,
- 40362 - 11905: 0xFA47,
- 40363 - 11905: 0xFA48,
- 40364 - 11905: 0xFA49,
- 40365 - 11905: 0xFA4A,
- 40366 - 11905: 0xFA4B,
- 40367 - 11905: 0xFA4C,
- 40368 - 11905: 0xFA4D,
- 40369 - 11905: 0xFA4E,
- 40370 - 11905: 0xFA4F,
- 40371 - 11905: 0xFA50,
- 40372 - 11905: 0xFA51,
- 40373 - 11905: 0xFA52,
- 40374 - 11905: 0xFA53,
- 40375 - 11905: 0xFA54,
- 40376 - 11905: 0xFA55,
- 40377 - 11905: 0xFA56,
- 40378 - 11905: 0xFA57,
- 40379 - 11905: 0xFA58,
- 40380 - 11905: 0xFA59,
- 40381 - 11905: 0xFA5A,
- 40382 - 11905: 0xFA5B,
- 40383 - 11905: 0xFA5C,
- 40384 - 11905: 0xFA5D,
- 40385 - 11905: 0xFA5E,
- 40386 - 11905: 0xFA5F,
- 40387 - 11905: 0xFA60,
- 40388 - 11905: 0xFA61,
- 40389 - 11905: 0xFA62,
- 40390 - 11905: 0xFA63,
- 40391 - 11905: 0xFA64,
- 40392 - 11905: 0xFA65,
- 40393 - 11905: 0xFA66,
- 40394 - 11905: 0xFA67,
- 40395 - 11905: 0xFA68,
- 40396 - 11905: 0xFA69,
- 40397 - 11905: 0xFA6A,
- 40398 - 11905: 0xFA6B,
- 40399 - 11905: 0xFA6C,
- 40400 - 11905: 0xFA6D,
- 40401 - 11905: 0xFA6E,
- 40402 - 11905: 0xFA6F,
- 40403 - 11905: 0xFA70,
- 40404 - 11905: 0xFA71,
- 40405 - 11905: 0xFA72,
- 40406 - 11905: 0xFA73,
- 40407 - 11905: 0xFA74,
- 40408 - 11905: 0xFA75,
- 40409 - 11905: 0xFA76,
- 40410 - 11905: 0xFA77,
- 40411 - 11905: 0xFA78,
- 40412 - 11905: 0xFA79,
- 40413 - 11905: 0xFA7A,
- 40414 - 11905: 0xFA7B,
- 40415 - 11905: 0xFA7C,
- 40416 - 11905: 0xFA7D,
- 40417 - 11905: 0xFA7E,
- 40418 - 11905: 0xFA80,
- 40419 - 11905: 0xFA81,
- 40420 - 11905: 0xFA82,
- 40421 - 11905: 0xFA83,
- 40422 - 11905: 0xFA84,
- 40423 - 11905: 0xFA85,
- 40424 - 11905: 0xFA86,
- 40425 - 11905: 0xFA87,
- 40426 - 11905: 0xFA88,
- 40427 - 11905: 0xFA89,
- 40428 - 11905: 0xFA8A,
- 40429 - 11905: 0xFA8B,
- 40430 - 11905: 0xFA8C,
- 40431 - 11905: 0xFA8D,
- 40432 - 11905: 0xFA8E,
- 40433 - 11905: 0xFA8F,
- 40434 - 11905: 0xFA90,
- 40435 - 11905: 0xFA91,
- 40436 - 11905: 0xFA92,
- 40437 - 11905: 0xFA93,
- 40438 - 11905: 0xFA94,
- 40439 - 11905: 0xFA95,
- 40440 - 11905: 0xFA96,
- 40441 - 11905: 0xFA97,
- 40442 - 11905: 0xFA98,
- 40443 - 11905: 0xFA99,
- 40444 - 11905: 0xFA9A,
- 40445 - 11905: 0xFA9B,
- 40446 - 11905: 0xFA9C,
- 40447 - 11905: 0xFA9D,
- 40448 - 11905: 0xFA9E,
- 40449 - 11905: 0xFA9F,
- 40450 - 11905: 0xFAA0,
- 40451 - 11905: 0xFB40,
- 40452 - 11905: 0xFB41,
- 40453 - 11905: 0xFB42,
- 40454 - 11905: 0xFB43,
- 40455 - 11905: 0xFB44,
- 40456 - 11905: 0xFB45,
- 40457 - 11905: 0xFB46,
- 40458 - 11905: 0xFB47,
- 40459 - 11905: 0xFB48,
- 40460 - 11905: 0xFB49,
- 40461 - 11905: 0xFB4A,
- 40462 - 11905: 0xFB4B,
- 40463 - 11905: 0xFB4C,
- 40464 - 11905: 0xFB4D,
- 40465 - 11905: 0xFB4E,
- 40466 - 11905: 0xFB4F,
- 40467 - 11905: 0xFB50,
- 40468 - 11905: 0xFB51,
- 40469 - 11905: 0xFB52,
- 40470 - 11905: 0xFB53,
- 40471 - 11905: 0xFB54,
- 40472 - 11905: 0xFB55,
- 40473 - 11905: 0xFB56,
- 40474 - 11905: 0xFB57,
- 40475 - 11905: 0xFB58,
- 40476 - 11905: 0xFB59,
- 40477 - 11905: 0xFB5A,
- 40478 - 11905: 0xFB5B,
- 40479 - 11905: 0xC4F1,
- 40480 - 11905: 0xF0AF,
- 40481 - 11905: 0xBCA6,
- 40482 - 11905: 0xF0B0,
- 40483 - 11905: 0xC3F9,
- 40484 - 11905: 0xFB5C,
- 40485 - 11905: 0xC5B8,
- 40486 - 11905: 0xD1BB,
- 40487 - 11905: 0xFB5D,
- 40488 - 11905: 0xF0B1,
- 40489 - 11905: 0xF0B2,
- 40490 - 11905: 0xF0B3,
- 40491 - 11905: 0xF0B4,
- 40492 - 11905: 0xF0B5,
- 40493 - 11905: 0xD1BC,
- 40494 - 11905: 0xFB5E,
- 40495 - 11905: 0xD1EC,
- 40496 - 11905: 0xFB5F,
- 40497 - 11905: 0xF0B7,
- 40498 - 11905: 0xF0B6,
- 40499 - 11905: 0xD4A7,
- 40500 - 11905: 0xFB60,
- 40501 - 11905: 0xCDD2,
- 40502 - 11905: 0xF0B8,
- 40503 - 11905: 0xF0BA,
- 40504 - 11905: 0xF0B9,
- 40505 - 11905: 0xF0BB,
- 40506 - 11905: 0xF0BC,
- 40507 - 11905: 0xFB61,
- 40508 - 11905: 0xFB62,
- 40509 - 11905: 0xB8EB,
- 40510 - 11905: 0xF0BD,
- 40511 - 11905: 0xBAE8,
- 40512 - 11905: 0xFB63,
- 40513 - 11905: 0xF0BE,
- 40514 - 11905: 0xF0BF,
- 40515 - 11905: 0xBEE9,
- 40516 - 11905: 0xF0C0,
- 40517 - 11905: 0xB6EC,
- 40518 - 11905: 0xF0C1,
- 40519 - 11905: 0xF0C2,
- 40520 - 11905: 0xF0C3,
- 40521 - 11905: 0xF0C4,
- 40522 - 11905: 0xC8B5,
- 40523 - 11905: 0xF0C5,
- 40524 - 11905: 0xF0C6,
- 40525 - 11905: 0xFB64,
- 40526 - 11905: 0xF0C7,
- 40527 - 11905: 0xC5F4,
- 40528 - 11905: 0xFB65,
- 40529 - 11905: 0xF0C8,
- 40530 - 11905: 0xFB66,
- 40531 - 11905: 0xFB67,
- 40532 - 11905: 0xFB68,
- 40533 - 11905: 0xF0C9,
- 40534 - 11905: 0xFB69,
- 40535 - 11905: 0xF0CA,
- 40536 - 11905: 0xF7BD,
- 40537 - 11905: 0xFB6A,
- 40538 - 11905: 0xF0CB,
- 40539 - 11905: 0xF0CC,
- 40540 - 11905: 0xF0CD,
- 40541 - 11905: 0xFB6B,
- 40542 - 11905: 0xF0CE,
- 40543 - 11905: 0xFB6C,
- 40544 - 11905: 0xFB6D,
- 40545 - 11905: 0xFB6E,
- 40546 - 11905: 0xFB6F,
- 40547 - 11905: 0xF0CF,
- 40548 - 11905: 0xBAD7,
- 40549 - 11905: 0xFB70,
- 40550 - 11905: 0xF0D0,
- 40551 - 11905: 0xF0D1,
- 40552 - 11905: 0xF0D2,
- 40553 - 11905: 0xF0D3,
- 40554 - 11905: 0xF0D4,
- 40555 - 11905: 0xF0D5,
- 40556 - 11905: 0xF0D6,
- 40557 - 11905: 0xF0D8,
- 40558 - 11905: 0xFB71,
- 40559 - 11905: 0xFB72,
- 40560 - 11905: 0xD3A5,
- 40561 - 11905: 0xF0D7,
- 40562 - 11905: 0xFB73,
- 40563 - 11905: 0xF0D9,
- 40564 - 11905: 0xFB74,
- 40565 - 11905: 0xFB75,
- 40566 - 11905: 0xFB76,
- 40567 - 11905: 0xFB77,
- 40568 - 11905: 0xFB78,
- 40569 - 11905: 0xFB79,
- 40570 - 11905: 0xFB7A,
- 40571 - 11905: 0xFB7B,
- 40572 - 11905: 0xFB7C,
- 40573 - 11905: 0xFB7D,
- 40574 - 11905: 0xF5BA,
- 40575 - 11905: 0xC2B9,
- 40576 - 11905: 0xFB7E,
- 40577 - 11905: 0xFB80,
- 40578 - 11905: 0xF7E4,
- 40579 - 11905: 0xFB81,
- 40580 - 11905: 0xFB82,
- 40581 - 11905: 0xFB83,
- 40582 - 11905: 0xFB84,
- 40583 - 11905: 0xF7E5,
- 40584 - 11905: 0xF7E6,
- 40585 - 11905: 0xFB85,
- 40586 - 11905: 0xFB86,
- 40587 - 11905: 0xF7E7,
- 40588 - 11905: 0xFB87,
- 40589 - 11905: 0xFB88,
- 40590 - 11905: 0xFB89,
- 40591 - 11905: 0xFB8A,
- 40592 - 11905: 0xFB8B,
- 40593 - 11905: 0xFB8C,
- 40594 - 11905: 0xF7E8,
- 40595 - 11905: 0xC2B4,
- 40596 - 11905: 0xFB8D,
- 40597 - 11905: 0xFB8E,
- 40598 - 11905: 0xFB8F,
- 40599 - 11905: 0xFB90,
- 40600 - 11905: 0xFB91,
- 40601 - 11905: 0xFB92,
- 40602 - 11905: 0xFB93,
- 40603 - 11905: 0xFB94,
- 40604 - 11905: 0xFB95,
- 40605 - 11905: 0xF7EA,
- 40606 - 11905: 0xFB96,
- 40607 - 11905: 0xF7EB,
- 40608 - 11905: 0xFB97,
- 40609 - 11905: 0xFB98,
- 40610 - 11905: 0xFB99,
- 40611 - 11905: 0xFB9A,
- 40612 - 11905: 0xFB9B,
- 40613 - 11905: 0xFB9C,
- 40614 - 11905: 0xC2F3,
- 40615 - 11905: 0xFB9D,
- 40616 - 11905: 0xFB9E,
- 40617 - 11905: 0xFB9F,
- 40618 - 11905: 0xFBA0,
- 40619 - 11905: 0xFC40,
- 40620 - 11905: 0xFC41,
- 40621 - 11905: 0xFC42,
- 40622 - 11905: 0xFC43,
- 40623 - 11905: 0xFC44,
- 40624 - 11905: 0xFC45,
- 40625 - 11905: 0xFC46,
- 40626 - 11905: 0xFC47,
- 40627 - 11905: 0xFC48,
- 40628 - 11905: 0xF4F0,
- 40629 - 11905: 0xFC49,
- 40630 - 11905: 0xFC4A,
- 40631 - 11905: 0xFC4B,
- 40632 - 11905: 0xF4EF,
- 40633 - 11905: 0xFC4C,
- 40634 - 11905: 0xFC4D,
- 40635 - 11905: 0xC2E9,
- 40636 - 11905: 0xFC4E,
- 40637 - 11905: 0xF7E1,
- 40638 - 11905: 0xF7E2,
- 40639 - 11905: 0xFC4F,
- 40640 - 11905: 0xFC50,
- 40641 - 11905: 0xFC51,
- 40642 - 11905: 0xFC52,
- 40643 - 11905: 0xFC53,
- 40644 - 11905: 0xBBC6,
- 40645 - 11905: 0xFC54,
- 40646 - 11905: 0xFC55,
- 40647 - 11905: 0xFC56,
- 40648 - 11905: 0xFC57,
- 40649 - 11905: 0xD9E4,
- 40650 - 11905: 0xFC58,
- 40651 - 11905: 0xFC59,
- 40652 - 11905: 0xFC5A,
- 40653 - 11905: 0xCAF2,
- 40654 - 11905: 0xC0E8,
- 40655 - 11905: 0xF0A4,
- 40656 - 11905: 0xFC5B,
- 40657 - 11905: 0xBADA,
- 40658 - 11905: 0xFC5C,
- 40659 - 11905: 0xFC5D,
- 40660 - 11905: 0xC7AD,
- 40661 - 11905: 0xFC5E,
- 40662 - 11905: 0xFC5F,
- 40663 - 11905: 0xFC60,
- 40664 - 11905: 0xC4AC,
- 40665 - 11905: 0xFC61,
- 40666 - 11905: 0xFC62,
- 40667 - 11905: 0xF7EC,
- 40668 - 11905: 0xF7ED,
- 40669 - 11905: 0xF7EE,
- 40670 - 11905: 0xFC63,
- 40671 - 11905: 0xF7F0,
- 40672 - 11905: 0xF7EF,
- 40673 - 11905: 0xFC64,
- 40674 - 11905: 0xF7F1,
- 40675 - 11905: 0xFC65,
- 40676 - 11905: 0xFC66,
- 40677 - 11905: 0xF7F4,
- 40678 - 11905: 0xFC67,
- 40679 - 11905: 0xF7F3,
- 40680 - 11905: 0xFC68,
- 40681 - 11905: 0xF7F2,
- 40682 - 11905: 0xF7F5,
- 40683 - 11905: 0xFC69,
- 40684 - 11905: 0xFC6A,
- 40685 - 11905: 0xFC6B,
- 40686 - 11905: 0xFC6C,
- 40687 - 11905: 0xF7F6,
- 40688 - 11905: 0xFC6D,
- 40689 - 11905: 0xFC6E,
- 40690 - 11905: 0xFC6F,
- 40691 - 11905: 0xFC70,
- 40692 - 11905: 0xFC71,
- 40693 - 11905: 0xFC72,
- 40694 - 11905: 0xFC73,
- 40695 - 11905: 0xFC74,
- 40696 - 11905: 0xFC75,
- 40697 - 11905: 0xEDE9,
- 40698 - 11905: 0xFC76,
- 40699 - 11905: 0xEDEA,
- 40700 - 11905: 0xEDEB,
- 40701 - 11905: 0xFC77,
- 40702 - 11905: 0xF6BC,
- 40703 - 11905: 0xFC78,
- 40704 - 11905: 0xFC79,
- 40705 - 11905: 0xFC7A,
- 40706 - 11905: 0xFC7B,
- 40707 - 11905: 0xFC7C,
- 40708 - 11905: 0xFC7D,
- 40709 - 11905: 0xFC7E,
- 40710 - 11905: 0xFC80,
- 40711 - 11905: 0xFC81,
- 40712 - 11905: 0xFC82,
- 40713 - 11905: 0xFC83,
- 40714 - 11905: 0xFC84,
- 40715 - 11905: 0xF6BD,
- 40716 - 11905: 0xFC85,
- 40717 - 11905: 0xF6BE,
- 40718 - 11905: 0xB6A6,
- 40719 - 11905: 0xFC86,
- 40720 - 11905: 0xD8BE,
- 40721 - 11905: 0xFC87,
- 40722 - 11905: 0xFC88,
- 40723 - 11905: 0xB9C4,
- 40724 - 11905: 0xFC89,
- 40725 - 11905: 0xFC8A,
- 40726 - 11905: 0xFC8B,
- 40727 - 11905: 0xD8BB,
- 40728 - 11905: 0xFC8C,
- 40729 - 11905: 0xDCB1,
- 40730 - 11905: 0xFC8D,
- 40731 - 11905: 0xFC8E,
- 40732 - 11905: 0xFC8F,
- 40733 - 11905: 0xFC90,
- 40734 - 11905: 0xFC91,
- 40735 - 11905: 0xFC92,
- 40736 - 11905: 0xCAF3,
- 40737 - 11905: 0xFC93,
- 40738 - 11905: 0xF7F7,
- 40739 - 11905: 0xFC94,
- 40740 - 11905: 0xFC95,
- 40741 - 11905: 0xFC96,
- 40742 - 11905: 0xFC97,
- 40743 - 11905: 0xFC98,
- 40744 - 11905: 0xFC99,
- 40745 - 11905: 0xFC9A,
- 40746 - 11905: 0xFC9B,
- 40747 - 11905: 0xFC9C,
- 40748 - 11905: 0xF7F8,
- 40749 - 11905: 0xFC9D,
- 40750 - 11905: 0xFC9E,
- 40751 - 11905: 0xF7F9,
- 40752 - 11905: 0xFC9F,
- 40753 - 11905: 0xFCA0,
- 40754 - 11905: 0xFD40,
- 40755 - 11905: 0xFD41,
- 40756 - 11905: 0xFD42,
- 40757 - 11905: 0xFD43,
- 40758 - 11905: 0xFD44,
- 40759 - 11905: 0xF7FB,
- 40760 - 11905: 0xFD45,
- 40761 - 11905: 0xF7FA,
- 40762 - 11905: 0xFD46,
- 40763 - 11905: 0xB1C7,
- 40764 - 11905: 0xFD47,
- 40765 - 11905: 0xF7FC,
- 40766 - 11905: 0xF7FD,
- 40767 - 11905: 0xFD48,
- 40768 - 11905: 0xFD49,
- 40769 - 11905: 0xFD4A,
- 40770 - 11905: 0xFD4B,
- 40771 - 11905: 0xFD4C,
- 40772 - 11905: 0xF7FE,
- 40773 - 11905: 0xFD4D,
- 40774 - 11905: 0xFD4E,
- 40775 - 11905: 0xFD4F,
- 40776 - 11905: 0xFD50,
- 40777 - 11905: 0xFD51,
- 40778 - 11905: 0xFD52,
- 40779 - 11905: 0xFD53,
- 40780 - 11905: 0xFD54,
- 40781 - 11905: 0xFD55,
- 40782 - 11905: 0xFD56,
- 40783 - 11905: 0xFD57,
- 40784 - 11905: 0xC6EB,
- 40785 - 11905: 0xECB4,
- 40786 - 11905: 0xFD58,
- 40787 - 11905: 0xFD59,
- 40788 - 11905: 0xFD5A,
- 40789 - 11905: 0xFD5B,
- 40790 - 11905: 0xFD5C,
- 40791 - 11905: 0xFD5D,
- 40792 - 11905: 0xFD5E,
- 40793 - 11905: 0xFD5F,
- 40794 - 11905: 0xFD60,
- 40795 - 11905: 0xFD61,
- 40796 - 11905: 0xFD62,
- 40797 - 11905: 0xFD63,
- 40798 - 11905: 0xFD64,
- 40799 - 11905: 0xFD65,
- 40800 - 11905: 0xFD66,
- 40801 - 11905: 0xFD67,
- 40802 - 11905: 0xFD68,
- 40803 - 11905: 0xFD69,
- 40804 - 11905: 0xFD6A,
- 40805 - 11905: 0xFD6B,
- 40806 - 11905: 0xFD6C,
- 40807 - 11905: 0xFD6D,
- 40808 - 11905: 0xFD6E,
- 40809 - 11905: 0xFD6F,
- 40810 - 11905: 0xFD70,
- 40811 - 11905: 0xFD71,
- 40812 - 11905: 0xFD72,
- 40813 - 11905: 0xFD73,
- 40814 - 11905: 0xFD74,
- 40815 - 11905: 0xFD75,
- 40816 - 11905: 0xFD76,
- 40817 - 11905: 0xFD77,
- 40818 - 11905: 0xFD78,
- 40819 - 11905: 0xFD79,
- 40820 - 11905: 0xFD7A,
- 40821 - 11905: 0xFD7B,
- 40822 - 11905: 0xFD7C,
- 40823 - 11905: 0xFD7D,
- 40824 - 11905: 0xFD7E,
- 40825 - 11905: 0xFD80,
- 40826 - 11905: 0xFD81,
- 40827 - 11905: 0xFD82,
- 40828 - 11905: 0xFD83,
- 40829 - 11905: 0xFD84,
- 40830 - 11905: 0xFD85,
- 40831 - 11905: 0xB3DD,
- 40832 - 11905: 0xF6B3,
- 40833 - 11905: 0xFD86,
- 40834 - 11905: 0xFD87,
- 40835 - 11905: 0xF6B4,
- 40836 - 11905: 0xC1E4,
- 40837 - 11905: 0xF6B5,
- 40838 - 11905: 0xF6B6,
- 40839 - 11905: 0xF6B7,
- 40840 - 11905: 0xF6B8,
- 40841 - 11905: 0xF6B9,
- 40842 - 11905: 0xF6BA,
- 40843 - 11905: 0xC8A3,
- 40844 - 11905: 0xF6BB,
- 40845 - 11905: 0xFD88,
- 40846 - 11905: 0xFD89,
- 40847 - 11905: 0xFD8A,
- 40848 - 11905: 0xFD8B,
- 40849 - 11905: 0xFD8C,
- 40850 - 11905: 0xFD8D,
- 40851 - 11905: 0xFD8E,
- 40852 - 11905: 0xFD8F,
- 40853 - 11905: 0xFD90,
- 40854 - 11905: 0xFD91,
- 40855 - 11905: 0xFD92,
- 40856 - 11905: 0xFD93,
- 40857 - 11905: 0xC1FA,
- 40858 - 11905: 0xB9A8,
- 40859 - 11905: 0xEDE8,
- 40860 - 11905: 0xFD94,
- 40861 - 11905: 0xFD95,
- 40862 - 11905: 0xFD96,
- 40863 - 11905: 0xB9EA,
- 40864 - 11905: 0xD9DF,
- 40865 - 11905: 0xFD97,
- 40866 - 11905: 0xFD98,
- 40867 - 11905: 0xFD99,
- 40868 - 11905: 0xFD9A,
- 40869 - 11905: 0xFD9B,
-}
-
-const encode1Low, encode1High = 8208, 9795
-
-var encode1 = [...]uint16{
- 8208 - 8208: 0xA95C,
- 8211 - 8208: 0xA843,
- 8212 - 8208: 0xA1AA,
- 8213 - 8208: 0xA844,
- 8214 - 8208: 0xA1AC,
- 8216 - 8208: 0xA1AE,
- 8217 - 8208: 0xA1AF,
- 8220 - 8208: 0xA1B0,
- 8221 - 8208: 0xA1B1,
- 8229 - 8208: 0xA845,
- 8230 - 8208: 0xA1AD,
- 8240 - 8208: 0xA1EB,
- 8242 - 8208: 0xA1E4,
- 8243 - 8208: 0xA1E5,
- 8245 - 8208: 0xA846,
- 8251 - 8208: 0xA1F9,
- 8364 - 8208: 0xA2E3,
- 8451 - 8208: 0xA1E6,
- 8453 - 8208: 0xA847,
- 8457 - 8208: 0xA848,
- 8470 - 8208: 0xA1ED,
- 8481 - 8208: 0xA959,
- 8544 - 8208: 0xA2F1,
- 8545 - 8208: 0xA2F2,
- 8546 - 8208: 0xA2F3,
- 8547 - 8208: 0xA2F4,
- 8548 - 8208: 0xA2F5,
- 8549 - 8208: 0xA2F6,
- 8550 - 8208: 0xA2F7,
- 8551 - 8208: 0xA2F8,
- 8552 - 8208: 0xA2F9,
- 8553 - 8208: 0xA2FA,
- 8554 - 8208: 0xA2FB,
- 8555 - 8208: 0xA2FC,
- 8560 - 8208: 0xA2A1,
- 8561 - 8208: 0xA2A2,
- 8562 - 8208: 0xA2A3,
- 8563 - 8208: 0xA2A4,
- 8564 - 8208: 0xA2A5,
- 8565 - 8208: 0xA2A6,
- 8566 - 8208: 0xA2A7,
- 8567 - 8208: 0xA2A8,
- 8568 - 8208: 0xA2A9,
- 8569 - 8208: 0xA2AA,
- 8592 - 8208: 0xA1FB,
- 8593 - 8208: 0xA1FC,
- 8594 - 8208: 0xA1FA,
- 8595 - 8208: 0xA1FD,
- 8598 - 8208: 0xA849,
- 8599 - 8208: 0xA84A,
- 8600 - 8208: 0xA84B,
- 8601 - 8208: 0xA84C,
- 8712 - 8208: 0xA1CA,
- 8719 - 8208: 0xA1C7,
- 8721 - 8208: 0xA1C6,
- 8725 - 8208: 0xA84D,
- 8730 - 8208: 0xA1CC,
- 8733 - 8208: 0xA1D8,
- 8734 - 8208: 0xA1DE,
- 8735 - 8208: 0xA84E,
- 8736 - 8208: 0xA1CF,
- 8739 - 8208: 0xA84F,
- 8741 - 8208: 0xA1CE,
- 8743 - 8208: 0xA1C4,
- 8744 - 8208: 0xA1C5,
- 8745 - 8208: 0xA1C9,
- 8746 - 8208: 0xA1C8,
- 8747 - 8208: 0xA1D2,
- 8750 - 8208: 0xA1D3,
- 8756 - 8208: 0xA1E0,
- 8757 - 8208: 0xA1DF,
- 8758 - 8208: 0xA1C3,
- 8759 - 8208: 0xA1CB,
- 8765 - 8208: 0xA1D7,
- 8776 - 8208: 0xA1D6,
- 8780 - 8208: 0xA1D5,
- 8786 - 8208: 0xA850,
- 8800 - 8208: 0xA1D9,
- 8801 - 8208: 0xA1D4,
- 8804 - 8208: 0xA1DC,
- 8805 - 8208: 0xA1DD,
- 8806 - 8208: 0xA851,
- 8807 - 8208: 0xA852,
- 8814 - 8208: 0xA1DA,
- 8815 - 8208: 0xA1DB,
- 8853 - 8208: 0xA892,
- 8857 - 8208: 0xA1D1,
- 8869 - 8208: 0xA1CD,
- 8895 - 8208: 0xA853,
- 8978 - 8208: 0xA1D0,
- 9312 - 8208: 0xA2D9,
- 9313 - 8208: 0xA2DA,
- 9314 - 8208: 0xA2DB,
- 9315 - 8208: 0xA2DC,
- 9316 - 8208: 0xA2DD,
- 9317 - 8208: 0xA2DE,
- 9318 - 8208: 0xA2DF,
- 9319 - 8208: 0xA2E0,
- 9320 - 8208: 0xA2E1,
- 9321 - 8208: 0xA2E2,
- 9332 - 8208: 0xA2C5,
- 9333 - 8208: 0xA2C6,
- 9334 - 8208: 0xA2C7,
- 9335 - 8208: 0xA2C8,
- 9336 - 8208: 0xA2C9,
- 9337 - 8208: 0xA2CA,
- 9338 - 8208: 0xA2CB,
- 9339 - 8208: 0xA2CC,
- 9340 - 8208: 0xA2CD,
- 9341 - 8208: 0xA2CE,
- 9342 - 8208: 0xA2CF,
- 9343 - 8208: 0xA2D0,
- 9344 - 8208: 0xA2D1,
- 9345 - 8208: 0xA2D2,
- 9346 - 8208: 0xA2D3,
- 9347 - 8208: 0xA2D4,
- 9348 - 8208: 0xA2D5,
- 9349 - 8208: 0xA2D6,
- 9350 - 8208: 0xA2D7,
- 9351 - 8208: 0xA2D8,
- 9352 - 8208: 0xA2B1,
- 9353 - 8208: 0xA2B2,
- 9354 - 8208: 0xA2B3,
- 9355 - 8208: 0xA2B4,
- 9356 - 8208: 0xA2B5,
- 9357 - 8208: 0xA2B6,
- 9358 - 8208: 0xA2B7,
- 9359 - 8208: 0xA2B8,
- 9360 - 8208: 0xA2B9,
- 9361 - 8208: 0xA2BA,
- 9362 - 8208: 0xA2BB,
- 9363 - 8208: 0xA2BC,
- 9364 - 8208: 0xA2BD,
- 9365 - 8208: 0xA2BE,
- 9366 - 8208: 0xA2BF,
- 9367 - 8208: 0xA2C0,
- 9368 - 8208: 0xA2C1,
- 9369 - 8208: 0xA2C2,
- 9370 - 8208: 0xA2C3,
- 9371 - 8208: 0xA2C4,
- 9472 - 8208: 0xA9A4,
- 9473 - 8208: 0xA9A5,
- 9474 - 8208: 0xA9A6,
- 9475 - 8208: 0xA9A7,
- 9476 - 8208: 0xA9A8,
- 9477 - 8208: 0xA9A9,
- 9478 - 8208: 0xA9AA,
- 9479 - 8208: 0xA9AB,
- 9480 - 8208: 0xA9AC,
- 9481 - 8208: 0xA9AD,
- 9482 - 8208: 0xA9AE,
- 9483 - 8208: 0xA9AF,
- 9484 - 8208: 0xA9B0,
- 9485 - 8208: 0xA9B1,
- 9486 - 8208: 0xA9B2,
- 9487 - 8208: 0xA9B3,
- 9488 - 8208: 0xA9B4,
- 9489 - 8208: 0xA9B5,
- 9490 - 8208: 0xA9B6,
- 9491 - 8208: 0xA9B7,
- 9492 - 8208: 0xA9B8,
- 9493 - 8208: 0xA9B9,
- 9494 - 8208: 0xA9BA,
- 9495 - 8208: 0xA9BB,
- 9496 - 8208: 0xA9BC,
- 9497 - 8208: 0xA9BD,
- 9498 - 8208: 0xA9BE,
- 9499 - 8208: 0xA9BF,
- 9500 - 8208: 0xA9C0,
- 9501 - 8208: 0xA9C1,
- 9502 - 8208: 0xA9C2,
- 9503 - 8208: 0xA9C3,
- 9504 - 8208: 0xA9C4,
- 9505 - 8208: 0xA9C5,
- 9506 - 8208: 0xA9C6,
- 9507 - 8208: 0xA9C7,
- 9508 - 8208: 0xA9C8,
- 9509 - 8208: 0xA9C9,
- 9510 - 8208: 0xA9CA,
- 9511 - 8208: 0xA9CB,
- 9512 - 8208: 0xA9CC,
- 9513 - 8208: 0xA9CD,
- 9514 - 8208: 0xA9CE,
- 9515 - 8208: 0xA9CF,
- 9516 - 8208: 0xA9D0,
- 9517 - 8208: 0xA9D1,
- 9518 - 8208: 0xA9D2,
- 9519 - 8208: 0xA9D3,
- 9520 - 8208: 0xA9D4,
- 9521 - 8208: 0xA9D5,
- 9522 - 8208: 0xA9D6,
- 9523 - 8208: 0xA9D7,
- 9524 - 8208: 0xA9D8,
- 9525 - 8208: 0xA9D9,
- 9526 - 8208: 0xA9DA,
- 9527 - 8208: 0xA9DB,
- 9528 - 8208: 0xA9DC,
- 9529 - 8208: 0xA9DD,
- 9530 - 8208: 0xA9DE,
- 9531 - 8208: 0xA9DF,
- 9532 - 8208: 0xA9E0,
- 9533 - 8208: 0xA9E1,
- 9534 - 8208: 0xA9E2,
- 9535 - 8208: 0xA9E3,
- 9536 - 8208: 0xA9E4,
- 9537 - 8208: 0xA9E5,
- 9538 - 8208: 0xA9E6,
- 9539 - 8208: 0xA9E7,
- 9540 - 8208: 0xA9E8,
- 9541 - 8208: 0xA9E9,
- 9542 - 8208: 0xA9EA,
- 9543 - 8208: 0xA9EB,
- 9544 - 8208: 0xA9EC,
- 9545 - 8208: 0xA9ED,
- 9546 - 8208: 0xA9EE,
- 9547 - 8208: 0xA9EF,
- 9552 - 8208: 0xA854,
- 9553 - 8208: 0xA855,
- 9554 - 8208: 0xA856,
- 9555 - 8208: 0xA857,
- 9556 - 8208: 0xA858,
- 9557 - 8208: 0xA859,
- 9558 - 8208: 0xA85A,
- 9559 - 8208: 0xA85B,
- 9560 - 8208: 0xA85C,
- 9561 - 8208: 0xA85D,
- 9562 - 8208: 0xA85E,
- 9563 - 8208: 0xA85F,
- 9564 - 8208: 0xA860,
- 9565 - 8208: 0xA861,
- 9566 - 8208: 0xA862,
- 9567 - 8208: 0xA863,
- 9568 - 8208: 0xA864,
- 9569 - 8208: 0xA865,
- 9570 - 8208: 0xA866,
- 9571 - 8208: 0xA867,
- 9572 - 8208: 0xA868,
- 9573 - 8208: 0xA869,
- 9574 - 8208: 0xA86A,
- 9575 - 8208: 0xA86B,
- 9576 - 8208: 0xA86C,
- 9577 - 8208: 0xA86D,
- 9578 - 8208: 0xA86E,
- 9579 - 8208: 0xA86F,
- 9580 - 8208: 0xA870,
- 9581 - 8208: 0xA871,
- 9582 - 8208: 0xA872,
- 9583 - 8208: 0xA873,
- 9584 - 8208: 0xA874,
- 9585 - 8208: 0xA875,
- 9586 - 8208: 0xA876,
- 9587 - 8208: 0xA877,
- 9601 - 8208: 0xA878,
- 9602 - 8208: 0xA879,
- 9603 - 8208: 0xA87A,
- 9604 - 8208: 0xA87B,
- 9605 - 8208: 0xA87C,
- 9606 - 8208: 0xA87D,
- 9607 - 8208: 0xA87E,
- 9608 - 8208: 0xA880,
- 9609 - 8208: 0xA881,
- 9610 - 8208: 0xA882,
- 9611 - 8208: 0xA883,
- 9612 - 8208: 0xA884,
- 9613 - 8208: 0xA885,
- 9614 - 8208: 0xA886,
- 9615 - 8208: 0xA887,
- 9619 - 8208: 0xA888,
- 9620 - 8208: 0xA889,
- 9621 - 8208: 0xA88A,
- 9632 - 8208: 0xA1F6,
- 9633 - 8208: 0xA1F5,
- 9650 - 8208: 0xA1F8,
- 9651 - 8208: 0xA1F7,
- 9660 - 8208: 0xA88B,
- 9661 - 8208: 0xA88C,
- 9670 - 8208: 0xA1F4,
- 9671 - 8208: 0xA1F3,
- 9675 - 8208: 0xA1F0,
- 9678 - 8208: 0xA1F2,
- 9679 - 8208: 0xA1F1,
- 9698 - 8208: 0xA88D,
- 9699 - 8208: 0xA88E,
- 9700 - 8208: 0xA88F,
- 9701 - 8208: 0xA890,
- 9733 - 8208: 0xA1EF,
- 9734 - 8208: 0xA1EE,
- 9737 - 8208: 0xA891,
- 9792 - 8208: 0xA1E2,
- 9794 - 8208: 0xA1E1,
-}
-
-const encode2Low, encode2High = 164, 1106
-
-var encode2 = [...]uint16{
- 164 - 164: 0xA1E8,
- 167 - 164: 0xA1EC,
- 168 - 164: 0xA1A7,
- 176 - 164: 0xA1E3,
- 177 - 164: 0xA1C0,
- 183 - 164: 0xA1A4,
- 215 - 164: 0xA1C1,
- 224 - 164: 0xA8A4,
- 225 - 164: 0xA8A2,
- 232 - 164: 0xA8A8,
- 233 - 164: 0xA8A6,
- 234 - 164: 0xA8BA,
- 236 - 164: 0xA8AC,
- 237 - 164: 0xA8AA,
- 242 - 164: 0xA8B0,
- 243 - 164: 0xA8AE,
- 247 - 164: 0xA1C2,
- 249 - 164: 0xA8B4,
- 250 - 164: 0xA8B2,
- 252 - 164: 0xA8B9,
- 257 - 164: 0xA8A1,
- 275 - 164: 0xA8A5,
- 283 - 164: 0xA8A7,
- 299 - 164: 0xA8A9,
- 324 - 164: 0xA8BD,
- 328 - 164: 0xA8BE,
- 333 - 164: 0xA8AD,
- 363 - 164: 0xA8B1,
- 462 - 164: 0xA8A3,
- 464 - 164: 0xA8AB,
- 466 - 164: 0xA8AF,
- 468 - 164: 0xA8B3,
- 470 - 164: 0xA8B5,
- 472 - 164: 0xA8B6,
- 474 - 164: 0xA8B7,
- 476 - 164: 0xA8B8,
- 505 - 164: 0xA8BF,
- 593 - 164: 0xA8BB,
- 609 - 164: 0xA8C0,
- 711 - 164: 0xA1A6,
- 713 - 164: 0xA1A5,
- 714 - 164: 0xA840,
- 715 - 164: 0xA841,
- 729 - 164: 0xA842,
- 913 - 164: 0xA6A1,
- 914 - 164: 0xA6A2,
- 915 - 164: 0xA6A3,
- 916 - 164: 0xA6A4,
- 917 - 164: 0xA6A5,
- 918 - 164: 0xA6A6,
- 919 - 164: 0xA6A7,
- 920 - 164: 0xA6A8,
- 921 - 164: 0xA6A9,
- 922 - 164: 0xA6AA,
- 923 - 164: 0xA6AB,
- 924 - 164: 0xA6AC,
- 925 - 164: 0xA6AD,
- 926 - 164: 0xA6AE,
- 927 - 164: 0xA6AF,
- 928 - 164: 0xA6B0,
- 929 - 164: 0xA6B1,
- 931 - 164: 0xA6B2,
- 932 - 164: 0xA6B3,
- 933 - 164: 0xA6B4,
- 934 - 164: 0xA6B5,
- 935 - 164: 0xA6B6,
- 936 - 164: 0xA6B7,
- 937 - 164: 0xA6B8,
- 945 - 164: 0xA6C1,
- 946 - 164: 0xA6C2,
- 947 - 164: 0xA6C3,
- 948 - 164: 0xA6C4,
- 949 - 164: 0xA6C5,
- 950 - 164: 0xA6C6,
- 951 - 164: 0xA6C7,
- 952 - 164: 0xA6C8,
- 953 - 164: 0xA6C9,
- 954 - 164: 0xA6CA,
- 955 - 164: 0xA6CB,
- 956 - 164: 0xA6CC,
- 957 - 164: 0xA6CD,
- 958 - 164: 0xA6CE,
- 959 - 164: 0xA6CF,
- 960 - 164: 0xA6D0,
- 961 - 164: 0xA6D1,
- 963 - 164: 0xA6D2,
- 964 - 164: 0xA6D3,
- 965 - 164: 0xA6D4,
- 966 - 164: 0xA6D5,
- 967 - 164: 0xA6D6,
- 968 - 164: 0xA6D7,
- 969 - 164: 0xA6D8,
- 1025 - 164: 0xA7A7,
- 1040 - 164: 0xA7A1,
- 1041 - 164: 0xA7A2,
- 1042 - 164: 0xA7A3,
- 1043 - 164: 0xA7A4,
- 1044 - 164: 0xA7A5,
- 1045 - 164: 0xA7A6,
- 1046 - 164: 0xA7A8,
- 1047 - 164: 0xA7A9,
- 1048 - 164: 0xA7AA,
- 1049 - 164: 0xA7AB,
- 1050 - 164: 0xA7AC,
- 1051 - 164: 0xA7AD,
- 1052 - 164: 0xA7AE,
- 1053 - 164: 0xA7AF,
- 1054 - 164: 0xA7B0,
- 1055 - 164: 0xA7B1,
- 1056 - 164: 0xA7B2,
- 1057 - 164: 0xA7B3,
- 1058 - 164: 0xA7B4,
- 1059 - 164: 0xA7B5,
- 1060 - 164: 0xA7B6,
- 1061 - 164: 0xA7B7,
- 1062 - 164: 0xA7B8,
- 1063 - 164: 0xA7B9,
- 1064 - 164: 0xA7BA,
- 1065 - 164: 0xA7BB,
- 1066 - 164: 0xA7BC,
- 1067 - 164: 0xA7BD,
- 1068 - 164: 0xA7BE,
- 1069 - 164: 0xA7BF,
- 1070 - 164: 0xA7C0,
- 1071 - 164: 0xA7C1,
- 1072 - 164: 0xA7D1,
- 1073 - 164: 0xA7D2,
- 1074 - 164: 0xA7D3,
- 1075 - 164: 0xA7D4,
- 1076 - 164: 0xA7D5,
- 1077 - 164: 0xA7D6,
- 1078 - 164: 0xA7D8,
- 1079 - 164: 0xA7D9,
- 1080 - 164: 0xA7DA,
- 1081 - 164: 0xA7DB,
- 1082 - 164: 0xA7DC,
- 1083 - 164: 0xA7DD,
- 1084 - 164: 0xA7DE,
- 1085 - 164: 0xA7DF,
- 1086 - 164: 0xA7E0,
- 1087 - 164: 0xA7E1,
- 1088 - 164: 0xA7E2,
- 1089 - 164: 0xA7E3,
- 1090 - 164: 0xA7E4,
- 1091 - 164: 0xA7E5,
- 1092 - 164: 0xA7E6,
- 1093 - 164: 0xA7E7,
- 1094 - 164: 0xA7E8,
- 1095 - 164: 0xA7E9,
- 1096 - 164: 0xA7EA,
- 1097 - 164: 0xA7EB,
- 1098 - 164: 0xA7EC,
- 1099 - 164: 0xA7ED,
- 1100 - 164: 0xA7EE,
- 1101 - 164: 0xA7EF,
- 1102 - 164: 0xA7F0,
- 1103 - 164: 0xA7F1,
- 1105 - 164: 0xA7D7,
-}
-
-const encode3Low, encode3High = 65072, 65510
-
-var encode3 = [...]uint16{
- 65072 - 65072: 0xA955,
- 65073 - 65072: 0xA6F2,
- 65075 - 65072: 0xA6F4,
- 65076 - 65072: 0xA6F5,
- 65077 - 65072: 0xA6E0,
- 65078 - 65072: 0xA6E1,
- 65079 - 65072: 0xA6F0,
- 65080 - 65072: 0xA6F1,
- 65081 - 65072: 0xA6E2,
- 65082 - 65072: 0xA6E3,
- 65083 - 65072: 0xA6EE,
- 65084 - 65072: 0xA6EF,
- 65085 - 65072: 0xA6E6,
- 65086 - 65072: 0xA6E7,
- 65087 - 65072: 0xA6E4,
- 65088 - 65072: 0xA6E5,
- 65089 - 65072: 0xA6E8,
- 65090 - 65072: 0xA6E9,
- 65091 - 65072: 0xA6EA,
- 65092 - 65072: 0xA6EB,
- 65097 - 65072: 0xA968,
- 65098 - 65072: 0xA969,
- 65099 - 65072: 0xA96A,
- 65100 - 65072: 0xA96B,
- 65101 - 65072: 0xA96C,
- 65102 - 65072: 0xA96D,
- 65103 - 65072: 0xA96E,
- 65104 - 65072: 0xA96F,
- 65105 - 65072: 0xA970,
- 65106 - 65072: 0xA971,
- 65108 - 65072: 0xA972,
- 65109 - 65072: 0xA973,
- 65110 - 65072: 0xA974,
- 65111 - 65072: 0xA975,
- 65113 - 65072: 0xA976,
- 65114 - 65072: 0xA977,
- 65115 - 65072: 0xA978,
- 65116 - 65072: 0xA979,
- 65117 - 65072: 0xA97A,
- 65118 - 65072: 0xA97B,
- 65119 - 65072: 0xA97C,
- 65120 - 65072: 0xA97D,
- 65121 - 65072: 0xA97E,
- 65122 - 65072: 0xA980,
- 65123 - 65072: 0xA981,
- 65124 - 65072: 0xA982,
- 65125 - 65072: 0xA983,
- 65126 - 65072: 0xA984,
- 65128 - 65072: 0xA985,
- 65129 - 65072: 0xA986,
- 65130 - 65072: 0xA987,
- 65131 - 65072: 0xA988,
- 65281 - 65072: 0xA3A1,
- 65282 - 65072: 0xA3A2,
- 65283 - 65072: 0xA3A3,
- 65284 - 65072: 0xA1E7,
- 65285 - 65072: 0xA3A5,
- 65286 - 65072: 0xA3A6,
- 65287 - 65072: 0xA3A7,
- 65288 - 65072: 0xA3A8,
- 65289 - 65072: 0xA3A9,
- 65290 - 65072: 0xA3AA,
- 65291 - 65072: 0xA3AB,
- 65292 - 65072: 0xA3AC,
- 65293 - 65072: 0xA3AD,
- 65294 - 65072: 0xA3AE,
- 65295 - 65072: 0xA3AF,
- 65296 - 65072: 0xA3B0,
- 65297 - 65072: 0xA3B1,
- 65298 - 65072: 0xA3B2,
- 65299 - 65072: 0xA3B3,
- 65300 - 65072: 0xA3B4,
- 65301 - 65072: 0xA3B5,
- 65302 - 65072: 0xA3B6,
- 65303 - 65072: 0xA3B7,
- 65304 - 65072: 0xA3B8,
- 65305 - 65072: 0xA3B9,
- 65306 - 65072: 0xA3BA,
- 65307 - 65072: 0xA3BB,
- 65308 - 65072: 0xA3BC,
- 65309 - 65072: 0xA3BD,
- 65310 - 65072: 0xA3BE,
- 65311 - 65072: 0xA3BF,
- 65312 - 65072: 0xA3C0,
- 65313 - 65072: 0xA3C1,
- 65314 - 65072: 0xA3C2,
- 65315 - 65072: 0xA3C3,
- 65316 - 65072: 0xA3C4,
- 65317 - 65072: 0xA3C5,
- 65318 - 65072: 0xA3C6,
- 65319 - 65072: 0xA3C7,
- 65320 - 65072: 0xA3C8,
- 65321 - 65072: 0xA3C9,
- 65322 - 65072: 0xA3CA,
- 65323 - 65072: 0xA3CB,
- 65324 - 65072: 0xA3CC,
- 65325 - 65072: 0xA3CD,
- 65326 - 65072: 0xA3CE,
- 65327 - 65072: 0xA3CF,
- 65328 - 65072: 0xA3D0,
- 65329 - 65072: 0xA3D1,
- 65330 - 65072: 0xA3D2,
- 65331 - 65072: 0xA3D3,
- 65332 - 65072: 0xA3D4,
- 65333 - 65072: 0xA3D5,
- 65334 - 65072: 0xA3D6,
- 65335 - 65072: 0xA3D7,
- 65336 - 65072: 0xA3D8,
- 65337 - 65072: 0xA3D9,
- 65338 - 65072: 0xA3DA,
- 65339 - 65072: 0xA3DB,
- 65340 - 65072: 0xA3DC,
- 65341 - 65072: 0xA3DD,
- 65342 - 65072: 0xA3DE,
- 65343 - 65072: 0xA3DF,
- 65344 - 65072: 0xA3E0,
- 65345 - 65072: 0xA3E1,
- 65346 - 65072: 0xA3E2,
- 65347 - 65072: 0xA3E3,
- 65348 - 65072: 0xA3E4,
- 65349 - 65072: 0xA3E5,
- 65350 - 65072: 0xA3E6,
- 65351 - 65072: 0xA3E7,
- 65352 - 65072: 0xA3E8,
- 65353 - 65072: 0xA3E9,
- 65354 - 65072: 0xA3EA,
- 65355 - 65072: 0xA3EB,
- 65356 - 65072: 0xA3EC,
- 65357 - 65072: 0xA3ED,
- 65358 - 65072: 0xA3EE,
- 65359 - 65072: 0xA3EF,
- 65360 - 65072: 0xA3F0,
- 65361 - 65072: 0xA3F1,
- 65362 - 65072: 0xA3F2,
- 65363 - 65072: 0xA3F3,
- 65364 - 65072: 0xA3F4,
- 65365 - 65072: 0xA3F5,
- 65366 - 65072: 0xA3F6,
- 65367 - 65072: 0xA3F7,
- 65368 - 65072: 0xA3F8,
- 65369 - 65072: 0xA3F9,
- 65370 - 65072: 0xA3FA,
- 65371 - 65072: 0xA3FB,
- 65372 - 65072: 0xA3FC,
- 65373 - 65072: 0xA3FD,
- 65374 - 65072: 0xA1AB,
- 65504 - 65072: 0xA1E9,
- 65505 - 65072: 0xA1EA,
- 65506 - 65072: 0xA956,
- 65507 - 65072: 0xA3FE,
- 65508 - 65072: 0xA957,
- 65509 - 65072: 0xA3A4,
-}
-
-const encode4Low, encode4High = 63788, 64042
-
-var encode4 = [...]uint16{
- 63788 - 63788: 0xFD9C,
- 63865 - 63788: 0xFD9D,
- 63893 - 63788: 0xFD9E,
- 63975 - 63788: 0xFD9F,
- 63985 - 63788: 0xFDA0,
- 64012 - 63788: 0xFE40,
- 64013 - 63788: 0xFE41,
- 64014 - 63788: 0xFE42,
- 64015 - 63788: 0xFE43,
- 64017 - 63788: 0xFE44,
- 64019 - 63788: 0xFE45,
- 64020 - 63788: 0xFE46,
- 64024 - 63788: 0xFE47,
- 64031 - 63788: 0xFE48,
- 64032 - 63788: 0xFE49,
- 64033 - 63788: 0xFE4A,
- 64035 - 63788: 0xFE4B,
- 64036 - 63788: 0xFE4C,
- 64039 - 63788: 0xFE4D,
- 64040 - 63788: 0xFE4E,
- 64041 - 63788: 0xFE4F,
-}
diff --git a/vendor/golang.org/x/text/transform/transform.go b/vendor/golang.org/x/text/transform/transform.go
deleted file mode 100644
index 164ecca..0000000
--- a/vendor/golang.org/x/text/transform/transform.go
+++ /dev/null
@@ -1,616 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Package transform provides reader and writer wrappers that transform the
-// bytes passing through as well as various transformations. Example
-// transformations provided by other packages include normalization and
-// conversion between character sets.
-package transform // import "golang.org/x/text/transform"
-
-import (
- "bytes"
- "errors"
- "io"
- "unicode/utf8"
-)
-
-var (
- // ErrShortDst means that the destination buffer was too short to
- // receive all of the transformed bytes.
- ErrShortDst = errors.New("transform: short destination buffer")
-
- // ErrShortSrc means that the source buffer has insufficient data to
- // complete the transformation.
- ErrShortSrc = errors.New("transform: short source buffer")
-
- // errInconsistentByteCount means that Transform returned success (nil
- // error) but also returned nSrc inconsistent with the src argument.
- errInconsistentByteCount = errors.New("transform: inconsistent byte count returned")
-
- // errShortInternal means that an internal buffer is not large enough
- // to make progress and the Transform operation must be aborted.
- errShortInternal = errors.New("transform: short internal buffer")
-)
-
-// Transformer transforms bytes.
-type Transformer interface {
- // Transform writes to dst the transformed bytes read from src, and
- // returns the number of dst bytes written and src bytes read. The
- // atEOF argument tells whether src represents the last bytes of the
- // input.
- //
- // Callers should always process the nDst bytes produced and account
- // for the nSrc bytes consumed before considering the error err.
- //
- // A nil error means that all of the transformed bytes (whether freshly
- // transformed from src or left over from previous Transform calls)
- // were written to dst. A nil error can be returned regardless of
- // whether atEOF is true. If err is nil then nSrc must equal len(src);
- // the converse is not necessarily true.
- //
- // ErrShortDst means that dst was too short to receive all of the
- // transformed bytes. ErrShortSrc means that src had insufficient data
- // to complete the transformation. If both conditions apply, then
- // either error may be returned. Other than the error conditions listed
- // here, implementations are free to report other errors that arise.
- Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error)
-
- // Reset resets the state and allows a Transformer to be reused.
- Reset()
-}
-
-// NopResetter can be embedded by implementations of Transformer to add a nop
-// Reset method.
-type NopResetter struct{}
-
-// Reset implements the Reset method of the Transformer interface.
-func (NopResetter) Reset() {}
-
-// Reader wraps another io.Reader by transforming the bytes read.
-type Reader struct {
- r io.Reader
- t Transformer
- err error
-
- // dst[dst0:dst1] contains bytes that have been transformed by t but
- // not yet copied out via Read.
- dst []byte
- dst0, dst1 int
-
- // src[src0:src1] contains bytes that have been read from r but not
- // yet transformed through t.
- src []byte
- src0, src1 int
-
- // transformComplete is whether the transformation is complete,
- // regardless of whether or not it was successful.
- transformComplete bool
-}
-
-const defaultBufSize = 4096
-
-// NewReader returns a new Reader that wraps r by transforming the bytes read
-// via t. It calls Reset on t.
-func NewReader(r io.Reader, t Transformer) *Reader {
- t.Reset()
- return &Reader{
- r: r,
- t: t,
- dst: make([]byte, defaultBufSize),
- src: make([]byte, defaultBufSize),
- }
-}
-
-// Read implements the io.Reader interface.
-func (r *Reader) Read(p []byte) (int, error) {
- n, err := 0, error(nil)
- for {
- // Copy out any transformed bytes and return the final error if we are done.
- if r.dst0 != r.dst1 {
- n = copy(p, r.dst[r.dst0:r.dst1])
- r.dst0 += n
- if r.dst0 == r.dst1 && r.transformComplete {
- return n, r.err
- }
- return n, nil
- } else if r.transformComplete {
- return 0, r.err
- }
-
- // Try to transform some source bytes, or to flush the transformer if we
- // are out of source bytes. We do this even if r.r.Read returned an error.
- // As the io.Reader documentation says, "process the n > 0 bytes returned
- // before considering the error".
- if r.src0 != r.src1 || r.err != nil {
- r.dst0 = 0
- r.dst1, n, err = r.t.Transform(r.dst, r.src[r.src0:r.src1], r.err == io.EOF)
- r.src0 += n
-
- switch {
- case err == nil:
- if r.src0 != r.src1 {
- r.err = errInconsistentByteCount
- }
- // The Transform call was successful; we are complete if we
- // cannot read more bytes into src.
- r.transformComplete = r.err != nil
- continue
- case err == ErrShortDst && (r.dst1 != 0 || n != 0):
- // Make room in dst by copying out, and try again.
- continue
- case err == ErrShortSrc && r.src1-r.src0 != len(r.src) && r.err == nil:
- // Read more bytes into src via the code below, and try again.
- default:
- r.transformComplete = true
- // The reader error (r.err) takes precedence over the
- // transformer error (err) unless r.err is nil or io.EOF.
- if r.err == nil || r.err == io.EOF {
- r.err = err
- }
- continue
- }
- }
-
- // Move any untransformed source bytes to the start of the buffer
- // and read more bytes.
- if r.src0 != 0 {
- r.src0, r.src1 = 0, copy(r.src, r.src[r.src0:r.src1])
- }
- n, r.err = r.r.Read(r.src[r.src1:])
- r.src1 += n
- }
-}
-
-// TODO: implement ReadByte (and ReadRune??).
-
-// Writer wraps another io.Writer by transforming the bytes read.
-// The user needs to call Close to flush unwritten bytes that may
-// be buffered.
-type Writer struct {
- w io.Writer
- t Transformer
- dst []byte
-
- // src[:n] contains bytes that have not yet passed through t.
- src []byte
- n int
-}
-
-// NewWriter returns a new Writer that wraps w by transforming the bytes written
-// via t. It calls Reset on t.
-func NewWriter(w io.Writer, t Transformer) *Writer {
- t.Reset()
- return &Writer{
- w: w,
- t: t,
- dst: make([]byte, defaultBufSize),
- src: make([]byte, defaultBufSize),
- }
-}
-
-// Write implements the io.Writer interface. If there are not enough
-// bytes available to complete a Transform, the bytes will be buffered
-// for the next write. Call Close to convert the remaining bytes.
-func (w *Writer) Write(data []byte) (n int, err error) {
- src := data
- if w.n > 0 {
- // Append bytes from data to the last remainder.
- // TODO: limit the amount copied on first try.
- n = copy(w.src[w.n:], data)
- w.n += n
- src = w.src[:w.n]
- }
- for {
- nDst, nSrc, err := w.t.Transform(w.dst, src, false)
- if _, werr := w.w.Write(w.dst[:nDst]); werr != nil {
- return n, werr
- }
- src = src[nSrc:]
- if w.n > 0 && len(src) <= n {
- // Enough bytes from w.src have been consumed. We make src point
- // to data instead to reduce the copying.
- w.n = 0
- n -= len(src)
- src = data[n:]
- if n < len(data) && (err == nil || err == ErrShortSrc) {
- continue
- }
- } else {
- n += nSrc
- }
- switch {
- case err == ErrShortDst && (nDst > 0 || nSrc > 0):
- case err == ErrShortSrc && len(src) < len(w.src):
- m := copy(w.src, src)
- // If w.n > 0, bytes from data were already copied to w.src and n
- // was already set to the number of bytes consumed.
- if w.n == 0 {
- n += m
- }
- w.n = m
- return n, nil
- case err == nil && w.n > 0:
- return n, errInconsistentByteCount
- default:
- return n, err
- }
- }
-}
-
-// Close implements the io.Closer interface.
-func (w *Writer) Close() error {
- for src := w.src[:w.n]; len(src) > 0; {
- nDst, nSrc, err := w.t.Transform(w.dst, src, true)
- if nDst == 0 {
- return err
- }
- if _, werr := w.w.Write(w.dst[:nDst]); werr != nil {
- return werr
- }
- if err != ErrShortDst {
- return err
- }
- src = src[nSrc:]
- }
- return nil
-}
-
-type nop struct{ NopResetter }
-
-func (nop) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) {
- n := copy(dst, src)
- if n < len(src) {
- err = ErrShortDst
- }
- return n, n, err
-}
-
-type discard struct{ NopResetter }
-
-func (discard) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) {
- return 0, len(src), nil
-}
-
-var (
- // Discard is a Transformer for which all Transform calls succeed
- // by consuming all bytes and writing nothing.
- Discard Transformer = discard{}
-
- // Nop is a Transformer that copies src to dst.
- Nop Transformer = nop{}
-)
-
-// chain is a sequence of links. A chain with N Transformers has N+1 links and
-// N+1 buffers. Of those N+1 buffers, the first and last are the src and dst
-// buffers given to chain.Transform and the middle N-1 buffers are intermediate
-// buffers owned by the chain. The i'th link transforms bytes from the i'th
-// buffer chain.link[i].b at read offset chain.link[i].p to the i+1'th buffer
-// chain.link[i+1].b at write offset chain.link[i+1].n, for i in [0, N).
-type chain struct {
- link []link
- err error
- // errStart is the index at which the error occurred plus 1. Processing
- // errStart at this level at the next call to Transform. As long as
- // errStart > 0, chain will not consume any more source bytes.
- errStart int
-}
-
-func (c *chain) fatalError(errIndex int, err error) {
- if i := errIndex + 1; i > c.errStart {
- c.errStart = i
- c.err = err
- }
-}
-
-type link struct {
- t Transformer
- // b[p:n] holds the bytes to be transformed by t.
- b []byte
- p int
- n int
-}
-
-func (l *link) src() []byte {
- return l.b[l.p:l.n]
-}
-
-func (l *link) dst() []byte {
- return l.b[l.n:]
-}
-
-// Chain returns a Transformer that applies t in sequence.
-func Chain(t ...Transformer) Transformer {
- if len(t) == 0 {
- return nop{}
- }
- c := &chain{link: make([]link, len(t)+1)}
- for i, tt := range t {
- c.link[i].t = tt
- }
- // Allocate intermediate buffers.
- b := make([][defaultBufSize]byte, len(t)-1)
- for i := range b {
- c.link[i+1].b = b[i][:]
- }
- return c
-}
-
-// Reset resets the state of Chain. It calls Reset on all the Transformers.
-func (c *chain) Reset() {
- for i, l := range c.link {
- if l.t != nil {
- l.t.Reset()
- }
- c.link[i].p, c.link[i].n = 0, 0
- }
-}
-
-// Transform applies the transformers of c in sequence.
-func (c *chain) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) {
- // Set up src and dst in the chain.
- srcL := &c.link[0]
- dstL := &c.link[len(c.link)-1]
- srcL.b, srcL.p, srcL.n = src, 0, len(src)
- dstL.b, dstL.n = dst, 0
- var lastFull, needProgress bool // for detecting progress
-
- // i is the index of the next Transformer to apply, for i in [low, high].
- // low is the lowest index for which c.link[low] may still produce bytes.
- // high is the highest index for which c.link[high] has a Transformer.
- // The error returned by Transform determines whether to increase or
- // decrease i. We try to completely fill a buffer before converting it.
- for low, i, high := c.errStart, c.errStart, len(c.link)-2; low <= i && i <= high; {
- in, out := &c.link[i], &c.link[i+1]
- nDst, nSrc, err0 := in.t.Transform(out.dst(), in.src(), atEOF && low == i)
- out.n += nDst
- in.p += nSrc
- if i > 0 && in.p == in.n {
- in.p, in.n = 0, 0
- }
- needProgress, lastFull = lastFull, false
- switch err0 {
- case ErrShortDst:
- // Process the destination buffer next. Return if we are already
- // at the high index.
- if i == high {
- return dstL.n, srcL.p, ErrShortDst
- }
- if out.n != 0 {
- i++
- // If the Transformer at the next index is not able to process any
- // source bytes there is nothing that can be done to make progress
- // and the bytes will remain unprocessed. lastFull is used to
- // detect this and break out of the loop with a fatal error.
- lastFull = true
- continue
- }
- // The destination buffer was too small, but is completely empty.
- // Return a fatal error as this transformation can never complete.
- c.fatalError(i, errShortInternal)
- case ErrShortSrc:
- if i == 0 {
- // Save ErrShortSrc in err. All other errors take precedence.
- err = ErrShortSrc
- break
- }
- // Source bytes were depleted before filling up the destination buffer.
- // Verify we made some progress, move the remaining bytes to the errStart
- // and try to get more source bytes.
- if needProgress && nSrc == 0 || in.n-in.p == len(in.b) {
- // There were not enough source bytes to proceed while the source
- // buffer cannot hold any more bytes. Return a fatal error as this
- // transformation can never complete.
- c.fatalError(i, errShortInternal)
- break
- }
- // in.b is an internal buffer and we can make progress.
- in.p, in.n = 0, copy(in.b, in.src())
- fallthrough
- case nil:
- // if i == low, we have depleted the bytes at index i or any lower levels.
- // In that case we increase low and i. In all other cases we decrease i to
- // fetch more bytes before proceeding to the next index.
- if i > low {
- i--
- continue
- }
- default:
- c.fatalError(i, err0)
- }
- // Exhausted level low or fatal error: increase low and continue
- // to process the bytes accepted so far.
- i++
- low = i
- }
-
- // If c.errStart > 0, this means we found a fatal error. We will clear
- // all upstream buffers. At this point, no more progress can be made
- // downstream, as Transform would have bailed while handling ErrShortDst.
- if c.errStart > 0 {
- for i := 1; i < c.errStart; i++ {
- c.link[i].p, c.link[i].n = 0, 0
- }
- err, c.errStart, c.err = c.err, 0, nil
- }
- return dstL.n, srcL.p, err
-}
-
-// RemoveFunc returns a Transformer that removes from the input all runes r for
-// which f(r) is true. Illegal bytes in the input are replaced by RuneError.
-func RemoveFunc(f func(r rune) bool) Transformer {
- return removeF(f)
-}
-
-type removeF func(r rune) bool
-
-func (removeF) Reset() {}
-
-// Transform implements the Transformer interface.
-func (t removeF) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) {
- for r, sz := rune(0), 0; len(src) > 0; src = src[sz:] {
-
- if r = rune(src[0]); r < utf8.RuneSelf {
- sz = 1
- } else {
- r, sz = utf8.DecodeRune(src)
-
- if sz == 1 {
- // Invalid rune.
- if !atEOF && !utf8.FullRune(src) {
- err = ErrShortSrc
- break
- }
- // We replace illegal bytes with RuneError. Not doing so might
- // otherwise turn a sequence of invalid UTF-8 into valid UTF-8.
- // The resulting byte sequence may subsequently contain runes
- // for which t(r) is true that were passed unnoticed.
- if !t(r) {
- if nDst+3 > len(dst) {
- err = ErrShortDst
- break
- }
- nDst += copy(dst[nDst:], "\uFFFD")
- }
- nSrc++
- continue
- }
- }
-
- if !t(r) {
- if nDst+sz > len(dst) {
- err = ErrShortDst
- break
- }
- nDst += copy(dst[nDst:], src[:sz])
- }
- nSrc += sz
- }
- return
-}
-
-// grow returns a new []byte that is longer than b, and copies the first n bytes
-// of b to the start of the new slice.
-func grow(b []byte, n int) []byte {
- m := len(b)
- if m <= 256 {
- m *= 2
- } else {
- m += m >> 1
- }
- buf := make([]byte, m)
- copy(buf, b[:n])
- return buf
-}
-
-const initialBufSize = 128
-
-// String returns a string with the result of converting s[:n] using t, where
-// n <= len(s). If err == nil, n will be len(s). It calls Reset on t.
-func String(t Transformer, s string) (result string, n int, err error) {
- if s == "" {
- return "", 0, nil
- }
-
- t.Reset()
-
- // Allocate only once. Note that both dst and src escape when passed to
- // Transform.
- buf := [2 * initialBufSize]byte{}
- dst := buf[:initialBufSize:initialBufSize]
- src := buf[initialBufSize : 2*initialBufSize]
-
- // Avoid allocation if the transformed string is identical to the original.
- // After this loop, pDst will point to the furthest point in s for which it
- // could be detected that t gives equal results, src[:nSrc] will
- // indicated the last processed chunk of s for which the output is not equal
- // and dst[:nDst] will be the transform of this chunk.
- var nDst, nSrc int
- pDst := 0 // Used as index in both src and dst in this loop.
- for {
- n := copy(src, s[pDst:])
- nDst, nSrc, err = t.Transform(dst, src[:n], pDst+n == len(s))
-
- // Note 1: we will not enter the loop with pDst == len(s) and we will
- // not end the loop with it either. So if nSrc is 0, this means there is
- // some kind of error from which we cannot recover given the current
- // buffer sizes. We will give up in this case.
- // Note 2: it is not entirely correct to simply do a bytes.Equal as
- // a Transformer may buffer internally. It will work in most cases,
- // though, and no harm is done if it doesn't work.
- // TODO: let transformers implement an optional Spanner interface, akin
- // to norm's QuickSpan. This would even allow us to avoid any allocation.
- if nSrc == 0 || !bytes.Equal(dst[:nDst], src[:nSrc]) {
- break
- }
-
- if pDst += nDst; pDst == len(s) {
- return s, pDst, nil
- }
- }
-
- // Move the bytes seen so far to dst.
- pSrc := pDst + nSrc
- if pDst+nDst <= initialBufSize {
- copy(dst[pDst:], dst[:nDst])
- } else {
- b := make([]byte, len(s)+nDst-nSrc)
- copy(b[pDst:], dst[:nDst])
- dst = b
- }
- copy(dst, s[:pDst])
- pDst += nDst
-
- if err != nil && err != ErrShortDst && err != ErrShortSrc {
- return string(dst[:pDst]), pSrc, err
- }
-
- // Complete the string with the remainder.
- for {
- n := copy(src, s[pSrc:])
- nDst, nSrc, err = t.Transform(dst[pDst:], src[:n], pSrc+n == len(s))
- pDst += nDst
- pSrc += nSrc
-
- switch err {
- case nil:
- if pSrc == len(s) {
- return string(dst[:pDst]), pSrc, nil
- }
- case ErrShortDst:
- // Do not grow as long as we can make progress. This may avoid
- // excessive allocations.
- if nDst == 0 {
- dst = grow(dst, pDst)
- }
- case ErrShortSrc:
- if nSrc == 0 {
- src = grow(src, 0)
- }
- default:
- return string(dst[:pDst]), pSrc, err
- }
- }
-}
-
-// Bytes returns a new byte slice with the result of converting b[:n] using t,
-// where n <= len(b). If err == nil, n will be len(b). It calls Reset on t.
-func Bytes(t Transformer, b []byte) (result []byte, n int, err error) {
- t.Reset()
- dst := make([]byte, len(b))
- pDst, pSrc := 0, 0
- for {
- nDst, nSrc, err := t.Transform(dst[pDst:], b[pSrc:], true)
- pDst += nDst
- pSrc += nSrc
- if err != ErrShortDst {
- return dst[:pDst], pSrc, err
- }
-
- // Grow the destination buffer, but do not grow as long as we can make
- // progress. This may avoid excessive allocations.
- if nDst == 0 {
- dst = grow(dst, pDst)
- }
- }
-}
diff --git a/vendor/golang.org/x/tools/.gitattributes b/vendor/golang.org/x/tools/.gitattributes
deleted file mode 100644
index d2f212e..0000000
--- a/vendor/golang.org/x/tools/.gitattributes
+++ /dev/null
@@ -1,10 +0,0 @@
-# Treat all files in this repo as binary, with no git magic updating
-# line endings. Windows users contributing to Go will need to use a
-# modern version of git and editors capable of LF line endings.
-#
-# We'll prevent accidental CRLF line endings from entering the repo
-# via the git-review gofmt checks.
-#
-# See golang.org/issue/9281
-
-* -text
diff --git a/vendor/golang.org/x/tools/.gitignore b/vendor/golang.org/x/tools/.gitignore
deleted file mode 100644
index 5a9d62e..0000000
--- a/vendor/golang.org/x/tools/.gitignore
+++ /dev/null
@@ -1,2 +0,0 @@
-# Add no patterns to .gitignore except for files generated by the build.
-last-change
diff --git a/vendor/golang.org/x/tools/AUTHORS b/vendor/golang.org/x/tools/AUTHORS
deleted file mode 100644
index 15167cd..0000000
--- a/vendor/golang.org/x/tools/AUTHORS
+++ /dev/null
@@ -1,3 +0,0 @@
-# This source code refers to The Go Authors for copyright purposes.
-# The master list of authors is in the main Go distribution,
-# visible at http://tip.golang.org/AUTHORS.
diff --git a/vendor/golang.org/x/tools/CONTRIBUTING.md b/vendor/golang.org/x/tools/CONTRIBUTING.md
deleted file mode 100644
index 88dff59..0000000
--- a/vendor/golang.org/x/tools/CONTRIBUTING.md
+++ /dev/null
@@ -1,31 +0,0 @@
-# Contributing to Go
-
-Go is an open source project.
-
-It is the work of hundreds of contributors. We appreciate your help!
-
-
-## Filing issues
-
-When [filing an issue](https://golang.org/issue/new), make sure to answer these five questions:
-
-1. What version of Go are you using (`go version`)?
-2. What operating system and processor architecture are you using?
-3. What did you do?
-4. What did you expect to see?
-5. What did you see instead?
-
-General questions should go to the [golang-nuts mailing list](https://groups.google.com/group/golang-nuts) instead of the issue tracker.
-The gophers there will answer or ask you to file an issue if you've tripped over a bug.
-
-## Contributing code
-
-Please read the [Contribution Guidelines](https://golang.org/doc/contribute.html)
-before sending patches.
-
-**We do not accept GitHub pull requests**
-(we use [Gerrit](https://code.google.com/p/gerrit/) instead for code review).
-
-Unless otherwise noted, the Go source files are distributed under
-the BSD-style license found in the LICENSE file.
-
diff --git a/vendor/golang.org/x/tools/CONTRIBUTORS b/vendor/golang.org/x/tools/CONTRIBUTORS
deleted file mode 100644
index 1c4577e..0000000
--- a/vendor/golang.org/x/tools/CONTRIBUTORS
+++ /dev/null
@@ -1,3 +0,0 @@
-# This source code was written by the Go contributors.
-# The master list of contributors is in the main Go distribution,
-# visible at http://tip.golang.org/CONTRIBUTORS.
diff --git a/vendor/golang.org/x/tools/LICENSE b/vendor/golang.org/x/tools/LICENSE
deleted file mode 100644
index 6a66aea..0000000
--- a/vendor/golang.org/x/tools/LICENSE
+++ /dev/null
@@ -1,27 +0,0 @@
-Copyright (c) 2009 The Go Authors. All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are
-met:
-
- * Redistributions of source code must retain the above copyright
-notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
-copyright notice, this list of conditions and the following disclaimer
-in the documentation and/or other materials provided with the
-distribution.
- * Neither the name of Google Inc. nor the names of its
-contributors may be used to endorse or promote products derived from
-this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/vendor/golang.org/x/tools/PATENTS b/vendor/golang.org/x/tools/PATENTS
deleted file mode 100644
index 7330990..0000000
--- a/vendor/golang.org/x/tools/PATENTS
+++ /dev/null
@@ -1,22 +0,0 @@
-Additional IP Rights Grant (Patents)
-
-"This implementation" means the copyrightable works distributed by
-Google as part of the Go project.
-
-Google 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,
-transfer and otherwise run, modify and propagate the contents of this
-implementation of Go, where such license applies only to those patent
-claims, both currently owned or controlled by Google and acquired in
-the future, licensable by Google that are necessarily infringed by this
-implementation of Go. This grant does not include claims that would be
-infringed only as a consequence of further modification of this
-implementation. If you or your agent or exclusive licensee institute or
-order or agree to the institution of patent litigation against any
-entity (including a cross-claim or counterclaim in a lawsuit) alleging
-that this implementation of Go or any code incorporated within this
-implementation of Go constitutes direct or contributory patent
-infringement, or inducement of patent infringement, then any patent
-rights granted to you under this License for this implementation of Go
-shall terminate as of the date such litigation is filed.
diff --git a/vendor/golang.org/x/tools/README.md b/vendor/golang.org/x/tools/README.md
deleted file mode 100644
index 20be9e1..0000000
--- a/vendor/golang.org/x/tools/README.md
+++ /dev/null
@@ -1,27 +0,0 @@
-# Go Tools
-
-This subrepository holds the source for various packages and tools that support
-the Go programming language.
-
-Some of the tools, `godoc` and `vet` for example, are included in binary Go
-distributions.
-
-Others, including the Go `guru` and the test coverage tool, can be fetched with
-`go get`.
-
-Packages include a type-checker for Go and an implementation of the
-Static Single Assignment form (SSA) representation for Go programs.
-
-## Download/Install
-
-The easiest way to install is to run `go get -u golang.org/x/tools/...`. You can
-also manually git clone the repository to `$GOPATH/src/golang.org/x/tools`.
-
-## Report Issues / Send Patches
-
-This repository uses Gerrit for code changes. To learn how to submit changes to
-this repository, see https://golang.org/doc/contribute.html.
-
-The main issue tracker for the tools repository is located at
-https://github.com/golang/go/issues. Prefix your issue with "x/tools/(your
-subdir):" in the subject line, so it is easy to find.
diff --git a/vendor/golang.org/x/tools/benchmark/parse/parse.go b/vendor/golang.org/x/tools/benchmark/parse/parse.go
deleted file mode 100644
index b37e6f0..0000000
--- a/vendor/golang.org/x/tools/benchmark/parse/parse.go
+++ /dev/null
@@ -1,131 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Package parse provides support for parsing benchmark results as
-// generated by 'go test -bench'.
-package parse // import "golang.org/x/tools/benchmark/parse"
-
-import (
- "bufio"
- "bytes"
- "fmt"
- "io"
- "strconv"
- "strings"
-)
-
-// Flags used by Benchmark.Measured to indicate
-// which measurements a Benchmark contains.
-const (
- NsPerOp = 1 << iota
- MBPerS
- AllocedBytesPerOp
- AllocsPerOp
-)
-
-// Benchmark is one run of a single benchmark.
-type Benchmark struct {
- Name string // benchmark name
- N int // number of iterations
- NsPerOp float64 // nanoseconds per iteration
- AllocedBytesPerOp uint64 // bytes allocated per iteration
- AllocsPerOp uint64 // allocs per iteration
- MBPerS float64 // MB processed per second
- Measured int // which measurements were recorded
- Ord int // ordinal position within a benchmark run
-}
-
-// ParseLine extracts a Benchmark from a single line of testing.B
-// output.
-func ParseLine(line string) (*Benchmark, error) {
- fields := strings.Fields(line)
-
- // Two required, positional fields: Name and iterations.
- if len(fields) < 2 {
- return nil, fmt.Errorf("two fields required, have %d", len(fields))
- }
- if !strings.HasPrefix(fields[0], "Benchmark") {
- return nil, fmt.Errorf(`first field does not start with "Benchmark"`)
- }
- n, err := strconv.Atoi(fields[1])
- if err != nil {
- return nil, err
- }
- b := &Benchmark{Name: fields[0], N: n}
-
- // Parse any remaining pairs of fields; we've parsed one pair already.
- for i := 1; i < len(fields)/2; i++ {
- b.parseMeasurement(fields[i*2], fields[i*2+1])
- }
- return b, nil
-}
-
-func (b *Benchmark) parseMeasurement(quant string, unit string) {
- switch unit {
- case "ns/op":
- if f, err := strconv.ParseFloat(quant, 64); err == nil {
- b.NsPerOp = f
- b.Measured |= NsPerOp
- }
- case "MB/s":
- if f, err := strconv.ParseFloat(quant, 64); err == nil {
- b.MBPerS = f
- b.Measured |= MBPerS
- }
- case "B/op":
- if i, err := strconv.ParseUint(quant, 10, 64); err == nil {
- b.AllocedBytesPerOp = i
- b.Measured |= AllocedBytesPerOp
- }
- case "allocs/op":
- if i, err := strconv.ParseUint(quant, 10, 64); err == nil {
- b.AllocsPerOp = i
- b.Measured |= AllocsPerOp
- }
- }
-}
-
-func (b *Benchmark) String() string {
- buf := new(bytes.Buffer)
- fmt.Fprintf(buf, "%s %d", b.Name, b.N)
- if (b.Measured & NsPerOp) != 0 {
- fmt.Fprintf(buf, " %.2f ns/op", b.NsPerOp)
- }
- if (b.Measured & MBPerS) != 0 {
- fmt.Fprintf(buf, " %.2f MB/s", b.MBPerS)
- }
- if (b.Measured & AllocedBytesPerOp) != 0 {
- fmt.Fprintf(buf, " %d B/op", b.AllocedBytesPerOp)
- }
- if (b.Measured & AllocsPerOp) != 0 {
- fmt.Fprintf(buf, " %d allocs/op", b.AllocsPerOp)
- }
- return buf.String()
-}
-
-// Set is a collection of benchmarks from one
-// testing.B run, keyed by name to facilitate comparison.
-type Set map[string][]*Benchmark
-
-// ParseSet extracts a Set from testing.B output.
-// ParseSet preserves the order of benchmarks that have identical
-// names.
-func ParseSet(r io.Reader) (Set, error) {
- bb := make(Set)
- scan := bufio.NewScanner(r)
- ord := 0
- for scan.Scan() {
- if b, err := ParseLine(scan.Text()); err == nil {
- b.Ord = ord
- ord++
- bb[b.Name] = append(bb[b.Name], b)
- }
- }
-
- if err := scan.Err(); err != nil {
- return nil, err
- }
-
- return bb, nil
-}
diff --git a/vendor/golang.org/x/tools/benchmark/parse/parse_test.go b/vendor/golang.org/x/tools/benchmark/parse/parse_test.go
deleted file mode 100644
index 06db848..0000000
--- a/vendor/golang.org/x/tools/benchmark/parse/parse_test.go
+++ /dev/null
@@ -1,154 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package parse
-
-import (
- "reflect"
- "strings"
- "testing"
-)
-
-func TestParseLine(t *testing.T) {
- cases := []struct {
- line string
- want *Benchmark
- err bool // expect an error
- }{
- {
- line: "BenchmarkEncrypt 100000000 19.6 ns/op",
- want: &Benchmark{
- Name: "BenchmarkEncrypt",
- N: 100000000, NsPerOp: 19.6,
- Measured: NsPerOp,
- },
- },
- {
- line: "BenchmarkEncrypt 100000000 19.6 ns/op 817.77 MB/s",
- want: &Benchmark{
- Name: "BenchmarkEncrypt",
- N: 100000000, NsPerOp: 19.6, MBPerS: 817.77,
- Measured: NsPerOp | MBPerS,
- },
- },
- {
- line: "BenchmarkEncrypt 100000000 19.6 ns/op 817.77",
- want: &Benchmark{
- Name: "BenchmarkEncrypt",
- N: 100000000, NsPerOp: 19.6,
- Measured: NsPerOp,
- },
- },
- {
- line: "BenchmarkEncrypt 100000000 19.6 ns/op 817.77 MB/s 5 allocs/op",
- want: &Benchmark{
- Name: "BenchmarkEncrypt",
- N: 100000000, NsPerOp: 19.6, MBPerS: 817.77, AllocsPerOp: 5,
- Measured: NsPerOp | MBPerS | AllocsPerOp,
- },
- },
- {
- line: "BenchmarkEncrypt 100000000 19.6 ns/op 817.77 MB/s 3 B/op 5 allocs/op",
- want: &Benchmark{
- Name: "BenchmarkEncrypt",
- N: 100000000, NsPerOp: 19.6, MBPerS: 817.77, AllocedBytesPerOp: 3, AllocsPerOp: 5,
- Measured: NsPerOp | MBPerS | AllocedBytesPerOp | AllocsPerOp,
- },
- },
- // error handling cases
- {
- line: "BenchPress 100 19.6 ns/op", // non-benchmark
- err: true,
- },
- {
- line: "BenchmarkEncrypt lots 19.6 ns/op", // non-int iterations
- err: true,
- },
- {
- line: "BenchmarkBridge 100000000 19.6 smoots", // unknown unit
- want: &Benchmark{
- Name: "BenchmarkBridge",
- N: 100000000,
- },
- },
- {
- line: "PASS",
- err: true,
- },
- }
-
- for _, tt := range cases {
- have, err := ParseLine(tt.line)
- if tt.err && err == nil {
- t.Errorf("parsing line %q should have failed", tt.line)
- continue
- }
- if !reflect.DeepEqual(have, tt.want) {
- t.Errorf("parsed line %q incorrectly, want %v have %v", tt.line, tt.want, have)
- }
- }
-}
-
-func TestParseSet(t *testing.T) {
- // Test two things:
- // 1. The noise that can accompany testing.B output gets ignored.
- // 2. Benchmarks with the same name have their order preserved.
- in := `
- ? crypto [no test files]
- PASS
- pem_decrypt_test.go:17: test 4. %!s(x509.PEMCipher=5)
- ... [output truncated]
-
- BenchmarkEncrypt 100000000 19.6 ns/op
- BenchmarkEncrypt 5000000 517 ns/op
- === RUN TestChunk
- --- PASS: TestChunk (0.00 seconds)
- --- SKIP: TestLinuxSendfile (0.00 seconds)
- fs_test.go:716: skipping; linux-only test
- BenchmarkReadRequestApachebench 1000000 2960 ns/op 27.70 MB/s 839 B/op 9 allocs/op
- BenchmarkClientServerParallel64 50000 59192 ns/op 7028 B/op 60 allocs/op
- ok net/http 95.783s
- `
-
- want := Set{
- "BenchmarkReadRequestApachebench": []*Benchmark{
- {
- Name: "BenchmarkReadRequestApachebench",
- N: 1000000, NsPerOp: 2960, MBPerS: 27.70, AllocedBytesPerOp: 839, AllocsPerOp: 9,
- Measured: NsPerOp | MBPerS | AllocedBytesPerOp | AllocsPerOp,
- Ord: 2,
- },
- },
- "BenchmarkClientServerParallel64": []*Benchmark{
- {
- Name: "BenchmarkClientServerParallel64",
- N: 50000, NsPerOp: 59192, AllocedBytesPerOp: 7028, AllocsPerOp: 60,
- Measured: NsPerOp | AllocedBytesPerOp | AllocsPerOp,
- Ord: 3,
- },
- },
- "BenchmarkEncrypt": []*Benchmark{
- {
- Name: "BenchmarkEncrypt",
- N: 100000000, NsPerOp: 19.6,
- Measured: NsPerOp,
- Ord: 0,
- },
- {
- Name: "BenchmarkEncrypt",
- N: 5000000, NsPerOp: 517,
- Measured: NsPerOp,
- Ord: 1,
- },
- },
- }
-
- have, err := ParseSet(strings.NewReader(in))
- if err != nil {
- t.Fatalf("unexpected err during ParseSet: %v", err)
- }
- if !reflect.DeepEqual(want, have) {
- t.Errorf("parsed bench set incorrectly, want %v have %v", want, have)
- }
-}
diff --git a/vendor/golang.org/x/tools/blog/atom/atom.go b/vendor/golang.org/x/tools/blog/atom/atom.go
deleted file mode 100644
index 542c50e..0000000
--- a/vendor/golang.org/x/tools/blog/atom/atom.go
+++ /dev/null
@@ -1,61 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Adapted from encoding/xml/read_test.go.
-
-// Package atom defines XML data structures for an Atom feed.
-package atom // import "golang.org/x/tools/blog/atom"
-
-import (
- "encoding/xml"
- "time"
-)
-
-type Feed struct {
- XMLName xml.Name `xml:"http://www.w3.org/2005/Atom feed"`
- Title string `xml:"title"`
- ID string `xml:"id"`
- Link []Link `xml:"link"`
- Updated TimeStr `xml:"updated"`
- Author *Person `xml:"author"`
- Entry []*Entry `xml:"entry"`
-}
-
-type Entry struct {
- Title string `xml:"title"`
- ID string `xml:"id"`
- Link []Link `xml:"link"`
- Published TimeStr `xml:"published"`
- Updated TimeStr `xml:"updated"`
- Author *Person `xml:"author"`
- Summary *Text `xml:"summary"`
- Content *Text `xml:"content"`
-}
-
-type Link struct {
- Rel string `xml:"rel,attr,omitempty"`
- Href string `xml:"href,attr"`
- Type string `xml:"type,attr,omitempty"`
- HrefLang string `xml:"hreflang,attr,omitempty"`
- Title string `xml:"title,attr,omitempty"`
- Length uint `xml:"length,attr,omitempty"`
-}
-
-type Person struct {
- Name string `xml:"name"`
- URI string `xml:"uri,omitempty"`
- Email string `xml:"email,omitempty"`
- InnerXML string `xml:",innerxml"`
-}
-
-type Text struct {
- Type string `xml:"type,attr"`
- Body string `xml:",chardata"`
-}
-
-type TimeStr string
-
-func Time(t time.Time) TimeStr {
- return TimeStr(t.Format("2006-01-02T15:04:05-07:00"))
-}
diff --git a/vendor/golang.org/x/tools/blog/blog.go b/vendor/golang.org/x/tools/blog/blog.go
deleted file mode 100644
index 4055b1b..0000000
--- a/vendor/golang.org/x/tools/blog/blog.go
+++ /dev/null
@@ -1,437 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Package blog implements a web server for articles written in present format.
-package blog // import "golang.org/x/tools/blog"
-
-import (
- "bytes"
- "encoding/json"
- "encoding/xml"
- "fmt"
- "html/template"
- "log"
- "net/http"
- "os"
- "path/filepath"
- "regexp"
- "sort"
- "strings"
- "time"
-
- "golang.org/x/tools/blog/atom"
- "golang.org/x/tools/present"
-)
-
-var validJSONPFunc = regexp.MustCompile(`(?i)^[a-z_][a-z0-9_.]*$`)
-
-// Config specifies Server configuration values.
-type Config struct {
- ContentPath string // Relative or absolute location of article files and related content.
- TemplatePath string // Relative or absolute location of template files.
-
- BaseURL string // Absolute base URL (for permalinks; no trailing slash).
- BasePath string // Base URL path relative to server root (no trailing slash).
- GodocURL string // The base URL of godoc (for menu bar; no trailing slash).
- Hostname string // Server host name, used for rendering ATOM feeds.
-
- HomeArticles int // Articles to display on the home page.
- FeedArticles int // Articles to include in Atom and JSON feeds.
- FeedTitle string // The title of the Atom XML feed
-
- PlayEnabled bool
-}
-
-// Doc represents an article adorned with presentation data.
-type Doc struct {
- *present.Doc
- Permalink string // Canonical URL for this document.
- Path string // Path relative to server root (including base).
- HTML template.HTML // rendered article
-
- Related []*Doc
- Newer, Older *Doc
-}
-
-// Server implements an http.Handler that serves blog articles.
-type Server struct {
- cfg Config
- docs []*Doc
- tags []string
- docPaths map[string]*Doc // key is path without BasePath.
- docTags map[string][]*Doc
- template struct {
- home, index, article, doc *template.Template
- }
- atomFeed []byte // pre-rendered Atom feed
- jsonFeed []byte // pre-rendered JSON feed
- content http.Handler
-}
-
-// NewServer constructs a new Server using the specified config.
-func NewServer(cfg Config) (*Server, error) {
- present.PlayEnabled = cfg.PlayEnabled
-
- if notExist(cfg.TemplatePath) {
- return nil, fmt.Errorf("template directory not found: %s", cfg.TemplatePath)
- }
- root := filepath.Join(cfg.TemplatePath, "root.tmpl")
- parse := func(name string) (*template.Template, error) {
- path := filepath.Join(cfg.TemplatePath, name)
- if notExist(path) {
- return nil, fmt.Errorf("template %s was not found in %s", name, cfg.TemplatePath)
- }
- t := template.New("").Funcs(funcMap)
- return t.ParseFiles(root, path)
- }
-
- s := &Server{cfg: cfg}
-
- // Parse templates.
- var err error
- s.template.home, err = parse("home.tmpl")
- if err != nil {
- return nil, err
- }
- s.template.index, err = parse("index.tmpl")
- if err != nil {
- return nil, err
- }
- s.template.article, err = parse("article.tmpl")
- if err != nil {
- return nil, err
- }
- p := present.Template().Funcs(funcMap)
- s.template.doc, err = p.ParseFiles(filepath.Join(cfg.TemplatePath, "doc.tmpl"))
- if err != nil {
- return nil, err
- }
-
- // Load content.
- err = s.loadDocs(filepath.Clean(cfg.ContentPath))
- if err != nil {
- return nil, err
- }
-
- err = s.renderAtomFeed()
- if err != nil {
- return nil, err
- }
-
- err = s.renderJSONFeed()
- if err != nil {
- return nil, err
- }
-
- // Set up content file server.
- s.content = http.StripPrefix(s.cfg.BasePath, http.FileServer(http.Dir(cfg.ContentPath)))
-
- return s, nil
-}
-
-var funcMap = template.FuncMap{
- "sectioned": sectioned,
- "authors": authors,
-}
-
-// sectioned returns true if the provided Doc contains more than one section.
-// This is used to control whether to display the table of contents and headings.
-func sectioned(d *present.Doc) bool {
- return len(d.Sections) > 1
-}
-
-// authors returns a comma-separated list of author names.
-func authors(authors []present.Author) string {
- var b bytes.Buffer
- last := len(authors) - 1
- for i, a := range authors {
- if i > 0 {
- if i == last {
- b.WriteString(" and ")
- } else {
- b.WriteString(", ")
- }
- }
- b.WriteString(authorName(a))
- }
- return b.String()
-}
-
-// authorName returns the first line of the Author text: the author's name.
-func authorName(a present.Author) string {
- el := a.TextElem()
- if len(el) == 0 {
- return ""
- }
- text, ok := el[0].(present.Text)
- if !ok || len(text.Lines) == 0 {
- return ""
- }
- return text.Lines[0]
-}
-
-// loadDocs reads all content from the provided file system root, renders all
-// the articles it finds, adds them to the Server's docs field, computes the
-// denormalized docPaths, docTags, and tags fields, and populates the various
-// helper fields (Next, Previous, Related) for each Doc.
-func (s *Server) loadDocs(root string) error {
- // Read content into docs field.
- const ext = ".article"
- fn := func(p string, info os.FileInfo, err error) error {
- if filepath.Ext(p) != ext {
- return nil
- }
- f, err := os.Open(p)
- if err != nil {
- return err
- }
- defer f.Close()
- d, err := present.Parse(f, p, 0)
- if err != nil {
- return err
- }
- html := new(bytes.Buffer)
- err = d.Render(html, s.template.doc)
- if err != nil {
- return err
- }
- p = p[len(root) : len(p)-len(ext)] // trim root and extension
- p = filepath.ToSlash(p)
- s.docs = append(s.docs, &Doc{
- Doc: d,
- Path: s.cfg.BasePath + p,
- Permalink: s.cfg.BaseURL + p,
- HTML: template.HTML(html.String()),
- })
- return nil
- }
- err := filepath.Walk(root, fn)
- if err != nil {
- return err
- }
- sort.Sort(docsByTime(s.docs))
-
- // Pull out doc paths and tags and put in reverse-associating maps.
- s.docPaths = make(map[string]*Doc)
- s.docTags = make(map[string][]*Doc)
- for _, d := range s.docs {
- s.docPaths[strings.TrimPrefix(d.Path, s.cfg.BasePath)] = d
- for _, t := range d.Tags {
- s.docTags[t] = append(s.docTags[t], d)
- }
- }
-
- // Pull out unique sorted list of tags.
- for t := range s.docTags {
- s.tags = append(s.tags, t)
- }
- sort.Strings(s.tags)
-
- // Set up presentation-related fields, Newer, Older, and Related.
- for _, doc := range s.docs {
- // Newer, Older: docs adjacent to doc
- for i := range s.docs {
- if s.docs[i] != doc {
- continue
- }
- if i > 0 {
- doc.Newer = s.docs[i-1]
- }
- if i+1 < len(s.docs) {
- doc.Older = s.docs[i+1]
- }
- break
- }
-
- // Related: all docs that share tags with doc.
- related := make(map[*Doc]bool)
- for _, t := range doc.Tags {
- for _, d := range s.docTags[t] {
- if d != doc {
- related[d] = true
- }
- }
- }
- for d := range related {
- doc.Related = append(doc.Related, d)
- }
- sort.Sort(docsByTime(doc.Related))
- }
-
- return nil
-}
-
-// renderAtomFeed generates an XML Atom feed and stores it in the Server's
-// atomFeed field.
-func (s *Server) renderAtomFeed() error {
- var updated time.Time
- if len(s.docs) > 0 {
- updated = s.docs[0].Time
- }
- feed := atom.Feed{
- Title: s.cfg.FeedTitle,
- ID: "tag:" + s.cfg.Hostname + ",2013:" + s.cfg.Hostname,
- Updated: atom.Time(updated),
- Link: []atom.Link{{
- Rel: "self",
- Href: s.cfg.BaseURL + "/feed.atom",
- }},
- }
- for i, doc := range s.docs {
- if i >= s.cfg.FeedArticles {
- break
- }
- e := &atom.Entry{
- Title: doc.Title,
- ID: feed.ID + doc.Path,
- Link: []atom.Link{{
- Rel: "alternate",
- Href: doc.Permalink,
- }},
- Published: atom.Time(doc.Time),
- Updated: atom.Time(doc.Time),
- Summary: &atom.Text{
- Type: "html",
- Body: summary(doc),
- },
- Content: &atom.Text{
- Type: "html",
- Body: string(doc.HTML),
- },
- Author: &atom.Person{
- Name: authors(doc.Authors),
- },
- }
- feed.Entry = append(feed.Entry, e)
- }
- data, err := xml.Marshal(&feed)
- if err != nil {
- return err
- }
- s.atomFeed = data
- return nil
-}
-
-type jsonItem struct {
- Title string
- Link string
- Time time.Time
- Summary string
- Content string
- Author string
-}
-
-// renderJSONFeed generates a JSON feed and stores it in the Server's jsonFeed
-// field.
-func (s *Server) renderJSONFeed() error {
- var feed []jsonItem
- for i, doc := range s.docs {
- if i >= s.cfg.FeedArticles {
- break
- }
- item := jsonItem{
- Title: doc.Title,
- Link: doc.Permalink,
- Time: doc.Time,
- Summary: summary(doc),
- Content: string(doc.HTML),
- Author: authors(doc.Authors),
- }
- feed = append(feed, item)
- }
- data, err := json.Marshal(feed)
- if err != nil {
- return err
- }
- s.jsonFeed = data
- return nil
-}
-
-// summary returns the first paragraph of text from the provided Doc.
-func summary(d *Doc) string {
- if len(d.Sections) == 0 {
- return ""
- }
- for _, elem := range d.Sections[0].Elem {
- text, ok := elem.(present.Text)
- if !ok || text.Pre {
- // skip everything but non-text elements
- continue
- }
- var buf bytes.Buffer
- for _, s := range text.Lines {
- buf.WriteString(string(present.Style(s)))
- buf.WriteByte('\n')
- }
- return buf.String()
- }
- return ""
-}
-
-// rootData encapsulates data destined for the root template.
-type rootData struct {
- Doc *Doc
- BasePath string
- GodocURL string
- Data interface{}
-}
-
-// ServeHTTP serves the front, index, and article pages
-// as well as the ATOM and JSON feeds.
-func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) {
- var (
- d = rootData{BasePath: s.cfg.BasePath, GodocURL: s.cfg.GodocURL}
- t *template.Template
- )
- switch p := strings.TrimPrefix(r.URL.Path, s.cfg.BasePath); p {
- case "/":
- d.Data = s.docs
- if len(s.docs) > s.cfg.HomeArticles {
- d.Data = s.docs[:s.cfg.HomeArticles]
- }
- t = s.template.home
- case "/index":
- d.Data = s.docs
- t = s.template.index
- case "/feed.atom", "/feeds/posts/default":
- w.Header().Set("Content-type", "application/atom+xml; charset=utf-8")
- w.Write(s.atomFeed)
- return
- case "/.json":
- if p := r.FormValue("jsonp"); validJSONPFunc.MatchString(p) {
- w.Header().Set("Content-type", "application/javascript; charset=utf-8")
- fmt.Fprintf(w, "%v(%s)", p, s.jsonFeed)
- return
- }
- w.Header().Set("Content-type", "application/json; charset=utf-8")
- w.Write(s.jsonFeed)
- return
- default:
- doc, ok := s.docPaths[p]
- if !ok {
- // Not a doc; try to just serve static content.
- s.content.ServeHTTP(w, r)
- return
- }
- d.Doc = doc
- t = s.template.article
- }
- err := t.ExecuteTemplate(w, "root", d)
- if err != nil {
- log.Println(err)
- }
-}
-
-// docsByTime implements sort.Interface, sorting Docs by their Time field.
-type docsByTime []*Doc
-
-func (s docsByTime) Len() int { return len(s) }
-func (s docsByTime) Swap(i, j int) { s[i], s[j] = s[j], s[i] }
-func (s docsByTime) Less(i, j int) bool { return s[i].Time.After(s[j].Time) }
-
-// notExist reports whether the path exists or not.
-func notExist(path string) bool {
- _, err := os.Stat(path)
- return os.IsNotExist(err)
-}
diff --git a/vendor/golang.org/x/tools/cmd/benchcmp/benchcmp.go b/vendor/golang.org/x/tools/cmd/benchcmp/benchcmp.go
deleted file mode 100644
index 32f3a1c..0000000
--- a/vendor/golang.org/x/tools/cmd/benchcmp/benchcmp.go
+++ /dev/null
@@ -1,184 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-import (
- "flag"
- "fmt"
- "os"
- "sort"
- "strconv"
- "text/tabwriter"
-
- "golang.org/x/tools/benchmark/parse"
-)
-
-var (
- changedOnly = flag.Bool("changed", false, "show only benchmarks that have changed")
- magSort = flag.Bool("mag", false, "sort benchmarks by magnitude of change")
- best = flag.Bool("best", false, "compare best times from old and new")
-)
-
-const usageFooter = `
-Each input file should be from:
- go test -run=NONE -bench=. > [old,new].txt
-
-Benchcmp compares old and new for each benchmark.
-
-If -test.benchmem=true is added to the "go test" command
-benchcmp will also compare memory allocations.
-`
-
-func main() {
- flag.Usage = func() {
- fmt.Fprintf(os.Stderr, "usage: %s old.txt new.txt\n\n", os.Args[0])
- flag.PrintDefaults()
- fmt.Fprint(os.Stderr, usageFooter)
- os.Exit(2)
- }
- flag.Parse()
- if flag.NArg() != 2 {
- flag.Usage()
- }
-
- before := parseFile(flag.Arg(0))
- after := parseFile(flag.Arg(1))
-
- cmps, warnings := Correlate(before, after)
-
- for _, warn := range warnings {
- fmt.Fprintln(os.Stderr, warn)
- }
-
- if len(cmps) == 0 {
- fatal("benchcmp: no repeated benchmarks")
- }
-
- w := new(tabwriter.Writer)
- w.Init(os.Stdout, 0, 0, 5, ' ', 0)
- defer w.Flush()
-
- var header bool // Has the header has been displayed yet for a given block?
-
- if *magSort {
- sort.Sort(ByDeltaNsPerOp(cmps))
- } else {
- sort.Sort(ByParseOrder(cmps))
- }
- for _, cmp := range cmps {
- if !cmp.Measured(parse.NsPerOp) {
- continue
- }
- if delta := cmp.DeltaNsPerOp(); !*changedOnly || delta.Changed() {
- if !header {
- fmt.Fprint(w, "benchmark\told ns/op\tnew ns/op\tdelta\n")
- header = true
- }
- fmt.Fprintf(w, "%s\t%s\t%s\t%s\n", cmp.Name(), formatNs(cmp.Before.NsPerOp), formatNs(cmp.After.NsPerOp), delta.Percent())
- }
- }
-
- header = false
- if *magSort {
- sort.Sort(ByDeltaMBPerS(cmps))
- }
- for _, cmp := range cmps {
- if !cmp.Measured(parse.MBPerS) {
- continue
- }
- if delta := cmp.DeltaMBPerS(); !*changedOnly || delta.Changed() {
- if !header {
- fmt.Fprint(w, "\nbenchmark\told MB/s\tnew MB/s\tspeedup\n")
- header = true
- }
- fmt.Fprintf(w, "%s\t%.2f\t%.2f\t%s\n", cmp.Name(), cmp.Before.MBPerS, cmp.After.MBPerS, delta.Multiple())
- }
- }
-
- header = false
- if *magSort {
- sort.Sort(ByDeltaAllocsPerOp(cmps))
- }
- for _, cmp := range cmps {
- if !cmp.Measured(parse.AllocsPerOp) {
- continue
- }
- if delta := cmp.DeltaAllocsPerOp(); !*changedOnly || delta.Changed() {
- if !header {
- fmt.Fprint(w, "\nbenchmark\told allocs\tnew allocs\tdelta\n")
- header = true
- }
- fmt.Fprintf(w, "%s\t%d\t%d\t%s\n", cmp.Name(), cmp.Before.AllocsPerOp, cmp.After.AllocsPerOp, delta.Percent())
- }
- }
-
- header = false
- if *magSort {
- sort.Sort(ByDeltaAllocedBytesPerOp(cmps))
- }
- for _, cmp := range cmps {
- if !cmp.Measured(parse.AllocedBytesPerOp) {
- continue
- }
- if delta := cmp.DeltaAllocedBytesPerOp(); !*changedOnly || delta.Changed() {
- if !header {
- fmt.Fprint(w, "\nbenchmark\told bytes\tnew bytes\tdelta\n")
- header = true
- }
- fmt.Fprintf(w, "%s\t%d\t%d\t%s\n", cmp.Name(), cmp.Before.AllocedBytesPerOp, cmp.After.AllocedBytesPerOp, cmp.DeltaAllocedBytesPerOp().Percent())
- }
- }
-}
-
-func fatal(msg interface{}) {
- fmt.Fprintln(os.Stderr, msg)
- os.Exit(1)
-}
-
-func parseFile(path string) parse.Set {
- f, err := os.Open(path)
- if err != nil {
- fatal(err)
- }
- defer f.Close()
- bb, err := parse.ParseSet(f)
- if err != nil {
- fatal(err)
- }
- if *best {
- selectBest(bb)
- }
- return bb
-}
-
-func selectBest(bs parse.Set) {
- for name, bb := range bs {
- if len(bb) < 2 {
- continue
- }
- ord := bb[0].Ord
- best := bb[0]
- for _, b := range bb {
- if b.NsPerOp < best.NsPerOp {
- b.Ord = ord
- best = b
- }
- }
- bs[name] = []*parse.Benchmark{best}
- }
-}
-
-// formatNs formats ns measurements to expose a useful amount of
-// precision. It mirrors the ns precision logic of testing.B.
-func formatNs(ns float64) string {
- prec := 0
- switch {
- case ns < 10:
- prec = 2
- case ns < 100:
- prec = 1
- }
- return strconv.FormatFloat(ns, 'f', prec, 64)
-}
diff --git a/vendor/golang.org/x/tools/cmd/benchcmp/benchcmp_test.go b/vendor/golang.org/x/tools/cmd/benchcmp/benchcmp_test.go
deleted file mode 100644
index 2226079..0000000
--- a/vendor/golang.org/x/tools/cmd/benchcmp/benchcmp_test.go
+++ /dev/null
@@ -1,59 +0,0 @@
-package main
-
-import (
- "reflect"
- "testing"
-
- "golang.org/x/tools/benchmark/parse"
-)
-
-func TestSelectBest(t *testing.T) {
- have := parse.Set{
- "Benchmark1": []*parse.Benchmark{
- {
- Name: "Benchmark1",
- N: 10, NsPerOp: 100, Measured: parse.NsPerOp,
- Ord: 0,
- },
- {
- Name: "Benchmark1",
- N: 10, NsPerOp: 50, Measured: parse.NsPerOp,
- Ord: 3,
- },
- },
- "Benchmark2": []*parse.Benchmark{
- {
- Name: "Benchmark2",
- N: 10, NsPerOp: 60, Measured: parse.NsPerOp,
- Ord: 1,
- },
- {
- Name: "Benchmark2",
- N: 10, NsPerOp: 500, Measured: parse.NsPerOp,
- Ord: 2,
- },
- },
- }
-
- want := parse.Set{
- "Benchmark1": []*parse.Benchmark{
- {
- Name: "Benchmark1",
- N: 10, NsPerOp: 50, Measured: parse.NsPerOp,
- Ord: 0,
- },
- },
- "Benchmark2": []*parse.Benchmark{
- {
- Name: "Benchmark2",
- N: 10, NsPerOp: 60, Measured: parse.NsPerOp,
- Ord: 1,
- },
- },
- }
-
- selectBest(have)
- if !reflect.DeepEqual(want, have) {
- t.Errorf("filtered bench set incorrectly, want %v have %v", want, have)
- }
-}
diff --git a/vendor/golang.org/x/tools/cmd/benchcmp/compare.go b/vendor/golang.org/x/tools/cmd/benchcmp/compare.go
deleted file mode 100644
index c3f5e89..0000000
--- a/vendor/golang.org/x/tools/cmd/benchcmp/compare.go
+++ /dev/null
@@ -1,156 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-import (
- "fmt"
- "math"
-
- "golang.org/x/tools/benchmark/parse"
-)
-
-// BenchCmp is a pair of benchmarks.
-type BenchCmp struct {
- Before *parse.Benchmark
- After *parse.Benchmark
-}
-
-// Correlate correlates benchmarks from two BenchSets.
-func Correlate(before, after parse.Set) (cmps []BenchCmp, warnings []string) {
- cmps = make([]BenchCmp, 0, len(after))
- for name, beforebb := range before {
- afterbb := after[name]
- if len(beforebb) != len(afterbb) {
- warnings = append(warnings, fmt.Sprintf("ignoring %s: before has %d instances, after has %d", name, len(beforebb), len(afterbb)))
- continue
- }
- for i, beforeb := range beforebb {
- afterb := afterbb[i]
- cmps = append(cmps, BenchCmp{beforeb, afterb})
- }
- }
- return
-}
-
-func (c BenchCmp) Name() string { return c.Before.Name }
-func (c BenchCmp) String() string { return fmt.Sprintf("<%s, %s>", c.Before, c.After) }
-func (c BenchCmp) Measured(flag int) bool { return (c.Before.Measured & c.After.Measured & flag) != 0 }
-func (c BenchCmp) DeltaNsPerOp() Delta { return Delta{c.Before.NsPerOp, c.After.NsPerOp} }
-func (c BenchCmp) DeltaMBPerS() Delta { return Delta{c.Before.MBPerS, c.After.MBPerS} }
-func (c BenchCmp) DeltaAllocedBytesPerOp() Delta {
- return Delta{float64(c.Before.AllocedBytesPerOp), float64(c.After.AllocedBytesPerOp)}
-}
-func (c BenchCmp) DeltaAllocsPerOp() Delta {
- return Delta{float64(c.Before.AllocsPerOp), float64(c.After.AllocsPerOp)}
-}
-
-// Delta is the before and after value for a benchmark measurement.
-// Both must be non-negative.
-type Delta struct {
- Before float64
- After float64
-}
-
-// mag calculates the magnitude of a change, regardless of the direction of
-// the change. mag is intended for sorting and has no independent meaning.
-func (d Delta) mag() float64 {
- switch {
- case d.Before != 0 && d.After != 0 && d.Before >= d.After:
- return d.After / d.Before
- case d.Before != 0 && d.After != 0 && d.Before < d.After:
- return d.Before / d.After
- case d.Before == 0 && d.After == 0:
- return 1
- default:
- // 0 -> 1 or 1 -> 0
- // These are significant changes and worth surfacing.
- return math.Inf(1)
- }
-}
-
-// Changed reports whether the benchmark quantities are different.
-func (d Delta) Changed() bool { return d.Before != d.After }
-
-// Float64 returns After / Before. If Before is 0, Float64 returns
-// 1 if After is also 0, and +Inf otherwise.
-func (d Delta) Float64() float64 {
- switch {
- case d.Before != 0:
- return d.After / d.Before
- case d.After == 0:
- return 1
- default:
- return math.Inf(1)
- }
-}
-
-// Percent formats a Delta as a percent change, ranging from -100% up.
-func (d Delta) Percent() string {
- return fmt.Sprintf("%+.2f%%", 100*d.Float64()-100)
-}
-
-// Multiple formats a Delta as a multiplier, ranging from 0.00x up.
-func (d Delta) Multiple() string {
- return fmt.Sprintf("%.2fx", d.Float64())
-}
-
-func (d Delta) String() string {
- return fmt.Sprintf("Δ(%f, %f)", d.Before, d.After)
-}
-
-// ByParseOrder sorts BenchCmps to match the order in
-// which the Before benchmarks were presented to Parse.
-type ByParseOrder []BenchCmp
-
-func (x ByParseOrder) Len() int { return len(x) }
-func (x ByParseOrder) Swap(i, j int) { x[i], x[j] = x[j], x[i] }
-func (x ByParseOrder) Less(i, j int) bool { return x[i].Before.Ord < x[j].Before.Ord }
-
-// lessByDelta provides lexicographic ordering:
-// * largest delta by magnitude
-// * alphabetic by name
-func lessByDelta(i, j BenchCmp, calcDelta func(BenchCmp) Delta) bool {
- iDelta, jDelta := calcDelta(i).mag(), calcDelta(j).mag()
- if iDelta != jDelta {
- return iDelta < jDelta
- }
- return i.Name() < j.Name()
-}
-
-// ByDeltaNsPerOp sorts BenchCmps lexicographically by change
-// in ns/op, descending, then by benchmark name.
-type ByDeltaNsPerOp []BenchCmp
-
-func (x ByDeltaNsPerOp) Len() int { return len(x) }
-func (x ByDeltaNsPerOp) Swap(i, j int) { x[i], x[j] = x[j], x[i] }
-func (x ByDeltaNsPerOp) Less(i, j int) bool { return lessByDelta(x[i], x[j], BenchCmp.DeltaNsPerOp) }
-
-// ByDeltaMBPerS sorts BenchCmps lexicographically by change
-// in MB/s, descending, then by benchmark name.
-type ByDeltaMBPerS []BenchCmp
-
-func (x ByDeltaMBPerS) Len() int { return len(x) }
-func (x ByDeltaMBPerS) Swap(i, j int) { x[i], x[j] = x[j], x[i] }
-func (x ByDeltaMBPerS) Less(i, j int) bool { return lessByDelta(x[i], x[j], BenchCmp.DeltaMBPerS) }
-
-// ByDeltaAllocedBytesPerOp sorts BenchCmps lexicographically by change
-// in B/op, descending, then by benchmark name.
-type ByDeltaAllocedBytesPerOp []BenchCmp
-
-func (x ByDeltaAllocedBytesPerOp) Len() int { return len(x) }
-func (x ByDeltaAllocedBytesPerOp) Swap(i, j int) { x[i], x[j] = x[j], x[i] }
-func (x ByDeltaAllocedBytesPerOp) Less(i, j int) bool {
- return lessByDelta(x[i], x[j], BenchCmp.DeltaAllocedBytesPerOp)
-}
-
-// ByDeltaAllocsPerOp sorts BenchCmps lexicographically by change
-// in allocs/op, descending, then by benchmark name.
-type ByDeltaAllocsPerOp []BenchCmp
-
-func (x ByDeltaAllocsPerOp) Len() int { return len(x) }
-func (x ByDeltaAllocsPerOp) Swap(i, j int) { x[i], x[j] = x[j], x[i] }
-func (x ByDeltaAllocsPerOp) Less(i, j int) bool {
- return lessByDelta(x[i], x[j], BenchCmp.DeltaAllocsPerOp)
-}
diff --git a/vendor/golang.org/x/tools/cmd/benchcmp/compare_test.go b/vendor/golang.org/x/tools/cmd/benchcmp/compare_test.go
deleted file mode 100644
index 3403796..0000000
--- a/vendor/golang.org/x/tools/cmd/benchcmp/compare_test.go
+++ /dev/null
@@ -1,133 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-import (
- "math"
- "reflect"
- "sort"
- "testing"
-
- "golang.org/x/tools/benchmark/parse"
-)
-
-func TestDelta(t *testing.T) {
- cases := []struct {
- before float64
- after float64
- mag float64
- f float64
- changed bool
- pct string
- mult string
- }{
- {before: 1, after: 1, mag: 1, f: 1, changed: false, pct: "+0.00%", mult: "1.00x"},
- {before: 1, after: 2, mag: 0.5, f: 2, changed: true, pct: "+100.00%", mult: "2.00x"},
- {before: 2, after: 1, mag: 0.5, f: 0.5, changed: true, pct: "-50.00%", mult: "0.50x"},
- {before: 0, after: 0, mag: 1, f: 1, changed: false, pct: "+0.00%", mult: "1.00x"},
- {before: 1, after: 0, mag: math.Inf(1), f: 0, changed: true, pct: "-100.00%", mult: "0.00x"},
- {before: 0, after: 1, mag: math.Inf(1), f: math.Inf(1), changed: true, pct: "+Inf%", mult: "+Infx"},
- }
- for _, tt := range cases {
- d := Delta{tt.before, tt.after}
- if want, have := tt.mag, d.mag(); want != have {
- t.Errorf("%s.mag(): want %f have %f", d, want, have)
- }
- if want, have := tt.f, d.Float64(); want != have {
- t.Errorf("%s.Float64(): want %f have %f", d, want, have)
- }
- if want, have := tt.changed, d.Changed(); want != have {
- t.Errorf("%s.Changed(): want %t have %t", d, want, have)
- }
- if want, have := tt.pct, d.Percent(); want != have {
- t.Errorf("%s.Percent(): want %q have %q", d, want, have)
- }
- if want, have := tt.mult, d.Multiple(); want != have {
- t.Errorf("%s.Multiple(): want %q have %q", d, want, have)
- }
- }
-}
-
-func TestCorrelate(t *testing.T) {
- // Benches that are going to be successfully correlated get N thus:
- // 0x
- // Read this: " of , from ".
- before := parse.Set{
- "BenchmarkOneEach": []*parse.Benchmark{{Name: "BenchmarkOneEach", N: 0x11b}},
- "BenchmarkOneToNone": []*parse.Benchmark{{Name: "BenchmarkOneToNone"}},
- "BenchmarkOneToTwo": []*parse.Benchmark{{Name: "BenchmarkOneToTwo"}},
- "BenchmarkTwoToOne": []*parse.Benchmark{
- {Name: "BenchmarkTwoToOne"},
- {Name: "BenchmarkTwoToOne"},
- },
- "BenchmarkTwoEach": []*parse.Benchmark{
- {Name: "BenchmarkTwoEach", N: 0x12b},
- {Name: "BenchmarkTwoEach", N: 0x22b},
- },
- }
-
- after := parse.Set{
- "BenchmarkOneEach": []*parse.Benchmark{{Name: "BenchmarkOneEach", N: 0x11a}},
- "BenchmarkNoneToOne": []*parse.Benchmark{{Name: "BenchmarkNoneToOne"}},
- "BenchmarkTwoToOne": []*parse.Benchmark{{Name: "BenchmarkTwoToOne"}},
- "BenchmarkOneToTwo": []*parse.Benchmark{
- {Name: "BenchmarkOneToTwo"},
- {Name: "BenchmarkOneToTwo"},
- },
- "BenchmarkTwoEach": []*parse.Benchmark{
- {Name: "BenchmarkTwoEach", N: 0x12a},
- {Name: "BenchmarkTwoEach", N: 0x22a},
- },
- }
-
- pairs, errs := Correlate(before, after)
-
- // Fail to match: BenchmarkOneToNone, BenchmarkOneToTwo, BenchmarkTwoToOne.
- // Correlate does not notice BenchmarkNoneToOne.
- if len(errs) != 3 {
- t.Errorf("Correlated expected 4 errors, got %d: %v", len(errs), errs)
- }
-
- // Want three correlated pairs: one BenchmarkOneEach, two BenchmarkTwoEach.
- if len(pairs) != 3 {
- t.Fatalf("Correlated expected 3 pairs, got %v", pairs)
- }
-
- for _, pair := range pairs {
- if pair.Before.N&0xF != 0xb {
- t.Errorf("unexpected Before in pair %s", pair)
- }
- if pair.After.N&0xF != 0xa {
- t.Errorf("unexpected After in pair %s", pair)
- }
- if pair.Before.N>>4 != pair.After.N>>4 {
- t.Errorf("mismatched pair %s", pair)
- }
- }
-}
-
-func TestBenchCmpSorting(t *testing.T) {
- c := []BenchCmp{
- {&parse.Benchmark{Name: "BenchmarkMuchFaster", NsPerOp: 10, Ord: 3}, &parse.Benchmark{Name: "BenchmarkMuchFaster", NsPerOp: 1}},
- {&parse.Benchmark{Name: "BenchmarkSameB", NsPerOp: 5, Ord: 1}, &parse.Benchmark{Name: "BenchmarkSameB", NsPerOp: 5}},
- {&parse.Benchmark{Name: "BenchmarkSameA", NsPerOp: 5, Ord: 2}, &parse.Benchmark{Name: "BenchmarkSameA", NsPerOp: 5}},
- {&parse.Benchmark{Name: "BenchmarkSlower", NsPerOp: 10, Ord: 0}, &parse.Benchmark{Name: "BenchmarkSlower", NsPerOp: 11}},
- }
-
- // Test just one magnitude-based sort order; they are symmetric.
- sort.Sort(ByDeltaNsPerOp(c))
- want := []string{"BenchmarkMuchFaster", "BenchmarkSlower", "BenchmarkSameA", "BenchmarkSameB"}
- have := []string{c[0].Name(), c[1].Name(), c[2].Name(), c[3].Name()}
- if !reflect.DeepEqual(want, have) {
- t.Errorf("ByDeltaNsOp incorrect sorting: want %v have %v", want, have)
- }
-
- sort.Sort(ByParseOrder(c))
- want = []string{"BenchmarkSlower", "BenchmarkSameB", "BenchmarkSameA", "BenchmarkMuchFaster"}
- have = []string{c[0].Name(), c[1].Name(), c[2].Name(), c[3].Name()}
- if !reflect.DeepEqual(want, have) {
- t.Errorf("ByParseOrder incorrect sorting: want %v have %v", want, have)
- }
-}
diff --git a/vendor/golang.org/x/tools/cmd/benchcmp/doc.go b/vendor/golang.org/x/tools/cmd/benchcmp/doc.go
deleted file mode 100644
index f5c7a36..0000000
--- a/vendor/golang.org/x/tools/cmd/benchcmp/doc.go
+++ /dev/null
@@ -1,37 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-/*
-
-The benchcmp command displays performance changes between benchmarks.
-
-Benchcmp parses the output of two 'go test' benchmark runs,
-correlates the results per benchmark, and displays the deltas.
-
-To measure the performance impact of a change, use 'go test'
-to run benchmarks before and after the change:
-
- go test -run=NONE -bench=. ./... > old.txt
- # make changes
- go test -run=NONE -bench=. ./... > new.txt
-
-Then feed the benchmark results to benchcmp:
-
- benchcmp old.txt new.txt
-
-Benchcmp will summarize and display the performance changes,
-in a format like this:
-
- $ benchcmp old.txt new.txt
- benchmark old ns/op new ns/op delta
- BenchmarkConcat 523 68.6 -86.88%
-
- benchmark old allocs new allocs delta
- BenchmarkConcat 3 1 -66.67%
-
- benchmark old bytes new bytes delta
- BenchmarkConcat 80 48 -40.00%
-
-*/
-package main // import "golang.org/x/tools/cmd/benchcmp"
diff --git a/vendor/golang.org/x/tools/cmd/bundle/.gitignore b/vendor/golang.org/x/tools/cmd/bundle/.gitignore
deleted file mode 100644
index caaeb09..0000000
--- a/vendor/golang.org/x/tools/cmd/bundle/.gitignore
+++ /dev/null
@@ -1 +0,0 @@
-testdata/out.got
diff --git a/vendor/golang.org/x/tools/cmd/bundle/main.go b/vendor/golang.org/x/tools/cmd/bundle/main.go
deleted file mode 100644
index 601da7f..0000000
--- a/vendor/golang.org/x/tools/cmd/bundle/main.go
+++ /dev/null
@@ -1,468 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Bundle creates a single-source-file version of a source package
-// suitable for inclusion in a particular target package.
-//
-// Usage:
-//
-// bundle [-o file] [-dst path] [-pkg name] [-prefix p] [-import old=new]
-//
-// The src argument specifies the import path of the package to bundle.
-// The bundling of a directory of source files into a single source file
-// necessarily imposes a number of constraints.
-// The package being bundled must not use cgo; must not use conditional
-// file compilation, whether with build tags or system-specific file names
-// like code_amd64.go; must not depend on any special comments, which
-// may not be preserved; must not use any assembly sources;
-// must not use renaming imports; and must not use reflection-based APIs
-// that depend on the specific names of types or struct fields.
-//
-// By default, bundle writes the bundled code to standard output.
-// If the -o argument is given, bundle writes to the named file
-// and also includes a ``//go:generate'' comment giving the exact
-// command line used, for regenerating the file with ``go generate.''
-//
-// Bundle customizes its output for inclusion in a particular package, the destination package.
-// By default bundle assumes the destination is the package in the current directory,
-// but the destination package can be specified explicitly using the -dst option,
-// which takes an import path as its argument.
-// If the source package imports the destination package, bundle will remove
-// those imports and rewrite any references to use direct references to the
-// corresponding symbols.
-// Bundle also must write a package declaration in the output and must
-// choose a name to use in that declaration.
-// If the -package option is given, bundle uses that name.
-// Otherwise, if the -dst option is given, bundle uses the last
-// element of the destination import path.
-// Otherwise, by default bundle uses the package name found in the
-// package sources in the current directory.
-//
-// To avoid collisions, bundle inserts a prefix at the beginning of
-// every package-level const, func, type, and var identifier in src's code,
-// updating references accordingly. The default prefix is the package name
-// of the source package followed by an underscore. The -prefix option
-// specifies an alternate prefix.
-//
-// Occasionally it is necessary to rewrite imports during the bundling
-// process. The -import option, which may be repeated, specifies that
-// an import of "old" should be rewritten to import "new" instead.
-//
-// Example
-//
-// Bundle archive/zip for inclusion in cmd/dist:
-//
-// cd $GOROOT/src/cmd/dist
-// bundle -o zip.go archive/zip
-//
-// Bundle golang.org/x/net/http2 for inclusion in net/http,
-// prefixing all identifiers by "http2" instead of "http2_",
-// and rewriting the import "golang.org/x/net/http2/hpack"
-// to "internal/golang.org/x/net/http2/hpack":
-//
-// cd $GOROOT/src/net/http
-// bundle -o h2_bundle.go \
-// -prefix http2 \
-// -import golang.org/x/net/http2/hpack=internal/golang.org/x/net/http2/hpack \
-// golang.org/x/net/http2
-//
-// Two ways to update the http2 bundle:
-//
-// go generate net/http
-//
-// cd $GOROOT/src/net/http
-// go generate
-//
-// Update both bundles, restricting ``go generate'' to running bundle commands:
-//
-// go generate -run bundle cmd/dist net/http
-//
-package main
-
-import (
- "bytes"
- "flag"
- "fmt"
- "go/ast"
- "go/build"
- "go/format"
- "go/parser"
- "go/printer"
- "go/token"
- "go/types"
- "io/ioutil"
- "log"
- "os"
- "path"
- "strconv"
- "strings"
-
- "golang.org/x/tools/go/loader"
-)
-
-var (
- outputFile = flag.String("o", "", "write output to `file` (default standard output)")
- dstPath = flag.String("dst", "", "set destination import `path` (default taken from current directory)")
- pkgName = flag.String("pkg", "", "set destination package `name` (default taken from current directory)")
- prefix = flag.String("prefix", "", "set bundled identifier prefix to `p` (default source package name + \"_\")")
- underscore = flag.Bool("underscore", false, "rewrite golang.org to golang_org in imports; temporary workaround for golang.org/issue/16333")
-
- importMap = map[string]string{}
-)
-
-func init() {
- flag.Var(flagFunc(addImportMap), "import", "rewrite import using `map`, of form old=new (can be repeated)")
-}
-
-func addImportMap(s string) {
- if strings.Count(s, "=") != 1 {
- log.Fatal("-import argument must be of the form old=new")
- }
- i := strings.Index(s, "=")
- old, new := s[:i], s[i+1:]
- if old == "" || new == "" {
- log.Fatal("-import argument must be of the form old=new; old and new must be non-empty")
- }
- importMap[old] = new
-}
-
-func usage() {
- fmt.Fprintf(os.Stderr, "Usage: bundle [options] \n")
- flag.PrintDefaults()
-}
-
-func main() {
- log.SetPrefix("bundle: ")
- log.SetFlags(0)
-
- flag.Usage = usage
- flag.Parse()
- args := flag.Args()
- if len(args) != 1 {
- usage()
- os.Exit(2)
- }
-
- if *dstPath != "" {
- if *pkgName == "" {
- *pkgName = path.Base(*dstPath)
- }
- } else {
- wd, _ := os.Getwd()
- pkg, err := build.ImportDir(wd, 0)
- if err != nil {
- log.Fatalf("cannot find package in current directory: %v", err)
- }
- *dstPath = pkg.ImportPath
- if *pkgName == "" {
- *pkgName = pkg.Name
- }
- }
-
- code, err := bundle(args[0], *dstPath, *pkgName, *prefix)
- if err != nil {
- log.Fatal(err)
- }
- if *outputFile != "" {
- err := ioutil.WriteFile(*outputFile, code, 0666)
- if err != nil {
- log.Fatal(err)
- }
- } else {
- _, err := os.Stdout.Write(code)
- if err != nil {
- log.Fatal(err)
- }
- }
-}
-
-// isStandardImportPath is copied from cmd/go in the standard library.
-func isStandardImportPath(path string) bool {
- i := strings.Index(path, "/")
- if i < 0 {
- i = len(path)
- }
- elem := path[:i]
- return !strings.Contains(elem, ".")
-}
-
-var ctxt = &build.Default
-
-func bundle(src, dst, dstpkg, prefix string) ([]byte, error) {
- // Load the initial package.
- conf := loader.Config{ParserMode: parser.ParseComments, Build: ctxt}
- conf.TypeCheckFuncBodies = func(p string) bool { return p == src }
- conf.Import(src)
-
- lprog, err := conf.Load()
- if err != nil {
- return nil, err
- }
-
- // Because there was a single Import call and Load succeeded,
- // InitialPackages is guaranteed to hold the sole requested package.
- info := lprog.InitialPackages()[0]
- if prefix == "" {
- pkgName := info.Files[0].Name.Name
- prefix = pkgName + "_"
- }
-
- objsToUpdate := make(map[types.Object]bool)
- var rename func(from types.Object)
- rename = func(from types.Object) {
- if !objsToUpdate[from] {
- objsToUpdate[from] = true
-
- // Renaming a type that is used as an embedded field
- // requires renaming the field too. e.g.
- // type T int // if we rename this to U..
- // var s struct {T}
- // print(s.T) // ...this must change too
- if _, ok := from.(*types.TypeName); ok {
- for id, obj := range info.Uses {
- if obj == from {
- if field := info.Defs[id]; field != nil {
- rename(field)
- }
- }
- }
- }
- }
- }
-
- // Rename each package-level object.
- scope := info.Pkg.Scope()
- for _, name := range scope.Names() {
- rename(scope.Lookup(name))
- }
-
- var out bytes.Buffer
-
- fmt.Fprintf(&out, "// Code generated by golang.org/x/tools/cmd/bundle. DO NOT EDIT.\n")
- if *outputFile != "" {
- fmt.Fprintf(&out, "//go:generate bundle %s\n", strings.Join(os.Args[1:], " "))
- } else {
- fmt.Fprintf(&out, "// $ bundle %s\n", strings.Join(os.Args[1:], " "))
- }
- fmt.Fprintf(&out, "\n")
-
- // Concatenate package comments from all files...
- for _, f := range info.Files {
- if doc := f.Doc.Text(); strings.TrimSpace(doc) != "" {
- for _, line := range strings.Split(doc, "\n") {
- fmt.Fprintf(&out, "// %s\n", line)
- }
- }
- }
- // ...but don't let them become the actual package comment.
- fmt.Fprintln(&out)
-
- fmt.Fprintf(&out, "package %s\n\n", dstpkg)
-
- // BUG(adonovan,shurcooL): bundle may generate incorrect code
- // due to shadowing between identifiers and imported package names.
- //
- // The generated code will either fail to compile or
- // (unlikely) compile successfully but have different behavior
- // than the original package. The risk of this happening is higher
- // when the original package has renamed imports (they're typically
- // renamed in order to resolve a shadow inside that particular .go file).
-
- // TODO(adonovan,shurcooL):
- // - detect shadowing issues, and either return error or resolve them
- // - preserve comments from the original import declarations.
-
- // pkgStd and pkgExt are sets of printed import specs. This is done
- // to deduplicate instances of the same import name and path.
- var pkgStd = make(map[string]bool)
- var pkgExt = make(map[string]bool)
- for _, f := range info.Files {
- for _, imp := range f.Imports {
- path, err := strconv.Unquote(imp.Path.Value)
- if err != nil {
- log.Fatalf("invalid import path string: %v", err) // Shouldn't happen here since conf.Load succeeded.
- }
- if path == dst {
- continue
- }
- if newPath, ok := importMap[path]; ok {
- path = newPath
- }
-
- var name string
- if imp.Name != nil {
- name = imp.Name.Name
- }
- spec := fmt.Sprintf("%s %q", name, path)
- if isStandardImportPath(path) {
- pkgStd[spec] = true
- } else {
- if *underscore {
- spec = strings.Replace(spec, "golang.org/", "golang_org/", 1)
- }
- pkgExt[spec] = true
- }
- }
- }
-
- // Print a single declaration that imports all necessary packages.
- fmt.Fprintln(&out, "import (")
- for p := range pkgStd {
- fmt.Fprintf(&out, "\t%s\n", p)
- }
- if len(pkgExt) > 0 {
- fmt.Fprintln(&out)
- }
- for p := range pkgExt {
- fmt.Fprintf(&out, "\t%s\n", p)
- }
- fmt.Fprint(&out, ")\n\n")
-
- // Modify and print each file.
- for _, f := range info.Files {
- // Update renamed identifiers.
- for id, obj := range info.Defs {
- if objsToUpdate[obj] {
- id.Name = prefix + obj.Name()
- }
- }
- for id, obj := range info.Uses {
- if objsToUpdate[obj] {
- id.Name = prefix + obj.Name()
- }
- }
-
- // For each qualified identifier that refers to the
- // destination package, remove the qualifier.
- // The "@@@." strings are removed in postprocessing.
- ast.Inspect(f, func(n ast.Node) bool {
- if sel, ok := n.(*ast.SelectorExpr); ok {
- if id, ok := sel.X.(*ast.Ident); ok {
- if obj, ok := info.Uses[id].(*types.PkgName); ok {
- if obj.Imported().Path() == dst {
- id.Name = "@@@"
- }
- }
- }
- }
- return true
- })
-
- last := f.Package
- if len(f.Imports) > 0 {
- imp := f.Imports[len(f.Imports)-1]
- last = imp.End()
- if imp.Comment != nil {
- if e := imp.Comment.End(); e > last {
- last = e
- }
- }
- }
-
- // Pretty-print package-level declarations.
- // but no package or import declarations.
- var buf bytes.Buffer
- for _, decl := range f.Decls {
- if decl, ok := decl.(*ast.GenDecl); ok && decl.Tok == token.IMPORT {
- continue
- }
-
- beg, end := sourceRange(decl)
-
- printComments(&out, f.Comments, last, beg)
-
- buf.Reset()
- format.Node(&buf, lprog.Fset, &printer.CommentedNode{Node: decl, Comments: f.Comments})
- // Remove each "@@@." in the output.
- // TODO(adonovan): not hygienic.
- out.Write(bytes.Replace(buf.Bytes(), []byte("@@@."), nil, -1))
-
- last = printSameLineComment(&out, f.Comments, lprog.Fset, end)
-
- out.WriteString("\n\n")
- }
-
- printLastComments(&out, f.Comments, last)
- }
-
- // Now format the entire thing.
- result, err := format.Source(out.Bytes())
- if err != nil {
- log.Fatalf("formatting failed: %v", err)
- }
-
- return result, nil
-}
-
-// sourceRange returns the [beg, end) interval of source code
-// belonging to decl (incl. associated comments).
-func sourceRange(decl ast.Decl) (beg, end token.Pos) {
- beg = decl.Pos()
- end = decl.End()
-
- var doc, com *ast.CommentGroup
-
- switch d := decl.(type) {
- case *ast.GenDecl:
- doc = d.Doc
- if len(d.Specs) > 0 {
- switch spec := d.Specs[len(d.Specs)-1].(type) {
- case *ast.ValueSpec:
- com = spec.Comment
- case *ast.TypeSpec:
- com = spec.Comment
- }
- }
- case *ast.FuncDecl:
- doc = d.Doc
- }
-
- if doc != nil {
- beg = doc.Pos()
- }
- if com != nil && com.End() > end {
- end = com.End()
- }
-
- return beg, end
-}
-
-func printComments(out *bytes.Buffer, comments []*ast.CommentGroup, pos, end token.Pos) {
- for _, cg := range comments {
- if pos <= cg.Pos() && cg.Pos() < end {
- for _, c := range cg.List {
- fmt.Fprintln(out, c.Text)
- }
- fmt.Fprintln(out)
- }
- }
-}
-
-const infinity = 1 << 30
-
-func printLastComments(out *bytes.Buffer, comments []*ast.CommentGroup, pos token.Pos) {
- printComments(out, comments, pos, infinity)
-}
-
-func printSameLineComment(out *bytes.Buffer, comments []*ast.CommentGroup, fset *token.FileSet, pos token.Pos) token.Pos {
- tf := fset.File(pos)
- for _, cg := range comments {
- if pos <= cg.Pos() && tf.Line(cg.Pos()) == tf.Line(pos) {
- for _, c := range cg.List {
- fmt.Fprintln(out, c.Text)
- }
- return cg.End()
- }
- }
- return pos
-}
-
-type flagFunc func(string)
-
-func (f flagFunc) Set(s string) error {
- f(s)
- return nil
-}
-
-func (f flagFunc) String() string { return "" }
diff --git a/vendor/golang.org/x/tools/cmd/bundle/main_test.go b/vendor/golang.org/x/tools/cmd/bundle/main_test.go
deleted file mode 100644
index b96f7d9..0000000
--- a/vendor/golang.org/x/tools/cmd/bundle/main_test.go
+++ /dev/null
@@ -1,74 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build go1.9
-
-package main
-
-import (
- "bytes"
- "io/ioutil"
- "os"
- "os/exec"
- "runtime"
- "testing"
-
- "golang.org/x/tools/go/buildutil"
-)
-
-func TestBundle(t *testing.T) {
- load := func(name string) string {
- data, err := ioutil.ReadFile(name)
- if err != nil {
- t.Fatal(err)
- }
- return string(data)
- }
-
- ctxt = buildutil.FakeContext(map[string]map[string]string{
- "initial": {
- "a.go": load("testdata/src/initial/a.go"),
- "b.go": load("testdata/src/initial/b.go"),
- "c.go": load("testdata/src/initial/c.go"),
- },
- "domain.name/importdecl": {
- "p.go": load("testdata/src/domain.name/importdecl/p.go"),
- },
- "fmt": {
- "print.go": `package fmt; func Println(...interface{})`,
- },
- })
-
- os.Args = os.Args[:1] // avoid e.g. -test=short in the output
- out, err := bundle("initial", "github.com/dest", "dest", "prefix")
- if err != nil {
- t.Fatal(err)
- }
- if got, want := string(out), load("testdata/out.golden"); got != want {
- t.Errorf("-- got --\n%s\n-- want --\n%s\n-- diff --", got, want)
-
- if err := ioutil.WriteFile("testdata/out.got", out, 0644); err != nil {
- t.Fatal(err)
- }
- t.Log(diff("testdata/out.golden", "testdata/out.got"))
- }
-}
-
-func diff(a, b string) string {
- var cmd *exec.Cmd
- switch runtime.GOOS {
- case "plan9":
- cmd = exec.Command("/bin/diff", "-c", a, b)
- default:
- cmd = exec.Command("/usr/bin/diff", "-u", a, b)
- }
- var out bytes.Buffer
- cmd.Stdout = &out
- cmd.Stderr = &out
- cmd.Run() // nonzero exit is expected
- if out.Len() == 0 {
- return "(failed to compute diff)"
- }
- return out.String()
-}
diff --git a/vendor/golang.org/x/tools/cmd/bundle/testdata/out.golden b/vendor/golang.org/x/tools/cmd/bundle/testdata/out.golden
deleted file mode 100644
index 5260fdd..0000000
--- a/vendor/golang.org/x/tools/cmd/bundle/testdata/out.golden
+++ /dev/null
@@ -1,62 +0,0 @@
-// Code generated by golang.org/x/tools/cmd/bundle. DO NOT EDIT.
-// $ bundle
-
-// The package doc comment
-//
-
-package dest
-
-import (
- "fmt"
- . "fmt"
- _ "fmt"
- renamedfmt "fmt"
- renamedfmt2 "fmt"
-
- "domain.name/importdecl"
-)
-
-// init functions are not renamed
-func init() { prefixfoo() }
-
-// Type S.
-type prefixS struct {
- prefixt
- u int
-} /* multi-line
-comment
-*/
-
-// non-associated comment
-
-/*
- non-associated comment2
-*/
-
-// Function bar.
-func prefixbar(s *prefixS) {
- fmt.Println(s.prefixt, s.u) // comment inside function
-}
-
-// file-end comment
-
-type prefixt int // type1
-
-// const1
-const prefixc = 1 // const2
-
-func prefixfoo() {
- fmt.Println(importdecl.F())
-}
-
-// zinit
-const (
- prefixz1 = iota // z1
- prefixz2 // z2
-) // zend
-
-func prefixbaz() {
- renamedfmt.Println()
- renamedfmt2.Println()
- Println()
-}
diff --git a/vendor/golang.org/x/tools/cmd/bundle/testdata/src/domain.name/importdecl/p.go b/vendor/golang.org/x/tools/cmd/bundle/testdata/src/domain.name/importdecl/p.go
deleted file mode 100644
index 36dfd15..0000000
--- a/vendor/golang.org/x/tools/cmd/bundle/testdata/src/domain.name/importdecl/p.go
+++ /dev/null
@@ -1,3 +0,0 @@
-package importdecl
-
-func F() int { return 1 }
diff --git a/vendor/golang.org/x/tools/cmd/bundle/testdata/src/initial/a.go b/vendor/golang.org/x/tools/cmd/bundle/testdata/src/initial/a.go
deleted file mode 100644
index ded6c64..0000000
--- a/vendor/golang.org/x/tools/cmd/bundle/testdata/src/initial/a.go
+++ /dev/null
@@ -1,27 +0,0 @@
-package initial
-
-import "fmt" // this comment should not be visible
-
-// init functions are not renamed
-func init() { foo() }
-
-// Type S.
-type S struct {
- t
- u int
-} /* multi-line
-comment
-*/
-
-// non-associated comment
-
-/*
- non-associated comment2
-*/
-
-// Function bar.
-func bar(s *S) {
- fmt.Println(s.t, s.u) // comment inside function
-}
-
-// file-end comment
diff --git a/vendor/golang.org/x/tools/cmd/bundle/testdata/src/initial/b.go b/vendor/golang.org/x/tools/cmd/bundle/testdata/src/initial/b.go
deleted file mode 100644
index 31d5cab..0000000
--- a/vendor/golang.org/x/tools/cmd/bundle/testdata/src/initial/b.go
+++ /dev/null
@@ -1,23 +0,0 @@
-// The package doc comment
-package initial
-
-import (
- "fmt"
-
- "domain.name/importdecl"
-)
-
-type t int // type1
-
-// const1
-const c = 1 // const2
-
-func foo() {
- fmt.Println(importdecl.F())
-}
-
-// zinit
-const (
- z1 = iota // z1
- z2 // z2
-) // zend
diff --git a/vendor/golang.org/x/tools/cmd/bundle/testdata/src/initial/c.go b/vendor/golang.org/x/tools/cmd/bundle/testdata/src/initial/c.go
deleted file mode 100644
index 6a9cbc6..0000000
--- a/vendor/golang.org/x/tools/cmd/bundle/testdata/src/initial/c.go
+++ /dev/null
@@ -1,12 +0,0 @@
-package initial
-
-import _ "fmt"
-import renamedfmt "fmt"
-import renamedfmt2 "fmt"
-import . "fmt"
-
-func baz() {
- renamedfmt.Println()
- renamedfmt2.Println()
- Println()
-}
diff --git a/vendor/golang.org/x/tools/cmd/callgraph/main.go b/vendor/golang.org/x/tools/cmd/callgraph/main.go
deleted file mode 100644
index 8ef4597..0000000
--- a/vendor/golang.org/x/tools/cmd/callgraph/main.go
+++ /dev/null
@@ -1,361 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// callgraph: a tool for reporting the call graph of a Go program.
-// See Usage for details, or run with -help.
-package main // import "golang.org/x/tools/cmd/callgraph"
-
-// TODO(adonovan):
-//
-// Features:
-// - restrict graph to a single package
-// - output
-// - functions reachable from root (use digraph tool?)
-// - unreachable functions (use digraph tool?)
-// - dynamic (runtime) types
-// - indexed output (numbered nodes)
-// - JSON output
-// - additional template fields:
-// callee file/line/col
-
-import (
- "bufio"
- "bytes"
- "flag"
- "fmt"
- "go/build"
- "go/token"
- "io"
- "log"
- "os"
- "runtime"
- "text/template"
-
- "golang.org/x/tools/go/buildutil"
- "golang.org/x/tools/go/callgraph"
- "golang.org/x/tools/go/callgraph/cha"
- "golang.org/x/tools/go/callgraph/rta"
- "golang.org/x/tools/go/callgraph/static"
- "golang.org/x/tools/go/loader"
- "golang.org/x/tools/go/pointer"
- "golang.org/x/tools/go/ssa"
- "golang.org/x/tools/go/ssa/ssautil"
-)
-
-// flags
-var (
- algoFlag = flag.String("algo", "rta",
- `Call graph construction algorithm (static, cha, rta, pta)`)
-
- testFlag = flag.Bool("test", false,
- "Loads test code (*_test.go) for imported packages")
-
- formatFlag = flag.String("format",
- "{{.Caller}}\t--{{.Dynamic}}-{{.Line}}:{{.Column}}-->\t{{.Callee}}",
- "A template expression specifying how to format an edge")
-
- ptalogFlag = flag.String("ptalog", "",
- "Location of the points-to analysis log file, or empty to disable logging.")
-)
-
-func init() {
- flag.Var((*buildutil.TagsFlag)(&build.Default.BuildTags), "tags", buildutil.TagsFlagDoc)
-}
-
-const Usage = `callgraph: display the the call graph of a Go program.
-
-Usage:
-
- callgraph [-algo=static|cha|rta|pta] [-test] [-format=...] ...
-
-Flags:
-
--algo Specifies the call-graph construction algorithm, one of:
-
- static static calls only (unsound)
- cha Class Hierarchy Analysis
- rta Rapid Type Analysis
- pta inclusion-based Points-To Analysis
-
- The algorithms are ordered by increasing precision in their
- treatment of dynamic calls (and thus also computational cost).
- RTA and PTA require a whole program (main or test), and
- include only functions reachable from main.
-
--test Include the package's tests in the analysis.
-
--format Specifies the format in which each call graph edge is displayed.
- One of:
-
- digraph output suitable for input to
- golang.org/x/tools/cmd/digraph.
- graphviz output in AT&T GraphViz (.dot) format.
-
- All other values are interpreted using text/template syntax.
- The default value is:
-
- {{.Caller}}\t--{{.Dynamic}}-{{.Line}}:{{.Column}}-->\t{{.Callee}}
-
- The structure passed to the template is (effectively):
-
- type Edge struct {
- Caller *ssa.Function // calling function
- Callee *ssa.Function // called function
-
- // Call site:
- Filename string // containing file
- Offset int // offset within file of '('
- Line int // line number
- Column int // column number of call
- Dynamic string // "static" or "dynamic"
- Description string // e.g. "static method call"
- }
-
- Caller and Callee are *ssa.Function values, which print as
- "(*sync/atomic.Mutex).Lock", but other attributes may be
- derived from them, e.g. Caller.Pkg.Pkg.Path yields the
- import path of the enclosing package. Consult the go/ssa
- API documentation for details.
-
-` + loader.FromArgsUsage + `
-
-Examples:
-
- Show the call graph of the trivial web server application:
-
- callgraph -format digraph $GOROOT/src/net/http/triv.go
-
- Same, but show only the packages of each function:
-
- callgraph -format '{{.Caller.Pkg.Pkg.Path}} -> {{.Callee.Pkg.Pkg.Path}}' \
- $GOROOT/src/net/http/triv.go | sort | uniq
-
- Show functions that make dynamic calls into the 'fmt' test package,
- using the pointer analysis algorithm:
-
- callgraph -format='{{.Caller}} -{{.Dynamic}}-> {{.Callee}}' -test -algo=pta fmt |
- sed -ne 's/-dynamic-/--/p' |
- sed -ne 's/-->.*fmt_test.*$//p' | sort | uniq
-
- Show all functions directly called by the callgraph tool's main function:
-
- callgraph -format=digraph golang.org/x/tools/cmd/callgraph |
- digraph succs golang.org/x/tools/cmd/callgraph.main
-`
-
-func init() {
- // If $GOMAXPROCS isn't set, use the full capacity of the machine.
- // For small machines, use at least 4 threads.
- if os.Getenv("GOMAXPROCS") == "" {
- n := runtime.NumCPU()
- if n < 4 {
- n = 4
- }
- runtime.GOMAXPROCS(n)
- }
-}
-
-func main() {
- flag.Parse()
- if err := doCallgraph(&build.Default, *algoFlag, *formatFlag, *testFlag, flag.Args()); err != nil {
- fmt.Fprintf(os.Stderr, "callgraph: %s\n", err)
- os.Exit(1)
- }
-}
-
-var stdout io.Writer = os.Stdout
-
-func doCallgraph(ctxt *build.Context, algo, format string, tests bool, args []string) error {
- conf := loader.Config{Build: ctxt}
-
- if len(args) == 0 {
- fmt.Fprintln(os.Stderr, Usage)
- return nil
- }
-
- // Use the initial packages from the command line.
- _, err := conf.FromArgs(args, tests)
- if err != nil {
- return err
- }
-
- // Load, parse and type-check the whole program.
- iprog, err := conf.Load()
- if err != nil {
- return err
- }
-
- // Create and build SSA-form program representation.
- prog := ssautil.CreateProgram(iprog, 0)
- prog.Build()
-
- // -- call graph construction ------------------------------------------
-
- var cg *callgraph.Graph
-
- switch algo {
- case "static":
- cg = static.CallGraph(prog)
-
- case "cha":
- cg = cha.CallGraph(prog)
-
- case "pta":
- // Set up points-to analysis log file.
- var ptalog io.Writer
- if *ptalogFlag != "" {
- if f, err := os.Create(*ptalogFlag); err != nil {
- log.Fatalf("Failed to create PTA log file: %s", err)
- } else {
- buf := bufio.NewWriter(f)
- ptalog = buf
- defer func() {
- if err := buf.Flush(); err != nil {
- log.Printf("flush: %s", err)
- }
- if err := f.Close(); err != nil {
- log.Printf("close: %s", err)
- }
- }()
- }
- }
-
- mains, err := mainPackages(prog, tests)
- if err != nil {
- return err
- }
- config := &pointer.Config{
- Mains: mains,
- BuildCallGraph: true,
- Log: ptalog,
- }
- ptares, err := pointer.Analyze(config)
- if err != nil {
- return err // internal error in pointer analysis
- }
- cg = ptares.CallGraph
-
- case "rta":
- mains, err := mainPackages(prog, tests)
- if err != nil {
- return err
- }
- var roots []*ssa.Function
- for _, main := range mains {
- roots = append(roots, main.Func("init"), main.Func("main"))
- }
- rtares := rta.Analyze(roots, true)
- cg = rtares.CallGraph
-
- // NB: RTA gives us Reachable and RuntimeTypes too.
-
- default:
- return fmt.Errorf("unknown algorithm: %s", algo)
- }
-
- cg.DeleteSyntheticNodes()
-
- // -- output------------------------------------------------------------
-
- var before, after string
-
- // Pre-canned formats.
- switch format {
- case "digraph":
- format = `{{printf "%q %q" .Caller .Callee}}`
-
- case "graphviz":
- before = "digraph callgraph {\n"
- after = "}\n"
- format = ` {{printf "%q" .Caller}} -> {{printf "%q" .Callee}}`
- }
-
- tmpl, err := template.New("-format").Parse(format)
- if err != nil {
- return fmt.Errorf("invalid -format template: %v", err)
- }
-
- // Allocate these once, outside the traversal.
- var buf bytes.Buffer
- data := Edge{fset: prog.Fset}
-
- fmt.Fprint(stdout, before)
- if err := callgraph.GraphVisitEdges(cg, func(edge *callgraph.Edge) error {
- data.position.Offset = -1
- data.edge = edge
- data.Caller = edge.Caller.Func
- data.Callee = edge.Callee.Func
-
- buf.Reset()
- if err := tmpl.Execute(&buf, &data); err != nil {
- return err
- }
- stdout.Write(buf.Bytes())
- if len := buf.Len(); len == 0 || buf.Bytes()[len-1] != '\n' {
- fmt.Fprintln(stdout)
- }
- return nil
- }); err != nil {
- return err
- }
- fmt.Fprint(stdout, after)
- return nil
-}
-
-// mainPackages returns the main packages to analyze.
-// Each resulting package is named "main" and has a main function.
-func mainPackages(prog *ssa.Program, tests bool) ([]*ssa.Package, error) {
- pkgs := prog.AllPackages() // TODO(adonovan): use only initial packages
-
- // If tests, create a "testmain" package for each test.
- var mains []*ssa.Package
- if tests {
- for _, pkg := range pkgs {
- if main := prog.CreateTestMainPackage(pkg); main != nil {
- mains = append(mains, main)
- }
- }
- if mains == nil {
- return nil, fmt.Errorf("no tests")
- }
- return mains, nil
- }
-
- // Otherwise, use the main packages.
- mains = append(mains, ssautil.MainPackages(pkgs)...)
- if len(mains) == 0 {
- return nil, fmt.Errorf("no main packages")
- }
- return mains, nil
-}
-
-type Edge struct {
- Caller *ssa.Function
- Callee *ssa.Function
-
- edge *callgraph.Edge
- fset *token.FileSet
- position token.Position // initialized lazily
-}
-
-func (e *Edge) pos() *token.Position {
- if e.position.Offset == -1 {
- e.position = e.fset.Position(e.edge.Pos()) // called lazily
- }
- return &e.position
-}
-
-func (e *Edge) Filename() string { return e.pos().Filename }
-func (e *Edge) Column() int { return e.pos().Column }
-func (e *Edge) Line() int { return e.pos().Line }
-func (e *Edge) Offset() int { return e.pos().Offset }
-
-func (e *Edge) Dynamic() string {
- if e.edge.Site != nil && e.edge.Site.Common().StaticCallee() == nil {
- return "dynamic"
- }
- return "static"
-}
-
-func (e *Edge) Description() string { return e.edge.Description() }
diff --git a/vendor/golang.org/x/tools/cmd/callgraph/main_test.go b/vendor/golang.org/x/tools/cmd/callgraph/main_test.go
deleted file mode 100644
index c42f56d..0000000
--- a/vendor/golang.org/x/tools/cmd/callgraph/main_test.go
+++ /dev/null
@@ -1,81 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// No testdata on Android.
-
-// +build !android
-
-package main
-
-import (
- "bytes"
- "fmt"
- "go/build"
- "reflect"
- "sort"
- "strings"
- "testing"
-)
-
-func TestCallgraph(t *testing.T) {
- ctxt := build.Default // copy
- ctxt.GOPATH = "testdata"
-
- const format = "{{.Caller}} --> {{.Callee}}"
-
- for _, test := range []struct {
- algo, format string
- tests bool
- want []string
- }{
- {"rta", format, false, []string{
- // rta imprecisely shows cross product of {main,main2} x {C,D}
- `pkg.main --> (pkg.C).f`,
- `pkg.main --> (pkg.D).f`,
- `pkg.main --> pkg.main2`,
- `pkg.main2 --> (pkg.C).f`,
- `pkg.main2 --> (pkg.D).f`,
- }},
- {"pta", format, false, []string{
- // pta distinguishes main->C, main2->D. Also has a root node.
- ` --> pkg.init`,
- ` --> pkg.main`,
- `pkg.main --> (pkg.C).f`,
- `pkg.main --> pkg.main2`,
- `pkg.main2 --> (pkg.D).f`,
- }},
- // tests: main is not called.
- {"rta", format, true, []string{
- `pkg$testmain.init --> pkg.init`,
- `pkg.Example --> (pkg.C).f`,
- }},
- {"pta", format, true, []string{
- ` --> pkg$testmain.init`,
- ` --> pkg.Example`,
- `pkg$testmain.init --> pkg.init`,
- `pkg.Example --> (pkg.C).f`,
- }},
- } {
- stdout = new(bytes.Buffer)
- if err := doCallgraph(&ctxt, test.algo, test.format, test.tests, []string{"pkg"}); err != nil {
- t.Error(err)
- continue
- }
-
- got := sortedLines(fmt.Sprint(stdout))
- if !reflect.DeepEqual(got, test.want) {
- t.Errorf("callgraph(%q, %q, %t):\ngot:\n%s\nwant:\n%s",
- test.algo, test.format, test.tests,
- strings.Join(got, "\n"),
- strings.Join(test.want, "\n"))
- }
- }
-}
-
-func sortedLines(s string) []string {
- s = strings.TrimSpace(s)
- lines := strings.Split(s, "\n")
- sort.Strings(lines)
- return lines
-}
diff --git a/vendor/golang.org/x/tools/cmd/callgraph/testdata/src/pkg/pkg.go b/vendor/golang.org/x/tools/cmd/callgraph/testdata/src/pkg/pkg.go
deleted file mode 100644
index b81c97f..0000000
--- a/vendor/golang.org/x/tools/cmd/callgraph/testdata/src/pkg/pkg.go
+++ /dev/null
@@ -1,25 +0,0 @@
-package main
-
-type I interface {
- f()
-}
-
-type C int
-
-func (C) f() {}
-
-type D int
-
-func (D) f() {}
-
-func main() {
- var i I = C(0)
- i.f() // dynamic call
-
- main2()
-}
-
-func main2() {
- var i I = D(0)
- i.f() // dynamic call
-}
diff --git a/vendor/golang.org/x/tools/cmd/callgraph/testdata/src/pkg/pkg_test.go b/vendor/golang.org/x/tools/cmd/callgraph/testdata/src/pkg/pkg_test.go
deleted file mode 100644
index d624757..0000000
--- a/vendor/golang.org/x/tools/cmd/callgraph/testdata/src/pkg/pkg_test.go
+++ /dev/null
@@ -1,7 +0,0 @@
-package main
-
-// Don't import "testing", it adds a lot of callgraph edges.
-
-func Example() {
- C(0).f()
-}
diff --git a/vendor/golang.org/x/tools/cmd/compilebench/main.go b/vendor/golang.org/x/tools/cmd/compilebench/main.go
deleted file mode 100644
index d2cd70b..0000000
--- a/vendor/golang.org/x/tools/cmd/compilebench/main.go
+++ /dev/null
@@ -1,360 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Compilebench benchmarks the speed of the Go compiler.
-//
-// Usage:
-//
-// compilebench [options]
-//
-// It times the compilation of various packages and prints results in
-// the format used by package testing (and expected by golang.org/x/perf/cmd/benchstat).
-//
-// The options are:
-//
-// -alloc
-// Report allocations.
-//
-// -compile exe
-// Use exe as the path to the cmd/compile binary.
-//
-// -compileflags 'list'
-// Pass the space-separated list of flags to the compilation.
-//
-// -count n
-// Run each benchmark n times (default 1).
-//
-// -cpuprofile file
-// Write a CPU profile of the compiler to file.
-//
-// -memprofile file
-// Write a memory profile of the compiler to file.
-//
-// -memprofilerate rate
-// Set runtime.MemProfileRate during compilation.
-//
-// -obj
-// Report object file statistics.
-//
-// -pkg
-// Benchmark compiling a single package.
-//
-// -run regexp
-// Only run benchmarks with names matching regexp.
-//
-// Although -cpuprofile and -memprofile are intended to write a
-// combined profile for all the executed benchmarks to file,
-// today they write only the profile for the last benchmark executed.
-//
-// The default memory profiling rate is one profile sample per 512 kB
-// allocated (see ``go doc runtime.MemProfileRate'').
-// Lowering the rate (for example, -memprofilerate 64000) produces
-// a more fine-grained and therefore accurate profile, but it also incurs
-// execution cost. For benchmark comparisons, never use timings
-// obtained with a low -memprofilerate option.
-//
-// Example
-//
-// Assuming the base version of the compiler has been saved with
-// ``toolstash save,'' this sequence compares the old and new compiler:
-//
-// compilebench -count 10 -compile $(toolstash -n compile) >old.txt
-// compilebench -count 10 >new.txt
-// benchstat old.txt new.txt
-//
-package main
-
-import (
- "bytes"
- "flag"
- "fmt"
- "go/build"
- "io/ioutil"
- "log"
- "os"
- "os/exec"
- "path/filepath"
- "regexp"
- "strconv"
- "strings"
- "time"
-)
-
-var (
- goroot string
- compiler string
- runRE *regexp.Regexp
- is6g bool
-)
-
-var (
- flagGoCmd = flag.String("go", "go", "path to \"go\" command")
- flagAlloc = flag.Bool("alloc", false, "report allocations")
- flagObj = flag.Bool("obj", false, "report object file stats")
- flagCompiler = flag.String("compile", "", "use `exe` as the cmd/compile binary")
- flagCompilerFlags = flag.String("compileflags", "", "additional `flags` to pass to compile")
- flagRun = flag.String("run", "", "run benchmarks matching `regexp`")
- flagCount = flag.Int("count", 1, "run benchmarks `n` times")
- flagCpuprofile = flag.String("cpuprofile", "", "write CPU profile to `file`")
- flagMemprofile = flag.String("memprofile", "", "write memory profile to `file`")
- flagMemprofilerate = flag.Int64("memprofilerate", -1, "set memory profile `rate`")
- flagPackage = flag.String("pkg", "", "if set, benchmark the package at path `pkg`")
- flagShort = flag.Bool("short", false, "skip long-running benchmarks")
-)
-
-var tests = []struct {
- name string
- dir string
- long bool
-}{
- {"BenchmarkTemplate", "html/template", false},
- {"BenchmarkUnicode", "unicode", false},
- {"BenchmarkGoTypes", "go/types", false},
- {"BenchmarkCompiler", "cmd/compile/internal/gc", false},
- {"BenchmarkSSA", "cmd/compile/internal/ssa", false},
- {"BenchmarkFlate", "compress/flate", false},
- {"BenchmarkGoParser", "go/parser", false},
- {"BenchmarkReflect", "reflect", false},
- {"BenchmarkTar", "archive/tar", false},
- {"BenchmarkXML", "encoding/xml", false},
- {"BenchmarkStdCmd", "", true},
- {"BenchmarkHelloSize", "", false},
- {"BenchmarkCmdGoSize", "", true},
-}
-
-func usage() {
- fmt.Fprintf(os.Stderr, "usage: compilebench [options]\n")
- fmt.Fprintf(os.Stderr, "options:\n")
- flag.PrintDefaults()
- os.Exit(2)
-}
-
-func main() {
- log.SetFlags(0)
- log.SetPrefix("compilebench: ")
- flag.Usage = usage
- flag.Parse()
- if flag.NArg() != 0 {
- usage()
- }
-
- s, err := exec.Command(*flagGoCmd, "env", "GOROOT").CombinedOutput()
- if err != nil {
- log.Fatalf("%s env GOROOT: %v", *flagGoCmd, err)
- }
- goroot = strings.TrimSpace(string(s))
-
- compiler = *flagCompiler
- if compiler == "" {
- out, err := exec.Command(*flagGoCmd, "tool", "-n", "compile").CombinedOutput()
- if err != nil {
- out, err = exec.Command(*flagGoCmd, "tool", "-n", "6g").CombinedOutput()
- is6g = true
- if err != nil {
- out, err = exec.Command(*flagGoCmd, "tool", "-n", "compile").CombinedOutput()
- log.Fatalf("go tool -n compiler: %v\n%s", err, out)
- }
- }
- compiler = strings.TrimSpace(string(out))
- }
-
- if *flagRun != "" {
- r, err := regexp.Compile(*flagRun)
- if err != nil {
- log.Fatalf("invalid -run argument: %v", err)
- }
- runRE = r
- }
-
- for i := 0; i < *flagCount; i++ {
- if *flagPackage != "" {
- runBuild("BenchmarkPkg", *flagPackage, i)
- continue
- }
- for _, tt := range tests {
- if tt.long && *flagShort {
- continue
- }
- if runRE == nil || runRE.MatchString(tt.name) {
- runBuild(tt.name, tt.dir, i)
- }
- }
- }
-}
-
-func runCmd(name string, cmd *exec.Cmd) {
- start := time.Now()
- out, err := cmd.CombinedOutput()
- if err != nil {
- log.Printf("%v: %v\n%s", name, err, out)
- return
- }
- fmt.Printf("%s 1 %d ns/op\n", name, time.Since(start).Nanoseconds())
-}
-
-func runStdCmd() {
- args := []string{"build", "-a"}
- if *flagCompilerFlags != "" {
- args = append(args, "-gcflags", *flagCompilerFlags)
- }
- args = append(args, "std", "cmd")
- cmd := exec.Command(*flagGoCmd, args...)
- cmd.Dir = filepath.Join(goroot, "src")
- runCmd("BenchmarkStdCmd", cmd)
-}
-
-// path is either a path to a file ("$GOROOT/test/helloworld.go") or a package path ("cmd/go").
-func runSize(name, path string) {
- cmd := exec.Command(*flagGoCmd, "build", "-o", "_compilebenchout_", path)
- cmd.Stdout = os.Stderr
- cmd.Stderr = os.Stderr
- if err := cmd.Run(); err != nil {
- log.Print(err)
- return
- }
- defer os.Remove("_compilebenchout_")
- info, err := os.Stat("_compilebenchout_")
- if err != nil {
- log.Print(err)
- return
- }
- out, err := exec.Command("size", "_compilebenchout_").CombinedOutput()
- if err != nil {
- log.Printf("size: %v\n%s", err, out)
- return
- }
- lines := strings.Split(string(out), "\n")
- if len(lines) < 2 {
- log.Printf("not enough output from size: %s", out)
- return
- }
- f := strings.Fields(lines[1])
- if strings.HasPrefix(lines[0], "__TEXT") && len(f) >= 2 { // OS X
- fmt.Printf("%s 1 %s text-bytes %s data-bytes %v exe-bytes\n", name, f[0], f[1], info.Size())
- } else if strings.Contains(lines[0], "bss") && len(f) >= 3 {
- fmt.Printf("%s 1 %s text-bytes %s data-bytes %s bss-bytes %v exe-bytes\n", name, f[0], f[1], f[2], info.Size())
- }
-}
-
-func runBuild(name, dir string, count int) {
- switch name {
- case "BenchmarkStdCmd":
- runStdCmd()
- return
- case "BenchmarkCmdGoSize":
- runSize("BenchmarkCmdGoSize", "cmd/go")
- return
- case "BenchmarkHelloSize":
- runSize("BenchmarkHelloSize", filepath.Join(goroot, "test/helloworld.go"))
- return
- }
-
- pkg, err := build.Import(dir, ".", 0)
- if err != nil {
- log.Print(err)
- return
- }
- args := []string{"-o", "_compilebench_.o"}
- if is6g {
- *flagMemprofilerate = -1
- *flagAlloc = false
- *flagCpuprofile = ""
- *flagMemprofile = ""
- }
- if *flagMemprofilerate >= 0 {
- args = append(args, "-memprofilerate", fmt.Sprint(*flagMemprofilerate))
- }
- args = append(args, strings.Fields(*flagCompilerFlags)...)
- if *flagAlloc || *flagCpuprofile != "" || *flagMemprofile != "" {
- if *flagAlloc || *flagMemprofile != "" {
- args = append(args, "-memprofile", "_compilebench_.memprof")
- }
- if *flagCpuprofile != "" {
- args = append(args, "-cpuprofile", "_compilebench_.cpuprof")
- }
- }
- args = append(args, pkg.GoFiles...)
- cmd := exec.Command(compiler, args...)
- cmd.Dir = pkg.Dir
- cmd.Stdout = os.Stderr
- cmd.Stderr = os.Stderr
- start := time.Now()
- err = cmd.Run()
- if err != nil {
- log.Printf("%v: %v", name, err)
- return
- }
- end := time.Now()
-
- var allocs, allocbytes int64
- if *flagAlloc || *flagMemprofile != "" {
- out, err := ioutil.ReadFile(pkg.Dir + "/_compilebench_.memprof")
- if err != nil {
- log.Print("cannot find memory profile after compilation")
- }
- for _, line := range strings.Split(string(out), "\n") {
- f := strings.Fields(line)
- if len(f) < 4 || f[0] != "#" || f[2] != "=" {
- continue
- }
- val, err := strconv.ParseInt(f[3], 0, 64)
- if err != nil {
- continue
- }
- switch f[1] {
- case "TotalAlloc":
- allocbytes = val
- case "Mallocs":
- allocs = val
- }
- }
-
- if *flagMemprofile != "" {
- if err := ioutil.WriteFile(*flagMemprofile, out, 0666); err != nil {
- log.Print(err)
- }
- }
- os.Remove(pkg.Dir + "/_compilebench_.memprof")
- }
-
- if *flagCpuprofile != "" {
- out, err := ioutil.ReadFile(pkg.Dir + "/_compilebench_.cpuprof")
- if err != nil {
- log.Print(err)
- }
- outpath := *flagCpuprofile
- if *flagCount != 1 {
- outpath = fmt.Sprintf("%s_%d", outpath, count)
- }
- if err := ioutil.WriteFile(outpath, out, 0666); err != nil {
- log.Print(err)
- }
- os.Remove(pkg.Dir + "/_compilebench_.cpuprof")
- }
-
- wallns := end.Sub(start).Nanoseconds()
- userns := cmd.ProcessState.UserTime().Nanoseconds()
-
- fmt.Printf("%s 1 %d ns/op %d user-ns/op", name, wallns, userns)
- if *flagAlloc {
- fmt.Printf(" %d B/op %d allocs/op", allocbytes, allocs)
- }
-
- opath := pkg.Dir + "/_compilebench_.o"
- if *flagObj {
- // TODO(josharian): object files are big; just read enough to find what we seek.
- data, err := ioutil.ReadFile(opath)
- if err != nil {
- log.Print(err)
- }
- // Find start of export data.
- i := bytes.Index(data, []byte("\n$$B\n")) + len("\n$$B\n")
- // Count bytes to end of export data.
- nexport := bytes.Index(data[i:], []byte("\n$$\n"))
- fmt.Printf(" %d object-bytes %d export-bytes", len(data), nexport)
- }
- fmt.Println()
-
- os.Remove(opath)
-}
diff --git a/vendor/golang.org/x/tools/cmd/cover/README b/vendor/golang.org/x/tools/cmd/cover/README
deleted file mode 100644
index ff9523d..0000000
--- a/vendor/golang.org/x/tools/cmd/cover/README
+++ /dev/null
@@ -1,2 +0,0 @@
-NOTE: For Go releases 1.5 and later, this tool lives in the
-standard repository. The code here is not maintained.
diff --git a/vendor/golang.org/x/tools/cmd/cover/cover.go b/vendor/golang.org/x/tools/cmd/cover/cover.go
deleted file mode 100644
index e093364..0000000
--- a/vendor/golang.org/x/tools/cmd/cover/cover.go
+++ /dev/null
@@ -1,722 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-import (
- "bytes"
- "flag"
- "fmt"
- "go/ast"
- "go/parser"
- "go/printer"
- "go/token"
- "io"
- "io/ioutil"
- "log"
- "os"
- "path/filepath"
- "sort"
- "strconv"
- "strings"
-)
-
-const usageMessage = "" +
- `Usage of 'go tool cover':
-Given a coverage profile produced by 'go test':
- go test -coverprofile=c.out
-
-Open a web browser displaying annotated source code:
- go tool cover -html=c.out
-
-Write out an HTML file instead of launching a web browser:
- go tool cover -html=c.out -o coverage.html
-
-Display coverage percentages to stdout for each function:
- go tool cover -func=c.out
-
-Finally, to generate modified source code with coverage annotations
-(what go test -cover does):
- go tool cover -mode=set -var=CoverageVariableName program.go
-`
-
-func usage() {
- fmt.Fprintln(os.Stderr, usageMessage)
- fmt.Fprintln(os.Stderr, "Flags:")
- flag.PrintDefaults()
- fmt.Fprintln(os.Stderr, "\n Only one of -html, -func, or -mode may be set.")
- os.Exit(2)
-}
-
-var (
- mode = flag.String("mode", "", "coverage mode: set, count, atomic")
- varVar = flag.String("var", "GoCover", "name of coverage variable to generate")
- output = flag.String("o", "", "file for output; default: stdout")
- htmlOut = flag.String("html", "", "generate HTML representation of coverage profile")
- funcOut = flag.String("func", "", "output coverage profile information for each function")
-)
-
-var profile string // The profile to read; the value of -html or -func
-
-var counterStmt func(*File, ast.Expr) ast.Stmt
-
-const (
- atomicPackagePath = "sync/atomic"
- atomicPackageName = "_cover_atomic_"
-)
-
-func main() {
- flag.Usage = usage
- flag.Parse()
-
- // Usage information when no arguments.
- if flag.NFlag() == 0 && flag.NArg() == 0 {
- flag.Usage()
- }
-
- err := parseFlags()
- if err != nil {
- fmt.Fprintln(os.Stderr, err)
- fmt.Fprintln(os.Stderr, `For usage information, run "go tool cover -help"`)
- os.Exit(2)
- }
-
- // Generate coverage-annotated source.
- if *mode != "" {
- annotate(flag.Arg(0))
- return
- }
-
- // Output HTML or function coverage information.
- if *htmlOut != "" {
- err = htmlOutput(profile, *output)
- } else {
- err = funcOutput(profile, *output)
- }
-
- if err != nil {
- fmt.Fprintf(os.Stderr, "cover: %v\n", err)
- os.Exit(2)
- }
-}
-
-// parseFlags sets the profile and counterStmt globals and performs validations.
-func parseFlags() error {
- profile = *htmlOut
- if *funcOut != "" {
- if profile != "" {
- return fmt.Errorf("too many options")
- }
- profile = *funcOut
- }
-
- // Must either display a profile or rewrite Go source.
- if (profile == "") == (*mode == "") {
- return fmt.Errorf("too many options")
- }
-
- if *mode != "" {
- switch *mode {
- case "set":
- counterStmt = setCounterStmt
- case "count":
- counterStmt = incCounterStmt
- case "atomic":
- counterStmt = atomicCounterStmt
- default:
- return fmt.Errorf("unknown -mode %v", *mode)
- }
-
- if flag.NArg() == 0 {
- return fmt.Errorf("missing source file")
- } else if flag.NArg() == 1 {
- return nil
- }
- } else if flag.NArg() == 0 {
- return nil
- }
- return fmt.Errorf("too many arguments")
-}
-
-// Block represents the information about a basic block to be recorded in the analysis.
-// Note: Our definition of basic block is based on control structures; we don't break
-// apart && and ||. We could but it doesn't seem important enough to bother.
-type Block struct {
- startByte token.Pos
- endByte token.Pos
- numStmt int
-}
-
-// File is a wrapper for the state of a file used in the parser.
-// The basic parse tree walker is a method of this type.
-type File struct {
- fset *token.FileSet
- name string // Name of file.
- astFile *ast.File
- blocks []Block
- atomicPkg string // Package name for "sync/atomic" in this file.
-}
-
-// Visit implements the ast.Visitor interface.
-func (f *File) Visit(node ast.Node) ast.Visitor {
- switch n := node.(type) {
- case *ast.BlockStmt:
- // If it's a switch or select, the body is a list of case clauses; don't tag the block itself.
- if len(n.List) > 0 {
- switch n.List[0].(type) {
- case *ast.CaseClause: // switch
- for _, n := range n.List {
- clause := n.(*ast.CaseClause)
- clause.Body = f.addCounters(clause.Pos(), clause.End(), clause.Body, false)
- }
- return f
- case *ast.CommClause: // select
- for _, n := range n.List {
- clause := n.(*ast.CommClause)
- clause.Body = f.addCounters(clause.Pos(), clause.End(), clause.Body, false)
- }
- return f
- }
- }
- n.List = f.addCounters(n.Lbrace, n.Rbrace+1, n.List, true) // +1 to step past closing brace.
- case *ast.IfStmt:
- ast.Walk(f, n.Body)
- if n.Else == nil {
- return nil
- }
- // The elses are special, because if we have
- // if x {
- // } else if y {
- // }
- // we want to cover the "if y". To do this, we need a place to drop the counter,
- // so we add a hidden block:
- // if x {
- // } else {
- // if y {
- // }
- // }
- switch stmt := n.Else.(type) {
- case *ast.IfStmt:
- block := &ast.BlockStmt{
- Lbrace: n.Body.End(), // Start at end of the "if" block so the covered part looks like it starts at the "else".
- List: []ast.Stmt{stmt},
- Rbrace: stmt.End(),
- }
- n.Else = block
- case *ast.BlockStmt:
- stmt.Lbrace = n.Body.End() // Start at end of the "if" block so the covered part looks like it starts at the "else".
- default:
- panic("unexpected node type in if")
- }
- ast.Walk(f, n.Else)
- return nil
- case *ast.SelectStmt:
- // Don't annotate an empty select - creates a syntax error.
- if n.Body == nil || len(n.Body.List) == 0 {
- return nil
- }
- case *ast.SwitchStmt:
- // Don't annotate an empty switch - creates a syntax error.
- if n.Body == nil || len(n.Body.List) == 0 {
- return nil
- }
- case *ast.TypeSwitchStmt:
- // Don't annotate an empty type switch - creates a syntax error.
- if n.Body == nil || len(n.Body.List) == 0 {
- return nil
- }
- }
- return f
-}
-
-// unquote returns the unquoted string.
-func unquote(s string) string {
- t, err := strconv.Unquote(s)
- if err != nil {
- log.Fatalf("cover: improperly quoted string %q\n", s)
- }
- return t
-}
-
-// addImport adds an import for the specified path, if one does not already exist, and returns
-// the local package name.
-func (f *File) addImport(path string) string {
- // Does the package already import it?
- for _, s := range f.astFile.Imports {
- if unquote(s.Path.Value) == path {
- if s.Name != nil {
- return s.Name.Name
- }
- return filepath.Base(path)
- }
- }
- newImport := &ast.ImportSpec{
- Name: ast.NewIdent(atomicPackageName),
- Path: &ast.BasicLit{
- Kind: token.STRING,
- Value: fmt.Sprintf("%q", path),
- },
- }
- impDecl := &ast.GenDecl{
- Tok: token.IMPORT,
- Specs: []ast.Spec{
- newImport,
- },
- }
- // Make the new import the first Decl in the file.
- astFile := f.astFile
- astFile.Decls = append(astFile.Decls, nil)
- copy(astFile.Decls[1:], astFile.Decls[0:])
- astFile.Decls[0] = impDecl
- astFile.Imports = append(astFile.Imports, newImport)
-
- // Now refer to the package, just in case it ends up unused.
- // That is, append to the end of the file the declaration
- // var _ = _cover_atomic_.AddUint32
- reference := &ast.GenDecl{
- Tok: token.VAR,
- Specs: []ast.Spec{
- &ast.ValueSpec{
- Names: []*ast.Ident{
- ast.NewIdent("_"),
- },
- Values: []ast.Expr{
- &ast.SelectorExpr{
- X: ast.NewIdent(atomicPackageName),
- Sel: ast.NewIdent("AddUint32"),
- },
- },
- },
- },
- }
- astFile.Decls = append(astFile.Decls, reference)
- return atomicPackageName
-}
-
-var slashslash = []byte("//")
-
-// initialComments returns the prefix of content containing only
-// whitespace and line comments. Any +build directives must appear
-// within this region. This approach is more reliable than using
-// go/printer to print a modified AST containing comments.
-//
-func initialComments(content []byte) []byte {
- // Derived from go/build.Context.shouldBuild.
- end := 0
- p := content
- for len(p) > 0 {
- line := p
- if i := bytes.IndexByte(line, '\n'); i >= 0 {
- line, p = line[:i], p[i+1:]
- } else {
- p = p[len(p):]
- }
- line = bytes.TrimSpace(line)
- if len(line) == 0 { // Blank line.
- end = len(content) - len(p)
- continue
- }
- if !bytes.HasPrefix(line, slashslash) { // Not comment line.
- break
- }
- }
- return content[:end]
-}
-
-func annotate(name string) {
- fset := token.NewFileSet()
- content, err := ioutil.ReadFile(name)
- if err != nil {
- log.Fatalf("cover: %s: %s", name, err)
- }
- parsedFile, err := parser.ParseFile(fset, name, content, parser.ParseComments)
- if err != nil {
- log.Fatalf("cover: %s: %s", name, err)
- }
- parsedFile.Comments = trimComments(parsedFile, fset)
-
- file := &File{
- fset: fset,
- name: name,
- astFile: parsedFile,
- }
- if *mode == "atomic" {
- file.atomicPkg = file.addImport(atomicPackagePath)
- }
- ast.Walk(file, file.astFile)
- fd := os.Stdout
- if *output != "" {
- var err error
- fd, err = os.Create(*output)
- if err != nil {
- log.Fatalf("cover: %s", err)
- }
- }
- fd.Write(initialComments(content)) // Retain '// +build' directives.
- file.print(fd)
- // After printing the source tree, add some declarations for the counters etc.
- // We could do this by adding to the tree, but it's easier just to print the text.
- file.addVariables(fd)
-}
-
-// trimComments drops all but the //go: comments, some of which are semantically important.
-// We drop all others because they can appear in places that cause our counters
-// to appear in syntactically incorrect places. //go: appears at the beginning of
-// the line and is syntactically safe.
-func trimComments(file *ast.File, fset *token.FileSet) []*ast.CommentGroup {
- var comments []*ast.CommentGroup
- for _, group := range file.Comments {
- var list []*ast.Comment
- for _, comment := range group.List {
- if strings.HasPrefix(comment.Text, "//go:") && fset.Position(comment.Slash).Column == 1 {
- list = append(list, comment)
- }
- }
- if list != nil {
- comments = append(comments, &ast.CommentGroup{List: list})
- }
- }
- return comments
-}
-
-func (f *File) print(w io.Writer) {
- printer.Fprint(w, f.fset, f.astFile)
-}
-
-// intLiteral returns an ast.BasicLit representing the integer value.
-func (f *File) intLiteral(i int) *ast.BasicLit {
- node := &ast.BasicLit{
- Kind: token.INT,
- Value: fmt.Sprint(i),
- }
- return node
-}
-
-// index returns an ast.BasicLit representing the number of counters present.
-func (f *File) index() *ast.BasicLit {
- return f.intLiteral(len(f.blocks))
-}
-
-// setCounterStmt returns the expression: __count[23] = 1.
-func setCounterStmt(f *File, counter ast.Expr) ast.Stmt {
- return &ast.AssignStmt{
- Lhs: []ast.Expr{counter},
- Tok: token.ASSIGN,
- Rhs: []ast.Expr{f.intLiteral(1)},
- }
-}
-
-// incCounterStmt returns the expression: __count[23]++.
-func incCounterStmt(f *File, counter ast.Expr) ast.Stmt {
- return &ast.IncDecStmt{
- X: counter,
- Tok: token.INC,
- }
-}
-
-// atomicCounterStmt returns the expression: atomic.AddUint32(&__count[23], 1)
-func atomicCounterStmt(f *File, counter ast.Expr) ast.Stmt {
- return &ast.ExprStmt{
- X: &ast.CallExpr{
- Fun: &ast.SelectorExpr{
- X: ast.NewIdent(f.atomicPkg),
- Sel: ast.NewIdent("AddUint32"),
- },
- Args: []ast.Expr{&ast.UnaryExpr{
- Op: token.AND,
- X: counter,
- },
- f.intLiteral(1),
- },
- },
- }
-}
-
-// newCounter creates a new counter expression of the appropriate form.
-func (f *File) newCounter(start, end token.Pos, numStmt int) ast.Stmt {
- counter := &ast.IndexExpr{
- X: &ast.SelectorExpr{
- X: ast.NewIdent(*varVar),
- Sel: ast.NewIdent("Count"),
- },
- Index: f.index(),
- }
- stmt := counterStmt(f, counter)
- f.blocks = append(f.blocks, Block{start, end, numStmt})
- return stmt
-}
-
-// addCounters takes a list of statements and adds counters to the beginning of
-// each basic block at the top level of that list. For instance, given
-//
-// S1
-// if cond {
-// S2
-// }
-// S3
-//
-// counters will be added before S1 and before S3. The block containing S2
-// will be visited in a separate call.
-// TODO: Nested simple blocks get unnecessary (but correct) counters
-func (f *File) addCounters(pos, blockEnd token.Pos, list []ast.Stmt, extendToClosingBrace bool) []ast.Stmt {
- // Special case: make sure we add a counter to an empty block. Can't do this below
- // or we will add a counter to an empty statement list after, say, a return statement.
- if len(list) == 0 {
- return []ast.Stmt{f.newCounter(pos, blockEnd, 0)}
- }
- // We have a block (statement list), but it may have several basic blocks due to the
- // appearance of statements that affect the flow of control.
- var newList []ast.Stmt
- for {
- // Find first statement that affects flow of control (break, continue, if, etc.).
- // It will be the last statement of this basic block.
- var last int
- end := blockEnd
- for last = 0; last < len(list); last++ {
- end = f.statementBoundary(list[last])
- if f.endsBasicSourceBlock(list[last]) {
- extendToClosingBrace = false // Block is broken up now.
- last++
- break
- }
- }
- if extendToClosingBrace {
- end = blockEnd
- }
- if pos != end { // Can have no source to cover if e.g. blocks abut.
- newList = append(newList, f.newCounter(pos, end, last))
- }
- newList = append(newList, list[0:last]...)
- list = list[last:]
- if len(list) == 0 {
- break
- }
- pos = list[0].Pos()
- }
- return newList
-}
-
-// hasFuncLiteral reports the existence and position of the first func literal
-// in the node, if any. If a func literal appears, it usually marks the termination
-// of a basic block because the function body is itself a block.
-// Therefore we draw a line at the start of the body of the first function literal we find.
-// TODO: what if there's more than one? Probably doesn't matter much.
-func hasFuncLiteral(n ast.Node) (bool, token.Pos) {
- if n == nil {
- return false, 0
- }
- var literal funcLitFinder
- ast.Walk(&literal, n)
- return literal.found(), token.Pos(literal)
-}
-
-// statementBoundary finds the location in s that terminates the current basic
-// block in the source.
-func (f *File) statementBoundary(s ast.Stmt) token.Pos {
- // Control flow statements are easy.
- switch s := s.(type) {
- case *ast.BlockStmt:
- // Treat blocks like basic blocks to avoid overlapping counters.
- return s.Lbrace
- case *ast.IfStmt:
- found, pos := hasFuncLiteral(s.Init)
- if found {
- return pos
- }
- found, pos = hasFuncLiteral(s.Cond)
- if found {
- return pos
- }
- return s.Body.Lbrace
- case *ast.ForStmt:
- found, pos := hasFuncLiteral(s.Init)
- if found {
- return pos
- }
- found, pos = hasFuncLiteral(s.Cond)
- if found {
- return pos
- }
- found, pos = hasFuncLiteral(s.Post)
- if found {
- return pos
- }
- return s.Body.Lbrace
- case *ast.LabeledStmt:
- return f.statementBoundary(s.Stmt)
- case *ast.RangeStmt:
- found, pos := hasFuncLiteral(s.X)
- if found {
- return pos
- }
- return s.Body.Lbrace
- case *ast.SwitchStmt:
- found, pos := hasFuncLiteral(s.Init)
- if found {
- return pos
- }
- found, pos = hasFuncLiteral(s.Tag)
- if found {
- return pos
- }
- return s.Body.Lbrace
- case *ast.SelectStmt:
- return s.Body.Lbrace
- case *ast.TypeSwitchStmt:
- found, pos := hasFuncLiteral(s.Init)
- if found {
- return pos
- }
- return s.Body.Lbrace
- }
- // If not a control flow statement, it is a declaration, expression, call, etc. and it may have a function literal.
- // If it does, that's tricky because we want to exclude the body of the function from this block.
- // Draw a line at the start of the body of the first function literal we find.
- // TODO: what if there's more than one? Probably doesn't matter much.
- found, pos := hasFuncLiteral(s)
- if found {
- return pos
- }
- return s.End()
-}
-
-// endsBasicSourceBlock reports whether s changes the flow of control: break, if, etc.,
-// or if it's just problematic, for instance contains a function literal, which will complicate
-// accounting due to the block-within-an expression.
-func (f *File) endsBasicSourceBlock(s ast.Stmt) bool {
- switch s := s.(type) {
- case *ast.BlockStmt:
- // Treat blocks like basic blocks to avoid overlapping counters.
- return true
- case *ast.BranchStmt:
- return true
- case *ast.ForStmt:
- return true
- case *ast.IfStmt:
- return true
- case *ast.LabeledStmt:
- return f.endsBasicSourceBlock(s.Stmt)
- case *ast.RangeStmt:
- return true
- case *ast.SwitchStmt:
- return true
- case *ast.SelectStmt:
- return true
- case *ast.TypeSwitchStmt:
- return true
- case *ast.ExprStmt:
- // Calls to panic change the flow.
- // We really should verify that "panic" is the predefined function,
- // but without type checking we can't and the likelihood of it being
- // an actual problem is vanishingly small.
- if call, ok := s.X.(*ast.CallExpr); ok {
- if ident, ok := call.Fun.(*ast.Ident); ok && ident.Name == "panic" && len(call.Args) == 1 {
- return true
- }
- }
- }
- found, _ := hasFuncLiteral(s)
- return found
-}
-
-// funcLitFinder implements the ast.Visitor pattern to find the location of any
-// function literal in a subtree.
-type funcLitFinder token.Pos
-
-func (f *funcLitFinder) Visit(node ast.Node) (w ast.Visitor) {
- if f.found() {
- return nil // Prune search.
- }
- switch n := node.(type) {
- case *ast.FuncLit:
- *f = funcLitFinder(n.Body.Lbrace)
- return nil // Prune search.
- }
- return f
-}
-
-func (f *funcLitFinder) found() bool {
- return token.Pos(*f) != token.NoPos
-}
-
-// Sort interface for []block1; used for self-check in addVariables.
-
-type block1 struct {
- Block
- index int
-}
-
-type blockSlice []block1
-
-func (b blockSlice) Len() int { return len(b) }
-func (b blockSlice) Less(i, j int) bool { return b[i].startByte < b[j].startByte }
-func (b blockSlice) Swap(i, j int) { b[i], b[j] = b[j], b[i] }
-
-// offset translates a token position into a 0-indexed byte offset.
-func (f *File) offset(pos token.Pos) int {
- return f.fset.Position(pos).Offset
-}
-
-// addVariables adds to the end of the file the declarations to set up the counter and position variables.
-func (f *File) addVariables(w io.Writer) {
- // Self-check: Verify that the instrumented basic blocks are disjoint.
- t := make([]block1, len(f.blocks))
- for i := range f.blocks {
- t[i].Block = f.blocks[i]
- t[i].index = i
- }
- sort.Sort(blockSlice(t))
- for i := 1; i < len(t); i++ {
- if t[i-1].endByte > t[i].startByte {
- fmt.Fprintf(os.Stderr, "cover: internal error: block %d overlaps block %d\n", t[i-1].index, t[i].index)
- // Note: error message is in byte positions, not token positions.
- fmt.Fprintf(os.Stderr, "\t%s:#%d,#%d %s:#%d,#%d\n",
- f.name, f.offset(t[i-1].startByte), f.offset(t[i-1].endByte),
- f.name, f.offset(t[i].startByte), f.offset(t[i].endByte))
- }
- }
-
- // Declare the coverage struct as a package-level variable.
- fmt.Fprintf(w, "\nvar %s = struct {\n", *varVar)
- fmt.Fprintf(w, "\tCount [%d]uint32\n", len(f.blocks))
- fmt.Fprintf(w, "\tPos [3 * %d]uint32\n", len(f.blocks))
- fmt.Fprintf(w, "\tNumStmt [%d]uint16\n", len(f.blocks))
- fmt.Fprintf(w, "} {\n")
-
- // Initialize the position array field.
- fmt.Fprintf(w, "\tPos: [3 * %d]uint32{\n", len(f.blocks))
-
- // A nice long list of positions. Each position is encoded as follows to reduce size:
- // - 32-bit starting line number
- // - 32-bit ending line number
- // - (16 bit ending column number << 16) | (16-bit starting column number).
- for i, block := range f.blocks {
- start := f.fset.Position(block.startByte)
- end := f.fset.Position(block.endByte)
- fmt.Fprintf(w, "\t\t%d, %d, %#x, // [%d]\n", start.Line, end.Line, (end.Column&0xFFFF)<<16|(start.Column&0xFFFF), i)
- }
-
- // Close the position array.
- fmt.Fprintf(w, "\t},\n")
-
- // Initialize the position array field.
- fmt.Fprintf(w, "\tNumStmt: [%d]uint16{\n", len(f.blocks))
-
- // A nice long list of statements-per-block, so we can give a conventional
- // valuation of "percent covered". To save space, it's a 16-bit number, so we
- // clamp it if it overflows - won't matter in practice.
- for i, block := range f.blocks {
- n := block.numStmt
- if n > 1<<16-1 {
- n = 1<<16 - 1
- }
- fmt.Fprintf(w, "\t\t%d, // %d\n", n, i)
- }
-
- // Close the statements-per-block array.
- fmt.Fprintf(w, "\t},\n")
-
- // Close the struct initialization.
- fmt.Fprintf(w, "}\n")
-}
diff --git a/vendor/golang.org/x/tools/cmd/cover/cover_test.go b/vendor/golang.org/x/tools/cmd/cover/cover_test.go
deleted file mode 100644
index a18778b..0000000
--- a/vendor/golang.org/x/tools/cmd/cover/cover_test.go
+++ /dev/null
@@ -1,94 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// No testdata on Android.
-
-// +build !android
-
-package main_test
-
-import (
- "bytes"
- "fmt"
- "io/ioutil"
- "os"
- "os/exec"
- "path/filepath"
- "testing"
-)
-
-const (
- // Data directory, also the package directory for the test.
- testdata = "testdata"
-
- // Binaries we compile.
- testcover = "./testcover.exe"
-)
-
-var (
- // Files we use.
- testMain = filepath.Join(testdata, "main.go")
- testTest = filepath.Join(testdata, "test.go")
- coverInput = filepath.Join(testdata, "test_line.go")
- coverOutput = filepath.Join(testdata, "test_cover.go")
-)
-
-var debug = false // Keeps the rewritten files around if set.
-
-// Run this shell script, but do it in Go so it can be run by "go test".
-//
-// replace the word LINE with the line number < testdata/test.go > testdata/test_line.go
-// go build -o ./testcover
-// ./testcover -mode=count -var=CoverTest -o ./testdata/test_cover.go testdata/test_line.go
-// go run ./testdata/main.go ./testdata/test.go
-//
-func TestCover(t *testing.T) {
- // Read in the test file (testTest) and write it, with LINEs specified, to coverInput.
- file, err := ioutil.ReadFile(testTest)
- if err != nil {
- t.Fatal(err)
- }
- lines := bytes.Split(file, []byte("\n"))
- for i, line := range lines {
- lines[i] = bytes.Replace(line, []byte("LINE"), []byte(fmt.Sprint(i+1)), -1)
- }
- err = ioutil.WriteFile(coverInput, bytes.Join(lines, []byte("\n")), 0666)
- if err != nil {
- t.Fatal(err)
- }
-
- // defer removal of test_line.go
- if !debug {
- defer os.Remove(coverInput)
- }
-
- // go build -o testcover
- cmd := exec.Command("go", "build", "-o", testcover)
- run(cmd, t)
-
- // defer removal of testcover
- defer os.Remove(testcover)
-
- // ./testcover -mode=count -var=coverTest -o ./testdata/test_cover.go testdata/test_line.go
- cmd = exec.Command(testcover, "-mode=count", "-var=coverTest", "-o", coverOutput, coverInput)
- run(cmd, t)
-
- // defer removal of ./testdata/test_cover.go
- if !debug {
- defer os.Remove(coverOutput)
- }
-
- // go run ./testdata/main.go ./testdata/test.go
- cmd = exec.Command("go", "run", testMain, coverOutput)
- run(cmd, t)
-}
-
-func run(c *exec.Cmd, t *testing.T) {
- c.Stdout = os.Stdout
- c.Stderr = os.Stderr
- err := c.Run()
- if err != nil {
- t.Fatal(err)
- }
-}
diff --git a/vendor/golang.org/x/tools/cmd/cover/doc.go b/vendor/golang.org/x/tools/cmd/cover/doc.go
deleted file mode 100644
index b74d5b3..0000000
--- a/vendor/golang.org/x/tools/cmd/cover/doc.go
+++ /dev/null
@@ -1,27 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-/*
-Cover is a program for analyzing the coverage profiles generated by
-'go test -coverprofile=cover.out'.
-
-Cover is also used by 'go test -cover' to rewrite the source code with
-annotations to track which parts of each function are executed.
-It operates on one Go source file at a time, computing approximate
-basic block information by studying the source. It is thus more portable
-than binary-rewriting coverage tools, but also a little less capable.
-For instance, it does not probe inside && and || expressions, and can
-be mildly confused by single statements with multiple function literals.
-
-For usage information, please see:
- go help testflag
- go tool cover -help
-
-No longer maintained:
-
-For Go releases 1.5 and later, this tool lives in the
-standard repository. The code here is not maintained.
-
-*/
-package main // import "golang.org/x/tools/cmd/cover"
diff --git a/vendor/golang.org/x/tools/cmd/cover/func.go b/vendor/golang.org/x/tools/cmd/cover/func.go
deleted file mode 100644
index 41d9fce..0000000
--- a/vendor/golang.org/x/tools/cmd/cover/func.go
+++ /dev/null
@@ -1,166 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// This file implements the visitor that computes the (line, column)-(line-column) range for each function.
-
-package main
-
-import (
- "bufio"
- "fmt"
- "go/ast"
- "go/build"
- "go/parser"
- "go/token"
- "os"
- "path/filepath"
- "text/tabwriter"
-
- "golang.org/x/tools/cover"
-)
-
-// funcOutput takes two file names as arguments, a coverage profile to read as input and an output
-// file to write ("" means to write to standard output). The function reads the profile and produces
-// as output the coverage data broken down by function, like this:
-//
-// fmt/format.go:30: init 100.0%
-// fmt/format.go:57: clearflags 100.0%
-// ...
-// fmt/scan.go:1046: doScan 100.0%
-// fmt/scan.go:1075: advance 96.2%
-// fmt/scan.go:1119: doScanf 96.8%
-// total: (statements) 91.9%
-
-func funcOutput(profile, outputFile string) error {
- profiles, err := cover.ParseProfiles(profile)
- if err != nil {
- return err
- }
-
- var out *bufio.Writer
- if outputFile == "" {
- out = bufio.NewWriter(os.Stdout)
- } else {
- fd, err := os.Create(outputFile)
- if err != nil {
- return err
- }
- defer fd.Close()
- out = bufio.NewWriter(fd)
- }
- defer out.Flush()
-
- tabber := tabwriter.NewWriter(out, 1, 8, 1, '\t', 0)
- defer tabber.Flush()
-
- var total, covered int64
- for _, profile := range profiles {
- fn := profile.FileName
- file, err := findFile(fn)
- if err != nil {
- return err
- }
- funcs, err := findFuncs(file)
- if err != nil {
- return err
- }
- // Now match up functions and profile blocks.
- for _, f := range funcs {
- c, t := f.coverage(profile)
- fmt.Fprintf(tabber, "%s:%d:\t%s\t%.1f%%\n", fn, f.startLine, f.name, 100.0*float64(c)/float64(t))
- total += t
- covered += c
- }
- }
- fmt.Fprintf(tabber, "total:\t(statements)\t%.1f%%\n", 100.0*float64(covered)/float64(total))
-
- return nil
-}
-
-// findFuncs parses the file and returns a slice of FuncExtent descriptors.
-func findFuncs(name string) ([]*FuncExtent, error) {
- fset := token.NewFileSet()
- parsedFile, err := parser.ParseFile(fset, name, nil, 0)
- if err != nil {
- return nil, err
- }
- visitor := &FuncVisitor{
- fset: fset,
- name: name,
- astFile: parsedFile,
- }
- ast.Walk(visitor, visitor.astFile)
- return visitor.funcs, nil
-}
-
-// FuncExtent describes a function's extent in the source by file and position.
-type FuncExtent struct {
- name string
- startLine int
- startCol int
- endLine int
- endCol int
-}
-
-// FuncVisitor implements the visitor that builds the function position list for a file.
-type FuncVisitor struct {
- fset *token.FileSet
- name string // Name of file.
- astFile *ast.File
- funcs []*FuncExtent
-}
-
-// Visit implements the ast.Visitor interface.
-func (v *FuncVisitor) Visit(node ast.Node) ast.Visitor {
- switch n := node.(type) {
- case *ast.FuncDecl:
- start := v.fset.Position(n.Pos())
- end := v.fset.Position(n.End())
- fe := &FuncExtent{
- name: n.Name.Name,
- startLine: start.Line,
- startCol: start.Column,
- endLine: end.Line,
- endCol: end.Column,
- }
- v.funcs = append(v.funcs, fe)
- }
- return v
-}
-
-// coverage returns the fraction of the statements in the function that were covered, as a numerator and denominator.
-func (f *FuncExtent) coverage(profile *cover.Profile) (num, den int64) {
- // We could avoid making this n^2 overall by doing a single scan and annotating the functions,
- // but the sizes of the data structures is never very large and the scan is almost instantaneous.
- var covered, total int64
- // The blocks are sorted, so we can stop counting as soon as we reach the end of the relevant block.
- for _, b := range profile.Blocks {
- if b.StartLine > f.endLine || (b.StartLine == f.endLine && b.StartCol >= f.endCol) {
- // Past the end of the function.
- break
- }
- if b.EndLine < f.startLine || (b.EndLine == f.startLine && b.EndCol <= f.startCol) {
- // Before the beginning of the function
- continue
- }
- total += int64(b.NumStmt)
- if b.Count > 0 {
- covered += int64(b.NumStmt)
- }
- }
- if total == 0 {
- total = 1 // Avoid zero denominator.
- }
- return covered, total
-}
-
-// findFile finds the location of the named file in GOROOT, GOPATH etc.
-func findFile(file string) (string, error) {
- dir, file := filepath.Split(file)
- pkg, err := build.Import(dir, ".", build.FindOnly)
- if err != nil {
- return "", fmt.Errorf("can't find %q: %v", file, err)
- }
- return filepath.Join(pkg.Dir, file), nil
-}
diff --git a/vendor/golang.org/x/tools/cmd/cover/html.go b/vendor/golang.org/x/tools/cmd/cover/html.go
deleted file mode 100644
index ef50e2b..0000000
--- a/vendor/golang.org/x/tools/cmd/cover/html.go
+++ /dev/null
@@ -1,284 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-import (
- "bufio"
- "bytes"
- "fmt"
- "html/template"
- "io"
- "io/ioutil"
- "math"
- "os"
- "os/exec"
- "path/filepath"
- "runtime"
-
- "golang.org/x/tools/cover"
-)
-
-// htmlOutput reads the profile data from profile and generates an HTML
-// coverage report, writing it to outfile. If outfile is empty,
-// it writes the report to a temporary file and opens it in a web browser.
-func htmlOutput(profile, outfile string) error {
- profiles, err := cover.ParseProfiles(profile)
- if err != nil {
- return err
- }
-
- var d templateData
-
- for _, profile := range profiles {
- fn := profile.FileName
- if profile.Mode == "set" {
- d.Set = true
- }
- file, err := findFile(fn)
- if err != nil {
- return err
- }
- src, err := ioutil.ReadFile(file)
- if err != nil {
- return fmt.Errorf("can't read %q: %v", fn, err)
- }
- var buf bytes.Buffer
- err = htmlGen(&buf, src, profile.Boundaries(src))
- if err != nil {
- return err
- }
- d.Files = append(d.Files, &templateFile{
- Name: fn,
- Body: template.HTML(buf.String()),
- Coverage: percentCovered(profile),
- })
- }
-
- var out *os.File
- if outfile == "" {
- var dir string
- dir, err = ioutil.TempDir("", "cover")
- if err != nil {
- return err
- }
- out, err = os.Create(filepath.Join(dir, "coverage.html"))
- } else {
- out, err = os.Create(outfile)
- }
- if err != nil {
- return err
- }
- err = htmlTemplate.Execute(out, d)
- if err == nil {
- err = out.Close()
- }
- if err != nil {
- return err
- }
-
- if outfile == "" {
- if !startBrowser("file://" + out.Name()) {
- fmt.Fprintf(os.Stderr, "HTML output written to %s\n", out.Name())
- }
- }
-
- return nil
-}
-
-// percentCovered returns, as a percentage, the fraction of the statements in
-// the profile covered by the test run.
-// In effect, it reports the coverage of a given source file.
-func percentCovered(p *cover.Profile) float64 {
- var total, covered int64
- for _, b := range p.Blocks {
- total += int64(b.NumStmt)
- if b.Count > 0 {
- covered += int64(b.NumStmt)
- }
- }
- if total == 0 {
- return 0
- }
- return float64(covered) / float64(total) * 100
-}
-
-// htmlGen generates an HTML coverage report with the provided filename,
-// source code, and tokens, and writes it to the given Writer.
-func htmlGen(w io.Writer, src []byte, boundaries []cover.Boundary) error {
- dst := bufio.NewWriter(w)
- for i := range src {
- for len(boundaries) > 0 && boundaries[0].Offset == i {
- b := boundaries[0]
- if b.Start {
- n := 0
- if b.Count > 0 {
- n = int(math.Floor(b.Norm*9)) + 1
- }
- fmt.Fprintf(dst, ``, n, b.Count)
- } else {
- dst.WriteString(" ")
- }
- boundaries = boundaries[1:]
- }
- switch b := src[i]; b {
- case '>':
- dst.WriteString(">")
- case '<':
- dst.WriteString("<")
- case '&':
- dst.WriteString("&")
- case '\t':
- dst.WriteString(" ")
- default:
- dst.WriteByte(b)
- }
- }
- return dst.Flush()
-}
-
-// startBrowser tries to open the URL in a browser
-// and reports whether it succeeds.
-func startBrowser(url string) bool {
- // try to start the browser
- var args []string
- switch runtime.GOOS {
- case "darwin":
- args = []string{"open"}
- case "windows":
- args = []string{"cmd", "/c", "start"}
- default:
- args = []string{"xdg-open"}
- }
- cmd := exec.Command(args[0], append(args[1:], url)...)
- return cmd.Start() == nil
-}
-
-// rgb returns an rgb value for the specified coverage value
-// between 0 (no coverage) and 10 (max coverage).
-func rgb(n int) string {
- if n == 0 {
- return "rgb(192, 0, 0)" // Red
- }
- // Gradient from gray to green.
- r := 128 - 12*(n-1)
- g := 128 + 12*(n-1)
- b := 128 + 3*(n-1)
- return fmt.Sprintf("rgb(%v, %v, %v)", r, g, b)
-}
-
-// colors generates the CSS rules for coverage colors.
-func colors() template.CSS {
- var buf bytes.Buffer
- for i := 0; i < 11; i++ {
- fmt.Fprintf(&buf, ".cov%v { color: %v }\n", i, rgb(i))
- }
- return template.CSS(buf.String())
-}
-
-var htmlTemplate = template.Must(template.New("html").Funcs(template.FuncMap{
- "colors": colors,
-}).Parse(tmplHTML))
-
-type templateData struct {
- Files []*templateFile
- Set bool
-}
-
-type templateFile struct {
- Name string
- Body template.HTML
- Coverage float64
-}
-
-const tmplHTML = `
-
-
-
-
-
-
-
-
-
-
- {{range $i, $f := .Files}}
- {{$f.Name}} ({{printf "%.1f" $f.Coverage}}%)
- {{end}}
-
-
-
- not tracked
- {{if .Set}}
- not covered
- covered
- {{else}}
- no coverage
- low coverage
- *
- *
- *
- *
- *
- *
- *
- *
- high coverage
- {{end}}
-
-
-
- {{range $i, $f := .Files}}
-
{{$f.Body}}
- {{end}}
-
-
-
-
-`
diff --git a/vendor/golang.org/x/tools/cmd/cover/testdata/main.go b/vendor/golang.org/x/tools/cmd/cover/testdata/main.go
deleted file mode 100644
index 6ed39c4..0000000
--- a/vendor/golang.org/x/tools/cmd/cover/testdata/main.go
+++ /dev/null
@@ -1,112 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Test runner for coverage test. This file is not coverage-annotated; test.go is.
-// It knows the coverage counter is called "coverTest".
-
-package main
-
-import (
- "fmt"
- "os"
-)
-
-func main() {
- testAll()
- verify()
-}
-
-type block struct {
- count uint32
- line uint32
-}
-
-var counters = make(map[block]bool)
-
-// check records the location and expected value for a counter.
-func check(line, count uint32) {
- b := block{
- count,
- line,
- }
- counters[b] = true
-}
-
-// checkVal is a version of check that returns its extra argument,
-// so it can be used in conditionals.
-func checkVal(line, count uint32, val int) int {
- b := block{
- count,
- line,
- }
- counters[b] = true
- return val
-}
-
-var PASS = true
-
-// verify checks the expected counts against the actual. It runs after the test has completed.
-func verify() {
- for b := range counters {
- got, index := count(b.line)
- if b.count == anything && got != 0 {
- got = anything
- }
- if got != b.count {
- fmt.Fprintf(os.Stderr, "test_go:%d expected count %d got %d [counter %d]\n", b.line, b.count, got, index)
- PASS = false
- }
- }
- verifyPanic()
- if !PASS {
- fmt.Fprintf(os.Stderr, "FAIL\n")
- os.Exit(2)
- }
-}
-
-// verifyPanic is a special check for the known counter that should be
-// after the panic call in testPanic.
-func verifyPanic() {
- if coverTest.Count[panicIndex-1] != 1 {
- // Sanity check for test before panic.
- fmt.Fprintf(os.Stderr, "bad before panic")
- PASS = false
- }
- if coverTest.Count[panicIndex] != 0 {
- fmt.Fprintf(os.Stderr, "bad at panic: %d should be 0\n", coverTest.Count[panicIndex])
- PASS = false
- }
- if coverTest.Count[panicIndex+1] != 1 {
- fmt.Fprintf(os.Stderr, "bad after panic")
- PASS = false
- }
-}
-
-// count returns the count and index for the counter at the specified line.
-func count(line uint32) (uint32, int) {
- // Linear search is fine. Choose perfect fit over approximate.
- // We can have a closing brace for a range on the same line as a condition for an "else if"
- // and we don't want that brace to steal the count for the condition on the "if".
- // Therefore we test for a perfect (lo==line && hi==line) match, but if we can't
- // find that we take the first imperfect match.
- index := -1
- indexLo := uint32(1e9)
- for i := range coverTest.Count {
- lo, hi := coverTest.Pos[3*i], coverTest.Pos[3*i+1]
- if lo == line && line == hi {
- return coverTest.Count[i], i
- }
- // Choose the earliest match (the counters are in unpredictable order).
- if lo <= line && line <= hi && indexLo > lo {
- index = i
- indexLo = lo
- }
- }
- if index == -1 {
- fmt.Fprintln(os.Stderr, "cover_test: no counter for line", line)
- PASS = false
- return 0, 0
- }
- return coverTest.Count[index], index
-}
diff --git a/vendor/golang.org/x/tools/cmd/cover/testdata/test.go b/vendor/golang.org/x/tools/cmd/cover/testdata/test.go
deleted file mode 100644
index 9013950..0000000
--- a/vendor/golang.org/x/tools/cmd/cover/testdata/test.go
+++ /dev/null
@@ -1,218 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// This program is processed by the cover command, and then testAll is called.
-// The test driver in main.go can then compare the coverage statistics with expectation.
-
-// The word LINE is replaced by the line number in this file. When the file is executed,
-// the coverage processing has changed the line numbers, so we can't use runtime.Caller.
-
-package main
-
-const anything = 1e9 // Just some unlikely value that means "we got here, don't care how often"
-
-func testAll() {
- testSimple()
- testBlockRun()
- testIf()
- testFor()
- testRange()
- testSwitch()
- testTypeSwitch()
- testSelect1()
- testSelect2()
- testPanic()
- testEmptySwitches()
-}
-
-// The indexes of the counters in testPanic are known to main.go
-const panicIndex = 3
-
-// This test appears first because the index of its counters is known to main.go
-func testPanic() {
- defer func() {
- recover()
- }()
- check(LINE, 1)
- panic("should not get next line")
- check(LINE, 0) // this is GoCover.Count[panicIndex]
- // The next counter is in testSimple and it will be non-zero.
- // If the panic above does not trigger a counter, the test will fail
- // because GoCover.Count[panicIndex] will be the one in testSimple.
-}
-
-func testSimple() {
- check(LINE, 1)
-}
-
-func testIf() {
- if true {
- check(LINE, 1)
- } else {
- check(LINE, 0)
- }
- if false {
- check(LINE, 0)
- } else {
- check(LINE, 1)
- }
- for i := 0; i < 3; i++ {
- if checkVal(LINE, 3, i) <= 2 {
- check(LINE, 3)
- }
- if checkVal(LINE, 3, i) <= 1 {
- check(LINE, 2)
- }
- if checkVal(LINE, 3, i) <= 0 {
- check(LINE, 1)
- }
- }
- for i := 0; i < 3; i++ {
- if checkVal(LINE, 3, i) <= 1 {
- check(LINE, 2)
- } else {
- check(LINE, 1)
- }
- }
- for i := 0; i < 3; i++ {
- if checkVal(LINE, 3, i) <= 0 {
- check(LINE, 1)
- } else if checkVal(LINE, 2, i) <= 1 {
- check(LINE, 1)
- } else if checkVal(LINE, 1, i) <= 2 {
- check(LINE, 1)
- } else if checkVal(LINE, 0, i) <= 3 {
- check(LINE, 0)
- }
- }
- if func(a, b int) bool { return a < b }(3, 4) {
- check(LINE, 1)
- }
-}
-
-func testFor() {
- for i := 0; i < 10; func() { i++; check(LINE, 10) }() {
- check(LINE, 10)
- }
-}
-
-func testRange() {
- for _, f := range []func(){
- func() { check(LINE, 1) },
- } {
- f()
- check(LINE, 1)
- }
-}
-
-func testBlockRun() {
- check(LINE, 1)
- {
- check(LINE, 1)
- }
- {
- check(LINE, 1)
- }
- check(LINE, 1)
- {
- check(LINE, 1)
- }
- {
- check(LINE, 1)
- }
- check(LINE, 1)
-}
-
-func testSwitch() {
- for i := 0; i < 5; func() { i++; check(LINE, 5) }() {
- switch i {
- case 0:
- check(LINE, 1)
- case 1:
- check(LINE, 1)
- case 2:
- check(LINE, 1)
- default:
- check(LINE, 2)
- }
- }
-}
-
-func testTypeSwitch() {
- var x = []interface{}{1, 2.0, "hi"}
- for _, v := range x {
- switch func() { check(LINE, 3) }(); v.(type) {
- case int:
- check(LINE, 1)
- case float64:
- check(LINE, 1)
- case string:
- check(LINE, 1)
- case complex128:
- check(LINE, 0)
- default:
- check(LINE, 0)
- }
- }
-}
-
-func testSelect1() {
- c := make(chan int)
- go func() {
- for i := 0; i < 1000; i++ {
- c <- i
- }
- }()
- for {
- select {
- case <-c:
- check(LINE, anything)
- case <-c:
- check(LINE, anything)
- default:
- check(LINE, 1)
- return
- }
- }
-}
-
-func testSelect2() {
- c1 := make(chan int, 1000)
- c2 := make(chan int, 1000)
- for i := 0; i < 1000; i++ {
- c1 <- i
- c2 <- i
- }
- for {
- select {
- case <-c1:
- check(LINE, 1000)
- case <-c2:
- check(LINE, 1000)
- default:
- check(LINE, 1)
- return
- }
- }
-}
-
-// Empty control statements created syntax errors. This function
-// is here just to be sure that those are handled correctly now.
-func testEmptySwitches() {
- check(LINE, 1)
- switch 3 {
- }
- check(LINE, 1)
- switch i := (interface{})(3).(int); i {
- }
- check(LINE, 1)
- c := make(chan int)
- go func() {
- check(LINE, 1)
- c <- 1
- select {}
- }()
- <-c
- check(LINE, 1)
-}
diff --git a/vendor/golang.org/x/tools/cmd/digraph/digraph.go b/vendor/golang.org/x/tools/cmd/digraph/digraph.go
deleted file mode 100644
index 3ad2950..0000000
--- a/vendor/golang.org/x/tools/cmd/digraph/digraph.go
+++ /dev/null
@@ -1,540 +0,0 @@
-// The digraph command performs queries over unlabelled directed graphs
-// represented in text form. It is intended to integrate nicely with
-// typical UNIX command pipelines.
-//
-// Since directed graphs (import graphs, reference graphs, call graphs,
-// etc) often arise during software tool development and debugging, this
-// command is included in the go.tools repository.
-//
-// TODO(adonovan):
-// - support input files other than stdin
-// - suport alternative formats (AT&T GraphViz, CSV, etc),
-// a comment syntax, etc.
-// - allow queries to nest, like Blaze query language.
-//
-package main // import "golang.org/x/tools/cmd/digraph"
-
-import (
- "bufio"
- "bytes"
- "errors"
- "flag"
- "fmt"
- "io"
- "os"
- "sort"
- "strconv"
- "unicode"
- "unicode/utf8"
-)
-
-const Usage = `digraph: queries over directed graphs in text form.
-
-Graph format:
-
- Each line contains zero or more words. Words are separated by
- unquoted whitespace; words may contain Go-style double-quoted portions,
- allowing spaces and other characters to be expressed.
-
- Each field declares a node, and if there are more than one,
- an edge from the first to each subsequent one.
- The graph is provided on the standard input.
-
- For instance, the following (acyclic) graph specifies a partial order
- among the subtasks of getting dressed:
-
- % cat clothes.txt
- socks shoes
- "boxer shorts" pants
- pants belt shoes
- shirt tie sweater
- sweater jacket
- hat
-
- The line "shirt tie sweater" indicates the two edges shirt -> tie and
- shirt -> sweater, not shirt -> tie -> sweater.
-
-Supported queries:
-
- nodes
- the set of all nodes
- degree
- the in-degree and out-degree of each node.
- preds ...
- the set of immediate predecessors of the specified nodes
- succs ...
- the set of immediate successors of the specified nodes
- forward ...
- the set of nodes transitively reachable from the specified nodes
- reverse ...
- the set of nodes that transitively reach the specified nodes
- somepath
- the list of nodes on some arbitrary path from the first node to the second
- allpaths
- the set of nodes on all paths from the first node to the second
- sccs
- all strongly connected components (one per line)
- scc
- the set of nodes nodes strongly connected to the specified one
-
-Example usage:
-
- Show the transitive closure of imports of the digraph tool itself:
- % go list -f '{{.ImportPath}}{{.Imports}}' ... | tr '[]' ' ' |
- digraph forward golang.org/x/tools/cmd/digraph
-
- Show which clothes (see above) must be donned before a jacket:
- % digraph reverse jacket 0 {
- fmt.Fprint(stdout, sep)
- }
- fmt.Fprint(stdout, label)
- }
- fmt.Fprintln(stdout)
-}
-
-type nodeset map[string]bool
-
-func (s nodeset) sort() nodelist {
- labels := make(nodelist, len(s))
- var i int
- for label := range s {
- labels[i] = label
- i++
- }
- sort.Strings(labels)
- return labels
-}
-
-func (s nodeset) addAll(x nodeset) {
- for label := range x {
- s[label] = true
- }
-}
-
-// A graph maps nodes to the non-nil set of their immediate successors.
-type graph map[string]nodeset
-
-func (g graph) addNode(label string) nodeset {
- edges := g[label]
- if edges == nil {
- edges = make(nodeset)
- g[label] = edges
- }
- return edges
-}
-
-func (g graph) addEdges(from string, to ...string) {
- edges := g.addNode(from)
- for _, to := range to {
- g.addNode(to)
- edges[to] = true
- }
-}
-
-func (g graph) reachableFrom(roots nodeset) nodeset {
- seen := make(nodeset)
- var visit func(label string)
- visit = func(label string) {
- if !seen[label] {
- seen[label] = true
- for e := range g[label] {
- visit(e)
- }
- }
- }
- for root := range roots {
- visit(root)
- }
- return seen
-}
-
-func (g graph) transpose() graph {
- rev := make(graph)
- for label, edges := range g {
- rev.addNode(label)
- for succ := range edges {
- rev.addEdges(succ, label)
- }
- }
- return rev
-}
-
-func (g graph) sccs() []nodeset {
- // Kosaraju's algorithm---Tarjan is overkill here.
-
- // Forward pass.
- S := make(nodelist, 0, len(g)) // postorder stack
- seen := make(nodeset)
- var visit func(label string)
- visit = func(label string) {
- if !seen[label] {
- seen[label] = true
- for e := range g[label] {
- visit(e)
- }
- S = append(S, label)
- }
- }
- for label := range g {
- visit(label)
- }
-
- // Reverse pass.
- rev := g.transpose()
- var scc nodeset
- seen = make(nodeset)
- var rvisit func(label string)
- rvisit = func(label string) {
- if !seen[label] {
- seen[label] = true
- scc[label] = true
- for e := range rev[label] {
- rvisit(e)
- }
- }
- }
- var sccs []nodeset
- for len(S) > 0 {
- top := S[len(S)-1]
- S = S[:len(S)-1] // pop
- if !seen[top] {
- scc = make(nodeset)
- rvisit(top)
- sccs = append(sccs, scc)
- }
- }
- return sccs
-}
-
-func parse(rd io.Reader) (graph, error) {
- g := make(graph)
-
- var linenum int
- in := bufio.NewScanner(rd)
- for in.Scan() {
- linenum++
- // Split into words, honoring double-quotes per Go spec.
- words, err := split(in.Text())
- if err != nil {
- return nil, fmt.Errorf("at line %d: %v", linenum, err)
- }
- if len(words) > 0 {
- g.addEdges(words[0], words[1:]...)
- }
- }
- if err := in.Err(); err != nil {
- return nil, err
- }
- return g, nil
-}
-
-var stdin io.Reader = os.Stdin
-var stdout io.Writer = os.Stdout
-
-func digraph(cmd string, args []string) error {
- // Parse the input graph.
- g, err := parse(stdin)
- if err != nil {
- return err
- }
-
- // Parse the command line.
- switch cmd {
- case "nodes":
- if len(args) != 0 {
- return fmt.Errorf("usage: digraph nodes")
- }
- nodes := make(nodeset)
- for label := range g {
- nodes[label] = true
- }
- nodes.sort().println("\n")
-
- case "degree":
- if len(args) != 0 {
- return fmt.Errorf("usage: digraph degree")
- }
- nodes := make(nodeset)
- for label := range g {
- nodes[label] = true
- }
- rev := g.transpose()
- for _, label := range nodes.sort() {
- fmt.Fprintf(stdout, "%d\t%d\t%s\n", len(rev[label]), len(g[label]), label)
- }
-
- case "succs", "preds":
- if len(args) == 0 {
- return fmt.Errorf("usage: digraph %s ...", cmd)
- }
- g := g
- if cmd == "preds" {
- g = g.transpose()
- }
- result := make(nodeset)
- for _, root := range args {
- edges := g[root]
- if edges == nil {
- return fmt.Errorf("no such node %q", root)
- }
- result.addAll(edges)
- }
- result.sort().println("\n")
-
- case "forward", "reverse":
- if len(args) == 0 {
- return fmt.Errorf("usage: digraph %s ...", cmd)
- }
- roots := make(nodeset)
- for _, root := range args {
- if g[root] == nil {
- return fmt.Errorf("no such node %q", root)
- }
- roots[root] = true
- }
- g := g
- if cmd == "reverse" {
- g = g.transpose()
- }
- g.reachableFrom(roots).sort().println("\n")
-
- case "somepath":
- if len(args) != 2 {
- return fmt.Errorf("usage: digraph somepath ")
- }
- from, to := args[0], args[1]
- if g[from] == nil {
- return fmt.Errorf("no such 'from' node %q", from)
- }
- if g[to] == nil {
- return fmt.Errorf("no such 'to' node %q", to)
- }
-
- seen := make(nodeset)
- var visit func(path nodelist, label string) bool
- visit = func(path nodelist, label string) bool {
- if !seen[label] {
- seen[label] = true
- if label == to {
- append(path, label).println("\n")
- return true // unwind
- }
- for e := range g[label] {
- if visit(append(path, label), e) {
- return true
- }
- }
- }
- return false
- }
- if !visit(make(nodelist, 0, 100), from) {
- return fmt.Errorf("no path from %q to %q", args[0], args[1])
- }
-
- case "allpaths":
- if len(args) != 2 {
- return fmt.Errorf("usage: digraph allpaths ")
- }
- from, to := args[0], args[1]
- if g[from] == nil {
- return fmt.Errorf("no such 'from' node %q", from)
- }
- if g[to] == nil {
- return fmt.Errorf("no such 'to' node %q", to)
- }
-
- seen := make(nodeset) // value of seen[x] indicates whether x is on some path to 'to'
- var visit func(label string) bool
- visit = func(label string) bool {
- reachesTo, ok := seen[label]
- if !ok {
- reachesTo = label == to
-
- seen[label] = reachesTo
- for e := range g[label] {
- if visit(e) {
- reachesTo = true
- }
- }
- seen[label] = reachesTo
- }
- return reachesTo
- }
- if !visit(from) {
- return fmt.Errorf("no path from %q to %q", from, to)
- }
- for label, reachesTo := range seen {
- if !reachesTo {
- delete(seen, label)
- }
- }
- seen.sort().println("\n")
-
- case "sccs":
- if len(args) != 0 {
- return fmt.Errorf("usage: digraph sccs")
- }
- for _, scc := range g.sccs() {
- scc.sort().println(" ")
- }
-
- case "scc":
- if len(args) != 1 {
- return fmt.Errorf("usage: digraph scc ")
- }
- label := args[0]
- if g[label] == nil {
- return fmt.Errorf("no such node %q", label)
- }
- for _, scc := range g.sccs() {
- if scc[label] {
- scc.sort().println("\n")
- break
- }
- }
-
- default:
- return fmt.Errorf("no such command %q", cmd)
- }
-
- return nil
-}
-
-// -- Utilities --------------------------------------------------------
-
-// split splits a line into words, which are generally separated by
-// spaces, but Go-style double-quoted string literals are also supported.
-// (This approximates the behaviour of the Bourne shell.)
-//
-// `one "two three"` -> ["one" "two three"]
-// `a"\n"b` -> ["a\nb"]
-//
-func split(line string) ([]string, error) {
- var (
- words []string
- inWord bool
- current bytes.Buffer
- )
-
- for len(line) > 0 {
- r, size := utf8.DecodeRuneInString(line)
- if unicode.IsSpace(r) {
- if inWord {
- words = append(words, current.String())
- current.Reset()
- inWord = false
- }
- } else if r == '"' {
- var ok bool
- size, ok = quotedLength(line)
- if !ok {
- return nil, errors.New("invalid quotation")
- }
- s, err := strconv.Unquote(line[:size])
- if err != nil {
- return nil, err
- }
- current.WriteString(s)
- inWord = true
- } else {
- current.WriteRune(r)
- inWord = true
- }
- line = line[size:]
- }
- if inWord {
- words = append(words, current.String())
- }
- return words, nil
-}
-
-// quotedLength returns the length in bytes of the prefix of input that
-// contain a possibly-valid double-quoted Go string literal.
-//
-// On success, n is at least two (""); input[:n] may be passed to
-// strconv.Unquote to interpret its value, and input[n:] contains the
-// rest of the input.
-//
-// On failure, quotedLength returns false, and the entire input can be
-// passed to strconv.Unquote if an informative error message is desired.
-//
-// quotedLength does not and need not detect all errors, such as
-// invalid hex or octal escape sequences, since it assumes
-// strconv.Unquote will be applied to the prefix. It guarantees only
-// that if there is a prefix of input containing a valid string literal,
-// its length is returned.
-//
-// TODO(adonovan): move this into a strconv-like utility package.
-//
-func quotedLength(input string) (n int, ok bool) {
- var offset int
-
- // next returns the rune at offset, or -1 on EOF.
- // offset advances to just after that rune.
- next := func() rune {
- if offset < len(input) {
- r, size := utf8.DecodeRuneInString(input[offset:])
- offset += size
- return r
- }
- return -1
- }
-
- if next() != '"' {
- return // error: not a quotation
- }
-
- for {
- r := next()
- if r == '\n' || r < 0 {
- return // error: string literal not terminated
- }
- if r == '"' {
- return offset, true // success
- }
- if r == '\\' {
- var skip int
- switch next() {
- case 'a', 'b', 'f', 'n', 'r', 't', 'v', '\\', '"':
- skip = 0
- case '0', '1', '2', '3', '4', '5', '6', '7':
- skip = 2
- case 'x':
- skip = 2
- case 'u':
- skip = 4
- case 'U':
- skip = 8
- default:
- return // error: invalid escape
- }
-
- for i := 0; i < skip; i++ {
- next()
- }
- }
- }
-}
diff --git a/vendor/golang.org/x/tools/cmd/digraph/digraph_test.go b/vendor/golang.org/x/tools/cmd/digraph/digraph_test.go
deleted file mode 100644
index 0c90304..0000000
--- a/vendor/golang.org/x/tools/cmd/digraph/digraph_test.go
+++ /dev/null
@@ -1,121 +0,0 @@
-package main
-
-import (
- "bytes"
- "fmt"
- "reflect"
- "strings"
- "testing"
-)
-
-func TestDigraph(t *testing.T) {
- const g1 = `
-socks shoes
-shorts pants
-pants belt shoes
-shirt tie sweater
-sweater jacket
-hat
-`
-
- const g2 = `
-a b c
-b d
-c d
-d c
-`
-
- for _, test := range []struct {
- input string
- cmd string
- args []string
- want string
- }{
- {g1, "nodes", nil, "belt\nhat\njacket\npants\nshirt\nshoes\nshorts\nsocks\nsweater\ntie\n"},
- {g1, "reverse", []string{"jacket"}, "jacket\nshirt\nsweater\n"},
- {g1, "forward", []string{"socks"}, "shoes\nsocks\n"},
- {g1, "forward", []string{"socks", "sweater"}, "jacket\nshoes\nsocks\nsweater\n"},
-
- {g2, "allpaths", []string{"a", "d"}, "a\nb\nc\nd\n"},
-
- {g2, "sccs", nil, "a\nb\nc d\n"},
- {g2, "scc", []string{"d"}, "c\nd\n"},
- {g2, "succs", []string{"a"}, "b\nc\n"},
- {g2, "preds", []string{"c"}, "a\nd\n"},
- {g2, "preds", []string{"c", "d"}, "a\nb\nc\nd\n"},
- } {
- stdin = strings.NewReader(test.input)
- stdout = new(bytes.Buffer)
- if err := digraph(test.cmd, test.args); err != nil {
- t.Error(err)
- continue
- }
-
- got := stdout.(fmt.Stringer).String()
- if got != test.want {
- t.Errorf("digraph(%s, %s) = %q, want %q", test.cmd, test.args, got, test.want)
- }
- }
-
- // TODO(adonovan):
- // - test somepath (it's nondeterministic).
- // - test errors
-}
-
-func TestSplit(t *testing.T) {
- for _, test := range []struct {
- line string
- want []string
- }{
- {`one "2a 2b" three`, []string{"one", "2a 2b", "three"}},
- {`one tw"\n\x0a\u000a\012"o three`, []string{"one", "tw\n\n\n\no", "three"}},
- } {
- got, err := split(test.line)
- if err != nil {
- t.Errorf("split(%s) failed: %v", test.line, err)
- }
- if !reflect.DeepEqual(got, test.want) {
- t.Errorf("split(%s) = %v, want %v", test.line, got, test.want)
- }
- }
-}
-
-func TestQuotedLength(t *testing.T) {
- for _, test := range []struct {
- input string
- want int
- }{
- {`"abc"`, 5},
- {`"abc"def`, 5},
- {`"abc\"d"ef`, 8}, // "abc\"d" is consumed, ef is residue
- {`"\012\n\x0a\u000a\U0000000a"`, 28},
- {"\"\xff\"", 3}, // bad UTF-8 is ok
- {`"\xff"`, 6}, // hex escape for bad UTF-8 is ok
- } {
- got, ok := quotedLength(test.input)
- if !ok {
- got = 0
- }
- if got != test.want {
- t.Errorf("quotedLength(%s) = %d, want %d", test.input, got, test.want)
- }
- }
-
- // errors
- for _, input := range []string{
- ``, // not a quotation
- `a`, // not a quotation
- `'a'`, // not a quotation
- `"a`, // not terminated
- `"\0"`, // short octal escape
- `"\x1"`, // short hex escape
- `"\u000"`, // short \u escape
- `"\U0000000"`, // short \U escape
- `"\k"`, // invalid escape
- "\"ab\nc\"", // newline
- } {
- if n, ok := quotedLength(input); ok {
- t.Errorf("quotedLength(%s) = %d, want !ok", input, n)
- }
- }
-}
diff --git a/vendor/golang.org/x/tools/cmd/eg/eg.go b/vendor/golang.org/x/tools/cmd/eg/eg.go
deleted file mode 100644
index 18b0f09..0000000
--- a/vendor/golang.org/x/tools/cmd/eg/eg.go
+++ /dev/null
@@ -1,150 +0,0 @@
-// The eg command performs example-based refactoring.
-// For documentation, run the command, or see Help in
-// golang.org/x/tools/refactor/eg.
-package main // import "golang.org/x/tools/cmd/eg"
-
-import (
- "flag"
- "fmt"
- "go/build"
- "go/format"
- "go/parser"
- "go/token"
- "os"
- "os/exec"
- "strings"
-
- "golang.org/x/tools/go/buildutil"
- "golang.org/x/tools/go/loader"
- "golang.org/x/tools/refactor/eg"
-)
-
-var (
- beforeeditFlag = flag.String("beforeedit", "", "A command to exec before each file is edited (e.g. chmod, checkout). Whitespace delimits argument words. The string '{}' is replaced by the file name.")
- helpFlag = flag.Bool("help", false, "show detailed help message")
- templateFlag = flag.String("t", "", "template.go file specifying the refactoring")
- transitiveFlag = flag.Bool("transitive", false, "apply refactoring to all dependencies too")
- writeFlag = flag.Bool("w", false, "rewrite input files in place (by default, the results are printed to standard output)")
- verboseFlag = flag.Bool("v", false, "show verbose matcher diagnostics")
-)
-
-func init() {
- flag.Var((*buildutil.TagsFlag)(&build.Default.BuildTags), "tags", buildutil.TagsFlagDoc)
-}
-
-const usage = `eg: an example-based refactoring tool.
-
-Usage: eg -t template.go [-w] [-transitive] ...
-
--help show detailed help message
--t template.go specifies the template file (use -help to see explanation)
--w causes files to be re-written in place.
--transitive causes all dependencies to be refactored too.
--v show verbose matcher diagnostics
--beforeedit cmd a command to exec before each file is modified.
- "{}" represents the name of the file.
-` + loader.FromArgsUsage
-
-func main() {
- if err := doMain(); err != nil {
- fmt.Fprintf(os.Stderr, "eg: %s\n", err)
- os.Exit(1)
- }
-}
-
-func doMain() error {
- flag.Parse()
- args := flag.Args()
-
- if *helpFlag {
- fmt.Fprint(os.Stderr, eg.Help)
- os.Exit(2)
- }
-
- if len(args) == 0 {
- fmt.Fprint(os.Stderr, usage)
- os.Exit(1)
- }
-
- if *templateFlag == "" {
- return fmt.Errorf("no -t template.go file specified")
- }
-
- conf := loader.Config{
- Fset: token.NewFileSet(),
- ParserMode: parser.ParseComments,
- }
-
- // The first Created package is the template.
- conf.CreateFromFilenames("template", *templateFlag)
-
- if _, err := conf.FromArgs(args, true); err != nil {
- return err
- }
-
- // Load, parse and type-check the whole program.
- iprog, err := conf.Load()
- if err != nil {
- return err
- }
-
- // Analyze the template.
- template := iprog.Created[0]
- xform, err := eg.NewTransformer(iprog.Fset, template.Pkg, template.Files[0], &template.Info, *verboseFlag)
- if err != nil {
- return err
- }
-
- // Apply it to the input packages.
- var pkgs []*loader.PackageInfo
- if *transitiveFlag {
- for _, info := range iprog.AllPackages {
- pkgs = append(pkgs, info)
- }
- } else {
- pkgs = iprog.InitialPackages()
- }
- var hadErrors bool
- for _, pkg := range pkgs {
- if pkg == template {
- continue
- }
- for _, file := range pkg.Files {
- n := xform.Transform(&pkg.Info, pkg.Pkg, file)
- if n == 0 {
- continue
- }
- filename := iprog.Fset.File(file.Pos()).Name()
- fmt.Fprintf(os.Stderr, "=== %s (%d matches)\n", filename, n)
- if *writeFlag {
- // Run the before-edit command (e.g. "chmod +w", "checkout") if any.
- if *beforeeditFlag != "" {
- args := strings.Fields(*beforeeditFlag)
- // Replace "{}" with the filename, like find(1).
- for i := range args {
- if i > 0 {
- args[i] = strings.Replace(args[i], "{}", filename, -1)
- }
- }
- cmd := exec.Command(args[0], args[1:]...)
- cmd.Stdout = os.Stdout
- cmd.Stderr = os.Stderr
- if err := cmd.Run(); err != nil {
- fmt.Fprintf(os.Stderr, "Warning: edit hook %q failed (%s)\n",
- args, err)
- }
- }
- if err := eg.WriteAST(iprog.Fset, filename, file); err != nil {
- fmt.Fprintf(os.Stderr, "eg: %s\n", err)
- hadErrors = true
- }
- } else {
- format.Node(os.Stdout, iprog.Fset, file)
- }
- }
- }
- if hadErrors {
- os.Exit(1)
- }
- return nil
-}
diff --git a/vendor/golang.org/x/tools/cmd/fiximports/main.go b/vendor/golang.org/x/tools/cmd/fiximports/main.go
deleted file mode 100644
index 365a261..0000000
--- a/vendor/golang.org/x/tools/cmd/fiximports/main.go
+++ /dev/null
@@ -1,511 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// The fiximports command fixes import declarations to use the canonical
-// import path for packages that have an "import comment" as defined by
-// https://golang.org/s/go14customimport.
-//
-//
-// Background
-//
-// The Go 1 custom import path mechanism lets the maintainer of a
-// package give it a stable name by which clients may import and "go
-// get" it, independent of the underlying version control system (such
-// as Git) or server (such as github.com) that hosts it. Requests for
-// the custom name are redirected to the underlying name. This allows
-// packages to be migrated from one underlying server or system to
-// another without breaking existing clients.
-//
-// Because this redirect mechanism creates aliases for existing
-// packages, it's possible for a single program to import the same
-// package by its canonical name and by an alias. The resulting
-// executable will contain two copies of the package, which is wasteful
-// at best and incorrect at worst.
-//
-// To avoid this, "go build" reports an error if it encounters a special
-// comment like the one below, and if the import path in the comment
-// does not match the path of the enclosing package relative to
-// GOPATH/src:
-//
-// $ grep ^package $GOPATH/src/github.com/bob/vanity/foo/foo.go
-// package foo // import "vanity.com/foo"
-//
-// The error from "go build" indicates that the package canonically
-// known as "vanity.com/foo" is locally installed under the
-// non-canonical name "github.com/bob/vanity/foo".
-//
-//
-// Usage
-//
-// When a package that you depend on introduces a custom import comment,
-// and your workspace imports it by the non-canonical name, your build
-// will stop working as soon as you update your copy of that package
-// using "go get -u".
-//
-// The purpose of the fiximports tool is to fix up all imports of the
-// non-canonical path within a Go workspace, replacing them with imports
-// of the canonical path. Following a run of fiximports, the workspace
-// will no longer depend on the non-canonical copy of the package, so it
-// should be safe to delete. It may be necessary to run "go get -u"
-// again to ensure that the package is locally installed under its
-// canonical path, if it was not already.
-//
-// The fiximports tool operates locally; it does not make HTTP requests
-// and does not discover new custom import comments. It only operates
-// on non-canonical packages present in your workspace.
-//
-// The -baddomains flag is a list of domain names that should always be
-// considered non-canonical. You can use this if you wish to make sure
-// that you no longer have any dependencies on packages from that
-// domain, even those that do not yet provide a canical import path
-// comment. For example, the default value of -baddomains includes the
-// moribund code hosting site code.google.com, so fiximports will report
-// an error for each import of a package from this domain remaining
-// after canonicalization.
-//
-// To see the changes fiximports would make without applying them, use
-// the -n flag.
-//
-package main
-
-import (
- "bytes"
- "encoding/json"
- "flag"
- "fmt"
- "go/ast"
- "go/build"
- "go/format"
- "go/parser"
- "go/token"
- "io"
- "io/ioutil"
- "log"
- "os"
- "os/exec"
- "path"
- "path/filepath"
- "sort"
- "strconv"
- "strings"
-)
-
-// flags
-var (
- dryrun = flag.Bool("n", false, "dry run: show changes, but don't apply them")
- badDomains = flag.String("baddomains", "code.google.com",
- "a comma-separated list of domains from which packages should not be imported")
- replaceFlag = flag.String("replace", "",
- "a comma-separated list of noncanonical=canonical pairs of package paths. If both items in a pair end with '...', they are treated as path prefixes.")
-)
-
-// seams for testing
-var (
- stderr io.Writer = os.Stderr
- writeFile = ioutil.WriteFile
-)
-
-const usage = `fiximports: rewrite import paths to use canonical package names.
-
-Usage: fiximports [-n] package...
-
-The package... arguments specify a list of packages
-in the style of the go tool; see "go help packages".
-Hint: use "all" or "..." to match the entire workspace.
-
-For details, see http://godoc.org/golang.org/x/tools/cmd/fiximports.
-
-Flags:
- -n: dry run: show changes, but don't apply them
- -baddomains a comma-separated list of domains from which packages
- should not be imported
-`
-
-func main() {
- flag.Parse()
-
- if len(flag.Args()) == 0 {
- fmt.Fprintf(stderr, usage)
- os.Exit(1)
- }
- if !fiximports(flag.Args()...) {
- os.Exit(1)
- }
-}
-
-type canonicalName struct{ path, name string }
-
-// fiximports fixes imports in the specified packages.
-// Invariant: a false result implies an error was already printed.
-func fiximports(packages ...string) bool {
- // importedBy is the transpose of the package import graph.
- importedBy := make(map[string]map[*build.Package]bool)
-
- // addEdge adds an edge to the import graph.
- addEdge := func(from *build.Package, to string) {
- if to == "C" || to == "unsafe" {
- return // fake
- }
- pkgs := importedBy[to]
- if pkgs == nil {
- pkgs = make(map[*build.Package]bool)
- importedBy[to] = pkgs
- }
- pkgs[from] = true
- }
-
- // List metadata for all packages in the workspace.
- pkgs, err := list("...")
- if err != nil {
- fmt.Fprintf(stderr, "importfix: %v\n", err)
- return false
- }
-
- // packageName maps each package's path to its name.
- packageName := make(map[string]string)
- for _, p := range pkgs {
- packageName[p.ImportPath] = p.Package.Name
- }
-
- // canonical maps each non-canonical package path to
- // its canonical path and name.
- // A present nil value indicates that the canonical package
- // is unknown: hosted on a bad domain with no redirect.
- canonical := make(map[string]canonicalName)
- domains := strings.Split(*badDomains, ",")
-
- type replaceItem struct {
- old, new string
- matchPrefix bool
- }
- var replace []replaceItem
- for _, pair := range strings.Split(*replaceFlag, ",") {
- if pair == "" {
- continue
- }
- words := strings.Split(pair, "=")
- if len(words) != 2 {
- fmt.Fprintf(stderr, "importfix: -replace: %q is not of the form \"canonical=noncanonical\".\n", pair)
- return false
- }
- replace = append(replace, replaceItem{
- old: strings.TrimSuffix(words[0], "..."),
- new: strings.TrimSuffix(words[1], "..."),
- matchPrefix: strings.HasSuffix(words[0], "...") &&
- strings.HasSuffix(words[1], "..."),
- })
- }
-
- // Find non-canonical packages and populate importedBy graph.
- for _, p := range pkgs {
- if p.Error != nil {
- msg := p.Error.Err
- if strings.Contains(msg, "code in directory") &&
- strings.Contains(msg, "expects import") {
- // don't show the very errors we're trying to fix
- } else {
- fmt.Fprintln(stderr, msg)
- }
- }
-
- for _, imp := range p.Imports {
- addEdge(&p.Package, imp)
- }
- for _, imp := range p.TestImports {
- addEdge(&p.Package, imp)
- }
- for _, imp := range p.XTestImports {
- addEdge(&p.Package, imp)
- }
-
- // Does package have an explicit import comment?
- if p.ImportComment != "" {
- if p.ImportComment != p.ImportPath {
- canonical[p.ImportPath] = canonicalName{
- path: p.Package.ImportComment,
- name: p.Package.Name,
- }
- }
- } else {
- // Is package matched by a -replace item?
- var newPath string
- for _, item := range replace {
- if item.matchPrefix {
- if strings.HasPrefix(p.ImportPath, item.old) {
- newPath = item.new + p.ImportPath[len(item.old):]
- break
- }
- } else if p.ImportPath == item.old {
- newPath = item.new
- break
- }
- }
- if newPath != "" {
- newName := packageName[newPath]
- if newName == "" {
- newName = filepath.Base(newPath) // a guess
- }
- canonical[p.ImportPath] = canonicalName{
- path: newPath,
- name: newName,
- }
- continue
- }
-
- // Is package matched by a -baddomains item?
- for _, domain := range domains {
- slash := strings.Index(p.ImportPath, "/")
- if slash < 0 {
- continue // no slash: standard package
- }
- if p.ImportPath[:slash] == domain {
- // Package comes from bad domain and has no import comment.
- // Report an error each time this package is imported.
- canonical[p.ImportPath] = canonicalName{}
-
- // TODO(adonovan): should we make an HTTP request to
- // see if there's an HTTP redirect, a "go-import" meta tag,
- // or an import comment in the the latest revision?
- // It would duplicate a lot of logic from "go get".
- }
- break
- }
- }
- }
-
- // Find all clients (direct importers) of canonical packages.
- // These are the packages that need fixing up.
- clients := make(map[*build.Package]bool)
- for path := range canonical {
- for client := range importedBy[path] {
- clients[client] = true
- }
- }
-
- // Restrict rewrites to the set of packages specified by the user.
- if len(packages) == 1 && (packages[0] == "all" || packages[0] == "...") {
- // no restriction
- } else {
- pkgs, err := list(packages...)
- if err != nil {
- fmt.Fprintf(stderr, "importfix: %v\n", err)
- return false
- }
- seen := make(map[string]bool)
- for _, p := range pkgs {
- seen[p.ImportPath] = true
- }
- for client := range clients {
- if !seen[client.ImportPath] {
- delete(clients, client)
- }
- }
- }
-
- // Rewrite selected client packages.
- ok := true
- for client := range clients {
- if !rewritePackage(client, canonical) {
- ok = false
-
- // There were errors.
- // Show direct and indirect imports of client.
- seen := make(map[string]bool)
- var direct, indirect []string
- for p := range importedBy[client.ImportPath] {
- direct = append(direct, p.ImportPath)
- seen[p.ImportPath] = true
- }
-
- var visit func(path string)
- visit = func(path string) {
- for q := range importedBy[path] {
- qpath := q.ImportPath
- if !seen[qpath] {
- seen[qpath] = true
- indirect = append(indirect, qpath)
- visit(qpath)
- }
- }
- }
-
- if direct != nil {
- fmt.Fprintf(stderr, "\timported directly by:\n")
- sort.Strings(direct)
- for _, path := range direct {
- fmt.Fprintf(stderr, "\t\t%s\n", path)
- visit(path)
- }
-
- if indirect != nil {
- fmt.Fprintf(stderr, "\timported indirectly by:\n")
- sort.Strings(indirect)
- for _, path := range indirect {
- fmt.Fprintf(stderr, "\t\t%s\n", path)
- }
- }
- }
- }
- }
-
- return ok
-}
-
-// Invariant: false result => error already printed.
-func rewritePackage(client *build.Package, canonical map[string]canonicalName) bool {
- ok := true
-
- used := make(map[string]bool)
- var filenames []string
- filenames = append(filenames, client.GoFiles...)
- filenames = append(filenames, client.TestGoFiles...)
- filenames = append(filenames, client.XTestGoFiles...)
- var first bool
- for _, filename := range filenames {
- if !first {
- first = true
- fmt.Fprintf(stderr, "%s\n", client.ImportPath)
- }
- err := rewriteFile(filepath.Join(client.Dir, filename), canonical, used)
- if err != nil {
- fmt.Fprintf(stderr, "\tERROR: %v\n", err)
- ok = false
- }
- }
-
- // Show which imports were renamed in this package.
- var keys []string
- for key := range used {
- keys = append(keys, key)
- }
- sort.Strings(keys)
- for _, key := range keys {
- if p := canonical[key]; p.path != "" {
- fmt.Fprintf(stderr, "\tfixed: %s -> %s\n", key, p.path)
- } else {
- fmt.Fprintf(stderr, "\tERROR: %s has no import comment\n", key)
- ok = false
- }
- }
-
- return ok
-}
-
-// rewrite reads, modifies, and writes filename, replacing all imports
-// of packages P in canonical by canonical[P].
-// It records in used which canonical packages were imported.
-// used[P]=="" indicates that P was imported but its canonical path is unknown.
-func rewriteFile(filename string, canonical map[string]canonicalName, used map[string]bool) error {
- fset := token.NewFileSet()
- f, err := parser.ParseFile(fset, filename, nil, parser.ParseComments)
- if err != nil {
- return err
- }
- var changed bool
- for _, imp := range f.Imports {
- impPath, err := strconv.Unquote(imp.Path.Value)
- if err != nil {
- log.Printf("%s: bad import spec %q: %v",
- fset.Position(imp.Pos()), imp.Path.Value, err)
- continue
- }
- canon, ok := canonical[impPath]
- if !ok {
- continue // import path is canonical
- }
-
- used[impPath] = true
-
- if canon.path == "" {
- // The canonical path is unknown (a -baddomain).
- // Show the offending import.
- // TODO(adonovan): should we show the actual source text?
- fmt.Fprintf(stderr, "\t%s:%d: import %q\n",
- shortPath(filename),
- fset.Position(imp.Pos()).Line, impPath)
- continue
- }
-
- changed = true
-
- imp.Path.Value = strconv.Quote(canon.path)
-
- // Add a renaming import if necessary.
- //
- // This is a guess at best. We can't see whether a 'go
- // get' of the canonical import path would have the same
- // name or not. Assume it's the last segment.
- newBase := path.Base(canon.path)
- if imp.Name == nil && newBase != canon.name {
- imp.Name = &ast.Ident{Name: canon.name}
- }
- }
-
- if changed && !*dryrun {
- var buf bytes.Buffer
- if err := format.Node(&buf, fset, f); err != nil {
- return fmt.Errorf("%s: couldn't format file: %v", filename, err)
- }
- return writeFile(filename, buf.Bytes(), 0644)
- }
-
- return nil
-}
-
-// listPackage is a copy of cmd/go/list.Package.
-// It has more fields than build.Package and we need some of them.
-type listPackage struct {
- build.Package
- Error *packageError // error loading package
-}
-
-// A packageError describes an error loading information about a package.
-type packageError struct {
- ImportStack []string // shortest path from package named on command line to this one
- Pos string // position of error
- Err string // the error itself
-}
-
-// list runs 'go list' with the specified arguments and returns the
-// metadata for matching packages.
-func list(args ...string) ([]*listPackage, error) {
- cmd := exec.Command("go", append([]string{"list", "-e", "-json"}, args...)...)
- cmd.Stdout = new(bytes.Buffer)
- cmd.Stderr = stderr
- if err := cmd.Run(); err != nil {
- return nil, err
- }
-
- dec := json.NewDecoder(cmd.Stdout.(io.Reader))
- var pkgs []*listPackage
- for {
- var p listPackage
- if err := dec.Decode(&p); err == io.EOF {
- break
- } else if err != nil {
- return nil, err
- }
- pkgs = append(pkgs, &p)
- }
- return pkgs, nil
-}
-
-var cwd string
-
-func init() {
- var err error
- cwd, err = os.Getwd()
- if err != nil {
- log.Fatalf("os.Getwd: %v", err)
- }
-}
-
-// shortPath returns an absolute or relative name for path, whatever is shorter.
-// Plundered from $GOROOT/src/cmd/go/build.go.
-func shortPath(path string) string {
- if rel, err := filepath.Rel(cwd, path); err == nil && len(rel) < len(path) {
- return rel
- }
- return path
-}
diff --git a/vendor/golang.org/x/tools/cmd/fiximports/main_test.go b/vendor/golang.org/x/tools/cmd/fiximports/main_test.go
deleted file mode 100644
index 75319a0..0000000
--- a/vendor/golang.org/x/tools/cmd/fiximports/main_test.go
+++ /dev/null
@@ -1,243 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// No testdata on Android.
-
-// +build !android
-
-package main
-
-import (
- "bytes"
- "os"
- "path/filepath"
- "runtime"
- "strings"
- "testing"
-)
-
-// TODO(adonovan):
-// - test introduction of renaming imports.
-// - test induced failures of rewriteFile.
-
-// Guide to the test packages:
-//
-// new.com/one -- canonical name for old.com/one
-// old.com/one -- non-canonical; has import comment "new.com/one"
-// old.com/bad -- has a parse error
-// fruit.io/orange \
-// fruit.io/banana } orange -> pear -> banana -> titanic.biz/bar
-// fruit.io/pear /
-// titanic.biz/bar -- domain is sinking; package has jumped ship to new.com/bar
-// titanic.biz/foo -- domain is sinking but package has no import comment yet
-
-func TestFixImports(t *testing.T) {
- gopath := filepath.Join(cwd, "testdata")
- if err := os.Setenv("GOPATH", gopath); err != nil {
- t.Fatalf("os.Setenv: %v", err)
- }
- defer func() {
- stderr = os.Stderr
- *badDomains = "code.google.com"
- *replaceFlag = ""
- }()
-
- for i, test := range []struct {
- packages []string // packages to rewrite, "go list" syntax
- badDomains string // -baddomains flag
- replaceFlag string // -replace flag
- wantOK bool
- wantStderr string
- wantRewrite map[string]string
- }{
- // #0. No errors.
- {
- packages: []string{"all"},
- badDomains: "code.google.com",
- wantOK: true,
- wantStderr: `
-testdata/src/old.com/bad/bad.go:2:43: expected 'package', found 'EOF'
-fruit.io/banana
- fixed: old.com/one -> new.com/one
- fixed: titanic.biz/bar -> new.com/bar
-`,
- wantRewrite: map[string]string{
- "$GOPATH/src/fruit.io/banana/banana.go": `package banana
-
-import (
- _ "new.com/bar"
- _ "new.com/one"
- _ "titanic.biz/foo"
-)`,
- },
- },
- // #1. No packages needed rewriting.
- {
- packages: []string{"titanic.biz/...", "old.com/...", "new.com/..."},
- badDomains: "code.google.com",
- wantOK: true,
- wantStderr: `
-testdata/src/old.com/bad/bad.go:2:43: expected 'package', found 'EOF'
-`,
- },
- // #2. Some packages without import comments matched bad domains.
- {
- packages: []string{"all"},
- badDomains: "titanic.biz",
- wantOK: false,
- wantStderr: `
-testdata/src/old.com/bad/bad.go:2:43: expected 'package', found 'EOF'
-fruit.io/banana
- testdata/src/fruit.io/banana/banana.go:6: import "titanic.biz/foo"
- fixed: old.com/one -> new.com/one
- fixed: titanic.biz/bar -> new.com/bar
- ERROR: titanic.biz/foo has no import comment
- imported directly by:
- fruit.io/pear
- imported indirectly by:
- fruit.io/orange
-`,
- wantRewrite: map[string]string{
- "$GOPATH/src/fruit.io/banana/banana.go": `package banana
-
-import (
- _ "new.com/bar"
- _ "new.com/one"
- _ "titanic.biz/foo"
-)`,
- },
- },
- // #3. The -replace flag lets user supply missing import comments.
- {
- packages: []string{"all"},
- replaceFlag: "titanic.biz/foo=new.com/foo",
- wantOK: true,
- wantStderr: `
-testdata/src/old.com/bad/bad.go:2:43: expected 'package', found 'EOF'
-fruit.io/banana
- fixed: old.com/one -> new.com/one
- fixed: titanic.biz/bar -> new.com/bar
- fixed: titanic.biz/foo -> new.com/foo
-`,
- wantRewrite: map[string]string{
- "$GOPATH/src/fruit.io/banana/banana.go": `package banana
-
-import (
- _ "new.com/bar"
- _ "new.com/foo"
- _ "new.com/one"
-)`,
- },
- },
- // #4. The -replace flag supports wildcards.
- // An explicit import comment takes precedence.
- {
- packages: []string{"all"},
- replaceFlag: "titanic.biz/...=new.com/...",
- wantOK: true,
- wantStderr: `
-testdata/src/old.com/bad/bad.go:2:43: expected 'package', found 'EOF'
-fruit.io/banana
- fixed: old.com/one -> new.com/one
- fixed: titanic.biz/bar -> new.com/bar
- fixed: titanic.biz/foo -> new.com/foo
-`,
- wantRewrite: map[string]string{
- "$GOPATH/src/fruit.io/banana/banana.go": `package banana
-
-import (
- _ "new.com/bar"
- _ "new.com/foo"
- _ "new.com/one"
-)`,
- },
- },
- // #5. The -replace flag trumps -baddomains.
- {
- packages: []string{"all"},
- badDomains: "titanic.biz",
- replaceFlag: "titanic.biz/foo=new.com/foo",
- wantOK: true,
- wantStderr: `
-testdata/src/old.com/bad/bad.go:2:43: expected 'package', found 'EOF'
-fruit.io/banana
- fixed: old.com/one -> new.com/one
- fixed: titanic.biz/bar -> new.com/bar
- fixed: titanic.biz/foo -> new.com/foo
-`,
- wantRewrite: map[string]string{
- "$GOPATH/src/fruit.io/banana/banana.go": `package banana
-
-import (
- _ "new.com/bar"
- _ "new.com/foo"
- _ "new.com/one"
-)`,
- },
- },
- } {
- *badDomains = test.badDomains
- *replaceFlag = test.replaceFlag
-
- stderr = new(bytes.Buffer)
- gotRewrite := make(map[string]string)
- writeFile = func(filename string, content []byte, mode os.FileMode) error {
- filename = strings.Replace(filename, gopath, "$GOPATH", 1)
- filename = filepath.ToSlash(filename)
- gotRewrite[filename] = string(bytes.TrimSpace(content))
- return nil
- }
-
- if runtime.GOOS == "windows" {
- test.wantStderr = strings.Replace(test.wantStderr, `testdata/src/old.com/bad/bad.go`, `testdata\src\old.com\bad\bad.go`, -1)
- test.wantStderr = strings.Replace(test.wantStderr, `testdata/src/fruit.io/banana/banana.go`, `testdata\src\fruit.io\banana\banana.go`, -1)
- }
-
- // Check status code.
- if fiximports(test.packages...) != test.wantOK {
- t.Errorf("#%d. fiximports() = %t", i, !test.wantOK)
- }
-
- // Compare stderr output.
- if got := stderr.(*bytes.Buffer).String(); got != test.wantStderr {
- if strings.Contains(got, "vendor/golang_org/x/text/unicode/norm") {
- t.Skip("skipping known-broken test; see golang.org/issue/17417")
- }
- t.Errorf("#%d. stderr: got <<%s>>, want <<%s>>",
- i, stderr, test.wantStderr)
- }
-
- // Compare rewrites.
- for k, v := range gotRewrite {
- if test.wantRewrite[k] != v {
- t.Errorf("#%d. rewrite[%s] = <<%s>>, want <<%s>>",
- i, k, v, test.wantRewrite[k])
- }
- delete(test.wantRewrite, k)
- }
- for k, v := range test.wantRewrite {
- t.Errorf("#%d. rewrite[%s] missing, want <<%s>>", i, k, v)
- }
- }
-}
-
-// TestDryRun tests that the -n flag suppresses calls to writeFile.
-func TestDryRun(t *testing.T) {
- gopath := filepath.Join(cwd, "testdata")
- if err := os.Setenv("GOPATH", gopath); err != nil {
- t.Fatalf("os.Setenv: %v", err)
- }
-
- *dryrun = true
- defer func() { *dryrun = false }() // restore
- stderr = new(bytes.Buffer)
- writeFile = func(filename string, content []byte, mode os.FileMode) error {
- t.Fatalf("writeFile(%s) called in dryrun mode", filename)
- return nil
- }
-
- if !fiximports("all") {
- t.Fatalf("fiximports failed: %s", stderr)
- }
-}
diff --git a/vendor/golang.org/x/tools/cmd/fiximports/testdata/src/fruit.io/banana/banana.go b/vendor/golang.org/x/tools/cmd/fiximports/testdata/src/fruit.io/banana/banana.go
deleted file mode 100644
index 04e0242..0000000
--- a/vendor/golang.org/x/tools/cmd/fiximports/testdata/src/fruit.io/banana/banana.go
+++ /dev/null
@@ -1,7 +0,0 @@
-package banana
-
-import (
- _ "old.com/one"
- _ "titanic.biz/bar"
- _ "titanic.biz/foo"
-)
diff --git a/vendor/golang.org/x/tools/cmd/fiximports/testdata/src/fruit.io/orange/orange.go b/vendor/golang.org/x/tools/cmd/fiximports/testdata/src/fruit.io/orange/orange.go
deleted file mode 100644
index ae65daa..0000000
--- a/vendor/golang.org/x/tools/cmd/fiximports/testdata/src/fruit.io/orange/orange.go
+++ /dev/null
@@ -1,3 +0,0 @@
-package orange
-
-import _ "fruit.io/pear"
diff --git a/vendor/golang.org/x/tools/cmd/fiximports/testdata/src/fruit.io/pear/pear.go b/vendor/golang.org/x/tools/cmd/fiximports/testdata/src/fruit.io/pear/pear.go
deleted file mode 100644
index de92df0..0000000
--- a/vendor/golang.org/x/tools/cmd/fiximports/testdata/src/fruit.io/pear/pear.go
+++ /dev/null
@@ -1,3 +0,0 @@
-package pear
-
-import _ "fruit.io/banana"
diff --git a/vendor/golang.org/x/tools/cmd/fiximports/testdata/src/new.com/one/one.go b/vendor/golang.org/x/tools/cmd/fiximports/testdata/src/new.com/one/one.go
deleted file mode 100644
index a8c5e83..0000000
--- a/vendor/golang.org/x/tools/cmd/fiximports/testdata/src/new.com/one/one.go
+++ /dev/null
@@ -1 +0,0 @@
-package one // import "new.com/one"
diff --git a/vendor/golang.org/x/tools/cmd/fiximports/testdata/src/old.com/bad/bad.go b/vendor/golang.org/x/tools/cmd/fiximports/testdata/src/old.com/bad/bad.go
deleted file mode 100644
index a1a3d1a..0000000
--- a/vendor/golang.org/x/tools/cmd/fiximports/testdata/src/old.com/bad/bad.go
+++ /dev/null
@@ -1,2 +0,0 @@
-// This ill-formed Go source file is here to ensure the tool is robust
-// against bad packages in the workspace.
diff --git a/vendor/golang.org/x/tools/cmd/fiximports/testdata/src/old.com/one/one.go b/vendor/golang.org/x/tools/cmd/fiximports/testdata/src/old.com/one/one.go
deleted file mode 100644
index a8c5e83..0000000
--- a/vendor/golang.org/x/tools/cmd/fiximports/testdata/src/old.com/one/one.go
+++ /dev/null
@@ -1 +0,0 @@
-package one // import "new.com/one"
diff --git a/vendor/golang.org/x/tools/cmd/fiximports/testdata/src/titanic.biz/bar/bar.go b/vendor/golang.org/x/tools/cmd/fiximports/testdata/src/titanic.biz/bar/bar.go
deleted file mode 100644
index cc720bc..0000000
--- a/vendor/golang.org/x/tools/cmd/fiximports/testdata/src/titanic.biz/bar/bar.go
+++ /dev/null
@@ -1,2 +0,0 @@
-// This package is moving to new.com too.
-package bar // import "new.com/bar"
diff --git a/vendor/golang.org/x/tools/cmd/fiximports/testdata/src/titanic.biz/foo/foo.go b/vendor/golang.org/x/tools/cmd/fiximports/testdata/src/titanic.biz/foo/foo.go
deleted file mode 100644
index 145c31b..0000000
--- a/vendor/golang.org/x/tools/cmd/fiximports/testdata/src/titanic.biz/foo/foo.go
+++ /dev/null
@@ -1,2 +0,0 @@
-// This package hasn't jumped ship yet.
-package foo
diff --git a/vendor/golang.org/x/tools/cmd/getgo/.dockerignore b/vendor/golang.org/x/tools/cmd/getgo/.dockerignore
deleted file mode 100644
index 2b87ad9..0000000
--- a/vendor/golang.org/x/tools/cmd/getgo/.dockerignore
+++ /dev/null
@@ -1,5 +0,0 @@
-.git
-.dockerignore
-LICENSE
-README.md
-.gitignore
diff --git a/vendor/golang.org/x/tools/cmd/getgo/.gitignore b/vendor/golang.org/x/tools/cmd/getgo/.gitignore
deleted file mode 100644
index d4984ab..0000000
--- a/vendor/golang.org/x/tools/cmd/getgo/.gitignore
+++ /dev/null
@@ -1,3 +0,0 @@
-build
-testgetgo
-getgo
diff --git a/vendor/golang.org/x/tools/cmd/getgo/Dockerfile b/vendor/golang.org/x/tools/cmd/getgo/Dockerfile
deleted file mode 100644
index 78fd956..0000000
--- a/vendor/golang.org/x/tools/cmd/getgo/Dockerfile
+++ /dev/null
@@ -1,20 +0,0 @@
-FROM golang:latest
-
-ENV SHELL /bin/bash
-ENV HOME /root
-WORKDIR $HOME
-
-COPY . /go/src/golang.org/x/tools/cmd/getgo
-
-RUN ( \
- cd /go/src/golang.org/x/tools/cmd/getgo \
- && go build \
- && mv getgo /usr/local/bin/getgo \
- )
-
-# undo the adding of GOPATH to env for testing
-ENV PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
-ENV GOPATH ""
-
-# delete /go and /usr/local/go for testing
-RUN rm -rf /go /usr/local/go
diff --git a/vendor/golang.org/x/tools/cmd/getgo/LICENSE b/vendor/golang.org/x/tools/cmd/getgo/LICENSE
deleted file mode 100644
index 32017f8..0000000
--- a/vendor/golang.org/x/tools/cmd/getgo/LICENSE
+++ /dev/null
@@ -1,27 +0,0 @@
-Copyright (c) 2017 The Go Authors. All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are
-met:
-
- * Redistributions of source code must retain the above copyright
-notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
-copyright notice, this list of conditions and the following disclaimer
-in the documentation and/or other materials provided with the
-distribution.
- * Neither the name of Google Inc. nor the names of its
-contributors may be used to endorse or promote products derived from
-this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/vendor/golang.org/x/tools/cmd/getgo/README.md b/vendor/golang.org/x/tools/cmd/getgo/README.md
deleted file mode 100644
index e62a6c2..0000000
--- a/vendor/golang.org/x/tools/cmd/getgo/README.md
+++ /dev/null
@@ -1,71 +0,0 @@
-# getgo
-
-A proof-of-concept command-line installer for Go.
-
-This installer is designed to both install Go as well as do the initial configuration
-of setting up the right environment variables and paths.
-
-It will install the Go distribution (tools & stdlib) to "/.go" inside your home directory by default.
-
-It will setup "$HOME/go" as your GOPATH.
-This is where third party libraries and apps will be installed as well as where you will write your Go code.
-
-If Go is already installed via this installer it will upgrade it to the latest version of Go.
-
-Currently the installer supports Windows, \*nix and macOS on x86 & x64.
-It supports Bash and Zsh on all of these platforms as well as powershell & cmd.exe on Windows.
-
-## Usage
-
-Windows Powershell/cmd.exe:
-
-`(New-Object System.Net.WebClient).DownloadFile('https://get.golang.org/installer.exe', 'installer.exe'); Start-Process -Wait -NonewWindow installer.exe; Remove-Item installer.exe`
-
-Shell (Linux/macOS/Windows):
-
-`curl -LO https://get.golang.org/$(uname)/go_installer && chmod +x go_installer && ./go_installer && rm go_installer`
-
-## To Do
-
-* Check if Go is already installed (via a different method) and update it in place or at least notify the user
-* Lots of testing. It's only had limited testing so far.
-* Add support for additional shells.
-
-## Development instructions
-
-### Testing
-
-There are integration tests in [`main_test.go`](main_test.go). Please add more
-tests there.
-
-#### On unix/linux with the Dockerfile
-
-The Dockerfile automatically builds the binary, moves it to
-`/usr/local/bin/getgo` and then unsets `$GOPATH` and removes all `$GOPATH` from
-`$PATH`.
-
-```bash
-$ docker build --rm --force-rm -t getgo .
-...
-$ docker run --rm -it getgo bash
-root@78425260fad0:~# getgo -v
-Welcome to the Go installer!
-Downloading Go version go1.8.3 to /usr/local/go
-This may take a bit of time...
-Adding "export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/local/go/bin" to /root/.bashrc
-Downloaded!
-Setting up GOPATH
-Adding "export GOPATH=/root/go" to /root/.bashrc
-Adding "export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/local/go/bin:/root/go/bin" to /root/.bashrc
-GOPATH has been setup!
-root@78425260fad0:~# which go
-/usr/local/go/bin/go
-root@78425260fad0:~# echo $GOPATH
-/root/go
-root@78425260fad0:~# echo $PATH
-/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/local/go/bin:/root/go/bin
-```
-
-## Release instructions
-
-To upload a new release of getgo, run `./make.bash && ./upload.bash`.
diff --git a/vendor/golang.org/x/tools/cmd/getgo/download.go b/vendor/golang.org/x/tools/cmd/getgo/download.go
deleted file mode 100644
index 383cb3d..0000000
--- a/vendor/golang.org/x/tools/cmd/getgo/download.go
+++ /dev/null
@@ -1,184 +0,0 @@
-// Copyright 2017 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build !plan9
-
-package main
-
-import (
- "archive/tar"
- "archive/zip"
- "compress/gzip"
- "crypto/sha256"
- "fmt"
- "io"
- "io/ioutil"
- "net/http"
- "os"
- "path/filepath"
- "strings"
-)
-
-const (
- currentVersionURL = "https://golang.org/VERSION?m=text"
- downloadURLPrefix = "https://dl.google.com/go"
-)
-
-// downloadGoVersion downloads and upacks the specific go version to dest/go.
-func downloadGoVersion(version, ops, arch, dest string) error {
- suffix := "tar.gz"
- if ops == "windows" {
- suffix = "zip"
- }
- uri := fmt.Sprintf("%s/%s.%s-%s.%s", downloadURLPrefix, version, ops, arch, suffix)
-
- verbosef("Downloading %s", uri)
-
- req, err := http.NewRequest("GET", uri, nil)
- if err != nil {
- return err
- }
- req.Header.Add("User-Agent", fmt.Sprintf("golang.org-getgo/%s", version))
-
- resp, err := http.DefaultClient.Do(req)
- if err != nil {
- return fmt.Errorf("Downloading Go from %s failed: %v", uri, err)
- }
- if resp.StatusCode > 299 {
- return fmt.Errorf("Downloading Go from %s failed with HTTP status %s", uri, resp.Status)
- }
- defer resp.Body.Close()
-
- tmpf, err := ioutil.TempFile("", "go")
- if err != nil {
- return err
- }
- defer os.Remove(tmpf.Name())
-
- h := sha256.New()
-
- w := io.MultiWriter(tmpf, h)
- if _, err := io.Copy(w, resp.Body); err != nil {
- return err
- }
-
- verbosef("Downloading SHA %s.sha256", uri)
-
- sresp, err := http.Get(uri + ".sha256")
- if err != nil {
- return fmt.Errorf("Downloading Go sha256 from %s.sha256 failed: %v", uri, err)
- }
- defer sresp.Body.Close()
- if sresp.StatusCode > 299 {
- return fmt.Errorf("Downloading Go sha256 from %s.sha256 failed with HTTP status %s", uri, sresp.Status)
- }
-
- shasum, err := ioutil.ReadAll(sresp.Body)
- if err != nil {
- return err
- }
-
- // Check the shasum.
- sum := fmt.Sprintf("%x", h.Sum(nil))
- if sum != string(shasum) {
- return fmt.Errorf("Shasum mismatch %s vs. %s", sum, string(shasum))
- }
-
- unpackFunc := unpackTar
- if ops == "windows" {
- unpackFunc = unpackZip
- }
- if err := unpackFunc(tmpf.Name(), dest); err != nil {
- return fmt.Errorf("Unpacking Go to %s failed: %v", dest, err)
- }
- return nil
-}
-
-func unpack(dest, name string, fi os.FileInfo, r io.Reader) error {
- if strings.HasPrefix(name, "go/") {
- name = name[len("go/"):]
- }
-
- path := filepath.Join(dest, name)
- if fi.IsDir() {
- return os.MkdirAll(path, fi.Mode())
- }
-
- f, err := os.OpenFile(path, os.O_CREATE|os.O_TRUNC|os.O_WRONLY, fi.Mode())
- if err != nil {
- return err
- }
- defer f.Close()
-
- _, err = io.Copy(f, r)
- return err
-}
-
-func unpackTar(src, dest string) error {
- r, err := os.Open(src)
- if err != nil {
- return err
- }
- defer r.Close()
-
- archive, err := gzip.NewReader(r)
- if err != nil {
- return err
- }
- defer archive.Close()
-
- tarReader := tar.NewReader(archive)
-
- for {
- header, err := tarReader.Next()
- if err == io.EOF {
- break
- } else if err != nil {
- return err
- }
-
- if err := unpack(dest, header.Name, header.FileInfo(), tarReader); err != nil {
- return err
- }
- }
-
- return nil
-}
-
-func unpackZip(src, dest string) error {
- zr, err := zip.OpenReader(src)
- if err != nil {
- return err
- }
-
- for _, f := range zr.File {
- fr, err := f.Open()
- if err != nil {
- return err
- }
- if err := unpack(dest, f.Name, f.FileInfo(), fr); err != nil {
- return err
- }
- fr.Close()
- }
-
- return nil
-}
-
-func getLatestGoVersion() (string, error) {
- resp, err := http.Get(currentVersionURL)
- if err != nil {
- return "", fmt.Errorf("Getting current Go version failed: %v", err)
- }
- defer resp.Body.Close()
- if resp.StatusCode > 299 {
- b, _ := ioutil.ReadAll(io.LimitReader(resp.Body, 1024))
- return "", fmt.Errorf("Could not get current Go version: HTTP %d: %q", resp.StatusCode, b)
- }
- version, err := ioutil.ReadAll(resp.Body)
- if err != nil {
- return "", err
- }
- return strings.TrimSpace(string(version)), nil
-}
diff --git a/vendor/golang.org/x/tools/cmd/getgo/download_test.go b/vendor/golang.org/x/tools/cmd/getgo/download_test.go
deleted file mode 100644
index 5a5cc29..0000000
--- a/vendor/golang.org/x/tools/cmd/getgo/download_test.go
+++ /dev/null
@@ -1,36 +0,0 @@
-// Copyright 2017 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build !plan9
-
-package main
-
-import (
- "io/ioutil"
- "os"
- "path/filepath"
- "testing"
-)
-
-func TestDownloadGoVersion(t *testing.T) {
- if testing.Short() {
- t.Skipf("Skipping download in short mode")
- }
-
- tmpd, err := ioutil.TempDir("", "go")
- if err != nil {
- t.Fatal(err)
- }
- defer os.RemoveAll(tmpd)
-
- if err := downloadGoVersion("go1.8.1", "linux", "amd64", filepath.Join(tmpd, "go")); err != nil {
- t.Fatal(err)
- }
-
- // Ensure the VERSION file exists.
- vf := filepath.Join(tmpd, "go", "VERSION")
- if _, err := os.Stat(vf); os.IsNotExist(err) {
- t.Fatalf("file %s does not exist and should", vf)
- }
-}
diff --git a/vendor/golang.org/x/tools/cmd/getgo/main.go b/vendor/golang.org/x/tools/cmd/getgo/main.go
deleted file mode 100644
index a92ae48..0000000
--- a/vendor/golang.org/x/tools/cmd/getgo/main.go
+++ /dev/null
@@ -1,117 +0,0 @@
-// Copyright 2017 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build !plan9
-
-// The getgo command installs Go to the user's system.
-package main
-
-import (
- "bufio"
- "context"
- "errors"
- "flag"
- "fmt"
- "os"
- "os/exec"
- "strings"
-)
-
-var (
- interactive = flag.Bool("i", false, "Interactive mode, prompt for inputs.")
- verbose = flag.Bool("v", false, "Verbose.")
- setupOnly = flag.Bool("skip-dl", false, "Don't download - only set up environment variables")
- goVersion = flag.String("version", "", `Version of Go to install (e.g. "1.8.3"). If empty, uses the latest version.`)
-
- version = "devel"
-)
-
-var exitCleanly error = errors.New("exit cleanly sentinel value")
-
-func main() {
- flag.Parse()
- if *goVersion != "" && !strings.HasPrefix(*goVersion, "go") {
- *goVersion = "go" + *goVersion
- }
-
- ctx := context.Background()
-
- verbosef("version " + version)
-
- runStep := func(s step) {
- err := s(ctx)
- if err == exitCleanly {
- os.Exit(0)
- }
- if err != nil {
- fmt.Fprintln(os.Stderr, err)
- os.Exit(2)
- }
- }
-
- if !*setupOnly {
- runStep(welcome)
- runStep(checkOthers)
- runStep(chooseVersion)
- runStep(downloadGo)
- }
-
- runStep(setupGOPATH)
-}
-
-func verbosef(format string, v ...interface{}) {
- if !*verbose {
- return
- }
-
- fmt.Printf(format+"\n", v...)
-}
-
-func prompt(ctx context.Context, query, defaultAnswer string) (string, error) {
- if !*interactive {
- return defaultAnswer, nil
- }
-
- fmt.Printf("%s [%s]: ", query, defaultAnswer)
-
- type result struct {
- answer string
- err error
- }
- ch := make(chan result, 1)
- go func() {
- s := bufio.NewScanner(os.Stdin)
- if !s.Scan() {
- ch <- result{"", s.Err()}
- return
- }
- answer := s.Text()
- if answer == "" {
- answer = defaultAnswer
- }
- ch <- result{answer, nil}
- }()
-
- select {
- case r := <-ch:
- return r.answer, r.err
- case <-ctx.Done():
- return "", ctx.Err()
- }
-}
-
-func runCommand(ctx context.Context, prog string, args ...string) ([]byte, error) {
- verbosef("Running command: %s %v", prog, args)
-
- cmd := exec.CommandContext(ctx, prog, args...)
- out, err := cmd.CombinedOutput()
- if err != nil {
- return nil, fmt.Errorf("running cmd '%s %s' failed: %s err: %v", prog, strings.Join(args, " "), string(out), err)
- }
- if out != nil && err == nil && len(out) != 0 {
- verbosef("%s", out)
- }
-
- return out, nil
-}
diff --git a/vendor/golang.org/x/tools/cmd/getgo/main_test.go b/vendor/golang.org/x/tools/cmd/getgo/main_test.go
deleted file mode 100644
index e430895..0000000
--- a/vendor/golang.org/x/tools/cmd/getgo/main_test.go
+++ /dev/null
@@ -1,173 +0,0 @@
-// Copyright 2017 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build !plan9
-
-package main
-
-import (
- "bytes"
- "fmt"
- "io/ioutil"
- "os"
- "os/exec"
- "runtime"
- "testing"
-)
-
-const (
- testbin = "testgetgo"
-)
-
-var (
- exeSuffix string // ".exe" on Windows
-)
-
-func init() {
- if runtime.GOOS == "windows" {
- exeSuffix = ".exe"
- }
-}
-
-// TestMain creates a getgo command for testing purposes and
-// deletes it after the tests have been run.
-func TestMain(m *testing.M) {
- if os.Getenv("GOGET_INTEGRATION") == "" {
- fmt.Fprintln(os.Stderr, "main_test: Skipping integration tests with GOGET_INTEGRATION unset")
- return
- }
-
- args := []string{"build", "-tags", testbin, "-o", testbin + exeSuffix}
- out, err := exec.Command("go", args...).CombinedOutput()
- if err != nil {
- fmt.Fprintf(os.Stderr, "building %s failed: %v\n%s", testbin, err, out)
- os.Exit(2)
- }
-
- // Don't let these environment variables confuse the test.
- os.Unsetenv("GOBIN")
- os.Unsetenv("GOPATH")
- os.Unsetenv("GIT_ALLOW_PROTOCOL")
- os.Unsetenv("PATH")
-
- r := m.Run()
-
- os.Remove(testbin + exeSuffix)
-
- os.Exit(r)
-}
-
-func createTmpHome(t *testing.T) string {
- tmpd, err := ioutil.TempDir("", "testgetgo")
- if err != nil {
- t.Fatalf("creating test tempdir failed: %v", err)
- }
-
- os.Setenv("HOME", tmpd)
- return tmpd
-}
-
-// doRun runs the test getgo command, recording stdout and stderr and
-// returning exit status.
-func doRun(t *testing.T, args ...string) error {
- var stdout, stderr bytes.Buffer
- t.Logf("running %s %v", testbin, args)
- cmd := exec.Command("./"+testbin+exeSuffix, args...)
- cmd.Stdout = &stdout
- cmd.Stderr = &stderr
- cmd.Env = os.Environ()
- status := cmd.Run()
- if stdout.Len() > 0 {
- t.Log("standard output:")
- t.Log(stdout.String())
- }
- if stderr.Len() > 0 {
- t.Log("standard error:")
- t.Log(stderr.String())
- }
- return status
-}
-
-func TestCommandVerbose(t *testing.T) {
- tmpd := createTmpHome(t)
- defer os.RemoveAll(tmpd)
-
- err := doRun(t, "-v")
- if err != nil {
- t.Fatal(err)
- }
- // make sure things are in path
- shellConfig, err := shellConfigFile()
- if err != nil {
- t.Fatal(err)
- }
- b, err := ioutil.ReadFile(shellConfig)
- if err != nil {
- t.Fatal(err)
- }
- home, err := getHomeDir()
- if err != nil {
- t.Fatal(err)
- }
-
- expected := fmt.Sprintf(`
-export PATH=$PATH:%s/.go/bin
-
-export GOPATH=%s/go
-
-export PATH=$PATH:%s/go/bin
-`, home, home, home)
-
- if string(b) != expected {
- t.Fatalf("%s expected %q, got %q", shellConfig, expected, string(b))
- }
-}
-
-func TestCommandPathExists(t *testing.T) {
- tmpd := createTmpHome(t)
- defer os.RemoveAll(tmpd)
-
- // run once
- err := doRun(t, "-skip-dl")
- if err != nil {
- t.Fatal(err)
- }
- // make sure things are in path
- shellConfig, err := shellConfigFile()
- if err != nil {
- t.Fatal(err)
- }
- b, err := ioutil.ReadFile(shellConfig)
- if err != nil {
- t.Fatal(err)
- }
- home, err := getHomeDir()
- if err != nil {
- t.Fatal(err)
- }
-
- expected := fmt.Sprintf(`
-export GOPATH=%s/go
-
-export PATH=$PATH:%s/go/bin
-`, home, home)
-
- if string(b) != expected {
- t.Fatalf("%s expected %q, got %q", shellConfig, expected, string(b))
- }
-
- // run twice
- if err := doRun(t, "-skip-dl"); err != nil {
- t.Fatal(err)
- }
-
- b, err = ioutil.ReadFile(shellConfig)
- if err != nil {
- t.Fatal(err)
- }
-
- if string(b) != expected {
- t.Fatalf("%s expected %q, got %q", shellConfig, expected, string(b))
- }
-}
diff --git a/vendor/golang.org/x/tools/cmd/getgo/make.bash b/vendor/golang.org/x/tools/cmd/getgo/make.bash
deleted file mode 100644
index cbc3685..0000000
--- a/vendor/golang.org/x/tools/cmd/getgo/make.bash
+++ /dev/null
@@ -1,13 +0,0 @@
-#!/bin/bash
-
-# Copyright 2017 The Go Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style
-# license that can be found in the LICENSE file.
-
-set -e -o -x
-
-LDFLAGS="-X main.version=$(git describe --always --dirty='*')"
-
-GOOS=windows GOARCH=386 go build -o build/installer.exe -ldflags="$LDFLAGS"
-GOOS=linux GOARCH=386 go build -o build/installer_linux -ldflags="$LDFLAGS"
-GOOS=darwin GOARCH=386 go build -o build/installer_darwin -ldflags="$LDFLAGS"
diff --git a/vendor/golang.org/x/tools/cmd/getgo/path.go b/vendor/golang.org/x/tools/cmd/getgo/path.go
deleted file mode 100644
index 52e0462..0000000
--- a/vendor/golang.org/x/tools/cmd/getgo/path.go
+++ /dev/null
@@ -1,155 +0,0 @@
-// Copyright 2017 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build !plan9
-
-package main
-
-import (
- "bufio"
- "context"
- "fmt"
- "os"
- "os/user"
- "path/filepath"
- "runtime"
- "strings"
-)
-
-const (
- bashConfig = ".bash_profile"
- zshConfig = ".zshrc"
-)
-
-// appendToPATH adds the given path to the PATH environment variable and
-// persists it for future sessions.
-func appendToPATH(value string) error {
- if isInPATH(value) {
- return nil
- }
- return persistEnvVar("PATH", pathVar+envSeparator+value)
-}
-
-func isInPATH(dir string) bool {
- p := os.Getenv("PATH")
-
- paths := strings.Split(p, envSeparator)
- for _, d := range paths {
- if d == dir {
- return true
- }
- }
-
- return false
-}
-
-func getHomeDir() (string, error) {
- home := os.Getenv(homeKey)
- if home != "" {
- return home, nil
- }
-
- u, err := user.Current()
- if err != nil {
- return "", err
- }
- return u.HomeDir, nil
-}
-
-func checkStringExistsFile(filename, value string) (bool, error) {
- file, err := os.OpenFile(filename, os.O_RDONLY, 0600)
- if err != nil {
- if os.IsNotExist(err) {
- return false, nil
- }
- return false, err
- }
- defer file.Close()
-
- scanner := bufio.NewScanner(file)
- for scanner.Scan() {
- line := scanner.Text()
- if line == value {
- return true, nil
- }
- }
-
- return false, scanner.Err()
-}
-
-func appendToFile(filename, value string) error {
- verbosef("Adding %q to %s", value, filename)
-
- ok, err := checkStringExistsFile(filename, value)
- if err != nil {
- return err
- }
- if ok {
- // Nothing to do.
- return nil
- }
-
- f, err := os.OpenFile(filename, os.O_APPEND|os.O_WRONLY|os.O_CREATE, 0600)
- if err != nil {
- return err
- }
- defer f.Close()
-
- _, err = f.WriteString(lineEnding + value + lineEnding)
- return err
-}
-
-func isShell(name string) bool {
- return strings.Contains(currentShell(), name)
-}
-
-// persistEnvVarWindows sets an environment variable in the Windows
-// registry.
-func persistEnvVarWindows(name, value string) error {
- _, err := runCommand(context.Background(), "powershell", "-command",
- fmt.Sprintf(`[Environment]::SetEnvironmentVariable("%s", "%s", "User")`, name, value))
- return err
-}
-
-func persistEnvVar(name, value string) error {
- if runtime.GOOS == "windows" {
- if err := persistEnvVarWindows(name, value); err != nil {
- return err
- }
-
- if isShell("cmd.exe") || isShell("powershell.exe") {
- return os.Setenv(strings.ToUpper(name), value)
- }
- // User is in bash, zsh, etc.
- // Also set the environment variable in their shell config.
- }
-
- rc, err := shellConfigFile()
- if err != nil {
- return err
- }
-
- line := fmt.Sprintf("export %s=%s", strings.ToUpper(name), value)
- if err := appendToFile(rc, line); err != nil {
- return err
- }
-
- return os.Setenv(strings.ToUpper(name), value)
-}
-
-func shellConfigFile() (string, error) {
- home, err := getHomeDir()
- if err != nil {
- return "", err
- }
-
- switch {
- case isShell("bash"):
- return filepath.Join(home, bashConfig), nil
- case isShell("zsh"):
- return filepath.Join(home, zshConfig), nil
- default:
- return "", fmt.Errorf("%q is not a supported shell", currentShell())
- }
-}
diff --git a/vendor/golang.org/x/tools/cmd/getgo/path_test.go b/vendor/golang.org/x/tools/cmd/getgo/path_test.go
deleted file mode 100644
index 5355c6e..0000000
--- a/vendor/golang.org/x/tools/cmd/getgo/path_test.go
+++ /dev/null
@@ -1,58 +0,0 @@
-// Copyright 2017 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build !plan9
-
-package main
-
-import (
- "io/ioutil"
- "os"
- "path/filepath"
- "strings"
- "testing"
-)
-
-func TestAppendPath(t *testing.T) {
- tmpd, err := ioutil.TempDir("", "go")
- if err != nil {
- t.Fatal(err)
- }
- defer os.RemoveAll(tmpd)
-
- if err := os.Setenv("HOME", tmpd); err != nil {
- t.Fatal(err)
- }
-
- GOPATH := os.Getenv("GOPATH")
- if err := appendToPATH(filepath.Join(GOPATH, "bin")); err != nil {
- t.Fatal(err)
- }
-
- shellConfig, err := shellConfigFile()
- if err != nil {
- t.Fatal(err)
- }
- b, err := ioutil.ReadFile(shellConfig)
- if err != nil {
- t.Fatal(err)
- }
-
- expected := "export PATH=" + pathVar + envSeparator + filepath.Join(GOPATH, "bin")
- if strings.TrimSpace(string(b)) != expected {
- t.Fatalf("expected: %q, got %q", expected, strings.TrimSpace(string(b)))
- }
-
- // Check that appendToPATH is idempotent.
- if err := appendToPATH(filepath.Join(GOPATH, "bin")); err != nil {
- t.Fatal(err)
- }
- b, err = ioutil.ReadFile(shellConfig)
- if err != nil {
- t.Fatal(err)
- }
- if strings.TrimSpace(string(b)) != expected {
- t.Fatalf("expected: %q, got %q", expected, strings.TrimSpace(string(b)))
- }
-}
diff --git a/vendor/golang.org/x/tools/cmd/getgo/server/README.md b/vendor/golang.org/x/tools/cmd/getgo/server/README.md
deleted file mode 100644
index 0cf629d..0000000
--- a/vendor/golang.org/x/tools/cmd/getgo/server/README.md
+++ /dev/null
@@ -1,7 +0,0 @@
-# getgo server
-
-## Deployment
-
-```
-gcloud app deploy --promote --project golang-org
-```
diff --git a/vendor/golang.org/x/tools/cmd/getgo/server/app.yaml b/vendor/golang.org/x/tools/cmd/getgo/server/app.yaml
deleted file mode 100644
index 0502c4e..0000000
--- a/vendor/golang.org/x/tools/cmd/getgo/server/app.yaml
+++ /dev/null
@@ -1,7 +0,0 @@
-runtime: go
-service: get
-api_version: go1
-
-handlers:
-- url: /.*
- script: _go_app
diff --git a/vendor/golang.org/x/tools/cmd/getgo/server/main.go b/vendor/golang.org/x/tools/cmd/getgo/server/main.go
deleted file mode 100644
index 9679b3b..0000000
--- a/vendor/golang.org/x/tools/cmd/getgo/server/main.go
+++ /dev/null
@@ -1,61 +0,0 @@
-// Copyright 2017 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Command server serves get.golang.org, redirecting users to the appropriate
-// getgo installer based on the request path.
-package server
-
-import (
- "fmt"
- "net/http"
- "strings"
- "time"
-)
-
-const (
- base = "https://dl.google.com/go/getgo/"
- windowsInstaller = base + "installer.exe"
- linuxInstaller = base + "installer_linux"
- macInstaller = base + "installer_darwin"
-)
-
-// substring-based redirects.
-var stringMatch = map[string]string{
- // via uname, from bash
- "MINGW": windowsInstaller, // Reported as MINGW64_NT-10.0 in git bash
- "Linux": linuxInstaller,
- "Darwin": macInstaller,
-}
-
-func init() {
- http.HandleFunc("/", handler)
-}
-
-func handler(w http.ResponseWriter, r *http.Request) {
- if containsIgnoreCase(r.URL.Path, "installer.exe") {
- // cache bust
- http.Redirect(w, r, windowsInstaller+cacheBust(), http.StatusFound)
- return
- }
-
- for match, redirect := range stringMatch {
- if containsIgnoreCase(r.URL.Path, match) {
- http.Redirect(w, r, redirect, http.StatusFound)
- return
- }
- }
-
- http.NotFound(w, r)
-}
-
-func containsIgnoreCase(s, substr string) bool {
- return strings.Contains(
- strings.ToLower(s),
- strings.ToLower(substr),
- )
-}
-
-func cacheBust() string {
- return fmt.Sprintf("?%d", time.Now().Nanosecond())
-}
diff --git a/vendor/golang.org/x/tools/cmd/getgo/steps.go b/vendor/golang.org/x/tools/cmd/getgo/steps.go
deleted file mode 100644
index 41c57d2..0000000
--- a/vendor/golang.org/x/tools/cmd/getgo/steps.go
+++ /dev/null
@@ -1,133 +0,0 @@
-// Copyright 2017 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build !plan9
-
-package main
-
-import (
- "context"
- "fmt"
- "os"
- "path/filepath"
- "runtime"
- "strings"
-)
-
-type step func(context.Context) error
-
-func welcome(ctx context.Context) error {
- fmt.Println("Welcome to the Go installer!")
- answer, err := prompt(ctx, "Would you like to install Go? Y/n", "Y")
- if err != nil {
- return err
- }
- if strings.ToLower(answer) != "y" {
- fmt.Println("Exiting install.")
- return exitCleanly
- }
-
- return nil
-}
-
-func checkOthers(ctx context.Context) error {
- // TODO: if go is currently installed install new version over that
- path, err := whichGo(ctx)
- if err != nil {
- fmt.Printf("Cannot check if Go is already installed:\n%v\n", err)
- }
- if path == "" {
- return nil
- }
- if path != installPath {
- fmt.Printf("Go is already installed at %v; remove it from your PATH.\n", path)
- }
- return nil
-}
-
-func chooseVersion(ctx context.Context) error {
- if *goVersion != "" {
- return nil
- }
-
- var err error
- *goVersion, err = getLatestGoVersion()
- if err != nil {
- return err
- }
-
- answer, err := prompt(ctx, fmt.Sprintf("The latest Go version is %s, install that? Y/n", *goVersion), "Y")
- if err != nil {
- return err
- }
-
- if strings.ToLower(answer) != "y" {
- // TODO: handle passing a version
- fmt.Println("Aborting install.")
- return exitCleanly
- }
-
- return nil
-}
-
-func downloadGo(ctx context.Context) error {
- answer, err := prompt(ctx, fmt.Sprintf("Download Go version %s to %s? Y/n", *goVersion, installPath), "Y")
- if err != nil {
- return err
- }
-
- if strings.ToLower(answer) != "y" {
- fmt.Println("Aborting install.")
- return exitCleanly
- }
-
- fmt.Printf("Downloading Go version %s to %s\n", *goVersion, installPath)
- fmt.Println("This may take a bit of time...")
-
- if err := downloadGoVersion(*goVersion, runtime.GOOS, arch, installPath); err != nil {
- return err
- }
-
- if err := appendToPATH(filepath.Join(installPath, "bin")); err != nil {
- return err
- }
-
- fmt.Println("Downloaded!")
- return nil
-}
-
-func setupGOPATH(ctx context.Context) error {
- answer, err := prompt(ctx, "Would you like us to setup your GOPATH? Y/n", "Y")
- if err != nil {
- return err
- }
-
- if strings.ToLower(answer) != "y" {
- fmt.Println("Exiting and not setting up GOPATH.")
- return exitCleanly
- }
-
- fmt.Println("Setting up GOPATH")
- home, err := getHomeDir()
- if err != nil {
- return err
- }
-
- gopath := os.Getenv("GOPATH")
- if gopath == "" {
- // set $GOPATH
- gopath = filepath.Join(home, "go")
- if err := persistEnvVar("GOPATH", gopath); err != nil {
- return err
- }
- fmt.Println("GOPATH has been set up!")
- } else {
- verbosef("GOPATH is already set to %s", gopath)
- }
-
- if err := appendToPATH(filepath.Join(gopath, "bin")); err != nil {
- return err
- }
- return persistEnvChangesForSession()
-}
diff --git a/vendor/golang.org/x/tools/cmd/getgo/system.go b/vendor/golang.org/x/tools/cmd/getgo/system.go
deleted file mode 100644
index 07d6f85..0000000
--- a/vendor/golang.org/x/tools/cmd/getgo/system.go
+++ /dev/null
@@ -1,38 +0,0 @@
-// Copyright 2017 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build !plan9
-
-package main
-
-import (
- "bytes"
- "context"
- "os/exec"
- "runtime"
- "strings"
-)
-
-// arch contains either amd64 or 386.
-var arch = func() string {
- cmd := exec.Command("uname", "-m") // "x86_64"
- if runtime.GOOS == "windows" {
- cmd = exec.Command("powershell", "-command", "(Get-WmiObject -Class Win32_ComputerSystem).SystemType") // "x64-based PC"
- }
-
- out, err := cmd.Output()
- if err != nil {
- // a sensible default?
- return "amd64"
- }
- if bytes.Contains(out, []byte("64")) {
- return "amd64"
- }
- return "386"
-}()
-
-func findGo(ctx context.Context, cmd string) (string, error) {
- out, err := exec.CommandContext(ctx, cmd, "go").CombinedOutput()
- return strings.TrimSpace(string(out)), err
-}
diff --git a/vendor/golang.org/x/tools/cmd/getgo/system_unix.go b/vendor/golang.org/x/tools/cmd/getgo/system_unix.go
deleted file mode 100644
index d2405c5..0000000
--- a/vendor/golang.org/x/tools/cmd/getgo/system_unix.go
+++ /dev/null
@@ -1,55 +0,0 @@
-// Copyright 2017 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build darwin dragonfly freebsd linux nacl netbsd openbsd solaris
-
-package main
-
-import (
- "context"
- "fmt"
- "os"
- "path/filepath"
-)
-
-const (
- envSeparator = ":"
- homeKey = "HOME"
- lineEnding = "\n"
- pathVar = "$PATH"
-)
-
-var installPath = func() string {
- home, err := getHomeDir()
- if err != nil {
- return "/usr/local/go"
- }
-
- return filepath.Join(home, ".go")
-}()
-
-func whichGo(ctx context.Context) (string, error) {
- return findGo(ctx, "which")
-}
-
-func isWindowsXP() bool {
- return false
-}
-
-func currentShell() string {
- return os.Getenv("SHELL")
-}
-
-func persistEnvChangesForSession() error {
- shellConfig, err := shellConfigFile()
- if err != nil {
- return err
- }
- fmt.Println()
- fmt.Printf("One more thing! Run `source %s` to persist the\n", shellConfig)
- fmt.Println("new environment variables to your current session, or open a")
- fmt.Println("new shell prompt.")
-
- return nil
-}
diff --git a/vendor/golang.org/x/tools/cmd/getgo/system_windows.go b/vendor/golang.org/x/tools/cmd/getgo/system_windows.go
deleted file mode 100644
index d8a6191..0000000
--- a/vendor/golang.org/x/tools/cmd/getgo/system_windows.go
+++ /dev/null
@@ -1,86 +0,0 @@
-// Copyright 2017 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build windows
-
-package main
-
-import (
- "context"
- "log"
- "os"
- "syscall"
- "unsafe"
-)
-
-const (
- envSeparator = ";"
- homeKey = "USERPROFILE"
- lineEnding = "/r/n"
- pathVar = "$env:Path"
-)
-
-var installPath = `c:\go`
-
-func isWindowsXP() bool {
- v, err := syscall.GetVersion()
- if err != nil {
- log.Fatalf("GetVersion failed: %v", err)
- }
- major := byte(v)
- return major < 6
-}
-
-func whichGo(ctx context.Context) (string, error) {
- return findGo(ctx, "where")
-}
-
-// currentShell reports the current shell.
-// It might be "powershell.exe", "cmd.exe" or any of the *nix shells.
-//
-// Returns empty string if the shell is unknown.
-func currentShell() string {
- shell := os.Getenv("SHELL")
- if shell != "" {
- return shell
- }
-
- pid := os.Getppid()
- pe, err := getProcessEntry(pid)
- if err != nil {
- verbosef("getting shell from process entry failed: %v", err)
- return ""
- }
-
- return syscall.UTF16ToString(pe.ExeFile[:])
-}
-
-func getProcessEntry(pid int) (*syscall.ProcessEntry32, error) {
- // From https://go.googlesource.com/go/+/go1.8.3/src/syscall/syscall_windows.go#941
- snapshot, err := syscall.CreateToolhelp32Snapshot(syscall.TH32CS_SNAPPROCESS, 0)
- if err != nil {
- return nil, err
- }
- defer syscall.CloseHandle(snapshot)
-
- var procEntry syscall.ProcessEntry32
- procEntry.Size = uint32(unsafe.Sizeof(procEntry))
- if err = syscall.Process32First(snapshot, &procEntry); err != nil {
- return nil, err
- }
-
- for {
- if procEntry.ProcessID == uint32(pid) {
- return &procEntry, nil
- }
-
- if err := syscall.Process32Next(snapshot, &procEntry); err != nil {
- return nil, err
- }
- }
-}
-
-func persistEnvChangesForSession() error {
- return nil
-}
diff --git a/vendor/golang.org/x/tools/cmd/getgo/upload.bash b/vendor/golang.org/x/tools/cmd/getgo/upload.bash
deleted file mode 100644
index f52bb23..0000000
--- a/vendor/golang.org/x/tools/cmd/getgo/upload.bash
+++ /dev/null
@@ -1,19 +0,0 @@
-#!/bin/bash
-
-# Copyright 2017 The Go Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style
-# license that can be found in the LICENSE file.
-
-if ! command -v gsutil 2>&1 > /dev/null; then
- echo "Install gsutil:"
- echo
- echo " https://cloud.google.com/storage/docs/gsutil_install#sdk-install"
-fi
-
-if [ ! -d build ]; then
- echo "Run make.bash first"
-fi
-
-set -e -o -x
-
-gsutil -m cp -a public-read build/* gs://golang/getgo
diff --git a/vendor/golang.org/x/tools/cmd/go-contrib-init/contrib.go b/vendor/golang.org/x/tools/cmd/go-contrib-init/contrib.go
deleted file mode 100644
index 7c65746..0000000
--- a/vendor/golang.org/x/tools/cmd/go-contrib-init/contrib.go
+++ /dev/null
@@ -1,289 +0,0 @@
-// Copyright 2017 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// The go-contrib-init command helps new Go contributors get their development
-// environment set up for the Go contribution process.
-//
-// It aims to be a complement or alternative to https://golang.org/doc/contribute.html.
-package main
-
-import (
- "bytes"
- "flag"
- "fmt"
- "go/build"
- "io/ioutil"
- "log"
- "os"
- "os/exec"
- "path/filepath"
- "regexp"
- "runtime"
- "strings"
-)
-
-var (
- repo = flag.String("repo", detectrepo(), "Which go repo you want to contribute to. Use \"go\" for the core, or e.g. \"net\" for golang.org/x/net/*")
- dry = flag.Bool("dry-run", false, "Fail with problems instead of trying to fix things.")
-)
-
-func main() {
- log.SetFlags(0)
- flag.Parse()
-
- checkCLA()
- checkGoroot()
- checkWorkingDir()
- checkGitOrigin()
- checkGitCodeReview()
- fmt.Print("All good. Happy hacking!\n" +
- "Remember to squash your revised commits and preserve the magic Change-Id lines.\n" +
- "Next steps: https://golang.org/doc/contribute.html#commit_changes\n")
-}
-
-func detectrepo() string {
- wd, err := os.Getwd()
- if err != nil {
- return "go"
- }
-
- for _, path := range filepath.SplitList(build.Default.GOPATH) {
- rightdir := filepath.Join(path, "src", "golang.org", "x") + string(os.PathSeparator)
- if strings.HasPrefix(wd, rightdir) {
- tail := wd[len(rightdir):]
- end := strings.Index(tail, string(os.PathSeparator))
- if end > 0 {
- repo := tail[:end]
- return repo
- }
- }
- }
-
- return "go"
-}
-
-var googleSourceRx = regexp.MustCompile(`(?m)^(go|go-review)?\.googlesource.com\b`)
-
-func checkCLA() {
- slurp, err := ioutil.ReadFile(cookiesFile())
- if err != nil && !os.IsNotExist(err) {
- log.Fatal(err)
- }
- if googleSourceRx.Match(slurp) {
- // Probably good.
- return
- }
- log.Fatal("Your .gitcookies file isn't configured.\n" +
- "Next steps:\n" +
- " * Submit a CLA (https://golang.org/doc/contribute.html#cla) if not done\n" +
- " * Go to https://go.googlesource.com/ and click \"Generate Password\" at the top,\n" +
- " then follow instructions.\n" +
- " * Run go-contrib-init again.\n")
-}
-
-func expandUser(s string) string {
- env := "HOME"
- if runtime.GOOS == "windows" {
- env = "USERPROFILE"
- } else if runtime.GOOS == "plan9" {
- env = "home"
- }
- home := os.Getenv(env)
- if home == "" {
- return s
- }
-
- if len(s) >= 2 && s[0] == '~' && os.IsPathSeparator(s[1]) {
- if runtime.GOOS == "windows" {
- s = filepath.ToSlash(filepath.Join(home, s[2:]))
- } else {
- s = filepath.Join(home, s[2:])
- }
- }
- return os.Expand(s, func(env string) string {
- if env == "HOME" {
- return home
- }
- return os.Getenv(env)
- })
-}
-
-func cookiesFile() string {
- out, _ := exec.Command("git", "config", "http.cookiefile").Output()
- if s := strings.TrimSpace(string(out)); s != "" {
- if strings.HasPrefix(s, "~") {
- s = expandUser(s)
- }
- return s
- }
- if runtime.GOOS == "windows" {
- return filepath.Join(os.Getenv("USERPROFILE"), ".gitcookies")
- }
- return filepath.Join(os.Getenv("HOME"), ".gitcookies")
-}
-
-func checkGoroot() {
- v := os.Getenv("GOROOT")
- if v == "" {
- return
- }
- if *repo == "go" {
- if strings.HasPrefix(v, "/usr/") {
- log.Fatalf("Your GOROOT environment variable is set to %q\n"+
- "This is almost certainly not what you want. Either unset\n"+
- "your GOROOT or set it to the path of your development version\n"+
- "of Go.", v)
- }
- slurp, err := ioutil.ReadFile(filepath.Join(v, "VERSION"))
- if err == nil {
- slurp = bytes.TrimSpace(slurp)
- log.Fatalf("Your GOROOT environment variable is set to %q\n"+
- "But that path is to a binary release of Go, with VERSION file %q.\n"+
- "You should hack on Go in a fresh checkout of Go. Fix or unset your GOROOT.\n",
- v, slurp)
- }
- }
-}
-
-func checkWorkingDir() {
- wd, err := os.Getwd()
- if err != nil {
- log.Fatal(err)
- }
- if *repo == "go" {
- if inGoPath(wd) {
- log.Fatalf(`You can't work on Go from within your GOPATH. Please checkout Go outside of your GOPATH
-
-Current directory: %s
-GOPATH: %s
-`, wd, os.Getenv("GOPATH"))
- }
- return
- }
-
- gopath := firstGoPath()
- if gopath == "" {
- log.Fatal("Your GOPATH is not set, please set it")
- }
-
- rightdir := filepath.Join(gopath, "src", "golang.org", "x", *repo)
- if !strings.HasPrefix(wd, rightdir) {
- dirExists, err := exists(rightdir)
- if err != nil {
- log.Fatal(err)
- }
- if !dirExists {
- log.Fatalf("The repo you want to work on is currently not on your system.\n"+
- "Run %q to obtain this repo\n"+
- "then go to the directory %q\n",
- "go get -d golang.org/x/"+*repo, rightdir)
- }
- log.Fatalf("Your current directory is:%q\n"+
- "Working on golang/x/%v requires you be in %q\n",
- wd, *repo, rightdir)
- }
-}
-
-func firstGoPath() string {
- list := filepath.SplitList(build.Default.GOPATH)
- if len(list) < 1 {
- return ""
- }
- return list[0]
-}
-
-func exists(path string) (bool, error) {
- _, err := os.Stat(path)
- if os.IsNotExist(err) {
- return false, nil
- }
- return true, err
-}
-
-func inGoPath(wd string) bool {
- if os.Getenv("GOPATH") == "" {
- return false
- }
-
- for _, path := range filepath.SplitList(os.Getenv("GOPATH")) {
- if strings.HasPrefix(wd, filepath.Join(path, "src")) {
- return true
- }
- }
-
- return false
-}
-
-// mostly check that they didn't clone from github
-func checkGitOrigin() {
- if _, err := exec.LookPath("git"); err != nil {
- log.Fatalf("You don't appear to have git installed. Do that.")
- }
- wantRemote := "https://go.googlesource.com/" + *repo
- remotes, err := exec.Command("git", "remote", "-v").Output()
- if err != nil {
- msg := cmdErr(err)
- if strings.Contains(msg, "Not a git repository") {
- log.Fatalf("Your current directory is not in a git checkout of %s", wantRemote)
- }
- log.Fatalf("Error running git remote -v: %v", msg)
- }
- matches := 0
- for _, line := range strings.Split(string(remotes), "\n") {
- line = strings.TrimSpace(line)
- if !strings.HasPrefix(line, "origin") {
- continue
- }
- if !strings.Contains(line, wantRemote) {
- curRemote := strings.Fields(strings.TrimPrefix(line, "origin"))[0]
- // TODO: if not in dryRun mode, just fix it?
- log.Fatalf("Current directory's git was cloned from %q; origin should be %q", curRemote, wantRemote)
- }
- matches++
- }
- if matches == 0 {
- log.Fatalf("git remote -v output didn't contain expected %q. Got:\n%s", wantRemote, remotes)
- }
-}
-
-func cmdErr(err error) string {
- if ee, ok := err.(*exec.ExitError); ok && len(ee.Stderr) > 0 {
- return fmt.Sprintf("%s: %s", err, ee.Stderr)
- }
- return fmt.Sprint(err)
-}
-
-func checkGitCodeReview() {
- if _, err := exec.LookPath("git-codereview"); err != nil {
- if *dry {
- log.Fatalf("You don't appear to have git-codereview tool. While this is technically optional,\n" +
- "almost all Go contributors use it. Our documentation and this tool assume it is used.\n" +
- "To install it, run:\n\n\t$ go get golang.org/x/review/git-codereview\n\n(Then run go-contrib-init again)")
- }
- err := exec.Command("go", "get", "golang.org/x/review/git-codereview").Run()
- if err != nil {
- log.Fatalf("Error running go get golang.org/x/review/git-codereview: %v", cmdErr(err))
- }
- log.Printf("Installed git-codereview (ran `go get golang.org/x/review/git-codereview`)")
- }
- missing := false
- for _, cmd := range []string{"change", "gofmt", "mail", "pending", "submit", "sync"} {
- v, _ := exec.Command("git", "config", "alias."+cmd).Output()
- if strings.Contains(string(v), "codereview") {
- continue
- }
- if *dry {
- log.Printf("Missing alias. Run:\n\t$ git config alias.%s \"codereview %s\"", cmd, cmd)
- missing = true
- } else {
- err := exec.Command("git", "config", "alias."+cmd, "codereview "+cmd).Run()
- if err != nil {
- log.Fatalf("Error setting alias.%s: %v", cmd, cmdErr(err))
- }
- }
- }
- if missing {
- log.Fatalf("Missing aliases. (While optional, this tool assumes you use them.)")
- }
-}
diff --git a/vendor/golang.org/x/tools/cmd/go-contrib-init/contrib_test.go b/vendor/golang.org/x/tools/cmd/go-contrib-init/contrib_test.go
deleted file mode 100644
index c151f02..0000000
--- a/vendor/golang.org/x/tools/cmd/go-contrib-init/contrib_test.go
+++ /dev/null
@@ -1,35 +0,0 @@
-package main
-
-import (
- "os"
- "runtime"
- "testing"
-)
-
-func TestExpandUser(t *testing.T) {
- env := "HOME"
- if runtime.GOOS == "windows" {
- env = "USERPROFILE"
- } else if runtime.GOOS == "plan9" {
- env = "home"
- }
-
- oldenv := os.Getenv(env)
- os.Setenv(env, "/home/gopher")
- defer os.Setenv(env, oldenv)
-
- tests := []struct {
- input string
- want string
- }{
- {input: "~/foo", want: "/home/gopher/foo"},
- {input: "${HOME}/foo", want: "/home/gopher/foo"},
- {input: "/~/foo", want: "/~/foo"},
- }
- for _, tt := range tests {
- got := expandUser(tt.input)
- if got != tt.want {
- t.Fatalf("want %q, but %q", tt.want, got)
- }
- }
-}
diff --git a/vendor/golang.org/x/tools/cmd/godex/doc.go b/vendor/golang.org/x/tools/cmd/godex/doc.go
deleted file mode 100644
index ceb7c2f..0000000
--- a/vendor/golang.org/x/tools/cmd/godex/doc.go
+++ /dev/null
@@ -1,69 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// The godex command prints (dumps) exported information of packages
-// or selected package objects.
-//
-// In contrast to godoc, godex extracts this information from compiled
-// object files. Hence the exported data is truly what a compiler will
-// see, at the cost of missing commentary.
-//
-// Usage: godex [flags] {path[.name]}
-//
-// Each argument must be a (possibly partial) package path, optionally
-// followed by a dot and the name of a package object:
-//
-// godex math
-// godex math.Sin
-// godex math.Sin fmt.Printf
-// godex go/types
-//
-// godex automatically tries all possible package path prefixes if only a
-// partial package path is given. For instance, for the path "go/types",
-// godex prepends "golang.org/x/tools".
-//
-// The prefixes are computed by searching the directories specified by
-// the GOROOT and GOPATH environment variables (and by excluding the
-// build OS- and architecture-specific directory names from the path).
-// The search order is depth-first and alphabetic; for a partial path
-// "foo", a package "a/foo" is found before "b/foo".
-//
-// Absolute and relative paths may be provided, which disable automatic
-// prefix generation:
-//
-// godex $GOROOT/pkg/darwin_amd64/sort
-// godex ./sort
-//
-// All but the last path element may contain dots; a dot in the last path
-// element separates the package path from the package object name. If the
-// last path element contains a dot, terminate the argument with another
-// dot (indicating an empty object name). For instance, the path for a
-// package foo.bar would be specified as in:
-//
-// godex foo.bar.
-//
-// The flags are:
-//
-// -s=""
-// only consider packages from src, where src is one of the supported compilers
-// -v=false
-// verbose mode
-//
-// The following sources (-s arguments) are supported:
-//
-// gc
-// gc-generated object files
-// gccgo
-// gccgo-generated object files
-// gccgo-new
-// gccgo-generated object files using a condensed format (experimental)
-// source
-// (uncompiled) source code (not yet implemented)
-//
-// If no -s argument is provided, godex will try to find a matching source.
-//
-package main // import "golang.org/x/tools/cmd/godex"
-
-// BUG(gri): support for -s=source is not yet implemented
-// BUG(gri): gccgo-importing appears to have occasional problems stalling godex; try -s=gc as work-around
diff --git a/vendor/golang.org/x/tools/cmd/godex/gc.go b/vendor/golang.org/x/tools/cmd/godex/gc.go
deleted file mode 100644
index 95eba65..0000000
--- a/vendor/golang.org/x/tools/cmd/godex/gc.go
+++ /dev/null
@@ -1,13 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// This file implements access to gc-generated export data.
-
-package main
-
-import "go/importer"
-
-func init() {
- register("gc", importer.For("gc", nil))
-}
diff --git a/vendor/golang.org/x/tools/cmd/godex/gccgo.go b/vendor/golang.org/x/tools/cmd/godex/gccgo.go
deleted file mode 100644
index 7644998..0000000
--- a/vendor/golang.org/x/tools/cmd/godex/gccgo.go
+++ /dev/null
@@ -1,34 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// This file implements access to gccgo-generated export data.
-
-package main
-
-import (
- "go/importer"
- "go/types"
-)
-
-func init() {
- register("gccgo", importer.For("gccgo", nil))
-}
-
-// Print the extra gccgo compiler data for this package, if it exists.
-func (p *printer) printGccgoExtra(pkg *types.Package) {
- // Disabled for now.
- // TODO(gri) address this at some point.
-
- // if initdata, ok := initmap[pkg]; ok {
- // p.printf("/*\npriority %d\n", initdata.Priority)
-
- // p.printDecl("init", len(initdata.Inits), func() {
- // for _, init := range initdata.Inits {
- // p.printf("%s %s %d\n", init.Name, init.InitFunc, init.Priority)
- // }
- // })
-
- // p.print("*/\n")
- // }
-}
diff --git a/vendor/golang.org/x/tools/cmd/godex/godex.go b/vendor/golang.org/x/tools/cmd/godex/godex.go
deleted file mode 100644
index a222ed6..0000000
--- a/vendor/golang.org/x/tools/cmd/godex/godex.go
+++ /dev/null
@@ -1,211 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-import (
- "errors"
- "flag"
- "fmt"
- "go/build"
- "go/types"
- "io/ioutil"
- "os"
- "path/filepath"
- "strings"
-)
-
-var (
- source = flag.String("s", "", "only consider packages from src, where src is one of the supported compilers")
- verbose = flag.Bool("v", false, "verbose mode")
-)
-
-// lists of registered sources and corresponding importers
-var (
- sources []string
- importers []types.Importer
- importFailed = errors.New("import failed")
-)
-
-func usage() {
- fmt.Fprintln(os.Stderr, "usage: godex [flags] {path|qualifiedIdent}")
- flag.PrintDefaults()
- os.Exit(2)
-}
-
-func report(msg string) {
- fmt.Fprintln(os.Stderr, "error: "+msg)
- os.Exit(2)
-}
-
-func main() {
- flag.Usage = usage
- flag.Parse()
-
- if flag.NArg() == 0 {
- report("no package name, path, or file provided")
- }
-
- var imp types.Importer = new(tryImporters)
- if *source != "" {
- imp = lookup(*source)
- if imp == nil {
- report("source (-s argument) must be one of: " + strings.Join(sources, ", "))
- }
- }
-
- for _, arg := range flag.Args() {
- path, name := splitPathIdent(arg)
- logf("\tprocessing %q: path = %q, name = %s\n", arg, path, name)
-
- // generate possible package path prefixes
- // (at the moment we do this for each argument - should probably cache the generated prefixes)
- prefixes := make(chan string)
- go genPrefixes(prefixes, !filepath.IsAbs(path) && !build.IsLocalImport(path))
-
- // import package
- pkg, err := tryPrefixes(prefixes, path, imp)
- if err != nil {
- logf("\t=> ignoring %q: %s\n", path, err)
- continue
- }
-
- // filter objects if needed
- var filter func(types.Object) bool
- if name != "" {
- filter = func(obj types.Object) bool {
- // TODO(gri) perhaps use regular expression matching here?
- return obj.Name() == name
- }
- }
-
- // print contents
- print(os.Stdout, pkg, filter)
- }
-}
-
-func logf(format string, args ...interface{}) {
- if *verbose {
- fmt.Fprintf(os.Stderr, format, args...)
- }
-}
-
-// splitPathIdent splits a path.name argument into its components.
-// All but the last path element may contain dots.
-func splitPathIdent(arg string) (path, name string) {
- if i := strings.LastIndex(arg, "."); i >= 0 {
- if j := strings.LastIndex(arg, "/"); j < i {
- // '.' is not part of path
- path = arg[:i]
- name = arg[i+1:]
- return
- }
- }
- path = arg
- return
-}
-
-// tryPrefixes tries to import the package given by (the possibly partial) path using the given importer imp
-// by prepending all possible prefixes to path. It returns with the first package that it could import, or
-// with an error.
-func tryPrefixes(prefixes chan string, path string, imp types.Importer) (pkg *types.Package, err error) {
- for prefix := range prefixes {
- actual := path
- if prefix == "" {
- // don't use filepath.Join as it will sanitize the path and remove
- // a leading dot and then the path is not recognized as a relative
- // package path by the importers anymore
- logf("\ttrying no prefix\n")
- } else {
- actual = filepath.Join(prefix, path)
- logf("\ttrying prefix %q\n", prefix)
- }
- pkg, err = imp.Import(actual)
- if err == nil {
- break
- }
- logf("\t=> importing %q failed: %s\n", actual, err)
- }
- return
-}
-
-// tryImporters is an importer that tries all registered importers
-// successively until one of them succeeds or all of them failed.
-type tryImporters struct{}
-
-func (t *tryImporters) Import(path string) (pkg *types.Package, err error) {
- for i, imp := range importers {
- logf("\t\ttrying %s import\n", sources[i])
- pkg, err = imp.Import(path)
- if err == nil {
- break
- }
- logf("\t\t=> %s import failed: %s\n", sources[i], err)
- }
- return
-}
-
-type protector struct {
- imp types.Importer
-}
-
-func (p *protector) Import(path string) (pkg *types.Package, err error) {
- defer func() {
- if recover() != nil {
- pkg = nil
- err = importFailed
- }
- }()
- return p.imp.Import(path)
-}
-
-// protect protects an importer imp from panics and returns the protected importer.
-func protect(imp types.Importer) types.Importer {
- return &protector{imp}
-}
-
-// register registers an importer imp for a given source src.
-func register(src string, imp types.Importer) {
- if lookup(src) != nil {
- panic(src + " importer already registered")
- }
- sources = append(sources, src)
- importers = append(importers, protect(imp))
-}
-
-// lookup returns the importer imp for a given source src.
-func lookup(src string) types.Importer {
- for i, s := range sources {
- if s == src {
- return importers[i]
- }
- }
- return nil
-}
-
-func genPrefixes(out chan string, all bool) {
- out <- ""
- if all {
- platform := build.Default.GOOS + "_" + build.Default.GOARCH
- dirnames := append([]string{build.Default.GOROOT}, filepath.SplitList(build.Default.GOPATH)...)
- for _, dirname := range dirnames {
- walkDir(filepath.Join(dirname, "pkg", platform), "", out)
- }
- }
- close(out)
-}
-
-func walkDir(dirname, prefix string, out chan string) {
- fiList, err := ioutil.ReadDir(dirname)
- if err != nil {
- return
- }
- for _, fi := range fiList {
- if fi.IsDir() && !strings.HasPrefix(fi.Name(), ".") {
- prefix := filepath.Join(prefix, fi.Name())
- out <- prefix
- walkDir(filepath.Join(dirname, fi.Name()), prefix, out)
- }
- }
-}
diff --git a/vendor/golang.org/x/tools/cmd/godex/isAlias18.go b/vendor/golang.org/x/tools/cmd/godex/isAlias18.go
deleted file mode 100644
index cab1292..0000000
--- a/vendor/golang.org/x/tools/cmd/godex/isAlias18.go
+++ /dev/null
@@ -1,13 +0,0 @@
-// Copyright 2017 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build !go1.9
-
-package main
-
-import "go/types"
-
-func isAlias(obj *types.TypeName) bool {
- return false // there are no type aliases before Go 1.9
-}
diff --git a/vendor/golang.org/x/tools/cmd/godex/isAlias19.go b/vendor/golang.org/x/tools/cmd/godex/isAlias19.go
deleted file mode 100644
index 6ebdd42..0000000
--- a/vendor/golang.org/x/tools/cmd/godex/isAlias19.go
+++ /dev/null
@@ -1,13 +0,0 @@
-// Copyright 2017 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build go1.9
-
-package main
-
-import "go/types"
-
-func isAlias(obj *types.TypeName) bool {
- return obj.IsAlias()
-}
diff --git a/vendor/golang.org/x/tools/cmd/godex/print.go b/vendor/golang.org/x/tools/cmd/godex/print.go
deleted file mode 100644
index adce864..0000000
--- a/vendor/golang.org/x/tools/cmd/godex/print.go
+++ /dev/null
@@ -1,373 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-import (
- "bytes"
- "fmt"
- exact "go/constant"
- "go/token"
- "go/types"
- "io"
- "math/big"
-)
-
-// TODO(gri) use tabwriter for alignment?
-
-func print(w io.Writer, pkg *types.Package, filter func(types.Object) bool) {
- var p printer
- p.pkg = pkg
- p.printPackage(pkg, filter)
- p.printGccgoExtra(pkg)
- io.Copy(w, &p.buf)
-}
-
-type printer struct {
- pkg *types.Package
- buf bytes.Buffer
- indent int // current indentation level
- last byte // last byte written
-}
-
-func (p *printer) print(s string) {
- // Write the string one byte at a time. We care about the presence of
- // newlines for indentation which we will see even in the presence of
- // (non-corrupted) Unicode; no need to read one rune at a time.
- for i := 0; i < len(s); i++ {
- ch := s[i]
- if ch != '\n' && p.last == '\n' {
- // Note: This could lead to a range overflow for very large
- // indentations, but it's extremely unlikely to happen for
- // non-pathological code.
- p.buf.WriteString("\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t"[:p.indent])
- }
- p.buf.WriteByte(ch)
- p.last = ch
- }
-}
-
-func (p *printer) printf(format string, args ...interface{}) {
- p.print(fmt.Sprintf(format, args...))
-}
-
-// methodsFor returns the named type and corresponding methods if the type
-// denoted by obj is not an interface and has methods. Otherwise it returns
-// the zero value.
-func methodsFor(obj *types.TypeName) (*types.Named, []*types.Selection) {
- named, _ := obj.Type().(*types.Named)
- if named == nil {
- // A type name's type can also be the
- // exported basic type unsafe.Pointer.
- return nil, nil
- }
- if _, ok := named.Underlying().(*types.Interface); ok {
- // ignore interfaces
- return nil, nil
- }
- methods := combinedMethodSet(named)
- if len(methods) == 0 {
- return nil, nil
- }
- return named, methods
-}
-
-func (p *printer) printPackage(pkg *types.Package, filter func(types.Object) bool) {
- // collect objects by kind
- var (
- consts []*types.Const
- typem []*types.Named // non-interface types with methods
- typez []*types.TypeName // interfaces or types without methods
- vars []*types.Var
- funcs []*types.Func
- builtins []*types.Builtin
- methods = make(map[*types.Named][]*types.Selection) // method sets for named types
- )
- scope := pkg.Scope()
- for _, name := range scope.Names() {
- obj := scope.Lookup(name)
- if obj.Exported() {
- // collect top-level exported and possibly filtered objects
- if filter == nil || filter(obj) {
- switch obj := obj.(type) {
- case *types.Const:
- consts = append(consts, obj)
- case *types.TypeName:
- // group into types with methods and types without
- if named, m := methodsFor(obj); named != nil {
- typem = append(typem, named)
- methods[named] = m
- } else {
- typez = append(typez, obj)
- }
- case *types.Var:
- vars = append(vars, obj)
- case *types.Func:
- funcs = append(funcs, obj)
- case *types.Builtin:
- // for unsafe.Sizeof, etc.
- builtins = append(builtins, obj)
- }
- }
- } else if filter == nil {
- // no filtering: collect top-level unexported types with methods
- if obj, _ := obj.(*types.TypeName); obj != nil {
- // see case *types.TypeName above
- if named, m := methodsFor(obj); named != nil {
- typem = append(typem, named)
- methods[named] = m
- }
- }
- }
- }
-
- p.printf("package %s // %q\n", pkg.Name(), pkg.Path())
-
- p.printDecl("const", len(consts), func() {
- for _, obj := range consts {
- p.printObj(obj)
- p.print("\n")
- }
- })
-
- p.printDecl("var", len(vars), func() {
- for _, obj := range vars {
- p.printObj(obj)
- p.print("\n")
- }
- })
-
- p.printDecl("type", len(typez), func() {
- for _, obj := range typez {
- p.printf("%s ", obj.Name())
- typ := obj.Type()
- if isAlias(obj) {
- p.print("= ")
- p.writeType(p.pkg, typ)
- } else {
- p.writeType(p.pkg, typ.Underlying())
- }
- p.print("\n")
- }
- })
-
- // non-interface types with methods
- for _, named := range typem {
- first := true
- if obj := named.Obj(); obj.Exported() {
- if first {
- p.print("\n")
- first = false
- }
- p.printf("type %s ", obj.Name())
- p.writeType(p.pkg, named.Underlying())
- p.print("\n")
- }
- for _, m := range methods[named] {
- if obj := m.Obj(); obj.Exported() {
- if first {
- p.print("\n")
- first = false
- }
- p.printFunc(m.Recv(), obj.(*types.Func))
- p.print("\n")
- }
- }
- }
-
- if len(funcs) > 0 {
- p.print("\n")
- for _, obj := range funcs {
- p.printFunc(nil, obj)
- p.print("\n")
- }
- }
-
- // TODO(gri) better handling of builtins (package unsafe only)
- if len(builtins) > 0 {
- p.print("\n")
- for _, obj := range builtins {
- p.printf("func %s() // builtin\n", obj.Name())
- }
- }
-
- p.print("\n")
-}
-
-func (p *printer) printDecl(keyword string, n int, printGroup func()) {
- switch n {
- case 0:
- // nothing to do
- case 1:
- p.printf("\n%s ", keyword)
- printGroup()
- default:
- p.printf("\n%s (\n", keyword)
- p.indent++
- printGroup()
- p.indent--
- p.print(")\n")
- }
-}
-
-// absInt returns the absolute value of v as a *big.Int.
-// v must be a numeric value.
-func absInt(v exact.Value) *big.Int {
- // compute big-endian representation of v
- b := exact.Bytes(v) // little-endian
- for i, j := 0, len(b)-1; i < j; i, j = i+1, j-1 {
- b[i], b[j] = b[j], b[i]
- }
- return new(big.Int).SetBytes(b)
-}
-
-var (
- one = big.NewRat(1, 1)
- ten = big.NewRat(10, 1)
-)
-
-// floatString returns the string representation for a
-// numeric value v in normalized floating-point format.
-func floatString(v exact.Value) string {
- if exact.Sign(v) == 0 {
- return "0.0"
- }
- // x != 0
-
- // convert |v| into a big.Rat x
- x := new(big.Rat).SetFrac(absInt(exact.Num(v)), absInt(exact.Denom(v)))
-
- // normalize x and determine exponent e
- // (This is not very efficient, but also not speed-critical.)
- var e int
- for x.Cmp(ten) >= 0 {
- x.Quo(x, ten)
- e++
- }
- for x.Cmp(one) < 0 {
- x.Mul(x, ten)
- e--
- }
-
- // TODO(gri) Values such as 1/2 are easier to read in form 0.5
- // rather than 5.0e-1. Similarly, 1.0e1 is easier to read as
- // 10.0. Fine-tune best exponent range for readability.
-
- s := x.FloatString(100) // good-enough precision
-
- // trim trailing 0's
- i := len(s)
- for i > 0 && s[i-1] == '0' {
- i--
- }
- s = s[:i]
-
- // add a 0 if the number ends in decimal point
- if len(s) > 0 && s[len(s)-1] == '.' {
- s += "0"
- }
-
- // add exponent and sign
- if e != 0 {
- s += fmt.Sprintf("e%+d", e)
- }
- if exact.Sign(v) < 0 {
- s = "-" + s
- }
-
- // TODO(gri) If v is a "small" fraction (i.e., numerator and denominator
- // are just a small number of decimal digits), add the exact fraction as
- // a comment. For instance: 3.3333...e-1 /* = 1/3 */
-
- return s
-}
-
-// valString returns the string representation for the value v.
-// Setting floatFmt forces an integer value to be formatted in
-// normalized floating-point format.
-// TODO(gri) Move this code into package exact.
-func valString(v exact.Value, floatFmt bool) string {
- switch v.Kind() {
- case exact.Int:
- if floatFmt {
- return floatString(v)
- }
- case exact.Float:
- return floatString(v)
- case exact.Complex:
- re := exact.Real(v)
- im := exact.Imag(v)
- var s string
- if exact.Sign(re) != 0 {
- s = floatString(re)
- if exact.Sign(im) >= 0 {
- s += " + "
- } else {
- s += " - "
- im = exact.UnaryOp(token.SUB, im, 0) // negate im
- }
- }
- // im != 0, otherwise v would be exact.Int or exact.Float
- return s + floatString(im) + "i"
- }
- return v.String()
-}
-
-func (p *printer) printObj(obj types.Object) {
- p.print(obj.Name())
-
- typ, basic := obj.Type().Underlying().(*types.Basic)
- if basic && typ.Info()&types.IsUntyped != 0 {
- // don't write untyped types
- } else {
- p.print(" ")
- p.writeType(p.pkg, obj.Type())
- }
-
- if obj, ok := obj.(*types.Const); ok {
- floatFmt := basic && typ.Info()&(types.IsFloat|types.IsComplex) != 0
- p.print(" = ")
- p.print(valString(obj.Val(), floatFmt))
- }
-}
-
-func (p *printer) printFunc(recvType types.Type, obj *types.Func) {
- p.print("func ")
- sig := obj.Type().(*types.Signature)
- if recvType != nil {
- p.print("(")
- p.writeType(p.pkg, recvType)
- p.print(") ")
- }
- p.print(obj.Name())
- p.writeSignature(p.pkg, sig)
-}
-
-// combinedMethodSet returns the method set for a named type T
-// merged with all the methods of *T that have different names than
-// the methods of T.
-//
-// combinedMethodSet is analogous to types/typeutil.IntuitiveMethodSet
-// but doesn't require a MethodSetCache.
-// TODO(gri) If this functionality doesn't change over time, consider
-// just calling IntuitiveMethodSet eventually.
-func combinedMethodSet(T *types.Named) []*types.Selection {
- // method set for T
- mset := types.NewMethodSet(T)
- var res []*types.Selection
- for i, n := 0, mset.Len(); i < n; i++ {
- res = append(res, mset.At(i))
- }
-
- // add all *T methods with names different from T methods
- pmset := types.NewMethodSet(types.NewPointer(T))
- for i, n := 0, pmset.Len(); i < n; i++ {
- pm := pmset.At(i)
- if obj := pm.Obj(); mset.Lookup(obj.Pkg(), obj.Name()) == nil {
- res = append(res, pm)
- }
- }
-
- return res
-}
diff --git a/vendor/golang.org/x/tools/cmd/godex/source.go b/vendor/golang.org/x/tools/cmd/godex/source.go
deleted file mode 100644
index 85235e9..0000000
--- a/vendor/golang.org/x/tools/cmd/godex/source.go
+++ /dev/null
@@ -1,19 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// This file implements access to export data from source.
-
-package main
-
-import "go/types"
-
-func init() {
- register("source", sourceImporter{})
-}
-
-type sourceImporter struct{}
-
-func (sourceImporter) Import(path string) (*types.Package, error) {
- panic("unimplemented")
-}
diff --git a/vendor/golang.org/x/tools/cmd/godex/writetype.go b/vendor/golang.org/x/tools/cmd/godex/writetype.go
deleted file mode 100644
index dd17f90..0000000
--- a/vendor/golang.org/x/tools/cmd/godex/writetype.go
+++ /dev/null
@@ -1,242 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// This file implements writing of types. The functionality is lifted
-// directly from go/types, but now contains various modifications for
-// nicer output.
-//
-// TODO(gri) back-port once we have a fixed interface and once the
-// go/types API is not frozen anymore for the 1.3 release; and remove
-// this implementation if possible.
-
-package main
-
-import "go/types"
-
-func (p *printer) writeType(this *types.Package, typ types.Type) {
- p.writeTypeInternal(this, typ, make([]types.Type, 8))
-}
-
-// From go/types - leave for now to ease back-porting this code.
-const GcCompatibilityMode = false
-
-func (p *printer) writeTypeInternal(this *types.Package, typ types.Type, visited []types.Type) {
- // Theoretically, this is a quadratic lookup algorithm, but in
- // practice deeply nested composite types with unnamed component
- // types are uncommon. This code is likely more efficient than
- // using a map.
- for _, t := range visited {
- if t == typ {
- p.printf("○%T", typ) // cycle to typ
- return
- }
- }
- visited = append(visited, typ)
-
- switch t := typ.(type) {
- case nil:
- p.print("")
-
- case *types.Basic:
- if t.Kind() == types.UnsafePointer {
- p.print("unsafe.")
- }
- if GcCompatibilityMode {
- // forget the alias names
- switch t.Kind() {
- case types.Byte:
- t = types.Typ[types.Uint8]
- case types.Rune:
- t = types.Typ[types.Int32]
- }
- }
- p.print(t.Name())
-
- case *types.Array:
- p.printf("[%d]", t.Len())
- p.writeTypeInternal(this, t.Elem(), visited)
-
- case *types.Slice:
- p.print("[]")
- p.writeTypeInternal(this, t.Elem(), visited)
-
- case *types.Struct:
- n := t.NumFields()
- if n == 0 {
- p.print("struct{}")
- return
- }
-
- p.print("struct {\n")
- p.indent++
- for i := 0; i < n; i++ {
- f := t.Field(i)
- if !f.Anonymous() {
- p.printf("%s ", f.Name())
- }
- p.writeTypeInternal(this, f.Type(), visited)
- if tag := t.Tag(i); tag != "" {
- p.printf(" %q", tag)
- }
- p.print("\n")
- }
- p.indent--
- p.print("}")
-
- case *types.Pointer:
- p.print("*")
- p.writeTypeInternal(this, t.Elem(), visited)
-
- case *types.Tuple:
- p.writeTuple(this, t, false, visited)
-
- case *types.Signature:
- p.print("func")
- p.writeSignatureInternal(this, t, visited)
-
- case *types.Interface:
- // We write the source-level methods and embedded types rather
- // than the actual method set since resolved method signatures
- // may have non-printable cycles if parameters have anonymous
- // interface types that (directly or indirectly) embed the
- // current interface. For instance, consider the result type
- // of m:
- //
- // type T interface{
- // m() interface{ T }
- // }
- //
- n := t.NumMethods()
- if n == 0 {
- p.print("interface{}")
- return
- }
-
- p.print("interface {\n")
- p.indent++
- if GcCompatibilityMode {
- // print flattened interface
- // (useful to compare against gc-generated interfaces)
- for i := 0; i < n; i++ {
- m := t.Method(i)
- p.print(m.Name())
- p.writeSignatureInternal(this, m.Type().(*types.Signature), visited)
- p.print("\n")
- }
- } else {
- // print explicit interface methods and embedded types
- for i, n := 0, t.NumExplicitMethods(); i < n; i++ {
- m := t.ExplicitMethod(i)
- p.print(m.Name())
- p.writeSignatureInternal(this, m.Type().(*types.Signature), visited)
- p.print("\n")
- }
- for i, n := 0, t.NumEmbeddeds(); i < n; i++ {
- typ := t.Embedded(i)
- p.writeTypeInternal(this, typ, visited)
- p.print("\n")
- }
- }
- p.indent--
- p.print("}")
-
- case *types.Map:
- p.print("map[")
- p.writeTypeInternal(this, t.Key(), visited)
- p.print("]")
- p.writeTypeInternal(this, t.Elem(), visited)
-
- case *types.Chan:
- var s string
- var parens bool
- switch t.Dir() {
- case types.SendRecv:
- s = "chan "
- // chan (<-chan T) requires parentheses
- if c, _ := t.Elem().(*types.Chan); c != nil && c.Dir() == types.RecvOnly {
- parens = true
- }
- case types.SendOnly:
- s = "chan<- "
- case types.RecvOnly:
- s = "<-chan "
- default:
- panic("unreachable")
- }
- p.print(s)
- if parens {
- p.print("(")
- }
- p.writeTypeInternal(this, t.Elem(), visited)
- if parens {
- p.print(")")
- }
-
- case *types.Named:
- s := ""
- if obj := t.Obj(); obj != nil {
- if pkg := obj.Pkg(); pkg != nil {
- if pkg != this {
- p.print(pkg.Path())
- p.print(".")
- }
- // TODO(gri): function-local named types should be displayed
- // differently from named types at package level to avoid
- // ambiguity.
- }
- s = obj.Name()
- }
- p.print(s)
-
- default:
- // For externally defined implementations of Type.
- p.print(t.String())
- }
-}
-
-func (p *printer) writeTuple(this *types.Package, tup *types.Tuple, variadic bool, visited []types.Type) {
- p.print("(")
- for i, n := 0, tup.Len(); i < n; i++ {
- if i > 0 {
- p.print(", ")
- }
- v := tup.At(i)
- if name := v.Name(); name != "" {
- p.print(name)
- p.print(" ")
- }
- typ := v.Type()
- if variadic && i == n-1 {
- p.print("...")
- typ = typ.(*types.Slice).Elem()
- }
- p.writeTypeInternal(this, typ, visited)
- }
- p.print(")")
-}
-
-func (p *printer) writeSignature(this *types.Package, sig *types.Signature) {
- p.writeSignatureInternal(this, sig, make([]types.Type, 8))
-}
-
-func (p *printer) writeSignatureInternal(this *types.Package, sig *types.Signature, visited []types.Type) {
- p.writeTuple(this, sig.Params(), sig.Variadic(), visited)
-
- res := sig.Results()
- n := res.Len()
- if n == 0 {
- // no result
- return
- }
-
- p.print(" ")
- if n == 1 && res.At(0).Name() == "" {
- // single unnamed result
- p.writeTypeInternal(this, res.At(0).Type(), visited)
- return
- }
-
- // multiple or named result(s)
- p.writeTuple(this, res, false, visited)
-}
diff --git a/vendor/golang.org/x/tools/cmd/godoc/README.godoc-app b/vendor/golang.org/x/tools/cmd/godoc/README.godoc-app
deleted file mode 100644
index 50a0516..0000000
--- a/vendor/golang.org/x/tools/cmd/godoc/README.godoc-app
+++ /dev/null
@@ -1,56 +0,0 @@
-godoc on appengine
-------------------
-
-Prerequisites
--------------
-
-* Go appengine SDK
- https://developers.google.com/appengine/downloads#Google_App_Engine_SDK_for_Go
-
-* Go sources at tip under $GOROOT
-
-* Godoc sources at tip inside $GOPATH
- (go get -d golang.org/x/tools/cmd/godoc)
-
-
-Directory structure
--------------------
-
-* Let $APPDIR be the directory containing the app engine files.
- (e.g., $APPDIR=$HOME/godoc-app)
-
-* $APPDIR contains the following entries (this may change depending on
- app-engine release and version of godoc):
-
- app.yaml
- golang.org/x/tools/cmd/godoc
- godoc.zip
- index.split.*
-
-* The app.yaml file is set up per app engine documentation.
- For instance:
-
- application: godoc-app
- version: 1
- runtime: go
- api_version: go1
-
- handlers:
- - url: /.*
- script: _go_app
-
-
-Configuring and running godoc
------------------------------
-
-To configure godoc, run
-
- bash setup-godoc-app.bash
-
-to prepare an $APPDIR as described above. See the script for details on usage.
-
-To run godoc locally, using the App Engine development server, run
-
- /dev_appserver.py $APPDIR
-
-godoc should come up at http://localhost:8080 .
diff --git a/vendor/golang.org/x/tools/cmd/godoc/appinit.go b/vendor/golang.org/x/tools/cmd/godoc/appinit.go
deleted file mode 100644
index 0c83df9..0000000
--- a/vendor/golang.org/x/tools/cmd/godoc/appinit.go
+++ /dev/null
@@ -1,82 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build appengine
-
-package main
-
-// This file replaces main.go when running godoc under app-engine.
-// See README.godoc-app for details.
-
-import (
- "archive/zip"
- "log"
- "net/http"
- "path"
- "regexp"
-
- "golang.org/x/tools/godoc"
- "golang.org/x/tools/godoc/dl"
- "golang.org/x/tools/godoc/proxy"
- "golang.org/x/tools/godoc/short"
- "golang.org/x/tools/godoc/static"
- "golang.org/x/tools/godoc/vfs"
- "golang.org/x/tools/godoc/vfs/mapfs"
- "golang.org/x/tools/godoc/vfs/zipfs"
-
- "google.golang.org/appengine"
-)
-
-func init() {
- enforceHosts = !appengine.IsDevAppServer()
- playEnabled = true
-
- log.Println("initializing godoc ...")
- log.Printf(".zip file = %s", zipFilename)
- log.Printf(".zip GOROOT = %s", zipGoroot)
- log.Printf("index files = %s", indexFilenames)
-
- goroot := path.Join("/", zipGoroot) // fsHttp paths are relative to '/'
-
- // read .zip file and set up file systems
- const zipfile = zipFilename
- rc, err := zip.OpenReader(zipfile)
- if err != nil {
- log.Fatalf("%s: %s\n", zipfile, err)
- }
- // rc is never closed (app running forever)
- fs.Bind("/", zipfs.New(rc, zipFilename), goroot, vfs.BindReplace)
- fs.Bind("/lib/godoc", mapfs.New(static.Files), "/", vfs.BindReplace)
-
- corpus := godoc.NewCorpus(fs)
- corpus.Verbose = false
- corpus.MaxResults = 10000 // matches flag default in main.go
- corpus.IndexEnabled = true
- corpus.IndexFiles = indexFilenames
- if err := corpus.Init(); err != nil {
- log.Fatal(err)
- }
- corpus.IndexDirectory = indexDirectoryDefault
- go corpus.RunIndexer()
-
- pres = godoc.NewPresentation(corpus)
- pres.TabWidth = 8
- pres.ShowPlayground = true
- pres.ShowExamples = true
- pres.DeclLinks = true
- pres.NotesRx = regexp.MustCompile("BUG")
-
- readTemplates(pres, true)
-
- mux := registerHandlers(pres)
- dl.RegisterHandlers(mux)
- short.RegisterHandlers(mux)
-
- // Register /compile and /share handlers against the default serve mux
- // so that other app modules can make plain HTTP requests to those
- // hosts. (For reasons, HTTPS communication between modules is broken.)
- proxy.RegisterHandlers(http.DefaultServeMux)
-
- log.Println("godoc initialization complete")
-}
diff --git a/vendor/golang.org/x/tools/cmd/godoc/autocert.go b/vendor/golang.org/x/tools/cmd/godoc/autocert.go
deleted file mode 100644
index 9fc3a8f..0000000
--- a/vendor/golang.org/x/tools/cmd/godoc/autocert.go
+++ /dev/null
@@ -1,77 +0,0 @@
-// Copyright 2016 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build autocert
-
-// This file adds automatic TLS certificate support (using
-// golang.org/x/crypto/acme/autocert), conditional on the use of the
-// autocert build tag. It sets the serveAutoCertHook func variable
-// non-nil. It is used by main.go.
-//
-// TODO: make this the default? We're in the Go 1.8 freeze now, so
-// this is too invasive to be default, but we want it for
-// https://beta.golang.org/
-
-package main
-
-import (
- "crypto/tls"
- "flag"
- "net"
- "net/http"
- "time"
-
- "golang.org/x/crypto/acme/autocert"
- "golang.org/x/net/http2"
-)
-
-var (
- autoCertDirFlag = flag.String("autocert_cache_dir", "/var/cache/autocert", "Directory to cache TLS certs")
- autoCertHostFlag = flag.String("autocert_hostname", "", "optional hostname to require in autocert SNI requests")
-)
-
-func init() {
- serveAutoCertHook = serveAutoCert
-}
-
-func serveAutoCert(h http.Handler) error {
- m := autocert.Manager{
- Cache: autocert.DirCache(*autoCertDirFlag),
- Prompt: autocert.AcceptTOS,
- }
- if *autoCertHostFlag != "" {
- m.HostPolicy = autocert.HostWhitelist(*autoCertHostFlag)
- }
- srv := &http.Server{
- Handler: h,
- TLSConfig: &tls.Config{
- GetCertificate: m.GetCertificate,
- },
- IdleTimeout: 60 * time.Second,
- }
- http2.ConfigureServer(srv, &http2.Server{})
- ln, err := net.Listen("tcp", ":443")
- if err != nil {
- return err
- }
- return srv.Serve(tls.NewListener(tcpKeepAliveListener{ln.(*net.TCPListener)}, srv.TLSConfig))
-}
-
-// tcpKeepAliveListener sets TCP keep-alive timeouts on accepted
-// connections. It's used by ListenAndServe and ListenAndServeTLS so
-// dead TCP connections (e.g. closing laptop mid-download) eventually
-// go away.
-type tcpKeepAliveListener struct {
- *net.TCPListener
-}
-
-func (ln tcpKeepAliveListener) Accept() (c net.Conn, err error) {
- tc, err := ln.AcceptTCP()
- if err != nil {
- return
- }
- tc.SetKeepAlive(true)
- tc.SetKeepAlivePeriod(3 * time.Minute)
- return tc, nil
-}
diff --git a/vendor/golang.org/x/tools/cmd/godoc/blog.go b/vendor/golang.org/x/tools/cmd/godoc/blog.go
deleted file mode 100644
index dec4732..0000000
--- a/vendor/golang.org/x/tools/cmd/godoc/blog.go
+++ /dev/null
@@ -1,81 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-import (
- "fmt"
- "go/build"
- "log"
- "net/http"
- "os"
- "path/filepath"
- "runtime"
- "strings"
- "sync"
-
- "golang.org/x/tools/blog"
- "golang.org/x/tools/godoc/redirect"
-)
-
-const (
- blogRepo = "golang.org/x/blog"
- blogURL = "http://blog.golang.org/"
- blogPath = "/blog/"
-)
-
-var (
- blogServer http.Handler // set by blogInit
- blogInitOnce sync.Once
- playEnabled bool
-)
-
-func init() {
- // Initialize blog only when first accessed.
- http.HandleFunc(blogPath, func(w http.ResponseWriter, r *http.Request) {
- blogInitOnce.Do(blogInit)
- blogServer.ServeHTTP(w, r)
- })
-}
-
-func blogInit() {
- // Binary distributions will include the blog content in "/blog".
- root := filepath.Join(runtime.GOROOT(), "blog")
-
- // Prefer content from go.blog repository if present.
- if pkg, err := build.Import(blogRepo, "", build.FindOnly); err == nil {
- root = pkg.Dir
- }
-
- // If content is not available fall back to redirect.
- if fi, err := os.Stat(root); err != nil || !fi.IsDir() {
- fmt.Fprintf(os.Stderr, "Blog content not available locally. "+
- "To install, run \n\tgo get %v\n", blogRepo)
- blogServer = http.HandlerFunc(blogRedirectHandler)
- return
- }
-
- s, err := blog.NewServer(blog.Config{
- BaseURL: blogPath,
- BasePath: strings.TrimSuffix(blogPath, "/"),
- ContentPath: filepath.Join(root, "content"),
- TemplatePath: filepath.Join(root, "template"),
- HomeArticles: 5,
- PlayEnabled: playEnabled,
- })
- if err != nil {
- log.Fatal(err)
- }
- blogServer = s
-}
-
-func blogRedirectHandler(w http.ResponseWriter, r *http.Request) {
- if r.URL.Path == blogPath {
- http.Redirect(w, r, blogURL, http.StatusFound)
- return
- }
- blogPrefixHandler.ServeHTTP(w, r)
-}
-
-var blogPrefixHandler = redirect.PrefixHandler(blogPath, blogURL)
diff --git a/vendor/golang.org/x/tools/cmd/godoc/codewalk.go b/vendor/golang.org/x/tools/cmd/godoc/codewalk.go
deleted file mode 100644
index e3bf5cd..0000000
--- a/vendor/golang.org/x/tools/cmd/godoc/codewalk.go
+++ /dev/null
@@ -1,523 +0,0 @@
-// Copyright 2010 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// The /doc/codewalk/ tree is synthesized from codewalk descriptions,
-// files named $GOROOT/doc/codewalk/*.xml.
-// For an example and a description of the format, see
-// http://golang.org/doc/codewalk/codewalk or run godoc -http=:6060
-// and see http://localhost:6060/doc/codewalk/codewalk .
-// That page is itself a codewalk; the source code for it is
-// $GOROOT/doc/codewalk/codewalk.xml.
-
-package main
-
-import (
- "bytes"
- "encoding/xml"
- "errors"
- "fmt"
- "io"
- "log"
- "net/http"
- "os"
- pathpkg "path"
- "regexp"
- "sort"
- "strconv"
- "strings"
- "text/template"
- "unicode/utf8"
-
- "golang.org/x/tools/godoc"
- "golang.org/x/tools/godoc/vfs"
-)
-
-var codewalkHTML, codewalkdirHTML *template.Template
-
-// Handler for /doc/codewalk/ and below.
-func codewalk(w http.ResponseWriter, r *http.Request) {
- relpath := r.URL.Path[len("/doc/codewalk/"):]
- abspath := r.URL.Path
-
- r.ParseForm()
- if f := r.FormValue("fileprint"); f != "" {
- codewalkFileprint(w, r, f)
- return
- }
-
- // If directory exists, serve list of code walks.
- dir, err := fs.Lstat(abspath)
- if err == nil && dir.IsDir() {
- codewalkDir(w, r, relpath, abspath)
- return
- }
-
- // If file exists, serve using standard file server.
- if err == nil {
- pres.ServeFile(w, r)
- return
- }
-
- // Otherwise append .xml and hope to find
- // a codewalk description, but before trim
- // the trailing /.
- abspath = strings.TrimRight(abspath, "/")
- cw, err := loadCodewalk(abspath + ".xml")
- if err != nil {
- log.Print(err)
- pres.ServeError(w, r, relpath, err)
- return
- }
-
- // Canonicalize the path and redirect if changed
- if redir(w, r) {
- return
- }
-
- pres.ServePage(w, godoc.Page{
- Title: "Codewalk: " + cw.Title,
- Tabtitle: cw.Title,
- Body: applyTemplate(codewalkHTML, "codewalk", cw),
- })
-}
-
-func redir(w http.ResponseWriter, r *http.Request) (redirected bool) {
- canonical := pathpkg.Clean(r.URL.Path)
- if !strings.HasSuffix(canonical, "/") {
- canonical += "/"
- }
- if r.URL.Path != canonical {
- url := *r.URL
- url.Path = canonical
- http.Redirect(w, r, url.String(), http.StatusMovedPermanently)
- redirected = true
- }
- return
-}
-
-func applyTemplate(t *template.Template, name string, data interface{}) []byte {
- var buf bytes.Buffer
- if err := t.Execute(&buf, data); err != nil {
- log.Printf("%s.Execute: %s", name, err)
- }
- return buf.Bytes()
-}
-
-// A Codewalk represents a single codewalk read from an XML file.
-type Codewalk struct {
- Title string `xml:"title,attr"`
- File []string `xml:"file"`
- Step []*Codestep `xml:"step"`
-}
-
-// A Codestep is a single step in a codewalk.
-type Codestep struct {
- // Filled in from XML
- Src string `xml:"src,attr"`
- Title string `xml:"title,attr"`
- XML string `xml:",innerxml"`
-
- // Derived from Src; not in XML.
- Err error
- File string
- Lo int
- LoByte int
- Hi int
- HiByte int
- Data []byte
-}
-
-// String method for printing in template.
-// Formats file address nicely.
-func (st *Codestep) String() string {
- s := st.File
- if st.Lo != 0 || st.Hi != 0 {
- s += fmt.Sprintf(":%d", st.Lo)
- if st.Lo != st.Hi {
- s += fmt.Sprintf(",%d", st.Hi)
- }
- }
- return s
-}
-
-// loadCodewalk reads a codewalk from the named XML file.
-func loadCodewalk(filename string) (*Codewalk, error) {
- f, err := fs.Open(filename)
- if err != nil {
- return nil, err
- }
- defer f.Close()
- cw := new(Codewalk)
- d := xml.NewDecoder(f)
- d.Entity = xml.HTMLEntity
- err = d.Decode(cw)
- if err != nil {
- return nil, &os.PathError{Op: "parsing", Path: filename, Err: err}
- }
-
- // Compute file list, evaluate line numbers for addresses.
- m := make(map[string]bool)
- for _, st := range cw.Step {
- i := strings.Index(st.Src, ":")
- if i < 0 {
- i = len(st.Src)
- }
- filename := st.Src[0:i]
- data, err := vfs.ReadFile(fs, filename)
- if err != nil {
- st.Err = err
- continue
- }
- if i < len(st.Src) {
- lo, hi, err := addrToByteRange(st.Src[i+1:], 0, data)
- if err != nil {
- st.Err = err
- continue
- }
- // Expand match to line boundaries.
- for lo > 0 && data[lo-1] != '\n' {
- lo--
- }
- for hi < len(data) && (hi == 0 || data[hi-1] != '\n') {
- hi++
- }
- st.Lo = byteToLine(data, lo)
- st.Hi = byteToLine(data, hi-1)
- }
- st.Data = data
- st.File = filename
- m[filename] = true
- }
-
- // Make list of files
- cw.File = make([]string, len(m))
- i := 0
- for f := range m {
- cw.File[i] = f
- i++
- }
- sort.Strings(cw.File)
-
- return cw, nil
-}
-
-// codewalkDir serves the codewalk directory listing.
-// It scans the directory for subdirectories or files named *.xml
-// and prepares a table.
-func codewalkDir(w http.ResponseWriter, r *http.Request, relpath, abspath string) {
- type elem struct {
- Name string
- Title string
- }
-
- dir, err := fs.ReadDir(abspath)
- if err != nil {
- log.Print(err)
- pres.ServeError(w, r, relpath, err)
- return
- }
- var v []interface{}
- for _, fi := range dir {
- name := fi.Name()
- if fi.IsDir() {
- v = append(v, &elem{name + "/", ""})
- } else if strings.HasSuffix(name, ".xml") {
- cw, err := loadCodewalk(abspath + "/" + name)
- if err != nil {
- continue
- }
- v = append(v, &elem{name[0 : len(name)-len(".xml")], cw.Title})
- }
- }
-
- pres.ServePage(w, godoc.Page{
- Title: "Codewalks",
- Body: applyTemplate(codewalkdirHTML, "codewalkdir", v),
- })
-}
-
-// codewalkFileprint serves requests with ?fileprint=f&lo=lo&hi=hi.
-// The filename f has already been retrieved and is passed as an argument.
-// Lo and hi are the numbers of the first and last line to highlight
-// in the response. This format is used for the middle window pane
-// of the codewalk pages. It is a separate iframe and does not get
-// the usual godoc HTML wrapper.
-func codewalkFileprint(w http.ResponseWriter, r *http.Request, f string) {
- abspath := f
- data, err := vfs.ReadFile(fs, abspath)
- if err != nil {
- log.Print(err)
- pres.ServeError(w, r, f, err)
- return
- }
- lo, _ := strconv.Atoi(r.FormValue("lo"))
- hi, _ := strconv.Atoi(r.FormValue("hi"))
- if hi < lo {
- hi = lo
- }
- lo = lineToByte(data, lo)
- hi = lineToByte(data, hi+1)
-
- // Put the mark 4 lines before lo, so that the iframe
- // shows a few lines of context before the highlighted
- // section.
- n := 4
- mark := lo
- for ; mark > 0 && n > 0; mark-- {
- if data[mark-1] == '\n' {
- if n--; n == 0 {
- break
- }
- }
- }
-
- io.WriteString(w, ``)
- template.HTMLEscape(w, data[0:mark])
- io.WriteString(w, " ")
- template.HTMLEscape(w, data[mark:lo])
- if lo < hi {
- io.WriteString(w, "")
- template.HTMLEscape(w, data[lo:hi])
- io.WriteString(w, "
")
- }
- template.HTMLEscape(w, data[hi:])
- io.WriteString(w, " ")
-}
-
-// addrToByte evaluates the given address starting at offset start in data.
-// It returns the lo and hi byte offset of the matched region within data.
-// See http://plan9.bell-labs.com/sys/doc/sam/sam.html Table II
-// for details on the syntax.
-func addrToByteRange(addr string, start int, data []byte) (lo, hi int, err error) {
- var (
- dir byte
- prevc byte
- charOffset bool
- )
- lo = start
- hi = start
- for addr != "" && err == nil {
- c := addr[0]
- switch c {
- default:
- err = errors.New("invalid address syntax near " + string(c))
- case ',':
- if len(addr) == 1 {
- hi = len(data)
- } else {
- _, hi, err = addrToByteRange(addr[1:], hi, data)
- }
- return
-
- case '+', '-':
- if prevc == '+' || prevc == '-' {
- lo, hi, err = addrNumber(data, lo, hi, prevc, 1, charOffset)
- }
- dir = c
-
- case '$':
- lo = len(data)
- hi = len(data)
- if len(addr) > 1 {
- dir = '+'
- }
-
- case '#':
- charOffset = true
-
- case '0', '1', '2', '3', '4', '5', '6', '7', '8', '9':
- var i int
- for i = 1; i < len(addr); i++ {
- if addr[i] < '0' || addr[i] > '9' {
- break
- }
- }
- var n int
- n, err = strconv.Atoi(addr[0:i])
- if err != nil {
- break
- }
- lo, hi, err = addrNumber(data, lo, hi, dir, n, charOffset)
- dir = 0
- charOffset = false
- prevc = c
- addr = addr[i:]
- continue
-
- case '/':
- var i, j int
- Regexp:
- for i = 1; i < len(addr); i++ {
- switch addr[i] {
- case '\\':
- i++
- case '/':
- j = i + 1
- break Regexp
- }
- }
- if j == 0 {
- j = i
- }
- pattern := addr[1:i]
- lo, hi, err = addrRegexp(data, lo, hi, dir, pattern)
- prevc = c
- addr = addr[j:]
- continue
- }
- prevc = c
- addr = addr[1:]
- }
-
- if err == nil && dir != 0 {
- lo, hi, err = addrNumber(data, lo, hi, dir, 1, charOffset)
- }
- if err != nil {
- return 0, 0, err
- }
- return lo, hi, nil
-}
-
-// addrNumber applies the given dir, n, and charOffset to the address lo, hi.
-// dir is '+' or '-', n is the count, and charOffset is true if the syntax
-// used was #n. Applying +n (or +#n) means to advance n lines
-// (or characters) after hi. Applying -n (or -#n) means to back up n lines
-// (or characters) before lo.
-// The return value is the new lo, hi.
-func addrNumber(data []byte, lo, hi int, dir byte, n int, charOffset bool) (int, int, error) {
- switch dir {
- case 0:
- lo = 0
- hi = 0
- fallthrough
-
- case '+':
- if charOffset {
- pos := hi
- for ; n > 0 && pos < len(data); n-- {
- _, size := utf8.DecodeRune(data[pos:])
- pos += size
- }
- if n == 0 {
- return pos, pos, nil
- }
- break
- }
- // find next beginning of line
- if hi > 0 {
- for hi < len(data) && data[hi-1] != '\n' {
- hi++
- }
- }
- lo = hi
- if n == 0 {
- return lo, hi, nil
- }
- for ; hi < len(data); hi++ {
- if data[hi] != '\n' {
- continue
- }
- switch n--; n {
- case 1:
- lo = hi + 1
- case 0:
- return lo, hi + 1, nil
- }
- }
-
- case '-':
- if charOffset {
- // Scan backward for bytes that are not UTF-8 continuation bytes.
- pos := lo
- for ; pos > 0 && n > 0; pos-- {
- if data[pos]&0xc0 != 0x80 {
- n--
- }
- }
- if n == 0 {
- return pos, pos, nil
- }
- break
- }
- // find earlier beginning of line
- for lo > 0 && data[lo-1] != '\n' {
- lo--
- }
- hi = lo
- if n == 0 {
- return lo, hi, nil
- }
- for ; lo >= 0; lo-- {
- if lo > 0 && data[lo-1] != '\n' {
- continue
- }
- switch n--; n {
- case 1:
- hi = lo
- case 0:
- return lo, hi, nil
- }
- }
- }
-
- return 0, 0, errors.New("address out of range")
-}
-
-// addrRegexp searches for pattern in the given direction starting at lo, hi.
-// The direction dir is '+' (search forward from hi) or '-' (search backward from lo).
-// Backward searches are unimplemented.
-func addrRegexp(data []byte, lo, hi int, dir byte, pattern string) (int, int, error) {
- re, err := regexp.Compile(pattern)
- if err != nil {
- return 0, 0, err
- }
- if dir == '-' {
- // Could implement reverse search using binary search
- // through file, but that seems like overkill.
- return 0, 0, errors.New("reverse search not implemented")
- }
- m := re.FindIndex(data[hi:])
- if len(m) > 0 {
- m[0] += hi
- m[1] += hi
- } else if hi > 0 {
- // No match. Wrap to beginning of data.
- m = re.FindIndex(data)
- }
- if len(m) == 0 {
- return 0, 0, errors.New("no match for " + pattern)
- }
- return m[0], m[1], nil
-}
-
-// lineToByte returns the byte index of the first byte of line n.
-// Line numbers begin at 1.
-func lineToByte(data []byte, n int) int {
- if n <= 1 {
- return 0
- }
- n--
- for i, c := range data {
- if c == '\n' {
- if n--; n == 0 {
- return i + 1
- }
- }
- }
- return len(data)
-}
-
-// byteToLine returns the number of the line containing the byte at index i.
-func byteToLine(data []byte, i int) int {
- l := 1
- for j, c := range data {
- if j == i {
- return l
- }
- if c == '\n' {
- l++
- }
- }
- return l
-}
diff --git a/vendor/golang.org/x/tools/cmd/godoc/dl.go b/vendor/golang.org/x/tools/cmd/godoc/dl.go
deleted file mode 100644
index 40e6658..0000000
--- a/vendor/golang.org/x/tools/cmd/godoc/dl.go
+++ /dev/null
@@ -1,16 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build !appengine
-
-package main
-
-import "net/http"
-
-// Register a redirect handler for /dl/ to the golang.org download page.
-// This file will not be included when deploying godoc to golang.org.
-
-func init() {
- http.Handle("/dl/", http.RedirectHandler("https://golang.org/dl/", http.StatusFound))
-}
diff --git a/vendor/golang.org/x/tools/cmd/godoc/doc.go b/vendor/golang.org/x/tools/cmd/godoc/doc.go
deleted file mode 100644
index e756093..0000000
--- a/vendor/golang.org/x/tools/cmd/godoc/doc.go
+++ /dev/null
@@ -1,153 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-/*
-
-Godoc extracts and generates documentation for Go programs.
-
-It has two modes.
-
-Without the -http flag, it runs in command-line mode and prints plain text
-documentation to standard output and exits. If both a library package and
-a command with the same name exists, using the prefix cmd/ will force
-documentation on the command rather than the library package. If the -src
-flag is specified, godoc prints the exported interface of a package in Go
-source form, or the implementation of a specific exported language entity:
-
- godoc fmt # documentation for package fmt
- godoc fmt Printf # documentation for fmt.Printf
- godoc cmd/go # force documentation for the go command
- godoc -src fmt # fmt package interface in Go source form
- godoc -src fmt Printf # implementation of fmt.Printf
-
-In command-line mode, the -q flag enables search queries against a godoc running
-as a webserver. If no explicit server address is specified with the -server flag,
-godoc first tries localhost:6060 and then http://golang.org.
-
- godoc -q Reader
- godoc -q math.Sin
- godoc -server=:6060 -q sin
-
-With the -http flag, it runs as a web server and presents the documentation as a
-web page.
-
- godoc -http=:6060
-
-Usage:
-
- godoc [flag] package [name ...]
-
-The flags are:
-
- -v
- verbose mode
- -q
- arguments are considered search queries: a legal query is a
- single identifier (such as ToLower) or a qualified identifier
- (such as math.Sin)
- -src
- print (exported) source in command-line mode
- -tabwidth=4
- width of tabs in units of spaces
- -timestamps=true
- show timestamps with directory listings
- -index
- enable identifier and full text search index
- (no search box is shown if -index is not set)
- -index_files=""
- glob pattern specifying index files; if not empty,
- the index is read from these files in sorted order
- -index_throttle=0.75
- index throttle value; a value of 0 means no time is allocated
- to the indexer (the indexer will never finish), a value of 1.0
- means that index creation is running at full throttle (other
- goroutines may get no time while the index is built)
- -links=true:
- link identifiers to their declarations
- -write_index=false
- write index to a file; the file name must be specified with
- -index_files
- -maxresults=10000
- maximum number of full text search results shown
- (no full text index is built if maxresults <= 0)
- -notes="BUG"
- regular expression matching note markers to show
- (e.g., "BUG|TODO", ".*")
- -html
- print HTML in command-line mode
- -goroot=$GOROOT
- Go root directory
- -http=addr
- HTTP service address (e.g., '127.0.0.1:6060' or just ':6060')
- -server=addr
- webserver address for command line searches
- -analysis=type,pointer
- comma-separated list of analyses to perform
- "type": display identifier resolution, type info, method sets,
- 'implements', and static callees
- "pointer": display channel peers, callers and dynamic callees
- (significantly slower)
- See http://golang.org/lib/godoc/analysis/help.html for details.
- -templates=""
- directory containing alternate template files; if set,
- the directory may provide alternative template files
- for the files in $GOROOT/lib/godoc
- -url=path
- print to standard output the data that would be served by
- an HTTP request for path
- -zip=""
- zip file providing the file system to serve; disabled if empty
-
-By default, godoc looks at the packages it finds via $GOROOT and $GOPATH (if set).
-This behavior can be altered by providing an alternative $GOROOT with the -goroot
-flag.
-
-When godoc runs as a web server and -index is set, a search index is maintained.
-The index is created at startup.
-
-The index contains both identifier and full text search information (searchable
-via regular expressions). The maximum number of full text search results shown
-can be set with the -maxresults flag; if set to 0, no full text results are
-shown, and only an identifier index but no full text search index is created.
-
-By default, godoc uses the system's GOOS/GOARCH; in command-line mode you can
-set the GOOS/GOARCH environment variables to get output for the system specified.
-If -http was specified you can provide the URL parameters "GOOS" and "GOARCH"
-to set the output on the web page.
-
-The presentation mode of web pages served by godoc can be controlled with the
-"m" URL parameter; it accepts a comma-separated list of flag names as value:
-
- all show documentation for all declarations, not just the exported ones
- methods show all embedded methods, not just those of unexported anonymous fields
- src show the original source code rather then the extracted documentation
- text present the page in textual (command-line) form rather than HTML
- flat present flat (not indented) directory listings using full paths
-
-For instance, http://golang.org/pkg/math/big/?m=all,text shows the documentation
-for all (not just the exported) declarations of package big, in textual form (as
-it would appear when using godoc from the command line: "godoc -src math/big .*").
-
-By default, godoc serves files from the file system of the underlying OS.
-Instead, a .zip file may be provided via the -zip flag, which contains
-the file system to serve. The file paths stored in the .zip file must use
-slash ('/') as path separator; and they must be unrooted. $GOROOT (or -goroot)
-must be set to the .zip file directory path containing the Go root directory.
-For instance, for a .zip file created by the command:
-
- zip -r go.zip $HOME/go
-
-one may run godoc as follows:
-
- godoc -http=:6060 -zip=go.zip -goroot=$HOME/go
-
-Godoc documentation is converted to HTML or to text using the go/doc package;
-see http://golang.org/pkg/go/doc/#ToHTML for the exact rules.
-Godoc also shows example code that is runnable by the testing package;
-see http://golang.org/pkg/testing/#hdr-Examples for the conventions.
-See "Godoc: documenting Go code" for how to write good comments for godoc:
-http://golang.org/doc/articles/godoc_documenting_go_code.html
-
-*/
-package main // import "golang.org/x/tools/cmd/godoc"
diff --git a/vendor/golang.org/x/tools/cmd/godoc/godoc19_test.go b/vendor/golang.org/x/tools/cmd/godoc/godoc19_test.go
deleted file mode 100644
index 655a623..0000000
--- a/vendor/golang.org/x/tools/cmd/godoc/godoc19_test.go
+++ /dev/null
@@ -1,9 +0,0 @@
-// Copyright 2017 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build go1.9
-
-package main_test
-
-func init() { isGo19 = true }
diff --git a/vendor/golang.org/x/tools/cmd/godoc/godoc_test.go b/vendor/golang.org/x/tools/cmd/godoc/godoc_test.go
deleted file mode 100644
index a2552d9..0000000
--- a/vendor/golang.org/x/tools/cmd/godoc/godoc_test.go
+++ /dev/null
@@ -1,489 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main_test
-
-import (
- "bufio"
- "bytes"
- "fmt"
- "io"
- "io/ioutil"
- "net"
- "net/http"
- "os"
- "os/exec"
- "path/filepath"
- "regexp"
- "runtime"
- "strings"
- "testing"
- "time"
-)
-
-// buildGodoc builds the godoc executable.
-// It returns its path, and a cleanup function.
-//
-// TODO(adonovan): opt: do this at most once, and do the cleanup
-// exactly once. How though? There's no atexit.
-func buildGodoc(t *testing.T) (bin string, cleanup func()) {
- if runtime.GOARCH == "arm" {
- t.Skip("skipping test on arm platforms; too slow")
- }
- tmp, err := ioutil.TempDir("", "godoc-regtest-")
- if err != nil {
- t.Fatal(err)
- }
- defer func() {
- if cleanup == nil { // probably, go build failed.
- os.RemoveAll(tmp)
- }
- }()
-
- bin = filepath.Join(tmp, "godoc")
- if runtime.GOOS == "windows" {
- bin += ".exe"
- }
- cmd := exec.Command("go", "build", "-o", bin)
- if err := cmd.Run(); err != nil {
- t.Fatalf("Building godoc: %v", err)
- }
-
- return bin, func() { os.RemoveAll(tmp) }
-}
-
-var isGo19 bool // godoc19_test.go sets it to true.
-
-// Basic regression test for godoc command-line tool.
-func TestCLI(t *testing.T) {
- bin, cleanup := buildGodoc(t)
- defer cleanup()
-
- // condStr returns s if cond is true, otherwise empty string.
- condStr := func(cond bool, s string) string {
- if !cond {
- return ""
- }
- return s
- }
-
- tests := []struct {
- args []string
- matches []string // regular expressions
- dontmatch []string // regular expressions
- }{
- {
- args: []string{"fmt"},
- matches: []string{
- `import "fmt"`,
- `Package fmt implements formatted I/O`,
- },
- },
- {
- args: []string{"io", "WriteString"},
- matches: []string{
- `func WriteString\(`,
- `WriteString writes the contents of the string s to w`,
- },
- },
- {
- args: []string{"nonexistingpkg"},
- matches: []string{
- `cannot find package` +
- // TODO: Remove this when support for Go 1.8 is dropped.
- condStr(!isGo19,
- // For Go 1.8 and older, because it doesn't have CL 33158 change applied to go/build.
- // The last pattern (does not e) is for plan9:
- // http://build.golang.org/log/2d8e5e14ed365bfa434b37ec0338cd9e6f8dd9bf
- `|no such file or directory|does not exist|cannot find the file|(?:' does not e)`),
- },
- },
- {
- args: []string{"fmt", "NonexistentSymbol"},
- matches: []string{
- `No match found\.`,
- },
- },
- {
- args: []string{"-src", "syscall", "Open"},
- matches: []string{
- `func Open\(`,
- },
- dontmatch: []string{
- `No match found\.`,
- },
- },
- }
- for _, test := range tests {
- cmd := exec.Command(bin, test.args...)
- cmd.Args[0] = "godoc"
- out, err := cmd.CombinedOutput()
- if err != nil {
- t.Errorf("Running with args %#v: %v", test.args, err)
- continue
- }
- for _, pat := range test.matches {
- re := regexp.MustCompile(pat)
- if !re.Match(out) {
- t.Errorf("godoc %v =\n%s\nwanted /%v/", strings.Join(test.args, " "), out, pat)
- }
- }
- for _, pat := range test.dontmatch {
- re := regexp.MustCompile(pat)
- if re.Match(out) {
- t.Errorf("godoc %v =\n%s\ndid not want /%v/", strings.Join(test.args, " "), out, pat)
- }
- }
- }
-}
-
-func serverAddress(t *testing.T) string {
- ln, err := net.Listen("tcp", "127.0.0.1:0")
- if err != nil {
- ln, err = net.Listen("tcp6", "[::1]:0")
- }
- if err != nil {
- t.Fatal(err)
- }
- defer ln.Close()
- return ln.Addr().String()
-}
-
-func waitForServerReady(t *testing.T, addr string) {
- waitForServer(t,
- fmt.Sprintf("http://%v/", addr),
- "The Go Programming Language",
- 15*time.Second,
- false)
-}
-
-func waitForSearchReady(t *testing.T, addr string) {
- waitForServer(t,
- fmt.Sprintf("http://%v/search?q=FALLTHROUGH", addr),
- "The list of tokens.",
- 2*time.Minute,
- false)
-}
-
-func waitUntilScanComplete(t *testing.T, addr string) {
- waitForServer(t,
- fmt.Sprintf("http://%v/pkg", addr),
- "Scan is not yet complete",
- 2*time.Minute,
- true,
- )
- // setting reverse as true, which means this waits
- // until the string is not returned in the response anymore
-}
-
-const pollInterval = 200 * time.Millisecond
-
-func waitForServer(t *testing.T, url, match string, timeout time.Duration, reverse bool) {
- // "health check" duplicated from x/tools/cmd/tipgodoc/tip.go
- deadline := time.Now().Add(timeout)
- for time.Now().Before(deadline) {
- time.Sleep(pollInterval)
- res, err := http.Get(url)
- if err != nil {
- continue
- }
- rbody, err := ioutil.ReadAll(res.Body)
- res.Body.Close()
- if err == nil && res.StatusCode == http.StatusOK {
- if bytes.Contains(rbody, []byte(match)) && !reverse {
- return
- }
- if !bytes.Contains(rbody, []byte(match)) && reverse {
- return
- }
- }
- }
- t.Fatalf("Server failed to respond in %v", timeout)
-}
-
-func killAndWait(cmd *exec.Cmd) {
- cmd.Process.Kill()
- cmd.Wait()
-}
-
-// Basic integration test for godoc HTTP interface.
-func TestWeb(t *testing.T) {
- testWeb(t, false)
-}
-
-// Basic integration test for godoc HTTP interface.
-func TestWebIndex(t *testing.T) {
- if testing.Short() {
- t.Skip("skipping test in -short mode")
- }
- testWeb(t, true)
-}
-
-// Basic integration test for godoc HTTP interface.
-func testWeb(t *testing.T, withIndex bool) {
- if runtime.GOOS == "plan9" {
- t.Skip("skipping on plan9; files to start up quickly enough")
- }
- bin, cleanup := buildGodoc(t)
- defer cleanup()
- addr := serverAddress(t)
- args := []string{fmt.Sprintf("-http=%s", addr)}
- if withIndex {
- args = append(args, "-index", "-index_interval=-1s")
- }
- cmd := exec.Command(bin, args...)
- cmd.Stdout = os.Stderr
- cmd.Stderr = os.Stderr
- cmd.Args[0] = "godoc"
- cmd.Env = godocEnv()
- if err := cmd.Start(); err != nil {
- t.Fatalf("failed to start godoc: %s", err)
- }
- defer killAndWait(cmd)
-
- if withIndex {
- waitForSearchReady(t, addr)
- } else {
- waitForServerReady(t, addr)
- waitUntilScanComplete(t, addr)
- }
-
- tests := []struct {
- path string
- match []string
- dontmatch []string
- needIndex bool
- }{
- {
- path: "/",
- match: []string{"Go is an open source programming language"},
- },
- {
- path: "/pkg/fmt/",
- match: []string{"Package fmt implements formatted I/O"},
- },
- {
- path: "/src/fmt/",
- match: []string{"scan_test.go"},
- },
- {
- path: "/src/fmt/print.go",
- match: []string{"// Println formats using"},
- },
- {
- path: "/pkg",
- match: []string{
- "Standard library",
- "Package fmt implements formatted I/O",
- },
- dontmatch: []string{
- "internal/syscall",
- "cmd/gc",
- },
- },
- {
- path: "/pkg/?m=all",
- match: []string{
- "Standard library",
- "Package fmt implements formatted I/O",
- "internal/syscall/?m=all",
- },
- dontmatch: []string{
- "cmd/gc",
- },
- },
- {
- path: "/search?q=ListenAndServe",
- match: []string{
- "/src",
- },
- dontmatch: []string{
- "/pkg/bootstrap",
- },
- needIndex: true,
- },
- {
- path: "/pkg/strings/",
- match: []string{
- `href="/src/strings/strings.go"`,
- },
- },
- {
- path: "/cmd/compile/internal/amd64/",
- match: []string{
- `href="/src/cmd/compile/internal/amd64/ssa.go"`,
- },
- },
- }
- for _, test := range tests {
- if test.needIndex && !withIndex {
- continue
- }
- url := fmt.Sprintf("http://%s%s", addr, test.path)
- resp, err := http.Get(url)
- if err != nil {
- t.Errorf("GET %s failed: %s", url, err)
- continue
- }
- body, err := ioutil.ReadAll(resp.Body)
- resp.Body.Close()
- if err != nil {
- t.Errorf("GET %s: failed to read body: %s (response: %v)", url, err, resp)
- }
- isErr := false
- for _, substr := range test.match {
- if !bytes.Contains(body, []byte(substr)) {
- t.Errorf("GET %s: wanted substring %q in body", url, substr)
- isErr = true
- }
- }
- for _, substr := range test.dontmatch {
- if bytes.Contains(body, []byte(substr)) {
- t.Errorf("GET %s: didn't want substring %q in body", url, substr)
- isErr = true
- }
- }
- if isErr {
- t.Errorf("GET %s: got:\n%s", url, body)
- }
- }
-}
-
-// Basic integration test for godoc -analysis=type (via HTTP interface).
-func TestTypeAnalysis(t *testing.T) {
- if runtime.GOOS == "plan9" {
- t.Skip("skipping test on plan9 (issue #11974)") // see comment re: Plan 9 below
- }
-
- // Write a fake GOROOT/GOPATH.
- tmpdir, err := ioutil.TempDir("", "godoc-analysis")
- if err != nil {
- t.Fatalf("ioutil.TempDir failed: %s", err)
- }
- defer os.RemoveAll(tmpdir)
- for _, f := range []struct{ file, content string }{
- {"goroot/src/lib/lib.go", `
-package lib
-type T struct{}
-const C = 3
-var V T
-func (T) F() int { return C }
-`},
- {"gopath/src/app/main.go", `
-package main
-import "lib"
-func main() { print(lib.V) }
-`},
- } {
- file := filepath.Join(tmpdir, f.file)
- if err := os.MkdirAll(filepath.Dir(file), 0755); err != nil {
- t.Fatalf("MkdirAll(%s) failed: %s", filepath.Dir(file), err)
- }
- if err := ioutil.WriteFile(file, []byte(f.content), 0644); err != nil {
- t.Fatal(err)
- }
- }
-
- // Start the server.
- bin, cleanup := buildGodoc(t)
- defer cleanup()
- addr := serverAddress(t)
- cmd := exec.Command(bin, fmt.Sprintf("-http=%s", addr), "-analysis=type")
- cmd.Env = append(cmd.Env, fmt.Sprintf("GOROOT=%s", filepath.Join(tmpdir, "goroot")))
- cmd.Env = append(cmd.Env, fmt.Sprintf("GOPATH=%s", filepath.Join(tmpdir, "gopath")))
- for _, e := range os.Environ() {
- if strings.HasPrefix(e, "GOROOT=") || strings.HasPrefix(e, "GOPATH=") {
- continue
- }
- cmd.Env = append(cmd.Env, e)
- }
- cmd.Stdout = os.Stderr
- stderr, err := cmd.StderrPipe()
- if err != nil {
- t.Fatal(err)
- }
- cmd.Args[0] = "godoc"
- if err := cmd.Start(); err != nil {
- t.Fatalf("failed to start godoc: %s", err)
- }
- defer killAndWait(cmd)
- waitForServerReady(t, addr)
-
- // Wait for type analysis to complete.
- reader := bufio.NewReader(stderr)
- for {
- s, err := reader.ReadString('\n') // on Plan 9 this fails
- if err != nil {
- t.Fatal(err)
- }
- fmt.Fprint(os.Stderr, s)
- if strings.Contains(s, "Type analysis complete.") {
- break
- }
- }
- go io.Copy(os.Stderr, reader)
-
- t0 := time.Now()
-
- // Make an HTTP request and check for a regular expression match.
- // The patterns are very crude checks that basic type information
- // has been annotated onto the source view.
-tryagain:
- for _, test := range []struct{ url, pattern string }{
- {"/src/lib/lib.go", "L2.*package .*Package docs for lib.*/lib"},
- {"/src/lib/lib.go", "L3.*type .*type info for T.*struct"},
- {"/src/lib/lib.go", "L5.*var V .*type T struct"},
- {"/src/lib/lib.go", "L6.*func .*type T struct.*T.*return .*const C untyped int.*C"},
-
- {"/src/app/main.go", "L2.*package .*Package docs for app"},
- {"/src/app/main.go", "L3.*import .*Package docs for lib.*lib"},
- {"/src/app/main.go", "L4.*func main.*package lib.*lib.*var lib.V lib.T.*V"},
- } {
- url := fmt.Sprintf("http://%s%s", addr, test.url)
- resp, err := http.Get(url)
- if err != nil {
- t.Errorf("GET %s failed: %s", url, err)
- continue
- }
- body, err := ioutil.ReadAll(resp.Body)
- resp.Body.Close()
- if err != nil {
- t.Errorf("GET %s: failed to read body: %s (response: %v)", url, err, resp)
- continue
- }
-
- if !bytes.Contains(body, []byte("Static analysis features")) {
- // Type analysis results usually become available within
- // ~4ms after godoc startup (for this input on my machine).
- if elapsed := time.Since(t0); elapsed > 500*time.Millisecond {
- t.Fatalf("type analysis results still unavailable after %s", elapsed)
- }
- time.Sleep(10 * time.Millisecond)
- goto tryagain
- }
-
- match, err := regexp.Match(test.pattern, body)
- if err != nil {
- t.Errorf("regexp.Match(%q) failed: %s", test.pattern, err)
- continue
- }
- if !match {
- // This is a really ugly failure message.
- t.Errorf("GET %s: body doesn't match %q, got:\n%s",
- url, test.pattern, string(body))
- }
- }
-}
-
-// godocEnv returns the process environment without the GOPATH variable.
-// (We don't want the indexer looking at the local workspace during tests.)
-func godocEnv() (env []string) {
- for _, v := range os.Environ() {
- if strings.HasPrefix(v, "GOPATH=") {
- continue
- }
- env = append(env, v)
- }
- return
-}
diff --git a/vendor/golang.org/x/tools/cmd/godoc/handlers.go b/vendor/golang.org/x/tools/cmd/godoc/handlers.go
deleted file mode 100644
index 6691ed7..0000000
--- a/vendor/golang.org/x/tools/cmd/godoc/handlers.go
+++ /dev/null
@@ -1,148 +0,0 @@
-// Copyright 2010 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// The /doc/codewalk/ tree is synthesized from codewalk descriptions,
-// files named $GOROOT/doc/codewalk/*.xml.
-// For an example and a description of the format, see
-// http://golang.org/doc/codewalk/codewalk or run godoc -http=:6060
-// and see http://localhost:6060/doc/codewalk/codewalk .
-// That page is itself a codewalk; the source code for it is
-// $GOROOT/doc/codewalk/codewalk.xml.
-
-package main
-
-import (
- "encoding/json"
- "go/format"
- "log"
- "net/http"
- "strings"
- "text/template"
-
- "golang.org/x/tools/godoc"
- "golang.org/x/tools/godoc/redirect"
- "golang.org/x/tools/godoc/vfs"
-)
-
-var (
- pres *godoc.Presentation
- fs = vfs.NameSpace{}
-)
-
-var enforceHosts = false // set true in production on app engine
-
-// hostEnforcerHandler redirects requests to "http://foo.golang.org/bar"
-// to "https://golang.org/bar".
-// It permits requests to the host "godoc-test.golang.org" for testing and
-// golang.google.cn for Chinese users.
-type hostEnforcerHandler struct {
- h http.Handler
-}
-
-func (h hostEnforcerHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
- if !enforceHosts {
- h.h.ServeHTTP(w, r)
- return
- }
- if r.TLS == nil || !h.validHost(r.Host) {
- r.URL.Scheme = "https"
- if h.validHost(r.Host) {
- r.URL.Host = r.Host
- } else {
- r.URL.Host = "golang.org"
- }
- http.Redirect(w, r, r.URL.String(), http.StatusFound)
- return
- }
- w.Header().Set("Strict-Transport-Security", "max-age=31536000; preload")
- h.h.ServeHTTP(w, r)
-}
-
-func (h hostEnforcerHandler) validHost(host string) bool {
- switch strings.ToLower(host) {
- case "golang.org", "godoc-test.golang.org", "golang.google.cn":
- return true
- }
- return false
-}
-
-func registerHandlers(pres *godoc.Presentation) *http.ServeMux {
- if pres == nil {
- panic("nil Presentation")
- }
- mux := http.NewServeMux()
- mux.HandleFunc("/doc/codewalk/", codewalk)
- mux.Handle("/doc/play/", pres.FileServer())
- mux.Handle("/robots.txt", pres.FileServer())
- mux.Handle("/", pres)
- mux.Handle("/pkg/C/", redirect.Handler("/cmd/cgo/"))
- mux.HandleFunc("/fmt", fmtHandler)
- redirect.Register(mux)
-
- http.Handle("/", hostEnforcerHandler{mux})
-
- return mux
-}
-
-func readTemplate(name string) *template.Template {
- if pres == nil {
- panic("no global Presentation set yet")
- }
- path := "lib/godoc/" + name
-
- // use underlying file system fs to read the template file
- // (cannot use template ParseFile functions directly)
- data, err := vfs.ReadFile(fs, path)
- if err != nil {
- log.Fatal("readTemplate: ", err)
- }
- // be explicit with errors (for app engine use)
- t, err := template.New(name).Funcs(pres.FuncMap()).Parse(string(data))
- if err != nil {
- log.Fatal("readTemplate: ", err)
- }
- return t
-}
-
-func readTemplates(p *godoc.Presentation, html bool) {
- p.PackageText = readTemplate("package.txt")
- p.SearchText = readTemplate("search.txt")
-
- if html || p.HTMLMode {
- codewalkHTML = readTemplate("codewalk.html")
- codewalkdirHTML = readTemplate("codewalkdir.html")
- p.CallGraphHTML = readTemplate("callgraph.html")
- p.DirlistHTML = readTemplate("dirlist.html")
- p.ErrorHTML = readTemplate("error.html")
- p.ExampleHTML = readTemplate("example.html")
- p.GodocHTML = readTemplate("godoc.html")
- p.ImplementsHTML = readTemplate("implements.html")
- p.MethodSetHTML = readTemplate("methodset.html")
- p.PackageHTML = readTemplate("package.html")
- p.SearchHTML = readTemplate("search.html")
- p.SearchDocHTML = readTemplate("searchdoc.html")
- p.SearchCodeHTML = readTemplate("searchcode.html")
- p.SearchTxtHTML = readTemplate("searchtxt.html")
- p.SearchDescXML = readTemplate("opensearch.xml")
- }
-}
-
-type fmtResponse struct {
- Body string
- Error string
-}
-
-// fmtHandler takes a Go program in its "body" form value, formats it with
-// standard gofmt formatting, and writes a fmtResponse as a JSON object.
-func fmtHandler(w http.ResponseWriter, r *http.Request) {
- resp := new(fmtResponse)
- body, err := format.Source([]byte(r.FormValue("body")))
- if err != nil {
- resp.Error = err.Error()
- } else {
- resp.Body = string(body)
- }
- w.Header().Set("Content-type", "application/json; charset=utf-8")
- json.NewEncoder(w).Encode(resp)
-}
diff --git a/vendor/golang.org/x/tools/cmd/godoc/index.go b/vendor/golang.org/x/tools/cmd/godoc/index.go
deleted file mode 100644
index f84b29a..0000000
--- a/vendor/golang.org/x/tools/cmd/godoc/index.go
+++ /dev/null
@@ -1,11 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-import "strings"
-
-func indexDirectoryDefault(dir string) bool {
- return dir != "/pkg" && !strings.HasPrefix(dir, "/pkg/")
-}
diff --git a/vendor/golang.org/x/tools/cmd/godoc/main.go b/vendor/golang.org/x/tools/cmd/godoc/main.go
deleted file mode 100644
index 901e992..0000000
--- a/vendor/golang.org/x/tools/cmd/godoc/main.go
+++ /dev/null
@@ -1,357 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// godoc: Go Documentation Server
-
-// Web server tree:
-//
-// http://godoc/ main landing page
-// http://godoc/doc/ serve from $GOROOT/doc - spec, mem, etc.
-// http://godoc/src/ serve files from $GOROOT/src; .go gets pretty-printed
-// http://godoc/cmd/ serve documentation about commands
-// http://godoc/pkg/ serve documentation about packages
-// (idea is if you say import "compress/zlib", you go to
-// http://godoc/pkg/compress/zlib)
-//
-// Command-line interface:
-//
-// godoc packagepath [name ...]
-//
-// godoc compress/zlib
-// - prints doc for package compress/zlib
-// godoc crypto/block Cipher NewCMAC
-// - prints doc for Cipher and NewCMAC in package crypto/block
-
-// +build !appengine
-
-package main
-
-import (
- "archive/zip"
- _ "expvar" // to serve /debug/vars
- "flag"
- "fmt"
- "go/build"
- "log"
- "net/http"
- "net/http/httptest"
- _ "net/http/pprof" // to serve /debug/pprof/*
- "net/url"
- "os"
- "path/filepath"
- "regexp"
- "runtime"
- "strings"
-
- "golang.org/x/tools/godoc"
- "golang.org/x/tools/godoc/analysis"
- "golang.org/x/tools/godoc/static"
- "golang.org/x/tools/godoc/vfs"
- "golang.org/x/tools/godoc/vfs/gatefs"
- "golang.org/x/tools/godoc/vfs/mapfs"
- "golang.org/x/tools/godoc/vfs/zipfs"
-)
-
-const defaultAddr = ":6060" // default webserver address
-
-var (
- // file system to serve
- // (with e.g.: zip -r go.zip $GOROOT -i \*.go -i \*.html -i \*.css -i \*.js -i \*.txt -i \*.c -i \*.h -i \*.s -i \*.png -i \*.jpg -i \*.sh -i favicon.ico)
- zipfile = flag.String("zip", "", "zip file providing the file system to serve; disabled if empty")
-
- // file-based index
- writeIndex = flag.Bool("write_index", false, "write index to a file; the file name must be specified with -index_files")
-
- analysisFlag = flag.String("analysis", "", `comma-separated list of analyses to perform (supported: type, pointer). See http://golang.org/lib/godoc/analysis/help.html`)
-
- // network
- httpAddr = flag.String("http", "", "HTTP service address (e.g., '"+defaultAddr+"')")
- serverAddr = flag.String("server", "", "webserver address for command line searches")
-
- // layout control
- html = flag.Bool("html", false, "print HTML in command-line mode")
- srcMode = flag.Bool("src", false, "print (exported) source in command-line mode")
- urlFlag = flag.String("url", "", "print HTML for named URL")
-
- // command-line searches
- query = flag.Bool("q", false, "arguments are considered search queries")
-
- verbose = flag.Bool("v", false, "verbose mode")
-
- // file system roots
- // TODO(gri) consider the invariant that goroot always end in '/'
- goroot = flag.String("goroot", runtime.GOROOT(), "Go root directory")
-
- // layout control
- tabWidth = flag.Int("tabwidth", 4, "tab width")
- showTimestamps = flag.Bool("timestamps", false, "show timestamps with directory listings")
- templateDir = flag.String("templates", "", "load templates/JS/CSS from disk in this directory")
- showPlayground = flag.Bool("play", false, "enable playground in web interface")
- showExamples = flag.Bool("ex", false, "show examples in command line mode")
- declLinks = flag.Bool("links", true, "link identifiers to their declarations")
-
- // search index
- indexEnabled = flag.Bool("index", false, "enable search index")
- indexFiles = flag.String("index_files", "", "glob pattern specifying index files; if not empty, the index is read from these files in sorted order")
- indexInterval = flag.Duration("index_interval", 0, "interval of indexing; 0 for default (5m), negative to only index once at startup")
- maxResults = flag.Int("maxresults", 10000, "maximum number of full text search results shown")
- indexThrottle = flag.Float64("index_throttle", 0.75, "index throttle value; 0.0 = no time allocated, 1.0 = full throttle")
-
- // source code notes
- notesRx = flag.String("notes", "BUG", "regular expression matching note markers to show")
-)
-
-func usage() {
- fmt.Fprintf(os.Stderr,
- "usage: godoc package [name ...]\n"+
- " godoc -http="+defaultAddr+"\n")
- flag.PrintDefaults()
- os.Exit(2)
-}
-
-func loggingHandler(h http.Handler) http.Handler {
- return http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) {
- log.Printf("%s\t%s", req.RemoteAddr, req.URL)
- h.ServeHTTP(w, req)
- })
-}
-
-func handleURLFlag() {
- // Try up to 10 fetches, following redirects.
- urlstr := *urlFlag
- for i := 0; i < 10; i++ {
- // Prepare request.
- u, err := url.Parse(urlstr)
- if err != nil {
- log.Fatal(err)
- }
- req := &http.Request{
- URL: u,
- }
-
- // Invoke default HTTP handler to serve request
- // to our buffering httpWriter.
- w := httptest.NewRecorder()
- http.DefaultServeMux.ServeHTTP(w, req)
-
- // Return data, error, or follow redirect.
- switch w.Code {
- case 200: // ok
- os.Stdout.Write(w.Body.Bytes())
- return
- case 301, 302, 303, 307: // redirect
- redirect := w.HeaderMap.Get("Location")
- if redirect == "" {
- log.Fatalf("HTTP %d without Location header", w.Code)
- }
- urlstr = redirect
- default:
- log.Fatalf("HTTP error %d", w.Code)
- }
- }
- log.Fatalf("too many redirects")
-}
-
-func initCorpus(corpus *godoc.Corpus) {
- err := corpus.Init()
- if err != nil {
- log.Fatal(err)
- }
-}
-
-func main() {
- flag.Usage = usage
- flag.Parse()
-
- playEnabled = *showPlayground
-
- // Check usage: server and no args.
- if (*httpAddr != "" || *urlFlag != "") && (flag.NArg() > 0) {
- fmt.Fprintln(os.Stderr, "can't use -http with args.")
- usage()
- }
-
- // Check usage: command line args or index creation mode.
- if (*httpAddr != "" || *urlFlag != "") != (flag.NArg() == 0) && !*writeIndex {
- fmt.Fprintln(os.Stderr, "missing args.")
- usage()
- }
-
- var fsGate chan bool
- fsGate = make(chan bool, 20)
-
- // Determine file system to use.
- if *zipfile == "" {
- // use file system of underlying OS
- rootfs := gatefs.New(vfs.OS(*goroot), fsGate)
- fs.Bind("/", rootfs, "/", vfs.BindReplace)
- } else {
- // use file system specified via .zip file (path separator must be '/')
- rc, err := zip.OpenReader(*zipfile)
- if err != nil {
- log.Fatalf("%s: %s\n", *zipfile, err)
- }
- defer rc.Close() // be nice (e.g., -writeIndex mode)
- fs.Bind("/", zipfs.New(rc, *zipfile), *goroot, vfs.BindReplace)
- }
- if *templateDir != "" {
- fs.Bind("/lib/godoc", vfs.OS(*templateDir), "/", vfs.BindBefore)
- } else {
- fs.Bind("/lib/godoc", mapfs.New(static.Files), "/", vfs.BindReplace)
- }
-
- // Bind $GOPATH trees into Go root.
- for _, p := range filepath.SplitList(build.Default.GOPATH) {
- fs.Bind("/src", gatefs.New(vfs.OS(p), fsGate), "/src", vfs.BindAfter)
- }
-
- httpMode := *httpAddr != ""
-
- var typeAnalysis, pointerAnalysis bool
- if *analysisFlag != "" {
- for _, a := range strings.Split(*analysisFlag, ",") {
- switch a {
- case "type":
- typeAnalysis = true
- case "pointer":
- pointerAnalysis = true
- default:
- log.Fatalf("unknown analysis: %s", a)
- }
- }
- }
-
- corpus := godoc.NewCorpus(fs)
- corpus.Verbose = *verbose
- corpus.MaxResults = *maxResults
- corpus.IndexEnabled = *indexEnabled && httpMode
- if *maxResults == 0 {
- corpus.IndexFullText = false
- }
- corpus.IndexFiles = *indexFiles
- corpus.IndexDirectory = indexDirectoryDefault
- corpus.IndexThrottle = *indexThrottle
- corpus.IndexInterval = *indexInterval
- if *writeIndex {
- corpus.IndexThrottle = 1.0
- corpus.IndexEnabled = true
- }
- if *writeIndex || httpMode || *urlFlag != "" {
- if httpMode {
- go initCorpus(corpus)
- } else {
- initCorpus(corpus)
- }
- }
-
- pres = godoc.NewPresentation(corpus)
- pres.TabWidth = *tabWidth
- pres.ShowTimestamps = *showTimestamps
- pres.ShowPlayground = *showPlayground
- pres.ShowExamples = *showExamples
- pres.DeclLinks = *declLinks
- pres.SrcMode = *srcMode
- pres.HTMLMode = *html
- if *notesRx != "" {
- pres.NotesRx = regexp.MustCompile(*notesRx)
- }
-
- readTemplates(pres, httpMode || *urlFlag != "")
- registerHandlers(pres)
-
- if *writeIndex {
- // Write search index and exit.
- if *indexFiles == "" {
- log.Fatal("no index file specified")
- }
-
- log.Println("initialize file systems")
- *verbose = true // want to see what happens
-
- corpus.UpdateIndex()
-
- log.Println("writing index file", *indexFiles)
- f, err := os.Create(*indexFiles)
- if err != nil {
- log.Fatal(err)
- }
- index, _ := corpus.CurrentIndex()
- _, err = index.WriteTo(f)
- if err != nil {
- log.Fatal(err)
- }
-
- log.Println("done")
- return
- }
-
- // Print content that would be served at the URL *urlFlag.
- if *urlFlag != "" {
- handleURLFlag()
- return
- }
-
- if httpMode {
- // HTTP server mode.
- var handler http.Handler = http.DefaultServeMux
- if *verbose {
- log.Printf("Go Documentation Server")
- log.Printf("version = %s", runtime.Version())
- log.Printf("address = %s", *httpAddr)
- log.Printf("goroot = %s", *goroot)
- log.Printf("tabwidth = %d", *tabWidth)
- switch {
- case !*indexEnabled:
- log.Print("search index disabled")
- case *maxResults > 0:
- log.Printf("full text index enabled (maxresults = %d)", *maxResults)
- default:
- log.Print("identifier search index enabled")
- }
- fs.Fprint(os.Stderr)
- handler = loggingHandler(handler)
- }
-
- // Initialize search index.
- if *indexEnabled {
- go corpus.RunIndexer()
- }
-
- // Start type/pointer analysis.
- if typeAnalysis || pointerAnalysis {
- go analysis.Run(pointerAnalysis, &corpus.Analysis)
- }
-
- if serveAutoCertHook != nil {
- go func() {
- if err := serveAutoCertHook(handler); err != nil {
- log.Fatalf("ListenAndServe TLS: %v", err)
- }
- }()
- }
-
- // Start http server.
- if *verbose {
- log.Println("starting HTTP server")
- }
- if err := http.ListenAndServe(*httpAddr, handler); err != nil {
- log.Fatalf("ListenAndServe %s: %v", *httpAddr, err)
- }
-
- return
- }
-
- if *query {
- handleRemoteSearch()
- return
- }
-
- if err := godoc.CommandLine(os.Stdout, fs, pres, flag.Args()); err != nil {
- log.Print(err)
- }
-}
-
-// serveAutoCertHook if non-nil specifies a function to listen on port 443.
-// See autocert.go.
-var serveAutoCertHook func(http.Handler) error
diff --git a/vendor/golang.org/x/tools/cmd/godoc/play.go b/vendor/golang.org/x/tools/cmd/godoc/play.go
deleted file mode 100644
index 02f477d..0000000
--- a/vendor/golang.org/x/tools/cmd/godoc/play.go
+++ /dev/null
@@ -1,11 +0,0 @@
-// Copyright 2012 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build !appengine
-
-package main
-
-// This package registers "/compile" and "/share" handlers
-// that redirect to the golang.org playground.
-import _ "golang.org/x/tools/playground"
diff --git a/vendor/golang.org/x/tools/cmd/godoc/remotesearch.go b/vendor/golang.org/x/tools/cmd/godoc/remotesearch.go
deleted file mode 100644
index f01d5c7..0000000
--- a/vendor/golang.org/x/tools/cmd/godoc/remotesearch.go
+++ /dev/null
@@ -1,72 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build !appengine
-
-package main
-
-import (
- "errors"
- "flag"
- "io"
- "log"
- "net/http"
- "net/url"
- "os"
-)
-
-func handleRemoteSearch() {
- // Command-line queries.
- for i := 0; i < flag.NArg(); i++ {
- res, err := remoteSearch(flag.Arg(i))
- if err != nil {
- log.Fatalf("remoteSearch: %s", err)
- }
- io.Copy(os.Stdout, res.Body)
- }
- return
-}
-
-// remoteSearchURL returns the search URL for a given query as needed by
-// remoteSearch. If html is set, an html result is requested; otherwise
-// the result is in textual form.
-// Adjust this function as necessary if modeNames or FormValue parameters
-// change.
-func remoteSearchURL(query string, html bool) string {
- s := "/search?m=text&q="
- if html {
- s = "/search?q="
- }
- return s + url.QueryEscape(query)
-}
-
-func remoteSearch(query string) (res *http.Response, err error) {
- // list of addresses to try
- var addrs []string
- if *serverAddr != "" {
- // explicit server address - only try this one
- addrs = []string{*serverAddr}
- } else {
- addrs = []string{
- defaultAddr,
- "golang.org",
- }
- }
-
- // remote search
- search := remoteSearchURL(query, *html)
- for _, addr := range addrs {
- url := "http://" + addr + search
- res, err = http.Get(url)
- if err == nil && res.StatusCode == http.StatusOK {
- break
- }
- }
-
- if err == nil && res.StatusCode != http.StatusOK {
- err = errors.New(res.Status)
- }
-
- return
-}
diff --git a/vendor/golang.org/x/tools/cmd/godoc/setup-godoc-app.bash b/vendor/golang.org/x/tools/cmd/godoc/setup-godoc-app.bash
deleted file mode 100644
index f227738..0000000
--- a/vendor/golang.org/x/tools/cmd/godoc/setup-godoc-app.bash
+++ /dev/null
@@ -1,134 +0,0 @@
-#!/usr/bin/env bash
-
-# Copyright 2011 The Go Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style
-# license that can be found in the LICENSE file.
-
-# This script creates a complete godoc app in $APPDIR.
-# It copies the cmd/godoc and src/go/... sources from GOROOT,
-# synthesizes an app.yaml file, and creates the .zip, index, and
-# configuration files.
-#
-# If an argument is provided it is assumed to be the app-engine godoc directory.
-# Without an argument, $APPDIR is used instead. If GOROOT is not set, "go env"
-# is consulted to find the $GOROOT.
-#
-# The script creates a .zip file representing the $GOROOT file system
-# and computes the correspondig search index files. These files are then
-# copied to $APPDIR. A corresponding godoc configuration file is created
-# in $APPDIR/appconfig.go.
-
-ZIPFILE=godoc.zip
-INDEXFILE=godoc.index
-SPLITFILES=index.split.
-GODOC=golang.org/x/tools/cmd/godoc
-CONFIGFILE=$GODOC/appconfig.go
-
-error() {
- echo "error: $1"
- exit 2
-}
-
-getArgs() {
- if [ -z $APPENGINE_SDK ]; then
- error "APPENGINE_SDK environment variable not set"
- fi
- if [ ! -x $APPENGINE_SDK/goapp ]; then
- error "couldn't find goapp command in $APPENGINE_SDK"
- fi
- if [ -z $GOROOT ]; then
- GOROOT=$(go env GOROOT)
- echo "GOROOT not set explicitly, using go env value instead"
- fi
- if [ -z $APPDIR ]; then
- if [ $# == 0 ]; then
- error "APPDIR not set, and no argument provided"
- fi
- APPDIR=$1
- echo "APPDIR not set, using argument instead"
- fi
-
- # safety checks
- if [ ! -d $GOROOT ]; then
- error "$GOROOT is not a directory"
- fi
- if [ -e $APPDIR ]; then
- error "$APPDIR exists; check and remove it before trying again"
- fi
-
- # reporting
- echo "GOROOT = $GOROOT"
- echo "APPDIR = $APPDIR"
-}
-
-fetchGodoc() {
- echo "*** Fetching godoc (if not already in GOPATH)"
- unset GOBIN
- go=$APPENGINE_SDK/goapp
- $go get -d -tags appengine $GODOC
- mkdir -p $APPDIR/$GODOC
- cp $(find $($go list -f '{{.Dir}}' $GODOC) -mindepth 1 -maxdepth 1 -type f) $APPDIR/$GODOC/
-}
-
-makeAppYaml() {
- echo "*** make $APPDIR/app.yaml"
- cat > $APPDIR/app.yaml < $APPDIR/$CONFIGFILE <
-
-
-
-
-
-
-
-
-Nothing to see here; move along .
-
-
-`))
diff --git a/vendor/golang.org/x/tools/cmd/goimports/doc.go b/vendor/golang.org/x/tools/cmd/goimports/doc.go
deleted file mode 100644
index f5ca3a0..0000000
--- a/vendor/golang.org/x/tools/cmd/goimports/doc.go
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
-
-Command goimports updates your Go import lines,
-adding missing ones and removing unreferenced ones.
-
- $ go get golang.org/x/tools/cmd/goimports
-
-In addition to fixing imports, goimports also formats
-your code in the same style as gofmt so it can be used
-as a replacement for your editor's gofmt-on-save hook.
-
-For emacs, make sure you have the latest go-mode.el:
- https://github.com/dominikh/go-mode.el
-Then in your .emacs file:
- (setq gofmt-command "goimports")
- (add-to-list 'load-path "/home/you/somewhere/emacs/")
- (require 'go-mode-autoloads)
- (add-hook 'before-save-hook 'gofmt-before-save)
-
-For vim, set "gofmt_command" to "goimports":
- https://golang.org/change/39c724dd7f252
- https://golang.org/wiki/IDEsAndTextEditorPlugins
- etc
-
-For GoSublime, follow the steps described here:
- http://michaelwhatcott.com/gosublime-goimports/
-
-For other editors, you probably know what to do.
-
-To exclude directories in your $GOPATH from being scanned for Go
-files, goimports respects a configuration file at
-$GOPATH/src/.goimportsignore which may contain blank lines, comment
-lines (beginning with '#'), or lines naming a directory relative to
-the configuration file to ignore when scanning. No globbing or regex
-patterns are allowed. Use the "-v" verbose flag to verify it's
-working and see what goimports is doing.
-
-File bugs or feature requests at:
-
- https://golang.org/issues/new?title=x/tools/cmd/goimports:+
-
-Happy hacking!
-
-*/
-package main // import "golang.org/x/tools/cmd/goimports"
diff --git a/vendor/golang.org/x/tools/cmd/goimports/goimports.go b/vendor/golang.org/x/tools/cmd/goimports/goimports.go
deleted file mode 100644
index 0ce85c9..0000000
--- a/vendor/golang.org/x/tools/cmd/goimports/goimports.go
+++ /dev/null
@@ -1,369 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-import (
- "bufio"
- "bytes"
- "errors"
- "flag"
- "fmt"
- "go/scanner"
- "io"
- "io/ioutil"
- "log"
- "os"
- "os/exec"
- "path/filepath"
- "runtime"
- "runtime/pprof"
- "strings"
-
- "golang.org/x/tools/imports"
-)
-
-var (
- // main operation modes
- list = flag.Bool("l", false, "list files whose formatting differs from goimport's")
- write = flag.Bool("w", false, "write result to (source) file instead of stdout")
- doDiff = flag.Bool("d", false, "display diffs instead of rewriting files")
- srcdir = flag.String("srcdir", "", "choose imports as if source code is from `dir`. When operating on a single file, dir may instead be the complete file name.")
- verbose bool // verbose logging
-
- cpuProfile = flag.String("cpuprofile", "", "CPU profile output")
- memProfile = flag.String("memprofile", "", "memory profile output")
- memProfileRate = flag.Int("memrate", 0, "if > 0, sets runtime.MemProfileRate")
-
- options = &imports.Options{
- TabWidth: 8,
- TabIndent: true,
- Comments: true,
- Fragment: true,
- }
- exitCode = 0
-)
-
-func init() {
- flag.BoolVar(&options.AllErrors, "e", false, "report all errors (not just the first 10 on different lines)")
- flag.StringVar(&imports.LocalPrefix, "local", "", "put imports beginning with this string after 3rd-party packages; comma-separated list")
-}
-
-func report(err error) {
- scanner.PrintError(os.Stderr, err)
- exitCode = 2
-}
-
-func usage() {
- fmt.Fprintf(os.Stderr, "usage: goimports [flags] [path ...]\n")
- flag.PrintDefaults()
- os.Exit(2)
-}
-
-func isGoFile(f os.FileInfo) bool {
- // ignore non-Go files
- name := f.Name()
- return !f.IsDir() && !strings.HasPrefix(name, ".") && strings.HasSuffix(name, ".go")
-}
-
-// argumentType is which mode goimports was invoked as.
-type argumentType int
-
-const (
- // fromStdin means the user is piping their source into goimports.
- fromStdin argumentType = iota
-
- // singleArg is the common case from editors, when goimports is run on
- // a single file.
- singleArg
-
- // multipleArg is when the user ran "goimports file1.go file2.go"
- // or ran goimports on a directory tree.
- multipleArg
-)
-
-func processFile(filename string, in io.Reader, out io.Writer, argType argumentType) error {
- opt := options
- if argType == fromStdin {
- nopt := *options
- nopt.Fragment = true
- opt = &nopt
- }
-
- if in == nil {
- f, err := os.Open(filename)
- if err != nil {
- return err
- }
- defer f.Close()
- in = f
- }
-
- src, err := ioutil.ReadAll(in)
- if err != nil {
- return err
- }
-
- target := filename
- if *srcdir != "" {
- // Determine whether the provided -srcdirc is a directory or file
- // and then use it to override the target.
- //
- // See https://github.com/dominikh/go-mode.el/issues/146
- if isFile(*srcdir) {
- if argType == multipleArg {
- return errors.New("-srcdir value can't be a file when passing multiple arguments or when walking directories")
- }
- target = *srcdir
- } else if argType == singleArg && strings.HasSuffix(*srcdir, ".go") && !isDir(*srcdir) {
- // For a file which doesn't exist on disk yet, but might shortly.
- // e.g. user in editor opens $DIR/newfile.go and newfile.go doesn't yet exist on disk.
- // The goimports on-save hook writes the buffer to a temp file
- // first and runs goimports before the actual save to newfile.go.
- // The editor's buffer is named "newfile.go" so that is passed to goimports as:
- // goimports -srcdir=/gopath/src/pkg/newfile.go /tmp/gofmtXXXXXXXX.go
- // and then the editor reloads the result from the tmp file and writes
- // it to newfile.go.
- target = *srcdir
- } else {
- // Pretend that file is from *srcdir in order to decide
- // visible imports correctly.
- target = filepath.Join(*srcdir, filepath.Base(filename))
- }
- }
-
- res, err := imports.Process(target, src, opt)
- if err != nil {
- return err
- }
-
- if !bytes.Equal(src, res) {
- // formatting has changed
- if *list {
- fmt.Fprintln(out, filename)
- }
- if *write {
- if argType == fromStdin {
- // filename is ""
- return errors.New("can't use -w on stdin")
- }
- err = ioutil.WriteFile(filename, res, 0)
- if err != nil {
- return err
- }
- }
- if *doDiff {
- if argType == fromStdin {
- filename = "stdin.go" // because .orig looks silly
- }
- data, err := diff(src, res, filename)
- if err != nil {
- return fmt.Errorf("computing diff: %s", err)
- }
- fmt.Printf("diff -u %s %s\n", filepath.ToSlash(filename+".orig"), filepath.ToSlash(filename))
- out.Write(data)
- }
- }
-
- if !*list && !*write && !*doDiff {
- _, err = out.Write(res)
- }
-
- return err
-}
-
-func visitFile(path string, f os.FileInfo, err error) error {
- if err == nil && isGoFile(f) {
- err = processFile(path, nil, os.Stdout, multipleArg)
- }
- if err != nil {
- report(err)
- }
- return nil
-}
-
-func walkDir(path string) {
- filepath.Walk(path, visitFile)
-}
-
-func main() {
- runtime.GOMAXPROCS(runtime.NumCPU())
-
- // call gofmtMain in a separate function
- // so that it can use defer and have them
- // run before the exit.
- gofmtMain()
- os.Exit(exitCode)
-}
-
-// parseFlags parses command line flags and returns the paths to process.
-// It's a var so that custom implementations can replace it in other files.
-var parseFlags = func() []string {
- flag.BoolVar(&verbose, "v", false, "verbose logging")
-
- flag.Parse()
- return flag.Args()
-}
-
-func bufferedFileWriter(dest string) (w io.Writer, close func()) {
- f, err := os.Create(dest)
- if err != nil {
- log.Fatal(err)
- }
- bw := bufio.NewWriter(f)
- return bw, func() {
- if err := bw.Flush(); err != nil {
- log.Fatalf("error flushing %v: %v", dest, err)
- }
- if err := f.Close(); err != nil {
- log.Fatal(err)
- }
- }
-}
-
-func gofmtMain() {
- flag.Usage = usage
- paths := parseFlags()
-
- if *cpuProfile != "" {
- bw, flush := bufferedFileWriter(*cpuProfile)
- pprof.StartCPUProfile(bw)
- defer flush()
- defer pprof.StopCPUProfile()
- }
- // doTrace is a conditionally compiled wrapper around runtime/trace. It is
- // used to allow goimports to compile under gccgo, which does not support
- // runtime/trace. See https://golang.org/issue/15544.
- defer doTrace()()
- if *memProfileRate > 0 {
- runtime.MemProfileRate = *memProfileRate
- bw, flush := bufferedFileWriter(*memProfile)
- defer func() {
- runtime.GC() // materialize all statistics
- if err := pprof.WriteHeapProfile(bw); err != nil {
- log.Fatal(err)
- }
- flush()
- }()
- }
-
- if verbose {
- log.SetFlags(log.LstdFlags | log.Lmicroseconds)
- imports.Debug = true
- }
- if options.TabWidth < 0 {
- fmt.Fprintf(os.Stderr, "negative tabwidth %d\n", options.TabWidth)
- exitCode = 2
- return
- }
-
- if len(paths) == 0 {
- if err := processFile("", os.Stdin, os.Stdout, fromStdin); err != nil {
- report(err)
- }
- return
- }
-
- argType := singleArg
- if len(paths) > 1 {
- argType = multipleArg
- }
-
- for _, path := range paths {
- switch dir, err := os.Stat(path); {
- case err != nil:
- report(err)
- case dir.IsDir():
- walkDir(path)
- default:
- if err := processFile(path, nil, os.Stdout, argType); err != nil {
- report(err)
- }
- }
- }
-}
-
-func writeTempFile(dir, prefix string, data []byte) (string, error) {
- file, err := ioutil.TempFile(dir, prefix)
- if err != nil {
- return "", err
- }
- _, err = file.Write(data)
- if err1 := file.Close(); err == nil {
- err = err1
- }
- if err != nil {
- os.Remove(file.Name())
- return "", err
- }
- return file.Name(), nil
-}
-
-func diff(b1, b2 []byte, filename string) (data []byte, err error) {
- f1, err := writeTempFile("", "gofmt", b1)
- if err != nil {
- return
- }
- defer os.Remove(f1)
-
- f2, err := writeTempFile("", "gofmt", b2)
- if err != nil {
- return
- }
- defer os.Remove(f2)
-
- cmd := "diff"
- if runtime.GOOS == "plan9" {
- cmd = "/bin/ape/diff"
- }
-
- data, err = exec.Command(cmd, "-u", f1, f2).CombinedOutput()
- if len(data) > 0 {
- // diff exits with a non-zero status when the files don't match.
- // Ignore that failure as long as we get output.
- return replaceTempFilename(data, filename)
- }
- return
-}
-
-// replaceTempFilename replaces temporary filenames in diff with actual one.
-//
-// --- /tmp/gofmt316145376 2017-02-03 19:13:00.280468375 -0500
-// +++ /tmp/gofmt617882815 2017-02-03 19:13:00.280468375 -0500
-// ...
-// ->
-// --- path/to/file.go.orig 2017-02-03 19:13:00.280468375 -0500
-// +++ path/to/file.go 2017-02-03 19:13:00.280468375 -0500
-// ...
-func replaceTempFilename(diff []byte, filename string) ([]byte, error) {
- bs := bytes.SplitN(diff, []byte{'\n'}, 3)
- if len(bs) < 3 {
- return nil, fmt.Errorf("got unexpected diff for %s", filename)
- }
- // Preserve timestamps.
- var t0, t1 []byte
- if i := bytes.LastIndexByte(bs[0], '\t'); i != -1 {
- t0 = bs[0][i:]
- }
- if i := bytes.LastIndexByte(bs[1], '\t'); i != -1 {
- t1 = bs[1][i:]
- }
- // Always print filepath with slash separator.
- f := filepath.ToSlash(filename)
- bs[0] = []byte(fmt.Sprintf("--- %s%s", f+".orig", t0))
- bs[1] = []byte(fmt.Sprintf("+++ %s%s", f, t1))
- return bytes.Join(bs, []byte{'\n'}), nil
-}
-
-// isFile reports whether name is a file.
-func isFile(name string) bool {
- fi, err := os.Stat(name)
- return err == nil && fi.Mode().IsRegular()
-}
-
-// isDir reports whether name is a directory.
-func isDir(name string) bool {
- fi, err := os.Stat(name)
- return err == nil && fi.IsDir()
-}
diff --git a/vendor/golang.org/x/tools/cmd/goimports/goimports_gc.go b/vendor/golang.org/x/tools/cmd/goimports/goimports_gc.go
deleted file mode 100644
index 21d867e..0000000
--- a/vendor/golang.org/x/tools/cmd/goimports/goimports_gc.go
+++ /dev/null
@@ -1,26 +0,0 @@
-// Copyright 2016 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build gc
-
-package main
-
-import (
- "flag"
- "runtime/trace"
-)
-
-var traceProfile = flag.String("trace", "", "trace profile output")
-
-func doTrace() func() {
- if *traceProfile != "" {
- bw, flush := bufferedFileWriter(*traceProfile)
- trace.Start(bw)
- return func() {
- flush()
- trace.Stop()
- }
- }
- return func() {}
-}
diff --git a/vendor/golang.org/x/tools/cmd/goimports/goimports_not_gc.go b/vendor/golang.org/x/tools/cmd/goimports/goimports_not_gc.go
deleted file mode 100644
index f5531ce..0000000
--- a/vendor/golang.org/x/tools/cmd/goimports/goimports_not_gc.go
+++ /dev/null
@@ -1,11 +0,0 @@
-// Copyright 2016 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build !gc
-
-package main
-
-func doTrace() func() {
- return func() {}
-}
diff --git a/vendor/golang.org/x/tools/cmd/gomvpkg/main.go b/vendor/golang.org/x/tools/cmd/gomvpkg/main.go
deleted file mode 100644
index 959b84e..0000000
--- a/vendor/golang.org/x/tools/cmd/gomvpkg/main.go
+++ /dev/null
@@ -1,94 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// licence that can be found in the LICENSE file.
-
-// The gomvpkg command moves go packages, updating import declarations.
-// See the -help message or Usage constant for details.
-package main
-
-import (
- "flag"
- "fmt"
- "go/build"
- "os"
-
- "golang.org/x/tools/go/buildutil"
- "golang.org/x/tools/refactor/rename"
-)
-
-var (
- fromFlag = flag.String("from", "", "Import path of package to be moved")
- toFlag = flag.String("to", "", "Destination import path for package")
- vcsMvCmdFlag = flag.String("vcs_mv_cmd", "", `A template for the version control system's "move directory" command, e.g. "git mv {{.Src}} {{.Dst}}`)
- helpFlag = flag.Bool("help", false, "show usage message")
-)
-
-func init() {
- flag.Var((*buildutil.TagsFlag)(&build.Default.BuildTags), "tags", buildutil.TagsFlagDoc)
-}
-
-const Usage = `gomvpkg: moves a package, updating import declarations
-
-Usage:
-
- gomvpkg -from -to [-vcs_mv_cmd ]
-
-Flags:
-
--from specifies the import path of the package to be moved
-
--to specifies the destination import path
-
--vcs_mv_cmd specifies a shell command to inform the version control system of a
- directory move. The argument is a template using the syntax of the
- text/template package. It has two fields: Src and Dst, the absolute
- paths of the directories.
-
- For example: "git mv {{.Src}} {{.Dst}}"
-
-gomvpkg determines the set of packages that might be affected, including all
-packages importing the 'from' package and any of its subpackages. It will move
-the 'from' package and all its subpackages to the destination path and update all
-imports of those packages to point to its new import path.
-
-gomvpkg rejects moves in which a package already exists at the destination import
-path, or in which a directory already exists at the location the package would be
-moved to.
-
-gomvpkg will not always be able to rename imports when a package's name is changed.
-Import statements may want further cleanup.
-
-gomvpkg's behavior is not defined if any of the packages to be moved are
-imported using dot imports.
-
-Examples:
-
-% gomvpkg -from myproject/foo -to myproject/bar
-
- Move the package with import path "myproject/foo" to the new path
- "myproject/bar".
-
-% gomvpkg -from myproject/foo -to myproject/bar -vcs_mv_cmd "git mv {{.Src}} {{.Dst}}"
-
- Move the package with import path "myproject/foo" to the new path
- "myproject/bar" using "git mv" to execute the directory move.
-`
-
-func main() {
- flag.Parse()
-
- if len(flag.Args()) > 0 {
- fmt.Fprintln(os.Stderr, "gomvpkg: surplus arguments.")
- os.Exit(1)
- }
-
- if *helpFlag || *fromFlag == "" || *toFlag == "" {
- fmt.Println(Usage)
- return
- }
-
- if err := rename.Move(&build.Default, *fromFlag, *toFlag, *vcsMvCmdFlag); err != nil {
- fmt.Fprintf(os.Stderr, "gomvpkg: %s.\n", err)
- os.Exit(1)
- }
-}
diff --git a/vendor/golang.org/x/tools/cmd/gorename/cgo_test.go b/vendor/golang.org/x/tools/cmd/gorename/cgo_test.go
deleted file mode 100644
index fd07553..0000000
--- a/vendor/golang.org/x/tools/cmd/gorename/cgo_test.go
+++ /dev/null
@@ -1,11 +0,0 @@
-// Copyright 2017 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build cgo
-
-package main_test
-
-func init() {
- haveCGO = true
-}
diff --git a/vendor/golang.org/x/tools/cmd/gorename/gorename_test.go b/vendor/golang.org/x/tools/cmd/gorename/gorename_test.go
deleted file mode 100644
index b778cb6..0000000
--- a/vendor/golang.org/x/tools/cmd/gorename/gorename_test.go
+++ /dev/null
@@ -1,380 +0,0 @@
-// Copyright 2017 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main_test
-
-import (
- "fmt"
- "io/ioutil"
- "os"
- "os/exec"
- "path/filepath"
- "runtime"
- "strconv"
- "strings"
- "testing"
-)
-
-var haveCGO bool
-
-type test struct {
- offset, from, to string // specify the arguments
- fileSpecified bool // true if the offset or from args specify a specific file
- pkgs map[string][]string
- wantErr bool
- wantOut string // a substring expected to be in the output
- packages map[string][]string // a map of the package name to the files contained within, which will be numbered by i.go where i is the index
-}
-
-// Test that renaming that would modify cgo files will produce an error and not modify the file.
-func TestGeneratedFiles(t *testing.T) {
- if !haveCGO {
- t.Skipf("skipping test: no cgo")
- }
-
- tmp, bin, cleanup := buildGorename(t)
- defer cleanup()
-
- srcDir := filepath.Join(tmp, "src")
- err := os.Mkdir(srcDir, os.ModePerm)
- if err != nil {
- t.Fatal(err)
- }
-
- var env = []string{fmt.Sprintf("GOPATH=%s", tmp)}
- for _, envVar := range os.Environ() {
- if !strings.HasPrefix(envVar, "GOPATH=") {
- env = append(env, envVar)
- }
- }
-
- // Testing renaming in packages that include cgo files:
- for iter, renameTest := range []test{
- {
- // Test: variable not used in any cgo file -> no error
- from: `"mytest"::f`, to: "g",
- packages: map[string][]string{
- "mytest": []string{`package mytest; func f() {}`,
- `package mytest
-// #include
-import "C"
-
-func z() {C.puts(nil)}`},
- },
- wantErr: false,
- wantOut: "Renamed 1 occurrence in 1 file in 1 package.",
- }, {
- // Test: to name used in cgo file -> rename error
- from: `"mytest"::f`, to: "g",
- packages: map[string][]string{
- "mytest": []string{`package mytest; func f() {}`,
- `package mytest
-// #include
-import "C"
-
-func g() {C.puts(nil)}`},
- },
- wantErr: true,
- wantOut: "conflicts with func in same block",
- },
- {
- // Test: from name in package in cgo file -> error
- from: `"mytest"::f`, to: "g",
- packages: map[string][]string{
- "mytest": []string{`package mytest
-
-// #include
-import "C"
-
-func f() { C.puts(nil); }
-`},
- },
- wantErr: true,
- wantOut: "gorename: refusing to modify generated file containing DO NOT EDIT marker:",
- }, {
- // Test: from name in cgo file -> error
- from: filepath.Join("mytest", "0.go") + `::f`, to: "g",
- fileSpecified: true,
- packages: map[string][]string{
- "mytest": []string{`package mytest
-
-// #include
-import "C"
-
-func f() { C.puts(nil); }
-`},
- },
- wantErr: true,
- wantOut: "gorename: refusing to modify generated file containing DO NOT EDIT marker:",
- }, {
- // Test: offset in cgo file -> identifier in cgo error
- offset: filepath.Join("main", "0.go") + `:#78`, to: "bar",
- fileSpecified: true,
- wantErr: true,
- packages: map[string][]string{
- "main": {`package main
-
-// #include
-import "C"
-import "fmt"
-
-func main() {
- foo := 1
- C.close(2)
- fmt.Println(foo)
-}
-`},
- },
- wantOut: "cannot rename identifiers in generated file containing DO NOT EDIT marker:",
- }, {
- // Test: from identifier appears in cgo file in another package -> error
- from: `"test"::Foo`, to: "Bar",
- packages: map[string][]string{
- "test": []string{
- `package test
-
-func Foo(x int) (int){
- return x * 2
-}
-`,
- },
- "main": []string{
- `package main
-
-import "test"
-import "fmt"
-// #include
-import "C"
-
-func fun() {
- x := test.Foo(3)
- C.close(3)
- fmt.Println(x)
-}
-`,
- },
- },
- wantErr: true,
- wantOut: "gorename: refusing to modify generated file containing DO NOT EDIT marker:",
- }, {
- // Test: from identifier doesn't appear in cgo file that includes modified package -> rename successful
- from: `"test".Foo::x`, to: "y",
- packages: map[string][]string{
- "test": []string{
- `package test
-
-func Foo(x int) (int){
- return x * 2
-}
-`,
- },
- "main": []string{
- `package main
-import "test"
-import "fmt"
-// #include
-import "C"
-
-func fun() {
- x := test.Foo(3)
- C.close(3)
- fmt.Println(x)
-}
-`,
- },
- },
- wantErr: false,
- wantOut: "Renamed 2 occurrences in 1 file in 1 package.",
- }, {
- // Test: from name appears in cgo file in same package -> error
- from: `"mytest"::f`, to: "g",
- packages: map[string][]string{
- "mytest": []string{`package mytest; func f() {}`,
- `package mytest
-// #include
-import "C"
-
-func z() {C.puts(nil); f()}`,
- `package mytest
-// #include
-import "C"
-
-func foo() {C.close(3); f()}`,
- },
- },
- wantErr: true,
- wantOut: "gorename: refusing to modify generated files containing DO NOT EDIT marker:",
- }, {
- // Test: from name in file, identifier not used in cgo file -> rename successful
- from: filepath.Join("mytest", "0.go") + `::f`, to: "g",
- fileSpecified: true,
- packages: map[string][]string{
- "mytest": []string{`package mytest; func f() {}`,
- `package mytest
-// #include
-import "C"
-
-func z() {C.puts(nil)}`},
- },
- wantErr: false,
- wantOut: "Renamed 1 occurrence in 1 file in 1 package.",
- }, {
- // Test: from identifier imported to another package but does not modify cgo file -> rename successful
- from: `"test".Foo`, to: "Bar",
- packages: map[string][]string{
- "test": []string{
- `package test
-
-func Foo(x int) (int){
- return x * 2
-}
-`,
- },
- "main": []string{
- `package main
-// #include
-import "C"
-
-func fun() {
- C.close(3)
-}
-`,
- `package main
-import "test"
-import "fmt"
-func g() { fmt.Println(test.Foo(3)) }
-`,
- },
- },
- wantErr: false,
- wantOut: "Renamed 2 occurrences in 2 files in 2 packages.",
- },
- } {
- // Write the test files
- testCleanup := setUpPackages(t, srcDir, renameTest.packages)
-
- // Set up arguments
- var args []string
-
- var arg, val string
- if renameTest.offset != "" {
- arg, val = "-offset", renameTest.offset
- } else {
- arg, val = "-from", renameTest.from
- }
-
- prefix := fmt.Sprintf("%d: %s %q -to %q", iter, arg, val, renameTest.to)
-
- if renameTest.fileSpecified {
- // add the src dir to the value of the argument
- val = filepath.Join(srcDir, val)
- }
-
- args = append(args, arg, val, "-to", renameTest.to)
-
- // Run command
- cmd := exec.Command(bin, args...)
- cmd.Args[0] = "gorename"
- cmd.Env = env
-
- // Check the output
- out, err := cmd.CombinedOutput()
- // errors should result in no changes to files
- if err != nil {
- if !renameTest.wantErr {
- t.Errorf("%s: received unexpected error %s", prefix, err)
- }
- // Compare output
- if ok := strings.Contains(string(out), renameTest.wantOut); !ok {
- t.Errorf("%s: unexpected command output: %s (want: %s)", prefix, out, renameTest.wantOut)
- }
- // Check that no files were modified
- if modified := modifiedFiles(t, srcDir, renameTest.packages); len(modified) != 0 {
- t.Errorf("%s: files unexpectedly modified: %s", prefix, modified)
- }
-
- } else {
- if !renameTest.wantErr {
- if ok := strings.Contains(string(out), renameTest.wantOut); !ok {
- t.Errorf("%s: unexpected command output: %s (want: %s)", prefix, out, renameTest.wantOut)
- }
- } else {
- t.Errorf("%s: command succeeded unexpectedly, output: %s", prefix, out)
- }
- }
- testCleanup()
- }
-}
-
-// buildGorename builds the gorename executable.
-// It returns its path, and a cleanup function.
-func buildGorename(t *testing.T) (tmp, bin string, cleanup func()) {
-
- tmp, err := ioutil.TempDir("", "gorename-regtest-")
- if err != nil {
- t.Fatal(err)
- }
-
- defer func() {
- if cleanup == nil { // probably, go build failed.
- os.RemoveAll(tmp)
- }
- }()
-
- bin = filepath.Join(tmp, "gorename")
- if runtime.GOOS == "windows" {
- bin += ".exe"
- }
- cmd := exec.Command("go", "build", "-o", bin)
- if err := cmd.Run(); err != nil {
- t.Fatalf("Building gorename: %v", err)
- }
- return tmp, bin, func() { os.RemoveAll(tmp) }
-}
-
-// setUpPackages sets up the files in a temporary directory provided by arguments.
-func setUpPackages(t *testing.T, dir string, packages map[string][]string) (cleanup func()) {
- var pkgDirs []string
-
- for pkgName, files := range packages {
- // Create a directory for the package.
- pkgDir := filepath.Join(dir, pkgName)
- pkgDirs = append(pkgDirs, pkgDir)
-
- if err := os.Mkdir(pkgDir, os.ModePerm); err != nil {
- t.Fatal(err)
- }
- // Write the packages files
- for i, val := range files {
- file := filepath.Join(pkgDir, strconv.Itoa(i)+".go")
- if err := ioutil.WriteFile(file, []byte(val), os.ModePerm); err != nil {
- t.Fatal(err)
- }
- }
- }
- return func() {
- for _, dir := range pkgDirs {
- os.RemoveAll(dir)
- }
- }
-}
-
-// modifiedFiles returns a list of files that were renamed (without the prefix dir).
-func modifiedFiles(t *testing.T, dir string, packages map[string][]string) (results []string) {
-
- for pkgName, files := range packages {
- pkgDir := filepath.Join(dir, pkgName)
-
- for i, val := range files {
- file := filepath.Join(pkgDir, strconv.Itoa(i)+".go")
- // read file contents and compare to val
- if contents, err := ioutil.ReadFile(file); err != nil {
- t.Fatalf("File missing: %s", err)
- } else if string(contents) != val {
- results = append(results, strings.TrimPrefix(dir, file))
- }
- }
- }
- return results
-}
diff --git a/vendor/golang.org/x/tools/cmd/gorename/main.go b/vendor/golang.org/x/tools/cmd/gorename/main.go
deleted file mode 100644
index b1b895c..0000000
--- a/vendor/golang.org/x/tools/cmd/gorename/main.go
+++ /dev/null
@@ -1,55 +0,0 @@
-// The gorename command performs precise type-safe renaming of
-// identifiers in Go source code.
-//
-// Run with -help for usage information, or view the Usage constant in
-// package golang.org/x/tools/refactor/rename, which contains most of
-// the implementation.
-//
-package main // import "golang.org/x/tools/cmd/gorename"
-
-import (
- "flag"
- "fmt"
- "go/build"
- "log"
- "os"
-
- "golang.org/x/tools/go/buildutil"
- "golang.org/x/tools/refactor/rename"
-)
-
-var (
- offsetFlag = flag.String("offset", "", "file and byte offset of identifier to be renamed, e.g. 'file.go:#123'. For use by editors.")
- fromFlag = flag.String("from", "", "identifier to be renamed; see -help for formats")
- toFlag = flag.String("to", "", "new name for identifier")
- helpFlag = flag.Bool("help", false, "show usage message")
-)
-
-func init() {
- flag.Var((*buildutil.TagsFlag)(&build.Default.BuildTags), "tags", buildutil.TagsFlagDoc)
- flag.BoolVar(&rename.Force, "force", false, "proceed, even if conflicts were reported")
- flag.BoolVar(&rename.Verbose, "v", false, "print verbose information")
- flag.BoolVar(&rename.Diff, "d", false, "display diffs instead of rewriting files")
- flag.StringVar(&rename.DiffCmd, "diffcmd", "diff", "diff command invoked when using -d")
-}
-
-func main() {
- log.SetPrefix("gorename: ")
- log.SetFlags(0)
- flag.Parse()
- if len(flag.Args()) > 0 {
- log.Fatal("surplus arguments")
- }
-
- if *helpFlag || (*offsetFlag == "" && *fromFlag == "" && *toFlag == "") {
- fmt.Println(rename.Usage)
- return
- }
-
- if err := rename.Main(&build.Default, *offsetFlag, *fromFlag, *toFlag); err != nil {
- if err != rename.ConflictError {
- log.Fatal(err)
- }
- os.Exit(1)
- }
-}
diff --git a/vendor/golang.org/x/tools/cmd/gotype/gotype.go b/vendor/golang.org/x/tools/cmd/gotype/gotype.go
deleted file mode 100644
index ed88e63..0000000
--- a/vendor/golang.org/x/tools/cmd/gotype/gotype.go
+++ /dev/null
@@ -1,341 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// gotype.go is a copy of the original source maintained
-// in $GOROOT/src/go/types/gotype.go, but with the call
-// to types.SizesFor factored out so we can provide a local
-// implementation when compiling against Go 1.8 and earlier.
-//
-// This code is here for the sole purpose of satisfying historic
-// references to this location, and for making gotype accessible
-// via 'go get'.
-//
-// Do NOT make changes to this version as they will not be maintained
-// (and possibly overwritten). Any changes should be made to the original
-// and then ported to here.
-
-/*
-The gotype command, like the front-end of a Go compiler, parses and
-type-checks a single Go package. Errors are reported if the analysis
-fails; otherwise gotype is quiet (unless -v is set).
-
-Without a list of paths, gotype reads from standard input, which
-must provide a single Go source file defining a complete package.
-
-With a single directory argument, gotype checks the Go files in
-that directory, comprising a single package. Use -t to include the
-(in-package) _test.go files. Use -x to type check only external
-test files.
-
-Otherwise, each path must be the filename of a Go file belonging
-to the same package.
-
-Imports are processed by importing directly from the source of
-imported packages (default), or by importing from compiled and
-installed packages (by setting -c to the respective compiler).
-
-The -c flag must be set to a compiler ("gc", "gccgo") when type-
-checking packages containing imports with relative import paths
-(import "./mypkg") because the source importer cannot know which
-files to include for such packages.
-
-Usage:
- gotype [flags] [path...]
-
-The flags are:
- -t
- include local test files in a directory (ignored if -x is provided)
- -x
- consider only external test files in a directory
- -e
- report all errors (not just the first 10)
- -v
- verbose mode
- -c
- compiler used for installed packages (gc, gccgo, or source); default: source
-
-Flags controlling additional output:
- -ast
- print AST (forces -seq)
- -trace
- print parse trace (forces -seq)
- -comments
- parse comments (ignored unless -ast or -trace is provided)
-
-Examples:
-
-To check the files a.go, b.go, and c.go:
-
- gotype a.go b.go c.go
-
-To check an entire package including (in-package) tests in the directory dir and print the processed files:
-
- gotype -t -v dir
-
-To check the external test package (if any) in the current directory, based on installed packages compiled with
-cmd/compile:
-
- gotype -c=gc -x .
-
-To verify the output of a pipe:
-
- echo "package foo" | gotype
-
-*/
-package main
-
-import (
- "flag"
- "fmt"
- "go/ast"
- "go/build"
- "go/importer"
- "go/parser"
- "go/scanner"
- "go/token"
- "go/types"
- "io/ioutil"
- "os"
- "path/filepath"
- "sync"
- "time"
-)
-
-var (
- // main operation modes
- testFiles = flag.Bool("t", false, "include in-package test files in a directory")
- xtestFiles = flag.Bool("x", false, "consider only external test files in a directory")
- allErrors = flag.Bool("e", false, "report all errors, not just the first 10")
- verbose = flag.Bool("v", false, "verbose mode")
- compiler = flag.String("c", defaultCompiler, "compiler used for installed packages (gc, gccgo, or source)")
-
- // additional output control
- printAST = flag.Bool("ast", false, "print AST (forces -seq)")
- printTrace = flag.Bool("trace", false, "print parse trace (forces -seq)")
- parseComments = flag.Bool("comments", false, "parse comments (ignored unless -ast or -trace is provided)")
-)
-
-var (
- fset = token.NewFileSet()
- errorCount = 0
- sequential = false
- parserMode parser.Mode
-)
-
-func initParserMode() {
- if *allErrors {
- parserMode |= parser.AllErrors
- }
- if *printAST {
- sequential = true
- }
- if *printTrace {
- parserMode |= parser.Trace
- sequential = true
- }
- if *parseComments && (*printAST || *printTrace) {
- parserMode |= parser.ParseComments
- }
-}
-
-const usageString = `usage: gotype [flags] [path ...]
-
-The gotype command, like the front-end of a Go compiler, parses and
-type-checks a single Go package. Errors are reported if the analysis
-fails; otherwise gotype is quiet (unless -v is set).
-
-Without a list of paths, gotype reads from standard input, which
-must provide a single Go source file defining a complete package.
-
-With a single directory argument, gotype checks the Go files in
-that directory, comprising a single package. Use -t to include the
-(in-package) _test.go files. Use -x to type check only external
-test files.
-
-Otherwise, each path must be the filename of a Go file belonging
-to the same package.
-
-Imports are processed by importing directly from the source of
-imported packages (default), or by importing from compiled and
-installed packages (by setting -c to the respective compiler).
-
-The -c flag must be set to a compiler ("gc", "gccgo") when type-
-checking packages containing imports with relative import paths
-(import "./mypkg") because the source importer cannot know which
-files to include for such packages.
-`
-
-func usage() {
- fmt.Fprintln(os.Stderr, usageString)
- flag.PrintDefaults()
- os.Exit(2)
-}
-
-func report(err error) {
- scanner.PrintError(os.Stderr, err)
- if list, ok := err.(scanner.ErrorList); ok {
- errorCount += len(list)
- return
- }
- errorCount++
-}
-
-// parse may be called concurrently
-func parse(filename string, src interface{}) (*ast.File, error) {
- if *verbose {
- fmt.Println(filename)
- }
- file, err := parser.ParseFile(fset, filename, src, parserMode) // ok to access fset concurrently
- if *printAST {
- ast.Print(fset, file)
- }
- return file, err
-}
-
-func parseStdin() (*ast.File, error) {
- src, err := ioutil.ReadAll(os.Stdin)
- if err != nil {
- return nil, err
- }
- return parse("", src)
-}
-
-func parseFiles(dir string, filenames []string) ([]*ast.File, error) {
- files := make([]*ast.File, len(filenames))
- errors := make([]error, len(filenames))
-
- var wg sync.WaitGroup
- for i, filename := range filenames {
- wg.Add(1)
- go func(i int, filepath string) {
- defer wg.Done()
- files[i], errors[i] = parse(filepath, nil)
- }(i, filepath.Join(dir, filename))
- if sequential {
- wg.Wait()
- }
- }
- wg.Wait()
-
- // if there are errors, return the first one for deterministic results
- for _, err := range errors {
- if err != nil {
- return nil, err
- }
- }
-
- return files, nil
-}
-
-func parseDir(dir string) ([]*ast.File, error) {
- ctxt := build.Default
- pkginfo, err := ctxt.ImportDir(dir, 0)
- if _, nogo := err.(*build.NoGoError); err != nil && !nogo {
- return nil, err
- }
-
- if *xtestFiles {
- return parseFiles(dir, pkginfo.XTestGoFiles)
- }
-
- filenames := append(pkginfo.GoFiles, pkginfo.CgoFiles...)
- if *testFiles {
- filenames = append(filenames, pkginfo.TestGoFiles...)
- }
- return parseFiles(dir, filenames)
-}
-
-func getPkgFiles(args []string) ([]*ast.File, error) {
- if len(args) == 0 {
- // stdin
- file, err := parseStdin()
- if err != nil {
- return nil, err
- }
- return []*ast.File{file}, nil
- }
-
- if len(args) == 1 {
- // possibly a directory
- path := args[0]
- info, err := os.Stat(path)
- if err != nil {
- return nil, err
- }
- if info.IsDir() {
- return parseDir(path)
- }
- }
-
- // list of files
- return parseFiles("", args)
-}
-
-func checkPkgFiles(files []*ast.File) {
- type bailout struct{}
-
- // if checkPkgFiles is called multiple times, set up conf only once
- conf := types.Config{
- FakeImportC: true,
- Error: func(err error) {
- if !*allErrors && errorCount >= 10 {
- panic(bailout{})
- }
- report(err)
- },
- Importer: importer.For(*compiler, nil),
- Sizes: SizesFor(build.Default.Compiler, build.Default.GOARCH),
- }
-
- defer func() {
- switch p := recover().(type) {
- case nil, bailout:
- // normal return or early exit
- default:
- // re-panic
- panic(p)
- }
- }()
-
- const path = "pkg" // any non-empty string will do for now
- conf.Check(path, fset, files, nil)
-}
-
-func printStats(d time.Duration) {
- fileCount := 0
- lineCount := 0
- fset.Iterate(func(f *token.File) bool {
- fileCount++
- lineCount += f.LineCount()
- return true
- })
-
- fmt.Printf(
- "%s (%d files, %d lines, %d lines/s)\n",
- d, fileCount, lineCount, int64(float64(lineCount)/d.Seconds()),
- )
-}
-
-func main() {
- flag.Usage = usage
- flag.Parse()
- initParserMode()
-
- start := time.Now()
-
- files, err := getPkgFiles(flag.Args())
- if err != nil {
- report(err)
- os.Exit(2)
- }
-
- checkPkgFiles(files)
- if errorCount > 0 {
- os.Exit(2)
- }
-
- if *verbose {
- printStats(time.Since(start))
- }
-}
diff --git a/vendor/golang.org/x/tools/cmd/gotype/sizesFor18.go b/vendor/golang.org/x/tools/cmd/gotype/sizesFor18.go
deleted file mode 100644
index 94e8176..0000000
--- a/vendor/golang.org/x/tools/cmd/gotype/sizesFor18.go
+++ /dev/null
@@ -1,40 +0,0 @@
-// Copyright 2017 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build !go1.9
-
-// This file contains a copy of the implementation of types.SizesFor
-// since this function is not available in go/types before Go 1.9.
-
-package main
-
-import "go/types"
-
-const defaultCompiler = "gc"
-
-var gcArchSizes = map[string]*types.StdSizes{
- "386": {4, 4},
- "arm": {4, 4},
- "arm64": {8, 8},
- "amd64": {8, 8},
- "amd64p32": {4, 8},
- "mips": {4, 4},
- "mipsle": {4, 4},
- "mips64": {8, 8},
- "mips64le": {8, 8},
- "ppc64": {8, 8},
- "ppc64le": {8, 8},
- "s390x": {8, 8},
-}
-
-func SizesFor(compiler, arch string) types.Sizes {
- if compiler != "gc" {
- return nil
- }
- s, ok := gcArchSizes[arch]
- if !ok {
- return nil
- }
- return s
-}
diff --git a/vendor/golang.org/x/tools/cmd/gotype/sizesFor19.go b/vendor/golang.org/x/tools/cmd/gotype/sizesFor19.go
deleted file mode 100644
index 9e0b481..0000000
--- a/vendor/golang.org/x/tools/cmd/gotype/sizesFor19.go
+++ /dev/null
@@ -1,15 +0,0 @@
-// Copyright 2017 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build go1.9
-
-package main
-
-import "go/types"
-
-const defaultCompiler = "source"
-
-func SizesFor(compiler, arch string) types.Sizes {
- return types.SizesFor(compiler, arch)
-}
diff --git a/vendor/golang.org/x/tools/cmd/goyacc/doc.go b/vendor/golang.org/x/tools/cmd/goyacc/doc.go
deleted file mode 100644
index 03ffee7..0000000
--- a/vendor/golang.org/x/tools/cmd/goyacc/doc.go
+++ /dev/null
@@ -1,70 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-/*
-
-Goyacc is a version of yacc for Go.
-It is written in Go and generates parsers written in Go.
-
-Usage:
-
- goyacc args...
-
-It is largely transliterated from the Inferno version written in Limbo
-which in turn was largely transliterated from the Plan 9 version
-written in C and documented at
-
- https://9p.io/magic/man2html/1/yacc
-
-Adepts of the original yacc will have no trouble adapting to this
-form of the tool.
-
-The directory $GOPATH/src/golang.org/x/tools/cmd/goyacc/testdata/expr
-is a yacc program for a very simple expression parser. See expr.y and
-main.go in that directory for examples of how to write and build
-goyacc programs.
-
-The generated parser is reentrant. The parsing function yyParse expects
-to be given an argument that conforms to the following interface:
-
- type yyLexer interface {
- Lex(lval *yySymType) int
- Error(e string)
- }
-
-Lex should return the token identifier, and place other token
-information in lval (which replaces the usual yylval).
-Error is equivalent to yyerror in the original yacc.
-
-Code inside the grammar actions may refer to the variable yylex,
-which holds the yyLexer passed to yyParse.
-
-Clients that need to understand more about the parser state can
-create the parser separately from invoking it. The function yyNewParser
-returns a yyParser conforming to the following interface:
-
- type yyParser interface {
- Parse(yyLex) int
- Lookahead() int
- }
-
-Parse runs the parser; the top-level call yyParse(yylex) is equivalent
-to yyNewParser().Parse(yylex).
-
-Lookahead can be called during grammar actions to read (but not consume)
-the value of the current lookahead token, as returned by yylex.Lex.
-If there is no current lookahead token (because the parser has not called Lex
-or has consumed the token returned by the most recent call to Lex),
-Lookahead returns -1. Calling Lookahead is equivalent to reading
-yychar from within in a grammar action.
-
-Multiple grammars compiled into a single program should be placed in
-distinct packages. If that is impossible, the "-p prefix" flag to
-goyacc sets the prefix, by default yy, that begins the names of
-symbols, including types, the parser, and the lexer, generated and
-referenced by yacc's generated code. Setting it to distinct values
-allows multiple grammars to be placed in a single package.
-
-*/
-package main
diff --git a/vendor/golang.org/x/tools/cmd/goyacc/testdata/expr/README b/vendor/golang.org/x/tools/cmd/goyacc/testdata/expr/README
deleted file mode 100644
index 302ef57..0000000
--- a/vendor/golang.org/x/tools/cmd/goyacc/testdata/expr/README
+++ /dev/null
@@ -1,20 +0,0 @@
-This directory contains a simple program demonstrating how to use
-the Go version of yacc.
-
-To build it:
-
- $ go generate
- $ go build
-
-or
-
- $ go generate
- $ go run expr.go
-
-The file main.go contains the "go generate" command to run yacc to
-create expr.go from expr.y. It also has the package doc comment,
-as godoc will not scan the .y file.
-
-The actual implementation is in expr.y.
-
-The program is not installed in the binary distributions of Go.
diff --git a/vendor/golang.org/x/tools/cmd/goyacc/testdata/expr/expr.y b/vendor/golang.org/x/tools/cmd/goyacc/testdata/expr/expr.y
deleted file mode 100644
index ba4a1b2..0000000
--- a/vendor/golang.org/x/tools/cmd/goyacc/testdata/expr/expr.y
+++ /dev/null
@@ -1,202 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// This is an example of a goyacc program.
-// To build it:
-// goyacc -p "expr" expr.y (produces y.go)
-// go build -o expr y.go
-// expr
-// >
-
-%{
-
-package main
-
-import (
- "bufio"
- "bytes"
- "fmt"
- "io"
- "log"
- "math/big"
- "os"
- "unicode/utf8"
-)
-
-%}
-
-%union {
- num *big.Rat
-}
-
-%type expr expr1 expr2 expr3
-
-%token '+' '-' '*' '/' '(' ')'
-
-%token NUM
-
-%%
-
-top:
- expr
- {
- if $1.IsInt() {
- fmt.Println($1.Num().String())
- } else {
- fmt.Println($1.String())
- }
- }
-
-expr:
- expr1
-| '+' expr
- {
- $$ = $2
- }
-| '-' expr
- {
- $$ = $2.Neg($2)
- }
-
-expr1:
- expr2
-| expr1 '+' expr2
- {
- $$ = $1.Add($1, $3)
- }
-| expr1 '-' expr2
- {
- $$ = $1.Sub($1, $3)
- }
-
-expr2:
- expr3
-| expr2 '*' expr3
- {
- $$ = $1.Mul($1, $3)
- }
-| expr2 '/' expr3
- {
- $$ = $1.Quo($1, $3)
- }
-
-expr3:
- NUM
-| '(' expr ')'
- {
- $$ = $2
- }
-
-
-%%
-
-// The parser expects the lexer to return 0 on EOF. Give it a name
-// for clarity.
-const eof = 0
-
-// The parser uses the type Lex as a lexer. It must provide
-// the methods Lex(*SymType) int and Error(string).
-type exprLex struct {
- line []byte
- peek rune
-}
-
-// The parser calls this method to get each new token. This
-// implementation returns operators and NUM.
-func (x *exprLex) Lex(yylval *exprSymType) int {
- for {
- c := x.next()
- switch c {
- case eof:
- return eof
- case '0', '1', '2', '3', '4', '5', '6', '7', '8', '9':
- return x.num(c, yylval)
- case '+', '-', '*', '/', '(', ')':
- return int(c)
-
- // Recognize Unicode multiplication and division
- // symbols, returning what the parser expects.
- case '×':
- return '*'
- case '÷':
- return '/'
-
- case ' ', '\t', '\n', '\r':
- default:
- log.Printf("unrecognized character %q", c)
- }
- }
-}
-
-// Lex a number.
-func (x *exprLex) num(c rune, yylval *exprSymType) int {
- add := func(b *bytes.Buffer, c rune) {
- if _, err := b.WriteRune(c); err != nil {
- log.Fatalf("WriteRune: %s", err)
- }
- }
- var b bytes.Buffer
- add(&b, c)
- L: for {
- c = x.next()
- switch c {
- case '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '.', 'e', 'E':
- add(&b, c)
- default:
- break L
- }
- }
- if c != eof {
- x.peek = c
- }
- yylval.num = &big.Rat{}
- _, ok := yylval.num.SetString(b.String())
- if !ok {
- log.Printf("bad number %q", b.String())
- return eof
- }
- return NUM
-}
-
-// Return the next rune for the lexer.
-func (x *exprLex) next() rune {
- if x.peek != eof {
- r := x.peek
- x.peek = eof
- return r
- }
- if len(x.line) == 0 {
- return eof
- }
- c, size := utf8.DecodeRune(x.line)
- x.line = x.line[size:]
- if c == utf8.RuneError && size == 1 {
- log.Print("invalid utf8")
- return x.next()
- }
- return c
-}
-
-// The parser calls this method on a parse error.
-func (x *exprLex) Error(s string) {
- log.Printf("parse error: %s", s)
-}
-
-func main() {
- in := bufio.NewReader(os.Stdin)
- for {
- if _, err := os.Stdout.WriteString("> "); err != nil {
- log.Fatalf("WriteString: %s", err)
- }
- line, err := in.ReadBytes('\n')
- if err == io.EOF {
- return
- }
- if err != nil {
- log.Fatalf("ReadBytes: %s", err)
- }
-
- exprParse(&exprLex{line: line})
- }
-}
diff --git a/vendor/golang.org/x/tools/cmd/goyacc/testdata/expr/main.go b/vendor/golang.org/x/tools/cmd/goyacc/testdata/expr/main.go
deleted file mode 100644
index 22e3543..0000000
--- a/vendor/golang.org/x/tools/cmd/goyacc/testdata/expr/main.go
+++ /dev/null
@@ -1,14 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// This file holds the go generate command to run yacc on the grammar in expr.y.
-// To build expr:
-// % go generate
-// % go build
-
-//go:generate goyacc -o expr.go -p "expr" expr.y
-
-// Expr is a simple expression evaluator that serves as a working example of
-// how to use Go's yacc implementation.
-package main
diff --git a/vendor/golang.org/x/tools/cmd/goyacc/yacc.go b/vendor/golang.org/x/tools/cmd/goyacc/yacc.go
deleted file mode 100644
index 062bc47..0000000
--- a/vendor/golang.org/x/tools/cmd/goyacc/yacc.go
+++ /dev/null
@@ -1,3591 +0,0 @@
-/*
-Derived from Inferno's utils/iyacc/yacc.c
-http://code.google.com/p/inferno-os/source/browse/utils/iyacc/yacc.c
-
-This copyright NOTICE applies to all files in this directory and
-subdirectories, unless another copyright notice appears in a given
-file or subdirectory. If you take substantial code from this software to use in
-other programs, you must somehow include with it an appropriate
-copyright notice that includes the copyright notice and the other
-notices below. It is fine (and often tidier) to do that in a separate
-file such as NOTICE, LICENCE or COPYING.
-
- Copyright © 1994-1999 Lucent Technologies Inc. All rights reserved.
- Portions Copyright © 1995-1997 C H Forsyth (forsyth@terzarima.net)
- Portions Copyright © 1997-1999 Vita Nuova Limited
- Portions Copyright © 2000-2007 Vita Nuova Holdings Limited (www.vitanuova.com)
- Portions Copyright © 2004,2006 Bruce Ellis
- Portions Copyright © 2005-2007 C H Forsyth (forsyth@terzarima.net)
- Revisions Copyright © 2000-2007 Lucent Technologies Inc. and others
- Portions Copyright © 2009 The Go Authors. All rights reserved.
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-*/
-
-package main
-
-// yacc
-// major difference is lack of stem ("y" variable)
-//
-
-import (
- "bufio"
- "bytes"
- "flag"
- "fmt"
- "go/format"
- "io/ioutil"
- "os"
- "strconv"
- "strings"
- "unicode"
-)
-
-// the following are adjustable
-// according to memory size
-const (
- ACTSIZE = 120000
- NSTATES = 8000
- TEMPSIZE = 8000
-
- SYMINC = 50 // increase for non-term or term
- RULEINC = 50 // increase for max rule length prodptr[i]
- PRODINC = 100 // increase for productions prodptr
- WSETINC = 50 // increase for working sets wsets
- STATEINC = 200 // increase for states statemem
-
- PRIVATE = 0xE000 // unicode private use
-
- // relationships which must hold:
- // TEMPSIZE >= NTERMS + NNONTERM + 1;
- // TEMPSIZE >= NSTATES;
- //
-
- NTBASE = 010000
- ERRCODE = 8190
- ACCEPTCODE = 8191
- YYLEXUNK = 3
- TOKSTART = 4 //index of first defined token
-)
-
-// no, left, right, binary assoc.
-const (
- NOASC = iota
- LASC
- RASC
- BASC
-)
-
-// flags for state generation
-const (
- DONE = iota
- MUSTDO
- MUSTLOOKAHEAD
-)
-
-// flags for a rule having an action, and being reduced
-const (
- ACTFLAG = 1 << (iota + 2)
- REDFLAG
-)
-
-// output parser flags
-const yyFlag = -1000
-
-// parse tokens
-const (
- IDENTIFIER = PRIVATE + iota
- MARK
- TERM
- LEFT
- RIGHT
- BINARY
- PREC
- LCURLY
- IDENTCOLON
- NUMBER
- START
- TYPEDEF
- TYPENAME
- UNION
- ERROR
-)
-
-const ENDFILE = 0
-const EMPTY = 1
-const WHOKNOWS = 0
-const OK = 1
-const NOMORE = -1000
-
-// macros for getting associativity and precedence levels
-func ASSOC(i int) int { return i & 3 }
-
-func PLEVEL(i int) int { return (i >> 4) & 077 }
-
-func TYPE(i int) int { return (i >> 10) & 077 }
-
-// macros for setting associativity and precedence levels
-func SETASC(i, j int) int { return i | j }
-
-func SETPLEV(i, j int) int { return i | (j << 4) }
-
-func SETTYPE(i, j int) int { return i | (j << 10) }
-
-// I/O descriptors
-var finput *bufio.Reader // input file
-var stderr *bufio.Writer
-var ftable *bufio.Writer // y.go file
-var fcode = &bytes.Buffer{} // saved code
-var foutput *bufio.Writer // y.output file
-
-var fmtImported bool // output file has recorded an import of "fmt"
-
-var oflag string // -o [y.go] - y.go file
-var vflag string // -v [y.output] - y.output file
-var lflag bool // -l - disable line directives
-var prefix string // name prefix for identifiers, default yy
-
-func init() {
- flag.StringVar(&oflag, "o", "y.go", "parser output")
- flag.StringVar(&prefix, "p", "yy", "name prefix to use in generated code")
- flag.StringVar(&vflag, "v", "y.output", "create parsing tables")
- flag.BoolVar(&lflag, "l", false, "disable line directives")
-}
-
-var initialstacksize = 16
-
-// communication variables between various I/O routines
-var infile string // input file name
-var numbval int // value of an input number
-var tokname string // input token name, slop for runes and 0
-var tokflag = false
-
-// structure declarations
-type Lkset []int
-
-type Pitem struct {
- prod []int
- off int // offset within the production
- first int // first term or non-term in item
- prodno int // production number for sorting
-}
-
-type Item struct {
- pitem Pitem
- look Lkset
-}
-
-type Symb struct {
- name string
- noconst bool
- value int
-}
-
-type Wset struct {
- pitem Pitem
- flag int
- ws Lkset
-}
-
-// storage of types
-var ntypes int // number of types defined
-var typeset = make(map[int]string) // pointers to type tags
-
-// token information
-
-var ntokens = 0 // number of tokens
-var tokset []Symb
-var toklev []int // vector with the precedence of the terminals
-
-// nonterminal information
-
-var nnonter = -1 // the number of nonterminals
-var nontrst []Symb
-var start int // start symbol
-
-// state information
-
-var nstate = 0 // number of states
-var pstate = make([]int, NSTATES+2) // index into statemem to the descriptions of the states
-var statemem []Item
-var tystate = make([]int, NSTATES) // contains type information about the states
-var tstates []int // states generated by terminal gotos
-var ntstates []int // states generated by nonterminal gotos
-var mstates = make([]int, NSTATES) // chain of overflows of term/nonterm generation lists
-var lastred int // number of last reduction of a state
-var defact = make([]int, NSTATES) // default actions of states
-
-// lookahead set information
-
-var nolook = 0 // flag to turn off lookahead computations
-var tbitset = 0 // size of lookahead sets
-var clset Lkset // temporary storage for lookahead computations
-
-// working set information
-
-var wsets []Wset
-var cwp int
-
-// storage for action table
-
-var amem []int // action table storage
-var memp int // next free action table position
-var indgo = make([]int, NSTATES) // index to the stored goto table
-
-// temporary vector, indexable by states, terms, or ntokens
-
-var temp1 = make([]int, TEMPSIZE) // temporary storage, indexed by terms + ntokens or states
-var lineno = 1 // current input line number
-var fatfl = 1 // if on, error is fatal
-var nerrors = 0 // number of errors
-
-// assigned token type values
-
-var extval = 0
-
-// grammar rule information
-
-var nprod = 1 // number of productions
-var prdptr [][]int // pointers to descriptions of productions
-var levprd []int // precedence levels for the productions
-var rlines []int // line number for this rule
-
-// statistics collection variables
-
-var zzgoent = 0
-var zzgobest = 0
-var zzacent = 0
-var zzexcp = 0
-var zzclose = 0
-var zzrrconf = 0
-var zzsrconf = 0
-var zzstate = 0
-
-// optimizer arrays
-
-var yypgo [][]int
-var optst [][]int
-var ggreed []int
-var pgo []int
-
-var maxspr int // maximum spread of any entry
-var maxoff int // maximum offset into a array
-var maxa int
-
-// storage for information about the nonterminals
-
-var pres [][][]int // vector of pointers to productions yielding each nonterminal
-var pfirst []Lkset
-var pempty []int // vector of nonterminals nontrivially deriving e
-
-// random stuff picked out from between functions
-
-var indebug = 0 // debugging flag for cpfir
-var pidebug = 0 // debugging flag for putitem
-var gsdebug = 0 // debugging flag for stagen
-var cldebug = 0 // debugging flag for closure
-var pkdebug = 0 // debugging flag for apack
-var g2debug = 0 // debugging for go2gen
-var adb = 0 // debugging for callopt
-
-type Resrv struct {
- name string
- value int
-}
-
-var resrv = []Resrv{
- {"binary", BINARY},
- {"left", LEFT},
- {"nonassoc", BINARY},
- {"prec", PREC},
- {"right", RIGHT},
- {"start", START},
- {"term", TERM},
- {"token", TERM},
- {"type", TYPEDEF},
- {"union", UNION},
- {"struct", UNION},
- {"error", ERROR},
-}
-
-type Error struct {
- lineno int
- tokens []string
- msg string
-}
-
-var errors []Error
-
-type Row struct {
- actions []int
- defaultAction int
-}
-
-var stateTable []Row
-
-var zznewstate = 0
-
-const EOF = -1
-
-func main() {
-
- setup() // initialize and read productions
-
- tbitset = (ntokens + 32) / 32
- cpres() // make table of which productions yield a given nonterminal
- cempty() // make a table of which nonterminals can match the empty string
- cpfir() // make a table of firsts of nonterminals
-
- stagen() // generate the states
-
- yypgo = make([][]int, nnonter+1)
- optst = make([][]int, nstate)
- output() // write the states and the tables
- go2out()
-
- hideprod()
- summary()
-
- callopt()
-
- others()
-
- exit(0)
-}
-
-func setup() {
- var j, ty int
-
- stderr = bufio.NewWriter(os.Stderr)
- foutput = nil
-
- flag.Parse()
- if flag.NArg() != 1 {
- usage()
- }
- if initialstacksize < 1 {
- // never set so cannot happen
- fmt.Fprintf(stderr, "yacc: stack size too small\n")
- usage()
- }
- yaccpar = strings.Replace(yaccpartext, "$$", prefix, -1)
- openup()
-
- defin(0, "$end")
- extval = PRIVATE // tokens start in unicode 'private use'
- defin(0, "error")
- defin(1, "$accept")
- defin(0, "$unk")
- i := 0
-
- t := gettok()
-
-outer:
- for {
- switch t {
- default:
- errorf("syntax error tok=%v", t-PRIVATE)
-
- case MARK, ENDFILE:
- break outer
-
- case ';':
- // Do nothing.
-
- case START:
- t = gettok()
- if t != IDENTIFIER {
- errorf("bad %%start construction")
- }
- start = chfind(1, tokname)
-
- case ERROR:
- lno := lineno
- var tokens []string
- for {
- t := gettok()
- if t == ':' {
- break
- }
- if t != IDENTIFIER && t != IDENTCOLON {
- errorf("bad syntax in %%error")
- }
- tokens = append(tokens, tokname)
- if t == IDENTCOLON {
- break
- }
- }
- if gettok() != IDENTIFIER {
- errorf("bad syntax in %%error")
- }
- errors = append(errors, Error{lno, tokens, tokname})
-
- case TYPEDEF:
- t = gettok()
- if t != TYPENAME {
- errorf("bad syntax in %%type")
- }
- ty = numbval
- for {
- t = gettok()
- switch t {
- case IDENTIFIER:
- t = chfind(1, tokname)
- if t < NTBASE {
- j = TYPE(toklev[t])
- if j != 0 && j != ty {
- errorf("type redeclaration of token %s",
- tokset[t].name)
- } else {
- toklev[t] = SETTYPE(toklev[t], ty)
- }
- } else {
- j = nontrst[t-NTBASE].value
- if j != 0 && j != ty {
- errorf("type redeclaration of nonterminal %v",
- nontrst[t-NTBASE].name)
- } else {
- nontrst[t-NTBASE].value = ty
- }
- }
- continue
-
- case ',':
- continue
- }
- break
- }
- continue
-
- case UNION:
- cpyunion()
-
- case LEFT, BINARY, RIGHT, TERM:
- // nonzero means new prec. and assoc.
- lev := t - TERM
- if lev != 0 {
- i++
- }
- ty = 0
-
- // get identifiers so defined
- t = gettok()
-
- // there is a type defined
- if t == TYPENAME {
- ty = numbval
- t = gettok()
- }
- for {
- switch t {
- case ',':
- t = gettok()
- continue
-
- case ';':
- // Do nothing.
-
- case IDENTIFIER:
- j = chfind(0, tokname)
- if j >= NTBASE {
- errorf("%v defined earlier as nonterminal", tokname)
- }
- if lev != 0 {
- if ASSOC(toklev[j]) != 0 {
- errorf("redeclaration of precedence of %v", tokname)
- }
- toklev[j] = SETASC(toklev[j], lev)
- toklev[j] = SETPLEV(toklev[j], i)
- }
- if ty != 0 {
- if TYPE(toklev[j]) != 0 {
- errorf("redeclaration of type of %v", tokname)
- }
- toklev[j] = SETTYPE(toklev[j], ty)
- }
- t = gettok()
- if t == NUMBER {
- tokset[j].value = numbval
- t = gettok()
- }
-
- continue
- }
- break
- }
- continue
-
- case LCURLY:
- cpycode()
- }
- t = gettok()
- }
-
- if t == ENDFILE {
- errorf("unexpected EOF before %%")
- }
-
- fmt.Fprintf(fcode, "switch %snt {\n", prefix)
-
- moreprod()
- prdptr[0] = []int{NTBASE, start, 1, 0}
-
- nprod = 1
- curprod := make([]int, RULEINC)
- t = gettok()
- if t != IDENTCOLON {
- errorf("bad syntax on first rule")
- }
-
- if start == 0 {
- prdptr[0][1] = chfind(1, tokname)
- }
-
- // read rules
- // put into prdptr array in the format
- // target
- // followed by id's of terminals and non-terminals
- // followed by -nprod
-
- for t != MARK && t != ENDFILE {
- mem := 0
-
- // process a rule
- rlines[nprod] = lineno
- ruleline := lineno
- if t == '|' {
- curprod[mem] = prdptr[nprod-1][0]
- mem++
- } else if t == IDENTCOLON {
- curprod[mem] = chfind(1, tokname)
- if curprod[mem] < NTBASE {
- lerrorf(ruleline, "token illegal on LHS of grammar rule")
- }
- mem++
- } else {
- lerrorf(ruleline, "illegal rule: missing semicolon or | ?")
- }
-
- // read rule body
- t = gettok()
- for {
- for t == IDENTIFIER {
- curprod[mem] = chfind(1, tokname)
- if curprod[mem] < NTBASE {
- levprd[nprod] = toklev[curprod[mem]]
- }
- mem++
- if mem >= len(curprod) {
- ncurprod := make([]int, mem+RULEINC)
- copy(ncurprod, curprod)
- curprod = ncurprod
- }
- t = gettok()
- }
- if t == PREC {
- if gettok() != IDENTIFIER {
- lerrorf(ruleline, "illegal %%prec syntax")
- }
- j = chfind(2, tokname)
- if j >= NTBASE {
- lerrorf(ruleline, "nonterminal "+nontrst[j-NTBASE].name+" illegal after %%prec")
- }
- levprd[nprod] = toklev[j]
- t = gettok()
- }
- if t != '=' {
- break
- }
- levprd[nprod] |= ACTFLAG
- fmt.Fprintf(fcode, "\n\tcase %v:", nprod)
- fmt.Fprintf(fcode, "\n\t\t%sDollar = %sS[%spt-%v:%spt+1]", prefix, prefix, prefix, mem-1, prefix)
- cpyact(curprod, mem)
-
- // action within rule...
- t = gettok()
- if t == IDENTIFIER {
- // make it a nonterminal
- j = chfind(1, fmt.Sprintf("$$%v", nprod))
-
- //
- // the current rule will become rule number nprod+1
- // enter null production for action
- //
- prdptr[nprod] = make([]int, 2)
- prdptr[nprod][0] = j
- prdptr[nprod][1] = -nprod
-
- // update the production information
- nprod++
- moreprod()
- levprd[nprod] = levprd[nprod-1] & ^ACTFLAG
- levprd[nprod-1] = ACTFLAG
- rlines[nprod] = lineno
-
- // make the action appear in the original rule
- curprod[mem] = j
- mem++
- if mem >= len(curprod) {
- ncurprod := make([]int, mem+RULEINC)
- copy(ncurprod, curprod)
- curprod = ncurprod
- }
- }
- }
-
- for t == ';' {
- t = gettok()
- }
- curprod[mem] = -nprod
- mem++
-
- // check that default action is reasonable
- if ntypes != 0 && (levprd[nprod]&ACTFLAG) == 0 &&
- nontrst[curprod[0]-NTBASE].value != 0 {
- // no explicit action, LHS has value
- tempty := curprod[1]
- if tempty < 0 {
- lerrorf(ruleline, "must return a value, since LHS has a type")
- }
- if tempty >= NTBASE {
- tempty = nontrst[tempty-NTBASE].value
- } else {
- tempty = TYPE(toklev[tempty])
- }
- if tempty != nontrst[curprod[0]-NTBASE].value {
- lerrorf(ruleline, "default action causes potential type clash")
- }
- }
- moreprod()
- prdptr[nprod] = make([]int, mem)
- copy(prdptr[nprod], curprod)
- nprod++
- moreprod()
- levprd[nprod] = 0
- }
-
- if TEMPSIZE < ntokens+nnonter+1 {
- errorf("too many tokens (%d) or non-terminals (%d)", ntokens, nnonter)
- }
-
- //
- // end of all rules
- // dump out the prefix code
- //
-
- fmt.Fprintf(fcode, "\n\t}")
-
- // put out non-literal terminals
- for i := TOKSTART; i <= ntokens; i++ {
- // non-literals
- if !tokset[i].noconst {
- fmt.Fprintf(ftable, "const %v = %v\n", tokset[i].name, tokset[i].value)
- }
- }
-
- // put out names of tokens
- ftable.WriteRune('\n')
- fmt.Fprintf(ftable, "var %sToknames = [...]string{\n", prefix)
- for i := 1; i <= ntokens; i++ {
- fmt.Fprintf(ftable, "\t%q,\n", tokset[i].name)
- }
- fmt.Fprintf(ftable, "}\n")
-
- // put out names of states.
- // commented out to avoid a huge table just for debugging.
- // re-enable to have the names in the binary.
- fmt.Fprintf(ftable, "var %sStatenames = [...]string{", prefix)
- // for i:=TOKSTART; i<=ntokens; i++ {
- // fmt.Fprintf(ftable, "\t%q,\n", tokset[i].name);
- // }
- fmt.Fprintf(ftable, "}\n")
-
- ftable.WriteRune('\n')
- fmt.Fprintf(ftable, "const %sEofCode = 1\n", prefix)
- fmt.Fprintf(ftable, "const %sErrCode = 2\n", prefix)
- fmt.Fprintf(ftable, "const %sInitialStackSize = %v\n", prefix, initialstacksize)
-
- //
- // copy any postfix code
- //
- if t == MARK {
- if !lflag {
- fmt.Fprintf(ftable, "\n//line %v:%v\n", infile, lineno)
- }
- for {
- c := getrune(finput)
- if c == EOF {
- break
- }
- ftable.WriteRune(c)
- }
- }
-}
-
-//
-// allocate enough room to hold another production
-//
-func moreprod() {
- n := len(prdptr)
- if nprod >= n {
- nn := n + PRODINC
- aprod := make([][]int, nn)
- alevprd := make([]int, nn)
- arlines := make([]int, nn)
-
- copy(aprod, prdptr)
- copy(alevprd, levprd)
- copy(arlines, rlines)
-
- prdptr = aprod
- levprd = alevprd
- rlines = arlines
- }
-}
-
-//
-// define s to be a terminal if nt==0
-// or a nonterminal if nt==1
-//
-func defin(nt int, s string) int {
- val := 0
- if nt != 0 {
- nnonter++
- if nnonter >= len(nontrst) {
- anontrst := make([]Symb, nnonter+SYMINC)
- copy(anontrst, nontrst)
- nontrst = anontrst
- }
- nontrst[nnonter] = Symb{name: s}
- return NTBASE + nnonter
- }
-
- // must be a token
- ntokens++
- if ntokens >= len(tokset) {
- nn := ntokens + SYMINC
- atokset := make([]Symb, nn)
- atoklev := make([]int, nn)
-
- copy(atoklev, toklev)
- copy(atokset, tokset)
-
- tokset = atokset
- toklev = atoklev
- }
- tokset[ntokens].name = s
- toklev[ntokens] = 0
-
- // establish value for token
- // single character literal
- if s[0] == '\'' || s[0] == '"' {
- q, err := strconv.Unquote(s)
- if err != nil {
- errorf("invalid token: %s", err)
- }
- rq := []rune(q)
- if len(rq) != 1 {
- errorf("character token too long: %s", s)
- }
- val = int(rq[0])
- if val == 0 {
- errorf("token value 0 is illegal")
- }
- tokset[ntokens].noconst = true
- } else {
- val = extval
- extval++
- if s[0] == '$' {
- tokset[ntokens].noconst = true
- }
- }
-
- tokset[ntokens].value = val
- return ntokens
-}
-
-var peekline = 0
-
-func gettok() int {
- var i int
- var match, c rune
-
- tokname = ""
- for {
- lineno += peekline
- peekline = 0
- c = getrune(finput)
- for c == ' ' || c == '\n' || c == '\t' || c == '\v' || c == '\r' {
- if c == '\n' {
- lineno++
- }
- c = getrune(finput)
- }
-
- // skip comment -- fix
- if c != '/' {
- break
- }
- lineno += skipcom()
- }
-
- switch c {
- case EOF:
- if tokflag {
- fmt.Printf(">>> ENDFILE %v\n", lineno)
- }
- return ENDFILE
-
- case '{':
- ungetrune(finput, c)
- if tokflag {
- fmt.Printf(">>> ={ %v\n", lineno)
- }
- return '='
-
- case '<':
- // get, and look up, a type name (union member name)
- c = getrune(finput)
- for c != '>' && c != EOF && c != '\n' {
- tokname += string(c)
- c = getrune(finput)
- }
-
- if c != '>' {
- errorf("unterminated < ... > clause")
- }
-
- for i = 1; i <= ntypes; i++ {
- if typeset[i] == tokname {
- numbval = i
- if tokflag {
- fmt.Printf(">>> TYPENAME old <%v> %v\n", tokname, lineno)
- }
- return TYPENAME
- }
- }
- ntypes++
- numbval = ntypes
- typeset[numbval] = tokname
- if tokflag {
- fmt.Printf(">>> TYPENAME new <%v> %v\n", tokname, lineno)
- }
- return TYPENAME
-
- case '"', '\'':
- match = c
- tokname = string(c)
- for {
- c = getrune(finput)
- if c == '\n' || c == EOF {
- errorf("illegal or missing ' or \"")
- }
- if c == '\\' {
- tokname += string('\\')
- c = getrune(finput)
- } else if c == match {
- if tokflag {
- fmt.Printf(">>> IDENTIFIER \"%v\" %v\n", tokname, lineno)
- }
- tokname += string(c)
- return IDENTIFIER
- }
- tokname += string(c)
- }
-
- case '%':
- c = getrune(finput)
- switch c {
- case '%':
- if tokflag {
- fmt.Printf(">>> MARK %%%% %v\n", lineno)
- }
- return MARK
- case '=':
- if tokflag {
- fmt.Printf(">>> PREC %%= %v\n", lineno)
- }
- return PREC
- case '{':
- if tokflag {
- fmt.Printf(">>> LCURLY %%{ %v\n", lineno)
- }
- return LCURLY
- }
-
- getword(c)
- // find a reserved word
- for i := range resrv {
- if tokname == resrv[i].name {
- if tokflag {
- fmt.Printf(">>> %%%v %v %v\n", tokname,
- resrv[i].value-PRIVATE, lineno)
- }
- return resrv[i].value
- }
- }
- errorf("invalid escape, or illegal reserved word: %v", tokname)
-
- case '0', '1', '2', '3', '4', '5', '6', '7', '8', '9':
- numbval = int(c - '0')
- for {
- c = getrune(finput)
- if !isdigit(c) {
- break
- }
- numbval = numbval*10 + int(c-'0')
- }
- ungetrune(finput, c)
- if tokflag {
- fmt.Printf(">>> NUMBER %v %v\n", numbval, lineno)
- }
- return NUMBER
-
- default:
- if isword(c) || c == '.' || c == '$' {
- getword(c)
- break
- }
- if tokflag {
- fmt.Printf(">>> OPERATOR %v %v\n", string(c), lineno)
- }
- return int(c)
- }
-
- // look ahead to distinguish IDENTIFIER from IDENTCOLON
- c = getrune(finput)
- for c == ' ' || c == '\t' || c == '\n' || c == '\v' || c == '\r' || c == '/' {
- if c == '\n' {
- peekline++
- }
- // look for comments
- if c == '/' {
- peekline += skipcom()
- }
- c = getrune(finput)
- }
- if c == ':' {
- if tokflag {
- fmt.Printf(">>> IDENTCOLON %v: %v\n", tokname, lineno)
- }
- return IDENTCOLON
- }
-
- ungetrune(finput, c)
- if tokflag {
- fmt.Printf(">>> IDENTIFIER %v %v\n", tokname, lineno)
- }
- return IDENTIFIER
-}
-
-func getword(c rune) {
- tokname = ""
- for isword(c) || isdigit(c) || c == '.' || c == '$' {
- tokname += string(c)
- c = getrune(finput)
- }
- ungetrune(finput, c)
-}
-
-//
-// determine the type of a symbol
-//
-func fdtype(t int) int {
- var v int
- var s string
-
- if t >= NTBASE {
- v = nontrst[t-NTBASE].value
- s = nontrst[t-NTBASE].name
- } else {
- v = TYPE(toklev[t])
- s = tokset[t].name
- }
- if v <= 0 {
- errorf("must specify type for %v", s)
- }
- return v
-}
-
-func chfind(t int, s string) int {
- if s[0] == '"' || s[0] == '\'' {
- t = 0
- }
- for i := 0; i <= ntokens; i++ {
- if s == tokset[i].name {
- return i
- }
- }
- for i := 0; i <= nnonter; i++ {
- if s == nontrst[i].name {
- return NTBASE + i
- }
- }
-
- // cannot find name
- if t > 1 {
- errorf("%v should have been defined earlier", s)
- }
- return defin(t, s)
-}
-
-//
-// copy the union declaration to the output, and the define file if present
-//
-func cpyunion() {
-
- if !lflag {
- fmt.Fprintf(ftable, "\n//line %v:%v\n", infile, lineno)
- }
- fmt.Fprintf(ftable, "type %sSymType struct", prefix)
-
- level := 0
-
-out:
- for {
- c := getrune(finput)
- if c == EOF {
- errorf("EOF encountered while processing %%union")
- }
- ftable.WriteRune(c)
- switch c {
- case '\n':
- lineno++
- case '{':
- if level == 0 {
- fmt.Fprintf(ftable, "\n\tyys int")
- }
- level++
- case '}':
- level--
- if level == 0 {
- break out
- }
- }
- }
- fmt.Fprintf(ftable, "\n\n")
-}
-
-//
-// saves code between %{ and %}
-// adds an import for __fmt__ the first time
-//
-func cpycode() {
- lno := lineno
-
- c := getrune(finput)
- if c == '\n' {
- c = getrune(finput)
- lineno++
- }
- if !lflag {
- fmt.Fprintf(ftable, "\n//line %v:%v\n", infile, lineno)
- }
- // accumulate until %}
- code := make([]rune, 0, 1024)
- for c != EOF {
- if c == '%' {
- c = getrune(finput)
- if c == '}' {
- emitcode(code, lno+1)
- return
- }
- code = append(code, '%')
- }
- code = append(code, c)
- if c == '\n' {
- lineno++
- }
- c = getrune(finput)
- }
- lineno = lno
- errorf("eof before %%}")
-}
-
-//
-// emits code saved up from between %{ and %}
-// called by cpycode
-// adds an import for __yyfmt__ after the package clause
-//
-func emitcode(code []rune, lineno int) {
- for i, line := range lines(code) {
- writecode(line)
- if !fmtImported && isPackageClause(line) {
- fmt.Fprintln(ftable, `import __yyfmt__ "fmt"`)
- if !lflag {
- fmt.Fprintf(ftable, "//line %v:%v\n\t\t", infile, lineno+i)
- }
- fmtImported = true
- }
- }
-}
-
-//
-// does this line look like a package clause? not perfect: might be confused by early comments.
-//
-func isPackageClause(line []rune) bool {
- line = skipspace(line)
-
- // must be big enough.
- if len(line) < len("package X\n") {
- return false
- }
-
- // must start with "package"
- for i, r := range []rune("package") {
- if line[i] != r {
- return false
- }
- }
- line = skipspace(line[len("package"):])
-
- // must have another identifier.
- if len(line) == 0 || (!unicode.IsLetter(line[0]) && line[0] != '_') {
- return false
- }
- for len(line) > 0 {
- if !unicode.IsLetter(line[0]) && !unicode.IsDigit(line[0]) && line[0] != '_' {
- break
- }
- line = line[1:]
- }
- line = skipspace(line)
-
- // eol, newline, or comment must follow
- if len(line) == 0 {
- return true
- }
- if line[0] == '\r' || line[0] == '\n' {
- return true
- }
- if len(line) >= 2 {
- return line[0] == '/' && (line[1] == '/' || line[1] == '*')
- }
- return false
-}
-
-//
-// skip initial spaces
-//
-func skipspace(line []rune) []rune {
- for len(line) > 0 {
- if line[0] != ' ' && line[0] != '\t' {
- break
- }
- line = line[1:]
- }
- return line
-}
-
-//
-// break code into lines
-//
-func lines(code []rune) [][]rune {
- l := make([][]rune, 0, 100)
- for len(code) > 0 {
- // one line per loop
- var i int
- for i = range code {
- if code[i] == '\n' {
- break
- }
- }
- l = append(l, code[:i+1])
- code = code[i+1:]
- }
- return l
-}
-
-//
-// writes code to ftable
-//
-func writecode(code []rune) {
- for _, r := range code {
- ftable.WriteRune(r)
- }
-}
-
-//
-// skip over comments
-// skipcom is called after reading a '/'
-//
-func skipcom() int {
- c := getrune(finput)
- if c == '/' {
- for c != EOF {
- if c == '\n' {
- return 1
- }
- c = getrune(finput)
- }
- errorf("EOF inside comment")
- return 0
- }
- if c != '*' {
- errorf("illegal comment")
- }
-
- nl := 0 // lines skipped
- c = getrune(finput)
-
-l1:
- switch c {
- case '*':
- c = getrune(finput)
- if c == '/' {
- break
- }
- goto l1
-
- case '\n':
- nl++
- fallthrough
-
- default:
- c = getrune(finput)
- goto l1
- }
- return nl
-}
-
-//
-// copy action to the next ; or closing }
-//
-func cpyact(curprod []int, max int) {
-
- if !lflag {
- fmt.Fprintf(fcode, "\n\t\t//line %v:%v", infile, lineno)
- }
- fmt.Fprint(fcode, "\n\t\t")
-
- lno := lineno
- brac := 0
-
-loop:
- for {
- c := getrune(finput)
-
- swt:
- switch c {
- case ';':
- if brac == 0 {
- fcode.WriteRune(c)
- return
- }
-
- case '{':
- brac++
-
- case '$':
- s := 1
- tok := -1
- c = getrune(finput)
-
- // type description
- if c == '<' {
- ungetrune(finput, c)
- if gettok() != TYPENAME {
- errorf("bad syntax on $ clause")
- }
- tok = numbval
- c = getrune(finput)
- }
- if c == '$' {
- fmt.Fprintf(fcode, "%sVAL", prefix)
-
- // put out the proper tag...
- if ntypes != 0 {
- if tok < 0 {
- tok = fdtype(curprod[0])
- }
- fmt.Fprintf(fcode, ".%v", typeset[tok])
- }
- continue loop
- }
- if c == '-' {
- s = -s
- c = getrune(finput)
- }
- j := 0
- if isdigit(c) {
- for isdigit(c) {
- j = j*10 + int(c-'0')
- c = getrune(finput)
- }
- ungetrune(finput, c)
- j = j * s
- if j >= max {
- errorf("Illegal use of $%v", j)
- }
- } else if isword(c) || c == '.' {
- // look for $name
- ungetrune(finput, c)
- if gettok() != IDENTIFIER {
- errorf("$ must be followed by an identifier")
- }
- tokn := chfind(2, tokname)
- fnd := -1
- c = getrune(finput)
- if c != '@' {
- ungetrune(finput, c)
- } else if gettok() != NUMBER {
- errorf("@ must be followed by number")
- } else {
- fnd = numbval
- }
- for j = 1; j < max; j++ {
- if tokn == curprod[j] {
- fnd--
- if fnd <= 0 {
- break
- }
- }
- }
- if j >= max {
- errorf("$name or $name@number not found")
- }
- } else {
- fcode.WriteRune('$')
- if s < 0 {
- fcode.WriteRune('-')
- }
- ungetrune(finput, c)
- continue loop
- }
- fmt.Fprintf(fcode, "%sDollar[%v]", prefix, j)
-
- // put out the proper tag
- if ntypes != 0 {
- if j <= 0 && tok < 0 {
- errorf("must specify type of $%v", j)
- }
- if tok < 0 {
- tok = fdtype(curprod[j])
- }
- fmt.Fprintf(fcode, ".%v", typeset[tok])
- }
- continue loop
-
- case '}':
- brac--
- if brac != 0 {
- break
- }
- fcode.WriteRune(c)
- return
-
- case '/':
- nc := getrune(finput)
- if nc != '/' && nc != '*' {
- ungetrune(finput, nc)
- break
- }
- // a comment
- fcode.WriteRune(c)
- fcode.WriteRune(nc)
- c = getrune(finput)
- for c != EOF {
- switch {
- case c == '\n':
- lineno++
- if nc == '/' { // end of // comment
- break swt
- }
- case c == '*' && nc == '*': // end of /* comment?
- nnc := getrune(finput)
- if nnc == '/' {
- fcode.WriteRune('*')
- fcode.WriteRune('/')
- c = getrune(finput)
- break swt
- }
- ungetrune(finput, nnc)
- }
- fcode.WriteRune(c)
- c = getrune(finput)
- }
- errorf("EOF inside comment")
-
- case '\'', '"':
- // character string or constant
- match := c
- fcode.WriteRune(c)
- c = getrune(finput)
- for c != EOF {
- if c == '\\' {
- fcode.WriteRune(c)
- c = getrune(finput)
- if c == '\n' {
- lineno++
- }
- } else if c == match {
- break swt
- }
- if c == '\n' {
- errorf("newline in string or char const")
- }
- fcode.WriteRune(c)
- c = getrune(finput)
- }
- errorf("EOF in string or character constant")
-
- case EOF:
- lineno = lno
- errorf("action does not terminate")
-
- case '\n':
- fmt.Fprint(fcode, "\n\t")
- lineno++
- continue loop
- }
-
- fcode.WriteRune(c)
- }
-}
-
-func openup() {
- infile = flag.Arg(0)
- finput = open(infile)
- if finput == nil {
- errorf("cannot open %v", infile)
- }
-
- foutput = nil
- if vflag != "" {
- foutput = create(vflag)
- if foutput == nil {
- errorf("can't create file %v", vflag)
- }
- }
-
- ftable = nil
- if oflag == "" {
- oflag = "y.go"
- }
- ftable = create(oflag)
- if ftable == nil {
- errorf("can't create file %v", oflag)
- }
-
-}
-
-//
-// return a pointer to the name of symbol i
-//
-func symnam(i int) string {
- var s string
-
- if i >= NTBASE {
- s = nontrst[i-NTBASE].name
- } else {
- s = tokset[i].name
- }
- return s
-}
-
-//
-// set elements 0 through n-1 to c
-//
-func aryfil(v []int, n, c int) {
- for i := 0; i < n; i++ {
- v[i] = c
- }
-}
-
-//
-// compute an array with the beginnings of productions yielding given nonterminals
-// The array pres points to these lists
-// the array pyield has the lists: the total size is only NPROD+1
-//
-func cpres() {
- pres = make([][][]int, nnonter+1)
- curres := make([][]int, nprod)
-
- if false {
- for j := 0; j <= nnonter; j++ {
- fmt.Printf("nnonter[%v] = %v\n", j, nontrst[j].name)
- }
- for j := 0; j < nprod; j++ {
- fmt.Printf("prdptr[%v][0] = %v+NTBASE\n", j, prdptr[j][0]-NTBASE)
- }
- }
-
- fatfl = 0 // make undefined symbols nonfatal
- for i := 0; i <= nnonter; i++ {
- n := 0
- c := i + NTBASE
- for j := 0; j < nprod; j++ {
- if prdptr[j][0] == c {
- curres[n] = prdptr[j][1:]
- n++
- }
- }
- if n == 0 {
- errorf("nonterminal %v not defined", nontrst[i].name)
- continue
- }
- pres[i] = make([][]int, n)
- copy(pres[i], curres)
- }
- fatfl = 1
- if nerrors != 0 {
- summary()
- exit(1)
- }
-}
-
-//
-// mark nonterminals which derive the empty string
-// also, look for nonterminals which don't derive any token strings
-//
-func cempty() {
- var i, p, np int
- var prd []int
-
- pempty = make([]int, nnonter+1)
-
- // first, use the array pempty to detect productions that can never be reduced
- // set pempty to WHONOWS
- aryfil(pempty, nnonter+1, WHOKNOWS)
-
- // now, look at productions, marking nonterminals which derive something
-more:
- for {
- for i = 0; i < nprod; i++ {
- prd = prdptr[i]
- if pempty[prd[0]-NTBASE] != 0 {
- continue
- }
- np = len(prd) - 1
- for p = 1; p < np; p++ {
- if prd[p] >= NTBASE && pempty[prd[p]-NTBASE] == WHOKNOWS {
- break
- }
- }
- // production can be derived
- if p == np {
- pempty[prd[0]-NTBASE] = OK
- continue more
- }
- }
- break
- }
-
- // now, look at the nonterminals, to see if they are all OK
- for i = 0; i <= nnonter; i++ {
- // the added production rises or falls as the start symbol ...
- if i == 0 {
- continue
- }
- if pempty[i] != OK {
- fatfl = 0
- errorf("nonterminal " + nontrst[i].name + " never derives any token string")
- }
- }
-
- if nerrors != 0 {
- summary()
- exit(1)
- }
-
- // now, compute the pempty array, to see which nonterminals derive the empty string
- // set pempty to WHOKNOWS
- aryfil(pempty, nnonter+1, WHOKNOWS)
-
- // loop as long as we keep finding empty nonterminals
-
-again:
- for {
- next:
- for i = 1; i < nprod; i++ {
- // not known to be empty
- prd = prdptr[i]
- if pempty[prd[0]-NTBASE] != WHOKNOWS {
- continue
- }
- np = len(prd) - 1
- for p = 1; p < np; p++ {
- if prd[p] < NTBASE || pempty[prd[p]-NTBASE] != EMPTY {
- continue next
- }
- }
-
- // we have a nontrivially empty nonterminal
- pempty[prd[0]-NTBASE] = EMPTY
-
- // got one ... try for another
- continue again
- }
- return
- }
-}
-
-//
-// compute an array with the first of nonterminals
-//
-func cpfir() {
- var s, n, p, np, ch, i int
- var curres [][]int
- var prd []int
-
- wsets = make([]Wset, nnonter+WSETINC)
- pfirst = make([]Lkset, nnonter+1)
- for i = 0; i <= nnonter; i++ {
- wsets[i].ws = mkset()
- pfirst[i] = mkset()
- curres = pres[i]
- n = len(curres)
-
- // initially fill the sets
- for s = 0; s < n; s++ {
- prd = curres[s]
- np = len(prd) - 1
- for p = 0; p < np; p++ {
- ch = prd[p]
- if ch < NTBASE {
- setbit(pfirst[i], ch)
- break
- }
- if pempty[ch-NTBASE] == 0 {
- break
- }
- }
- }
- }
-
- // now, reflect transitivity
- changes := 1
- for changes != 0 {
- changes = 0
- for i = 0; i <= nnonter; i++ {
- curres = pres[i]
- n = len(curres)
- for s = 0; s < n; s++ {
- prd = curres[s]
- np = len(prd) - 1
- for p = 0; p < np; p++ {
- ch = prd[p] - NTBASE
- if ch < 0 {
- break
- }
- changes |= setunion(pfirst[i], pfirst[ch])
- if pempty[ch] == 0 {
- break
- }
- }
- }
- }
- }
-
- if indebug == 0 {
- return
- }
- if foutput != nil {
- for i = 0; i <= nnonter; i++ {
- fmt.Fprintf(foutput, "\n%v: %v %v\n",
- nontrst[i].name, pfirst[i], pempty[i])
- }
- }
-}
-
-//
-// generate the states
-//
-func stagen() {
- // initialize
- nstate = 0
- tstates = make([]int, ntokens+1) // states generated by terminal gotos
- ntstates = make([]int, nnonter+1) // states generated by nonterminal gotos
- amem = make([]int, ACTSIZE)
- memp = 0
-
- clset = mkset()
- pstate[0] = 0
- pstate[1] = 0
- aryfil(clset, tbitset, 0)
- putitem(Pitem{prdptr[0], 0, 0, 0}, clset)
- tystate[0] = MUSTDO
- nstate = 1
- pstate[2] = pstate[1]
-
- //
- // now, the main state generation loop
- // first pass generates all of the states
- // later passes fix up lookahead
- // could be sped up a lot by remembering
- // results of the first pass rather than recomputing
- //
- first := 1
- for more := 1; more != 0; first = 0 {
- more = 0
- for i := 0; i < nstate; i++ {
- if tystate[i] != MUSTDO {
- continue
- }
-
- tystate[i] = DONE
- aryfil(temp1, nnonter+1, 0)
-
- // take state i, close it, and do gotos
- closure(i)
-
- // generate goto's
- for p := 0; p < cwp; p++ {
- pi := wsets[p]
- if pi.flag != 0 {
- continue
- }
- wsets[p].flag = 1
- c := pi.pitem.first
- if c <= 1 {
- if pstate[i+1]-pstate[i] <= p {
- tystate[i] = MUSTLOOKAHEAD
- }
- continue
- }
-
- // do a goto on c
- putitem(wsets[p].pitem, wsets[p].ws)
- for q := p + 1; q < cwp; q++ {
- // this item contributes to the goto
- if c == wsets[q].pitem.first {
- putitem(wsets[q].pitem, wsets[q].ws)
- wsets[q].flag = 1
- }
- }
-
- if c < NTBASE {
- state(c) // register new state
- } else {
- temp1[c-NTBASE] = state(c)
- }
- }
-
- if gsdebug != 0 && foutput != nil {
- fmt.Fprintf(foutput, "%v: ", i)
- for j := 0; j <= nnonter; j++ {
- if temp1[j] != 0 {
- fmt.Fprintf(foutput, "%v %v,", nontrst[j].name, temp1[j])
- }
- }
- fmt.Fprintf(foutput, "\n")
- }
-
- if first != 0 {
- indgo[i] = apack(temp1[1:], nnonter-1) - 1
- }
-
- more++
- }
- }
-}
-
-//
-// generate the closure of state i
-//
-func closure(i int) {
- zzclose++
-
- // first, copy kernel of state i to wsets
- cwp = 0
- q := pstate[i+1]
- for p := pstate[i]; p < q; p++ {
- wsets[cwp].pitem = statemem[p].pitem
- wsets[cwp].flag = 1 // this item must get closed
- copy(wsets[cwp].ws, statemem[p].look)
- cwp++
- }
-
- // now, go through the loop, closing each item
- work := 1
- for work != 0 {
- work = 0
- for u := 0; u < cwp; u++ {
- if wsets[u].flag == 0 {
- continue
- }
-
- // dot is before c
- c := wsets[u].pitem.first
- if c < NTBASE {
- wsets[u].flag = 0
- // only interesting case is where . is before nonterminal
- continue
- }
-
- // compute the lookahead
- aryfil(clset, tbitset, 0)
-
- // find items involving c
- for v := u; v < cwp; v++ {
- if wsets[v].flag != 1 || wsets[v].pitem.first != c {
- continue
- }
- pi := wsets[v].pitem.prod
- ipi := wsets[v].pitem.off + 1
-
- wsets[v].flag = 0
- if nolook != 0 {
- continue
- }
-
- ch := pi[ipi]
- ipi++
- for ch > 0 {
- // terminal symbol
- if ch < NTBASE {
- setbit(clset, ch)
- break
- }
-
- // nonterminal symbol
- setunion(clset, pfirst[ch-NTBASE])
- if pempty[ch-NTBASE] == 0 {
- break
- }
- ch = pi[ipi]
- ipi++
- }
- if ch <= 0 {
- setunion(clset, wsets[v].ws)
- }
- }
-
- //
- // now loop over productions derived from c
- //
- curres := pres[c-NTBASE]
- n := len(curres)
-
- nexts:
- // initially fill the sets
- for s := 0; s < n; s++ {
- prd := curres[s]
-
- //
- // put these items into the closure
- // is the item there
- //
- for v := 0; v < cwp; v++ {
- // yes, it is there
- if wsets[v].pitem.off == 0 &&
- aryeq(wsets[v].pitem.prod, prd) != 0 {
- if nolook == 0 &&
- setunion(wsets[v].ws, clset) != 0 {
- wsets[v].flag = 1
- work = 1
- }
- continue nexts
- }
- }
-
- // not there; make a new entry
- if cwp >= len(wsets) {
- awsets := make([]Wset, cwp+WSETINC)
- copy(awsets, wsets)
- wsets = awsets
- }
- wsets[cwp].pitem = Pitem{prd, 0, prd[0], -prd[len(prd)-1]}
- wsets[cwp].flag = 1
- wsets[cwp].ws = mkset()
- if nolook == 0 {
- work = 1
- copy(wsets[cwp].ws, clset)
- }
- cwp++
- }
- }
- }
-
- // have computed closure; flags are reset; return
- if cldebug != 0 && foutput != nil {
- fmt.Fprintf(foutput, "\nState %v, nolook = %v\n", i, nolook)
- for u := 0; u < cwp; u++ {
- if wsets[u].flag != 0 {
- fmt.Fprintf(foutput, "flag set\n")
- }
- wsets[u].flag = 0
- fmt.Fprintf(foutput, "\t%v", writem(wsets[u].pitem))
- prlook(wsets[u].ws)
- fmt.Fprintf(foutput, "\n")
- }
- }
-}
-
-//
-// sorts last state,and sees if it equals earlier ones. returns state number
-//
-func state(c int) int {
- zzstate++
- p1 := pstate[nstate]
- p2 := pstate[nstate+1]
- if p1 == p2 {
- return 0 // null state
- }
-
- // sort the items
- var k, l int
- for k = p1 + 1; k < p2; k++ { // make k the biggest
- for l = k; l > p1; l-- {
- if statemem[l].pitem.prodno < statemem[l-1].pitem.prodno ||
- statemem[l].pitem.prodno == statemem[l-1].pitem.prodno &&
- statemem[l].pitem.off < statemem[l-1].pitem.off {
- s := statemem[l]
- statemem[l] = statemem[l-1]
- statemem[l-1] = s
- } else {
- break
- }
- }
- }
-
- size1 := p2 - p1 // size of state
-
- var i int
- if c >= NTBASE {
- i = ntstates[c-NTBASE]
- } else {
- i = tstates[c]
- }
-
-look:
- for ; i != 0; i = mstates[i] {
- // get ith state
- q1 := pstate[i]
- q2 := pstate[i+1]
- size2 := q2 - q1
- if size1 != size2 {
- continue
- }
- k = p1
- for l = q1; l < q2; l++ {
- if aryeq(statemem[l].pitem.prod, statemem[k].pitem.prod) == 0 ||
- statemem[l].pitem.off != statemem[k].pitem.off {
- continue look
- }
- k++
- }
-
- // found it
- pstate[nstate+1] = pstate[nstate] // delete last state
-
- // fix up lookaheads
- if nolook != 0 {
- return i
- }
- k = p1
- for l = q1; l < q2; l++ {
- if setunion(statemem[l].look, statemem[k].look) != 0 {
- tystate[i] = MUSTDO
- }
- k++
- }
- return i
- }
-
- // state is new
- zznewstate++
- if nolook != 0 {
- errorf("yacc state/nolook error")
- }
- pstate[nstate+2] = p2
- if nstate+1 >= NSTATES {
- errorf("too many states")
- }
- if c >= NTBASE {
- mstates[nstate] = ntstates[c-NTBASE]
- ntstates[c-NTBASE] = nstate
- } else {
- mstates[nstate] = tstates[c]
- tstates[c] = nstate
- }
- tystate[nstate] = MUSTDO
- nstate++
- return nstate - 1
-}
-
-func putitem(p Pitem, set Lkset) {
- p.off++
- p.first = p.prod[p.off]
-
- if pidebug != 0 && foutput != nil {
- fmt.Fprintf(foutput, "putitem(%v), state %v\n", writem(p), nstate)
- }
- j := pstate[nstate+1]
- if j >= len(statemem) {
- asm := make([]Item, j+STATEINC)
- copy(asm, statemem)
- statemem = asm
- }
- statemem[j].pitem = p
- if nolook == 0 {
- s := mkset()
- copy(s, set)
- statemem[j].look = s
- }
- j++
- pstate[nstate+1] = j
-}
-
-//
-// creates output string for item pointed to by pp
-//
-func writem(pp Pitem) string {
- var i int
-
- p := pp.prod
- q := chcopy(nontrst[prdptr[pp.prodno][0]-NTBASE].name) + ": "
- npi := pp.off
-
- pi := aryeq(p, prdptr[pp.prodno])
-
- for {
- c := ' '
- if pi == npi {
- c = '.'
- }
- q += string(c)
-
- i = p[pi]
- pi++
- if i <= 0 {
- break
- }
- q += chcopy(symnam(i))
- }
-
- // an item calling for a reduction
- i = p[npi]
- if i < 0 {
- q += fmt.Sprintf(" (%v)", -i)
- }
-
- return q
-}
-
-//
-// pack state i from temp1 into amem
-//
-func apack(p []int, n int) int {
- //
- // we don't need to worry about checking because
- // we will only look at entries known to be there...
- // eliminate leading and trailing 0's
- //
- off := 0
- pp := 0
- for ; pp <= n && p[pp] == 0; pp++ {
- off--
- }
-
- // no actions
- if pp > n {
- return 0
- }
- for ; n > pp && p[n] == 0; n-- {
- }
- p = p[pp : n+1]
-
- // now, find a place for the elements from p to q, inclusive
- r := len(amem) - len(p)
-
-nextk:
- for rr := 0; rr <= r; rr++ {
- qq := rr
- for pp = 0; pp < len(p); pp++ {
- if p[pp] != 0 {
- if p[pp] != amem[qq] && amem[qq] != 0 {
- continue nextk
- }
- }
- qq++
- }
-
- // we have found an acceptable k
- if pkdebug != 0 && foutput != nil {
- fmt.Fprintf(foutput, "off = %v, k = %v\n", off+rr, rr)
- }
- qq = rr
- for pp = 0; pp < len(p); pp++ {
- if p[pp] != 0 {
- if qq > memp {
- memp = qq
- }
- amem[qq] = p[pp]
- }
- qq++
- }
- if pkdebug != 0 && foutput != nil {
- for pp = 0; pp <= memp; pp += 10 {
- fmt.Fprintf(foutput, "\n")
- for qq = pp; qq <= pp+9; qq++ {
- fmt.Fprintf(foutput, "%v ", amem[qq])
- }
- fmt.Fprintf(foutput, "\n")
- }
- }
- return off + rr
- }
- errorf("no space in action table")
- return 0
-}
-
-//
-// print the output for the states
-//
-func output() {
- var c, u, v int
-
- if !lflag {
- fmt.Fprintf(ftable, "\n//line yacctab:1")
- }
- fmt.Fprintf(ftable, "\nvar %sExca = [...]int{\n", prefix)
-
- if len(errors) > 0 {
- stateTable = make([]Row, nstate)
- }
-
- noset := mkset()
-
- // output the stuff for state i
- for i := 0; i < nstate; i++ {
- nolook = 0
- if tystate[i] != MUSTLOOKAHEAD {
- nolook = 1
- }
- closure(i)
-
- // output actions
- nolook = 1
- aryfil(temp1, ntokens+nnonter+1, 0)
- for u = 0; u < cwp; u++ {
- c = wsets[u].pitem.first
- if c > 1 && c < NTBASE && temp1[c] == 0 {
- for v = u; v < cwp; v++ {
- if c == wsets[v].pitem.first {
- putitem(wsets[v].pitem, noset)
- }
- }
- temp1[c] = state(c)
- } else if c > NTBASE {
- c -= NTBASE
- if temp1[c+ntokens] == 0 {
- temp1[c+ntokens] = amem[indgo[i]+c]
- }
- }
- }
- if i == 1 {
- temp1[1] = ACCEPTCODE
- }
-
- // now, we have the shifts; look at the reductions
- lastred = 0
- for u = 0; u < cwp; u++ {
- c = wsets[u].pitem.first
-
- // reduction
- if c > 0 {
- continue
- }
- lastred = -c
- us := wsets[u].ws
- for k := 0; k <= ntokens; k++ {
- if bitset(us, k) == 0 {
- continue
- }
- if temp1[k] == 0 {
- temp1[k] = c
- } else if temp1[k] < 0 { // reduce/reduce conflict
- if foutput != nil {
- fmt.Fprintf(foutput,
- "\n %v: reduce/reduce conflict (red'ns "+
- "%v and %v) on %v",
- i, -temp1[k], lastred, symnam(k))
- }
- if -temp1[k] > lastred {
- temp1[k] = -lastred
- }
- zzrrconf++
- } else {
- // potential shift/reduce conflict
- precftn(lastred, k, i)
- }
- }
- }
- wract(i)
- }
-
- fmt.Fprintf(ftable, "}\n")
- ftable.WriteRune('\n')
- fmt.Fprintf(ftable, "const %sPrivate = %v\n", prefix, PRIVATE)
-}
-
-//
-// decide a shift/reduce conflict by precedence.
-// r is a rule number, t a token number
-// the conflict is in state s
-// temp1[t] is changed to reflect the action
-//
-func precftn(r, t, s int) {
- action := NOASC
-
- lp := levprd[r]
- lt := toklev[t]
- if PLEVEL(lt) == 0 || PLEVEL(lp) == 0 {
- // conflict
- if foutput != nil {
- fmt.Fprintf(foutput,
- "\n%v: shift/reduce conflict (shift %v(%v), red'n %v(%v)) on %v",
- s, temp1[t], PLEVEL(lt), r, PLEVEL(lp), symnam(t))
- }
- zzsrconf++
- return
- }
- if PLEVEL(lt) == PLEVEL(lp) {
- action = ASSOC(lt)
- } else if PLEVEL(lt) > PLEVEL(lp) {
- action = RASC // shift
- } else {
- action = LASC
- } // reduce
- switch action {
- case BASC: // error action
- temp1[t] = ERRCODE
- case LASC: // reduce
- temp1[t] = -r
- }
-}
-
-//
-// output state i
-// temp1 has the actions, lastred the default
-//
-func wract(i int) {
- var p, p1 int
-
- // find the best choice for lastred
- lastred = 0
- ntimes := 0
- for j := 0; j <= ntokens; j++ {
- if temp1[j] >= 0 {
- continue
- }
- if temp1[j]+lastred == 0 {
- continue
- }
- // count the number of appearances of temp1[j]
- count := 0
- tred := -temp1[j]
- levprd[tred] |= REDFLAG
- for p = 0; p <= ntokens; p++ {
- if temp1[p]+tred == 0 {
- count++
- }
- }
- if count > ntimes {
- lastred = tred
- ntimes = count
- }
- }
-
- //
- // for error recovery, arrange that, if there is a shift on the
- // error recovery token, `error', that the default be the error action
- //
- if temp1[2] > 0 {
- lastred = 0
- }
-
- // clear out entries in temp1 which equal lastred
- // count entries in optst table
- n := 0
- for p = 0; p <= ntokens; p++ {
- p1 = temp1[p]
- if p1+lastred == 0 {
- temp1[p] = 0
- p1 = 0
- }
- if p1 > 0 && p1 != ACCEPTCODE && p1 != ERRCODE {
- n++
- }
- }
-
- wrstate(i)
- defact[i] = lastred
- flag := 0
- os := make([]int, n*2)
- n = 0
- for p = 0; p <= ntokens; p++ {
- p1 = temp1[p]
- if p1 != 0 {
- if p1 < 0 {
- p1 = -p1
- } else if p1 == ACCEPTCODE {
- p1 = -1
- } else if p1 == ERRCODE {
- p1 = 0
- } else {
- os[n] = p
- n++
- os[n] = p1
- n++
- zzacent++
- continue
- }
- if flag == 0 {
- fmt.Fprintf(ftable, "\t-1, %v,\n", i)
- }
- flag++
- fmt.Fprintf(ftable, "\t%v, %v,\n", p, p1)
- zzexcp++
- }
- }
- if flag != 0 {
- defact[i] = -2
- fmt.Fprintf(ftable, "\t-2, %v,\n", lastred)
- }
- optst[i] = os
-}
-
-//
-// writes state i
-//
-func wrstate(i int) {
- var j0, j1, u int
- var pp, qq int
-
- if len(errors) > 0 {
- actions := append([]int(nil), temp1...)
- defaultAction := ERRCODE
- if lastred != 0 {
- defaultAction = -lastred
- }
- stateTable[i] = Row{actions, defaultAction}
- }
-
- if foutput == nil {
- return
- }
- fmt.Fprintf(foutput, "\nstate %v\n", i)
- qq = pstate[i+1]
- for pp = pstate[i]; pp < qq; pp++ {
- fmt.Fprintf(foutput, "\t%v\n", writem(statemem[pp].pitem))
- }
- if tystate[i] == MUSTLOOKAHEAD {
- // print out empty productions in closure
- for u = pstate[i+1] - pstate[i]; u < cwp; u++ {
- if wsets[u].pitem.first < 0 {
- fmt.Fprintf(foutput, "\t%v\n", writem(wsets[u].pitem))
- }
- }
- }
-
- // check for state equal to another
- for j0 = 0; j0 <= ntokens; j0++ {
- j1 = temp1[j0]
- if j1 != 0 {
- fmt.Fprintf(foutput, "\n\t%v ", symnam(j0))
-
- // shift, error, or accept
- if j1 > 0 {
- if j1 == ACCEPTCODE {
- fmt.Fprintf(foutput, "accept")
- } else if j1 == ERRCODE {
- fmt.Fprintf(foutput, "error")
- } else {
- fmt.Fprintf(foutput, "shift %v", j1)
- }
- } else {
- fmt.Fprintf(foutput, "reduce %v (src line %v)", -j1, rlines[-j1])
- }
- }
- }
-
- // output the final production
- if lastred != 0 {
- fmt.Fprintf(foutput, "\n\t. reduce %v (src line %v)\n\n",
- lastred, rlines[lastred])
- } else {
- fmt.Fprintf(foutput, "\n\t. error\n\n")
- }
-
- // now, output nonterminal actions
- j1 = ntokens
- for j0 = 1; j0 <= nnonter; j0++ {
- j1++
- if temp1[j1] != 0 {
- fmt.Fprintf(foutput, "\t%v goto %v\n", symnam(j0+NTBASE), temp1[j1])
- }
- }
-}
-
-//
-// output the gotos for the nontermninals
-//
-func go2out() {
- for i := 1; i <= nnonter; i++ {
- go2gen(i)
-
- // find the best one to make default
- best := -1
- times := 0
-
- // is j the most frequent
- for j := 0; j < nstate; j++ {
- if tystate[j] == 0 {
- continue
- }
- if tystate[j] == best {
- continue
- }
-
- // is tystate[j] the most frequent
- count := 0
- cbest := tystate[j]
- for k := j; k < nstate; k++ {
- if tystate[k] == cbest {
- count++
- }
- }
- if count > times {
- best = cbest
- times = count
- }
- }
-
- // best is now the default entry
- zzgobest += times - 1
- n := 0
- for j := 0; j < nstate; j++ {
- if tystate[j] != 0 && tystate[j] != best {
- n++
- }
- }
- goent := make([]int, 2*n+1)
- n = 0
- for j := 0; j < nstate; j++ {
- if tystate[j] != 0 && tystate[j] != best {
- goent[n] = j
- n++
- goent[n] = tystate[j]
- n++
- zzgoent++
- }
- }
-
- // now, the default
- if best == -1 {
- best = 0
- }
-
- zzgoent++
- goent[n] = best
- yypgo[i] = goent
- }
-}
-
-//
-// output the gotos for nonterminal c
-//
-func go2gen(c int) {
- var i, cc, p, q int
-
- // first, find nonterminals with gotos on c
- aryfil(temp1, nnonter+1, 0)
- temp1[c] = 1
- work := 1
- for work != 0 {
- work = 0
- for i = 0; i < nprod; i++ {
- // cc is a nonterminal with a goto on c
- cc = prdptr[i][1] - NTBASE
- if cc >= 0 && temp1[cc] != 0 {
- // thus, the left side of production i does too
- cc = prdptr[i][0] - NTBASE
- if temp1[cc] == 0 {
- work = 1
- temp1[cc] = 1
- }
- }
- }
- }
-
- // now, we have temp1[c] = 1 if a goto on c in closure of cc
- if g2debug != 0 && foutput != nil {
- fmt.Fprintf(foutput, "%v: gotos on ", nontrst[c].name)
- for i = 0; i <= nnonter; i++ {
- if temp1[i] != 0 {
- fmt.Fprintf(foutput, "%v ", nontrst[i].name)
- }
- }
- fmt.Fprintf(foutput, "\n")
- }
-
- // now, go through and put gotos into tystate
- aryfil(tystate, nstate, 0)
- for i = 0; i < nstate; i++ {
- q = pstate[i+1]
- for p = pstate[i]; p < q; p++ {
- cc = statemem[p].pitem.first
- if cc >= NTBASE {
- // goto on c is possible
- if temp1[cc-NTBASE] != 0 {
- tystate[i] = amem[indgo[i]+c]
- break
- }
- }
- }
- }
-}
-
-//
-// in order to free up the mem and amem arrays for the optimizer,
-// and still be able to output yyr1, etc., after the sizes of
-// the action array is known, we hide the nonterminals
-// derived by productions in levprd.
-//
-func hideprod() {
- nred := 0
- levprd[0] = 0
- for i := 1; i < nprod; i++ {
- if (levprd[i] & REDFLAG) == 0 {
- if foutput != nil {
- fmt.Fprintf(foutput, "Rule not reduced: %v\n",
- writem(Pitem{prdptr[i], 0, 0, i}))
- }
- fmt.Printf("rule %v never reduced\n", writem(Pitem{prdptr[i], 0, 0, i}))
- nred++
- }
- levprd[i] = prdptr[i][0] - NTBASE
- }
- if nred != 0 {
- fmt.Printf("%v rules never reduced\n", nred)
- }
-}
-
-func callopt() {
- var j, k, p, q, i int
- var v []int
-
- pgo = make([]int, nnonter+1)
- pgo[0] = 0
- maxoff = 0
- maxspr = 0
- for i = 0; i < nstate; i++ {
- k = 32000
- j = 0
- v = optst[i]
- q = len(v)
- for p = 0; p < q; p += 2 {
- if v[p] > j {
- j = v[p]
- }
- if v[p] < k {
- k = v[p]
- }
- }
-
- // nontrivial situation
- if k <= j {
- // j is now the range
- // j -= k; // call scj
- if k > maxoff {
- maxoff = k
- }
- }
- tystate[i] = q + 2*j
- if j > maxspr {
- maxspr = j
- }
- }
-
- // initialize ggreed table
- ggreed = make([]int, nnonter+1)
- for i = 1; i <= nnonter; i++ {
- ggreed[i] = 1
- j = 0
-
- // minimum entry index is always 0
- v = yypgo[i]
- q = len(v) - 1
- for p = 0; p < q; p += 2 {
- ggreed[i] += 2
- if v[p] > j {
- j = v[p]
- }
- }
- ggreed[i] = ggreed[i] + 2*j
- if j > maxoff {
- maxoff = j
- }
- }
-
- // now, prepare to put the shift actions into the amem array
- for i = 0; i < ACTSIZE; i++ {
- amem[i] = 0
- }
- maxa = 0
- for i = 0; i < nstate; i++ {
- if tystate[i] == 0 && adb > 1 {
- fmt.Fprintf(ftable, "State %v: null\n", i)
- }
- indgo[i] = yyFlag
- }
-
- i = nxti()
- for i != NOMORE {
- if i >= 0 {
- stin(i)
- } else {
- gin(-i)
- }
- i = nxti()
- }
-
- // print amem array
- if adb > 2 {
- for p = 0; p <= maxa; p += 10 {
- fmt.Fprintf(ftable, "%v ", p)
- for i = 0; i < 10; i++ {
- fmt.Fprintf(ftable, "%v ", amem[p+i])
- }
- ftable.WriteRune('\n')
- }
- }
-
- aoutput()
- osummary()
-}
-
-//
-// finds the next i
-//
-func nxti() int {
- max := 0
- maxi := 0
- for i := 1; i <= nnonter; i++ {
- if ggreed[i] >= max {
- max = ggreed[i]
- maxi = -i
- }
- }
- for i := 0; i < nstate; i++ {
- if tystate[i] >= max {
- max = tystate[i]
- maxi = i
- }
- }
- if max == 0 {
- return NOMORE
- }
- return maxi
-}
-
-func gin(i int) {
- var s int
-
- // enter gotos on nonterminal i into array amem
- ggreed[i] = 0
-
- q := yypgo[i]
- nq := len(q) - 1
-
- // now, find amem place for it
-nextgp:
- for p := 0; p < ACTSIZE; p++ {
- if amem[p] != 0 {
- continue
- }
- for r := 0; r < nq; r += 2 {
- s = p + q[r] + 1
- if s > maxa {
- maxa = s
- if maxa >= ACTSIZE {
- errorf("a array overflow")
- }
- }
- if amem[s] != 0 {
- continue nextgp
- }
- }
-
- // we have found amem spot
- amem[p] = q[nq]
- if p > maxa {
- maxa = p
- }
- for r := 0; r < nq; r += 2 {
- s = p + q[r] + 1
- amem[s] = q[r+1]
- }
- pgo[i] = p
- if adb > 1 {
- fmt.Fprintf(ftable, "Nonterminal %v, entry at %v\n", i, pgo[i])
- }
- return
- }
- errorf("cannot place goto %v\n", i)
-}
-
-func stin(i int) {
- var s int
-
- tystate[i] = 0
-
- // enter state i into the amem array
- q := optst[i]
- nq := len(q)
-
-nextn:
- // find an acceptable place
- for n := -maxoff; n < ACTSIZE; n++ {
- flag := 0
- for r := 0; r < nq; r += 2 {
- s = q[r] + n
- if s < 0 || s > ACTSIZE {
- continue nextn
- }
- if amem[s] == 0 {
- flag++
- } else if amem[s] != q[r+1] {
- continue nextn
- }
- }
-
- // check the position equals another only if the states are identical
- for j := 0; j < nstate; j++ {
- if indgo[j] == n {
-
- // we have some disagreement
- if flag != 0 {
- continue nextn
- }
- if nq == len(optst[j]) {
-
- // states are equal
- indgo[i] = n
- if adb > 1 {
- fmt.Fprintf(ftable, "State %v: entry at"+
- "%v equals state %v\n",
- i, n, j)
- }
- return
- }
-
- // we have some disagreement
- continue nextn
- }
- }
-
- for r := 0; r < nq; r += 2 {
- s = q[r] + n
- if s > maxa {
- maxa = s
- }
- if amem[s] != 0 && amem[s] != q[r+1] {
- errorf("clobber of a array, pos'n %v, by %v", s, q[r+1])
- }
- amem[s] = q[r+1]
- }
- indgo[i] = n
- if adb > 1 {
- fmt.Fprintf(ftable, "State %v: entry at %v\n", i, indgo[i])
- }
- return
- }
- errorf("Error; failure to place state %v", i)
-}
-
-//
-// this version is for limbo
-// write out the optimized parser
-//
-func aoutput() {
- ftable.WriteRune('\n')
- fmt.Fprintf(ftable, "const %sLast = %v\n\n", prefix, maxa+1)
- arout("Act", amem, maxa+1)
- arout("Pact", indgo, nstate)
- arout("Pgo", pgo, nnonter+1)
-}
-
-//
-// put out other arrays, copy the parsers
-//
-func others() {
- var i, j int
-
- arout("R1", levprd, nprod)
- aryfil(temp1, nprod, 0)
-
- //
- //yyr2 is the number of rules for each production
- //
- for i = 1; i < nprod; i++ {
- temp1[i] = len(prdptr[i]) - 2
- }
- arout("R2", temp1, nprod)
-
- aryfil(temp1, nstate, -1000)
- for i = 0; i <= ntokens; i++ {
- for j := tstates[i]; j != 0; j = mstates[j] {
- temp1[j] = i
- }
- }
- for i = 0; i <= nnonter; i++ {
- for j = ntstates[i]; j != 0; j = mstates[j] {
- temp1[j] = -i
- }
- }
- arout("Chk", temp1, nstate)
- arout("Def", defact, nstate)
-
- // put out token translation tables
- // table 1 has 0-256
- aryfil(temp1, 256, 0)
- c := 0
- for i = 1; i <= ntokens; i++ {
- j = tokset[i].value
- if j >= 0 && j < 256 {
- if temp1[j] != 0 {
- fmt.Print("yacc bug -- cannot have 2 different Ts with same value\n")
- fmt.Printf(" %s and %s\n", tokset[i].name, tokset[temp1[j]].name)
- nerrors++
- }
- temp1[j] = i
- if j > c {
- c = j
- }
- }
- }
- for i = 0; i <= c; i++ {
- if temp1[i] == 0 {
- temp1[i] = YYLEXUNK
- }
- }
- arout("Tok1", temp1, c+1)
-
- // table 2 has PRIVATE-PRIVATE+256
- aryfil(temp1, 256, 0)
- c = 0
- for i = 1; i <= ntokens; i++ {
- j = tokset[i].value - PRIVATE
- if j >= 0 && j < 256 {
- if temp1[j] != 0 {
- fmt.Print("yacc bug -- cannot have 2 different Ts with same value\n")
- fmt.Printf(" %s and %s\n", tokset[i].name, tokset[temp1[j]].name)
- nerrors++
- }
- temp1[j] = i
- if j > c {
- c = j
- }
- }
- }
- arout("Tok2", temp1, c+1)
-
- // table 3 has everything else
- fmt.Fprintf(ftable, "var %sTok3 = [...]int{\n\t", prefix)
- c = 0
- for i = 1; i <= ntokens; i++ {
- j = tokset[i].value
- if j >= 0 && j < 256 {
- continue
- }
- if j >= PRIVATE && j < 256+PRIVATE {
- continue
- }
-
- if c%5 != 0 {
- ftable.WriteRune(' ')
- }
- fmt.Fprintf(ftable, "%d, %d,", j, i)
- c++
- if c%5 == 0 {
- fmt.Fprint(ftable, "\n\t")
- }
- }
- if c%5 != 0 {
- ftable.WriteRune(' ')
- }
- fmt.Fprintf(ftable, "%d,\n}\n", 0)
-
- // Custom error messages.
- fmt.Fprintf(ftable, "\n")
- fmt.Fprintf(ftable, "var %sErrorMessages = [...]struct {\n", prefix)
- fmt.Fprintf(ftable, "\tstate int\n")
- fmt.Fprintf(ftable, "\ttoken int\n")
- fmt.Fprintf(ftable, "\tmsg string\n")
- fmt.Fprintf(ftable, "}{\n")
- for _, error := range errors {
- lineno = error.lineno
- state, token := runMachine(error.tokens)
- fmt.Fprintf(ftable, "\t{%v, %v, %s},\n", state, token, error.msg)
- }
- fmt.Fprintf(ftable, "}\n")
-
- // copy parser text
- ch := getrune(finput)
- for ch != EOF {
- ftable.WriteRune(ch)
- ch = getrune(finput)
- }
-
- // copy yaccpar
- if !lflag {
- fmt.Fprintf(ftable, "\n//line yaccpar:1\n")
- }
-
- parts := strings.SplitN(yaccpar, prefix+"run()", 2)
- fmt.Fprintf(ftable, "%v", parts[0])
- ftable.Write(fcode.Bytes())
- fmt.Fprintf(ftable, "%v", parts[1])
-}
-
-func runMachine(tokens []string) (state, token int) {
- var stack []int
- i := 0
- token = -1
-
-Loop:
- if token < 0 {
- token = chfind(2, tokens[i])
- i++
- }
-
- row := stateTable[state]
-
- c := token
- if token >= NTBASE {
- c = token - NTBASE + ntokens
- }
- action := row.actions[c]
- if action == 0 {
- action = row.defaultAction
- }
-
- switch {
- case action == ACCEPTCODE:
- errorf("tokens are accepted")
- return
- case action == ERRCODE:
- if token >= NTBASE {
- errorf("error at non-terminal token %s", symnam(token))
- }
- return
- case action > 0:
- // Shift to state action.
- stack = append(stack, state)
- state = action
- token = -1
- goto Loop
- default:
- // Reduce by production -action.
- prod := prdptr[-action]
- if rhsLen := len(prod) - 2; rhsLen > 0 {
- n := len(stack) - rhsLen
- state = stack[n]
- stack = stack[:n]
- }
- if token >= 0 {
- i--
- }
- token = prod[0]
- goto Loop
- }
-}
-
-func arout(s string, v []int, n int) {
- s = prefix + s
- fmt.Fprintf(ftable, "var %v = [...]int{\n", s)
- for i := 0; i < n; i++ {
- if i%10 == 0 {
- fmt.Fprintf(ftable, "\n\t")
- } else {
- ftable.WriteRune(' ')
- }
- fmt.Fprintf(ftable, "%d,", v[i])
- }
- fmt.Fprintf(ftable, "\n}\n")
-}
-
-//
-// output the summary on y.output
-//
-func summary() {
- if foutput != nil {
- fmt.Fprintf(foutput, "\n%v terminals, %v nonterminals\n", ntokens, nnonter+1)
- fmt.Fprintf(foutput, "%v grammar rules, %v/%v states\n", nprod, nstate, NSTATES)
- fmt.Fprintf(foutput, "%v shift/reduce, %v reduce/reduce conflicts reported\n", zzsrconf, zzrrconf)
- fmt.Fprintf(foutput, "%v working sets used\n", len(wsets))
- fmt.Fprintf(foutput, "memory: parser %v/%v\n", memp, ACTSIZE)
- fmt.Fprintf(foutput, "%v extra closures\n", zzclose-2*nstate)
- fmt.Fprintf(foutput, "%v shift entries, %v exceptions\n", zzacent, zzexcp)
- fmt.Fprintf(foutput, "%v goto entries\n", zzgoent)
- fmt.Fprintf(foutput, "%v entries saved by goto default\n", zzgobest)
- }
- if zzsrconf != 0 || zzrrconf != 0 {
- fmt.Printf("\nconflicts: ")
- if zzsrconf != 0 {
- fmt.Printf("%v shift/reduce", zzsrconf)
- }
- if zzsrconf != 0 && zzrrconf != 0 {
- fmt.Printf(", ")
- }
- if zzrrconf != 0 {
- fmt.Printf("%v reduce/reduce", zzrrconf)
- }
- fmt.Printf("\n")
- }
-}
-
-//
-// write optimizer summary
-//
-func osummary() {
- if foutput == nil {
- return
- }
- i := 0
- for p := maxa; p >= 0; p-- {
- if amem[p] == 0 {
- i++
- }
- }
-
- fmt.Fprintf(foutput, "Optimizer space used: output %v/%v\n", maxa+1, ACTSIZE)
- fmt.Fprintf(foutput, "%v table entries, %v zero\n", maxa+1, i)
- fmt.Fprintf(foutput, "maximum spread: %v, maximum offset: %v\n", maxspr, maxoff)
-}
-
-//
-// copies and protects "'s in q
-//
-func chcopy(q string) string {
- s := ""
- i := 0
- j := 0
- for i = 0; i < len(q); i++ {
- if q[i] == '"' {
- s += q[j:i] + "\\"
- j = i
- }
- }
- return s + q[j:i]
-}
-
-func usage() {
- fmt.Fprintf(stderr, "usage: yacc [-o output] [-v parsetable] input\n")
- exit(1)
-}
-
-func bitset(set Lkset, bit int) int { return set[bit>>5] & (1 << uint(bit&31)) }
-
-func setbit(set Lkset, bit int) { set[bit>>5] |= (1 << uint(bit&31)) }
-
-func mkset() Lkset { return make([]int, tbitset) }
-
-//
-// set a to the union of a and b
-// return 1 if b is not a subset of a, 0 otherwise
-//
-func setunion(a, b []int) int {
- sub := 0
- for i := 0; i < tbitset; i++ {
- x := a[i]
- y := x | b[i]
- a[i] = y
- if y != x {
- sub = 1
- }
- }
- return sub
-}
-
-func prlook(p Lkset) {
- if p == nil {
- fmt.Fprintf(foutput, "\tNULL")
- return
- }
- fmt.Fprintf(foutput, " { ")
- for j := 0; j <= ntokens; j++ {
- if bitset(p, j) != 0 {
- fmt.Fprintf(foutput, "%v ", symnam(j))
- }
- }
- fmt.Fprintf(foutput, "}")
-}
-
-//
-// utility routines
-//
-var peekrune rune
-
-func isdigit(c rune) bool { return c >= '0' && c <= '9' }
-
-func isword(c rune) bool {
- return c >= 0xa0 || c == '_' || (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')
-}
-
-//
-// return 1 if 2 arrays are equal
-// return 0 if not equal
-//
-func aryeq(a []int, b []int) int {
- n := len(a)
- if len(b) != n {
- return 0
- }
- for ll := 0; ll < n; ll++ {
- if a[ll] != b[ll] {
- return 0
- }
- }
- return 1
-}
-
-func getrune(f *bufio.Reader) rune {
- var r rune
-
- if peekrune != 0 {
- if peekrune == EOF {
- return EOF
- }
- r = peekrune
- peekrune = 0
- return r
- }
-
- c, n, err := f.ReadRune()
- if n == 0 {
- return EOF
- }
- if err != nil {
- errorf("read error: %v", err)
- }
- //fmt.Printf("rune = %v n=%v\n", string(c), n);
- return c
-}
-
-func ungetrune(f *bufio.Reader, c rune) {
- if f != finput {
- panic("ungetc - not finput")
- }
- if peekrune != 0 {
- panic("ungetc - 2nd unget")
- }
- peekrune = c
-}
-
-func open(s string) *bufio.Reader {
- fi, err := os.Open(s)
- if err != nil {
- errorf("error opening %v: %v", s, err)
- }
- //fmt.Printf("open %v\n", s);
- return bufio.NewReader(fi)
-}
-
-func create(s string) *bufio.Writer {
- fo, err := os.Create(s)
- if err != nil {
- errorf("error creating %v: %v", s, err)
- }
- //fmt.Printf("create %v mode %v\n", s);
- return bufio.NewWriter(fo)
-}
-
-//
-// write out error comment
-//
-func lerrorf(lineno int, s string, v ...interface{}) {
- nerrors++
- fmt.Fprintf(stderr, s, v...)
- fmt.Fprintf(stderr, ": %v:%v\n", infile, lineno)
- if fatfl != 0 {
- summary()
- exit(1)
- }
-}
-
-func errorf(s string, v ...interface{}) {
- lerrorf(lineno, s, v...)
-}
-
-func exit(status int) {
- if ftable != nil {
- ftable.Flush()
- ftable = nil
- gofmt()
- }
- if foutput != nil {
- foutput.Flush()
- foutput = nil
- }
- if stderr != nil {
- stderr.Flush()
- stderr = nil
- }
- os.Exit(status)
-}
-
-func gofmt() {
- src, err := ioutil.ReadFile(oflag)
- if err != nil {
- return
- }
- src, err = format.Source(src)
- if err != nil {
- return
- }
- ioutil.WriteFile(oflag, src, 0666)
-}
-
-var yaccpar string // will be processed version of yaccpartext: s/$$/prefix/g
-var yaccpartext = `
-/* parser for yacc output */
-
-var (
- $$Debug = 0
- $$ErrorVerbose = false
-)
-
-type $$Lexer interface {
- Lex(lval *$$SymType) int
- Error(s string)
-}
-
-type $$Parser interface {
- Parse($$Lexer) int
- Lookahead() int
-}
-
-type $$ParserImpl struct {
- lval $$SymType
- stack [$$InitialStackSize]$$SymType
- char int
-}
-
-func (p *$$ParserImpl) Lookahead() int {
- return p.char
-}
-
-func $$NewParser() $$Parser {
- return &$$ParserImpl{}
-}
-
-const $$Flag = -1000
-
-func $$Tokname(c int) string {
- if c >= 1 && c-1 < len($$Toknames) {
- if $$Toknames[c-1] != "" {
- return $$Toknames[c-1]
- }
- }
- return __yyfmt__.Sprintf("tok-%v", c)
-}
-
-func $$Statname(s int) string {
- if s >= 0 && s < len($$Statenames) {
- if $$Statenames[s] != "" {
- return $$Statenames[s]
- }
- }
- return __yyfmt__.Sprintf("state-%v", s)
-}
-
-func $$ErrorMessage(state, lookAhead int) string {
- const TOKSTART = 4
-
- if !$$ErrorVerbose {
- return "syntax error"
- }
-
- for _, e := range $$ErrorMessages {
- if e.state == state && e.token == lookAhead {
- return "syntax error: " + e.msg
- }
- }
-
- res := "syntax error: unexpected " + $$Tokname(lookAhead)
-
- // To match Bison, suggest at most four expected tokens.
- expected := make([]int, 0, 4)
-
- // Look for shiftable tokens.
- base := $$Pact[state]
- for tok := TOKSTART; tok-1 < len($$Toknames); tok++ {
- if n := base + tok; n >= 0 && n < $$Last && $$Chk[$$Act[n]] == tok {
- if len(expected) == cap(expected) {
- return res
- }
- expected = append(expected, tok)
- }
- }
-
- if $$Def[state] == -2 {
- i := 0
- for $$Exca[i] != -1 || $$Exca[i+1] != state {
- i += 2
- }
-
- // Look for tokens that we accept or reduce.
- for i += 2; $$Exca[i] >= 0; i += 2 {
- tok := $$Exca[i]
- if tok < TOKSTART || $$Exca[i+1] == 0 {
- continue
- }
- if len(expected) == cap(expected) {
- return res
- }
- expected = append(expected, tok)
- }
-
- // If the default action is to accept or reduce, give up.
- if $$Exca[i+1] != 0 {
- return res
- }
- }
-
- for i, tok := range expected {
- if i == 0 {
- res += ", expecting "
- } else {
- res += " or "
- }
- res += $$Tokname(tok)
- }
- return res
-}
-
-func $$lex1(lex $$Lexer, lval *$$SymType) (char, token int) {
- token = 0
- char = lex.Lex(lval)
- if char <= 0 {
- token = $$Tok1[0]
- goto out
- }
- if char < len($$Tok1) {
- token = $$Tok1[char]
- goto out
- }
- if char >= $$Private {
- if char < $$Private+len($$Tok2) {
- token = $$Tok2[char-$$Private]
- goto out
- }
- }
- for i := 0; i < len($$Tok3); i += 2 {
- token = $$Tok3[i+0]
- if token == char {
- token = $$Tok3[i+1]
- goto out
- }
- }
-
-out:
- if token == 0 {
- token = $$Tok2[1] /* unknown char */
- }
- if $$Debug >= 3 {
- __yyfmt__.Printf("lex %s(%d)\n", $$Tokname(token), uint(char))
- }
- return char, token
-}
-
-func $$Parse($$lex $$Lexer) int {
- return $$NewParser().Parse($$lex)
-}
-
-func ($$rcvr *$$ParserImpl) Parse($$lex $$Lexer) int {
- var $$n int
- var $$VAL $$SymType
- var $$Dollar []$$SymType
- _ = $$Dollar // silence set and not used
- $$S := $$rcvr.stack[:]
-
- Nerrs := 0 /* number of errors */
- Errflag := 0 /* error recovery flag */
- $$state := 0
- $$rcvr.char = -1
- $$token := -1 // $$rcvr.char translated into internal numbering
- defer func() {
- // Make sure we report no lookahead when not parsing.
- $$state = -1
- $$rcvr.char = -1
- $$token = -1
- }()
- $$p := -1
- goto $$stack
-
-ret0:
- return 0
-
-ret1:
- return 1
-
-$$stack:
- /* put a state and value onto the stack */
- if $$Debug >= 4 {
- __yyfmt__.Printf("char %v in %v\n", $$Tokname($$token), $$Statname($$state))
- }
-
- $$p++
- if $$p >= len($$S) {
- nyys := make([]$$SymType, len($$S)*2)
- copy(nyys, $$S)
- $$S = nyys
- }
- $$S[$$p] = $$VAL
- $$S[$$p].yys = $$state
-
-$$newstate:
- $$n = $$Pact[$$state]
- if $$n <= $$Flag {
- goto $$default /* simple state */
- }
- if $$rcvr.char < 0 {
- $$rcvr.char, $$token = $$lex1($$lex, &$$rcvr.lval)
- }
- $$n += $$token
- if $$n < 0 || $$n >= $$Last {
- goto $$default
- }
- $$n = $$Act[$$n]
- if $$Chk[$$n] == $$token { /* valid shift */
- $$rcvr.char = -1
- $$token = -1
- $$VAL = $$rcvr.lval
- $$state = $$n
- if Errflag > 0 {
- Errflag--
- }
- goto $$stack
- }
-
-$$default:
- /* default state action */
- $$n = $$Def[$$state]
- if $$n == -2 {
- if $$rcvr.char < 0 {
- $$rcvr.char, $$token = $$lex1($$lex, &$$rcvr.lval)
- }
-
- /* look through exception table */
- xi := 0
- for {
- if $$Exca[xi+0] == -1 && $$Exca[xi+1] == $$state {
- break
- }
- xi += 2
- }
- for xi += 2; ; xi += 2 {
- $$n = $$Exca[xi+0]
- if $$n < 0 || $$n == $$token {
- break
- }
- }
- $$n = $$Exca[xi+1]
- if $$n < 0 {
- goto ret0
- }
- }
- if $$n == 0 {
- /* error ... attempt to resume parsing */
- switch Errflag {
- case 0: /* brand new error */
- $$lex.Error($$ErrorMessage($$state, $$token))
- Nerrs++
- if $$Debug >= 1 {
- __yyfmt__.Printf("%s", $$Statname($$state))
- __yyfmt__.Printf(" saw %s\n", $$Tokname($$token))
- }
- fallthrough
-
- case 1, 2: /* incompletely recovered error ... try again */
- Errflag = 3
-
- /* find a state where "error" is a legal shift action */
- for $$p >= 0 {
- $$n = $$Pact[$$S[$$p].yys] + $$ErrCode
- if $$n >= 0 && $$n < $$Last {
- $$state = $$Act[$$n] /* simulate a shift of "error" */
- if $$Chk[$$state] == $$ErrCode {
- goto $$stack
- }
- }
-
- /* the current p has no shift on "error", pop stack */
- if $$Debug >= 2 {
- __yyfmt__.Printf("error recovery pops state %d\n", $$S[$$p].yys)
- }
- $$p--
- }
- /* there is no state on the stack with an error shift ... abort */
- goto ret1
-
- case 3: /* no shift yet; clobber input char */
- if $$Debug >= 2 {
- __yyfmt__.Printf("error recovery discards %s\n", $$Tokname($$token))
- }
- if $$token == $$EofCode {
- goto ret1
- }
- $$rcvr.char = -1
- $$token = -1
- goto $$newstate /* try again in the same state */
- }
- }
-
- /* reduction by production $$n */
- if $$Debug >= 2 {
- __yyfmt__.Printf("reduce %v in:\n\t%v\n", $$n, $$Statname($$state))
- }
-
- $$nt := $$n
- $$pt := $$p
- _ = $$pt // guard against "declared and not used"
-
- $$p -= $$R2[$$n]
- // $$p is now the index of $0. Perform the default action. Iff the
- // reduced production is ε, $1 is possibly out of range.
- if $$p+1 >= len($$S) {
- nyys := make([]$$SymType, len($$S)*2)
- copy(nyys, $$S)
- $$S = nyys
- }
- $$VAL = $$S[$$p+1]
-
- /* consult goto table to find next state */
- $$n = $$R1[$$n]
- $$g := $$Pgo[$$n]
- $$j := $$g + $$S[$$p].yys + 1
-
- if $$j >= $$Last {
- $$state = $$Act[$$g]
- } else {
- $$state = $$Act[$$j]
- if $$Chk[$$state] != -$$n {
- $$state = $$Act[$$g]
- }
- }
- // dummy call; replaced with literal code
- $$run()
- goto $$stack /* stack new state and value */
-}
-`
diff --git a/vendor/golang.org/x/tools/cmd/guru/callees.go b/vendor/golang.org/x/tools/cmd/guru/callees.go
deleted file mode 100644
index 7ab1dba..0000000
--- a/vendor/golang.org/x/tools/cmd/guru/callees.go
+++ /dev/null
@@ -1,257 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-import (
- "fmt"
- "go/ast"
- "go/token"
- "go/types"
- "sort"
-
- "golang.org/x/tools/cmd/guru/serial"
- "golang.org/x/tools/go/loader"
- "golang.org/x/tools/go/pointer"
- "golang.org/x/tools/go/ssa"
- "golang.org/x/tools/go/ssa/ssautil"
-)
-
-// Callees reports the possible callees of the function call site
-// identified by the specified source location.
-func callees(q *Query) error {
- lconf := loader.Config{Build: q.Build}
-
- if err := setPTAScope(&lconf, q.Scope); err != nil {
- return err
- }
-
- // Load/parse/type-check the program.
- lprog, err := loadWithSoftErrors(&lconf)
- if err != nil {
- return err
- }
-
- qpos, err := parseQueryPos(lprog, q.Pos, true) // needs exact pos
- if err != nil {
- return err
- }
-
- // Determine the enclosing call for the specified position.
- var e *ast.CallExpr
- for _, n := range qpos.path {
- if e, _ = n.(*ast.CallExpr); e != nil {
- break
- }
- }
- if e == nil {
- return fmt.Errorf("there is no function call here")
- }
- // TODO(adonovan): issue an error if the call is "too far
- // away" from the current selection, as this most likely is
- // not what the user intended.
-
- // Reject type conversions.
- if qpos.info.Types[e.Fun].IsType() {
- return fmt.Errorf("this is a type conversion, not a function call")
- }
-
- // Deal with obviously static calls before constructing SSA form.
- // Some static calls may yet require SSA construction,
- // e.g. f := func(){}; f().
- switch funexpr := unparen(e.Fun).(type) {
- case *ast.Ident:
- switch obj := qpos.info.Uses[funexpr].(type) {
- case *types.Builtin:
- // Reject calls to built-ins.
- return fmt.Errorf("this is a call to the built-in '%s' operator", obj.Name())
- case *types.Func:
- // This is a static function call
- q.Output(lprog.Fset, &calleesTypesResult{
- site: e,
- callee: obj,
- })
- return nil
- }
- case *ast.SelectorExpr:
- sel := qpos.info.Selections[funexpr]
- if sel == nil {
- // qualified identifier.
- // May refer to top level function variable
- // or to top level function.
- callee := qpos.info.Uses[funexpr.Sel]
- if obj, ok := callee.(*types.Func); ok {
- q.Output(lprog.Fset, &calleesTypesResult{
- site: e,
- callee: obj,
- })
- return nil
- }
- } else if sel.Kind() == types.MethodVal {
- // Inspect the receiver type of the selected method.
- // If it is concrete, the call is statically dispatched.
- // (Due to implicit field selections, it is not enough to look
- // at sel.Recv(), the type of the actual receiver expression.)
- method := sel.Obj().(*types.Func)
- recvtype := method.Type().(*types.Signature).Recv().Type()
- if !types.IsInterface(recvtype) {
- // static method call
- q.Output(lprog.Fset, &calleesTypesResult{
- site: e,
- callee: method,
- })
- return nil
- }
- }
- }
-
- prog := ssautil.CreateProgram(lprog, ssa.GlobalDebug)
-
- ptaConfig, err := setupPTA(prog, lprog, q.PTALog, q.Reflection)
- if err != nil {
- return err
- }
-
- pkg := prog.Package(qpos.info.Pkg)
- if pkg == nil {
- return fmt.Errorf("no SSA package")
- }
-
- // Defer SSA construction till after errors are reported.
- prog.Build()
-
- // Ascertain calling function and call site.
- callerFn := ssa.EnclosingFunction(pkg, qpos.path)
- if callerFn == nil {
- return fmt.Errorf("no SSA function built for this location (dead code?)")
- }
-
- // Find the call site.
- site, err := findCallSite(callerFn, e)
- if err != nil {
- return err
- }
-
- funcs, err := findCallees(ptaConfig, site)
- if err != nil {
- return err
- }
-
- q.Output(lprog.Fset, &calleesSSAResult{
- site: site,
- funcs: funcs,
- })
- return nil
-}
-
-func findCallSite(fn *ssa.Function, call *ast.CallExpr) (ssa.CallInstruction, error) {
- instr, _ := fn.ValueForExpr(call)
- callInstr, _ := instr.(ssa.CallInstruction)
- if instr == nil {
- return nil, fmt.Errorf("this call site is unreachable in this analysis")
- }
- return callInstr, nil
-}
-
-func findCallees(conf *pointer.Config, site ssa.CallInstruction) ([]*ssa.Function, error) {
- // Avoid running the pointer analysis for static calls.
- if callee := site.Common().StaticCallee(); callee != nil {
- switch callee.String() {
- case "runtime.SetFinalizer", "(reflect.Value).Call":
- // The PTA treats calls to these intrinsics as dynamic.
- // TODO(adonovan): avoid reliance on PTA internals.
-
- default:
- return []*ssa.Function{callee}, nil // singleton
- }
- }
-
- // Dynamic call: use pointer analysis.
- conf.BuildCallGraph = true
- cg := ptrAnalysis(conf).CallGraph
- cg.DeleteSyntheticNodes()
-
- // Find all call edges from the site.
- n := cg.Nodes[site.Parent()]
- if n == nil {
- return nil, fmt.Errorf("this call site is unreachable in this analysis")
- }
- calleesMap := make(map[*ssa.Function]bool)
- for _, edge := range n.Out {
- if edge.Site == site {
- calleesMap[edge.Callee.Func] = true
- }
- }
-
- // De-duplicate and sort.
- funcs := make([]*ssa.Function, 0, len(calleesMap))
- for f := range calleesMap {
- funcs = append(funcs, f)
- }
- sort.Sort(byFuncPos(funcs))
- return funcs, nil
-}
-
-type calleesSSAResult struct {
- site ssa.CallInstruction
- funcs []*ssa.Function
-}
-
-type calleesTypesResult struct {
- site *ast.CallExpr
- callee *types.Func
-}
-
-func (r *calleesSSAResult) PrintPlain(printf printfFunc) {
- if len(r.funcs) == 0 {
- // dynamic call on a provably nil func/interface
- printf(r.site, "%s on nil value", r.site.Common().Description())
- } else {
- printf(r.site, "this %s dispatches to:", r.site.Common().Description())
- for _, callee := range r.funcs {
- printf(callee, "\t%s", callee)
- }
- }
-}
-
-func (r *calleesSSAResult) JSON(fset *token.FileSet) []byte {
- j := &serial.Callees{
- Pos: fset.Position(r.site.Pos()).String(),
- Desc: r.site.Common().Description(),
- }
- for _, callee := range r.funcs {
- j.Callees = append(j.Callees, &serial.Callee{
- Name: callee.String(),
- Pos: fset.Position(callee.Pos()).String(),
- })
- }
- return toJSON(j)
-}
-
-func (r *calleesTypesResult) PrintPlain(printf printfFunc) {
- printf(r.site, "this static function call dispatches to:")
- printf(r.callee, "\t%s", r.callee.FullName())
-}
-
-func (r *calleesTypesResult) JSON(fset *token.FileSet) []byte {
- j := &serial.Callees{
- Pos: fset.Position(r.site.Pos()).String(),
- Desc: "static function call",
- }
- j.Callees = []*serial.Callee{
- {
- Name: r.callee.FullName(),
- Pos: fset.Position(r.callee.Pos()).String(),
- },
- }
- return toJSON(j)
-}
-
-// NB: byFuncPos is not deterministic across packages since it depends on load order.
-// Use lessPos if the tests need it.
-type byFuncPos []*ssa.Function
-
-func (a byFuncPos) Len() int { return len(a) }
-func (a byFuncPos) Less(i, j int) bool { return a[i].Pos() < a[j].Pos() }
-func (a byFuncPos) Swap(i, j int) { a[i], a[j] = a[j], a[i] }
diff --git a/vendor/golang.org/x/tools/cmd/guru/callers.go b/vendor/golang.org/x/tools/cmd/guru/callers.go
deleted file mode 100644
index e51b6e5..0000000
--- a/vendor/golang.org/x/tools/cmd/guru/callers.go
+++ /dev/null
@@ -1,195 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-import (
- "fmt"
- "go/token"
- "go/types"
-
- "golang.org/x/tools/cmd/guru/serial"
- "golang.org/x/tools/go/callgraph"
- "golang.org/x/tools/go/loader"
- "golang.org/x/tools/go/ssa"
- "golang.org/x/tools/go/ssa/ssautil"
-)
-
-// Callers reports the possible callers of the function
-// immediately enclosing the specified source location.
-//
-func callers(q *Query) error {
- lconf := loader.Config{Build: q.Build}
-
- if err := setPTAScope(&lconf, q.Scope); err != nil {
- return err
- }
-
- // Load/parse/type-check the program.
- lprog, err := loadWithSoftErrors(&lconf)
- if err != nil {
- return err
- }
-
- qpos, err := parseQueryPos(lprog, q.Pos, false)
- if err != nil {
- return err
- }
-
- prog := ssautil.CreateProgram(lprog, 0)
-
- ptaConfig, err := setupPTA(prog, lprog, q.PTALog, q.Reflection)
- if err != nil {
- return err
- }
-
- pkg := prog.Package(qpos.info.Pkg)
- if pkg == nil {
- return fmt.Errorf("no SSA package")
- }
- if !ssa.HasEnclosingFunction(pkg, qpos.path) {
- return fmt.Errorf("this position is not inside a function")
- }
-
- // Defer SSA construction till after errors are reported.
- prog.Build()
-
- target := ssa.EnclosingFunction(pkg, qpos.path)
- if target == nil {
- return fmt.Errorf("no SSA function built for this location (dead code?)")
- }
-
- // If the function is never address-taken, all calls are direct
- // and can be found quickly by inspecting the whole SSA program.
- cg := directCallsTo(target, entryPoints(ptaConfig.Mains))
- if cg == nil {
- // Run the pointer analysis, recording each
- // call found to originate from target.
- // (Pointer analysis may return fewer results than
- // directCallsTo because it ignores dead code.)
- ptaConfig.BuildCallGraph = true
- cg = ptrAnalysis(ptaConfig).CallGraph
- }
- cg.DeleteSyntheticNodes()
- edges := cg.CreateNode(target).In
-
- // TODO(adonovan): sort + dedup calls to ensure test determinism.
-
- q.Output(lprog.Fset, &callersResult{
- target: target,
- callgraph: cg,
- edges: edges,
- })
- return nil
-}
-
-// directCallsTo inspects the whole program and returns a callgraph
-// containing edges for all direct calls to the target function.
-// directCallsTo returns nil if the function is ever address-taken.
-func directCallsTo(target *ssa.Function, entrypoints []*ssa.Function) *callgraph.Graph {
- cg := callgraph.New(nil) // use nil as root *Function
- targetNode := cg.CreateNode(target)
-
- // Is the function a program entry point?
- // If so, add edge from callgraph root.
- for _, f := range entrypoints {
- if f == target {
- callgraph.AddEdge(cg.Root, nil, targetNode)
- }
- }
-
- // Find receiver type (for methods).
- var recvType types.Type
- if recv := target.Signature.Recv(); recv != nil {
- recvType = recv.Type()
- }
-
- // Find all direct calls to function,
- // or a place where its address is taken.
- var space [32]*ssa.Value // preallocate
- for fn := range ssautil.AllFunctions(target.Prog) {
- for _, b := range fn.Blocks {
- for _, instr := range b.Instrs {
- // Is this a method (T).f of a concrete type T
- // whose runtime type descriptor is address-taken?
- // (To be fully sound, we would have to check that
- // the type doesn't make it to reflection as a
- // subelement of some other address-taken type.)
- if recvType != nil {
- if mi, ok := instr.(*ssa.MakeInterface); ok {
- if types.Identical(mi.X.Type(), recvType) {
- return nil // T is address-taken
- }
- if ptr, ok := mi.X.Type().(*types.Pointer); ok &&
- types.Identical(ptr.Elem(), recvType) {
- return nil // *T is address-taken
- }
- }
- }
-
- // Direct call to target?
- rands := instr.Operands(space[:0])
- if site, ok := instr.(ssa.CallInstruction); ok &&
- site.Common().Value == target {
- callgraph.AddEdge(cg.CreateNode(fn), site, targetNode)
- rands = rands[1:] // skip .Value (rands[0])
- }
-
- // Address-taken?
- for _, rand := range rands {
- if rand != nil && *rand == target {
- return nil
- }
- }
- }
- }
- }
-
- return cg
-}
-
-func entryPoints(mains []*ssa.Package) []*ssa.Function {
- var entrypoints []*ssa.Function
- for _, pkg := range mains {
- entrypoints = append(entrypoints, pkg.Func("init"))
- if main := pkg.Func("main"); main != nil && pkg.Pkg.Name() == "main" {
- entrypoints = append(entrypoints, main)
- }
- }
- return entrypoints
-}
-
-type callersResult struct {
- target *ssa.Function
- callgraph *callgraph.Graph
- edges []*callgraph.Edge
-}
-
-func (r *callersResult) PrintPlain(printf printfFunc) {
- root := r.callgraph.Root
- if r.edges == nil {
- printf(r.target, "%s is not reachable in this program.", r.target)
- } else {
- printf(r.target, "%s is called from these %d sites:", r.target, len(r.edges))
- for _, edge := range r.edges {
- if edge.Caller == root {
- printf(r.target, "the root of the call graph")
- } else {
- printf(edge, "\t%s from %s", edge.Description(), edge.Caller.Func)
- }
- }
- }
-}
-
-func (r *callersResult) JSON(fset *token.FileSet) []byte {
- var callers []serial.Caller
- for _, edge := range r.edges {
- callers = append(callers, serial.Caller{
- Caller: edge.Caller.Func.String(),
- Pos: fset.Position(edge.Pos()).String(),
- Desc: edge.Description(),
- })
- }
- return toJSON(callers)
-}
diff --git a/vendor/golang.org/x/tools/cmd/guru/callstack.go b/vendor/golang.org/x/tools/cmd/guru/callstack.go
deleted file mode 100644
index f1ca6a6..0000000
--- a/vendor/golang.org/x/tools/cmd/guru/callstack.go
+++ /dev/null
@@ -1,141 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-import (
- "fmt"
- "go/token"
-
- "golang.org/x/tools/cmd/guru/serial"
- "golang.org/x/tools/go/callgraph"
- "golang.org/x/tools/go/callgraph/static"
- "golang.org/x/tools/go/loader"
- "golang.org/x/tools/go/ssa"
- "golang.org/x/tools/go/ssa/ssautil"
-)
-
-// Callstack displays an arbitrary path from a root of the callgraph
-// to the function at the current position.
-//
-// The information may be misleading in a context-insensitive
-// analysis. e.g. the call path X->Y->Z might be infeasible if Y never
-// calls Z when it is called from X. TODO(adonovan): think about UI.
-//
-// TODO(adonovan): permit user to specify a starting point other than
-// the analysis root.
-//
-func callstack(q *Query) error {
- fset := token.NewFileSet()
- lconf := loader.Config{Fset: fset, Build: q.Build}
-
- if err := setPTAScope(&lconf, q.Scope); err != nil {
- return err
- }
-
- // Load/parse/type-check the program.
- lprog, err := loadWithSoftErrors(&lconf)
- if err != nil {
- return err
- }
-
- qpos, err := parseQueryPos(lprog, q.Pos, false)
- if err != nil {
- return err
- }
-
- prog := ssautil.CreateProgram(lprog, 0)
-
- ptaConfig, err := setupPTA(prog, lprog, q.PTALog, q.Reflection)
- if err != nil {
- return err
- }
-
- pkg := prog.Package(qpos.info.Pkg)
- if pkg == nil {
- return fmt.Errorf("no SSA package")
- }
-
- if !ssa.HasEnclosingFunction(pkg, qpos.path) {
- return fmt.Errorf("this position is not inside a function")
- }
-
- // Defer SSA construction till after errors are reported.
- prog.Build()
-
- target := ssa.EnclosingFunction(pkg, qpos.path)
- if target == nil {
- return fmt.Errorf("no SSA function built for this location (dead code?)")
- }
-
- var callpath []*callgraph.Edge
- isEnd := func(n *callgraph.Node) bool { return n.Func == target }
-
- // First, build a callgraph containing only static call edges,
- // and search for an arbitrary path from a root to the target function.
- // This is quick, and the user wants a static path if one exists.
- cg := static.CallGraph(prog)
- cg.DeleteSyntheticNodes()
- for _, ep := range entryPoints(ptaConfig.Mains) {
- callpath = callgraph.PathSearch(cg.CreateNode(ep), isEnd)
- if callpath != nil {
- break
- }
- }
-
- // No fully static path found.
- // Run the pointer analysis and build a complete call graph.
- if callpath == nil {
- ptaConfig.BuildCallGraph = true
- cg := ptrAnalysis(ptaConfig).CallGraph
- cg.DeleteSyntheticNodes()
- callpath = callgraph.PathSearch(cg.Root, isEnd)
- if callpath != nil {
- callpath = callpath[1:] // remove synthetic edge from
- }
- }
-
- q.Output(fset, &callstackResult{
- qpos: qpos,
- target: target,
- callpath: callpath,
- })
- return nil
-}
-
-type callstackResult struct {
- qpos *queryPos
- target *ssa.Function
- callpath []*callgraph.Edge
-}
-
-func (r *callstackResult) PrintPlain(printf printfFunc) {
- if r.callpath != nil {
- printf(r.qpos, "Found a call path from root to %s", r.target)
- printf(r.target, "%s", r.target)
- for i := len(r.callpath) - 1; i >= 0; i-- {
- edge := r.callpath[i]
- printf(edge, "%s from %s", edge.Description(), edge.Caller.Func)
- }
- } else {
- printf(r.target, "%s is unreachable in this analysis scope", r.target)
- }
-}
-
-func (r *callstackResult) JSON(fset *token.FileSet) []byte {
- var callers []serial.Caller
- for i := len(r.callpath) - 1; i >= 0; i-- { // (innermost first)
- edge := r.callpath[i]
- callers = append(callers, serial.Caller{
- Pos: fset.Position(edge.Pos()).String(),
- Caller: edge.Caller.Func.String(),
- Desc: edge.Description(),
- })
- }
- return toJSON(&serial.CallStack{
- Pos: fset.Position(r.target.Pos()).String(),
- Target: r.target.String(),
- Callers: callers,
- })
-}
diff --git a/vendor/golang.org/x/tools/cmd/guru/definition.go b/vendor/golang.org/x/tools/cmd/guru/definition.go
deleted file mode 100644
index 46d4806..0000000
--- a/vendor/golang.org/x/tools/cmd/guru/definition.go
+++ /dev/null
@@ -1,205 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-import (
- "fmt"
- "go/ast"
- "go/build"
- "go/parser"
- "go/token"
- pathpkg "path"
- "path/filepath"
- "strconv"
-
- "golang.org/x/tools/cmd/guru/serial"
- "golang.org/x/tools/go/buildutil"
- "golang.org/x/tools/go/loader"
-)
-
-// definition reports the location of the definition of an identifier.
-func definition(q *Query) error {
- // First try the simple resolution done by parser.
- // It only works for intra-file references but it is very fast.
- // (Extending this approach to all the files of the package,
- // resolved using ast.NewPackage, was not worth the effort.)
- {
- qpos, err := fastQueryPos(q.Build, q.Pos)
- if err != nil {
- return err
- }
-
- id, _ := qpos.path[0].(*ast.Ident)
- if id == nil {
- return fmt.Errorf("no identifier here")
- }
-
- // Did the parser resolve it to a local object?
- if obj := id.Obj; obj != nil && obj.Pos().IsValid() {
- q.Output(qpos.fset, &definitionResult{
- pos: obj.Pos(),
- descr: fmt.Sprintf("%s %s", obj.Kind, obj.Name),
- })
- return nil // success
- }
-
- // Qualified identifier?
- if pkg := packageForQualIdent(qpos.path, id); pkg != "" {
- srcdir := filepath.Dir(qpos.fset.File(qpos.start).Name())
- tok, pos, err := findPackageMember(q.Build, qpos.fset, srcdir, pkg, id.Name)
- if err != nil {
- return err
- }
- q.Output(qpos.fset, &definitionResult{
- pos: pos,
- descr: fmt.Sprintf("%s %s.%s", tok, pkg, id.Name),
- })
- return nil // success
- }
-
- // Fall back on the type checker.
- }
-
- // Run the type checker.
- lconf := loader.Config{Build: q.Build}
- allowErrors(&lconf)
-
- if _, err := importQueryPackage(q.Pos, &lconf); err != nil {
- return err
- }
-
- // Load/parse/type-check the program.
- lprog, err := lconf.Load()
- if err != nil {
- return err
- }
-
- qpos, err := parseQueryPos(lprog, q.Pos, false)
- if err != nil {
- return err
- }
-
- id, _ := qpos.path[0].(*ast.Ident)
- if id == nil {
- return fmt.Errorf("no identifier here")
- }
-
- // Look up the declaration of this identifier.
- // If id is an anonymous field declaration,
- // it is both a use of a type and a def of a field;
- // prefer the use in that case.
- obj := qpos.info.Uses[id]
- if obj == nil {
- obj = qpos.info.Defs[id]
- if obj == nil {
- // Happens for y in "switch y := x.(type)",
- // and the package declaration,
- // but I think that's all.
- return fmt.Errorf("no object for identifier")
- }
- }
-
- if !obj.Pos().IsValid() {
- return fmt.Errorf("%s is built in", obj.Name())
- }
-
- q.Output(lprog.Fset, &definitionResult{
- pos: obj.Pos(),
- descr: qpos.objectString(obj),
- })
- return nil
-}
-
-// packageForQualIdent returns the package p if id is X in a qualified
-// identifier p.X; it returns "" otherwise.
-//
-// Precondition: id is path[0], and the parser did not resolve id to a
-// local object. For speed, packageForQualIdent assumes that p is a
-// package iff it is the basename of an import path (and not, say, a
-// package-level decl in another file or a predeclared identifier).
-func packageForQualIdent(path []ast.Node, id *ast.Ident) string {
- if sel, ok := path[1].(*ast.SelectorExpr); ok && sel.Sel == id && ast.IsExported(id.Name) {
- if pkgid, ok := sel.X.(*ast.Ident); ok && pkgid.Obj == nil {
- f := path[len(path)-1].(*ast.File)
- for _, imp := range f.Imports {
- path, _ := strconv.Unquote(imp.Path.Value)
- if imp.Name != nil {
- if imp.Name.Name == pkgid.Name {
- return path // renaming import
- }
- } else if pathpkg.Base(path) == pkgid.Name {
- return path // ordinary import
- }
- }
- }
- }
- return ""
-}
-
-// findPackageMember returns the type and position of the declaration of
-// pkg.member by loading and parsing the files of that package.
-// srcdir is the directory in which the import appears.
-func findPackageMember(ctxt *build.Context, fset *token.FileSet, srcdir, pkg, member string) (token.Token, token.Pos, error) {
- bp, err := ctxt.Import(pkg, srcdir, 0)
- if err != nil {
- return 0, token.NoPos, err // no files for package
- }
-
- // TODO(adonovan): opt: parallelize.
- for _, fname := range bp.GoFiles {
- filename := filepath.Join(bp.Dir, fname)
-
- // Parse the file, opening it the file via the build.Context
- // so that we observe the effects of the -modified flag.
- f, _ := buildutil.ParseFile(fset, ctxt, nil, ".", filename, parser.Mode(0))
- if f == nil {
- continue
- }
-
- // Find a package-level decl called 'member'.
- for _, decl := range f.Decls {
- switch decl := decl.(type) {
- case *ast.GenDecl:
- for _, spec := range decl.Specs {
- switch spec := spec.(type) {
- case *ast.ValueSpec:
- // const or var
- for _, id := range spec.Names {
- if id.Name == member {
- return decl.Tok, id.Pos(), nil
- }
- }
- case *ast.TypeSpec:
- if spec.Name.Name == member {
- return token.TYPE, spec.Name.Pos(), nil
- }
- }
- }
- case *ast.FuncDecl:
- if decl.Recv == nil && decl.Name.Name == member {
- return token.FUNC, decl.Name.Pos(), nil
- }
- }
- }
- }
-
- return 0, token.NoPos, fmt.Errorf("couldn't find declaration of %s in %q", member, pkg)
-}
-
-type definitionResult struct {
- pos token.Pos // (nonzero) location of definition
- descr string // description of object it denotes
-}
-
-func (r *definitionResult) PrintPlain(printf printfFunc) {
- printf(r.pos, "defined here as %s", r.descr)
-}
-
-func (r *definitionResult) JSON(fset *token.FileSet) []byte {
- return toJSON(&serial.Definition{
- Desc: r.descr,
- ObjPos: fset.Position(r.pos).String(),
- })
-}
diff --git a/vendor/golang.org/x/tools/cmd/guru/describe.go b/vendor/golang.org/x/tools/cmd/guru/describe.go
deleted file mode 100644
index dd32911..0000000
--- a/vendor/golang.org/x/tools/cmd/guru/describe.go
+++ /dev/null
@@ -1,899 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-import (
- "bytes"
- "fmt"
- "go/ast"
- exact "go/constant"
- "go/token"
- "go/types"
- "os"
- "strings"
- "unicode/utf8"
-
- "golang.org/x/tools/cmd/guru/serial"
- "golang.org/x/tools/go/ast/astutil"
- "golang.org/x/tools/go/loader"
- "golang.org/x/tools/go/types/typeutil"
-)
-
-// describe describes the syntax node denoted by the query position,
-// including:
-// - its syntactic category
-// - the definition of its referent (for identifiers) [now redundant]
-// - its type, fields, and methods (for an expression or type expression)
-//
-func describe(q *Query) error {
- lconf := loader.Config{Build: q.Build}
- allowErrors(&lconf)
-
- if _, err := importQueryPackage(q.Pos, &lconf); err != nil {
- return err
- }
-
- // Load/parse/type-check the program.
- lprog, err := lconf.Load()
- if err != nil {
- return err
- }
-
- qpos, err := parseQueryPos(lprog, q.Pos, true) // (need exact pos)
- if err != nil {
- return err
- }
-
- if false { // debugging
- fprintf(os.Stderr, lprog.Fset, qpos.path[0], "you selected: %s %s",
- astutil.NodeDescription(qpos.path[0]), pathToString(qpos.path))
- }
-
- var qr QueryResult
- path, action := findInterestingNode(qpos.info, qpos.path)
- switch action {
- case actionExpr:
- qr, err = describeValue(qpos, path)
-
- case actionType:
- qr, err = describeType(qpos, path)
-
- case actionPackage:
- qr, err = describePackage(qpos, path)
-
- case actionStmt:
- qr, err = describeStmt(qpos, path)
-
- case actionUnknown:
- qr = &describeUnknownResult{path[0]}
-
- default:
- panic(action) // unreachable
- }
- if err != nil {
- return err
- }
- q.Output(lprog.Fset, qr)
- return nil
-}
-
-type describeUnknownResult struct {
- node ast.Node
-}
-
-func (r *describeUnknownResult) PrintPlain(printf printfFunc) {
- // Nothing much to say about misc syntax.
- printf(r.node, "%s", astutil.NodeDescription(r.node))
-}
-
-func (r *describeUnknownResult) JSON(fset *token.FileSet) []byte {
- return toJSON(&serial.Describe{
- Desc: astutil.NodeDescription(r.node),
- Pos: fset.Position(r.node.Pos()).String(),
- })
-}
-
-type action int
-
-const (
- actionUnknown action = iota // None of the below
- actionExpr // FuncDecl, true Expr or Ident(types.{Const,Var})
- actionType // type Expr or Ident(types.TypeName).
- actionStmt // Stmt or Ident(types.Label)
- actionPackage // Ident(types.Package) or ImportSpec
-)
-
-// findInterestingNode classifies the syntax node denoted by path as one of:
-// - an expression, part of an expression or a reference to a constant
-// or variable;
-// - a type, part of a type, or a reference to a named type;
-// - a statement, part of a statement, or a label referring to a statement;
-// - part of a package declaration or import spec.
-// - none of the above.
-// and returns the most "interesting" associated node, which may be
-// the same node, an ancestor or a descendent.
-//
-func findInterestingNode(pkginfo *loader.PackageInfo, path []ast.Node) ([]ast.Node, action) {
- // TODO(adonovan): integrate with go/types/stdlib_test.go and
- // apply this to every AST node we can find to make sure it
- // doesn't crash.
-
- // TODO(adonovan): audit for ParenExpr safety, esp. since we
- // traverse up and down.
-
- // TODO(adonovan): if the users selects the "." in
- // "fmt.Fprintf()", they'll get an ambiguous selection error;
- // we won't even reach here. Can we do better?
-
- // TODO(adonovan): describing a field within 'type T struct {...}'
- // describes the (anonymous) struct type and concludes "no methods".
- // We should ascend to the enclosing type decl, if any.
-
- for len(path) > 0 {
- switch n := path[0].(type) {
- case *ast.GenDecl:
- if len(n.Specs) == 1 {
- // Descend to sole {Import,Type,Value}Spec child.
- path = append([]ast.Node{n.Specs[0]}, path...)
- continue
- }
- return path, actionUnknown // uninteresting
-
- case *ast.FuncDecl:
- // Descend to function name.
- path = append([]ast.Node{n.Name}, path...)
- continue
-
- case *ast.ImportSpec:
- return path, actionPackage
-
- case *ast.ValueSpec:
- if len(n.Names) == 1 {
- // Descend to sole Ident child.
- path = append([]ast.Node{n.Names[0]}, path...)
- continue
- }
- return path, actionUnknown // uninteresting
-
- case *ast.TypeSpec:
- // Descend to type name.
- path = append([]ast.Node{n.Name}, path...)
- continue
-
- case ast.Stmt:
- return path, actionStmt
-
- case *ast.ArrayType,
- *ast.StructType,
- *ast.FuncType,
- *ast.InterfaceType,
- *ast.MapType,
- *ast.ChanType:
- return path, actionType
-
- case *ast.Comment, *ast.CommentGroup, *ast.File, *ast.KeyValueExpr, *ast.CommClause:
- return path, actionUnknown // uninteresting
-
- case *ast.Ellipsis:
- // Continue to enclosing node.
- // e.g. [...]T in ArrayType
- // f(x...) in CallExpr
- // f(x...T) in FuncType
-
- case *ast.Field:
- // TODO(adonovan): this needs more thought,
- // since fields can be so many things.
- if len(n.Names) == 1 {
- // Descend to sole Ident child.
- path = append([]ast.Node{n.Names[0]}, path...)
- continue
- }
- // Zero names (e.g. anon field in struct)
- // or multiple field or param names:
- // continue to enclosing field list.
-
- case *ast.FieldList:
- // Continue to enclosing node:
- // {Struct,Func,Interface}Type or FuncDecl.
-
- case *ast.BasicLit:
- if _, ok := path[1].(*ast.ImportSpec); ok {
- return path[1:], actionPackage
- }
- return path, actionExpr
-
- case *ast.SelectorExpr:
- // TODO(adonovan): use Selections info directly.
- if pkginfo.Uses[n.Sel] == nil {
- // TODO(adonovan): is this reachable?
- return path, actionUnknown
- }
- // Descend to .Sel child.
- path = append([]ast.Node{n.Sel}, path...)
- continue
-
- case *ast.Ident:
- switch pkginfo.ObjectOf(n).(type) {
- case *types.PkgName:
- return path, actionPackage
-
- case *types.Const:
- return path, actionExpr
-
- case *types.Label:
- return path, actionStmt
-
- case *types.TypeName:
- return path, actionType
-
- case *types.Var:
- // For x in 'struct {x T}', return struct type, for now.
- if _, ok := path[1].(*ast.Field); ok {
- _ = path[2].(*ast.FieldList) // assertion
- if _, ok := path[3].(*ast.StructType); ok {
- return path[3:], actionType
- }
- }
- return path, actionExpr
-
- case *types.Func:
- return path, actionExpr
-
- case *types.Builtin:
- // For reference to built-in function, return enclosing call.
- path = path[1:] // ascend to enclosing function call
- continue
-
- case *types.Nil:
- return path, actionExpr
- }
-
- // No object.
- switch path[1].(type) {
- case *ast.SelectorExpr:
- // Return enclosing selector expression.
- return path[1:], actionExpr
-
- case *ast.Field:
- // TODO(adonovan): test this.
- // e.g. all f in:
- // struct { f, g int }
- // interface { f() }
- // func (f T) method(f, g int) (f, g bool)
- //
- // switch path[3].(type) {
- // case *ast.FuncDecl:
- // case *ast.StructType:
- // case *ast.InterfaceType:
- // }
- //
- // return path[1:], actionExpr
- //
- // Unclear what to do with these.
- // Struct.Fields -- field
- // Interface.Methods -- field
- // FuncType.{Params.Results} -- actionExpr
- // FuncDecl.Recv -- actionExpr
-
- case *ast.File:
- // 'package foo'
- return path, actionPackage
-
- case *ast.ImportSpec:
- return path[1:], actionPackage
-
- default:
- // e.g. blank identifier
- // or y in "switch y := x.(type)"
- // or code in a _test.go file that's not part of the package.
- return path, actionUnknown
- }
-
- case *ast.StarExpr:
- if pkginfo.Types[n].IsType() {
- return path, actionType
- }
- return path, actionExpr
-
- case ast.Expr:
- // All Expr but {BasicLit,Ident,StarExpr} are
- // "true" expressions that evaluate to a value.
- return path, actionExpr
- }
-
- // Ascend to parent.
- path = path[1:]
- }
-
- return nil, actionUnknown // unreachable
-}
-
-func describeValue(qpos *queryPos, path []ast.Node) (*describeValueResult, error) {
- var expr ast.Expr
- var obj types.Object
- switch n := path[0].(type) {
- case *ast.ValueSpec:
- // ambiguous ValueSpec containing multiple names
- return nil, fmt.Errorf("multiple value specification")
- case *ast.Ident:
- obj = qpos.info.ObjectOf(n)
- expr = n
- case ast.Expr:
- expr = n
- default:
- // TODO(adonovan): is this reachable?
- return nil, fmt.Errorf("unexpected AST for expr: %T", n)
- }
-
- typ := qpos.info.TypeOf(expr)
- if typ == nil {
- typ = types.Typ[types.Invalid]
- }
- constVal := qpos.info.Types[expr].Value
- if c, ok := obj.(*types.Const); ok {
- constVal = c.Val()
- }
-
- return &describeValueResult{
- qpos: qpos,
- expr: expr,
- typ: typ,
- constVal: constVal,
- obj: obj,
- methods: accessibleMethods(typ, qpos.info.Pkg),
- fields: accessibleFields(typ, qpos.info.Pkg),
- }, nil
-}
-
-type describeValueResult struct {
- qpos *queryPos
- expr ast.Expr // query node
- typ types.Type // type of expression
- constVal exact.Value // value of expression, if constant
- obj types.Object // var/func/const object, if expr was Ident
- methods []*types.Selection
- fields []describeField
-}
-
-func (r *describeValueResult) PrintPlain(printf printfFunc) {
- var prefix, suffix string
- if r.constVal != nil {
- suffix = fmt.Sprintf(" of value %s", r.constVal)
- }
- switch obj := r.obj.(type) {
- case *types.Func:
- if recv := obj.Type().(*types.Signature).Recv(); recv != nil {
- if _, ok := recv.Type().Underlying().(*types.Interface); ok {
- prefix = "interface method "
- } else {
- prefix = "method "
- }
- }
- }
-
- // Describe the expression.
- if r.obj != nil {
- if r.obj.Pos() == r.expr.Pos() {
- // defining ident
- printf(r.expr, "definition of %s%s%s", prefix, r.qpos.objectString(r.obj), suffix)
- } else {
- // referring ident
- printf(r.expr, "reference to %s%s%s", prefix, r.qpos.objectString(r.obj), suffix)
- if def := r.obj.Pos(); def != token.NoPos {
- printf(def, "defined here")
- }
- }
- } else {
- desc := astutil.NodeDescription(r.expr)
- if suffix != "" {
- // constant expression
- printf(r.expr, "%s%s", desc, suffix)
- } else {
- // non-constant expression
- printf(r.expr, "%s of type %s", desc, r.qpos.typeString(r.typ))
- }
- }
-
- printMethods(printf, r.expr, r.methods)
- printFields(printf, r.expr, r.fields)
-}
-
-func (r *describeValueResult) JSON(fset *token.FileSet) []byte {
- var value, objpos string
- if r.constVal != nil {
- value = r.constVal.String()
- }
- if r.obj != nil {
- objpos = fset.Position(r.obj.Pos()).String()
- }
-
- return toJSON(&serial.Describe{
- Desc: astutil.NodeDescription(r.expr),
- Pos: fset.Position(r.expr.Pos()).String(),
- Detail: "value",
- Value: &serial.DescribeValue{
- Type: r.qpos.typeString(r.typ),
- Value: value,
- ObjPos: objpos,
- },
- })
-}
-
-// ---- TYPE ------------------------------------------------------------
-
-func describeType(qpos *queryPos, path []ast.Node) (*describeTypeResult, error) {
- var description string
- var typ types.Type
- switch n := path[0].(type) {
- case *ast.Ident:
- obj := qpos.info.ObjectOf(n).(*types.TypeName)
- typ = obj.Type()
- if isAlias(obj) {
- description = "alias of "
- } else if obj.Pos() == n.Pos() {
- description = "definition of " // (Named type)
- } else if _, ok := typ.(*types.Basic); ok {
- description = "reference to built-in "
- } else {
- description = "reference to " // (Named type)
- }
-
- case ast.Expr:
- typ = qpos.info.TypeOf(n)
-
- default:
- // Unreachable?
- return nil, fmt.Errorf("unexpected AST for type: %T", n)
- }
-
- description = description + "type " + qpos.typeString(typ)
-
- // Show sizes for structs and named types (it's fairly obvious for others).
- switch typ.(type) {
- case *types.Named, *types.Struct:
- szs := types.StdSizes{WordSize: 8, MaxAlign: 8} // assume amd64
- description = fmt.Sprintf("%s (size %d, align %d)", description,
- szs.Sizeof(typ), szs.Alignof(typ))
- }
-
- return &describeTypeResult{
- qpos: qpos,
- node: path[0],
- description: description,
- typ: typ,
- methods: accessibleMethods(typ, qpos.info.Pkg),
- fields: accessibleFields(typ, qpos.info.Pkg),
- }, nil
-}
-
-type describeTypeResult struct {
- qpos *queryPos
- node ast.Node
- description string
- typ types.Type
- methods []*types.Selection
- fields []describeField
-}
-
-type describeField struct {
- implicits []*types.Named
- field *types.Var
-}
-
-func printMethods(printf printfFunc, node ast.Node, methods []*types.Selection) {
- if len(methods) > 0 {
- printf(node, "Methods:")
- }
- for _, meth := range methods {
- // Print the method type relative to the package
- // in which it was defined, not the query package,
- printf(meth.Obj(), "\t%s",
- types.SelectionString(meth, types.RelativeTo(meth.Obj().Pkg())))
- }
-}
-
-func printFields(printf printfFunc, node ast.Node, fields []describeField) {
- if len(fields) > 0 {
- printf(node, "Fields:")
- }
-
- // Align the names and the types (requires two passes).
- var width int
- var names []string
- for _, f := range fields {
- var buf bytes.Buffer
- for _, fld := range f.implicits {
- buf.WriteString(fld.Obj().Name())
- buf.WriteByte('.')
- }
- buf.WriteString(f.field.Name())
- name := buf.String()
- if n := utf8.RuneCountInString(name); n > width {
- width = n
- }
- names = append(names, name)
- }
-
- for i, f := range fields {
- // Print the field type relative to the package
- // in which it was defined, not the query package,
- printf(f.field, "\t%*s %s", -width, names[i],
- types.TypeString(f.field.Type(), types.RelativeTo(f.field.Pkg())))
- }
-}
-
-func (r *describeTypeResult) PrintPlain(printf printfFunc) {
- printf(r.node, "%s", r.description)
-
- // Show the underlying type for a reference to a named type.
- if nt, ok := r.typ.(*types.Named); ok && r.node.Pos() != nt.Obj().Pos() {
- // TODO(adonovan): improve display of complex struct/interface types.
- printf(nt.Obj(), "defined as %s", r.qpos.typeString(nt.Underlying()))
- }
-
- printMethods(printf, r.node, r.methods)
- if len(r.methods) == 0 {
- // Only report null result for type kinds
- // capable of bearing methods.
- switch r.typ.(type) {
- case *types.Interface, *types.Struct, *types.Named:
- printf(r.node, "No methods.")
- }
- }
-
- printFields(printf, r.node, r.fields)
-}
-
-func (r *describeTypeResult) JSON(fset *token.FileSet) []byte {
- var namePos, nameDef string
- if nt, ok := r.typ.(*types.Named); ok {
- namePos = fset.Position(nt.Obj().Pos()).String()
- nameDef = nt.Underlying().String()
- }
- return toJSON(&serial.Describe{
- Desc: r.description,
- Pos: fset.Position(r.node.Pos()).String(),
- Detail: "type",
- Type: &serial.DescribeType{
- Type: r.qpos.typeString(r.typ),
- NamePos: namePos,
- NameDef: nameDef,
- Methods: methodsToSerial(r.qpos.info.Pkg, r.methods, fset),
- },
- })
-}
-
-// ---- PACKAGE ------------------------------------------------------------
-
-func describePackage(qpos *queryPos, path []ast.Node) (*describePackageResult, error) {
- var description string
- var pkg *types.Package
- switch n := path[0].(type) {
- case *ast.ImportSpec:
- var obj types.Object
- if n.Name != nil {
- obj = qpos.info.Defs[n.Name]
- } else {
- obj = qpos.info.Implicits[n]
- }
- pkgname, _ := obj.(*types.PkgName)
- if pkgname == nil {
- return nil, fmt.Errorf("can't import package %s", n.Path.Value)
- }
- pkg = pkgname.Imported()
- description = fmt.Sprintf("import of package %q", pkg.Path())
-
- case *ast.Ident:
- if _, isDef := path[1].(*ast.File); isDef {
- // e.g. package id
- pkg = qpos.info.Pkg
- description = fmt.Sprintf("definition of package %q", pkg.Path())
- } else {
- // e.g. import id "..."
- // or id.F()
- pkg = qpos.info.ObjectOf(n).(*types.PkgName).Imported()
- description = fmt.Sprintf("reference to package %q", pkg.Path())
- }
-
- default:
- // Unreachable?
- return nil, fmt.Errorf("unexpected AST for package: %T", n)
- }
-
- var members []*describeMember
- // NB: "unsafe" has no types.Package
- if pkg != nil {
- // Enumerate the accessible package members
- // in lexicographic order.
- for _, name := range pkg.Scope().Names() {
- if pkg == qpos.info.Pkg || ast.IsExported(name) {
- mem := pkg.Scope().Lookup(name)
- var methods []*types.Selection
- if mem, ok := mem.(*types.TypeName); ok {
- methods = accessibleMethods(mem.Type(), qpos.info.Pkg)
- }
- members = append(members, &describeMember{
- mem,
- methods,
- })
-
- }
- }
- }
-
- return &describePackageResult{qpos.fset, path[0], description, pkg, members}, nil
-}
-
-type describePackageResult struct {
- fset *token.FileSet
- node ast.Node
- description string
- pkg *types.Package
- members []*describeMember // in lexicographic name order
-}
-
-type describeMember struct {
- obj types.Object
- methods []*types.Selection // in types.MethodSet order
-}
-
-func (r *describePackageResult) PrintPlain(printf printfFunc) {
- printf(r.node, "%s", r.description)
-
- // Compute max width of name "column".
- maxname := 0
- for _, mem := range r.members {
- if l := len(mem.obj.Name()); l > maxname {
- maxname = l
- }
- }
-
- for _, mem := range r.members {
- printf(mem.obj, "\t%s", formatMember(mem.obj, maxname))
- for _, meth := range mem.methods {
- printf(meth.Obj(), "\t\t%s", types.SelectionString(meth, types.RelativeTo(r.pkg)))
- }
- }
-}
-
-func formatMember(obj types.Object, maxname int) string {
- qualifier := types.RelativeTo(obj.Pkg())
- var buf bytes.Buffer
- fmt.Fprintf(&buf, "%-5s %-*s", tokenOf(obj), maxname, obj.Name())
- switch obj := obj.(type) {
- case *types.Const:
- fmt.Fprintf(&buf, " %s = %s", types.TypeString(obj.Type(), qualifier), obj.Val())
-
- case *types.Func:
- fmt.Fprintf(&buf, " %s", types.TypeString(obj.Type(), qualifier))
-
- case *types.TypeName:
- typ := obj.Type()
- if isAlias(obj) {
- buf.WriteString(" = ")
- } else {
- buf.WriteByte(' ')
- typ = typ.Underlying()
- }
- var typestr string
- // Abbreviate long aggregate type names.
- switch typ := typ.(type) {
- case *types.Interface:
- if typ.NumMethods() > 1 {
- typestr = "interface{...}"
- }
- case *types.Struct:
- if typ.NumFields() > 1 {
- typestr = "struct{...}"
- }
- }
- if typestr == "" {
- typestr = types.TypeString(typ, qualifier)
- }
- buf.WriteString(typestr)
-
- case *types.Var:
- fmt.Fprintf(&buf, " %s", types.TypeString(obj.Type(), qualifier))
- }
- return buf.String()
-}
-
-func (r *describePackageResult) JSON(fset *token.FileSet) []byte {
- var members []*serial.DescribeMember
- for _, mem := range r.members {
- obj := mem.obj
- typ := obj.Type()
- var val string
- var alias string
- switch obj := obj.(type) {
- case *types.Const:
- val = obj.Val().String()
- case *types.TypeName:
- if isAlias(obj) {
- alias = "= " // kludgy
- } else {
- typ = typ.Underlying()
- }
- }
- members = append(members, &serial.DescribeMember{
- Name: obj.Name(),
- Type: alias + typ.String(),
- Value: val,
- Pos: fset.Position(obj.Pos()).String(),
- Kind: tokenOf(obj),
- Methods: methodsToSerial(r.pkg, mem.methods, fset),
- })
- }
- return toJSON(&serial.Describe{
- Desc: r.description,
- Pos: fset.Position(r.node.Pos()).String(),
- Detail: "package",
- Package: &serial.DescribePackage{
- Path: r.pkg.Path(),
- Members: members,
- },
- })
-}
-
-func tokenOf(o types.Object) string {
- switch o.(type) {
- case *types.Func:
- return "func"
- case *types.Var:
- return "var"
- case *types.TypeName:
- return "type"
- case *types.Const:
- return "const"
- case *types.PkgName:
- return "package"
- case *types.Builtin:
- return "builtin" // e.g. when describing package "unsafe"
- case *types.Nil:
- return "nil"
- case *types.Label:
- return "label"
- }
- panic(o)
-}
-
-// ---- STATEMENT ------------------------------------------------------------
-
-func describeStmt(qpos *queryPos, path []ast.Node) (*describeStmtResult, error) {
- var description string
- switch n := path[0].(type) {
- case *ast.Ident:
- if qpos.info.Defs[n] != nil {
- description = "labelled statement"
- } else {
- description = "reference to labelled statement"
- }
-
- default:
- // Nothing much to say about statements.
- description = astutil.NodeDescription(n)
- }
- return &describeStmtResult{qpos.fset, path[0], description}, nil
-}
-
-type describeStmtResult struct {
- fset *token.FileSet
- node ast.Node
- description string
-}
-
-func (r *describeStmtResult) PrintPlain(printf printfFunc) {
- printf(r.node, "%s", r.description)
-}
-
-func (r *describeStmtResult) JSON(fset *token.FileSet) []byte {
- return toJSON(&serial.Describe{
- Desc: r.description,
- Pos: fset.Position(r.node.Pos()).String(),
- Detail: "unknown",
- })
-}
-
-// ------------------- Utilities -------------------
-
-// pathToString returns a string containing the concrete types of the
-// nodes in path.
-func pathToString(path []ast.Node) string {
- var buf bytes.Buffer
- fmt.Fprint(&buf, "[")
- for i, n := range path {
- if i > 0 {
- fmt.Fprint(&buf, " ")
- }
- fmt.Fprint(&buf, strings.TrimPrefix(fmt.Sprintf("%T", n), "*ast."))
- }
- fmt.Fprint(&buf, "]")
- return buf.String()
-}
-
-func accessibleMethods(t types.Type, from *types.Package) []*types.Selection {
- var methods []*types.Selection
- for _, meth := range typeutil.IntuitiveMethodSet(t, nil) {
- if isAccessibleFrom(meth.Obj(), from) {
- methods = append(methods, meth)
- }
- }
- return methods
-}
-
-// accessibleFields returns the set of accessible
-// field selections on a value of type recv.
-func accessibleFields(recv types.Type, from *types.Package) []describeField {
- wantField := func(f *types.Var) bool {
- if !isAccessibleFrom(f, from) {
- return false
- }
- // Check that the field is not shadowed.
- obj, _, _ := types.LookupFieldOrMethod(recv, true, f.Pkg(), f.Name())
- return obj == f
- }
-
- var fields []describeField
- var visit func(t types.Type, stack []*types.Named)
- visit = func(t types.Type, stack []*types.Named) {
- tStruct, ok := deref(t).Underlying().(*types.Struct)
- if !ok {
- return
- }
- fieldloop:
- for i := 0; i < tStruct.NumFields(); i++ {
- f := tStruct.Field(i)
-
- // Handle recursion through anonymous fields.
- if f.Anonymous() {
- tf := f.Type()
- if ptr, ok := tf.(*types.Pointer); ok {
- tf = ptr.Elem()
- }
- if named, ok := tf.(*types.Named); ok { // (be defensive)
- // If we've already visited this named type
- // on this path, break the cycle.
- for _, x := range stack {
- if x == named {
- continue fieldloop
- }
- }
- visit(f.Type(), append(stack, named))
- }
- }
-
- // Save accessible fields.
- if wantField(f) {
- fields = append(fields, describeField{
- implicits: append([]*types.Named(nil), stack...),
- field: f,
- })
- }
- }
- }
- visit(recv, nil)
-
- return fields
-}
-
-func isAccessibleFrom(obj types.Object, pkg *types.Package) bool {
- return ast.IsExported(obj.Name()) || obj.Pkg() == pkg
-}
-
-func methodsToSerial(this *types.Package, methods []*types.Selection, fset *token.FileSet) []serial.DescribeMethod {
- qualifier := types.RelativeTo(this)
- var jmethods []serial.DescribeMethod
- for _, meth := range methods {
- var ser serial.DescribeMethod
- if meth != nil { // may contain nils when called by implements (on a method)
- ser = serial.DescribeMethod{
- Name: types.SelectionString(meth, qualifier),
- Pos: fset.Position(meth.Obj().Pos()).String(),
- }
- }
- jmethods = append(jmethods, ser)
- }
- return jmethods
-}
diff --git a/vendor/golang.org/x/tools/cmd/guru/freevars.go b/vendor/golang.org/x/tools/cmd/guru/freevars.go
deleted file mode 100644
index a36d1f8..0000000
--- a/vendor/golang.org/x/tools/cmd/guru/freevars.go
+++ /dev/null
@@ -1,223 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-import (
- "bytes"
- "go/ast"
- "go/printer"
- "go/token"
- "go/types"
- "sort"
-
- "golang.org/x/tools/cmd/guru/serial"
- "golang.org/x/tools/go/loader"
-)
-
-// freevars displays the lexical (not package-level) free variables of
-// the selection.
-//
-// It treats A.B.C as a separate variable from A to reveal the parts
-// of an aggregate type that are actually needed.
-// This aids refactoring.
-//
-// TODO(adonovan): optionally display the free references to
-// file/package scope objects, and to objects from other packages.
-// Depending on where the resulting function abstraction will go,
-// these might be interesting. Perhaps group the results into three
-// bands.
-//
-func freevars(q *Query) error {
- lconf := loader.Config{Build: q.Build}
- allowErrors(&lconf)
-
- if _, err := importQueryPackage(q.Pos, &lconf); err != nil {
- return err
- }
-
- // Load/parse/type-check the program.
- lprog, err := lconf.Load()
- if err != nil {
- return err
- }
-
- qpos, err := parseQueryPos(lprog, q.Pos, false)
- if err != nil {
- return err
- }
-
- file := qpos.path[len(qpos.path)-1] // the enclosing file
- fileScope := qpos.info.Scopes[file]
- pkgScope := fileScope.Parent()
-
- // The id and sel functions return non-nil if they denote an
- // object o or selection o.x.y that is referenced by the
- // selection but defined neither within the selection nor at
- // file scope, i.e. it is in the lexical environment.
- var id func(n *ast.Ident) types.Object
- var sel func(n *ast.SelectorExpr) types.Object
-
- sel = func(n *ast.SelectorExpr) types.Object {
- switch x := unparen(n.X).(type) {
- case *ast.SelectorExpr:
- return sel(x)
- case *ast.Ident:
- return id(x)
- }
- return nil
- }
-
- id = func(n *ast.Ident) types.Object {
- obj := qpos.info.Uses[n]
- if obj == nil {
- return nil // not a reference
- }
- if _, ok := obj.(*types.PkgName); ok {
- return nil // imported package
- }
- if !(file.Pos() <= obj.Pos() && obj.Pos() <= file.End()) {
- return nil // not defined in this file
- }
- scope := obj.Parent()
- if scope == nil {
- return nil // e.g. interface method, struct field
- }
- if scope == fileScope || scope == pkgScope {
- return nil // defined at file or package scope
- }
- if qpos.start <= obj.Pos() && obj.Pos() <= qpos.end {
- return nil // defined within selection => not free
- }
- return obj
- }
-
- // Maps each reference that is free in the selection
- // to the object it refers to.
- // The map de-duplicates repeated references.
- refsMap := make(map[string]freevarsRef)
-
- // Visit all the identifiers in the selected ASTs.
- ast.Inspect(qpos.path[0], func(n ast.Node) bool {
- if n == nil {
- return true // popping DFS stack
- }
-
- // Is this node contained within the selection?
- // (freevars permits inexact selections,
- // like two stmts in a block.)
- if qpos.start <= n.Pos() && n.End() <= qpos.end {
- var obj types.Object
- var prune bool
- switch n := n.(type) {
- case *ast.Ident:
- obj = id(n)
-
- case *ast.SelectorExpr:
- obj = sel(n)
- prune = true
- }
-
- if obj != nil {
- var kind string
- switch obj.(type) {
- case *types.Var:
- kind = "var"
- case *types.Func:
- kind = "func"
- case *types.TypeName:
- kind = "type"
- case *types.Const:
- kind = "const"
- case *types.Label:
- kind = "label"
- default:
- panic(obj)
- }
-
- typ := qpos.info.TypeOf(n.(ast.Expr))
- ref := freevarsRef{kind, printNode(lprog.Fset, n), typ, obj}
- refsMap[ref.ref] = ref
-
- if prune {
- return false // don't descend
- }
- }
- }
-
- return true // descend
- })
-
- refs := make([]freevarsRef, 0, len(refsMap))
- for _, ref := range refsMap {
- refs = append(refs, ref)
- }
- sort.Sort(byRef(refs))
-
- q.Output(lprog.Fset, &freevarsResult{
- qpos: qpos,
- refs: refs,
- })
- return nil
-}
-
-type freevarsResult struct {
- qpos *queryPos
- refs []freevarsRef
-}
-
-type freevarsRef struct {
- kind string
- ref string
- typ types.Type
- obj types.Object
-}
-
-func (r *freevarsResult) PrintPlain(printf printfFunc) {
- if len(r.refs) == 0 {
- printf(r.qpos, "No free identifiers.")
- } else {
- printf(r.qpos, "Free identifiers:")
- qualifier := types.RelativeTo(r.qpos.info.Pkg)
- for _, ref := range r.refs {
- // Avoid printing "type T T".
- var typstr string
- if ref.kind != "type" && ref.kind != "label" {
- typstr = " " + types.TypeString(ref.typ, qualifier)
- }
- printf(ref.obj, "%s %s%s", ref.kind, ref.ref, typstr)
- }
- }
-}
-
-func (r *freevarsResult) JSON(fset *token.FileSet) []byte {
- var buf bytes.Buffer
- for i, ref := range r.refs {
- if i > 0 {
- buf.WriteByte('\n')
- }
- buf.Write(toJSON(serial.FreeVar{
- Pos: fset.Position(ref.obj.Pos()).String(),
- Kind: ref.kind,
- Ref: ref.ref,
- Type: ref.typ.String(),
- }))
- }
- return buf.Bytes()
-}
-
-// -------- utils --------
-
-type byRef []freevarsRef
-
-func (p byRef) Len() int { return len(p) }
-func (p byRef) Less(i, j int) bool { return p[i].ref < p[j].ref }
-func (p byRef) Swap(i, j int) { p[i], p[j] = p[j], p[i] }
-
-// printNode returns the pretty-printed syntax of n.
-func printNode(fset *token.FileSet, n ast.Node) string {
- var buf bytes.Buffer
- printer.Fprint(&buf, fset, n)
- return buf.String()
-}
diff --git a/vendor/golang.org/x/tools/cmd/guru/guru.go b/vendor/golang.org/x/tools/cmd/guru/guru.go
deleted file mode 100644
index af3a27d..0000000
--- a/vendor/golang.org/x/tools/cmd/guru/guru.go
+++ /dev/null
@@ -1,401 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-// TODO(adonovan): new queries
-// - show all statements that may update the selected lvalue
-// (local, global, field, etc).
-// - show all places where an object of type T is created
-// (&T{}, var t T, new(T), new(struct{array [3]T}), etc.
-
-import (
- "encoding/json"
- "fmt"
- "go/ast"
- "go/build"
- "go/parser"
- "go/token"
- "go/types"
- "io"
- "log"
- "path/filepath"
- "strings"
-
- "golang.org/x/tools/go/ast/astutil"
- "golang.org/x/tools/go/buildutil"
- "golang.org/x/tools/go/loader"
- "golang.org/x/tools/go/pointer"
- "golang.org/x/tools/go/ssa"
-)
-
-type printfFunc func(pos interface{}, format string, args ...interface{})
-
-// A QueryResult is an item of output. Each query produces a stream of
-// query results, calling Query.Output for each one.
-type QueryResult interface {
- // JSON returns the QueryResult in JSON form.
- JSON(fset *token.FileSet) []byte
-
- // PrintPlain prints the QueryResult in plain text form.
- // The implementation calls printfFunc to print each line of output.
- PrintPlain(printf printfFunc)
-}
-
-// A QueryPos represents the position provided as input to a query:
-// a textual extent in the program's source code, the AST node it
-// corresponds to, and the package to which it belongs.
-// Instances are created by parseQueryPos.
-type queryPos struct {
- fset *token.FileSet
- start, end token.Pos // source extent of query
- path []ast.Node // AST path from query node to root of ast.File
- exact bool // 2nd result of PathEnclosingInterval
- info *loader.PackageInfo // type info for the queried package (nil for fastQueryPos)
-}
-
-// TypeString prints type T relative to the query position.
-func (qpos *queryPos) typeString(T types.Type) string {
- return types.TypeString(T, types.RelativeTo(qpos.info.Pkg))
-}
-
-// ObjectString prints object obj relative to the query position.
-func (qpos *queryPos) objectString(obj types.Object) string {
- return types.ObjectString(obj, types.RelativeTo(qpos.info.Pkg))
-}
-
-// A Query specifies a single guru query.
-type Query struct {
- Pos string // query position
- Build *build.Context // package loading configuration
-
- // pointer analysis options
- Scope []string // main packages in (*loader.Config).FromArgs syntax
- PTALog io.Writer // (optional) pointer-analysis log file
- Reflection bool // model reflection soundly (currently slow).
-
- // result-printing function
- Output func(*token.FileSet, QueryResult)
-}
-
-// Run runs an guru query and populates its Fset and Result.
-func Run(mode string, q *Query) error {
- switch mode {
- case "callees":
- return callees(q)
- case "callers":
- return callers(q)
- case "callstack":
- return callstack(q)
- case "peers":
- return peers(q)
- case "pointsto":
- return pointsto(q)
- case "whicherrs":
- return whicherrs(q)
- case "definition":
- return definition(q)
- case "describe":
- return describe(q)
- case "freevars":
- return freevars(q)
- case "implements":
- return implements(q)
- case "referrers":
- return referrers(q)
- case "what":
- return what(q)
- default:
- return fmt.Errorf("invalid mode: %q", mode)
- }
-}
-
-func setPTAScope(lconf *loader.Config, scope []string) error {
- pkgs := buildutil.ExpandPatterns(lconf.Build, scope)
- if len(pkgs) == 0 {
- return fmt.Errorf("no packages specified for pointer analysis scope")
- }
- // The value of each entry in pkgs is true,
- // giving ImportWithTests (not Import) semantics.
- lconf.ImportPkgs = pkgs
- return nil
-}
-
-// Create a pointer.Config whose scope is the initial packages of lprog
-// and their dependencies.
-func setupPTA(prog *ssa.Program, lprog *loader.Program, ptaLog io.Writer, reflection bool) (*pointer.Config, error) {
- // For each initial package (specified on the command line),
- // if it has a main function, analyze that,
- // otherwise analyze its tests, if any.
- var mains []*ssa.Package
- for _, info := range lprog.InitialPackages() {
- p := prog.Package(info.Pkg)
-
- // Add package to the pointer analysis scope.
- if p.Pkg.Name() == "main" && p.Func("main") != nil {
- mains = append(mains, p)
- } else if main := prog.CreateTestMainPackage(p); main != nil {
- mains = append(mains, main)
- }
- }
- if mains == nil {
- return nil, fmt.Errorf("analysis scope has no main and no tests")
- }
- return &pointer.Config{
- Log: ptaLog,
- Reflection: reflection,
- Mains: mains,
- }, nil
-}
-
-// importQueryPackage finds the package P containing the
-// query position and tells conf to import it.
-// It returns the package's path.
-func importQueryPackage(pos string, conf *loader.Config) (string, error) {
- fqpos, err := fastQueryPos(conf.Build, pos)
- if err != nil {
- return "", err // bad query
- }
- filename := fqpos.fset.File(fqpos.start).Name()
-
- _, importPath, err := guessImportPath(filename, conf.Build)
- if err != nil {
- // Can't find GOPATH dir.
- // Treat the query file as its own package.
- importPath = "command-line-arguments"
- conf.CreateFromFilenames(importPath, filename)
- } else {
- // Check that it's possible to load the queried package.
- // (e.g. guru tests contain different 'package' decls in same dir.)
- // Keep consistent with logic in loader/util.go!
- cfg2 := *conf.Build
- cfg2.CgoEnabled = false
- bp, err := cfg2.Import(importPath, "", 0)
- if err != nil {
- return "", err // no files for package
- }
-
- switch pkgContainsFile(bp, filename) {
- case 'T':
- conf.ImportWithTests(importPath)
- case 'X':
- conf.ImportWithTests(importPath)
- importPath += "_test" // for TypeCheckFuncBodies
- case 'G':
- conf.Import(importPath)
- default:
- // This happens for ad-hoc packages like
- // $GOROOT/src/net/http/triv.go.
- return "", fmt.Errorf("package %q doesn't contain file %s",
- importPath, filename)
- }
- }
-
- conf.TypeCheckFuncBodies = func(p string) bool { return p == importPath }
-
- return importPath, nil
-}
-
-// pkgContainsFile reports whether file was among the packages Go
-// files, Test files, eXternal test files, or not found.
-func pkgContainsFile(bp *build.Package, filename string) byte {
- for i, files := range [][]string{bp.GoFiles, bp.TestGoFiles, bp.XTestGoFiles} {
- for _, file := range files {
- if sameFile(filepath.Join(bp.Dir, file), filename) {
- return "GTX"[i]
- }
- }
- }
- return 0 // not found
-}
-
-// ParseQueryPos parses the source query position pos and returns the
-// AST node of the loaded program lprog that it identifies.
-// If needExact, it must identify a single AST subtree;
-// this is appropriate for queries that allow fairly arbitrary syntax,
-// e.g. "describe".
-//
-func parseQueryPos(lprog *loader.Program, pos string, needExact bool) (*queryPos, error) {
- filename, startOffset, endOffset, err := parsePos(pos)
- if err != nil {
- return nil, err
- }
-
- // Find the named file among those in the loaded program.
- var file *token.File
- lprog.Fset.Iterate(func(f *token.File) bool {
- if sameFile(filename, f.Name()) {
- file = f
- return false // done
- }
- return true // continue
- })
- if file == nil {
- return nil, fmt.Errorf("file %s not found in loaded program", filename)
- }
-
- start, end, err := fileOffsetToPos(file, startOffset, endOffset)
- if err != nil {
- return nil, err
- }
- info, path, exact := lprog.PathEnclosingInterval(start, end)
- if path == nil {
- return nil, fmt.Errorf("no syntax here")
- }
- if needExact && !exact {
- return nil, fmt.Errorf("ambiguous selection within %s", astutil.NodeDescription(path[0]))
- }
- return &queryPos{lprog.Fset, start, end, path, exact, info}, nil
-}
-
-// ---------- Utilities ----------
-
-// loadWithSoftErrors calls lconf.Load, suppressing "soft" errors. (See Go issue 16530.)
-// TODO(adonovan): Once the loader has an option to allow soft errors,
-// replace calls to loadWithSoftErrors with loader calls with that parameter.
-func loadWithSoftErrors(lconf *loader.Config) (*loader.Program, error) {
- lconf.AllowErrors = true
-
- // Ideally we would just return conf.Load() here, but go/types
- // reports certain "soft" errors that gc does not (Go issue 14596).
- // As a workaround, we set AllowErrors=true and then duplicate
- // the loader's error checking but allow soft errors.
- // It would be nice if the loader API permitted "AllowErrors: soft".
- prog, err := lconf.Load()
- if err != nil {
- return nil, err
- }
- var errpkgs []string
- // Report hard errors in indirectly imported packages.
- for _, info := range prog.AllPackages {
- if containsHardErrors(info.Errors) {
- errpkgs = append(errpkgs, info.Pkg.Path())
- } else {
- // Enable SSA construction for packages containing only soft errors.
- info.TransitivelyErrorFree = true
- }
- }
- if errpkgs != nil {
- var more string
- if len(errpkgs) > 3 {
- more = fmt.Sprintf(" and %d more", len(errpkgs)-3)
- errpkgs = errpkgs[:3]
- }
- return nil, fmt.Errorf("couldn't load packages due to errors: %s%s",
- strings.Join(errpkgs, ", "), more)
- }
- return prog, err
-}
-
-func containsHardErrors(errors []error) bool {
- for _, err := range errors {
- if err, ok := err.(types.Error); ok && err.Soft {
- continue
- }
- return true
- }
- return false
-}
-
-// allowErrors causes type errors to be silently ignored.
-// (Not suitable if SSA construction follows.)
-func allowErrors(lconf *loader.Config) {
- ctxt := *lconf.Build // copy
- ctxt.CgoEnabled = false
- lconf.Build = &ctxt
- lconf.AllowErrors = true
- // AllErrors makes the parser always return an AST instead of
- // bailing out after 10 errors and returning an empty ast.File.
- lconf.ParserMode = parser.AllErrors
- lconf.TypeChecker.Error = func(err error) {}
-}
-
-// ptrAnalysis runs the pointer analysis and returns its result.
-func ptrAnalysis(conf *pointer.Config) *pointer.Result {
- result, err := pointer.Analyze(conf)
- if err != nil {
- panic(err) // pointer analysis internal error
- }
- return result
-}
-
-func unparen(e ast.Expr) ast.Expr { return astutil.Unparen(e) }
-
-// deref returns a pointer's element type; otherwise it returns typ.
-func deref(typ types.Type) types.Type {
- if p, ok := typ.Underlying().(*types.Pointer); ok {
- return p.Elem()
- }
- return typ
-}
-
-// fprintf prints to w a message of the form "location: message\n"
-// where location is derived from pos.
-//
-// pos must be one of:
-// - a token.Pos, denoting a position
-// - an ast.Node, denoting an interval
-// - anything with a Pos() method:
-// ssa.Member, ssa.Value, ssa.Instruction, types.Object, pointer.Label, etc.
-// - a QueryPos, denoting the extent of the user's query.
-// - nil, meaning no position at all.
-//
-// The output format is is compatible with the 'gnu'
-// compilation-error-regexp in Emacs' compilation mode.
-//
-func fprintf(w io.Writer, fset *token.FileSet, pos interface{}, format string, args ...interface{}) {
- var start, end token.Pos
- switch pos := pos.(type) {
- case ast.Node:
- start = pos.Pos()
- end = pos.End()
- case token.Pos:
- start = pos
- end = start
- case *types.PkgName:
- // The Pos of most PkgName objects does not coincide with an identifier,
- // so we suppress the usual start+len(name) heuristic for types.Objects.
- start = pos.Pos()
- end = start
- case types.Object:
- start = pos.Pos()
- end = start + token.Pos(len(pos.Name())) // heuristic
- case interface {
- Pos() token.Pos
- }:
- start = pos.Pos()
- end = start
- case *queryPos:
- start = pos.start
- end = pos.end
- case nil:
- // no-op
- default:
- panic(fmt.Sprintf("invalid pos: %T", pos))
- }
-
- if sp := fset.Position(start); start == end {
- // (prints "-: " for token.NoPos)
- fmt.Fprintf(w, "%s: ", sp)
- } else {
- ep := fset.Position(end)
- // The -1 below is a concession to Emacs's broken use of
- // inclusive (not half-open) intervals.
- // Other editors may not want it.
- // TODO(adonovan): add an -editor=vim|emacs|acme|auto
- // flag; auto uses EMACS=t / VIM=... / etc env vars.
- fmt.Fprintf(w, "%s:%d.%d-%d.%d: ",
- sp.Filename, sp.Line, sp.Column, ep.Line, ep.Column-1)
- }
- fmt.Fprintf(w, format, args...)
- io.WriteString(w, "\n")
-}
-
-func toJSON(x interface{}) []byte {
- b, err := json.MarshalIndent(x, "", "\t")
- if err != nil {
- log.Fatalf("JSON error: %v", err)
- }
- return b
-}
diff --git a/vendor/golang.org/x/tools/cmd/guru/guru_test.go b/vendor/golang.org/x/tools/cmd/guru/guru_test.go
deleted file mode 100644
index 3432255..0000000
--- a/vendor/golang.org/x/tools/cmd/guru/guru_test.go
+++ /dev/null
@@ -1,329 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main_test
-
-// This file defines a test framework for guru queries.
-//
-// The files beneath testdata/src/main contain Go programs containing
-// query annotations of the form:
-//
-// @verb id "select"
-//
-// where verb is the query mode (e.g. "callers"), id is a unique name
-// for this query, and "select" is a regular expression matching the
-// substring of the current line that is the query's input selection.
-//
-// The expected output for each query is provided in the accompanying
-// .golden file.
-//
-// (Location information is not included because it's too fragile to
-// display as text. TODO(adonovan): think about how we can test its
-// correctness, since it is critical information.)
-//
-// Run this test with:
-// % go test golang.org/x/tools/cmd/guru -update
-// to update the golden files.
-
-import (
- "bytes"
- "flag"
- "fmt"
- "go/build"
- "go/parser"
- "go/token"
- "io"
- "io/ioutil"
- "os"
- "os/exec"
- "path/filepath"
- "regexp"
- "runtime"
- "sort"
- "strconv"
- "strings"
- "sync"
- "testing"
-
- guru "golang.org/x/tools/cmd/guru"
-)
-
-var updateFlag = flag.Bool("update", false, "Update the golden files.")
-
-type query struct {
- id string // unique id
- verb string // query mode, e.g. "callees"
- posn token.Position // query position
- filename string
- queryPos string // query position in command-line syntax
-}
-
-func parseRegexp(text string) (*regexp.Regexp, error) {
- pattern, err := strconv.Unquote(text)
- if err != nil {
- return nil, fmt.Errorf("can't unquote %s", text)
- }
- return regexp.Compile(pattern)
-}
-
-// parseQueries parses and returns the queries in the named file.
-func parseQueries(t *testing.T, filename string) []*query {
- filedata, err := ioutil.ReadFile(filename)
- if err != nil {
- t.Fatal(err)
- }
-
- // Parse the file once to discover the test queries.
- fset := token.NewFileSet()
- f, err := parser.ParseFile(fset, filename, filedata, parser.ParseComments)
- if err != nil {
- t.Fatal(err)
- }
-
- lines := bytes.Split(filedata, []byte("\n"))
-
- var queries []*query
- queriesById := make(map[string]*query)
-
- // Find all annotations of these forms:
- expectRe := regexp.MustCompile(`@([a-z]+)\s+(\S+)\s+(\".*)$`) // @verb id "regexp"
- for _, c := range f.Comments {
- text := strings.TrimSpace(c.Text())
- if text == "" || text[0] != '@' {
- continue
- }
- posn := fset.Position(c.Pos())
-
- // @verb id "regexp"
- match := expectRe.FindStringSubmatch(text)
- if match == nil {
- t.Errorf("%s: ill-formed query: %s", posn, text)
- continue
- }
-
- id := match[2]
- if prev, ok := queriesById[id]; ok {
- t.Errorf("%s: duplicate id %s", posn, id)
- t.Errorf("%s: previously used here", prev.posn)
- continue
- }
-
- q := &query{
- id: id,
- verb: match[1],
- filename: filename,
- posn: posn,
- }
-
- if match[3] != `"nopos"` {
- selectRe, err := parseRegexp(match[3])
- if err != nil {
- t.Errorf("%s: %s", posn, err)
- continue
- }
-
- // Find text of the current line, sans query.
- // (Queries must be // not /**/ comments.)
- line := lines[posn.Line-1][:posn.Column-1]
-
- // Apply regexp to current line to find input selection.
- loc := selectRe.FindIndex(line)
- if loc == nil {
- t.Errorf("%s: selection pattern %s doesn't match line %q",
- posn, match[3], string(line))
- continue
- }
-
- // Assumes ASCII. TODO(adonovan): test on UTF-8.
- linestart := posn.Offset - (posn.Column - 1)
-
- // Compute the file offsets.
- q.queryPos = fmt.Sprintf("%s:#%d,#%d",
- filename, linestart+loc[0], linestart+loc[1])
- }
-
- queries = append(queries, q)
- queriesById[id] = q
- }
-
- // Return the slice, not map, for deterministic iteration.
- return queries
-}
-
-// doQuery poses query q to the guru and writes its response and
-// error (if any) to out.
-func doQuery(out io.Writer, q *query, json bool) {
- fmt.Fprintf(out, "-------- @%s %s --------\n", q.verb, q.id)
-
- var buildContext = build.Default
- buildContext.GOPATH = "testdata"
- pkg := filepath.Dir(strings.TrimPrefix(q.filename, "testdata/src/"))
-
- gopathAbs, _ := filepath.Abs(buildContext.GOPATH)
-
- var outputMu sync.Mutex // guards outputs
- var outputs []string // JSON objects or lines of text
- outputFn := func(fset *token.FileSet, qr guru.QueryResult) {
- outputMu.Lock()
- defer outputMu.Unlock()
- if json {
- jsonstr := string(qr.JSON(fset))
- // Sanitize any absolute filenames that creep in.
- jsonstr = strings.Replace(jsonstr, gopathAbs, "$GOPATH", -1)
- outputs = append(outputs, jsonstr)
- } else {
- // suppress position information
- qr.PrintPlain(func(_ interface{}, format string, args ...interface{}) {
- outputs = append(outputs, fmt.Sprintf(format, args...))
- })
- }
- }
-
- query := guru.Query{
- Pos: q.queryPos,
- Build: &buildContext,
- Scope: []string{pkg},
- Reflection: true,
- Output: outputFn,
- }
-
- if err := guru.Run(q.verb, &query); err != nil {
- fmt.Fprintf(out, "\nError: %s\n", err)
- return
- }
-
- // In a "referrers" query, references are sorted within each
- // package but packages are visited in arbitrary order,
- // so for determinism we sort them. Line 0 is a caption.
- if q.verb == "referrers" {
- sort.Strings(outputs[1:])
- }
-
- for _, output := range outputs {
- fmt.Fprintf(out, "%s\n", output)
- }
-
- if !json {
- io.WriteString(out, "\n")
- }
-}
-
-func TestGuru(t *testing.T) {
- switch runtime.GOOS {
- case "android":
- t.Skipf("skipping test on %q (no testdata dir)", runtime.GOOS)
- case "windows":
- t.Skipf("skipping test on %q (no /usr/bin/diff)", runtime.GOOS)
- }
-
- for _, filename := range []string{
- "testdata/src/alias/alias.go", // iff guru.HasAlias (go1.9)
- "testdata/src/calls/main.go",
- "testdata/src/describe/main.go",
- "testdata/src/describe/main19.go", // iff go1.9
- "testdata/src/freevars/main.go",
- "testdata/src/implements/main.go",
- "testdata/src/implements-methods/main.go",
- "testdata/src/imports/main.go",
- "testdata/src/peers/main.go",
- "testdata/src/pointsto/main.go",
- "testdata/src/referrers/main.go",
- "testdata/src/reflection/main.go",
- "testdata/src/what/main.go",
- "testdata/src/whicherrs/main.go",
- "testdata/src/softerrs/main.go",
- // JSON:
- // TODO(adonovan): most of these are very similar; combine them.
- "testdata/src/calls-json/main.go",
- "testdata/src/peers-json/main.go",
- "testdata/src/definition-json/main.go",
- "testdata/src/definition-json/main19.go",
- "testdata/src/describe-json/main.go",
- "testdata/src/implements-json/main.go",
- "testdata/src/implements-methods-json/main.go",
- "testdata/src/pointsto-json/main.go",
- "testdata/src/referrers-json/main.go",
- "testdata/src/what-json/main.go",
- } {
- if filename == "testdata/src/referrers/main.go" && runtime.GOOS == "plan9" {
- // Disable this test on plan9 since it expects a particular
- // wording for a "no such file or directory" error.
- continue
- }
- if filename == "testdata/src/alias/alias.go" && !guru.HasAlias {
- continue
- }
- if strings.HasSuffix(filename, "19.go") && !contains(build.Default.ReleaseTags, "go1.9") {
- // TODO(adonovan): recombine the 'describe' and 'definition'
- // tests once we drop support for go1.8.
- continue
- }
-
- json := strings.Contains(filename, "-json/")
- queries := parseQueries(t, filename)
- golden := filename + "lden"
- got := filename + "t"
- gotfh, err := os.Create(got)
- if err != nil {
- t.Errorf("Create(%s) failed: %s", got, err)
- continue
- }
- defer os.Remove(got)
- defer gotfh.Close()
-
- // Run the guru on each query, redirecting its output
- // and error (if any) to the foo.got file.
- for _, q := range queries {
- doQuery(gotfh, q, json)
- }
-
- // Compare foo.got with foo.golden.
- var cmd *exec.Cmd
- switch runtime.GOOS {
- case "plan9":
- cmd = exec.Command("/bin/diff", "-c", golden, got)
- default:
- cmd = exec.Command("/usr/bin/diff", "-u", golden, got)
- }
- buf := new(bytes.Buffer)
- cmd.Stdout = buf
- cmd.Stderr = os.Stderr
- if err := cmd.Run(); err != nil {
- t.Errorf("Guru tests for %s failed: %s.\n%s\n",
- filename, err, buf)
-
- if *updateFlag {
- t.Logf("Updating %s...", golden)
- if err := exec.Command("/bin/cp", got, golden).Run(); err != nil {
- t.Errorf("Update failed: %s", err)
- }
- }
- }
- }
-}
-
-func contains(haystack []string, needle string) bool {
- for _, x := range haystack {
- if needle == x {
- return true
- }
- }
- return false
-}
-
-func TestIssue14684(t *testing.T) {
- var buildContext = build.Default
- buildContext.GOPATH = "testdata"
- query := guru.Query{
- Pos: "testdata/src/README.txt:#1",
- Build: &buildContext,
- }
- err := guru.Run("freevars", &query)
- if err == nil {
- t.Fatal("guru query succeeded unexpectedly")
- }
- if got, want := err.Error(), "testdata/src/README.txt is not a Go source file"; got != want {
- t.Errorf("query error was %q, want %q", got, want)
- }
-}
diff --git a/vendor/golang.org/x/tools/cmd/guru/implements.go b/vendor/golang.org/x/tools/cmd/guru/implements.go
deleted file mode 100644
index 2d89b2d..0000000
--- a/vendor/golang.org/x/tools/cmd/guru/implements.go
+++ /dev/null
@@ -1,364 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-import (
- "fmt"
- "go/ast"
- "go/token"
- "go/types"
- "reflect"
- "sort"
- "strings"
-
- "golang.org/x/tools/cmd/guru/serial"
- "golang.org/x/tools/go/loader"
- "golang.org/x/tools/go/types/typeutil"
- "golang.org/x/tools/refactor/importgraph"
-)
-
-// Implements displays the "implements" relation as it pertains to the
-// selected type.
-// If the selection is a method, 'implements' displays
-// the corresponding methods of the types that would have been reported
-// by an implements query on the receiver type.
-//
-func implements(q *Query) error {
- lconf := loader.Config{Build: q.Build}
- allowErrors(&lconf)
-
- qpkg, err := importQueryPackage(q.Pos, &lconf)
- if err != nil {
- return err
- }
-
- // Set the packages to search.
- if len(q.Scope) > 0 {
- // Inspect all packages in the analysis scope, if specified.
- if err := setPTAScope(&lconf, q.Scope); err != nil {
- return err
- }
- } else {
- // Otherwise inspect the forward and reverse
- // transitive closure of the selected package.
- // (In theory even this is incomplete.)
- _, rev, _ := importgraph.Build(q.Build)
- for path := range rev.Search(qpkg) {
- lconf.ImportWithTests(path)
- }
-
- // TODO(adonovan): for completeness, we should also
- // type-check and inspect function bodies in all
- // imported packages. This would be expensive, but we
- // could optimize by skipping functions that do not
- // contain type declarations. This would require
- // changing the loader's TypeCheckFuncBodies hook to
- // provide the []*ast.File.
- }
-
- // Load/parse/type-check the program.
- lprog, err := lconf.Load()
- if err != nil {
- return err
- }
-
- qpos, err := parseQueryPos(lprog, q.Pos, false)
- if err != nil {
- return err
- }
-
- // Find the selected type.
- path, action := findInterestingNode(qpos.info, qpos.path)
-
- var method *types.Func
- var T types.Type // selected type (receiver if method != nil)
-
- switch action {
- case actionExpr:
- // method?
- if id, ok := path[0].(*ast.Ident); ok {
- if obj, ok := qpos.info.ObjectOf(id).(*types.Func); ok {
- recv := obj.Type().(*types.Signature).Recv()
- if recv == nil {
- return fmt.Errorf("this function is not a method")
- }
- method = obj
- T = recv.Type()
- }
- }
-
- // If not a method, use the expression's type.
- if T == nil {
- T = qpos.info.TypeOf(path[0].(ast.Expr))
- }
-
- case actionType:
- T = qpos.info.TypeOf(path[0].(ast.Expr))
- }
- if T == nil {
- return fmt.Errorf("not a type, method, or value")
- }
-
- // Find all named types, even local types (which can have
- // methods due to promotion) and the built-in "error".
- // We ignore aliases 'type M = N' to avoid duplicate
- // reporting of the Named type N.
- var allNamed []*types.Named
- for _, info := range lprog.AllPackages {
- for _, obj := range info.Defs {
- if obj, ok := obj.(*types.TypeName); ok && !isAlias(obj) {
- if named, ok := obj.Type().(*types.Named); ok {
- allNamed = append(allNamed, named)
- }
- }
- }
- }
- allNamed = append(allNamed, types.Universe.Lookup("error").Type().(*types.Named))
-
- var msets typeutil.MethodSetCache
-
- // Test each named type.
- var to, from, fromPtr []types.Type
- for _, U := range allNamed {
- if isInterface(T) {
- if msets.MethodSet(T).Len() == 0 {
- continue // empty interface
- }
- if isInterface(U) {
- if msets.MethodSet(U).Len() == 0 {
- continue // empty interface
- }
-
- // T interface, U interface
- if !types.Identical(T, U) {
- if types.AssignableTo(U, T) {
- to = append(to, U)
- }
- if types.AssignableTo(T, U) {
- from = append(from, U)
- }
- }
- } else {
- // T interface, U concrete
- if types.AssignableTo(U, T) {
- to = append(to, U)
- } else if pU := types.NewPointer(U); types.AssignableTo(pU, T) {
- to = append(to, pU)
- }
- }
- } else if isInterface(U) {
- if msets.MethodSet(U).Len() == 0 {
- continue // empty interface
- }
-
- // T concrete, U interface
- if types.AssignableTo(T, U) {
- from = append(from, U)
- } else if pT := types.NewPointer(T); types.AssignableTo(pT, U) {
- fromPtr = append(fromPtr, U)
- }
- }
- }
-
- var pos interface{} = qpos
- if nt, ok := deref(T).(*types.Named); ok {
- pos = nt.Obj()
- }
-
- // Sort types (arbitrarily) to ensure test determinism.
- sort.Sort(typesByString(to))
- sort.Sort(typesByString(from))
- sort.Sort(typesByString(fromPtr))
-
- var toMethod, fromMethod, fromPtrMethod []*types.Selection // contain nils
- if method != nil {
- for _, t := range to {
- toMethod = append(toMethod,
- types.NewMethodSet(t).Lookup(method.Pkg(), method.Name()))
- }
- for _, t := range from {
- fromMethod = append(fromMethod,
- types.NewMethodSet(t).Lookup(method.Pkg(), method.Name()))
- }
- for _, t := range fromPtr {
- fromPtrMethod = append(fromPtrMethod,
- types.NewMethodSet(t).Lookup(method.Pkg(), method.Name()))
- }
- }
-
- q.Output(lprog.Fset, &implementsResult{
- qpos, T, pos, to, from, fromPtr, method, toMethod, fromMethod, fromPtrMethod,
- })
- return nil
-}
-
-type implementsResult struct {
- qpos *queryPos
-
- t types.Type // queried type (not necessarily named)
- pos interface{} // pos of t (*types.Name or *QueryPos)
- to []types.Type // named or ptr-to-named types assignable to interface T
- from []types.Type // named interfaces assignable from T
- fromPtr []types.Type // named interfaces assignable only from *T
-
- // if a method was queried:
- method *types.Func // queried method
- toMethod []*types.Selection // method of type to[i], if any
- fromMethod []*types.Selection // method of type from[i], if any
- fromPtrMethod []*types.Selection // method of type fromPtrMethod[i], if any
-}
-
-func (r *implementsResult) PrintPlain(printf printfFunc) {
- relation := "is implemented by"
-
- meth := func(sel *types.Selection) {
- if sel != nil {
- printf(sel.Obj(), "\t%s method (%s).%s",
- relation, r.qpos.typeString(sel.Recv()), sel.Obj().Name())
- }
- }
-
- if isInterface(r.t) {
- if types.NewMethodSet(r.t).Len() == 0 { // TODO(adonovan): cache mset
- printf(r.pos, "empty interface type %s", r.qpos.typeString(r.t))
- return
- }
-
- if r.method == nil {
- printf(r.pos, "interface type %s", r.qpos.typeString(r.t))
- } else {
- printf(r.method, "abstract method %s", r.qpos.objectString(r.method))
- }
-
- // Show concrete types (or methods) first; use two passes.
- for i, sub := range r.to {
- if !isInterface(sub) {
- if r.method == nil {
- printf(deref(sub).(*types.Named).Obj(), "\t%s %s type %s",
- relation, typeKind(sub), r.qpos.typeString(sub))
- } else {
- meth(r.toMethod[i])
- }
- }
- }
- for i, sub := range r.to {
- if isInterface(sub) {
- if r.method == nil {
- printf(sub.(*types.Named).Obj(), "\t%s %s type %s",
- relation, typeKind(sub), r.qpos.typeString(sub))
- } else {
- meth(r.toMethod[i])
- }
- }
- }
-
- relation = "implements"
- for i, super := range r.from {
- if r.method == nil {
- printf(super.(*types.Named).Obj(), "\t%s %s",
- relation, r.qpos.typeString(super))
- } else {
- meth(r.fromMethod[i])
- }
- }
- } else {
- relation = "implements"
-
- if r.from != nil {
- if r.method == nil {
- printf(r.pos, "%s type %s",
- typeKind(r.t), r.qpos.typeString(r.t))
- } else {
- printf(r.method, "concrete method %s",
- r.qpos.objectString(r.method))
- }
- for i, super := range r.from {
- if r.method == nil {
- printf(super.(*types.Named).Obj(), "\t%s %s",
- relation, r.qpos.typeString(super))
- } else {
- meth(r.fromMethod[i])
- }
- }
- }
- if r.fromPtr != nil {
- if r.method == nil {
- printf(r.pos, "pointer type *%s", r.qpos.typeString(r.t))
- } else {
- // TODO(adonovan): de-dup (C).f and (*C).f implementing (I).f.
- printf(r.method, "concrete method %s",
- r.qpos.objectString(r.method))
- }
-
- for i, psuper := range r.fromPtr {
- if r.method == nil {
- printf(psuper.(*types.Named).Obj(), "\t%s %s",
- relation, r.qpos.typeString(psuper))
- } else {
- meth(r.fromPtrMethod[i])
- }
- }
- } else if r.from == nil {
- printf(r.pos, "%s type %s implements only interface{}",
- typeKind(r.t), r.qpos.typeString(r.t))
- }
- }
-}
-
-func (r *implementsResult) JSON(fset *token.FileSet) []byte {
- var method *serial.DescribeMethod
- if r.method != nil {
- method = &serial.DescribeMethod{
- Name: r.qpos.objectString(r.method),
- Pos: fset.Position(r.method.Pos()).String(),
- }
- }
- return toJSON(&serial.Implements{
- T: makeImplementsType(r.t, fset),
- AssignableTo: makeImplementsTypes(r.to, fset),
- AssignableFrom: makeImplementsTypes(r.from, fset),
- AssignableFromPtr: makeImplementsTypes(r.fromPtr, fset),
- AssignableToMethod: methodsToSerial(r.qpos.info.Pkg, r.toMethod, fset),
- AssignableFromMethod: methodsToSerial(r.qpos.info.Pkg, r.fromMethod, fset),
- AssignableFromPtrMethod: methodsToSerial(r.qpos.info.Pkg, r.fromPtrMethod, fset),
- Method: method,
- })
-
-}
-
-func makeImplementsTypes(tt []types.Type, fset *token.FileSet) []serial.ImplementsType {
- var r []serial.ImplementsType
- for _, t := range tt {
- r = append(r, makeImplementsType(t, fset))
- }
- return r
-}
-
-func makeImplementsType(T types.Type, fset *token.FileSet) serial.ImplementsType {
- var pos token.Pos
- if nt, ok := deref(T).(*types.Named); ok { // implementsResult.t may be non-named
- pos = nt.Obj().Pos()
- }
- return serial.ImplementsType{
- Name: T.String(),
- Pos: fset.Position(pos).String(),
- Kind: typeKind(T),
- }
-}
-
-// typeKind returns a string describing the underlying kind of type,
-// e.g. "slice", "array", "struct".
-func typeKind(T types.Type) string {
- s := reflect.TypeOf(T.Underlying()).String()
- return strings.ToLower(strings.TrimPrefix(s, "*types."))
-}
-
-func isInterface(T types.Type) bool { return types.IsInterface(T) }
-
-type typesByString []types.Type
-
-func (p typesByString) Len() int { return len(p) }
-func (p typesByString) Less(i, j int) bool { return p[i].String() < p[j].String() }
-func (p typesByString) Swap(i, j int) { p[i], p[j] = p[j], p[i] }
diff --git a/vendor/golang.org/x/tools/cmd/guru/isAlias18.go b/vendor/golang.org/x/tools/cmd/guru/isAlias18.go
deleted file mode 100644
index 6a2a4c0..0000000
--- a/vendor/golang.org/x/tools/cmd/guru/isAlias18.go
+++ /dev/null
@@ -1,15 +0,0 @@
-// Copyright 2017 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build !go1.9
-
-package main
-
-import "go/types"
-
-func isAlias(obj *types.TypeName) bool {
- return false // there are no type aliases before Go 1.9
-}
-
-const HasAlias = false
diff --git a/vendor/golang.org/x/tools/cmd/guru/isAlias19.go b/vendor/golang.org/x/tools/cmd/guru/isAlias19.go
deleted file mode 100644
index 25096ab..0000000
--- a/vendor/golang.org/x/tools/cmd/guru/isAlias19.go
+++ /dev/null
@@ -1,15 +0,0 @@
-// Copyright 2017 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build go1.9
-
-package main
-
-import "go/types"
-
-func isAlias(obj *types.TypeName) bool {
- return obj.IsAlias()
-}
-
-const HasAlias = true
diff --git a/vendor/golang.org/x/tools/cmd/guru/main.go b/vendor/golang.org/x/tools/cmd/guru/main.go
deleted file mode 100644
index 761828a..0000000
--- a/vendor/golang.org/x/tools/cmd/guru/main.go
+++ /dev/null
@@ -1,215 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// guru: a tool for answering questions about Go source code.
-//
-// http://golang.org/s/using-guru
-//
-// Run with -help flag or help subcommand for usage information.
-//
-package main // import "golang.org/x/tools/cmd/guru"
-
-import (
- "bufio"
- "flag"
- "fmt"
- "go/build"
- "go/token"
- "io"
- "log"
- "os"
- "runtime/pprof"
- "strings"
- "sync"
-
- "golang.org/x/tools/go/buildutil"
-)
-
-// flags
-var (
- modifiedFlag = flag.Bool("modified", false, "read archive of modified files from standard input")
- scopeFlag = flag.String("scope", "", "comma-separated list of `packages` the analysis should be limited to")
- ptalogFlag = flag.String("ptalog", "", "write points-to analysis log to `file`")
- jsonFlag = flag.Bool("json", false, "emit output in JSON format")
- reflectFlag = flag.Bool("reflect", false, "analyze reflection soundly (slow)")
- cpuprofileFlag = flag.String("cpuprofile", "", "write CPU profile to `file`")
-)
-
-func init() {
- flag.Var((*buildutil.TagsFlag)(&build.Default.BuildTags), "tags", buildutil.TagsFlagDoc)
-}
-
-const useHelp = "Run 'guru -help' for more information.\n"
-
-const helpMessage = `Go source code guru.
-Usage: guru [flags]
-
-The mode argument determines the query to perform:
-
- callees show possible targets of selected function call
- callers show possible callers of selected function
- callstack show path from callgraph root to selected function
- definition show declaration of selected identifier
- describe describe selected syntax: definition, methods, etc
- freevars show free variables of selection
- implements show 'implements' relation for selected type or method
- peers show send/receive corresponding to selected channel op
- pointsto show variables the selected pointer may point to
- referrers show all refs to entity denoted by selected identifier
- what show basic information about the selected syntax node
- whicherrs show possible values of the selected error variable
-
-The position argument specifies the filename and byte offset (or range)
-of the syntax element to query. For example:
-
- foo.go:#123,#128
- bar.go:#123
-
-The -json flag causes guru to emit output in JSON format;
- golang.org/x/tools/cmd/guru/serial defines its schema.
- Otherwise, the output is in an editor-friendly format in which
- every line has the form "pos: text", where pos is "-" if unknown.
-
-The -modified flag causes guru to read an archive from standard input.
- Files in this archive will be used in preference to those in
- the file system. In this way, a text editor may supply guru
- with the contents of its unsaved buffers. Each archive entry
- consists of the file name, a newline, the decimal file size,
- another newline, and the contents of the file.
-
-The -scope flag restricts analysis to the specified packages.
- Its value is a comma-separated list of patterns of these forms:
- golang.org/x/tools/cmd/guru # a single package
- golang.org/x/tools/... # all packages beneath dir
- ... # the entire workspace.
- A pattern preceded by '-' is negative, so the scope
- encoding/...,-encoding/xml
- matches all encoding packages except encoding/xml.
-
-User manual: http://golang.org/s/using-guru
-
-Example: describe syntax at offset 530 in this file (an import spec):
-
- $ guru describe src/golang.org/x/tools/cmd/guru/main.go:#530
-`
-
-func printHelp() {
- fmt.Fprintln(os.Stderr, helpMessage)
- fmt.Fprintln(os.Stderr, "Flags:")
- flag.PrintDefaults()
-}
-
-func main() {
- log.SetPrefix("guru: ")
- log.SetFlags(0)
-
- // Don't print full help unless -help was requested.
- // Just gently remind users that it's there.
- flag.Usage = func() { fmt.Fprint(os.Stderr, useHelp) }
- flag.CommandLine.Init(os.Args[0], flag.ContinueOnError) // hack
- if err := flag.CommandLine.Parse(os.Args[1:]); err != nil {
- // (err has already been printed)
- if err == flag.ErrHelp {
- printHelp()
- }
- os.Exit(2)
- }
-
- args := flag.Args()
- if len(args) != 2 {
- flag.Usage()
- os.Exit(2)
- }
- mode, posn := args[0], args[1]
-
- if mode == "help" {
- printHelp()
- os.Exit(2)
- }
-
- // Set up points-to analysis log file.
- var ptalog io.Writer
- if *ptalogFlag != "" {
- if f, err := os.Create(*ptalogFlag); err != nil {
- log.Fatalf("Failed to create PTA log file: %s", err)
- } else {
- buf := bufio.NewWriter(f)
- ptalog = buf
- defer func() {
- if err := buf.Flush(); err != nil {
- log.Printf("flush: %s", err)
- }
- if err := f.Close(); err != nil {
- log.Printf("close: %s", err)
- }
- }()
- }
- }
-
- // Profiling support.
- if *cpuprofileFlag != "" {
- f, err := os.Create(*cpuprofileFlag)
- if err != nil {
- log.Fatal(err)
- }
- pprof.StartCPUProfile(f)
- defer pprof.StopCPUProfile()
- }
-
- ctxt := &build.Default
-
- // If there were modified files,
- // read them from the standard input and
- // overlay them on the build context.
- if *modifiedFlag {
- modified, err := buildutil.ParseOverlayArchive(os.Stdin)
- if err != nil {
- log.Fatal(err)
- }
-
- // All I/O done by guru needs to consult the modified map.
- // The ReadFile done by referrers does,
- // but the loader's cgo preprocessing currently does not.
-
- if len(modified) > 0 {
- ctxt = buildutil.OverlayContext(ctxt, modified)
- }
- }
-
- var outputMu sync.Mutex
- output := func(fset *token.FileSet, qr QueryResult) {
- outputMu.Lock()
- defer outputMu.Unlock()
- if *jsonFlag {
- // JSON output
- fmt.Printf("%s\n", qr.JSON(fset))
- } else {
- // plain output
- printf := func(pos interface{}, format string, args ...interface{}) {
- fprintf(os.Stdout, fset, pos, format, args...)
- }
- qr.PrintPlain(printf)
- }
- }
-
- // Avoid corner case of split("").
- var scope []string
- if *scopeFlag != "" {
- scope = strings.Split(*scopeFlag, ",")
- }
-
- // Ask the guru.
- query := Query{
- Pos: posn,
- Build: ctxt,
- Scope: scope,
- PTALog: ptalog,
- Reflection: *reflectFlag,
- Output: output,
- }
-
- if err := Run(mode, &query); err != nil {
- log.Fatal(err)
- }
-}
diff --git a/vendor/golang.org/x/tools/cmd/guru/peers.go b/vendor/golang.org/x/tools/cmd/guru/peers.go
deleted file mode 100644
index 6e138bf..0000000
--- a/vendor/golang.org/x/tools/cmd/guru/peers.go
+++ /dev/null
@@ -1,252 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-import (
- "fmt"
- "go/ast"
- "go/token"
- "go/types"
- "sort"
-
- "golang.org/x/tools/cmd/guru/serial"
- "golang.org/x/tools/go/loader"
- "golang.org/x/tools/go/ssa"
- "golang.org/x/tools/go/ssa/ssautil"
-)
-
-// peers enumerates, for a given channel send (or receive) operation,
-// the set of possible receives (or sends) that correspond to it.
-//
-// TODO(adonovan): support reflect.{Select,Recv,Send,Close}.
-// TODO(adonovan): permit the user to query based on a MakeChan (not send/recv),
-// or the implicit receive in "for v := range ch".
-func peers(q *Query) error {
- lconf := loader.Config{Build: q.Build}
-
- if err := setPTAScope(&lconf, q.Scope); err != nil {
- return err
- }
-
- // Load/parse/type-check the program.
- lprog, err := loadWithSoftErrors(&lconf)
- if err != nil {
- return err
- }
-
- qpos, err := parseQueryPos(lprog, q.Pos, false)
- if err != nil {
- return err
- }
-
- prog := ssautil.CreateProgram(lprog, ssa.GlobalDebug)
-
- ptaConfig, err := setupPTA(prog, lprog, q.PTALog, q.Reflection)
- if err != nil {
- return err
- }
-
- opPos := findOp(qpos)
- if opPos == token.NoPos {
- return fmt.Errorf("there is no channel operation here")
- }
-
- // Defer SSA construction till after errors are reported.
- prog.Build()
-
- var queryOp chanOp // the originating send or receive operation
- var ops []chanOp // all sends/receives of opposite direction
-
- // Look at all channel operations in the whole ssa.Program.
- // Build a list of those of same type as the query.
- allFuncs := ssautil.AllFunctions(prog)
- for fn := range allFuncs {
- for _, b := range fn.Blocks {
- for _, instr := range b.Instrs {
- for _, op := range chanOps(instr) {
- ops = append(ops, op)
- if op.pos == opPos {
- queryOp = op // we found the query op
- }
- }
- }
- }
- }
- if queryOp.ch == nil {
- return fmt.Errorf("ssa.Instruction for send/receive not found")
- }
-
- // Discard operations of wrong channel element type.
- // Build set of channel ssa.Values as query to pointer analysis.
- // We compare channels by element types, not channel types, to
- // ignore both directionality and type names.
- queryType := queryOp.ch.Type()
- queryElemType := queryType.Underlying().(*types.Chan).Elem()
- ptaConfig.AddQuery(queryOp.ch)
- i := 0
- for _, op := range ops {
- if types.Identical(op.ch.Type().Underlying().(*types.Chan).Elem(), queryElemType) {
- ptaConfig.AddQuery(op.ch)
- ops[i] = op
- i++
- }
- }
- ops = ops[:i]
-
- // Run the pointer analysis.
- ptares := ptrAnalysis(ptaConfig)
-
- // Find the points-to set.
- queryChanPtr := ptares.Queries[queryOp.ch]
-
- // Ascertain which make(chan) labels the query's channel can alias.
- var makes []token.Pos
- for _, label := range queryChanPtr.PointsTo().Labels() {
- makes = append(makes, label.Pos())
- }
- sort.Sort(byPos(makes))
-
- // Ascertain which channel operations can alias the same make(chan) labels.
- var sends, receives, closes []token.Pos
- for _, op := range ops {
- if ptr, ok := ptares.Queries[op.ch]; ok && ptr.MayAlias(queryChanPtr) {
- switch op.dir {
- case types.SendOnly:
- sends = append(sends, op.pos)
- case types.RecvOnly:
- receives = append(receives, op.pos)
- case types.SendRecv:
- closes = append(closes, op.pos)
- }
- }
- }
- sort.Sort(byPos(sends))
- sort.Sort(byPos(receives))
- sort.Sort(byPos(closes))
-
- q.Output(lprog.Fset, &peersResult{
- queryPos: opPos,
- queryType: queryType,
- makes: makes,
- sends: sends,
- receives: receives,
- closes: closes,
- })
- return nil
-}
-
-// findOp returns the position of the enclosing send/receive/close op.
-// For send and receive operations, this is the position of the <- token;
-// for close operations, it's the Lparen of the function call.
-//
-// TODO(adonovan): handle implicit receive operations from 'for...range chan' statements.
-func findOp(qpos *queryPos) token.Pos {
- for _, n := range qpos.path {
- switch n := n.(type) {
- case *ast.UnaryExpr:
- if n.Op == token.ARROW {
- return n.OpPos
- }
- case *ast.SendStmt:
- return n.Arrow
- case *ast.CallExpr:
- // close function call can only exist as a direct identifier
- if close, ok := unparen(n.Fun).(*ast.Ident); ok {
- if b, ok := qpos.info.Info.Uses[close].(*types.Builtin); ok && b.Name() == "close" {
- return n.Lparen
- }
- }
- }
- }
- return token.NoPos
-}
-
-// chanOp abstracts an ssa.Send, ssa.Unop(ARROW), or a SelectState.
-type chanOp struct {
- ch ssa.Value
- dir types.ChanDir // SendOnly=send, RecvOnly=recv, SendRecv=close
- pos token.Pos
-}
-
-// chanOps returns a slice of all the channel operations in the instruction.
-func chanOps(instr ssa.Instruction) []chanOp {
- // TODO(adonovan): handle calls to reflect.{Select,Recv,Send,Close} too.
- var ops []chanOp
- switch instr := instr.(type) {
- case *ssa.UnOp:
- if instr.Op == token.ARROW {
- ops = append(ops, chanOp{instr.X, types.RecvOnly, instr.Pos()})
- }
- case *ssa.Send:
- ops = append(ops, chanOp{instr.Chan, types.SendOnly, instr.Pos()})
- case *ssa.Select:
- for _, st := range instr.States {
- ops = append(ops, chanOp{st.Chan, st.Dir, st.Pos})
- }
- case ssa.CallInstruction:
- cc := instr.Common()
- if b, ok := cc.Value.(*ssa.Builtin); ok && b.Name() == "close" {
- ops = append(ops, chanOp{cc.Args[0], types.SendRecv, cc.Pos()})
- }
- }
- return ops
-}
-
-// TODO(adonovan): show the line of text for each pos, like "referrers" does.
-type peersResult struct {
- queryPos token.Pos // of queried channel op
- queryType types.Type // type of queried channel
- makes, sends, receives, closes []token.Pos // positions of aliased makechan/send/receive/close instrs
-}
-
-func (r *peersResult) PrintPlain(printf printfFunc) {
- if len(r.makes) == 0 {
- printf(r.queryPos, "This channel can't point to anything.")
- return
- }
- printf(r.queryPos, "This channel of type %s may be:", r.queryType)
- for _, alloc := range r.makes {
- printf(alloc, "\tallocated here")
- }
- for _, send := range r.sends {
- printf(send, "\tsent to, here")
- }
- for _, receive := range r.receives {
- printf(receive, "\treceived from, here")
- }
- for _, clos := range r.closes {
- printf(clos, "\tclosed, here")
- }
-}
-
-func (r *peersResult) JSON(fset *token.FileSet) []byte {
- peers := &serial.Peers{
- Pos: fset.Position(r.queryPos).String(),
- Type: r.queryType.String(),
- }
- for _, alloc := range r.makes {
- peers.Allocs = append(peers.Allocs, fset.Position(alloc).String())
- }
- for _, send := range r.sends {
- peers.Sends = append(peers.Sends, fset.Position(send).String())
- }
- for _, receive := range r.receives {
- peers.Receives = append(peers.Receives, fset.Position(receive).String())
- }
- for _, clos := range r.closes {
- peers.Closes = append(peers.Closes, fset.Position(clos).String())
- }
- return toJSON(peers)
-}
-
-// -------- utils --------
-
-// NB: byPos is not deterministic across packages since it depends on load order.
-// Use lessPos if the tests need it.
-type byPos []token.Pos
-
-func (p byPos) Len() int { return len(p) }
-func (p byPos) Less(i, j int) bool { return p[i] < p[j] }
-func (p byPos) Swap(i, j int) { p[i], p[j] = p[j], p[i] }
diff --git a/vendor/golang.org/x/tools/cmd/guru/pointsto.go b/vendor/golang.org/x/tools/cmd/guru/pointsto.go
deleted file mode 100644
index 782277f..0000000
--- a/vendor/golang.org/x/tools/cmd/guru/pointsto.go
+++ /dev/null
@@ -1,290 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-import (
- "fmt"
- "go/ast"
- "go/token"
- "go/types"
- "sort"
-
- "golang.org/x/tools/cmd/guru/serial"
- "golang.org/x/tools/go/ast/astutil"
- "golang.org/x/tools/go/loader"
- "golang.org/x/tools/go/pointer"
- "golang.org/x/tools/go/ssa"
- "golang.org/x/tools/go/ssa/ssautil"
-)
-
-// pointsto runs the pointer analysis on the selected expression,
-// and reports its points-to set (for a pointer-like expression)
-// or its dynamic types (for an interface, reflect.Value, or
-// reflect.Type expression) and their points-to sets.
-//
-// All printed sets are sorted to ensure determinism.
-//
-func pointsto(q *Query) error {
- lconf := loader.Config{Build: q.Build}
-
- if err := setPTAScope(&lconf, q.Scope); err != nil {
- return err
- }
-
- // Load/parse/type-check the program.
- lprog, err := loadWithSoftErrors(&lconf)
- if err != nil {
- return err
- }
-
- qpos, err := parseQueryPos(lprog, q.Pos, true) // needs exact pos
- if err != nil {
- return err
- }
-
- prog := ssautil.CreateProgram(lprog, ssa.GlobalDebug)
-
- ptaConfig, err := setupPTA(prog, lprog, q.PTALog, q.Reflection)
- if err != nil {
- return err
- }
-
- path, action := findInterestingNode(qpos.info, qpos.path)
- if action != actionExpr {
- return fmt.Errorf("pointer analysis wants an expression; got %s",
- astutil.NodeDescription(qpos.path[0]))
- }
-
- var expr ast.Expr
- var obj types.Object
- switch n := path[0].(type) {
- case *ast.ValueSpec:
- // ambiguous ValueSpec containing multiple names
- return fmt.Errorf("multiple value specification")
- case *ast.Ident:
- obj = qpos.info.ObjectOf(n)
- expr = n
- case ast.Expr:
- expr = n
- default:
- // TODO(adonovan): is this reachable?
- return fmt.Errorf("unexpected AST for expr: %T", n)
- }
-
- // Reject non-pointerlike types (includes all constants---except nil).
- // TODO(adonovan): reject nil too.
- typ := qpos.info.TypeOf(expr)
- if !pointer.CanPoint(typ) {
- return fmt.Errorf("pointer analysis wants an expression of reference type; got %s", typ)
- }
-
- // Determine the ssa.Value for the expression.
- var value ssa.Value
- var isAddr bool
- if obj != nil {
- // def/ref of func/var object
- value, isAddr, err = ssaValueForIdent(prog, qpos.info, obj, path)
- } else {
- value, isAddr, err = ssaValueForExpr(prog, qpos.info, path)
- }
- if err != nil {
- return err // e.g. trivially dead code
- }
-
- // Defer SSA construction till after errors are reported.
- prog.Build()
-
- // Run the pointer analysis.
- ptrs, err := runPTA(ptaConfig, value, isAddr)
- if err != nil {
- return err // e.g. analytically unreachable
- }
-
- q.Output(lprog.Fset, &pointstoResult{
- qpos: qpos,
- typ: typ,
- ptrs: ptrs,
- })
- return nil
-}
-
-// ssaValueForIdent returns the ssa.Value for the ast.Ident whose path
-// to the root of the AST is path. isAddr reports whether the
-// ssa.Value is the address denoted by the ast.Ident, not its value.
-//
-func ssaValueForIdent(prog *ssa.Program, qinfo *loader.PackageInfo, obj types.Object, path []ast.Node) (value ssa.Value, isAddr bool, err error) {
- switch obj := obj.(type) {
- case *types.Var:
- pkg := prog.Package(qinfo.Pkg)
- pkg.Build()
- if v, addr := prog.VarValue(obj, pkg, path); v != nil {
- return v, addr, nil
- }
- return nil, false, fmt.Errorf("can't locate SSA Value for var %s", obj.Name())
-
- case *types.Func:
- fn := prog.FuncValue(obj)
- if fn == nil {
- return nil, false, fmt.Errorf("%s is an interface method", obj)
- }
- // TODO(adonovan): there's no point running PTA on a *Func ident.
- // Eliminate this feature.
- return fn, false, nil
- }
- panic(obj)
-}
-
-// ssaValueForExpr returns the ssa.Value of the non-ast.Ident
-// expression whose path to the root of the AST is path.
-//
-func ssaValueForExpr(prog *ssa.Program, qinfo *loader.PackageInfo, path []ast.Node) (value ssa.Value, isAddr bool, err error) {
- pkg := prog.Package(qinfo.Pkg)
- pkg.SetDebugMode(true)
- pkg.Build()
-
- fn := ssa.EnclosingFunction(pkg, path)
- if fn == nil {
- return nil, false, fmt.Errorf("no SSA function built for this location (dead code?)")
- }
-
- if v, addr := fn.ValueForExpr(path[0].(ast.Expr)); v != nil {
- return v, addr, nil
- }
-
- return nil, false, fmt.Errorf("can't locate SSA Value for expression in %s", fn)
-}
-
-// runPTA runs the pointer analysis of the selected SSA value or address.
-func runPTA(conf *pointer.Config, v ssa.Value, isAddr bool) (ptrs []pointerResult, err error) {
- T := v.Type()
- if isAddr {
- conf.AddIndirectQuery(v)
- T = deref(T)
- } else {
- conf.AddQuery(v)
- }
- ptares := ptrAnalysis(conf)
-
- var ptr pointer.Pointer
- if isAddr {
- ptr = ptares.IndirectQueries[v]
- } else {
- ptr = ptares.Queries[v]
- }
- if ptr == (pointer.Pointer{}) {
- return nil, fmt.Errorf("pointer analysis did not find expression (dead code?)")
- }
- pts := ptr.PointsTo()
-
- if pointer.CanHaveDynamicTypes(T) {
- // Show concrete types for interface/reflect.Value expression.
- if concs := pts.DynamicTypes(); concs.Len() > 0 {
- concs.Iterate(func(conc types.Type, pta interface{}) {
- labels := pta.(pointer.PointsToSet).Labels()
- sort.Sort(byPosAndString(labels)) // to ensure determinism
- ptrs = append(ptrs, pointerResult{conc, labels})
- })
- }
- } else {
- // Show labels for other expressions.
- labels := pts.Labels()
- sort.Sort(byPosAndString(labels)) // to ensure determinism
- ptrs = append(ptrs, pointerResult{T, labels})
- }
- sort.Sort(byTypeString(ptrs)) // to ensure determinism
- return ptrs, nil
-}
-
-type pointerResult struct {
- typ types.Type // type of the pointer (always concrete)
- labels []*pointer.Label // set of labels
-}
-
-type pointstoResult struct {
- qpos *queryPos
- typ types.Type // type of expression
- ptrs []pointerResult // pointer info (typ is concrete => len==1)
-}
-
-func (r *pointstoResult) PrintPlain(printf printfFunc) {
- if pointer.CanHaveDynamicTypes(r.typ) {
- // Show concrete types for interface, reflect.Type or
- // reflect.Value expression.
-
- if len(r.ptrs) > 0 {
- printf(r.qpos, "this %s may contain these dynamic types:", r.qpos.typeString(r.typ))
- for _, ptr := range r.ptrs {
- var obj types.Object
- if nt, ok := deref(ptr.typ).(*types.Named); ok {
- obj = nt.Obj()
- }
- if len(ptr.labels) > 0 {
- printf(obj, "\t%s, may point to:", r.qpos.typeString(ptr.typ))
- printLabels(printf, ptr.labels, "\t\t")
- } else {
- printf(obj, "\t%s", r.qpos.typeString(ptr.typ))
- }
- }
- } else {
- printf(r.qpos, "this %s cannot contain any dynamic types.", r.typ)
- }
- } else {
- // Show labels for other expressions.
- if ptr := r.ptrs[0]; len(ptr.labels) > 0 {
- printf(r.qpos, "this %s may point to these objects:",
- r.qpos.typeString(r.typ))
- printLabels(printf, ptr.labels, "\t")
- } else {
- printf(r.qpos, "this %s may not point to anything.",
- r.qpos.typeString(r.typ))
- }
- }
-}
-
-func (r *pointstoResult) JSON(fset *token.FileSet) []byte {
- var pts []serial.PointsTo
- for _, ptr := range r.ptrs {
- var namePos string
- if nt, ok := deref(ptr.typ).(*types.Named); ok {
- namePos = fset.Position(nt.Obj().Pos()).String()
- }
- var labels []serial.PointsToLabel
- for _, l := range ptr.labels {
- labels = append(labels, serial.PointsToLabel{
- Pos: fset.Position(l.Pos()).String(),
- Desc: l.String(),
- })
- }
- pts = append(pts, serial.PointsTo{
- Type: r.qpos.typeString(ptr.typ),
- NamePos: namePos,
- Labels: labels,
- })
- }
- return toJSON(pts)
-}
-
-type byTypeString []pointerResult
-
-func (a byTypeString) Len() int { return len(a) }
-func (a byTypeString) Less(i, j int) bool { return a[i].typ.String() < a[j].typ.String() }
-func (a byTypeString) Swap(i, j int) { a[i], a[j] = a[j], a[i] }
-
-type byPosAndString []*pointer.Label
-
-func (a byPosAndString) Len() int { return len(a) }
-func (a byPosAndString) Less(i, j int) bool {
- cmp := a[i].Pos() - a[j].Pos()
- return cmp < 0 || (cmp == 0 && a[i].String() < a[j].String())
-}
-func (a byPosAndString) Swap(i, j int) { a[i], a[j] = a[j], a[i] }
-
-func printLabels(printf printfFunc, labels []*pointer.Label, prefix string) {
- // TODO(adonovan): due to context-sensitivity, many of these
- // labels may differ only by context, which isn't apparent.
- for _, label := range labels {
- printf(label, "%s%s", prefix, label)
- }
-}
diff --git a/vendor/golang.org/x/tools/cmd/guru/pos.go b/vendor/golang.org/x/tools/cmd/guru/pos.go
deleted file mode 100644
index 2e659fe..0000000
--- a/vendor/golang.org/x/tools/cmd/guru/pos.go
+++ /dev/null
@@ -1,142 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-// This file defines utilities for working with file positions.
-
-import (
- "fmt"
- "go/build"
- "go/parser"
- "go/token"
- "os"
- "path/filepath"
- "strconv"
- "strings"
-
- "golang.org/x/tools/go/ast/astutil"
- "golang.org/x/tools/go/buildutil"
-)
-
-// parseOctothorpDecimal returns the numeric value if s matches "#%d",
-// otherwise -1.
-func parseOctothorpDecimal(s string) int {
- if s != "" && s[0] == '#' {
- if s, err := strconv.ParseInt(s[1:], 10, 32); err == nil {
- return int(s)
- }
- }
- return -1
-}
-
-// parsePos parses a string of the form "file:pos" or
-// file:start,end" where pos, start, end match #%d and represent byte
-// offsets, and returns its components.
-//
-// (Numbers without a '#' prefix are reserved for future use,
-// e.g. to indicate line/column positions.)
-//
-func parsePos(pos string) (filename string, startOffset, endOffset int, err error) {
- if pos == "" {
- err = fmt.Errorf("no source position specified")
- return
- }
-
- colon := strings.LastIndex(pos, ":")
- if colon < 0 {
- err = fmt.Errorf("bad position syntax %q", pos)
- return
- }
- filename, offset := pos[:colon], pos[colon+1:]
- startOffset = -1
- endOffset = -1
- if comma := strings.Index(offset, ","); comma < 0 {
- // e.g. "foo.go:#123"
- startOffset = parseOctothorpDecimal(offset)
- endOffset = startOffset
- } else {
- // e.g. "foo.go:#123,#456"
- startOffset = parseOctothorpDecimal(offset[:comma])
- endOffset = parseOctothorpDecimal(offset[comma+1:])
- }
- if startOffset < 0 || endOffset < 0 {
- err = fmt.Errorf("invalid offset %q in query position", offset)
- return
- }
- return
-}
-
-// fileOffsetToPos translates the specified file-relative byte offsets
-// into token.Pos form. It returns an error if the file was not found
-// or the offsets were out of bounds.
-//
-func fileOffsetToPos(file *token.File, startOffset, endOffset int) (start, end token.Pos, err error) {
- // Range check [start..end], inclusive of both end-points.
-
- if 0 <= startOffset && startOffset <= file.Size() {
- start = file.Pos(int(startOffset))
- } else {
- err = fmt.Errorf("start position is beyond end of file")
- return
- }
-
- if 0 <= endOffset && endOffset <= file.Size() {
- end = file.Pos(int(endOffset))
- } else {
- err = fmt.Errorf("end position is beyond end of file")
- return
- }
-
- return
-}
-
-// sameFile returns true if x and y have the same basename and denote
-// the same file.
-//
-func sameFile(x, y string) bool {
- if filepath.Base(x) == filepath.Base(y) { // (optimisation)
- if xi, err := os.Stat(x); err == nil {
- if yi, err := os.Stat(y); err == nil {
- return os.SameFile(xi, yi)
- }
- }
- }
- return false
-}
-
-// fastQueryPos parses the position string and returns a queryPos.
-// It parses only a single file and does not run the type checker.
-func fastQueryPos(ctxt *build.Context, pos string) (*queryPos, error) {
- filename, startOffset, endOffset, err := parsePos(pos)
- if err != nil {
- return nil, err
- }
-
- // Parse the file, opening it the file via the build.Context
- // so that we observe the effects of the -modified flag.
- fset := token.NewFileSet()
- cwd, _ := os.Getwd()
- f, err := buildutil.ParseFile(fset, ctxt, nil, cwd, filename, parser.Mode(0))
- // ParseFile usually returns a partial file along with an error.
- // Only fail if there is no file.
- if f == nil {
- return nil, err
- }
- if !f.Pos().IsValid() {
- return nil, fmt.Errorf("%s is not a Go source file", filename)
- }
-
- start, end, err := fileOffsetToPos(fset.File(f.Pos()), startOffset, endOffset)
- if err != nil {
- return nil, err
- }
-
- path, exact := astutil.PathEnclosingInterval(f, start, end)
- if path == nil {
- return nil, fmt.Errorf("no syntax here")
- }
-
- return &queryPos{fset, start, end, path, exact, nil}, nil
-}
diff --git a/vendor/golang.org/x/tools/cmd/guru/referrers.go b/vendor/golang.org/x/tools/cmd/guru/referrers.go
deleted file mode 100644
index d6b9df9..0000000
--- a/vendor/golang.org/x/tools/cmd/guru/referrers.go
+++ /dev/null
@@ -1,522 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-import (
- "bytes"
- "fmt"
- "go/ast"
- "go/build"
- "go/token"
- "go/types"
- "io"
- "log"
- "sort"
- "strings"
- "sync"
-
- "golang.org/x/tools/cmd/guru/serial"
- "golang.org/x/tools/go/buildutil"
- "golang.org/x/tools/go/loader"
- "golang.org/x/tools/refactor/importgraph"
-)
-
-// Referrers reports all identifiers that resolve to the same object
-// as the queried identifier, within any package in the workspace.
-func referrers(q *Query) error {
- fset := token.NewFileSet()
- lconf := loader.Config{Fset: fset, Build: q.Build}
- allowErrors(&lconf)
-
- if _, err := importQueryPackage(q.Pos, &lconf); err != nil {
- return err
- }
-
- // Load/parse/type-check the query package.
- lprog, err := lconf.Load()
- if err != nil {
- return err
- }
-
- qpos, err := parseQueryPos(lprog, q.Pos, false)
- if err != nil {
- return err
- }
-
- id, _ := qpos.path[0].(*ast.Ident)
- if id == nil {
- return fmt.Errorf("no identifier here")
- }
-
- obj := qpos.info.ObjectOf(id)
- if obj == nil {
- // Happens for y in "switch y := x.(type)",
- // the package declaration,
- // and unresolved identifiers.
- if _, ok := qpos.path[1].(*ast.File); ok { // package decl?
- return packageReferrers(q, qpos.info.Pkg.Path())
- }
- return fmt.Errorf("no object for identifier: %T", qpos.path[1])
- }
-
- // Imported package name?
- if pkgname, ok := obj.(*types.PkgName); ok {
- return packageReferrers(q, pkgname.Imported().Path())
- }
-
- if obj.Pkg() == nil {
- return fmt.Errorf("references to predeclared %q are everywhere!", obj.Name())
- }
-
- // For a globally accessible object defined in package P, we
- // must load packages that depend on P. Specifically, for a
- // package-level object, we need load only direct importers
- // of P, but for a field or interface method, we must load
- // any package that transitively imports P.
- if global, pkglevel := classify(obj); global {
- // We'll use the the object's position to identify it in the larger program.
- objposn := fset.Position(obj.Pos())
- defpkg := obj.Pkg().Path() // defining package
- return globalReferrers(q, qpos.info.Pkg.Path(), defpkg, objposn, pkglevel)
- }
-
- q.Output(fset, &referrersInitialResult{
- qinfo: qpos.info,
- obj: obj,
- })
-
- outputUses(q, fset, usesOf(obj, qpos.info), obj.Pkg())
-
- return nil // success
-}
-
-// classify classifies objects by how far
-// we have to look to find references to them.
-func classify(obj types.Object) (global, pkglevel bool) {
- if obj.Exported() {
- if obj.Parent() == nil {
- // selectable object (field or method)
- return true, false
- }
- if obj.Parent() == obj.Pkg().Scope() {
- // lexical object (package-level var/const/func/type)
- return true, true
- }
- }
- // object with unexported named or defined in local scope
- return false, false
-}
-
-// packageReferrers reports all references to the specified package
-// throughout the workspace.
-func packageReferrers(q *Query, path string) error {
- // Scan the workspace and build the import graph.
- // Ignore broken packages.
- _, rev, _ := importgraph.Build(q.Build)
-
- // Find the set of packages that directly import the query package.
- // Only those packages need typechecking of function bodies.
- users := rev[path]
-
- // Load the larger program.
- fset := token.NewFileSet()
- lconf := loader.Config{
- Fset: fset,
- Build: q.Build,
- TypeCheckFuncBodies: func(p string) bool {
- return users[strings.TrimSuffix(p, "_test")]
- },
- }
- allowErrors(&lconf)
-
- // The importgraph doesn't treat external test packages
- // as separate nodes, so we must use ImportWithTests.
- for path := range users {
- lconf.ImportWithTests(path)
- }
-
- // Subtle! AfterTypeCheck needs no mutex for qpkg because the
- // topological import order gives us the necessary happens-before edges.
- // TODO(adonovan): what about import cycles?
- var qpkg *types.Package
-
- // For efficiency, we scan each package for references
- // just after it has been type-checked. The loader calls
- // AfterTypeCheck (concurrently), providing us with a stream of
- // packages.
- lconf.AfterTypeCheck = func(info *loader.PackageInfo, files []*ast.File) {
- // AfterTypeCheck may be called twice for the same package due to augmentation.
-
- if info.Pkg.Path() == path && qpkg == nil {
- // Found the package of interest.
- qpkg = info.Pkg
- fakepkgname := types.NewPkgName(token.NoPos, qpkg, qpkg.Name(), qpkg)
- q.Output(fset, &referrersInitialResult{
- qinfo: info,
- obj: fakepkgname, // bogus
- })
- }
-
- // Only inspect packages that directly import the
- // declaring package (and thus were type-checked).
- if lconf.TypeCheckFuncBodies(info.Pkg.Path()) {
- // Find PkgNames that refer to qpkg.
- // TODO(adonovan): perhaps more useful would be to show imports
- // of the package instead of qualified identifiers.
- var refs []*ast.Ident
- for id, obj := range info.Uses {
- if obj, ok := obj.(*types.PkgName); ok && obj.Imported() == qpkg {
- refs = append(refs, id)
- }
- }
- outputUses(q, fset, refs, info.Pkg)
- }
-
- clearInfoFields(info) // save memory
- }
-
- lconf.Load() // ignore error
-
- if qpkg == nil {
- log.Fatalf("query package %q not found during reloading", path)
- }
-
- return nil
-}
-
-func usesOf(queryObj types.Object, info *loader.PackageInfo) []*ast.Ident {
- var refs []*ast.Ident
- for id, obj := range info.Uses {
- if sameObj(queryObj, obj) {
- refs = append(refs, id)
- }
- }
- return refs
-}
-
-// outputUses outputs a result describing refs, which appear in the package denoted by info.
-func outputUses(q *Query, fset *token.FileSet, refs []*ast.Ident, pkg *types.Package) {
- if len(refs) > 0 {
- sort.Sort(byNamePos{fset, refs})
- q.Output(fset, &referrersPackageResult{
- pkg: pkg,
- build: q.Build,
- fset: fset,
- refs: refs,
- })
- }
-}
-
-// globalReferrers reports references throughout the entire workspace to the
-// object at the specified source position. Its defining package is defpkg,
-// and the query package is qpkg. isPkgLevel indicates whether the object
-// is defined at package-level.
-func globalReferrers(q *Query, qpkg, defpkg string, objposn token.Position, isPkgLevel bool) error {
- // Scan the workspace and build the import graph.
- // Ignore broken packages.
- _, rev, _ := importgraph.Build(q.Build)
-
- // Find the set of packages that depend on defpkg.
- // Only function bodies in those packages need type-checking.
- var users map[string]bool
- if isPkgLevel {
- users = rev[defpkg] // direct importers
- if users == nil {
- users = make(map[string]bool)
- }
- users[defpkg] = true // plus the defining package itself
- } else {
- users = rev.Search(defpkg) // transitive importers
- }
-
- // Prepare to load the larger program.
- fset := token.NewFileSet()
- lconf := loader.Config{
- Fset: fset,
- Build: q.Build,
- TypeCheckFuncBodies: func(p string) bool {
- return users[strings.TrimSuffix(p, "_test")]
- },
- }
- allowErrors(&lconf)
-
- // The importgraph doesn't treat external test packages
- // as separate nodes, so we must use ImportWithTests.
- for path := range users {
- lconf.ImportWithTests(path)
- }
-
- // The remainder of this function is somewhat tricky because it
- // operates on the concurrent stream of packages observed by the
- // loader's AfterTypeCheck hook. Most of guru's helper
- // functions assume the entire program has already been loaded,
- // so we can't use them here.
- // TODO(adonovan): smooth things out once the other changes have landed.
-
- // Results are reported concurrently from within the
- // AfterTypeCheck hook. The program may provide a useful stream
- // of information even if the user doesn't let the program run
- // to completion.
-
- var (
- mu sync.Mutex
- qobj types.Object
- qinfo *loader.PackageInfo // info for qpkg
- )
-
- // For efficiency, we scan each package for references
- // just after it has been type-checked. The loader calls
- // AfterTypeCheck (concurrently), providing us with a stream of
- // packages.
- lconf.AfterTypeCheck = func(info *loader.PackageInfo, files []*ast.File) {
- // AfterTypeCheck may be called twice for the same package due to augmentation.
-
- // Only inspect packages that depend on the declaring package
- // (and thus were type-checked).
- if lconf.TypeCheckFuncBodies(info.Pkg.Path()) {
- // Record the query object and its package when we see it.
- mu.Lock()
- if qobj == nil && info.Pkg.Path() == defpkg {
- // Find the object by its position (slightly ugly).
- qobj = findObject(fset, &info.Info, objposn)
- if qobj == nil {
- // It really ought to be there;
- // we found it once already.
- log.Fatalf("object at %s not found in package %s",
- objposn, defpkg)
- }
-
- // Object found.
- qinfo = info
- q.Output(fset, &referrersInitialResult{
- qinfo: qinfo,
- obj: qobj,
- })
- }
- obj := qobj
- mu.Unlock()
-
- // Look for references to the query object.
- if obj != nil {
- outputUses(q, fset, usesOf(obj, info), info.Pkg)
- }
- }
-
- clearInfoFields(info) // save memory
- }
-
- lconf.Load() // ignore error
-
- if qobj == nil {
- log.Fatal("query object not found during reloading")
- }
-
- return nil // success
-}
-
-// findObject returns the object defined at the specified position.
-func findObject(fset *token.FileSet, info *types.Info, objposn token.Position) types.Object {
- good := func(obj types.Object) bool {
- if obj == nil {
- return false
- }
- posn := fset.Position(obj.Pos())
- return posn.Filename == objposn.Filename && posn.Offset == objposn.Offset
- }
- for _, obj := range info.Defs {
- if good(obj) {
- return obj
- }
- }
- for _, obj := range info.Implicits {
- if good(obj) {
- return obj
- }
- }
- return nil
-}
-
-// same reports whether x and y are identical, or both are PkgNames
-// that import the same Package.
-//
-func sameObj(x, y types.Object) bool {
- if x == y {
- return true
- }
- if x, ok := x.(*types.PkgName); ok {
- if y, ok := y.(*types.PkgName); ok {
- return x.Imported() == y.Imported()
- }
- }
- return false
-}
-
-func clearInfoFields(info *loader.PackageInfo) {
- // TODO(adonovan): opt: save memory by eliminating unneeded scopes/objects.
- // (Requires go/types change for Go 1.7.)
- // info.Pkg.Scope().ClearChildren()
-
- // Discard the file ASTs and their accumulated type
- // information to save memory.
- info.Files = nil
- info.Defs = make(map[*ast.Ident]types.Object)
- info.Uses = make(map[*ast.Ident]types.Object)
- info.Implicits = make(map[ast.Node]types.Object)
-
- // Also, disable future collection of wholly unneeded
- // type information for the package in case there is
- // more type-checking to do (augmentation).
- info.Types = nil
- info.Scopes = nil
- info.Selections = nil
-}
-
-// -------- utils --------
-
-// An deterministic ordering for token.Pos that doesn't
-// depend on the order in which packages were loaded.
-func lessPos(fset *token.FileSet, x, y token.Pos) bool {
- fx := fset.File(x)
- fy := fset.File(y)
- if fx != fy {
- return fx.Name() < fy.Name()
- }
- return x < y
-}
-
-type byNamePos struct {
- fset *token.FileSet
- ids []*ast.Ident
-}
-
-func (p byNamePos) Len() int { return len(p.ids) }
-func (p byNamePos) Swap(i, j int) { p.ids[i], p.ids[j] = p.ids[j], p.ids[i] }
-func (p byNamePos) Less(i, j int) bool {
- return lessPos(p.fset, p.ids[i].NamePos, p.ids[j].NamePos)
-}
-
-// referrersInitialResult is the initial result of a "referrers" query.
-type referrersInitialResult struct {
- qinfo *loader.PackageInfo
- obj types.Object // object it denotes
-}
-
-func (r *referrersInitialResult) PrintPlain(printf printfFunc) {
- printf(r.obj, "references to %s",
- types.ObjectString(r.obj, types.RelativeTo(r.qinfo.Pkg)))
-}
-
-func (r *referrersInitialResult) JSON(fset *token.FileSet) []byte {
- var objpos string
- if pos := r.obj.Pos(); pos.IsValid() {
- objpos = fset.Position(pos).String()
- }
- return toJSON(&serial.ReferrersInitial{
- Desc: r.obj.String(),
- ObjPos: objpos,
- })
-}
-
-// referrersPackageResult is the streaming result for one package of a "referrers" query.
-type referrersPackageResult struct {
- pkg *types.Package
- build *build.Context
- fset *token.FileSet
- refs []*ast.Ident // set of all other references to it
-}
-
-// forEachRef calls f(id, text) for id in r.refs, in order.
-// Text is the text of the line on which id appears.
-func (r *referrersPackageResult) foreachRef(f func(id *ast.Ident, text string)) {
- // Show referring lines, like grep.
- type fileinfo struct {
- refs []*ast.Ident
- linenums []int // line number of refs[i]
- data chan interface{} // file contents or error
- }
- var fileinfos []*fileinfo
- fileinfosByName := make(map[string]*fileinfo)
-
- // First pass: start the file reads concurrently.
- sema := make(chan struct{}, 20) // counting semaphore to limit I/O concurrency
- for _, ref := range r.refs {
- posn := r.fset.Position(ref.Pos())
- fi := fileinfosByName[posn.Filename]
- if fi == nil {
- fi = &fileinfo{data: make(chan interface{})}
- fileinfosByName[posn.Filename] = fi
- fileinfos = append(fileinfos, fi)
-
- // First request for this file:
- // start asynchronous read.
- go func() {
- sema <- struct{}{} // acquire token
- content, err := readFile(r.build, posn.Filename)
- <-sema // release token
- if err != nil {
- fi.data <- err
- } else {
- fi.data <- content
- }
- }()
- }
- fi.refs = append(fi.refs, ref)
- fi.linenums = append(fi.linenums, posn.Line)
- }
-
- // Second pass: print refs in original order.
- // One line may have several refs at different columns.
- for _, fi := range fileinfos {
- v := <-fi.data // wait for I/O completion
-
- // Print one item for all refs in a file that could not
- // be loaded (perhaps due to //line directives).
- if err, ok := v.(error); ok {
- var suffix string
- if more := len(fi.refs) - 1; more > 0 {
- suffix = fmt.Sprintf(" (+ %d more refs in this file)", more)
- }
- f(fi.refs[0], err.Error()+suffix)
- continue
- }
-
- lines := bytes.Split(v.([]byte), []byte("\n"))
- for i, ref := range fi.refs {
- f(ref, string(lines[fi.linenums[i]-1]))
- }
- }
-}
-
-// readFile is like ioutil.ReadFile, but
-// it goes through the virtualized build.Context.
-func readFile(ctxt *build.Context, filename string) ([]byte, error) {
- rc, err := buildutil.OpenFile(ctxt, filename)
- if err != nil {
- return nil, err
- }
- defer rc.Close()
- var buf bytes.Buffer
- if _, err := io.Copy(&buf, rc); err != nil {
- return nil, err
- }
- return buf.Bytes(), nil
-}
-
-func (r *referrersPackageResult) PrintPlain(printf printfFunc) {
- r.foreachRef(func(id *ast.Ident, text string) {
- printf(id, "%s", text)
- })
-}
-
-func (r *referrersPackageResult) JSON(fset *token.FileSet) []byte {
- refs := serial.ReferrersPackage{Package: r.pkg.Path()}
- r.foreachRef(func(id *ast.Ident, text string) {
- refs.Refs = append(refs.Refs, serial.Ref{
- Pos: fset.Position(id.NamePos).String(),
- Text: text,
- })
- })
- return toJSON(refs)
-}
diff --git a/vendor/golang.org/x/tools/cmd/guru/serial/serial.go b/vendor/golang.org/x/tools/cmd/guru/serial/serial.go
deleted file mode 100644
index 9528797..0000000
--- a/vendor/golang.org/x/tools/cmd/guru/serial/serial.go
+++ /dev/null
@@ -1,259 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Package serial defines the guru's schema for -json output.
-//
-// The output of a guru query is a stream of one or more JSON objects.
-// This table shows the types of objects in the result stream for each
-// query type.
-//
-// Query Result stream
-// ----- -------------
-// callees Callees
-// callers Caller ...
-// callstack CallStack
-// definition Definition
-// describe Describe
-// freevars FreeVar ...
-// implements Implements
-// peers Peers
-// pointsto PointsTo ...
-// referrers ReferrersInitial ReferrersPackage ...
-// what What
-// whicherrs WhichErrs
-//
-// All 'pos' strings in the output are of the form "file:line:col",
-// where line is the 1-based line number and col is the 1-based byte index.
-package serial
-
-// A Peers is the result of a 'peers' query.
-// If Allocs is empty, the selected channel can't point to anything.
-type Peers struct {
- Pos string `json:"pos"` // location of the selected channel op (<-)
- Type string `json:"type"` // type of the selected channel
- Allocs []string `json:"allocs,omitempty"` // locations of aliased make(chan) ops
- Sends []string `json:"sends,omitempty"` // locations of aliased ch<-x ops
- Receives []string `json:"receives,omitempty"` // locations of aliased <-ch ops
- Closes []string `json:"closes,omitempty"` // locations of aliased close(ch) ops
-}
-
-// A "referrers" query emits a ReferrersInitial object followed by zero or
-// more ReferrersPackage objects, one per package that contains a reference.
-type (
- ReferrersInitial struct {
- ObjPos string `json:"objpos,omitempty"` // location of the definition
- Desc string `json:"desc"` // description of the denoted object
- }
- ReferrersPackage struct {
- Package string `json:"package"`
- Refs []Ref `json:"refs"` // non-empty list of references within this package
- }
- Ref struct {
- Pos string `json:"pos"` // location of all references
- Text string `json:"text"` // text of the referring line
- }
-)
-
-// A Definition is the result of a 'definition' query.
-type Definition struct {
- ObjPos string `json:"objpos,omitempty"` // location of the definition
- Desc string `json:"desc"` // description of the denoted object
-}
-
-// A Callees is the result of a 'callees' query.
-//
-// Callees is nonempty unless the call was a dynamic call on a
-// provably nil func or interface value.
-type (
- Callees struct {
- Pos string `json:"pos"` // location of selected call site
- Desc string `json:"desc"` // description of call site
- Callees []*Callee `json:"callees"`
- }
- Callee struct {
- Name string `json:"name"` // full name of called function
- Pos string `json:"pos"` // location of called function
- }
-)
-
-// A Caller is one element of the slice returned by a 'callers' query.
-// (Callstack also contains a similar slice.)
-//
-// The root of the callgraph has an unspecified "Caller" string.
-type Caller struct {
- Pos string `json:"pos,omitempty"` // location of the calling function
- Desc string `json:"desc"` // description of call site
- Caller string `json:"caller"` // full name of calling function
-}
-
-// A CallStack is the result of a 'callstack' query.
-// It indicates an arbitrary path from the root of the callgraph to
-// the query function.
-//
-// If the Callers slice is empty, the function was unreachable in this
-// analysis scope.
-type CallStack struct {
- Pos string `json:"pos"` // location of the selected function
- Target string `json:"target"` // the selected function
- Callers []Caller `json:"callers"` // enclosing calls, innermost first.
-}
-
-// A FreeVar is one element of the slice returned by a 'freevars'
-// query. Each one identifies an expression referencing a local
-// identifier defined outside the selected region.
-type FreeVar struct {
- Pos string `json:"pos"` // location of the identifier's definition
- Kind string `json:"kind"` // one of {var,func,type,const,label}
- Ref string `json:"ref"` // referring expression (e.g. "x" or "x.y.z")
- Type string `json:"type"` // type of the expression
-}
-
-// An Implements contains the result of an 'implements' query.
-// It describes the queried type, the set of named non-empty interface
-// types to which it is assignable, and the set of named/*named types
-// (concrete or non-empty interface) which may be assigned to it.
-//
-type Implements struct {
- T ImplementsType `json:"type,omitempty"` // the queried type
- AssignableTo []ImplementsType `json:"to,omitempty"` // types assignable to T
- AssignableFrom []ImplementsType `json:"from,omitempty"` // interface types assignable from T
- AssignableFromPtr []ImplementsType `json:"fromptr,omitempty"` // interface types assignable only from *T
-
- // The following fields are set only if the query was a method.
- // Assignable{To,From,FromPtr}Method[i] is the corresponding
- // method of type Assignable{To,From,FromPtr}[i], or blank
- // {"",""} if that type lacks the method.
- Method *DescribeMethod `json:"method,omitempty"` // the queried method
- AssignableToMethod []DescribeMethod `json:"to_method,omitempty"`
- AssignableFromMethod []DescribeMethod `json:"from_method,omitempty"`
- AssignableFromPtrMethod []DescribeMethod `json:"fromptr_method,omitempty"`
-}
-
-// An ImplementsType describes a single type as part of an 'implements' query.
-type ImplementsType struct {
- Name string `json:"name"` // full name of the type
- Pos string `json:"pos"` // location of its definition
- Kind string `json:"kind"` // "basic", "array", etc
-}
-
-// A SyntaxNode is one element of a stack of enclosing syntax nodes in
-// a "what" query.
-type SyntaxNode struct {
- Description string `json:"desc"` // description of syntax tree
- Start int `json:"start"` // start byte offset, 0-based
- End int `json:"end"` // end byte offset
-}
-
-// A What is the result of the "what" query, which quickly identifies
-// the selection, parsing only a single file. It is intended for use
-// in low-latency GUIs.
-type What struct {
- Enclosing []SyntaxNode `json:"enclosing"` // enclosing nodes of syntax tree
- Modes []string `json:"modes"` // query modes enabled for this selection.
- SrcDir string `json:"srcdir,omitempty"` // $GOROOT src directory containing queried package
- ImportPath string `json:"importpath,omitempty"` // import path of queried package
- Object string `json:"object,omitempty"` // name of identified object, if any
- SameIDs []string `json:"sameids,omitempty"` // locations of references to same object
-}
-
-// A PointsToLabel describes a pointer analysis label.
-//
-// A "label" is an object that may be pointed to by a pointer, map,
-// channel, 'func', slice or interface. Labels include:
-// - functions
-// - globals
-// - arrays created by literals (e.g. []byte("foo")) and conversions ([]byte(s))
-// - stack- and heap-allocated variables (including composite literals)
-// - arrays allocated by append()
-// - channels, maps and arrays created by make()
-// - and their subelements, e.g. "alloc.y[*].z"
-//
-type PointsToLabel struct {
- Pos string `json:"pos"` // location of syntax that allocated the object
- Desc string `json:"desc"` // description of the label
-}
-
-// A PointsTo is one element of the result of a 'pointsto' query on an
-// expression. It describes a single pointer: its type and the set of
-// "labels" it points to.
-//
-// If the pointer is of interface type, it will have one PTS entry
-// describing each concrete type that it may contain. For each
-// concrete type that is a pointer, the PTS entry describes the labels
-// it may point to. The same is true for reflect.Values, except the
-// dynamic types needn't be concrete.
-//
-type PointsTo struct {
- Type string `json:"type"` // (concrete) type of the pointer
- NamePos string `json:"namepos,omitempty"` // location of type defn, if Named
- Labels []PointsToLabel `json:"labels,omitempty"` // pointed-to objects
-}
-
-// A DescribeValue is the additional result of a 'describe' query
-// if the selection indicates a value or expression.
-type DescribeValue struct {
- Type string `json:"type"` // type of the expression
- Value string `json:"value,omitempty"` // value of the expression, if constant
- ObjPos string `json:"objpos,omitempty"` // location of the definition, if an Ident
-}
-
-type DescribeMethod struct {
- Name string `json:"name"` // method name, as defined by types.Selection.String()
- Pos string `json:"pos"` // location of the method's definition
-}
-
-// A DescribeType is the additional result of a 'describe' query
-// if the selection indicates a type.
-type DescribeType struct {
- Type string `json:"type"` // the string form of the type
- NamePos string `json:"namepos,omitempty"` // location of definition of type, if named
- NameDef string `json:"namedef,omitempty"` // underlying definition of type, if named
- Methods []DescribeMethod `json:"methods,omitempty"` // methods of the type
-}
-
-type DescribeMember struct {
- Name string `json:"name"` // name of member
- Type string `json:"type,omitempty"` // type of member (underlying, if 'type')
- Value string `json:"value,omitempty"` // value of member (if 'const')
- Pos string `json:"pos"` // location of definition of member
- Kind string `json:"kind"` // one of {var,const,func,type}
- Methods []DescribeMethod `json:"methods,omitempty"` // methods (if member is a type)
-}
-
-// A DescribePackage is the additional result of a 'describe' if
-// the selection indicates a package.
-type DescribePackage struct {
- Path string `json:"path"` // import path of the package
- Members []*DescribeMember `json:"members,omitempty"` // accessible members of the package
-}
-
-// A Describe is the result of a 'describe' query.
-// It may contain an element describing the selected semantic entity
-// in detail.
-type Describe struct {
- Desc string `json:"desc"` // description of the selected syntax node
- Pos string `json:"pos"` // location of the selected syntax node
- Detail string `json:"detail,omitempty"` // one of {package, type, value}, or "".
-
- // At most one of the following fields is populated:
- // the one specified by 'detail'.
- Package *DescribePackage `json:"package,omitempty"`
- Type *DescribeType `json:"type,omitempty"`
- Value *DescribeValue `json:"value,omitempty"`
-}
-
-// A WhichErrs is the result of a 'whicherrs' query.
-// It contains the position of the queried error and the possible globals,
-// constants, and types it may point to.
-type WhichErrs struct {
- ErrPos string `json:"errpos,omitempty"` // location of queried error
- Globals []string `json:"globals,omitempty"` // locations of globals
- Constants []string `json:"constants,omitempty"` // locations of constants
- Types []WhichErrsType `json:"types,omitempty"` // Types
-}
-
-type WhichErrsType struct {
- Type string `json:"type,omitempty"`
- Position string `json:"position,omitempty"`
-}
diff --git a/vendor/golang.org/x/tools/cmd/guru/testdata/src/README.txt b/vendor/golang.org/x/tools/cmd/guru/testdata/src/README.txt
deleted file mode 100644
index 34fc41a..0000000
--- a/vendor/golang.org/x/tools/cmd/guru/testdata/src/README.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-This is not a Go source file.
-Used by TestIssue14684.
diff --git a/vendor/golang.org/x/tools/cmd/guru/testdata/src/alias/alias.go b/vendor/golang.org/x/tools/cmd/guru/testdata/src/alias/alias.go
deleted file mode 100644
index 42e1d29..0000000
--- a/vendor/golang.org/x/tools/cmd/guru/testdata/src/alias/alias.go
+++ /dev/null
@@ -1,23 +0,0 @@
-// Tests of Go 1.9 type aliases.
-// See go.tools/guru/guru_test.go for explanation.
-// See alias.golden for expected query results.
-
-package alias // @describe describe-pkg "alias"
-
-type I interface { // @implements implements-I "I"
- f()
-}
-
-type N int
-
-func (N) f() {}
-
-type M = N // @describe describe-def-M "M"
-var m M // @describe describe-ref-M "M"
-
-type O N // @describe describe-O "O"
-
-type P = struct{ N } // @describe describe-P "N"
-
-type U = undefined // @describe describe-U "U"
-type _ = undefined // @describe describe-undefined "undefined"
diff --git a/vendor/golang.org/x/tools/cmd/guru/testdata/src/alias/alias.golden b/vendor/golang.org/x/tools/cmd/guru/testdata/src/alias/alias.golden
deleted file mode 100644
index b5ba46e..0000000
--- a/vendor/golang.org/x/tools/cmd/guru/testdata/src/alias/alias.golden
+++ /dev/null
@@ -1,47 +0,0 @@
--------- @describe describe-pkg --------
-definition of package "alias"
- type I interface{f()}
- method (I) f()
- type M = N
- method (N) f()
- type N int
- method (N) f()
- type O int
- type P = struct{N}
- method (struct{N}) f()
- type U = invalid type
- var m N
-
--------- @implements implements-I --------
-interface type I
- is implemented by basic type N
-
--------- @describe describe-def-M --------
-alias of type N (size 8, align 8)
-defined as int
-Methods:
- method (N) f()
-
--------- @describe describe-ref-M --------
-alias of type N (size 8, align 8)
-defined as int
-Methods:
- method (N) f()
-
--------- @describe describe-O --------
-definition of type O (size 8, align 8)
-No methods.
-
--------- @describe describe-P --------
-type struct{N} (size 8, align 8)
-Methods:
- method (struct{N}) f()
-Fields:
- N N
-
--------- @describe describe-U --------
-alias of type invalid type
-
--------- @describe describe-undefined --------
-identifier
-
diff --git a/vendor/golang.org/x/tools/cmd/guru/testdata/src/calls-json/main.go b/vendor/golang.org/x/tools/cmd/guru/testdata/src/calls-json/main.go
deleted file mode 100644
index 9d58ed1..0000000
--- a/vendor/golang.org/x/tools/cmd/guru/testdata/src/calls-json/main.go
+++ /dev/null
@@ -1,16 +0,0 @@
-package main
-
-// Tests of call-graph queries, -format=json.
-// See go.tools/guru/guru_test.go for explanation.
-// See calls-json.golden for expected query results.
-
-func call(f func()) {
- f() // @callees @callees-f "f"
-}
-
-func main() {
- call(func() {
- // @callers callers-main.anon "^"
- // @callstack callstack-main.anon "^"
- })
-}
diff --git a/vendor/golang.org/x/tools/cmd/guru/testdata/src/calls-json/main.golden b/vendor/golang.org/x/tools/cmd/guru/testdata/src/calls-json/main.golden
deleted file mode 100644
index 27dc509..0000000
--- a/vendor/golang.org/x/tools/cmd/guru/testdata/src/calls-json/main.golden
+++ /dev/null
@@ -1,28 +0,0 @@
--------- @callees @callees-f --------
-{
- "pos": "testdata/src/calls-json/main.go:8:3",
- "desc": "dynamic function call",
- "callees": [
- {
- "name": "calls-json.main$1",
- "pos": "testdata/src/calls-json/main.go:12:7"
- }
- ]
-}
--------- @callstack callstack-main.anon --------
-{
- "pos": "testdata/src/calls-json/main.go:12:7",
- "target": "calls-json.main$1",
- "callers": [
- {
- "pos": "testdata/src/calls-json/main.go:8:3",
- "desc": "dynamic function call",
- "caller": "calls-json.call"
- },
- {
- "pos": "testdata/src/calls-json/main.go:12:6",
- "desc": "static function call",
- "caller": "calls-json.main"
- }
- ]
-}
diff --git a/vendor/golang.org/x/tools/cmd/guru/testdata/src/calls/main.go b/vendor/golang.org/x/tools/cmd/guru/testdata/src/calls/main.go
deleted file mode 100644
index a208914..0000000
--- a/vendor/golang.org/x/tools/cmd/guru/testdata/src/calls/main.go
+++ /dev/null
@@ -1,129 +0,0 @@
-package main
-
-import (
- "fmt"
-)
-
-// Tests of call-graph queries.
-// See go.tools/guru/guru_test.go for explanation.
-// See calls.golden for expected query results.
-
-func A(x *int) { // @pointsto pointsto-A-x "x"
- // @callers callers-A "^"
- // @callstack callstack-A "^"
-}
-
-func B(x *int) { // @pointsto pointsto-B-x "x"
- // @callers callers-B "^"
-}
-
-func foo() {
-}
-
-// apply is not (yet) treated context-sensitively.
-func apply(f func(x *int), x *int) {
- f(x) // @callees callees-apply "f"
- // @callers callers-apply "^"
-}
-
-// store *is* treated context-sensitively,
-// so the points-to sets for pc, pd are precise.
-func store(ptr **int, value *int) {
- *ptr = value
- // @callers callers-store "^"
-}
-
-func call(f func() *int) {
- // Result points to anon function.
- f() // @pointsto pointsto-result-f "f"
-
- // Target of call is anon function.
- f() // @callees callees-main.call-f "f"
-
- // @callers callers-main.call "^"
-}
-
-func main() {
- var a, b int
- go apply(A, &a) // @callees callees-main-apply1 "app"
- defer apply(B, &b)
-
- var c, d int
- var pc, pd *int // @pointsto pointsto-pc "pc"
- store(&pc, &c)
- store(&pd, &d)
- _ = pd // @pointsto pointsto-pd "pd"
-
- call(func() *int {
- // We are called twice from main.call
- // @callers callers-main.anon "^"
- return &a
- })
-
- // Errors
- _ = "no function call here" // @callees callees-err-no-call "no"
- print("builtin") // @callees callees-err-builtin "builtin"
- _ = string("type conversion") // @callees callees-err-conversion "str"
- call(nil) // @callees callees-err-bad-selection "call\\(nil"
- if false {
- main() // @callees callees-err-deadcode1 "main"
- }
- var nilFunc func()
- nilFunc() // @callees callees-err-nil-func "nilFunc"
- var i interface {
- f()
- }
- i.f() // @callees callees-err-nil-interface "i.f"
-
- i = new(myint)
- i.f() // @callees callees-not-a-wrapper "f"
-
- // statically dispatched calls. Handled specially by callees, so test that they work.
- foo() // @callees callees-static-call "foo"
- fmt.Println() // @callees callees-qualified-call "Println"
- m := new(method)
- m.f() // @callees callees-static-method-call "f"
- g := new(embeddedIface)
- g.iface = m
- g.f() // @callees callees-implicit-selection-method-call "f"
-}
-
-type myint int
-
-func (myint) f() {
- // @callers callers-not-a-wrapper "^"
-}
-
-type method int
-
-func (method) f() {
-}
-
-type embeddedIface struct {
- iface
-}
-
-type iface interface {
- f()
-}
-
-var dynamic = func() {}
-
-func deadcode() {
- main() // @callees callees-err-deadcode2 "main"
- // @callers callers-err-deadcode "^"
- // @callstack callstack-err-deadcode "^"
-
- // Within dead code, dynamic calls have no callees.
- dynamic() // @callees callees-err-deadcode3 "dynamic"
-}
-
-// This code belongs to init.
-var global = 123 // @callers callers-global "global"
-
-// The package initializer may be called by other packages' inits, or
-// in this case, the root of the callgraph. The source-level init functions
-// are in turn called by it.
-func init() {
- // @callstack callstack-init "^"
-}
diff --git a/vendor/golang.org/x/tools/cmd/guru/testdata/src/calls/main.golden b/vendor/golang.org/x/tools/cmd/guru/testdata/src/calls/main.golden
deleted file mode 100644
index ab68e95..0000000
--- a/vendor/golang.org/x/tools/cmd/guru/testdata/src/calls/main.golden
+++ /dev/null
@@ -1,125 +0,0 @@
--------- @pointsto pointsto-A-x --------
-this *int may point to these objects:
- a
- b
-
--------- @callstack callstack-A --------
-Found a call path from root to calls.A
-calls.A
-dynamic function call from calls.apply
-concurrent static function call from calls.main
-
--------- @pointsto pointsto-B-x --------
-this *int may point to these objects:
- a
- b
-
--------- @callers callers-B --------
-calls.B is called from these 1 sites:
- dynamic function call from calls.apply
-
--------- @callees callees-apply --------
-this dynamic function call dispatches to:
- calls.A
- calls.B
-
--------- @callers callers-apply --------
-calls.apply is called from these 2 sites:
- concurrent static function call from calls.main
- deferred static function call from calls.main
-
--------- @callers callers-store --------
-calls.store is called from these 2 sites:
- static function call from calls.main
- static function call from calls.main
-
--------- @pointsto pointsto-result-f --------
-this func() *int may point to these objects:
- calls.main$1
-
--------- @callees callees-main.call-f --------
-this dynamic function call dispatches to:
- calls.main$1
-
--------- @callers callers-main.call --------
-calls.call is called from these 2 sites:
- static function call from calls.main
- static function call from calls.main
-
--------- @callees callees-main-apply1 --------
-this static function call dispatches to:
- calls.apply
-
--------- @pointsto pointsto-pc --------
-this *int may point to these objects:
- c
-
--------- @pointsto pointsto-pd --------
-this *int may point to these objects:
- d
-
--------- @callees callees-err-no-call --------
-
-Error: there is no function call here
--------- @callees callees-err-builtin --------
-
-Error: this is a call to the built-in 'print' operator
--------- @callees callees-err-conversion --------
-
-Error: this is a type conversion, not a function call
--------- @callees callees-err-bad-selection --------
-
-Error: ambiguous selection within function call (or conversion)
--------- @callees callees-err-deadcode1 --------
-this static function call dispatches to:
- calls.main
-
--------- @callees callees-err-nil-func --------
-dynamic function call on nil value
-
--------- @callees callees-err-nil-interface --------
-dynamic method call on nil value
-
--------- @callees callees-not-a-wrapper --------
-this dynamic method call dispatches to:
- (calls.myint).f
-
--------- @callees callees-static-call --------
-this static function call dispatches to:
- calls.foo
-
--------- @callees callees-qualified-call --------
-this static function call dispatches to:
- fmt.Println
-
--------- @callees callees-static-method-call --------
-this static function call dispatches to:
- (calls.method).f
-
--------- @callees callees-implicit-selection-method-call --------
-this dynamic method call dispatches to:
- (calls.method).f
-
--------- @callers callers-not-a-wrapper --------
-(calls.myint).f is called from these 1 sites:
- dynamic method call from calls.main
-
--------- @callees callees-err-deadcode2 --------
-this static function call dispatches to:
- calls.main
-
--------- @callstack callstack-err-deadcode --------
-calls.deadcode is unreachable in this analysis scope
-
--------- @callees callees-err-deadcode3 --------
-
-Error: this call site is unreachable in this analysis
--------- @callers callers-global --------
-calls.init is called from these 1 sites:
-the root of the call graph
-
--------- @callstack callstack-init --------
-Found a call path from root to calls.init#1
-calls.init#1
-static function call from calls.init
-
diff --git a/vendor/golang.org/x/tools/cmd/guru/testdata/src/definition-json/main.go b/vendor/golang.org/x/tools/cmd/guru/testdata/src/definition-json/main.go
deleted file mode 100644
index 6408404..0000000
--- a/vendor/golang.org/x/tools/cmd/guru/testdata/src/definition-json/main.go
+++ /dev/null
@@ -1,66 +0,0 @@
-package definition
-
-// Tests of 'definition' query, -json output.
-// See golang.org/x/tools/cmd/guru/guru_test.go for explanation.
-// See main.golden for expected query results.
-
-// TODO(adonovan): test: selection of member of same package defined in another file.
-
-import (
- "lib"
- lib2 "lib"
-)
-
-func main() {
- var _ int // @definition builtin "int"
-
- var _ undef // @definition lexical-undef "undef"
- var x lib.T // @definition lexical-pkgname "lib"
- f() // @definition lexical-func "f"
- print(x) // @definition lexical-var "x"
- if x := ""; x == "" { // @definition lexical-shadowing "x"
- }
-
- var _ lib.Type // @definition qualified-type "Type"
- var _ lib.Func // @definition qualified-func "Func"
- var _ lib.Var // @definition qualified-var "Var"
- var _ lib.Const // @definition qualified-const "Const"
- var _ lib2.Type // @definition qualified-type-renaming "Type"
- var _ lib.Nonesuch // @definition qualified-nomember "Nonesuch"
-
- var u U
- print(u.field) // @definition select-field "field"
- u.method() // @definition select-method "method"
-}
-
-func f()
-
-type T struct{ field int }
-
-func (T) method()
-
-type U struct{ T }
-
-type V1 struct {
- W // @definition embedded-other-file "W"
-}
-
-type V2 struct {
- *W // @definition embedded-other-file-pointer "W"
-}
-
-type V3 struct {
- int // @definition embedded-basic "int"
-}
-
-type V4 struct {
- *int // @definition embedded-basic-pointer "int"
-}
-
-type V5 struct {
- lib.Type // @definition embedded-other-pkg "Type"
-}
-
-type V6 struct {
- T // @definition embedded-same-file "T"
-}
diff --git a/vendor/golang.org/x/tools/cmd/guru/testdata/src/definition-json/main.golden b/vendor/golang.org/x/tools/cmd/guru/testdata/src/definition-json/main.golden
deleted file mode 100644
index af0a687..0000000
--- a/vendor/golang.org/x/tools/cmd/guru/testdata/src/definition-json/main.golden
+++ /dev/null
@@ -1,90 +0,0 @@
--------- @definition builtin --------
-
-Error: int is built in
--------- @definition lexical-undef --------
-
-Error: no object for identifier
--------- @definition lexical-pkgname --------
-{
- "objpos": "testdata/src/definition-json/main.go:10:2",
- "desc": "package lib"
-}
--------- @definition lexical-func --------
-{
- "objpos": "$GOPATH/src/definition-json/main.go:36:6",
- "desc": "func f"
-}
--------- @definition lexical-var --------
-{
- "objpos": "$GOPATH/src/definition-json/main.go:18:6",
- "desc": "var x"
-}
--------- @definition lexical-shadowing --------
-{
- "objpos": "$GOPATH/src/definition-json/main.go:21:5",
- "desc": "var x"
-}
--------- @definition qualified-type --------
-{
- "objpos": "testdata/src/lib/lib.go:3:6",
- "desc": "type lib.Type"
-}
--------- @definition qualified-func --------
-{
- "objpos": "testdata/src/lib/lib.go:9:6",
- "desc": "func lib.Func"
-}
--------- @definition qualified-var --------
-{
- "objpos": "testdata/src/lib/lib.go:14:5",
- "desc": "var lib.Var"
-}
--------- @definition qualified-const --------
-{
- "objpos": "testdata/src/lib/lib.go:12:7",
- "desc": "const lib.Const"
-}
--------- @definition qualified-type-renaming --------
-{
- "objpos": "testdata/src/lib/lib.go:3:6",
- "desc": "type lib.Type"
-}
--------- @definition qualified-nomember --------
-
-Error: couldn't find declaration of Nonesuch in "lib"
--------- @definition select-field --------
-{
- "objpos": "testdata/src/definition-json/main.go:38:16",
- "desc": "field field int"
-}
--------- @definition select-method --------
-{
- "objpos": "testdata/src/definition-json/main.go:40:10",
- "desc": "func (T).method()"
-}
--------- @definition embedded-other-file --------
-{
- "objpos": "testdata/src/definition-json/type.go:3:6",
- "desc": "type W int"
-}
--------- @definition embedded-other-file-pointer --------
-{
- "objpos": "testdata/src/definition-json/type.go:3:6",
- "desc": "type W int"
-}
--------- @definition embedded-basic --------
-
-Error: int is built in
--------- @definition embedded-basic-pointer --------
-
-Error: int is built in
--------- @definition embedded-other-pkg --------
-{
- "objpos": "testdata/src/lib/lib.go:3:6",
- "desc": "type lib.Type"
-}
--------- @definition embedded-same-file --------
-{
- "objpos": "$GOPATH/src/definition-json/main.go:38:6",
- "desc": "type T"
-}
diff --git a/vendor/golang.org/x/tools/cmd/guru/testdata/src/definition-json/main19.go b/vendor/golang.org/x/tools/cmd/guru/testdata/src/definition-json/main19.go
deleted file mode 100644
index 9f047c3..0000000
--- a/vendor/golang.org/x/tools/cmd/guru/testdata/src/definition-json/main19.go
+++ /dev/null
@@ -1,5 +0,0 @@
-package definition
-
-import "nosuchpkg"
-
-var _ nosuchpkg.T // @definition qualified-nopkg "nosuchpkg"
diff --git a/vendor/golang.org/x/tools/cmd/guru/testdata/src/definition-json/main19.golden b/vendor/golang.org/x/tools/cmd/guru/testdata/src/definition-json/main19.golden
deleted file mode 100644
index 3281aa5..0000000
--- a/vendor/golang.org/x/tools/cmd/guru/testdata/src/definition-json/main19.golden
+++ /dev/null
@@ -1,5 +0,0 @@
--------- @definition qualified-nopkg --------
-{
- "objpos": "testdata/src/definition-json/main19.go:3:8",
- "desc": "package nosuchpkg"
-}
diff --git a/vendor/golang.org/x/tools/cmd/guru/testdata/src/definition-json/type.go b/vendor/golang.org/x/tools/cmd/guru/testdata/src/definition-json/type.go
deleted file mode 100644
index a574bf3..0000000
--- a/vendor/golang.org/x/tools/cmd/guru/testdata/src/definition-json/type.go
+++ /dev/null
@@ -1,3 +0,0 @@
-package definition
-
-type W int
diff --git a/vendor/golang.org/x/tools/cmd/guru/testdata/src/describe-json/main.go b/vendor/golang.org/x/tools/cmd/guru/testdata/src/describe-json/main.go
deleted file mode 100644
index 549dd8a..0000000
--- a/vendor/golang.org/x/tools/cmd/guru/testdata/src/describe-json/main.go
+++ /dev/null
@@ -1,29 +0,0 @@
-package describe // @describe pkgdecl "describe"
-
-// Tests of 'describe' query, -format=json.
-// See go.tools/guru/guru_test.go for explanation.
-// See describe-json.golden for expected query results.
-
-func main() {
- var s struct{ x [3]int }
- p := &s.x[0] // @describe desc-val-p "p"
- _ = p
-
- var i I = C(0)
- if i == nil {
- i = new(D)
- }
- print(i) // @describe desc-val-i "\\bi\\b"
-
- go main() // @describe desc-stmt "go"
-}
-
-type I interface {
- f()
-}
-
-type C int // @describe desc-type-C "C"
-type D struct{}
-
-func (c C) f() {}
-func (d *D) f() {}
diff --git a/vendor/golang.org/x/tools/cmd/guru/testdata/src/describe-json/main.golden b/vendor/golang.org/x/tools/cmd/guru/testdata/src/describe-json/main.golden
deleted file mode 100644
index 5806e0c..0000000
--- a/vendor/golang.org/x/tools/cmd/guru/testdata/src/describe-json/main.golden
+++ /dev/null
@@ -1,96 +0,0 @@
--------- @describe pkgdecl --------
-{
- "desc": "definition of package \"describe-json\"",
- "pos": "testdata/src/describe-json/main.go:1:9",
- "detail": "package",
- "package": {
- "path": "describe-json",
- "members": [
- {
- "name": "C",
- "type": "int",
- "pos": "testdata/src/describe-json/main.go:25:6",
- "kind": "type",
- "methods": [
- {
- "name": "method (C) f()",
- "pos": "testdata/src/describe-json/main.go:28:12"
- }
- ]
- },
- {
- "name": "D",
- "type": "struct{}",
- "pos": "testdata/src/describe-json/main.go:26:6",
- "kind": "type",
- "methods": [
- {
- "name": "method (*D) f()",
- "pos": "testdata/src/describe-json/main.go:29:13"
- }
- ]
- },
- {
- "name": "I",
- "type": "interface{f()}",
- "pos": "testdata/src/describe-json/main.go:21:6",
- "kind": "type",
- "methods": [
- {
- "name": "method (I) f()",
- "pos": "testdata/src/describe-json/main.go:22:2"
- }
- ]
- },
- {
- "name": "main",
- "type": "func()",
- "pos": "testdata/src/describe-json/main.go:7:6",
- "kind": "func"
- }
- ]
- }
-}
--------- @describe desc-val-p --------
-{
- "desc": "identifier",
- "pos": "testdata/src/describe-json/main.go:9:2",
- "detail": "value",
- "value": {
- "type": "*int",
- "objpos": "testdata/src/describe-json/main.go:9:2"
- }
-}
--------- @describe desc-val-i --------
-{
- "desc": "identifier",
- "pos": "testdata/src/describe-json/main.go:16:8",
- "detail": "value",
- "value": {
- "type": "I",
- "objpos": "testdata/src/describe-json/main.go:12:6"
- }
-}
--------- @describe desc-stmt --------
-{
- "desc": "go statement",
- "pos": "testdata/src/describe-json/main.go:18:2",
- "detail": "unknown"
-}
--------- @describe desc-type-C --------
-{
- "desc": "definition of type C (size 8, align 8)",
- "pos": "testdata/src/describe-json/main.go:25:6",
- "detail": "type",
- "type": {
- "type": "C",
- "namepos": "testdata/src/describe-json/main.go:25:6",
- "namedef": "int",
- "methods": [
- {
- "name": "method (C) f()",
- "pos": "testdata/src/describe-json/main.go:28:12"
- }
- ]
- }
-}
diff --git a/vendor/golang.org/x/tools/cmd/guru/testdata/src/describe/main.go b/vendor/golang.org/x/tools/cmd/guru/testdata/src/describe/main.go
deleted file mode 100644
index c6c5349..0000000
--- a/vendor/golang.org/x/tools/cmd/guru/testdata/src/describe/main.go
+++ /dev/null
@@ -1,102 +0,0 @@
-package describe // @describe pkgdecl "describe"
-
-// Tests of 'describe' query.
-// See go.tools/guru/guru_test.go for explanation.
-// See describe.golden for expected query results.
-
-// TODO(adonovan): more coverage of the (extensive) logic.
-
-import (
- "lib"
- _ "unsafe" // @describe unsafe "unsafe"
-)
-
-type cake float64 // @describe type-ref-builtin "float64"
-
-const c = iota // @describe const-ref-iota "iota"
-
-const pi = 3.141 // @describe const-def-pi "pi"
-const pie = cake(pi) // @describe const-def-pie "pie"
-const _ = pi // @describe const-ref-pi "pi"
-
-var global = new(string) // NB: ssa.Global is indirect, i.e. **string
-
-func main() { // @describe func-def-main "main"
- // func objects
- _ = main // @describe func-ref-main "main"
- _ = (*C).f // @describe func-ref-*C.f "..C..f"
- _ = D.f // @describe func-ref-D.f "D.f"
- _ = I.f // @describe func-ref-I.f "I.f"
- var d D // @describe type-D "D"
- var i I // @describe type-I "I"
- _ = d.f // @describe func-ref-d.f "d.f"
- _ = i.f // @describe func-ref-i.f "i.f"
-
- var dptr *D // @describe ptr-with-nonptr-methods "dptr"
- _ = dptr
-
- // var objects
- anon := func() {
- _ = d // @describe ref-lexical-d "d"
- }
- _ = anon // @describe ref-anon "anon"
- _ = global // @describe ref-global "global"
-
- // SSA affords some local flow sensitivity.
- var a, b int
- var x = &a // @describe var-def-x-1 "x"
- _ = x // @describe var-ref-x-1 "x"
- x = &b // @describe var-def-x-2 "x"
- _ = x // @describe var-ref-x-2 "x"
-
- i = new(C) // @describe var-ref-i-C "i"
- if i != nil {
- i = D{} // @describe var-ref-i-D "i"
- }
- print(i) // @describe var-ref-i "\\bi\\b"
-
- // const objects
- const localpi = 3.141 // @describe const-local-pi "localpi"
- const localpie = cake(pi) // @describe const-local-pie "localpie"
- const _ = localpi // @describe const-ref-localpi "localpi"
-
- // type objects
- type T int // @describe type-def-T "T"
- var three T = 3 // @describe type-ref-T "T"
- _ = three
-
- print(1 + 2*3) // @describe const-expr " 2.3"
- print(real(1+2i) - 3) // @describe const-expr2 "real.*3"
-
- m := map[string]*int{"a": &a}
- mapval, _ := m["a"] // @describe map-lookup,ok "m..a.."
- _ = mapval // @describe mapval "mapval"
- _ = m // @describe m "m"
-
- defer main() // @describe defer-stmt "defer"
- go main() // @describe go-stmt "go"
-
- panic(3) // @describe builtin-ref-panic "panic"
-
- var a2 int // @describe var-decl-stmt "var a2 int"
- _ = a2
- var _ int // @describe var-decl-stmt2 "var _ int"
- var _ int // @describe var-def-blank "_"
-
- var _ lib.Outer // @describe lib-outer "Outer"
-
- unknown() // @describe call-unknown "\\("
-}
-
-type I interface { // @describe def-iface-I "I"
- f() // @describe def-imethod-I.f "f"
-}
-
-type C int
-type D struct {
- Field int
- AnotherField string
-}
-
-func (c *C) f() {}
-func (d D) f() {}
diff --git a/vendor/golang.org/x/tools/cmd/guru/testdata/src/describe/main.golden b/vendor/golang.org/x/tools/cmd/guru/testdata/src/describe/main.golden
deleted file mode 100644
index 724643d..0000000
--- a/vendor/golang.org/x/tools/cmd/guru/testdata/src/describe/main.golden
+++ /dev/null
@@ -1,212 +0,0 @@
--------- @describe pkgdecl --------
-definition of package "describe"
- type C int
- method (*C) f()
- type D struct{...}
- method (D) f()
- type I interface{f()}
- method (I) f()
- const c untyped int = 0
- type cake float64
- var global *string
- func main func()
- const pi untyped float = 3.141
- const pie cake = 3.141
-
--------- @describe unsafe --------
-import of package "unsafe"
- builtin Alignof
- builtin Offsetof
- type Pointer unsafe.Pointer
- builtin Sizeof
-
--------- @describe type-ref-builtin --------
-reference to built-in type float64
-
--------- @describe const-ref-iota --------
-reference to const iota untyped int of value 0
-
--------- @describe const-def-pi --------
-definition of const pi untyped float of value 3.141
-
--------- @describe const-def-pie --------
-definition of const pie cake of value 3.141
-
--------- @describe const-ref-pi --------
-reference to const pi untyped float of value 3.141
-defined here
-
--------- @describe func-def-main --------
-definition of func main()
-
--------- @describe func-ref-main --------
-reference to func main()
-defined here
-
--------- @describe func-ref-*C.f --------
-reference to method func (*C).f()
-defined here
-
--------- @describe func-ref-D.f --------
-reference to method func (D).f()
-defined here
-
--------- @describe func-ref-I.f --------
-reference to interface method func (I).f()
-defined here
-
--------- @describe type-D --------
-reference to type D (size 24, align 8)
-defined as struct{Field int; AnotherField string}
-Methods:
- method (D) f()
-Fields:
- Field int
- AnotherField string
-
--------- @describe type-I --------
-reference to type I (size 16, align 8)
-defined as interface{f()}
-Methods:
- method (I) f()
-
--------- @describe func-ref-d.f --------
-reference to method func (D).f()
-defined here
-
--------- @describe func-ref-i.f --------
-reference to interface method func (I).f()
-defined here
-
--------- @describe ptr-with-nonptr-methods --------
-definition of var dptr *D
-Methods:
- method (*D) f()
-Fields:
- Field int
- AnotherField string
-
--------- @describe ref-lexical-d --------
-reference to var d D
-defined here
-Methods:
- method (D) f()
-Fields:
- Field int
- AnotherField string
-
--------- @describe ref-anon --------
-reference to var anon func()
-defined here
-
--------- @describe ref-global --------
-reference to var global *string
-defined here
-
--------- @describe var-def-x-1 --------
-definition of var x *int
-
--------- @describe var-ref-x-1 --------
-reference to var x *int
-defined here
-
--------- @describe var-def-x-2 --------
-reference to var x *int
-defined here
-
--------- @describe var-ref-x-2 --------
-reference to var x *int
-defined here
-
--------- @describe var-ref-i-C --------
-reference to var i I
-defined here
-Methods:
- method (I) f()
-
--------- @describe var-ref-i-D --------
-reference to var i I
-defined here
-Methods:
- method (I) f()
-
--------- @describe var-ref-i --------
-reference to var i I
-defined here
-Methods:
- method (I) f()
-
--------- @describe const-local-pi --------
-definition of const localpi untyped float of value 3.141
-
--------- @describe const-local-pie --------
-definition of const localpie cake of value 3.141
-
--------- @describe const-ref-localpi --------
-reference to const localpi untyped float of value 3.141
-defined here
-
--------- @describe type-def-T --------
-definition of type T (size 8, align 8)
-No methods.
-
--------- @describe type-ref-T --------
-reference to type T (size 8, align 8)
-defined as int
-No methods.
-
--------- @describe const-expr --------
-binary * operation of value 6
-
--------- @describe const-expr2 --------
-binary - operation of value -2
-
--------- @describe map-lookup,ok --------
-index expression of type (*int, bool)
-
--------- @describe mapval --------
-reference to var mapval *int
-defined here
-
--------- @describe m --------
-reference to var m map[string]*int
-defined here
-
--------- @describe defer-stmt --------
-defer statement
-
--------- @describe go-stmt --------
-go statement
-
--------- @describe builtin-ref-panic --------
-function call (or conversion) of type ()
-
--------- @describe var-decl-stmt --------
-definition of var a2 int
-
--------- @describe var-decl-stmt2 --------
-definition of var _ int
-
--------- @describe var-def-blank --------
-definition of var _ int
-
--------- @describe lib-outer --------
-reference to type lib.Outer (size 56, align 8)
-defined as struct{A int; b int; lib.inner}
-No methods.
-Fields:
- A int
- inner.C bool
- inner.recursive.E bool
-
--------- @describe call-unknown --------
-function call of type invalid type
-
--------- @describe def-iface-I --------
-definition of type I (size 16, align 8)
-Methods:
- method (I) f()
-
--------- @describe def-imethod-I.f --------
-definition of interface method func (I).f()
-
diff --git a/vendor/golang.org/x/tools/cmd/guru/testdata/src/describe/main19.go b/vendor/golang.org/x/tools/cmd/guru/testdata/src/describe/main19.go
deleted file mode 100644
index 2068f8c..0000000
--- a/vendor/golang.org/x/tools/cmd/guru/testdata/src/describe/main19.go
+++ /dev/null
@@ -1,13 +0,0 @@
-package describe
-
-// The behavior of "describe" on a non-existent import changed
-// when go/types started returning fake packages, so this test
-// is executed only under go1.9.
-
-import (
- "nosuchpkg" // @describe badimport1 "nosuchpkg"
- nosuchpkg2 "nosuchpkg" // @describe badimport2 "nosuchpkg2"
-)
-
-var _ nosuchpkg.T
-var _ nosuchpkg2.T
diff --git a/vendor/golang.org/x/tools/cmd/guru/testdata/src/describe/main19.golden b/vendor/golang.org/x/tools/cmd/guru/testdata/src/describe/main19.golden
deleted file mode 100644
index 005e30b..0000000
--- a/vendor/golang.org/x/tools/cmd/guru/testdata/src/describe/main19.golden
+++ /dev/null
@@ -1,6 +0,0 @@
--------- @describe badimport1 --------
-import of package "nosuchpkg"
-
--------- @describe badimport2 --------
-reference to package "nosuchpkg"
-
diff --git a/vendor/golang.org/x/tools/cmd/guru/testdata/src/freevars/main.go b/vendor/golang.org/x/tools/cmd/guru/testdata/src/freevars/main.go
deleted file mode 100644
index c6aa08d..0000000
--- a/vendor/golang.org/x/tools/cmd/guru/testdata/src/freevars/main.go
+++ /dev/null
@@ -1,40 +0,0 @@
-package main
-
-// Tests of 'freevars' query.
-// See go.tools/guru/guru_test.go for explanation.
-// See freevars.golden for expected query results.
-
-// TODO(adonovan): it's hard to test this query in a single line of gofmt'd code.
-
-type T struct {
- a, b int
-}
-
-type S struct {
- x int
- t T
-}
-
-func f(int) {}
-
-func main() {
- type C int
- x := 1
- const exp = 6
- if y := 2; x+y+int(C(3)) != exp { // @freevars fv1 "if.*{"
- panic("expected 6")
- }
-
- var s S
-
- for x, y := range "foo" {
- println(s.x + s.t.a + s.t.b + x + int(y)) // @freevars fv2 "print.*y."
- }
-
- f(x) // @freevars fv3 "f.x."
-
-loop: // @freevars fv-def-label "loop:"
- for {
- break loop // @freevars fv-ref-label "break loop"
- }
-}
diff --git a/vendor/golang.org/x/tools/cmd/guru/testdata/src/freevars/main.golden b/vendor/golang.org/x/tools/cmd/guru/testdata/src/freevars/main.golden
deleted file mode 100644
index a3bc0c9..0000000
--- a/vendor/golang.org/x/tools/cmd/guru/testdata/src/freevars/main.golden
+++ /dev/null
@@ -1,25 +0,0 @@
--------- @freevars fv1 --------
-Free identifiers:
-type C
-const exp int
-var x int
-
--------- @freevars fv2 --------
-Free identifiers:
-var s.t.a int
-var s.t.b int
-var s.x int
-var x int
-var y rune
-
--------- @freevars fv3 --------
-Free identifiers:
-var x int
-
--------- @freevars fv-def-label --------
-No free identifiers.
-
--------- @freevars fv-ref-label --------
-Free identifiers:
-label loop
-
diff --git a/vendor/golang.org/x/tools/cmd/guru/testdata/src/implements-json/main.go b/vendor/golang.org/x/tools/cmd/guru/testdata/src/implements-json/main.go
deleted file mode 100644
index e18a373..0000000
--- a/vendor/golang.org/x/tools/cmd/guru/testdata/src/implements-json/main.go
+++ /dev/null
@@ -1,27 +0,0 @@
-package main
-
-// Tests of 'implements' query, -output=json.
-// See go.tools/guru/guru_test.go for explanation.
-// See implements.golden for expected query results.
-
-func main() {
-}
-
-type E interface{} // @implements E "E"
-
-type F interface { // @implements F "F"
- f()
-}
-
-type FG interface { // @implements FG "FG"
- f()
- g() []int // @implements slice "..int"
-}
-
-type C int // @implements C "C"
-type D struct{}
-
-func (c *C) f() {} // @implements starC ".C"
-func (d D) f() {} // @implements D "D"
-
-func (d *D) g() []int { return nil } // @implements starD ".D"
diff --git a/vendor/golang.org/x/tools/cmd/guru/testdata/src/implements-json/main.golden b/vendor/golang.org/x/tools/cmd/guru/testdata/src/implements-json/main.golden
deleted file mode 100644
index ce18c1c..0000000
--- a/vendor/golang.org/x/tools/cmd/guru/testdata/src/implements-json/main.golden
+++ /dev/null
@@ -1,135 +0,0 @@
--------- @implements E --------
-{
- "type": {
- "name": "implements-json.E",
- "pos": "testdata/src/implements-json/main.go:10:6",
- "kind": "interface"
- }
-}
--------- @implements F --------
-{
- "type": {
- "name": "implements-json.F",
- "pos": "testdata/src/implements-json/main.go:12:6",
- "kind": "interface"
- },
- "to": [
- {
- "name": "*implements-json.C",
- "pos": "testdata/src/implements-json/main.go:21:6",
- "kind": "pointer"
- },
- {
- "name": "implements-json.D",
- "pos": "testdata/src/implements-json/main.go:22:6",
- "kind": "struct"
- },
- {
- "name": "implements-json.FG",
- "pos": "testdata/src/implements-json/main.go:16:6",
- "kind": "interface"
- }
- ]
-}
--------- @implements FG --------
-{
- "type": {
- "name": "implements-json.FG",
- "pos": "testdata/src/implements-json/main.go:16:6",
- "kind": "interface"
- },
- "to": [
- {
- "name": "*implements-json.D",
- "pos": "testdata/src/implements-json/main.go:22:6",
- "kind": "pointer"
- }
- ],
- "from": [
- {
- "name": "implements-json.F",
- "pos": "testdata/src/implements-json/main.go:12:6",
- "kind": "interface"
- }
- ]
-}
--------- @implements slice --------
-{
- "type": {
- "name": "[]int",
- "pos": "-",
- "kind": "slice"
- }
-}
--------- @implements C --------
-{
- "type": {
- "name": "implements-json.C",
- "pos": "testdata/src/implements-json/main.go:21:6",
- "kind": "basic"
- },
- "fromptr": [
- {
- "name": "implements-json.F",
- "pos": "testdata/src/implements-json/main.go:12:6",
- "kind": "interface"
- }
- ]
-}
--------- @implements starC --------
-{
- "type": {
- "name": "*implements-json.C",
- "pos": "testdata/src/implements-json/main.go:21:6",
- "kind": "pointer"
- },
- "from": [
- {
- "name": "implements-json.F",
- "pos": "testdata/src/implements-json/main.go:12:6",
- "kind": "interface"
- }
- ]
-}
--------- @implements D --------
-{
- "type": {
- "name": "implements-json.D",
- "pos": "testdata/src/implements-json/main.go:22:6",
- "kind": "struct"
- },
- "from": [
- {
- "name": "implements-json.F",
- "pos": "testdata/src/implements-json/main.go:12:6",
- "kind": "interface"
- }
- ],
- "fromptr": [
- {
- "name": "implements-json.FG",
- "pos": "testdata/src/implements-json/main.go:16:6",
- "kind": "interface"
- }
- ]
-}
--------- @implements starD --------
-{
- "type": {
- "name": "*implements-json.D",
- "pos": "testdata/src/implements-json/main.go:22:6",
- "kind": "pointer"
- },
- "from": [
- {
- "name": "implements-json.F",
- "pos": "testdata/src/implements-json/main.go:12:6",
- "kind": "interface"
- },
- {
- "name": "implements-json.FG",
- "pos": "testdata/src/implements-json/main.go:16:6",
- "kind": "interface"
- }
- ]
-}
diff --git a/vendor/golang.org/x/tools/cmd/guru/testdata/src/implements-methods-json/main.go b/vendor/golang.org/x/tools/cmd/guru/testdata/src/implements-methods-json/main.go
deleted file mode 100644
index 646276d..0000000
--- a/vendor/golang.org/x/tools/cmd/guru/testdata/src/implements-methods-json/main.go
+++ /dev/null
@@ -1,37 +0,0 @@
-package main
-
-// Tests of 'implements' query applied to methods, -output=json.
-// See go.tools/guru/guru_test.go for explanation.
-// See implements-methods.golden for expected query results.
-
-import _ "lib"
-
-func main() {
-}
-
-type F interface {
- f() // @implements F.f "f"
-}
-
-type FG interface {
- f() // @implements FG.f "f"
- g() []int // @implements FG.g "g"
-}
-
-type C int
-type D struct{}
-
-func (c *C) f() {} // @implements *C.f "f"
-func (d D) f() {} // @implements D.f "f"
-
-func (d *D) g() []int { return nil } // @implements *D.g "g"
-
-type sorter []int
-
-func (sorter) Len() int { return 0 } // @implements Len "Len"
-func (sorter) Less(i, j int) bool { return false }
-func (sorter) Swap(i, j int) {}
-
-type I interface {
- Method(*int) *int // @implements I.Method "Method"
-}
diff --git a/vendor/golang.org/x/tools/cmd/guru/testdata/src/implements-methods-json/main.golden b/vendor/golang.org/x/tools/cmd/guru/testdata/src/implements-methods-json/main.golden
deleted file mode 100644
index 137261b..0000000
--- a/vendor/golang.org/x/tools/cmd/guru/testdata/src/implements-methods-json/main.golden
+++ /dev/null
@@ -1,266 +0,0 @@
--------- @implements F.f --------
-{
- "type": {
- "name": "implements-methods-json.F",
- "pos": "testdata/src/implements-methods-json/main.go:12:6",
- "kind": "interface"
- },
- "to": [
- {
- "name": "*implements-methods-json.C",
- "pos": "testdata/src/implements-methods-json/main.go:21:6",
- "kind": "pointer"
- },
- {
- "name": "implements-methods-json.D",
- "pos": "testdata/src/implements-methods-json/main.go:22:6",
- "kind": "struct"
- },
- {
- "name": "implements-methods-json.FG",
- "pos": "testdata/src/implements-methods-json/main.go:16:6",
- "kind": "interface"
- }
- ],
- "method": {
- "name": "func (F).f()",
- "pos": "testdata/src/implements-methods-json/main.go:13:2"
- },
- "to_method": [
- {
- "name": "method (*C) f()",
- "pos": "testdata/src/implements-methods-json/main.go:24:13"
- },
- {
- "name": "method (D) f()",
- "pos": "testdata/src/implements-methods-json/main.go:25:12"
- },
- {
- "name": "method (FG) f()",
- "pos": "testdata/src/implements-methods-json/main.go:17:2"
- }
- ]
-}
--------- @implements FG.f --------
-{
- "type": {
- "name": "implements-methods-json.FG",
- "pos": "testdata/src/implements-methods-json/main.go:16:6",
- "kind": "interface"
- },
- "to": [
- {
- "name": "*implements-methods-json.D",
- "pos": "testdata/src/implements-methods-json/main.go:22:6",
- "kind": "pointer"
- }
- ],
- "from": [
- {
- "name": "implements-methods-json.F",
- "pos": "testdata/src/implements-methods-json/main.go:12:6",
- "kind": "interface"
- }
- ],
- "method": {
- "name": "func (FG).f()",
- "pos": "testdata/src/implements-methods-json/main.go:17:2"
- },
- "to_method": [
- {
- "name": "method (*D) f()",
- "pos": "testdata/src/implements-methods-json/main.go:25:12"
- }
- ],
- "from_method": [
- {
- "name": "method (F) f()",
- "pos": "testdata/src/implements-methods-json/main.go:13:2"
- }
- ]
-}
--------- @implements FG.g --------
-{
- "type": {
- "name": "implements-methods-json.FG",
- "pos": "testdata/src/implements-methods-json/main.go:16:6",
- "kind": "interface"
- },
- "to": [
- {
- "name": "*implements-methods-json.D",
- "pos": "testdata/src/implements-methods-json/main.go:22:6",
- "kind": "pointer"
- }
- ],
- "from": [
- {
- "name": "implements-methods-json.F",
- "pos": "testdata/src/implements-methods-json/main.go:12:6",
- "kind": "interface"
- }
- ],
- "method": {
- "name": "func (FG).g() []int",
- "pos": "testdata/src/implements-methods-json/main.go:18:2"
- },
- "to_method": [
- {
- "name": "method (*D) g() []int",
- "pos": "testdata/src/implements-methods-json/main.go:27:13"
- }
- ],
- "from_method": [
- {
- "name": "",
- "pos": ""
- }
- ]
-}
--------- @implements *C.f --------
-{
- "type": {
- "name": "*implements-methods-json.C",
- "pos": "testdata/src/implements-methods-json/main.go:21:6",
- "kind": "pointer"
- },
- "from": [
- {
- "name": "implements-methods-json.F",
- "pos": "testdata/src/implements-methods-json/main.go:12:6",
- "kind": "interface"
- }
- ],
- "method": {
- "name": "func (*C).f()",
- "pos": "testdata/src/implements-methods-json/main.go:24:13"
- },
- "from_method": [
- {
- "name": "method (F) f()",
- "pos": "testdata/src/implements-methods-json/main.go:13:2"
- }
- ]
-}
--------- @implements D.f --------
-{
- "type": {
- "name": "implements-methods-json.D",
- "pos": "testdata/src/implements-methods-json/main.go:22:6",
- "kind": "struct"
- },
- "from": [
- {
- "name": "implements-methods-json.F",
- "pos": "testdata/src/implements-methods-json/main.go:12:6",
- "kind": "interface"
- }
- ],
- "fromptr": [
- {
- "name": "implements-methods-json.FG",
- "pos": "testdata/src/implements-methods-json/main.go:16:6",
- "kind": "interface"
- }
- ],
- "method": {
- "name": "func (D).f()",
- "pos": "testdata/src/implements-methods-json/main.go:25:12"
- },
- "from_method": [
- {
- "name": "method (F) f()",
- "pos": "testdata/src/implements-methods-json/main.go:13:2"
- }
- ],
- "fromptr_method": [
- {
- "name": "method (FG) f()",
- "pos": "testdata/src/implements-methods-json/main.go:17:2"
- }
- ]
-}
--------- @implements *D.g --------
-{
- "type": {
- "name": "*implements-methods-json.D",
- "pos": "testdata/src/implements-methods-json/main.go:22:6",
- "kind": "pointer"
- },
- "from": [
- {
- "name": "implements-methods-json.F",
- "pos": "testdata/src/implements-methods-json/main.go:12:6",
- "kind": "interface"
- },
- {
- "name": "implements-methods-json.FG",
- "pos": "testdata/src/implements-methods-json/main.go:16:6",
- "kind": "interface"
- }
- ],
- "method": {
- "name": "func (*D).g() []int",
- "pos": "testdata/src/implements-methods-json/main.go:27:13"
- },
- "from_method": [
- {
- "name": "",
- "pos": ""
- },
- {
- "name": "method (FG) g() []int",
- "pos": "testdata/src/implements-methods-json/main.go:18:2"
- }
- ]
-}
--------- @implements Len --------
-{
- "type": {
- "name": "implements-methods-json.sorter",
- "pos": "testdata/src/implements-methods-json/main.go:29:6",
- "kind": "slice"
- },
- "from": [
- {
- "name": "lib.Sorter",
- "pos": "testdata/src/lib/lib.go:16:6",
- "kind": "interface"
- }
- ],
- "method": {
- "name": "func (sorter).Len() int",
- "pos": "testdata/src/implements-methods-json/main.go:31:15"
- },
- "from_method": [
- {
- "name": "method (lib.Sorter) Len() int",
- "pos": "testdata/src/lib/lib.go:17:2"
- }
- ]
-}
--------- @implements I.Method --------
-{
- "type": {
- "name": "implements-methods-json.I",
- "pos": "testdata/src/implements-methods-json/main.go:35:6",
- "kind": "interface"
- },
- "to": [
- {
- "name": "lib.Type",
- "pos": "testdata/src/lib/lib.go:3:6",
- "kind": "basic"
- }
- ],
- "method": {
- "name": "func (I).Method(*int) *int",
- "pos": "testdata/src/implements-methods-json/main.go:36:2"
- },
- "to_method": [
- {
- "name": "method (lib.Type) Method(x *int) *int",
- "pos": "testdata/src/lib/lib.go:5:13"
- }
- ]
-}
diff --git a/vendor/golang.org/x/tools/cmd/guru/testdata/src/implements-methods/main.go b/vendor/golang.org/x/tools/cmd/guru/testdata/src/implements-methods/main.go
deleted file mode 100644
index 757be44..0000000
--- a/vendor/golang.org/x/tools/cmd/guru/testdata/src/implements-methods/main.go
+++ /dev/null
@@ -1,37 +0,0 @@
-package main
-
-// Tests of 'implements' query applied to methods.
-// See go.tools/guru/guru_test.go for explanation.
-// See implements-methods.golden for expected query results.
-
-import _ "lib"
-
-func main() {
-}
-
-type F interface {
- f() // @implements F.f "f"
-}
-
-type FG interface {
- f() // @implements FG.f "f"
- g() []int // @implements FG.g "g"
-}
-
-type C int
-type D struct{}
-
-func (c *C) f() {} // @implements *C.f "f"
-func (d D) f() {} // @implements D.f "f"
-
-func (d *D) g() []int { return nil } // @implements *D.g "g"
-
-type sorter []int
-
-func (sorter) Len() int { return 0 } // @implements Len "Len"
-func (sorter) Less(i, j int) bool { return false }
-func (sorter) Swap(i, j int) {}
-
-type I interface {
- Method(*int) *int // @implements I.Method "Method"
-}
diff --git a/vendor/golang.org/x/tools/cmd/guru/testdata/src/implements-methods/main.golden b/vendor/golang.org/x/tools/cmd/guru/testdata/src/implements-methods/main.golden
deleted file mode 100644
index bd591e8..0000000
--- a/vendor/golang.org/x/tools/cmd/guru/testdata/src/implements-methods/main.golden
+++ /dev/null
@@ -1,37 +0,0 @@
--------- @implements F.f --------
-abstract method func (F).f()
- is implemented by method (*C).f
- is implemented by method (D).f
- is implemented by method (FG).f
-
--------- @implements FG.f --------
-abstract method func (FG).f()
- is implemented by method (*D).f
- implements method (F).f
-
--------- @implements FG.g --------
-abstract method func (FG).g() []int
- is implemented by method (*D).g
-
--------- @implements *C.f --------
-concrete method func (*C).f()
- implements method (F).f
-
--------- @implements D.f --------
-concrete method func (D).f()
- implements method (F).f
-concrete method func (D).f()
- implements method (FG).f
-
--------- @implements *D.g --------
-concrete method func (*D).g() []int
- implements method (FG).g
-
--------- @implements Len --------
-concrete method func (sorter).Len() int
- implements method (lib.Sorter).Len
-
--------- @implements I.Method --------
-abstract method func (I).Method(*int) *int
- is implemented by method (lib.Type).Method
-
diff --git a/vendor/golang.org/x/tools/cmd/guru/testdata/src/implements/main.go b/vendor/golang.org/x/tools/cmd/guru/testdata/src/implements/main.go
deleted file mode 100644
index fea9006..0000000
--- a/vendor/golang.org/x/tools/cmd/guru/testdata/src/implements/main.go
+++ /dev/null
@@ -1,44 +0,0 @@
-package main
-
-// Tests of 'implements' query.
-// See go.tools/guru/guru_test.go for explanation.
-// See implements.golden for expected query results.
-
-import _ "lib"
-
-func main() {
-}
-
-type E interface{} // @implements E "E"
-
-type F interface { // @implements F "F"
- f()
-}
-
-type FG interface { // @implements FG "FG"
- f()
- g() []int // @implements slice "..int"
-}
-
-type C int // @implements C "C"
-type D struct{}
-
-func (c *C) f() {} // @implements starC ".C"
-func (d D) f() {} // @implements D "D"
-
-func (d *D) g() []int { return nil } // @implements starD ".D"
-
-type sorter []int // @implements sorter "sorter"
-
-func (sorter) Len() int { return 0 }
-func (sorter) Less(i, j int) bool { return false }
-func (sorter) Swap(i, j int) {}
-
-type I interface { // @implements I "I"
- Method(*int) *int
-}
-
-func _() {
- var d D
- _ = d // @implements var_d "d"
-}
diff --git a/vendor/golang.org/x/tools/cmd/guru/testdata/src/implements/main.golden b/vendor/golang.org/x/tools/cmd/guru/testdata/src/implements/main.golden
deleted file mode 100644
index 1077c98..0000000
--- a/vendor/golang.org/x/tools/cmd/guru/testdata/src/implements/main.golden
+++ /dev/null
@@ -1,50 +0,0 @@
--------- @implements E --------
-empty interface type E
-
--------- @implements F --------
-interface type F
- is implemented by pointer type *C
- is implemented by struct type D
- is implemented by interface type FG
-
--------- @implements FG --------
-interface type FG
- is implemented by pointer type *D
- implements F
-
--------- @implements slice --------
-slice type []int implements only interface{}
-
--------- @implements C --------
-pointer type *C
- implements F
-
--------- @implements starC --------
-pointer type *C
- implements F
-
--------- @implements D --------
-struct type D
- implements F
-pointer type *D
- implements FG
-
--------- @implements starD --------
-pointer type *D
- implements F
- implements FG
-
--------- @implements sorter --------
-slice type sorter
- implements lib.Sorter
-
--------- @implements I --------
-interface type I
- is implemented by basic type lib.Type
-
--------- @implements var_d --------
-struct type D
- implements F
-pointer type *D
- implements FG
-
diff --git a/vendor/golang.org/x/tools/cmd/guru/testdata/src/imports/main.go b/vendor/golang.org/x/tools/cmd/guru/testdata/src/imports/main.go
deleted file mode 100644
index 9fe2b71..0000000
--- a/vendor/golang.org/x/tools/cmd/guru/testdata/src/imports/main.go
+++ /dev/null
@@ -1,29 +0,0 @@
-package main
-
-import (
- "lib" // @describe ref-pkg-import "lib"
- "lib/sublib" // @describe ref-pkg-import2 "sublib"
-)
-
-// Tests that import another package. (To make the tests run quickly,
-// we avoid using imports in all the other tests. Remember, each
-// query causes parsing and typechecking of the whole program.)
-//
-// See go.tools/guru/guru_test.go for explanation.
-// See imports.golden for expected query results.
-
-var a int
-
-func main() {
- const c = lib.Const // @describe ref-const "Const"
- lib.Func() // @describe ref-func "Func"
- lib.Var++ // @describe ref-var "Var"
- var t lib.Type // @describe ref-type "Type"
- p := t.Method(&a) // @describe ref-method "Method"
-
- print(*p + 1) // @pointsto p "p "
-
- var _ lib.Type // @describe ref-pkg "lib"
-
- _ = sublib.C
-}
diff --git a/vendor/golang.org/x/tools/cmd/guru/testdata/src/imports/main.golden b/vendor/golang.org/x/tools/cmd/guru/testdata/src/imports/main.golden
deleted file mode 100644
index 1e12217..0000000
--- a/vendor/golang.org/x/tools/cmd/guru/testdata/src/imports/main.golden
+++ /dev/null
@@ -1,56 +0,0 @@
--------- @describe ref-pkg-import --------
-import of package "lib"
- const Const untyped int = 3
- func Func func()
- type Outer struct{...}
- type Sorter interface{...}
- method (Sorter) Len() int
- method (Sorter) Less(i int, j int) bool
- method (Sorter) Swap(i int, j int)
- type Type int
- method (Type) Method(x *int) *int
- var Var int
-
--------- @describe ref-pkg-import2 --------
-import of package "lib/sublib"
- const C untyped int = 0
-
--------- @describe ref-const --------
-reference to const lib.Const untyped int of value 3
-defined here
-
--------- @describe ref-func --------
-reference to func lib.Func()
-defined here
-
--------- @describe ref-var --------
-reference to var lib.Var int
-defined here
-
--------- @describe ref-type --------
-reference to type lib.Type (size 8, align 8)
-defined as int
-Methods:
- method (Type) Method(x *int) *int
-
--------- @describe ref-method --------
-reference to method func (lib.Type).Method(x *int) *int
-defined here
-
--------- @pointsto p --------
-this *int may point to these objects:
- imports.a
-
--------- @describe ref-pkg --------
-reference to package "lib"
- const Const untyped int = 3
- func Func func()
- type Outer struct{...}
- type Sorter interface{...}
- method (Sorter) Len() int
- method (Sorter) Less(i int, j int) bool
- method (Sorter) Swap(i int, j int)
- type Type int
- method (Type) Method(x *int) *int
- var Var int
-
diff --git a/vendor/golang.org/x/tools/cmd/guru/testdata/src/lib/lib.go b/vendor/golang.org/x/tools/cmd/guru/testdata/src/lib/lib.go
deleted file mode 100644
index 742cdbf..0000000
--- a/vendor/golang.org/x/tools/cmd/guru/testdata/src/lib/lib.go
+++ /dev/null
@@ -1,37 +0,0 @@
-package lib
-
-type Type int
-
-func (Type) Method(x *int) *int {
- return x
-}
-
-func Func() {
-}
-
-const Const = 3
-
-var Var = 0
-
-type Sorter interface {
- Len() int
- Less(i, j int) bool
- Swap(i, j int)
-}
-
-type Outer struct {
- A int
- b int
- inner
-}
-
-type inner struct {
- C bool
- d string
- recursive
-}
-
-type recursive struct {
- E bool
- *inner
-}
diff --git a/vendor/golang.org/x/tools/cmd/guru/testdata/src/lib/sublib/sublib.go b/vendor/golang.org/x/tools/cmd/guru/testdata/src/lib/sublib/sublib.go
deleted file mode 100644
index 33c6498..0000000
--- a/vendor/golang.org/x/tools/cmd/guru/testdata/src/lib/sublib/sublib.go
+++ /dev/null
@@ -1,3 +0,0 @@
-package sublib
-
-const C = 0
diff --git a/vendor/golang.org/x/tools/cmd/guru/testdata/src/main/multi.go b/vendor/golang.org/x/tools/cmd/guru/testdata/src/main/multi.go
deleted file mode 100644
index 8c650cd..0000000
--- a/vendor/golang.org/x/tools/cmd/guru/testdata/src/main/multi.go
+++ /dev/null
@@ -1,13 +0,0 @@
-package main
-
-func g(x int) {
-}
-
-func f() {
- x := 1
- g(x) // "g(x)" is the selection for multiple queries
-}
-
-func main() {
- f()
-}
diff --git a/vendor/golang.org/x/tools/cmd/guru/testdata/src/peers-json/main.go b/vendor/golang.org/x/tools/cmd/guru/testdata/src/peers-json/main.go
deleted file mode 100644
index ef63992..0000000
--- a/vendor/golang.org/x/tools/cmd/guru/testdata/src/peers-json/main.go
+++ /dev/null
@@ -1,13 +0,0 @@
-package main
-
-// Tests of channel 'peers' query, -format=json.
-// See go.tools/guru/guru_test.go for explanation.
-// See peers-json.golden for expected query results.
-
-func main() {
- chA := make(chan *int)
- <-chA
- select {
- case <-chA: // @peers peer-recv-chA "<-"
- }
-}
diff --git a/vendor/golang.org/x/tools/cmd/guru/testdata/src/peers-json/main.golden b/vendor/golang.org/x/tools/cmd/guru/testdata/src/peers-json/main.golden
deleted file mode 100644
index 50d5716..0000000
--- a/vendor/golang.org/x/tools/cmd/guru/testdata/src/peers-json/main.golden
+++ /dev/null
@@ -1,12 +0,0 @@
--------- @peers peer-recv-chA --------
-{
- "pos": "testdata/src/peers-json/main.go:11:7",
- "type": "chan *int",
- "allocs": [
- "testdata/src/peers-json/main.go:8:13"
- ],
- "receives": [
- "testdata/src/peers-json/main.go:9:2",
- "testdata/src/peers-json/main.go:11:7"
- ]
-}
diff --git a/vendor/golang.org/x/tools/cmd/guru/testdata/src/peers/main.go b/vendor/golang.org/x/tools/cmd/guru/testdata/src/peers/main.go
deleted file mode 100644
index 40ee205..0000000
--- a/vendor/golang.org/x/tools/cmd/guru/testdata/src/peers/main.go
+++ /dev/null
@@ -1,52 +0,0 @@
-package main
-
-// Tests of channel 'peers' query.
-// See go.tools/guru/guru_test.go for explanation.
-// See peers.golden for expected query results.
-
-var a2 int
-
-func main() {
- chA := make(chan *int)
- a1 := 1
- chA <- &a1
-
- chA2 := make(chan *int, 2)
- if a2 == 0 {
- chA = chA2
- }
-
- chB := make(chan *int)
- b := 3
- chB <- &b
-
- <-chA // @pointsto pointsto-chA "chA"
- <-chA2 // @pointsto pointsto-chA2 "chA2"
- <-chB // @pointsto pointsto-chB "chB"
-
- select {
- case rA := <-chA: // @peers peer-recv-chA "<-"
- _ = rA // @pointsto pointsto-rA "rA"
- case rB := <-chB: // @peers peer-recv-chB "<-"
- _ = rB // @pointsto pointsto-rB "rB"
-
- case <-chA: // @peers peer-recv-chA' "<-"
-
- case chA2 <- &a2: // @peers peer-send-chA' "<-"
- }
-
- for range chA {
- }
-
- close(chA) // @peers peer-close-chA "chA"
-
- chC := make(chan *int)
- (close)(chC) // @peers peer-close-chC "chC"
-
- close := func(ch chan *int) chan *int {
- return ch
- }
-
- close(chC) <- &b // @peers peer-send-chC "chC"
- <-close(chC) // @peers peer-recv-chC "chC"
-}
diff --git a/vendor/golang.org/x/tools/cmd/guru/testdata/src/peers/main.golden b/vendor/golang.org/x/tools/cmd/guru/testdata/src/peers/main.golden
deleted file mode 100644
index f97e672..0000000
--- a/vendor/golang.org/x/tools/cmd/guru/testdata/src/peers/main.golden
+++ /dev/null
@@ -1,100 +0,0 @@
--------- @pointsto pointsto-chA --------
-this chan *int may point to these objects:
- makechan
- makechan
-
--------- @pointsto pointsto-chA2 --------
-this chan *int may point to these objects:
- makechan
-
--------- @pointsto pointsto-chB --------
-this chan *int may point to these objects:
- makechan
-
--------- @peers peer-recv-chA --------
-This channel of type chan *int may be:
- allocated here
- allocated here
- sent to, here
- sent to, here
- received from, here
- received from, here
- received from, here
- received from, here
- received from, here
- closed, here
-
--------- @pointsto pointsto-rA --------
-this *int may point to these objects:
- peers.a2
- a1
-
--------- @peers peer-recv-chB --------
-This channel of type chan *int may be:
- allocated here
- sent to, here
- received from, here
- received from, here
-
--------- @pointsto pointsto-rB --------
-this *int may point to these objects:
- b
-
--------- @peers peer-recv-chA' --------
-This channel of type chan *int may be:
- allocated here
- allocated here
- sent to, here
- sent to, here
- received from, here
- received from, here
- received from, here
- received from, here
- received from, here
- closed, here
-
--------- @peers peer-send-chA' --------
-This channel of type chan *int may be:
- allocated here
- sent to, here
- received from, here
- received from, here
- received from, here
- received from, here
- received from, here
- closed, here
-
--------- @peers peer-close-chA --------
-This channel of type chan *int may be:
- allocated here
- allocated here
- sent to, here
- sent to, here
- received from, here
- received from, here
- received from, here
- received from, here
- received from, here
- closed, here
-
--------- @peers peer-close-chC --------
-This channel of type chan *int may be:
- allocated here
- sent to, here
- received from, here
- closed, here
-
--------- @peers peer-send-chC --------
-This channel of type chan *int may be:
- allocated here
- sent to, here
- received from, here
- closed, here
-
--------- @peers peer-recv-chC --------
-This channel of type chan *int may be:
- allocated here
- sent to, here
- received from, here
- closed, here
-
diff --git a/vendor/golang.org/x/tools/cmd/guru/testdata/src/pointsto-json/main.go b/vendor/golang.org/x/tools/cmd/guru/testdata/src/pointsto-json/main.go
deleted file mode 100644
index 0a9f318..0000000
--- a/vendor/golang.org/x/tools/cmd/guru/testdata/src/pointsto-json/main.go
+++ /dev/null
@@ -1,27 +0,0 @@
-package main
-
-// Tests of 'pointsto' queries, -format=json.
-// See go.tools/guru/guru_test.go for explanation.
-// See pointsto-json.golden for expected query results.
-
-func main() { //
- var s struct{ x [3]int }
- p := &s.x[0] // @pointsto val-p "p"
- _ = p
-
- var i I = C(0)
- if i == nil {
- i = new(D)
- }
- print(i) // @pointsto val-i "\\bi\\b"
-}
-
-type I interface {
- f()
-}
-
-type C int
-type D struct{}
-
-func (c C) f() {}
-func (d *D) f() {}
diff --git a/vendor/golang.org/x/tools/cmd/guru/testdata/src/pointsto-json/main.golden b/vendor/golang.org/x/tools/cmd/guru/testdata/src/pointsto-json/main.golden
deleted file mode 100644
index 06a2204..0000000
--- a/vendor/golang.org/x/tools/cmd/guru/testdata/src/pointsto-json/main.golden
+++ /dev/null
@@ -1,29 +0,0 @@
--------- @pointsto val-p --------
-[
- {
- "type": "*int",
- "labels": [
- {
- "pos": "testdata/src/pointsto-json/main.go:8:6",
- "desc": "s.x[*]"
- }
- ]
- }
-]
--------- @pointsto val-i --------
-[
- {
- "type": "*D",
- "namepos": "testdata/src/pointsto-json/main.go:24:6",
- "labels": [
- {
- "pos": "testdata/src/pointsto-json/main.go:14:10",
- "desc": "new"
- }
- ]
- },
- {
- "type": "C",
- "namepos": "testdata/src/pointsto-json/main.go:23:6"
- }
-]
diff --git a/vendor/golang.org/x/tools/cmd/guru/testdata/src/pointsto/main.go b/vendor/golang.org/x/tools/cmd/guru/testdata/src/pointsto/main.go
deleted file mode 100644
index c4ba2e2..0000000
--- a/vendor/golang.org/x/tools/cmd/guru/testdata/src/pointsto/main.go
+++ /dev/null
@@ -1,75 +0,0 @@
-package main
-
-// Tests of 'pointsto' query.
-// See go.tools/guru/guru_test.go for explanation.
-// See pointsto.golden for expected query results.
-
-const pi = 3.141 // @pointsto const "pi"
-
-var global = new(string) // NB: ssa.Global is indirect, i.e. **string
-
-func main() {
- livecode()
-
- // func objects
- _ = main // @pointsto func-ref-main "main"
- _ = (*C).f // @pointsto func-ref-*C.f "..C..f"
- _ = D.f // @pointsto func-ref-D.f "D.f"
- _ = I.f // @pointsto func-ref-I.f "I.f"
- var d D
- var i I
- _ = d.f // @pointsto func-ref-d.f "d.f"
- _ = i.f // @pointsto func-ref-i.f "i.f"
-
- // var objects
- anon := func() {
- _ = d.f // @pointsto ref-lexical-d.f "d.f"
- }
- _ = anon // @pointsto ref-anon "anon"
- _ = global // @pointsto ref-global "global"
-
- // SSA affords some local flow sensitivity.
- var a, b int
- var x = &a // @pointsto var-def-x-1 "x"
- _ = x // @pointsto var-ref-x-1 "x"
- x = &b // @pointsto var-def-x-2 "x"
- _ = x // @pointsto var-ref-x-2 "x"
-
- i = new(C) // @pointsto var-ref-i-C "i"
- if i != nil {
- i = D{} // @pointsto var-ref-i-D "i"
- }
- print(i) // @pointsto var-ref-i "\\bi\\b"
-
- m := map[string]*int{"a": &a}
- mapval, _ := m["a"] // @pointsto map-lookup,ok "m..a.."
- _ = mapval // @pointsto mapval "mapval"
- _ = m // @pointsto m "m"
-
- if false {
- panic(3) // @pointsto builtin-panic "panic"
- }
-
- // NB: s.f is addressable per (*ssa.Program).VarValue,
- // but our query concerns the object, not its address.
- s := struct{ f interface{} }{f: make(chan bool)}
- print(s.f) // @pointsto var-ref-s-f "s.f"
-}
-
-func livecode() {} // @pointsto func-live "livecode"
-
-func deadcode() { // @pointsto func-dead "deadcode"
- // Pointer analysis can't run on dead code.
- var b = new(int) // @pointsto b "b"
- _ = b
-}
-
-type I interface {
- f()
-}
-
-type C int
-type D struct{}
-
-func (c *C) f() {}
-func (d D) f() {}
diff --git a/vendor/golang.org/x/tools/cmd/guru/testdata/src/pointsto/main.golden b/vendor/golang.org/x/tools/cmd/guru/testdata/src/pointsto/main.golden
deleted file mode 100644
index 7b12b2a..0000000
--- a/vendor/golang.org/x/tools/cmd/guru/testdata/src/pointsto/main.golden
+++ /dev/null
@@ -1,96 +0,0 @@
--------- @pointsto const --------
-
-Error: pointer analysis wants an expression of reference type; got untyped float
--------- @pointsto func-ref-main --------
-this func() may point to these objects:
- pointsto.main
-
--------- @pointsto func-ref-*C.f --------
-this func() may point to these objects:
- (*pointsto.C).f
-
--------- @pointsto func-ref-D.f --------
-this func() may point to these objects:
- (pointsto.D).f
-
--------- @pointsto func-ref-I.f --------
-
-Error: func (pointsto.I).f() is an interface method
--------- @pointsto func-ref-d.f --------
-this func() may point to these objects:
- (pointsto.D).f
-
--------- @pointsto func-ref-i.f --------
-
-Error: func (pointsto.I).f() is an interface method
--------- @pointsto ref-lexical-d.f --------
-this func() may point to these objects:
- (pointsto.D).f
-
--------- @pointsto ref-anon --------
-this func() may point to these objects:
- pointsto.main$1
-
--------- @pointsto ref-global --------
-this *string may point to these objects:
- new
-
--------- @pointsto var-def-x-1 --------
-this *int may point to these objects:
- a
-
--------- @pointsto var-ref-x-1 --------
-this *int may point to these objects:
- a
-
--------- @pointsto var-def-x-2 --------
-this *int may point to these objects:
- b
-
--------- @pointsto var-ref-x-2 --------
-this *int may point to these objects:
- b
-
--------- @pointsto var-ref-i-C --------
-this I may contain these dynamic types:
- *C, may point to:
- new
-
--------- @pointsto var-ref-i-D --------
-this I may contain these dynamic types:
- D
-
--------- @pointsto var-ref-i --------
-this I may contain these dynamic types:
- *C, may point to:
- new
- D
-
--------- @pointsto map-lookup,ok --------
-
-Error: pointer analysis wants an expression of reference type; got (*int, bool)
--------- @pointsto mapval --------
-this *int may point to these objects:
- a
-
--------- @pointsto m --------
-this map[string]*int may point to these objects:
- makemap
-
--------- @pointsto builtin-panic --------
-
-Error: pointer analysis wants an expression of reference type; got ()
--------- @pointsto var-ref-s-f --------
-this interface{} may contain these dynamic types:
- chan bool, may point to:
- makechan
-
--------- @pointsto func-live --------
-
-Error: pointer analysis did not find expression (dead code?)
--------- @pointsto func-dead --------
-
-Error: pointer analysis did not find expression (dead code?)
--------- @pointsto b --------
-
-Error: pointer analysis did not find expression (dead code?)
diff --git a/vendor/golang.org/x/tools/cmd/guru/testdata/src/referrers-json/main.go b/vendor/golang.org/x/tools/cmd/guru/testdata/src/referrers-json/main.go
deleted file mode 100644
index 0fd2342..0000000
--- a/vendor/golang.org/x/tools/cmd/guru/testdata/src/referrers-json/main.go
+++ /dev/null
@@ -1,24 +0,0 @@
-package main
-
-// Tests of 'referrers' query.
-// See go.tools/guru/guru_test.go for explanation.
-// See referrers.golden for expected query results.
-
-import "lib"
-
-type s struct {
- f int
-}
-
-func main() {
- var v lib.Type = lib.Const // @referrers ref-package "lib"
- _ = v.Method // @referrers ref-method "Method"
- _ = v.Method
- v++ //@referrers ref-local "v"
- v++
-
- _ = s{}.f // @referrers ref-field "f"
-
- var s2 s
- s2.f = 1
-}
diff --git a/vendor/golang.org/x/tools/cmd/guru/testdata/src/referrers-json/main.golden b/vendor/golang.org/x/tools/cmd/guru/testdata/src/referrers-json/main.golden
deleted file mode 100644
index 7bda141..0000000
--- a/vendor/golang.org/x/tools/cmd/guru/testdata/src/referrers-json/main.golden
+++ /dev/null
@@ -1,234 +0,0 @@
--------- @referrers ref-package --------
-{
- "desc": "package lib"
-}
-{
- "package": "definition-json",
- "refs": [
- {
- "pos": "testdata/src/definition-json/main.go:18:8",
- "text": "\tvar x lib.T // @definition lexical-pkgname \"lib\""
- },
- {
- "pos": "testdata/src/definition-json/main.go:24:8",
- "text": "\tvar _ lib.Type // @definition qualified-type \"Type\""
- },
- {
- "pos": "testdata/src/definition-json/main.go:25:8",
- "text": "\tvar _ lib.Func // @definition qualified-func \"Func\""
- },
- {
- "pos": "testdata/src/definition-json/main.go:26:8",
- "text": "\tvar _ lib.Var // @definition qualified-var \"Var\""
- },
- {
- "pos": "testdata/src/definition-json/main.go:27:8",
- "text": "\tvar _ lib.Const // @definition qualified-const \"Const\""
- },
- {
- "pos": "testdata/src/definition-json/main.go:28:8",
- "text": "\tvar _ lib2.Type // @definition qualified-type-renaming \"Type\""
- },
- {
- "pos": "testdata/src/definition-json/main.go:29:8",
- "text": "\tvar _ lib.Nonesuch // @definition qualified-nomember \"Nonesuch\""
- },
- {
- "pos": "testdata/src/definition-json/main.go:61:2",
- "text": "\tlib.Type // @definition embedded-other-pkg \"Type\""
- }
- ]
-}
-{
- "package": "describe",
- "refs": [
- {
- "pos": "testdata/src/describe/main.go:86:8",
- "text": "\tvar _ lib.Outer // @describe lib-outer \"Outer\""
- }
- ]
-}
-{
- "package": "imports",
- "refs": [
- {
- "pos": "testdata/src/imports/main.go:18:12",
- "text": "\tconst c = lib.Const // @describe ref-const \"Const\""
- },
- {
- "pos": "testdata/src/imports/main.go:19:2",
- "text": "\tlib.Func() // @describe ref-func \"Func\""
- },
- {
- "pos": "testdata/src/imports/main.go:20:2",
- "text": "\tlib.Var++ // @describe ref-var \"Var\""
- },
- {
- "pos": "testdata/src/imports/main.go:21:8",
- "text": "\tvar t lib.Type // @describe ref-type \"Type\""
- },
- {
- "pos": "testdata/src/imports/main.go:26:8",
- "text": "\tvar _ lib.Type // @describe ref-pkg \"lib\""
- }
- ]
-}
-{
- "package": "referrers",
- "refs": [
- {
- "pos": "testdata/src/referrers/int_test.go:7:7",
- "text": "\t_ = (lib.Type).Method // ref from internal test package"
- }
- ]
-}
-{
- "package": "referrers",
- "refs": [
- {
- "pos": "testdata/src/referrers/main.go:16:8",
- "text": "\tvar v lib.Type = lib.Const // @referrers ref-package \"lib\""
- },
- {
- "pos": "testdata/src/referrers/main.go:16:19",
- "text": "\tvar v lib.Type = lib.Const // @referrers ref-package \"lib\""
- }
- ]
-}
-{
- "package": "referrers-json",
- "refs": [
- {
- "pos": "testdata/src/referrers-json/main.go:14:8",
- "text": "\tvar v lib.Type = lib.Const // @referrers ref-package \"lib\""
- },
- {
- "pos": "testdata/src/referrers-json/main.go:14:19",
- "text": "\tvar v lib.Type = lib.Const // @referrers ref-package \"lib\""
- }
- ]
-}
-{
- "package": "referrers_test",
- "refs": [
- {
- "pos": "testdata/src/referrers/ext_test.go:10:7",
- "text": "\t_ = (lib.Type).Method // ref from external test package"
- }
- ]
-}
-{
- "package": "what-json",
- "refs": [
- {
- "pos": "testdata/src/what-json/main.go:13:7",
- "text": "var _ lib.Var // @what pkg \"lib\""
- },
- {
- "pos": "testdata/src/what-json/main.go:14:8",
- "text": "type _ lib.T"
- }
- ]
-}
--------- @referrers ref-method --------
-{
- "objpos": "testdata/src/lib/lib.go:5:13",
- "desc": "func (lib.Type).Method(x *int) *int"
-}
-{
- "package": "imports",
- "refs": [
- {
- "pos": "testdata/src/imports/main.go:22:9",
- "text": "\tp := t.Method(\u0026a) // @describe ref-method \"Method\""
- }
- ]
-}
-{
- "package": "referrers",
- "refs": [
- {
- "pos": "testdata/src/referrers/int_test.go:7:17",
- "text": "\t_ = (lib.Type).Method // ref from internal test package"
- }
- ]
-}
-{
- "package": "referrers",
- "refs": [
- {
- "pos": "testdata/src/referrers/main.go:17:8",
- "text": "\t_ = v.Method // @referrers ref-method \"Method\""
- },
- {
- "pos": "testdata/src/referrers/main.go:18:8",
- "text": "\t_ = v.Method"
- }
- ]
-}
-{
- "package": "referrers-json",
- "refs": [
- {
- "pos": "testdata/src/referrers-json/main.go:15:8",
- "text": "\t_ = v.Method // @referrers ref-method \"Method\""
- },
- {
- "pos": "testdata/src/referrers-json/main.go:16:8",
- "text": "\t_ = v.Method"
- }
- ]
-}
-{
- "package": "referrers_test",
- "refs": [
- {
- "pos": "testdata/src/referrers/ext_test.go:10:17",
- "text": "\t_ = (lib.Type).Method // ref from external test package"
- }
- ]
-}
--------- @referrers ref-local --------
-{
- "objpos": "testdata/src/referrers-json/main.go:14:6",
- "desc": "var v lib.Type"
-}
-{
- "package": "referrers-json",
- "refs": [
- {
- "pos": "testdata/src/referrers-json/main.go:15:6",
- "text": "\t_ = v.Method // @referrers ref-method \"Method\""
- },
- {
- "pos": "testdata/src/referrers-json/main.go:16:6",
- "text": "\t_ = v.Method"
- },
- {
- "pos": "testdata/src/referrers-json/main.go:17:2",
- "text": "\tv++ //@referrers ref-local \"v\""
- },
- {
- "pos": "testdata/src/referrers-json/main.go:18:2",
- "text": "\tv++"
- }
- ]
-}
--------- @referrers ref-field --------
-{
- "objpos": "testdata/src/referrers-json/main.go:10:2",
- "desc": "field f int"
-}
-{
- "package": "referrers-json",
- "refs": [
- {
- "pos": "testdata/src/referrers-json/main.go:20:10",
- "text": "\t_ = s{}.f // @referrers ref-field \"f\""
- },
- {
- "pos": "testdata/src/referrers-json/main.go:23:5",
- "text": "\ts2.f = 1"
- }
- ]
-}
diff --git a/vendor/golang.org/x/tools/cmd/guru/testdata/src/referrers/ext_test.go b/vendor/golang.org/x/tools/cmd/guru/testdata/src/referrers/ext_test.go
deleted file mode 100644
index 35e3199..0000000
--- a/vendor/golang.org/x/tools/cmd/guru/testdata/src/referrers/ext_test.go
+++ /dev/null
@@ -1,12 +0,0 @@
-package main_test
-
-import (
- "lib"
- renamed "referrers" // package has name "main", path "referrers", local name "renamed"
-)
-
-func _() {
- // This reference should be found by the ref-method query.
- _ = (lib.Type).Method // ref from external test package
- var _ renamed.T
-}
diff --git a/vendor/golang.org/x/tools/cmd/guru/testdata/src/referrers/int_test.go b/vendor/golang.org/x/tools/cmd/guru/testdata/src/referrers/int_test.go
deleted file mode 100644
index 9102cd6..0000000
--- a/vendor/golang.org/x/tools/cmd/guru/testdata/src/referrers/int_test.go
+++ /dev/null
@@ -1,8 +0,0 @@
-package main
-
-import "lib"
-
-func _() {
- // This reference should be found by the ref-method query.
- _ = (lib.Type).Method // ref from internal test package
-}
diff --git a/vendor/golang.org/x/tools/cmd/guru/testdata/src/referrers/main.go b/vendor/golang.org/x/tools/cmd/guru/testdata/src/referrers/main.go
deleted file mode 100644
index 1fc80ea..0000000
--- a/vendor/golang.org/x/tools/cmd/guru/testdata/src/referrers/main.go
+++ /dev/null
@@ -1,34 +0,0 @@
-package main // @referrers package-decl "main"
-
-// Tests of 'referrers' query.
-// See go.tools/guru/guru_test.go for explanation.
-// See referrers.golden for expected query results.
-
-import "lib"
-
-type s struct { // @referrers type " s "
- f int
-}
-
-type T int
-
-func main() {
- var v lib.Type = lib.Const // @referrers ref-package "lib"
- _ = v.Method // @referrers ref-method "Method"
- _ = v.Method
- v++ //@referrers ref-local "v"
- v++
-
- _ = s{}.f // @referrers ref-field "f"
-
- var s2 s
- s2.f = 1
-}
-
-// Test //line directives:
-
-type U int // @referrers ref-type-U "U"
-
-//line nosuchfile.y:123
-var u1 U
-var u2 U
diff --git a/vendor/golang.org/x/tools/cmd/guru/testdata/src/referrers/main.golden b/vendor/golang.org/x/tools/cmd/guru/testdata/src/referrers/main.golden
deleted file mode 100644
index 230e95e..0000000
--- a/vendor/golang.org/x/tools/cmd/guru/testdata/src/referrers/main.golden
+++ /dev/null
@@ -1,60 +0,0 @@
--------- @referrers package-decl --------
-references to package main ("referrers")
- var _ renamed.T
-
--------- @referrers type --------
-references to type s struct{f int}
- _ = s{}.f // @referrers ref-field "f"
- var s2 s
-
--------- @referrers ref-package --------
-references to package lib
- _ = (lib.Type).Method // ref from external test package
- _ = (lib.Type).Method // ref from internal test package
- const c = lib.Const // @describe ref-const "Const"
- lib.Func() // @describe ref-func "Func"
- lib.Type // @definition embedded-other-pkg "Type"
- lib.Var++ // @describe ref-var "Var"
- var _ lib.Const // @definition qualified-const "Const"
- var _ lib.Func // @definition qualified-func "Func"
- var _ lib.Nonesuch // @definition qualified-nomember "Nonesuch"
- var _ lib.Outer // @describe lib-outer "Outer"
- var _ lib.Type // @definition qualified-type "Type"
- var _ lib.Type // @describe ref-pkg "lib"
- var _ lib.Var // @definition qualified-var "Var"
- var _ lib2.Type // @definition qualified-type-renaming "Type"
- var t lib.Type // @describe ref-type "Type"
- var v lib.Type = lib.Const // @referrers ref-package "lib"
- var v lib.Type = lib.Const // @referrers ref-package "lib"
- var v lib.Type = lib.Const // @referrers ref-package "lib"
- var v lib.Type = lib.Const // @referrers ref-package "lib"
- var x lib.T // @definition lexical-pkgname "lib"
-type _ lib.T
-var _ lib.Var // @what pkg "lib"
-
--------- @referrers ref-method --------
-references to func (Type).Method(x *int) *int
- _ = (lib.Type).Method // ref from external test package
- _ = (lib.Type).Method // ref from internal test package
- _ = v.Method
- _ = v.Method
- _ = v.Method // @referrers ref-method "Method"
- _ = v.Method // @referrers ref-method "Method"
- p := t.Method(&a) // @describe ref-method "Method"
-
--------- @referrers ref-local --------
-references to var v lib.Type
- _ = v.Method
- _ = v.Method // @referrers ref-method "Method"
- v++
- v++ //@referrers ref-local "v"
-
--------- @referrers ref-field --------
-references to field f int
- _ = s{}.f // @referrers ref-field "f"
- s2.f = 1
-
--------- @referrers ref-type-U --------
-references to type U int
-open testdata/src/referrers/nosuchfile.y: no such file or directory (+ 1 more refs in this file)
-
diff --git a/vendor/golang.org/x/tools/cmd/guru/testdata/src/reflection/main.go b/vendor/golang.org/x/tools/cmd/guru/testdata/src/reflection/main.go
deleted file mode 100644
index 392643b..0000000
--- a/vendor/golang.org/x/tools/cmd/guru/testdata/src/reflection/main.go
+++ /dev/null
@@ -1,30 +0,0 @@
-package main
-
-// This is a test of 'pointsto', but we split it into a separate file
-// so that pointsto.go doesn't have to import "reflect" each time.
-
-import "reflect"
-
-var a int
-var b bool
-
-func main() {
- m := make(map[*int]*bool)
- m[&a] = &b
-
- mrv := reflect.ValueOf(m)
- if a > 0 {
- mrv = reflect.ValueOf(&b)
- }
- if a > 0 {
- mrv = reflect.ValueOf(&a)
- }
-
- _ = mrv // @pointsto mrv "mrv"
- p1 := mrv.Interface() // @pointsto p1 "p1"
- p2 := mrv.MapKeys() // @pointsto p2 "p2"
- p3 := p2[0] // @pointsto p3 "p3"
- p4 := reflect.TypeOf(p1) // @pointsto p4 "p4"
-
- _, _, _, _ = p1, p2, p3, p4
-}
diff --git a/vendor/golang.org/x/tools/cmd/guru/testdata/src/reflection/main.golden b/vendor/golang.org/x/tools/cmd/guru/testdata/src/reflection/main.golden
deleted file mode 100644
index 4782132..0000000
--- a/vendor/golang.org/x/tools/cmd/guru/testdata/src/reflection/main.golden
+++ /dev/null
@@ -1,34 +0,0 @@
--------- @pointsto mrv --------
-this reflect.Value may contain these dynamic types:
- *bool, may point to:
- reflection.b
- *int, may point to:
- reflection.a
- map[*int]*bool, may point to:
- makemap
-
--------- @pointsto p1 --------
-this interface{} may contain these dynamic types:
- *bool, may point to:
- reflection.b
- *int, may point to:
- reflection.a
- map[*int]*bool, may point to:
- makemap
-
--------- @pointsto p2 --------
-this []reflect.Value may point to these objects:
-
-
--------- @pointsto p3 --------
-this reflect.Value may contain these dynamic types:
- *int, may point to:
- reflection.a
-
--------- @pointsto p4 --------
-this reflect.Type may contain these dynamic types:
- *reflect.rtype, may point to:
- *bool
- *int
- map[*int]*bool
-
diff --git a/vendor/golang.org/x/tools/cmd/guru/testdata/src/softerrs/main.go b/vendor/golang.org/x/tools/cmd/guru/testdata/src/softerrs/main.go
deleted file mode 100644
index f7254b8..0000000
--- a/vendor/golang.org/x/tools/cmd/guru/testdata/src/softerrs/main.go
+++ /dev/null
@@ -1,15 +0,0 @@
-package main
-
-// Tests of various queries on a program containing only "soft" errors.
-// See go.tools/guru/guru_test.go for explanation.
-// See main.golden for expected query results.
-
-func _() {
- var i int // "unused var" is a soft error
-}
-
-func f() {} // @callers softerrs-callers-f "f"
-
-func main() {
- f() // @describe softerrs-describe-f "f"
-}
diff --git a/vendor/golang.org/x/tools/cmd/guru/testdata/src/softerrs/main.golden b/vendor/golang.org/x/tools/cmd/guru/testdata/src/softerrs/main.golden
deleted file mode 100644
index ae95f46..0000000
--- a/vendor/golang.org/x/tools/cmd/guru/testdata/src/softerrs/main.golden
+++ /dev/null
@@ -1,8 +0,0 @@
--------- @callers softerrs-callers-f --------
-softerrs.f is called from these 1 sites:
- static function call from softerrs.main
-
--------- @describe softerrs-describe-f --------
-reference to func f()
-defined here
-
diff --git a/vendor/golang.org/x/tools/cmd/guru/testdata/src/what-json/main.go b/vendor/golang.org/x/tools/cmd/guru/testdata/src/what-json/main.go
deleted file mode 100644
index 27177ff..0000000
--- a/vendor/golang.org/x/tools/cmd/guru/testdata/src/what-json/main.go
+++ /dev/null
@@ -1,14 +0,0 @@
-package main
-
-import "lib"
-
-// Tests of 'what' queries, -format=json.
-// See go.tools/guru/guru_test.go for explanation.
-// See what-json.golden for expected query results.
-
-func main() {
- f() // @what call "f"
-}
-
-var _ lib.Var // @what pkg "lib"
-type _ lib.T
diff --git a/vendor/golang.org/x/tools/cmd/guru/testdata/src/what-json/main.golden b/vendor/golang.org/x/tools/cmd/guru/testdata/src/what-json/main.golden
deleted file mode 100644
index 320c52b..0000000
--- a/vendor/golang.org/x/tools/cmd/guru/testdata/src/what-json/main.golden
+++ /dev/null
@@ -1,95 +0,0 @@
--------- @what call --------
-{
- "enclosing": [
- {
- "desc": "identifier",
- "start": 189,
- "end": 190
- },
- {
- "desc": "function call",
- "start": 189,
- "end": 192
- },
- {
- "desc": "expression statement",
- "start": 189,
- "end": 192
- },
- {
- "desc": "block",
- "start": 186,
- "end": 212
- },
- {
- "desc": "function declaration",
- "start": 174,
- "end": 212
- },
- {
- "desc": "source file",
- "start": 0,
- "end": 259
- }
- ],
- "modes": [
- "callees",
- "callers",
- "callstack",
- "definition",
- "describe",
- "freevars",
- "implements",
- "pointsto",
- "referrers",
- "whicherrs"
- ],
- "srcdir": "testdata/src",
- "importpath": "what-json"
-}
--------- @what pkg --------
-{
- "enclosing": [
- {
- "desc": "identifier",
- "start": 220,
- "end": 223
- },
- {
- "desc": "selector",
- "start": 220,
- "end": 227
- },
- {
- "desc": "value specification",
- "start": 218,
- "end": 227
- },
- {
- "desc": "variable declaration",
- "start": 214,
- "end": 227
- },
- {
- "desc": "source file",
- "start": 0,
- "end": 259
- }
- ],
- "modes": [
- "definition",
- "describe",
- "freevars",
- "implements",
- "pointsto",
- "referrers",
- "whicherrs"
- ],
- "srcdir": "testdata/src",
- "importpath": "what-json",
- "object": "lib",
- "sameids": [
- "$GOPATH/src/what-json/main.go:13:7",
- "$GOPATH/src/what-json/main.go:14:8"
- ]
-}
diff --git a/vendor/golang.org/x/tools/cmd/guru/testdata/src/what/main.go b/vendor/golang.org/x/tools/cmd/guru/testdata/src/what/main.go
deleted file mode 100644
index 9e6a8b9..0000000
--- a/vendor/golang.org/x/tools/cmd/guru/testdata/src/what/main.go
+++ /dev/null
@@ -1,11 +0,0 @@
-package main // @what pkgdecl "main"
-
-// Tests of 'what' queries.
-// See go.tools/guru/guru_test.go for explanation.
-// See what.golden for expected query results.
-
-func main() {
- f() // @what call "f"
- var ch chan int // @what var "var"
- <-ch // @what recv "ch"
-}
diff --git a/vendor/golang.org/x/tools/cmd/guru/testdata/src/what/main.golden b/vendor/golang.org/x/tools/cmd/guru/testdata/src/what/main.golden
deleted file mode 100644
index f113e2f..0000000
--- a/vendor/golang.org/x/tools/cmd/guru/testdata/src/what/main.golden
+++ /dev/null
@@ -1,41 +0,0 @@
--------- @what pkgdecl --------
-identifier
-source file
-modes: [definition describe freevars implements pointsto referrers whicherrs]
-srcdir: testdata/src
-import path: what
-
--------- @what call --------
-identifier
-function call
-expression statement
-block
-function declaration
-source file
-modes: [callees callers callstack definition describe freevars implements pointsto referrers whicherrs]
-srcdir: testdata/src
-import path: what
-
--------- @what var --------
-variable declaration
-variable declaration statement
-block
-function declaration
-source file
-modes: [callers callstack describe freevars pointsto whicherrs]
-srcdir: testdata/src
-import path: what
-
--------- @what recv --------
-identifier
-unary <- operation
-expression statement
-block
-function declaration
-source file
-modes: [callers callstack definition describe freevars implements peers pointsto referrers whicherrs]
-srcdir: testdata/src
-import path: what
-ch
-ch
-
diff --git a/vendor/golang.org/x/tools/cmd/guru/testdata/src/whicherrs/main.go b/vendor/golang.org/x/tools/cmd/guru/testdata/src/whicherrs/main.go
deleted file mode 100644
index d1613c5..0000000
--- a/vendor/golang.org/x/tools/cmd/guru/testdata/src/whicherrs/main.go
+++ /dev/null
@@ -1,32 +0,0 @@
-package main
-
-type errType string
-
-const constErr errType = "blah"
-
-func (et errType) Error() string {
- return string(et)
-}
-
-var errVar error = errType("foo")
-
-func genErr(i int) error {
- switch i {
- case 0:
- return constErr
- case 1:
- return errVar
- default:
- return nil
- }
-}
-
-func unreachable() {
- err := errVar // @whicherrs func-dead "err"
- _ = err
-}
-
-func main() {
- err := genErr(0) // @whicherrs localerrs "err"
- _ = err
-}
diff --git a/vendor/golang.org/x/tools/cmd/guru/testdata/src/whicherrs/main.golden b/vendor/golang.org/x/tools/cmd/guru/testdata/src/whicherrs/main.golden
deleted file mode 100644
index 3484752..0000000
--- a/vendor/golang.org/x/tools/cmd/guru/testdata/src/whicherrs/main.golden
+++ /dev/null
@@ -1,11 +0,0 @@
--------- @whicherrs func-dead --------
-
-Error: pointer analysis did not find expression (dead code?)
--------- @whicherrs localerrs --------
-this error may point to these globals:
- errVar
-this error may contain these constants:
- constErr
-this error may contain these dynamic types:
- errType
-
diff --git a/vendor/golang.org/x/tools/cmd/guru/unit_test.go b/vendor/golang.org/x/tools/cmd/guru/unit_test.go
deleted file mode 100644
index 699e6a1..0000000
--- a/vendor/golang.org/x/tools/cmd/guru/unit_test.go
+++ /dev/null
@@ -1,105 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-import (
- "fmt"
- "go/build"
- "io/ioutil"
- "os"
- "path/filepath"
- "runtime"
- "strings"
- "testing"
-)
-
-// Unit tests for internal guru functions
-
-func TestIssue17515(t *testing.T) {
- // Tests handling of symlinks in function guessImportPath
- // If we have Go code inside $HOME/go/src and create a symlink $HOME/src to it
- // there are 4 possible cases that need to be tested:
- // (1) absolute & absolute: GOPATH=$HOME/go/src file=$HOME/go/src/test/test.go
- // (2) absolute & symlink: GOPATH=$HOME/go/src file=$HOME/src/test/test.go
- // (3) symlink & symlink: GOPATH=$HOME/src file=$HOME/src/test/test.go
- // (4) symlink & absolute: GOPATH=$HOME/src file= $HOME/go/src/test/test.go
-
- // Create a temporary home directory under /tmp
- home, err := ioutil.TempDir(os.TempDir(), "home")
- if err != nil {
- t.Errorf("Unable to create a temporary directory in %s", os.TempDir())
- }
-
- defer os.RemoveAll(home)
-
- // create filepath /tmp/home/go/src/test/test.go
- if err = os.MkdirAll(home+"/go/src/test", 0755); err != nil {
- t.Fatal(err)
- }
-
- var buildContext = build.Default
-
- // Success test cases
- type SuccessTest struct {
- gopath, filename, wantSrcdir string
- }
-
- successTests := []SuccessTest{
- {home + "/go", home + "/go/src/test/test.go", filepath.FromSlash(home + "/go/src")},
- }
-
- // Add symlink cases if not on Windows, Plan 9
- if runtime.GOOS != "windows" && runtime.GOOS != "plan9" {
- // symlink between /tmp/home/go/src and /tmp/home/src
- if err := os.Symlink(home+"/go/src", home+"/src"); err != nil {
- t.Fatal(err)
- }
-
- successTests = append(successTests, []SuccessTest{
- {home + "/go", home + "/src/test/test.go", filepath.FromSlash(home + "/go/src")},
- {home, home + "/go/src/test/test.go", filepath.FromSlash(home + "/src")},
- {home, home + "/src/test/test.go", filepath.FromSlash(home + "/src")},
- }...)
- }
-
- for _, test := range successTests {
- buildContext.GOPATH = test.gopath
- srcdir, importPath, err := guessImportPath(test.filename, &buildContext)
- if srcdir != test.wantSrcdir || importPath != "test" || err != nil {
- t.Errorf("guessImportPath(%q, %q) = %q, %q, %q; want %q, %q, %q",
- test.filename, test.gopath, srcdir, importPath, err, test.wantSrcdir, "test", "nil")
- }
- }
- // Function to format expected error message
- errFormat := func(fpath string) string {
- return fmt.Sprintf("can't evaluate symlinks of %s", fpath)
- }
-
- // Failure test cases
- type FailTest struct {
- gopath, filename, wantErr string
- }
-
- failTests := []FailTest{
- {home + "/go", home + "/go/src/fake/test.go", errFormat(filepath.FromSlash(home + "/go/src/fake"))},
- }
-
- if runtime.GOOS != "windows" && runtime.GOOS != "plan9" {
- failTests = append(failTests, []FailTest{
- {home + "/go", home + "/src/fake/test.go", errFormat(filepath.FromSlash(home + "/src/fake"))},
- {home, home + "/src/fake/test.go", errFormat(filepath.FromSlash(home + "/src/fake"))},
- {home, home + "/go/src/fake/test.go", errFormat(filepath.FromSlash(home + "/go/src/fake"))},
- }...)
- }
-
- for _, test := range failTests {
- buildContext.GOPATH = test.gopath
- srcdir, importPath, err := guessImportPath(test.filename, &buildContext)
- if !strings.HasPrefix(fmt.Sprint(err), test.wantErr) {
- t.Errorf("guessImportPath(%q, %q) = %q, %q, %q; want %q, %q, %q",
- test.filename, test.gopath, srcdir, importPath, err, "", "", test.wantErr)
- }
- }
-}
diff --git a/vendor/golang.org/x/tools/cmd/guru/what.go b/vendor/golang.org/x/tools/cmd/guru/what.go
deleted file mode 100644
index fabc3e8..0000000
--- a/vendor/golang.org/x/tools/cmd/guru/what.go
+++ /dev/null
@@ -1,282 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-import (
- "fmt"
- "go/ast"
- "go/build"
- "go/token"
- "os"
- "path/filepath"
- "sort"
- "strings"
-
- "golang.org/x/tools/cmd/guru/serial"
- "golang.org/x/tools/go/ast/astutil"
-)
-
-// what reports all the information about the query selection that can be
-// obtained from parsing only its containing source file.
-// It is intended to be a very low-latency query callable from GUI
-// tools, e.g. to populate a menu of options of slower queries about
-// the selected location.
-//
-func what(q *Query) error {
- qpos, err := fastQueryPos(q.Build, q.Pos)
- if err != nil {
- return err
- }
-
- // (ignore errors)
- srcdir, importPath, _ := guessImportPath(qpos.fset.File(qpos.start).Name(), q.Build)
-
- // Determine which query modes are applicable to the selection.
- enable := map[string]bool{
- "describe": true, // any syntax; always enabled
- }
-
- if qpos.end > qpos.start {
- enable["freevars"] = true // nonempty selection?
- }
-
- for _, n := range qpos.path {
- switch n := n.(type) {
- case *ast.Ident:
- enable["definition"] = true
- enable["referrers"] = true
- enable["implements"] = true
- case *ast.CallExpr:
- enable["callees"] = true
- case *ast.FuncDecl:
- enable["callers"] = true
- enable["callstack"] = true
- case *ast.SendStmt:
- enable["peers"] = true
- case *ast.UnaryExpr:
- if n.Op == token.ARROW {
- enable["peers"] = true
- }
- }
-
- // For implements, we approximate findInterestingNode.
- if _, ok := enable["implements"]; !ok {
- switch n.(type) {
- case *ast.ArrayType,
- *ast.StructType,
- *ast.FuncType,
- *ast.InterfaceType,
- *ast.MapType,
- *ast.ChanType:
- enable["implements"] = true
- }
- }
-
- // For pointsto and whicherrs, we approximate findInterestingNode.
- if _, ok := enable["pointsto"]; !ok {
- switch n.(type) {
- case ast.Stmt,
- *ast.ArrayType,
- *ast.StructType,
- *ast.FuncType,
- *ast.InterfaceType,
- *ast.MapType,
- *ast.ChanType:
- // not an expression
- enable["pointsto"] = false
- enable["whicherrs"] = false
-
- case ast.Expr, ast.Decl, *ast.ValueSpec:
- // an expression, maybe
- enable["pointsto"] = true
- enable["whicherrs"] = true
-
- default:
- // Comment, Field, KeyValueExpr, etc: ascend.
- }
- }
- }
-
- // If we don't have an exact selection, disable modes that need one.
- if !qpos.exact {
- enable["callees"] = false
- enable["pointsto"] = false
- enable["whicherrs"] = false
- enable["describe"] = false
- }
-
- var modes []string
- for mode := range enable {
- modes = append(modes, mode)
- }
- sort.Strings(modes)
-
- // Find the object referred to by the selection (if it's an
- // identifier) and report the position of each identifier
- // that refers to the same object.
- //
- // This may return spurious matches (e.g. struct fields) because
- // it uses the best-effort name resolution done by go/parser.
- var sameids []token.Pos
- var object string
- if id, ok := qpos.path[0].(*ast.Ident); ok {
- if id.Obj == nil {
- // An unresolved identifier is potentially a package name.
- // Resolve them with a simple importer (adds ~100µs).
- importer := func(imports map[string]*ast.Object, path string) (*ast.Object, error) {
- pkg, ok := imports[path]
- if !ok {
- pkg = &ast.Object{
- Kind: ast.Pkg,
- Name: filepath.Base(path), // a guess
- }
- imports[path] = pkg
- }
- return pkg, nil
- }
- f := qpos.path[len(qpos.path)-1].(*ast.File)
- ast.NewPackage(qpos.fset, map[string]*ast.File{"": f}, importer, nil)
- }
-
- if id.Obj != nil {
- object = id.Obj.Name
- decl := qpos.path[len(qpos.path)-1]
- ast.Inspect(decl, func(n ast.Node) bool {
- if n, ok := n.(*ast.Ident); ok && n.Obj == id.Obj {
- sameids = append(sameids, n.Pos())
- }
- return true
- })
- }
- }
-
- q.Output(qpos.fset, &whatResult{
- path: qpos.path,
- srcdir: srcdir,
- importPath: importPath,
- modes: modes,
- object: object,
- sameids: sameids,
- })
- return nil
-}
-
-// guessImportPath finds the package containing filename, and returns
-// its source directory (an element of $GOPATH) and its import path
-// relative to it.
-//
-// TODO(adonovan): what about _test.go files that are not part of the
-// package?
-//
-func guessImportPath(filename string, buildContext *build.Context) (srcdir, importPath string, err error) {
- absFile, err := filepath.Abs(filename)
- if err != nil {
- return "", "", fmt.Errorf("can't form absolute path of %s: %v", filename, err)
- }
-
- absFileDir := filepath.Dir(absFile)
- resolvedAbsFileDir, err := filepath.EvalSymlinks(absFileDir)
- if err != nil {
- return "", "", fmt.Errorf("can't evaluate symlinks of %s: %v", absFileDir, err)
- }
-
- segmentedAbsFileDir := segments(resolvedAbsFileDir)
- // Find the innermost directory in $GOPATH that encloses filename.
- minD := 1024
- for _, gopathDir := range buildContext.SrcDirs() {
- absDir, err := filepath.Abs(gopathDir)
- if err != nil {
- continue // e.g. non-existent dir on $GOPATH
- }
- resolvedAbsDir, err := filepath.EvalSymlinks(absDir)
- if err != nil {
- continue // e.g. non-existent dir on $GOPATH
- }
-
- d := prefixLen(segments(resolvedAbsDir), segmentedAbsFileDir)
- // If there are multiple matches,
- // prefer the innermost enclosing directory
- // (smallest d).
- if d >= 0 && d < minD {
- minD = d
- srcdir = gopathDir
- importPath = strings.Join(segmentedAbsFileDir[len(segmentedAbsFileDir)-minD:], string(os.PathSeparator))
- }
- }
- if srcdir == "" {
- return "", "", fmt.Errorf("directory %s is not beneath any of these GOROOT/GOPATH directories: %s",
- filepath.Dir(absFile), strings.Join(buildContext.SrcDirs(), ", "))
- }
- if importPath == "" {
- // This happens for e.g. $GOPATH/src/a.go, but
- // "" is not a valid path for (*go/build).Import.
- return "", "", fmt.Errorf("cannot load package in root of source directory %s", srcdir)
- }
- return srcdir, importPath, nil
-}
-
-func segments(path string) []string {
- return strings.Split(path, string(os.PathSeparator))
-}
-
-// prefixLen returns the length of the remainder of y if x is a prefix
-// of y, a negative number otherwise.
-func prefixLen(x, y []string) int {
- d := len(y) - len(x)
- if d >= 0 {
- for i := range x {
- if y[i] != x[i] {
- return -1 // not a prefix
- }
- }
- }
- return d
-}
-
-type whatResult struct {
- path []ast.Node
- modes []string
- srcdir string
- importPath string
- object string
- sameids []token.Pos
-}
-
-func (r *whatResult) PrintPlain(printf printfFunc) {
- for _, n := range r.path {
- printf(n, "%s", astutil.NodeDescription(n))
- }
- printf(nil, "modes: %s", r.modes)
- printf(nil, "srcdir: %s", r.srcdir)
- printf(nil, "import path: %s", r.importPath)
- for _, pos := range r.sameids {
- printf(pos, "%s", r.object)
- }
-}
-
-func (r *whatResult) JSON(fset *token.FileSet) []byte {
- var enclosing []serial.SyntaxNode
- for _, n := range r.path {
- enclosing = append(enclosing, serial.SyntaxNode{
- Description: astutil.NodeDescription(n),
- Start: fset.Position(n.Pos()).Offset,
- End: fset.Position(n.End()).Offset,
- })
- }
-
- var sameids []string
- for _, pos := range r.sameids {
- sameids = append(sameids, fset.Position(pos).String())
- }
-
- return toJSON(&serial.What{
- Modes: r.modes,
- SrcDir: r.srcdir,
- ImportPath: r.importPath,
- Enclosing: enclosing,
- Object: r.object,
- SameIDs: sameids,
- })
-}
diff --git a/vendor/golang.org/x/tools/cmd/guru/whicherrs.go b/vendor/golang.org/x/tools/cmd/guru/whicherrs.go
deleted file mode 100644
index 3a81bf5..0000000
--- a/vendor/golang.org/x/tools/cmd/guru/whicherrs.go
+++ /dev/null
@@ -1,327 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-import (
- "fmt"
- "go/ast"
- "go/token"
- "go/types"
- "sort"
-
- "golang.org/x/tools/cmd/guru/serial"
- "golang.org/x/tools/go/ast/astutil"
- "golang.org/x/tools/go/loader"
- "golang.org/x/tools/go/pointer"
- "golang.org/x/tools/go/ssa"
- "golang.org/x/tools/go/ssa/ssautil"
-)
-
-var builtinErrorType = types.Universe.Lookup("error").Type()
-
-// whicherrs takes an position to an error and tries to find all types, constants
-// and global value which a given error can point to and which can be checked from the
-// scope where the error lives.
-// In short, it returns a list of things that can be checked against in order to handle
-// an error properly.
-//
-// TODO(dmorsing): figure out if fields in errors like *os.PathError.Err
-// can be queried recursively somehow.
-func whicherrs(q *Query) error {
- lconf := loader.Config{Build: q.Build}
-
- if err := setPTAScope(&lconf, q.Scope); err != nil {
- return err
- }
-
- // Load/parse/type-check the program.
- lprog, err := loadWithSoftErrors(&lconf)
- if err != nil {
- return err
- }
-
- qpos, err := parseQueryPos(lprog, q.Pos, true) // needs exact pos
- if err != nil {
- return err
- }
-
- prog := ssautil.CreateProgram(lprog, ssa.GlobalDebug)
-
- ptaConfig, err := setupPTA(prog, lprog, q.PTALog, q.Reflection)
- if err != nil {
- return err
- }
-
- path, action := findInterestingNode(qpos.info, qpos.path)
- if action != actionExpr {
- return fmt.Errorf("whicherrs wants an expression; got %s",
- astutil.NodeDescription(qpos.path[0]))
- }
- var expr ast.Expr
- var obj types.Object
- switch n := path[0].(type) {
- case *ast.ValueSpec:
- // ambiguous ValueSpec containing multiple names
- return fmt.Errorf("multiple value specification")
- case *ast.Ident:
- obj = qpos.info.ObjectOf(n)
- expr = n
- case ast.Expr:
- expr = n
- default:
- return fmt.Errorf("unexpected AST for expr: %T", n)
- }
-
- typ := qpos.info.TypeOf(expr)
- if !types.Identical(typ, builtinErrorType) {
- return fmt.Errorf("selection is not an expression of type 'error'")
- }
- // Determine the ssa.Value for the expression.
- var value ssa.Value
- if obj != nil {
- // def/ref of func/var object
- value, _, err = ssaValueForIdent(prog, qpos.info, obj, path)
- } else {
- value, _, err = ssaValueForExpr(prog, qpos.info, path)
- }
- if err != nil {
- return err // e.g. trivially dead code
- }
-
- // Defer SSA construction till after errors are reported.
- prog.Build()
-
- globals := findVisibleErrs(prog, qpos)
- constants := findVisibleConsts(prog, qpos)
-
- res := &whicherrsResult{
- qpos: qpos,
- errpos: expr.Pos(),
- }
-
- // TODO(adonovan): the following code is heavily duplicated
- // w.r.t. "pointsto". Refactor?
-
- // Find the instruction which initialized the
- // global error. If more than one instruction has stored to the global
- // remove the global from the set of values that we want to query.
- allFuncs := ssautil.AllFunctions(prog)
- for fn := range allFuncs {
- for _, b := range fn.Blocks {
- for _, instr := range b.Instrs {
- store, ok := instr.(*ssa.Store)
- if !ok {
- continue
- }
- gval, ok := store.Addr.(*ssa.Global)
- if !ok {
- continue
- }
- gbl, ok := globals[gval]
- if !ok {
- continue
- }
- // we already found a store to this global
- // The normal error define is just one store in the init
- // so we just remove this global from the set we want to query
- if gbl != nil {
- delete(globals, gval)
- }
- globals[gval] = store.Val
- }
- }
- }
-
- ptaConfig.AddQuery(value)
- for _, v := range globals {
- ptaConfig.AddQuery(v)
- }
-
- ptares := ptrAnalysis(ptaConfig)
- valueptr := ptares.Queries[value]
- if valueptr == (pointer.Pointer{}) {
- return fmt.Errorf("pointer analysis did not find expression (dead code?)")
- }
- for g, v := range globals {
- ptr, ok := ptares.Queries[v]
- if !ok {
- continue
- }
- if !ptr.MayAlias(valueptr) {
- continue
- }
- res.globals = append(res.globals, g)
- }
- pts := valueptr.PointsTo()
- dedup := make(map[*ssa.NamedConst]bool)
- for _, label := range pts.Labels() {
- // These values are either MakeInterfaces or reflect
- // generated interfaces. For the purposes of this
- // analysis, we don't care about reflect generated ones
- makeiface, ok := label.Value().(*ssa.MakeInterface)
- if !ok {
- continue
- }
- constval, ok := makeiface.X.(*ssa.Const)
- if !ok {
- continue
- }
- c := constants[*constval]
- if c != nil && !dedup[c] {
- dedup[c] = true
- res.consts = append(res.consts, c)
- }
- }
- concs := pts.DynamicTypes()
- concs.Iterate(func(conc types.Type, _ interface{}) {
- // go/types is a bit annoying here.
- // We want to find all the types that we can
- // typeswitch or assert to. This means finding out
- // if the type pointed to can be seen by us.
- //
- // For the purposes of this analysis, we care only about
- // TypeNames of Named or pointer-to-Named types.
- // We ignore other types (e.g. structs) that implement error.
- var name *types.TypeName
- switch t := conc.(type) {
- case *types.Pointer:
- named, ok := t.Elem().(*types.Named)
- if !ok {
- return
- }
- name = named.Obj()
- case *types.Named:
- name = t.Obj()
- default:
- return
- }
- if !isAccessibleFrom(name, qpos.info.Pkg) {
- return
- }
- res.types = append(res.types, &errorType{conc, name})
- })
- sort.Sort(membersByPosAndString(res.globals))
- sort.Sort(membersByPosAndString(res.consts))
- sort.Sort(sorterrorType(res.types))
-
- q.Output(lprog.Fset, res)
- return nil
-}
-
-// findVisibleErrs returns a mapping from each package-level variable of type "error" to nil.
-func findVisibleErrs(prog *ssa.Program, qpos *queryPos) map[*ssa.Global]ssa.Value {
- globals := make(map[*ssa.Global]ssa.Value)
- for _, pkg := range prog.AllPackages() {
- for _, mem := range pkg.Members {
- gbl, ok := mem.(*ssa.Global)
- if !ok {
- continue
- }
- gbltype := gbl.Type()
- // globals are always pointers
- if !types.Identical(deref(gbltype), builtinErrorType) {
- continue
- }
- if !isAccessibleFrom(gbl.Object(), qpos.info.Pkg) {
- continue
- }
- globals[gbl] = nil
- }
- }
- return globals
-}
-
-// findVisibleConsts returns a mapping from each package-level constant assignable to type "error", to nil.
-func findVisibleConsts(prog *ssa.Program, qpos *queryPos) map[ssa.Const]*ssa.NamedConst {
- constants := make(map[ssa.Const]*ssa.NamedConst)
- for _, pkg := range prog.AllPackages() {
- for _, mem := range pkg.Members {
- obj, ok := mem.(*ssa.NamedConst)
- if !ok {
- continue
- }
- consttype := obj.Type()
- if !types.AssignableTo(consttype, builtinErrorType) {
- continue
- }
- if !isAccessibleFrom(obj.Object(), qpos.info.Pkg) {
- continue
- }
- constants[*obj.Value] = obj
- }
- }
-
- return constants
-}
-
-type membersByPosAndString []ssa.Member
-
-func (a membersByPosAndString) Len() int { return len(a) }
-func (a membersByPosAndString) Less(i, j int) bool {
- cmp := a[i].Pos() - a[j].Pos()
- return cmp < 0 || cmp == 0 && a[i].String() < a[j].String()
-}
-func (a membersByPosAndString) Swap(i, j int) { a[i], a[j] = a[j], a[i] }
-
-type sorterrorType []*errorType
-
-func (a sorterrorType) Len() int { return len(a) }
-func (a sorterrorType) Less(i, j int) bool {
- cmp := a[i].obj.Pos() - a[j].obj.Pos()
- return cmp < 0 || cmp == 0 && a[i].typ.String() < a[j].typ.String()
-}
-func (a sorterrorType) Swap(i, j int) { a[i], a[j] = a[j], a[i] }
-
-type errorType struct {
- typ types.Type // concrete type N or *N that implements error
- obj *types.TypeName // the named type N
-}
-
-type whicherrsResult struct {
- qpos *queryPos
- errpos token.Pos
- globals []ssa.Member
- consts []ssa.Member
- types []*errorType
-}
-
-func (r *whicherrsResult) PrintPlain(printf printfFunc) {
- if len(r.globals) > 0 {
- printf(r.qpos, "this error may point to these globals:")
- for _, g := range r.globals {
- printf(g.Pos(), "\t%s", g.RelString(r.qpos.info.Pkg))
- }
- }
- if len(r.consts) > 0 {
- printf(r.qpos, "this error may contain these constants:")
- for _, c := range r.consts {
- printf(c.Pos(), "\t%s", c.RelString(r.qpos.info.Pkg))
- }
- }
- if len(r.types) > 0 {
- printf(r.qpos, "this error may contain these dynamic types:")
- for _, t := range r.types {
- printf(t.obj.Pos(), "\t%s", r.qpos.typeString(t.typ))
- }
- }
-}
-
-func (r *whicherrsResult) JSON(fset *token.FileSet) []byte {
- we := &serial.WhichErrs{}
- we.ErrPos = fset.Position(r.errpos).String()
- for _, g := range r.globals {
- we.Globals = append(we.Globals, fset.Position(g.Pos()).String())
- }
- for _, c := range r.consts {
- we.Constants = append(we.Constants, fset.Position(c.Pos()).String())
- }
- for _, t := range r.types {
- var et serial.WhichErrsType
- et.Type = r.qpos.typeString(t.typ)
- et.Position = fset.Position(t.obj.Pos()).String()
- we.Types = append(we.Types, et)
- }
- return toJSON(we)
-}
diff --git a/vendor/golang.org/x/tools/cmd/heapview/client/.clang-format b/vendor/golang.org/x/tools/cmd/heapview/client/.clang-format
deleted file mode 100644
index f6cb8ad..0000000
--- a/vendor/golang.org/x/tools/cmd/heapview/client/.clang-format
+++ /dev/null
@@ -1 +0,0 @@
-BasedOnStyle: Google
diff --git a/vendor/golang.org/x/tools/cmd/heapview/client/.gitignore b/vendor/golang.org/x/tools/cmd/heapview/client/.gitignore
deleted file mode 100644
index 2ccbe46..0000000
--- a/vendor/golang.org/x/tools/cmd/heapview/client/.gitignore
+++ /dev/null
@@ -1 +0,0 @@
-/node_modules/
diff --git a/vendor/golang.org/x/tools/cmd/heapview/client/README.md b/vendor/golang.org/x/tools/cmd/heapview/client/README.md
deleted file mode 100644
index 4cb2621..0000000
--- a/vendor/golang.org/x/tools/cmd/heapview/client/README.md
+++ /dev/null
@@ -1,45 +0,0 @@
-# Go Heap Viewer Client
-
-This directory contains the client Typescript code for the Go
-heap viewer.
-
-## Typescript Tooling
-
-Below are instructions for downloading tooling and files to
-help make the development process more convenient. These tools
-are not required for contributing or running the heap viewer-
-they are just meant as development aids.
-
-## Node and NPM
-
-We use npm to manage the dependencies for these tools. There are
-a couple of ways of installing npm on your system, but we recommend
-using nvm.
-
-Run the following command to install nvm:
-
- [shell]$ curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.31.3/install.sh | bash
-
-or see the instructions on [the nvm github page](github.com/creationix/nvm)
-for alternative methods. This will put the nvm tool in your home directory
-and edit your path to add nvm, node and other tools you install using them.
-Once nvm is installed, use
-
- [shell]$ nvm install node
-
-then
-
- [shell]$ nvm use node
-
-to install node.js.
-
-Once node is installed, you can install typescript using
-
- [shell]$ npm install -g typescript
-
-Finally, import type definitions into this project by running
-
- [shell]$ npm install
-
-in this directory. They will be imported into the node_packages directory
-and be automatically available to the Typescript compiler.
\ No newline at end of file
diff --git a/vendor/golang.org/x/tools/cmd/heapview/client/main.ts b/vendor/golang.org/x/tools/cmd/heapview/client/main.ts
deleted file mode 100644
index fe3985c..0000000
--- a/vendor/golang.org/x/tools/cmd/heapview/client/main.ts
+++ /dev/null
@@ -1,195 +0,0 @@
-// Copyright 2016 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-/**
- * An enum of types of actions that might be requested
- * by the app.
- */
-enum Action {
- TOGGLE_SIDEBAR, // Toggle the sidebar.
- NAVIGATE_ABOUT, // Go to the about page.
-}
-
-const TITLE = 'Go Heap Viewer';
-
-/**
- * A type of event that signals to the AppElement controller
- * that something shoud be done. For the most part, the structure
- * of the app will be that elements' state will mostly be controlled
- * by parent elements. Elements will issue actions that the AppElement
- * will handle, and the app will be re-rendered down the DOM
- * hierarchy.
- */
-class ActionEvent extends Event {
- static readonly EVENT_TYPE = 'action-event'
- constructor(public readonly action: Action) { super(ActionEvent.EVENT_TYPE); }
-}
-
-/**
- * A hamburger menu element. Triggers a TOGGLE_SIDE action to toggle the
- * sidebar.
- */
-export class HamburgerElement extends HTMLElement {
- static readonly NAME = 'heap-hamburger';
-
- createdCallback() {
- this.appendChild(document.createTextNode('☰'));
- this.onclick =
- () => { this.dispatchEvent(new ActionEvent(Action.TOGGLE_SIDEBAR)) };
- }
-}
-document.registerElement(HamburgerElement.NAME, HamburgerElement);
-
-/**
- * A heading for the page with a hamburger menu and a title.
- */
-export class HeadingElement extends HTMLElement {
- static readonly NAME = 'heap-heading';
-
- createdCallback() {
- this.style.display = 'block';
- this.style.backgroundColor = '#2196F3';
- this.style.webkitUserSelect = 'none';
- this.style.cursor = 'default';
- this.style.color = '#FFFFFF';
- this.style.padding = '10px';
-
- const div = document.createElement('div');
- div.style.margin = '0px';
- div.style.fontSize = '2em';
- div.appendChild(document.createElement(HamburgerElement.NAME));
- div.appendChild(document.createTextNode(' ' + TITLE));
- this.appendChild(div);
- }
-}
-document.registerElement(HeadingElement.NAME, HeadingElement);
-
-/**
- * A sidebar that has navigation for the app.
- */
-export class SidebarElement extends HTMLElement {
- static readonly NAME = 'heap-sidebar';
-
- createdCallback() {
- this.style.display = 'none';
- this.style.backgroundColor = '#9E9E9E';
- this.style.width = '15em';
-
- const aboutButton = document.createElement('button');
- aboutButton.innerText = 'about';
- aboutButton.onclick =
- () => { this.dispatchEvent(new ActionEvent(Action.NAVIGATE_ABOUT)) };
- this.appendChild(aboutButton);
- }
-
- toggle() {
- this.style.display = this.style.display === 'none' ? 'block' : 'none';
- }
-}
-document.registerElement(SidebarElement.NAME, SidebarElement);
-
-/**
- * A Container for the main content in the app.
- * TODO(matloob): Implement main content.
- */
-export class MainContentElement extends HTMLElement {
- static readonly NAME = 'heap-container';
-
- attachedCallback() {
- this.style.backgroundColor = '#E0E0E0';
- this.style.height = '100%';
- this.style.flex = '1';
- }
-}
-document.registerElement(MainContentElement.NAME, MainContentElement);
-
-/**
- * A container and controller for the whole app.
- * Contains the heading, side drawer and main panel.
- */
-class AppElement extends HTMLElement {
- static readonly NAME = 'heap-app';
- private sidebar: SidebarElement;
- private mainContent: MainContentElement;
-
- attachedCallback() {
- document.title = TITLE;
-
- this.addEventListener(
- ActionEvent.EVENT_TYPE, e => this.handleAction(e as ActionEvent),
- /* capture */ true);
-
- this.render();
- }
-
- render() {
- this.style.display = 'block';
- this.style.height = '100vh';
- this.style.width = '100vw';
- this.appendChild(document.createElement(HeadingElement.NAME));
-
- const bodyDiv = document.createElement('div');
- bodyDiv.style.height = '100%';
- bodyDiv.style.display = 'flex';
- this.sidebar =
- document.createElement(SidebarElement.NAME) as SidebarElement;
- bodyDiv.appendChild(this.sidebar);
- this.mainContent =
- document.createElement(MainContentElement.NAME) as MainContentElement;
- bodyDiv.appendChild(this.mainContent);
- this.appendChild(bodyDiv);
-
- this.renderRoute();
- }
-
- renderRoute() {
- this.mainContent.innerHTML = ''
- switch (window.location.pathname) {
- case '/about':
- this.mainContent.appendChild(
- document.createElement(AboutPageElement.NAME));
- break;
- }
- }
-
- handleAction(event: ActionEvent) {
- switch (event.action) {
- case Action.TOGGLE_SIDEBAR:
- this.sidebar.toggle();
- break;
- case Action.NAVIGATE_ABOUT:
- window.history.pushState({}, '', '/about');
- this.renderRoute();
- break;
- }
- }
-}
-document.registerElement(AppElement.NAME, AppElement);
-
-/**
- * An about page.
- */
-class AboutPageElement extends HTMLElement {
- static readonly NAME = 'heap-about';
-
- createdCallback() { this.textContent = TITLE; }
-}
-document.registerElement(AboutPageElement.NAME, AboutPageElement);
-
-/**
- * Resets body's margin and padding, and sets font.
- */
-function clearStyle(document: Document) {
- const styleElement = document.createElement('style') as HTMLStyleElement;
- document.head.appendChild(styleElement);
- const styleSheet = styleElement.sheet as CSSStyleSheet;
- styleSheet.insertRule(
- '* {font-family: Roboto,Helvetica; box-sizing: border-box}', 0);
- styleSheet.insertRule('body {margin: 0px; padding:0px}', 0);
-}
-
-export function main() {
- clearStyle(document);
- document.body.appendChild(document.createElement(AppElement.NAME));
-}
diff --git a/vendor/golang.org/x/tools/cmd/heapview/client/main_test.ts b/vendor/golang.org/x/tools/cmd/heapview/client/main_test.ts
deleted file mode 100644
index a208653..0000000
--- a/vendor/golang.org/x/tools/cmd/heapview/client/main_test.ts
+++ /dev/null
@@ -1,29 +0,0 @@
-// Copyright 2016 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-import {HamburgerElement, HeadingElement, SidebarElement, main} from './main';
-
-describe('main', () => {
- it('sets the document\'s title', () => {
- main();
- expect(document.title).toBe('Go Heap Viewer');
- });
-
- it('has a heading', () => {
- main();
- expect(document.querySelector(HeadingElement.NAME)).toBeDefined();
- });
-
- it('has a sidebar', () => {
- main();
- const hamburger = document.querySelector(HamburgerElement.NAME);
- const sidebar =
- document.querySelector(SidebarElement.NAME) as SidebarElement;
- expect(sidebar.style.display).toBe('none');
-
- // Click on the hamburger. Sidebar should then be visible.
- hamburger.dispatchEvent(new Event('click'));
- expect(sidebar.style.display).toBe('block');
- })
-});
\ No newline at end of file
diff --git a/vendor/golang.org/x/tools/cmd/heapview/client/package.json b/vendor/golang.org/x/tools/cmd/heapview/client/package.json
deleted file mode 100644
index b2febe8..0000000
--- a/vendor/golang.org/x/tools/cmd/heapview/client/package.json
+++ /dev/null
@@ -1,35 +0,0 @@
-{
- "//": [
- "Copyright 2016 The Go Authors. All rights reserved.",
- "Use of this source code is governed by a BSD-style",
- "license that can be found in the LICENSE file.",
-
- "This file exists to help import typescript typings",
- "for web features used in this project. Neither the",
- "typings nor node or npm are required to do development",
- "on the code in this project.",
-
- "If you do have npm installed, use the `npm i` command",
- "in this directory to install the typings."
- ],
- "private": true,
- "name": "@golangtools/heapview",
- "version": "0.0.0",
- "devDependencies": {
- "@types/webcomponents.js": "latest",
- "@types/whatwg-fetch": "latest",
- "@types/jasmine": "latest",
-
- "jasmine-core": "latest",
- "karma": "latest",
- "karma-jasmine": "latest",
- "karma-chrome-launcher": "latest",
-
- "clang-format": "latest"
- },
- "scripts": {
- "test": "karma start testing/karma.conf.js",
- "format": "find . | grep '\\(test_main\\.js\\|\\.ts\\)$' | xargs clang-format -i",
- "lint": "tslint --project ."
- }
-}
diff --git a/vendor/golang.org/x/tools/cmd/heapview/client/testing/karma.conf.js b/vendor/golang.org/x/tools/cmd/heapview/client/testing/karma.conf.js
deleted file mode 100644
index acaf9d5..0000000
--- a/vendor/golang.org/x/tools/cmd/heapview/client/testing/karma.conf.js
+++ /dev/null
@@ -1,22 +0,0 @@
-// Copyright 2016 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-module.exports = config => {
- config.set({
- frameworks: ['jasmine'],
- basePath: '../../../..',
- files: [
- 'third_party/webcomponents/customelements.js',
- 'third_party/typescript/typescript.js',
- 'third_party/moduleloader/moduleloader.js',
- 'cmd/heapview/client/testing/test_main.js',
- {pattern: 'cmd/heapview/client/**/*.ts', included: false},
- ],
- browsers: ['Chrome'],
- plugins: [
- 'karma-jasmine',
- 'karma-chrome-launcher'
- ],
- })
-}
\ No newline at end of file
diff --git a/vendor/golang.org/x/tools/cmd/heapview/client/testing/test_main.js b/vendor/golang.org/x/tools/cmd/heapview/client/testing/test_main.js
deleted file mode 100644
index 6c2afd7..0000000
--- a/vendor/golang.org/x/tools/cmd/heapview/client/testing/test_main.js
+++ /dev/null
@@ -1,32 +0,0 @@
-// Copyright 2016 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Configure module loader.
-System.transpiler = 'typescript'
-System.typescriptOptions = {
- target: ts.ScriptTarget.ES2015
-};
-System.locate = (load) => load.name + '.ts';
-
-// Determine set of test files.
-var tests = [];
-for (var file in window.__karma__.files) {
- if (window.__karma__.files.hasOwnProperty(file)) {
- if (/_test\.ts$/.test(file)) {
- tests.push(file.slice(0, -3));
- }
- }
-}
-
-// Steal loaded callback so we can block until we're
-// done loading all test modules.
-var loadedCallback = window.__karma__.loaded.bind(window.__karma__);
-window.__karma__.loaded = () => {};
-
-// Load all test modules, and then call loadedCallback.
-var promises = [];
-for (var i = 0; i < tests.length; i++) {
- promises.push(System.import(tests[i]));
-}
-Promise.all(promises).then(loadedCallback);
\ No newline at end of file
diff --git a/vendor/golang.org/x/tools/cmd/heapview/client/tsconfig.json b/vendor/golang.org/x/tools/cmd/heapview/client/tsconfig.json
deleted file mode 100644
index 14c38a1..0000000
--- a/vendor/golang.org/x/tools/cmd/heapview/client/tsconfig.json
+++ /dev/null
@@ -1,16 +0,0 @@
-// Copyright 2016 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// This file contains configuration for the Typescript
-// compiler if you're running it locally for typechecking
-// and other tooling. The Typescript compiler is
-// not necessary to do development on this project.
-
-{
- "compilerOptions": {
- "noEmit": true,
- "strictNullChecks": true,
- "target": "es2015"
- }
-}
diff --git a/vendor/golang.org/x/tools/cmd/heapview/client/tslint.json b/vendor/golang.org/x/tools/cmd/heapview/client/tslint.json
deleted file mode 100644
index a0f2d15..0000000
--- a/vendor/golang.org/x/tools/cmd/heapview/client/tslint.json
+++ /dev/null
@@ -1,40 +0,0 @@
-// Copyright 2016 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// This tslint file is based on a configuration used at
-// Google.
-
-{
- "rules": {
- "class-name": true,
- "forin": true,
- "interface-name": [true, "never-prefix"],
- "jsdoc-format": true,
- "label-position": true,
- "label-undefined": true,
- "new-parens": true,
- "no-angle-bracket-type-assertion": true,
- "no-construct": true,
- "no-debugger": true,
- "no-namespace": [true, "allow-declarations"],
- "no-reference": true,
- "no-require-imports": true,
- "no-unused-expression": true,
- "no-unused-variable": true,
- "no-use-before-declare": true,
- "no-var-keyword": true,
- "semicolon": [true, "always"],
- "switch-default": true,
- "triple-equals": [true, "allow-null-check"],
- "use-isnan": true,
- "variable-name": [
- true,
- "check-format",
- "ban-keywords",
- "allow-leading-underscore",
- "allow-trailing-underscore",
- "allow-pascal-case"
- ]
- }
-}
\ No newline at end of file
diff --git a/vendor/golang.org/x/tools/cmd/heapview/internal/core/mmapfile.go b/vendor/golang.org/x/tools/cmd/heapview/internal/core/mmapfile.go
deleted file mode 100644
index 78445a9..0000000
--- a/vendor/golang.org/x/tools/cmd/heapview/internal/core/mmapfile.go
+++ /dev/null
@@ -1,145 +0,0 @@
-// Copyright 2016 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build darwin linux
-
-package core
-
-import (
- "errors"
- "fmt"
- "io"
- "os"
- "syscall"
-)
-
-var errMmapClosed = errors.New("mmap: closed")
-
-// mmapFile wraps a memory-mapped file.
-type mmapFile struct {
- data []byte
- pos uint64
- writable bool
-}
-
-// mmapOpen opens the named file for reading.
-// If writable is true, the file is also open for writing.
-func mmapOpen(filename string, writable bool) (*mmapFile, error) {
- f, err := os.Open(filename)
- if err != nil {
- return nil, err
- }
- defer f.Close()
- st, err := f.Stat()
- if err != nil {
- return nil, err
- }
-
- size := st.Size()
- if size == 0 {
- return &mmapFile{data: []byte{}}, nil
- }
- if size < 0 {
- return nil, fmt.Errorf("mmap: file %q has negative size: %d", filename, size)
- }
- if size != int64(int(size)) {
- return nil, fmt.Errorf("mmap: file %q is too large", filename)
- }
-
- prot := syscall.PROT_READ
- if writable {
- prot |= syscall.PROT_WRITE
- }
- data, err := syscall.Mmap(int(f.Fd()), 0, int(size), prot, syscall.MAP_SHARED)
- if err != nil {
- return nil, err
- }
- return &mmapFile{data: data, writable: writable}, nil
-}
-
-// Size returns the size of the mapped file.
-func (f *mmapFile) Size() uint64 {
- return uint64(len(f.data))
-}
-
-// Pos returns the current file pointer.
-func (f *mmapFile) Pos() uint64 {
- return f.pos
-}
-
-// SeekTo sets the current file pointer relative to the start of the file.
-func (f *mmapFile) SeekTo(offset uint64) {
- f.pos = offset
-}
-
-// Read implements io.Reader.
-func (f *mmapFile) Read(p []byte) (int, error) {
- if f.data == nil {
- return 0, errMmapClosed
- }
- if f.pos >= f.Size() {
- return 0, io.EOF
- }
- n := copy(p, f.data[f.pos:])
- f.pos += uint64(n)
- if n < len(p) {
- return n, io.EOF
- }
- return n, nil
-}
-
-// ReadByte implements io.ByteReader.
-func (f *mmapFile) ReadByte() (byte, error) {
- if f.data == nil {
- return 0, errMmapClosed
- }
- if f.pos >= f.Size() {
- return 0, io.EOF
- }
- b := f.data[f.pos]
- f.pos++
- return b, nil
-}
-
-// ReadSlice returns a slice of size n that points directly at the
-// underlying mapped file. There is no copying. Fails if it cannot
-// read at least n bytes.
-func (f *mmapFile) ReadSlice(n uint64) ([]byte, error) {
- if f.data == nil {
- return nil, errMmapClosed
- }
- if f.pos+n >= f.Size() {
- return nil, io.EOF
- }
- first := f.pos
- f.pos += n
- return f.data[first:f.pos:f.pos], nil
-}
-
-// ReadSliceAt is like ReadSlice, but reads from a specific offset.
-// The file pointer is not used or advanced.
-func (f *mmapFile) ReadSliceAt(offset, n uint64) ([]byte, error) {
- if f.data == nil {
- return nil, errMmapClosed
- }
- if f.Size() < offset {
- return nil, fmt.Errorf("mmap: out-of-bounds ReadSliceAt offset %d, size is %d", offset, f.Size())
- }
- if offset+n >= f.Size() {
- return nil, io.EOF
- }
- end := offset + n
- return f.data[offset:end:end], nil
-}
-
-// Close closes the file.
-func (f *mmapFile) Close() error {
- if f.data == nil {
- return nil
- }
- err := syscall.Munmap(f.data)
- f.data = nil
- f.pos = 0
- return err
-}
diff --git a/vendor/golang.org/x/tools/cmd/heapview/internal/core/mmapfile_other.go b/vendor/golang.org/x/tools/cmd/heapview/internal/core/mmapfile_other.go
deleted file mode 100644
index 181f842..0000000
--- a/vendor/golang.org/x/tools/cmd/heapview/internal/core/mmapfile_other.go
+++ /dev/null
@@ -1,14 +0,0 @@
-// Copyright 2016 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build !darwin,!linux
-
-package core
-
-// TODO(matloob): perhaps use the more portable golang.org/x/exp/mmap
-// instead of the mmap code in mmapfile.go.
-
-type mmapFile struct{}
-
-func (m *mmapFile) Close() error { return nil }
diff --git a/vendor/golang.org/x/tools/cmd/heapview/internal/core/raw.go b/vendor/golang.org/x/tools/cmd/heapview/internal/core/raw.go
deleted file mode 100644
index febed0f..0000000
--- a/vendor/golang.org/x/tools/cmd/heapview/internal/core/raw.go
+++ /dev/null
@@ -1,308 +0,0 @@
-// Copyright 2016 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Package core provides functions for reading core dumps
-// and examining their contained heaps.
-package core
-
-import (
- "bytes"
- "encoding/binary"
- "fmt"
- "runtime"
- "sort"
-)
-
-// RawDump provides raw access to the heap records in a core file.
-// The raw records in this file are described by other structs named Raw{*}.
-// All []byte slices are direct references to the underlying mmap'd file.
-// These references will become invalid as soon as the RawDump is closed.
-type RawDump struct {
- Params *RawParams
- MemStats *runtime.MemStats
-
- HeapObjects []RawSegment // heap objects sorted by Addr, low-to-high
- GlobalSegments []RawSegment // data, bss, and noptrbss segments
-
- OSThreads []*RawOSThread
- Goroutines []*RawGoroutine
- StackFrames []*RawStackFrame
- OtherRoots []*RawOtherRoot
- Finalizers []*RawFinalizer
- Defers []*RawDefer
- Panics []*RawPanic
-
- TypeFromItab map[uint64]uint64 // map from itab address to the type address that itab represents
- TypeFromAddr map[uint64]*RawType // map from RawType.Addr to RawType
-
- MemProfMap map[uint64]*RawMemProfEntry
- AllocSamples []*RawAllocSample
-
- fmap *mmapFile
-}
-
-// RawParams holds metadata about the program that generated the dump.
-type RawParams struct {
- // Info about the memory space
-
- ByteOrder binary.ByteOrder // byte order of all memory in this dump
- PtrSize uint64 // in bytes
- HeapStart uint64 // heap start address
- HeapEnd uint64 // heap end address (this is the last byte in the heap + 1)
-
- // Info about the program that generated this heapdump
-
- GoArch string // GOARCH of the runtime library that generated this dump
- GoExperiment string // GOEXPERIMENT of the toolchain that build the runtime library
- NCPU uint64 // number of physical cpus available to the program
-}
-
-// RawSegment represents a segment of memory.
-type RawSegment struct {
- Addr uint64 // base address of the segment
- Data []byte // data for this segment
- PtrFields RawPtrFields // offsets of ptr fields within this segment
-}
-
-// RawPtrFields represents a pointer field.
-type RawPtrFields struct {
- encoded []byte // list of uvarint-encoded offsets, or nil if none
- startOff, endOff uint64 // decoded offsets are translated and clipped to [startOff,endOff)
-}
-
-// RawOSThread represents an OS thread.
-type RawOSThread struct {
- MAddr uint64 // address of the OS thread descriptor (M)
- GoID uint64 // go's internal ID for the thread
- ProcID uint64 // kernel's ID for the thread
-}
-
-// RawGoroutine represents a goroutine structure.
-type RawGoroutine struct {
- GAddr uint64 // address of the goroutine descriptor
- SP uint64 // current stack pointer (lowest address in the currently running frame)
- GoID uint64 // goroutine ID
- GoPC uint64 // PC of the go statement that created this goroutine
- Status uint64
- IsSystem bool // true if started by the system
- IsBackground bool // always false in go1.7
- WaitSince uint64 // time the goroutine started waiting, in nanoseconds since the Unix epoch
- WaitReason string
- CtxtAddr uint64 // address of the scheduling ctxt
- MAddr uint64 // address of the OS thread descriptor (M)
- TopDeferAddr uint64 // address of the top defer record
- TopPanicAddr uint64 // address of the top panic record
-}
-
-// RawStackFrame represents a stack frame.
-type RawStackFrame struct {
- Name string
- Depth uint64 // 0 = bottom of stack (currently running frame)
- CalleeSP uint64 // stack pointer of the child frame (or 0 for the bottom-most frame)
- EntryPC uint64 // entry PC for the function
- PC uint64 // current PC being executed
- NextPC uint64 // for callers, where the function resumes (if anywhere) after the callee is done
- Segment RawSegment // local vars (Segment.Addr is the stack pointer, i.e., lowest address in the frame)
-}
-
-// RawOtherRoot represents the other roots not in RawDump's other fields.
-type RawOtherRoot struct {
- Description string
- Addr uint64 // address pointed to by this root
-}
-
-// RawFinalizer represents a finalizer.
-type RawFinalizer struct {
- IsQueued bool // if true, the object is unreachable and the finalizer is ready to run
- ObjAddr uint64 // address of the object to finalize
- ObjTypeAddr uint64 // address of the descriptor for typeof(obj)
- FnAddr uint64 // function to be run (a FuncVal*)
- FnArgTypeAddr uint64 // address of the descriptor for the type of the function argument
- FnPC uint64 // PC of finalizer entry point
-}
-
-// RawDefer represents a defer.
-type RawDefer struct {
- Addr uint64 // address of the defer record
- GAddr uint64 // address of the containing goroutine's descriptor
- ArgP uint64 // stack pointer giving the args for defer (TODO: is this right?)
- PC uint64 // PC of the defer instruction
- FnAddr uint64 // function to be run (a FuncVal*)
- FnPC uint64 // PC of the defered function's entry point
- LinkAddr uint64 // address of the next defer record in this chain
-}
-
-// RawPanic represents a panic.
-type RawPanic struct {
- Addr uint64 // address of the panic record
- GAddr uint64 // address of the containing goroutine's descriptor
- ArgTypeAddr uint64 // type of the panic arg
- ArgAddr uint64 // address of the panic arg
- DeferAddr uint64 // address of the defer record that is currently running
- LinkAddr uint64 // address of the next panic record in this chain
-}
-
-// RawType repesents the Go runtime's representation of a type.
-type RawType struct {
- Addr uint64 // address of the type descriptor
- Size uint64 // in bytes
- Name string // not necessarily unique
- // If true, this type is equivalent to a single pointer, so ifaces can store
- // this type directly in the data field (without indirection).
- DirectIFace bool
-}
-
-// RawMemProfEntry represents a memory profiler entry.
-type RawMemProfEntry struct {
- Size uint64 // size of the allocated object
- NumAllocs uint64 // number of allocations
- NumFrees uint64 // number of frees
- Stacks []RawMemProfFrame // call stacks
-}
-
-// RawMemProfFrame represents a memory profiler frame.
-type RawMemProfFrame struct {
- Func []byte // string left as []byte reference to save memory
- File []byte // string left as []byte reference to save memory
- Line uint64
-}
-
-// RawAllocSample represents a memory profiler allocation sample.
-type RawAllocSample struct {
- Addr uint64 // address of object
- Prof *RawMemProfEntry // record of allocation site
-}
-
-// Close closes the file.
-func (r *RawDump) Close() error {
- return r.fmap.Close()
-}
-
-// FindSegment returns the segment that contains the given address, or
-// nil of no segment contains the address.
-func (r *RawDump) FindSegment(addr uint64) *RawSegment {
- // Binary search for an upper-bound heap object, then check
- // if the previous object contains addr.
- k := sort.Search(len(r.HeapObjects), func(k int) bool {
- return addr < r.HeapObjects[k].Addr
- })
- k--
- if k >= 0 && r.HeapObjects[k].Contains(addr) {
- return &r.HeapObjects[k]
- }
-
- // Check all global segments.
- for k := range r.GlobalSegments {
- if r.GlobalSegments[k].Contains(addr) {
- return &r.GlobalSegments[k]
- }
- }
-
- // NB: Stack-local vars are technically allocated in the heap, since stack frames are
- // allocated in the heap space, however, stack frames don't show up in r.HeapObjects.
- for _, f := range r.StackFrames {
- if f.Segment.Contains(addr) {
- return &f.Segment
- }
- }
-
- return nil
-}
-
-// Contains returns true if the segment contains the given address.
-func (r RawSegment) Contains(addr uint64) bool {
- return r.Addr <= addr && addr < r.Addr+r.Size()
-}
-
-// ContainsRange returns true if the segment contains the range [addr, addr+size).
-func (r RawSegment) ContainsRange(addr, size uint64) bool {
- if !r.Contains(addr) {
- return false
- }
- if size > 0 && !r.Contains(addr+size-1) {
- return false
- }
- return true
-}
-
-// Size returns the size of the segment in bytes.
-func (r RawSegment) Size() uint64 {
- return uint64(len(r.Data))
-}
-
-// Slice takes a slice of the given segment. Panics if [offset,offset+size)
-// is out-of-bounds. The resulting RawSegment.PtrOffsets will clipped and
-// translated into the new segment.
-func (r RawSegment) Slice(offset, size uint64) *RawSegment {
- if offset+size > uint64(len(r.Data)) {
- panic(fmt.Errorf("slice(%d,%d) out-of-bounds of segment @%x sz=%d", offset, size, r.Addr, len(r.Data)))
- }
- return &RawSegment{
- Addr: r.Addr + offset,
- Data: r.Data[offset : offset+size : offset+size],
- PtrFields: RawPtrFields{
- encoded: r.PtrFields.encoded,
- startOff: r.PtrFields.startOff + offset,
- endOff: r.PtrFields.startOff + offset + size,
- },
- }
-}
-
-// Offsets decodes the list of ptr field offsets.
-func (r RawPtrFields) Offsets() []uint64 {
- if r.encoded == nil {
- return nil
- }
-
- // NB: This should never fail since we already decoded the varints once
- // when parsing the file originally. Hence we panic on failure.
- reader := bytes.NewReader(r.encoded)
- readUint64 := func() uint64 {
- x, err := binary.ReadUvarint(reader)
- if err != nil {
- panic(fmt.Errorf("unexpected failure decoding uvarint: %v", err))
- }
- return x
- }
-
- var out []uint64
- for {
- k := readUint64()
- switch k {
- case 0: // end
- return out
- case 1: // ptr
- x := readUint64()
- if r.startOff <= x && x < r.endOff {
- out = append(out, x-r.startOff)
- }
- default:
- panic(fmt.Errorf("unexpected FieldKind %d", k))
- }
- }
-}
-
-// ReadPtr decodes a ptr from the given byte slice.
-func (r *RawParams) ReadPtr(b []byte) uint64 {
- switch r.PtrSize {
- case 4:
- return uint64(r.ByteOrder.Uint32(b))
- case 8:
- return r.ByteOrder.Uint64(b)
- default:
- panic(fmt.Errorf("unsupported PtrSize=%d", r.PtrSize))
- }
-}
-
-// WritePtr encodes a ptr into the given byte slice.
-func (r *RawParams) WritePtr(b []byte, addr uint64) {
- switch r.PtrSize {
- case 4:
- r.ByteOrder.PutUint32(b, uint32(addr))
- case 8:
- r.ByteOrder.PutUint64(b, addr)
- default:
- panic(fmt.Errorf("unsupported PtrSize=%d", r.PtrSize))
- }
-}
diff --git a/vendor/golang.org/x/tools/cmd/heapview/main.go b/vendor/golang.org/x/tools/cmd/heapview/main.go
deleted file mode 100644
index 6dac12e..0000000
--- a/vendor/golang.org/x/tools/cmd/heapview/main.go
+++ /dev/null
@@ -1,83 +0,0 @@
-// Copyright 2016 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// heapview is a tool for viewing Go heap dumps.
-package main
-
-import (
- "flag"
- "fmt"
- "go/build"
- "io"
- "log"
- "net/http"
- "os"
- "path/filepath"
-)
-
-var host = flag.String("host", "", "host addr to listen on")
-var port = flag.Int("port", 8080, "service port")
-
-var index = `
-
-
-
-
-
-`
-
-func toolsDir() string {
- p, err := build.Import("golang.org/x/tools", "", build.FindOnly)
- if err != nil {
- log.Println("error: can't find client files:", err)
- os.Exit(1)
- }
- return p.Dir
-}
-
-var parseFlags = func() {
- flag.Parse()
-}
-
-var addHandlers = func() {
- toolsDir := toolsDir()
-
- // Directly serve typescript code in client directory for development.
- http.Handle("/client/", http.StripPrefix("/client",
- http.FileServer(http.Dir(filepath.Join(toolsDir, "cmd/heapview/client")))))
-
- // Serve typescript.js and moduleloader.js for development.
- http.HandleFunc("/js/typescript.js", func(w http.ResponseWriter, r *http.Request) {
- http.ServeFile(w, r, filepath.Join(toolsDir, "third_party/typescript/typescript.js"))
- })
- http.HandleFunc("/js/moduleloader.js", func(w http.ResponseWriter, r *http.Request) {
- http.ServeFile(w, r, filepath.Join(toolsDir, "third_party/moduleloader/moduleloader.js"))
- })
- http.HandleFunc("/js/customelements.js", func(w http.ResponseWriter, r *http.Request) {
- http.ServeFile(w, r, filepath.Join(toolsDir, "third_party/webcomponents/customelements.js"))
- })
-
- // Serve index.html using html string above.
- http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
- w.Header().Set("Content-Type", "text/html")
- io.WriteString(w, index)
- })
-}
-
-var listenAndServe = func() error {
- return http.ListenAndServe(fmt.Sprintf("%s:%d", *host, *port), nil)
-}
-
-func main() {
- parseFlags()
- addHandlers()
- log.Fatal(listenAndServe())
-}
diff --git a/vendor/golang.org/x/tools/cmd/html2article/conv.go b/vendor/golang.org/x/tools/cmd/html2article/conv.go
deleted file mode 100644
index 4ef4f6c..0000000
--- a/vendor/golang.org/x/tools/cmd/html2article/conv.go
+++ /dev/null
@@ -1,331 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// This program takes an HTML file and outputs a corresponding article file in
-// present format. See: golang.org/x/tools/present
-package main // import "golang.org/x/tools/cmd/html2article"
-
-import (
- "bytes"
- "errors"
- "flag"
- "fmt"
- "io"
- "log"
- "net/url"
- "os"
- "regexp"
- "strings"
-
- "golang.org/x/net/html"
- "golang.org/x/net/html/atom"
-)
-
-func main() {
- flag.Parse()
-
- err := convert(os.Stdout, os.Stdin)
- if err != nil {
- log.Fatal(err)
- }
-}
-
-func convert(w io.Writer, r io.Reader) error {
- root, err := html.Parse(r)
- if err != nil {
- return err
- }
-
- style := find(root, isTag(atom.Style))
- if err := parseStyles(style); err != nil {
- log.Printf("couldn't parse all styles: %v", err)
- }
-
- body := find(root, isTag(atom.Body))
- if body == nil {
- return errors.New("couldn't find body")
- }
- article := limitNewlineRuns(makeHeadings(strings.TrimSpace(text(body))))
- _, err = fmt.Fprintf(w, "Title\n\n%s", article)
- return err
-}
-
-type Style string
-
-const (
- Bold Style = "*"
- Italic Style = "_"
- Code Style = "`"
-)
-
-var cssRules = make(map[string]Style)
-
-func parseStyles(style *html.Node) error {
- if style == nil || style.FirstChild == nil {
- return errors.New("couldn't find styles")
- }
-
- styles := style.FirstChild.Data
- readUntil := func(end rune) (string, bool) {
- i := strings.IndexRune(styles, end)
- if i < 0 {
- return "", false
- }
- s := styles[:i]
- styles = styles[i:]
- return s, true
- }
-
- for {
- sel, ok := readUntil('{')
- if !ok && sel == "" {
- break
- } else if !ok {
- return fmt.Errorf("could not parse selector %q", styles)
- }
-
- value, ok := readUntil('}')
- if !ok {
- return fmt.Errorf("couldn't parse style body for %s", sel)
- }
- switch {
- case strings.Contains(value, "italic"):
- cssRules[sel] = Italic
- case strings.Contains(value, "bold"):
- cssRules[sel] = Bold
- case strings.Contains(value, "Consolas") || strings.Contains(value, "Courier New"):
- cssRules[sel] = Code
- }
- }
- return nil
-}
-
-var newlineRun = regexp.MustCompile(`\n\n+`)
-
-func limitNewlineRuns(s string) string {
- return newlineRun.ReplaceAllString(s, "\n\n")
-}
-
-func makeHeadings(body string) string {
- buf := new(bytes.Buffer)
- lines := strings.Split(body, "\n")
- for i, s := range lines {
- if i == 0 && !isBoldTitle(s) {
- buf.WriteString("* Introduction\n\n")
- }
- if isBoldTitle(s) {
- s = strings.TrimSpace(strings.Replace(s, "*", " ", -1))
- s = "* " + s
- }
- buf.WriteString(s)
- buf.WriteByte('\n')
- }
- return buf.String()
-}
-
-func isBoldTitle(s string) bool {
- return !strings.Contains(s, " ") &&
- strings.HasPrefix(s, "*") &&
- strings.HasSuffix(s, "*")
-}
-
-func indent(buf *bytes.Buffer, s string) {
- for _, l := range strings.Split(s, "\n") {
- if l != "" {
- buf.WriteByte('\t')
- buf.WriteString(l)
- }
- buf.WriteByte('\n')
- }
-}
-
-func unwrap(buf *bytes.Buffer, s string) {
- var cont bool
- for _, l := range strings.Split(s, "\n") {
- l = strings.TrimSpace(l)
- if len(l) == 0 {
- if cont {
- buf.WriteByte('\n')
- buf.WriteByte('\n')
- }
- cont = false
- } else {
- if cont {
- buf.WriteByte(' ')
- }
- buf.WriteString(l)
- cont = true
- }
- }
-}
-
-func text(n *html.Node) string {
- var buf bytes.Buffer
- walk(n, func(n *html.Node) bool {
- switch n.Type {
- case html.TextNode:
- buf.WriteString(n.Data)
- return false
- case html.ElementNode:
- // no-op
- default:
- return true
- }
- a := n.DataAtom
- if a == atom.Span {
- switch {
- case hasStyle(Code)(n):
- a = atom.Code
- case hasStyle(Bold)(n):
- a = atom.B
- case hasStyle(Italic)(n):
- a = atom.I
- }
- }
- switch a {
- case atom.Br:
- buf.WriteByte('\n')
- case atom.P:
- unwrap(&buf, childText(n))
- buf.WriteString("\n\n")
- case atom.Li:
- buf.WriteString("- ")
- unwrap(&buf, childText(n))
- buf.WriteByte('\n')
- case atom.Pre:
- indent(&buf, childText(n))
- buf.WriteByte('\n')
- case atom.A:
- href, text := attr(n, "href"), childText(n)
- // Skip links with no text.
- if strings.TrimSpace(text) == "" {
- break
- }
- // Don't emit empty links.
- if strings.TrimSpace(href) == "" {
- buf.WriteString(text)
- break
- }
- // Use original url for Google Docs redirections.
- if u, err := url.Parse(href); err != nil {
- log.Printf("parsing url %q: %v", href, err)
- } else if u.Host == "www.google.com" && u.Path == "/url" {
- href = u.Query().Get("q")
- }
- fmt.Fprintf(&buf, "[[%s][%s]]", href, text)
- case atom.Code:
- buf.WriteString(highlight(n, "`"))
- case atom.B:
- buf.WriteString(highlight(n, "*"))
- case atom.I:
- buf.WriteString(highlight(n, "_"))
- case atom.Img:
- src := attr(n, "src")
- fmt.Fprintf(&buf, ".image %s\n", src)
- case atom.Iframe:
- src, w, h := attr(n, "src"), attr(n, "width"), attr(n, "height")
- fmt.Fprintf(&buf, "\n.iframe %s %s %s\n", src, h, w)
- case atom.Param:
- if attr(n, "name") == "movie" {
- // Old style YouTube embed.
- u := attr(n, "value")
- u = strings.Replace(u, "/v/", "/embed/", 1)
- if i := strings.Index(u, "&"); i >= 0 {
- u = u[:i]
- }
- fmt.Fprintf(&buf, "\n.iframe %s 540 304\n", u)
- }
- case atom.Title:
- default:
- return true
- }
- return false
- })
- return buf.String()
-}
-
-func childText(node *html.Node) string {
- var buf bytes.Buffer
- for n := node.FirstChild; n != nil; n = n.NextSibling {
- fmt.Fprint(&buf, text(n))
- }
- return buf.String()
-}
-
-func highlight(node *html.Node, char string) string {
- t := strings.Replace(childText(node), " ", char, -1)
- return fmt.Sprintf("%s%s%s", char, t, char)
-}
-
-type selector func(*html.Node) bool
-
-func isTag(a atom.Atom) selector {
- return func(n *html.Node) bool {
- return n.DataAtom == a
- }
-}
-
-func hasClass(name string) selector {
- return func(n *html.Node) bool {
- for _, a := range n.Attr {
- if a.Key == "class" {
- for _, c := range strings.Fields(a.Val) {
- if c == name {
- return true
- }
- }
- }
- }
- return false
- }
-}
-
-func hasStyle(s Style) selector {
- return func(n *html.Node) bool {
- for rule, s2 := range cssRules {
- if s2 != s {
- continue
- }
- if strings.HasPrefix(rule, ".") && hasClass(rule[1:])(n) {
- return true
- }
- if n.DataAtom.String() == rule {
- return true
- }
- }
- return false
- }
-}
-
-func attr(node *html.Node, key string) (value string) {
- for _, attr := range node.Attr {
- if attr.Key == key {
- return attr.Val
- }
- }
- return ""
-}
-
-func find(n *html.Node, fn selector) *html.Node {
- var result *html.Node
- walk(n, func(n *html.Node) bool {
- if result != nil {
- return false
- }
- if fn(n) {
- result = n
- return false
- }
- return true
- })
- return result
-}
-
-func walk(n *html.Node, fn selector) {
- if fn(n) {
- for c := n.FirstChild; c != nil; c = c.NextSibling {
- walk(c, fn)
- }
- }
-}
diff --git a/vendor/golang.org/x/tools/cmd/present/appengine.go b/vendor/golang.org/x/tools/cmd/present/appengine.go
deleted file mode 100644
index 1e39ce1..0000000
--- a/vendor/golang.org/x/tools/cmd/present/appengine.go
+++ /dev/null
@@ -1,22 +0,0 @@
-// Copyright 2012 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build appengine
-
-package main
-
-import (
- "mime"
-
- "golang.org/x/tools/present"
-)
-
-func init() {
- initTemplates("./present/")
- present.PlayEnabled = true
- initPlayground("./present/", nil)
-
- // App Engine has no /etc/mime.types
- mime.AddExtensionType(".svg", "image/svg+xml")
-}
diff --git a/vendor/golang.org/x/tools/cmd/present/dir.go b/vendor/golang.org/x/tools/cmd/present/dir.go
deleted file mode 100644
index 19aec87..0000000
--- a/vendor/golang.org/x/tools/cmd/present/dir.go
+++ /dev/null
@@ -1,214 +0,0 @@
-// Copyright 2012 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-import (
- "html/template"
- "io"
- "log"
- "net"
- "net/http"
- "os"
- "path/filepath"
- "sort"
-
- "golang.org/x/tools/present"
-)
-
-func init() {
- http.HandleFunc("/", dirHandler)
-}
-
-// dirHandler serves a directory listing for the requested path, rooted at basePath.
-func dirHandler(w http.ResponseWriter, r *http.Request) {
- if r.URL.Path == "/favicon.ico" {
- http.Error(w, "not found", 404)
- return
- }
- const base = "."
- name := filepath.Join(base, r.URL.Path)
- if isDoc(name) {
- err := renderDoc(w, name)
- if err != nil {
- log.Println(err)
- http.Error(w, err.Error(), 500)
- }
- return
- }
- if isDir, err := dirList(w, name); err != nil {
- addr, _, e := net.SplitHostPort(r.RemoteAddr)
- if e != nil {
- addr = r.RemoteAddr
- }
- log.Printf("request from %s: %s", addr, err)
- http.Error(w, err.Error(), 500)
- return
- } else if isDir {
- return
- }
- http.FileServer(http.Dir(base)).ServeHTTP(w, r)
-}
-
-func isDoc(path string) bool {
- _, ok := contentTemplate[filepath.Ext(path)]
- return ok
-}
-
-var (
- // dirListTemplate holds the front page template.
- dirListTemplate *template.Template
-
- // contentTemplate maps the presentable file extensions to the
- // template to be executed.
- contentTemplate map[string]*template.Template
-)
-
-func initTemplates(base string) error {
- // Locate the template file.
- actionTmpl := filepath.Join(base, "templates/action.tmpl")
-
- contentTemplate = make(map[string]*template.Template)
-
- for ext, contentTmpl := range map[string]string{
- ".slide": "slides.tmpl",
- ".article": "article.tmpl",
- } {
- contentTmpl = filepath.Join(base, "templates", contentTmpl)
-
- // Read and parse the input.
- tmpl := present.Template()
- tmpl = tmpl.Funcs(template.FuncMap{"playable": playable})
- if _, err := tmpl.ParseFiles(actionTmpl, contentTmpl); err != nil {
- return err
- }
- contentTemplate[ext] = tmpl
- }
-
- var err error
- dirListTemplate, err = template.ParseFiles(filepath.Join(base, "templates/dir.tmpl"))
- return err
-}
-
-// renderDoc reads the present file, gets its template representation,
-// and executes the template, sending output to w.
-func renderDoc(w io.Writer, docFile string) error {
- // Read the input and build the doc structure.
- doc, err := parse(docFile, 0)
- if err != nil {
- return err
- }
-
- // Find which template should be executed.
- tmpl := contentTemplate[filepath.Ext(docFile)]
-
- // Execute the template.
- return doc.Render(w, tmpl)
-}
-
-func parse(name string, mode present.ParseMode) (*present.Doc, error) {
- f, err := os.Open(name)
- if err != nil {
- return nil, err
- }
- defer f.Close()
- return present.Parse(f, name, mode)
-}
-
-// dirList scans the given path and writes a directory listing to w.
-// It parses the first part of each .slide file it encounters to display the
-// presentation title in the listing.
-// If the given path is not a directory, it returns (isDir == false, err == nil)
-// and writes nothing to w.
-func dirList(w io.Writer, name string) (isDir bool, err error) {
- f, err := os.Open(name)
- if err != nil {
- return false, err
- }
- defer f.Close()
- fi, err := f.Stat()
- if err != nil {
- return false, err
- }
- if isDir = fi.IsDir(); !isDir {
- return false, nil
- }
- fis, err := f.Readdir(0)
- if err != nil {
- return false, err
- }
- d := &dirListData{Path: name}
- for _, fi := range fis {
- // skip the golang.org directory
- if name == "." && fi.Name() == "golang.org" {
- continue
- }
- e := dirEntry{
- Name: fi.Name(),
- Path: filepath.ToSlash(filepath.Join(name, fi.Name())),
- }
- if fi.IsDir() && showDir(e.Name) {
- d.Dirs = append(d.Dirs, e)
- continue
- }
- if isDoc(e.Name) {
- if p, err := parse(e.Path, present.TitlesOnly); err != nil {
- log.Println(err)
- } else {
- e.Title = p.Title
- }
- switch filepath.Ext(e.Path) {
- case ".article":
- d.Articles = append(d.Articles, e)
- case ".slide":
- d.Slides = append(d.Slides, e)
- }
- } else if showFile(e.Name) {
- d.Other = append(d.Other, e)
- }
- }
- if d.Path == "." {
- d.Path = ""
- }
- sort.Sort(d.Dirs)
- sort.Sort(d.Slides)
- sort.Sort(d.Articles)
- sort.Sort(d.Other)
- return true, dirListTemplate.Execute(w, d)
-}
-
-// showFile reports whether the given file should be displayed in the list.
-func showFile(n string) bool {
- switch filepath.Ext(n) {
- case ".pdf":
- case ".html":
- case ".go":
- default:
- return isDoc(n)
- }
- return true
-}
-
-// showDir reports whether the given directory should be displayed in the list.
-func showDir(n string) bool {
- if len(n) > 0 && (n[0] == '.' || n[0] == '_') || n == "present" {
- return false
- }
- return true
-}
-
-type dirListData struct {
- Path string
- Dirs, Slides, Articles, Other dirEntrySlice
-}
-
-type dirEntry struct {
- Name, Path, Title string
-}
-
-type dirEntrySlice []dirEntry
-
-func (s dirEntrySlice) Len() int { return len(s) }
-func (s dirEntrySlice) Swap(i, j int) { s[i], s[j] = s[j], s[i] }
-func (s dirEntrySlice) Less(i, j int) bool { return s[i].Name < s[j].Name }
diff --git a/vendor/golang.org/x/tools/cmd/present/doc.go b/vendor/golang.org/x/tools/cmd/present/doc.go
deleted file mode 100644
index fafe4c1..0000000
--- a/vendor/golang.org/x/tools/cmd/present/doc.go
+++ /dev/null
@@ -1,57 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-/*
-Present displays slide presentations and articles. It runs a web server that
-presents slide and article files from the current directory.
-
-It may be run as a stand-alone command or an App Engine app.
-
-Usage of present:
- -base="": base path for slide template and static resources
- -http="127.0.0.1:3999": HTTP service address (e.g., '127.0.0.1:3999')
- -nacl=false: use Native Client environment playground (prevents non-Go code execution)
- -notes=false: enable presenter notes (press 'N' from the browser to display them)
- -orighost="": host component of web origin URL (e.g., 'localhost')
- -play=true: enable playground (permit execution of arbitrary user code)
-
-The setup of the Go version of NaCl is documented at:
-https://golang.org/wiki/NativeClient
-
-To use with App Engine, copy the tools/cmd/present directory to the root of
-your application and create an app.yaml file similar to this:
-
- application: [application]
- version: [version]
- runtime: go
- api_version: go1
-
- handlers:
- - url: /favicon.ico
- static_files: present/static/favicon.ico
- upload: present/static/favicon.ico
- - url: /static
- static_dir: present/static
- application_readable: true
- - url: /.*
- script: _go_app
-
- # nobuild_files is a regexp that identifies which files to not build. It
- # is useful for embedding static assets like code snippets and preventing
- # them from producing build errors for your project.
- nobuild_files: [path regexp for talk materials]
-
-Present then can be tested in a local App Engine environment with
-
- goapp serve
-
-Input files are named foo.extension, where "extension" defines the format of
-the generated output. The supported formats are:
- .slide // HTML5 slide presentation
- .article // article format, such as a blog post
-
-The present file format is documented by the present package:
-http://godoc.org/golang.org/x/tools/present
-*/
-package main // import "golang.org/x/tools/cmd/present"
diff --git a/vendor/golang.org/x/tools/cmd/present/local.go b/vendor/golang.org/x/tools/cmd/present/local.go
deleted file mode 100644
index 260cacb..0000000
--- a/vendor/golang.org/x/tools/cmd/present/local.go
+++ /dev/null
@@ -1,133 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build !appengine
-
-package main
-
-import (
- "flag"
- "fmt"
- "go/build"
- "log"
- "net"
- "net/http"
- "net/url"
- "os"
- "strings"
-
- "golang.org/x/tools/present"
-)
-
-const basePkg = "golang.org/x/tools/cmd/present"
-
-var (
- httpAddr = flag.String("http", "127.0.0.1:3999", "HTTP service address (e.g., '127.0.0.1:3999')")
- originHost = flag.String("orighost", "", "host component of web origin URL (e.g., 'localhost')")
- basePath = flag.String("base", "", "base path for slide template and static resources")
- nativeClient = flag.Bool("nacl", false, "use Native Client environment playground (prevents non-Go code execution)")
-)
-
-func main() {
- flag.BoolVar(&present.PlayEnabled, "play", true, "enable playground (permit execution of arbitrary user code)")
- flag.BoolVar(&present.NotesEnabled, "notes", false, "enable presenter notes (press 'N' from the browser to display them)")
- flag.Parse()
-
- if *basePath == "" {
- p, err := build.Default.Import(basePkg, "", build.FindOnly)
- if err != nil {
- fmt.Fprintf(os.Stderr, "Couldn't find gopresent files: %v\n", err)
- fmt.Fprintf(os.Stderr, basePathMessage, basePkg)
- os.Exit(1)
- }
- *basePath = p.Dir
- }
- err := initTemplates(*basePath)
- if err != nil {
- log.Fatalf("Failed to parse templates: %v", err)
- }
-
- ln, err := net.Listen("tcp", *httpAddr)
- if err != nil {
- log.Fatal(err)
- }
- defer ln.Close()
-
- _, port, err := net.SplitHostPort(ln.Addr().String())
- if err != nil {
- log.Fatal(err)
- }
-
- origin := &url.URL{Scheme: "http"}
- if *originHost != "" {
- origin.Host = net.JoinHostPort(*originHost, port)
- } else if ln.Addr().(*net.TCPAddr).IP.IsUnspecified() {
- name, _ := os.Hostname()
- origin.Host = net.JoinHostPort(name, port)
- } else {
- reqHost, reqPort, err := net.SplitHostPort(*httpAddr)
- if err != nil {
- log.Fatal(err)
- }
- if reqPort == "0" {
- origin.Host = net.JoinHostPort(reqHost, port)
- } else {
- origin.Host = *httpAddr
- }
- }
-
- initPlayground(*basePath, origin)
- http.Handle("/static/", http.FileServer(http.Dir(*basePath)))
-
- if !ln.Addr().(*net.TCPAddr).IP.IsLoopback() &&
- present.PlayEnabled && !*nativeClient {
- log.Print(localhostWarning)
- }
-
- log.Printf("Open your web browser and visit %s", origin.String())
- if present.NotesEnabled {
- log.Println("Notes are enabled, press 'N' from the browser to display them.")
- }
- log.Fatal(http.Serve(ln, nil))
-}
-
-func environ(vars ...string) []string {
- env := os.Environ()
- for _, r := range vars {
- k := strings.SplitAfter(r, "=")[0]
- var found bool
- for i, v := range env {
- if strings.HasPrefix(v, k) {
- env[i] = r
- found = true
- }
- }
- if !found {
- env = append(env, r)
- }
- }
- return env
-}
-
-const basePathMessage = `
-By default, gopresent locates the slide template files and associated
-static content by looking for a %q package
-in your Go workspaces (GOPATH).
-
-You may use the -base flag to specify an alternate location.
-`
-
-const localhostWarning = `
-WARNING! WARNING! WARNING!
-
-The present server appears to be listening on an address that is not localhost.
-Anyone with access to this address and port will have access to this machine as
-the user running present.
-
-To avoid this message, listen on localhost or run with -play=false.
-
-If you don't understand this message, hit Control-C to terminate this process.
-
-WARNING! WARNING! WARNING!
-`
diff --git a/vendor/golang.org/x/tools/cmd/present/play.go b/vendor/golang.org/x/tools/cmd/present/play.go
deleted file mode 100644
index 831b99f..0000000
--- a/vendor/golang.org/x/tools/cmd/present/play.go
+++ /dev/null
@@ -1,43 +0,0 @@
-// Copyright 2012 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-import (
- "bytes"
- "fmt"
- "io/ioutil"
- "net/http"
- "path/filepath"
- "time"
-
- "golang.org/x/tools/godoc/static"
-)
-
-var scripts = []string{"jquery.js", "jquery-ui.js", "playground.js", "play.js"}
-
-// playScript registers an HTTP handler at /play.js that serves all the
-// scripts specified by the variable above, and appends a line that
-// initializes the playground with the specified transport.
-func playScript(root, transport string) {
- modTime := time.Now()
- var buf bytes.Buffer
- for _, p := range scripts {
- if s, ok := static.Files[p]; ok {
- buf.WriteString(s)
- continue
- }
- b, err := ioutil.ReadFile(filepath.Join(root, "static", p))
- if err != nil {
- panic(err)
- }
- buf.Write(b)
- }
- fmt.Fprintf(&buf, "\ninitPlayground(new %v());\n", transport)
- b := buf.Bytes()
- http.HandleFunc("/play.js", func(w http.ResponseWriter, r *http.Request) {
- w.Header().Set("Content-type", "application/javascript")
- http.ServeContent(w, r, "", modTime, bytes.NewReader(b))
- })
-}
diff --git a/vendor/golang.org/x/tools/cmd/present/play_http.go b/vendor/golang.org/x/tools/cmd/present/play_http.go
deleted file mode 100644
index 02e7314..0000000
--- a/vendor/golang.org/x/tools/cmd/present/play_http.go
+++ /dev/null
@@ -1,23 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build appengine appenginevm
-
-package main
-
-import (
- "net/url"
-
- "golang.org/x/tools/present"
-
- _ "golang.org/x/tools/playground"
-)
-
-func initPlayground(basepath string, origin *url.URL) {
- playScript(basepath, "HTTPTransport")
-}
-
-func playable(c present.Code) bool {
- return present.PlayEnabled && c.Play && c.Ext == ".go"
-}
diff --git a/vendor/golang.org/x/tools/cmd/present/play_socket.go b/vendor/golang.org/x/tools/cmd/present/play_socket.go
deleted file mode 100644
index df63eda..0000000
--- a/vendor/golang.org/x/tools/cmd/present/play_socket.go
+++ /dev/null
@@ -1,36 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build !appengine,!appenginevm
-
-package main
-
-import (
- "net/http"
- "net/url"
- "runtime"
-
- "golang.org/x/tools/playground/socket"
- "golang.org/x/tools/present"
-)
-
-func initPlayground(basepath string, origin *url.URL) {
- if present.PlayEnabled {
- if *nativeClient {
- socket.RunScripts = false
- socket.Environ = func() []string {
- if runtime.GOARCH == "amd64" {
- return environ("GOOS=nacl", "GOARCH=amd64p32")
- }
- return environ("GOOS=nacl")
- }
- }
- playScript(basepath, "SocketTransport")
- http.Handle("/socket", socket.NewHandler(origin))
- }
-}
-
-func playable(c present.Code) bool {
- return present.PlayEnabled && c.Play
-}
diff --git a/vendor/golang.org/x/tools/cmd/present/static/article.css b/vendor/golang.org/x/tools/cmd/present/static/article.css
deleted file mode 100644
index 7b30455..0000000
--- a/vendor/golang.org/x/tools/cmd/present/static/article.css
+++ /dev/null
@@ -1,161 +0,0 @@
-body {
- margin: 0;
- font-family: Helvetica, Arial, sans-serif;
- font-size: 16px;
-}
-pre,
-code {
- font-family: Menlo, monospace;
- font-size: 14px;
-}
-pre {
- line-height: 18px;
- margin: 0;
- padding: 0;
-}
-a {
- color: #375EAB;
- text-decoration: none;
-}
-a:hover {
- text-decoration: underline;
-}
-p, ul, ol {
- margin: 20px;
-}
-
-h1, h2, h3, h4 {
- margin: 20px 0;
- padding: 0;
- color: #375EAB;
- font-weight: bold;
-}
-h1 {
- font-size: 18px;
- padding: 2px 5px;
-}
-h2 {
- font-size: 16px;
-}
-h3 {
- font-size: 16px;
-}
-h3, h4 {
- margin: 20px 5px;
-}
-h4 {
- font-size: 16px;
-}
-
-div#heading {
- margin: 0 0 10px 0;
- padding: 21px 0;
- font-size: 20px;
- font-weight: bold;
-}
-
-div#heading .author {
- padding-top: 10px;
- font-size: 14px;
- font-weight: normal;
-}
-
-div#topbar {
-}
-
-body {
- text-align: center;
-}
-div#page {
- width: 100%;
-}
-div#page > .container,
-div#topbar > .container {
- text-align: left;
- margin-left: auto;
- margin-right: auto;
- padding: 0 20px;
- width: 900px;
-}
-div#page.wide > .container,
-div#topbar.wide > .container {
- width: auto;
-}
-
-div#footer {
- text-align: center;
- color: #666;
- font-size: 14px;
- margin: 40px 0;
-}
-
-.author p {
- margin: 0;
- padding: 0 20px;
-}
-
-div.code,
-div.output {
- margin: 20px 20px 20px 40px;
- -webkit-border-radius: 5px;
- -moz-border-radius: 5px;
- border-radius: 5px;
-}
-
-div.output {
- padding: 10px;
-}
-
-div.code { background: white; }
-div.output { background: black; }
-div.output .stdout { color: #e6e6e6; }
-div.output .stderr { color: rgb(244, 74, 63); }
-div.output .system { color: rgb(255, 209, 77) }
-
-.buttons {
- margin-left: 20px;
-}
-div.output .buttons {
- margin-left: 0;
- margin-bottom: 10px;
-}
-
-#toc {
- float: right;
- margin: 0px 10px;
- padding: 10px;
- border: 1px solid #e5ecf9;
- background-color: #eee;
- box-shadow: 3px 3px 2px #888888;
-
- max-width: 33%;
-
- -webkit-border-radius: 5px;
- -moz-border-radius: 5px;
- border-radius: 5px;
-}
-
-#tochead {
- font-weight: bold;
- font-variant: small-caps;
- font-size: 100%;
- text-align: center;
- padding-bottom: 5px;
-}
-
-#toc ul, #toc a {
- list-style-type: none;
- padding-left: 0px;
- color: black;
- margin: 0px;
-}
-
-ul.toc-inner a {
- padding-left: 10px !important;
-}
-
-@media print {
- .no-print, .no-print * {
- display: none !important;
- }
-}
diff --git a/vendor/golang.org/x/tools/cmd/present/static/dir.css b/vendor/golang.org/x/tools/cmd/present/static/dir.css
deleted file mode 100644
index 97587e6..0000000
--- a/vendor/golang.org/x/tools/cmd/present/static/dir.css
+++ /dev/null
@@ -1,186 +0,0 @@
-/* copied from $GOROOT/doc/style.css */
-
-body {
- margin: 0;
- font-family: Helvetica, Arial, sans-serif;
- font-size: 16px;
-}
-pre,
-code {
- font-family: Menlo, monospace;
- font-size: 14px;
-}
-pre {
- line-height: 18px;
-}
-pre .comment {
- color: #375EAB;
-}
-pre .highlight,
-pre .highlight-comment,
-pre .selection-highlight,
-pre .selection-highlight-comment {
- background: #FFFF00;
-}
-pre .selection,
-pre .selection-comment {
- background: #FF9632;
-}
-pre .ln {
- color: #999;
-}
-body {
- color: #222;
-}
-a,
-.exampleHeading .text {
- color: #375EAB;
- text-decoration: none;
-}
-a:hover,
-.exampleHeading .text:hover {
- text-decoration: underline;
-}
-p,
-pre,
-ul,
-ol {
- margin: 20px;
-}
-pre {
- background: #e9e9e9;
- padding: 10px;
-
- -webkit-border-radius: 5px;
- -moz-border-radius: 5px;
- border-radius: 5px;
-}
-
-h1,
-h2,
-h3,
-h4,
-.rootHeading {
- margin: 20px 0;
- padding: 0;
- color: #375EAB;
- font-weight: bold;
-}
-h1 {
- font-size: 24px;
-}
-h2 {
- font-size: 20px;
- background: #E0EBF5;
- padding: 2px 5px;
-}
-h3 {
- font-size: 20px;
-}
-h3,
-h4 {
- margin: 20px 5px;
-}
-h4 {
- font-size: 16px;
-}
-
-dl {
- margin: 20px;
-}
-dd {
- margin: 2px 20px;
-}
-dl,
-dd {
- font-size: 14px;
-}
-div#nav table td {
- vertical-align: top;
-}
-
-div#heading {
- float: left;
- margin: 0 0 10px 0;
- padding: 21px 0;
- font-size: 20px;
- font-weight: normal;
-}
-div#heading a {
- color: #222;
- text-decoration: none;
-}
-
-div#topbar {
- background: #E0EBF5;
- height: 64px;
-}
-
-body {
- text-align: center;
-}
-div#page,
-div#topbar > .container {
- clear: both;
- text-align: left;
- margin-left: auto;
- margin-right: auto;
- padding: 0 20px;
- width: 900px;
-}
-div#page.wide,
-div#topbar > .wide {
- width: auto;
-}
-div#plusone {
- float: right;
-}
-
-div#footer {
- color: #666;
- font-size: 14px;
- margin: 40px 0;
-}
-
-div#menu > a,
-div#menu > input {
- padding: 10px;
-
- text-decoration: none;
- font-size: 16px;
-
- -webkit-border-radius: 5px;
- -moz-border-radius: 5px;
- border-radius: 5px;
-}
-div#menu > a,
-div#menu > input {
- border: 1px solid #375EAB;
-}
-div#menu > a {
- color: white;
- background: #375EAB;
-}
-
-div#menu {
- float: right;
- min-width: 590px;
- padding: 10px 0;
- text-align: right;
-}
-div#menu > a {
- margin-right: 5px;
- margin-bottom: 10px;
-
- padding: 10px;
-}
-div#menu > input {
- position: relative;
- top: 1px;
- width: 60px;
- background: white;
- color: #222;
-}
-div#menu > input.inactive {
- color: #999;
-}
diff --git a/vendor/golang.org/x/tools/cmd/present/static/dir.js b/vendor/golang.org/x/tools/cmd/present/static/dir.js
deleted file mode 100644
index 5b0c37e..0000000
--- a/vendor/golang.org/x/tools/cmd/present/static/dir.js
+++ /dev/null
@@ -1,41 +0,0 @@
-// Copyright 2012 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// copied from $GOROOT/doc/godocs.js
-
-function bindEvent(el, e, fn) {
- if (el.addEventListener){
- el.addEventListener(e, fn, false);
- } else if (el.attachEvent){
- el.attachEvent('on'+e, fn);
- }
-}
-
-function godocs_bindSearchEvents() {
- var search = document.getElementById('search');
- if (!search) {
- // no search box (index disabled)
- return;
- }
- function clearInactive() {
- if (search.className == "inactive") {
- search.value = "";
- search.className = "";
- }
- }
- function restoreInactive() {
- if (search.value !== "") {
- return;
- }
- if (search.type != "search") {
- search.value = search.getAttribute("placeholder");
- }
- search.className = "inactive";
- }
- restoreInactive();
- bindEvent(search, 'focus', clearInactive);
- bindEvent(search, 'blur', restoreInactive);
-}
-
-bindEvent(window, 'load', godocs_bindSearchEvents);
diff --git a/vendor/golang.org/x/tools/cmd/present/static/favicon.ico b/vendor/golang.org/x/tools/cmd/present/static/favicon.ico
deleted file mode 100644
index 48854ff..0000000
Binary files a/vendor/golang.org/x/tools/cmd/present/static/favicon.ico and /dev/null differ
diff --git a/vendor/golang.org/x/tools/cmd/present/static/jquery-ui.js b/vendor/golang.org/x/tools/cmd/present/static/jquery-ui.js
deleted file mode 100644
index f391938..0000000
--- a/vendor/golang.org/x/tools/cmd/present/static/jquery-ui.js
+++ /dev/null
@@ -1,6 +0,0 @@
-/*! jQuery UI - v1.10.2 - 2013-03-20
-* http://jqueryui.com
-* Includes: jquery.ui.core.js, jquery.ui.widget.js, jquery.ui.mouse.js, jquery.ui.resizable.js
-* Copyright 2013 jQuery Foundation and other contributors Licensed MIT */
-
-(function(e,t){function i(t,i){var a,n,r,o=t.nodeName.toLowerCase();return"area"===o?(a=t.parentNode,n=a.name,t.href&&n&&"map"===a.nodeName.toLowerCase()?(r=e("img[usemap=#"+n+"]")[0],!!r&&s(r)):!1):(/input|select|textarea|button|object/.test(o)?!t.disabled:"a"===o?t.href||i:i)&&s(t)}function s(t){return e.expr.filters.visible(t)&&!e(t).parents().addBack().filter(function(){return"hidden"===e.css(this,"visibility")}).length}var a=0,n=/^ui-id-\d+$/;e.ui=e.ui||{},e.extend(e.ui,{version:"1.10.2",keyCode:{BACKSPACE:8,COMMA:188,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,LEFT:37,NUMPAD_ADD:107,NUMPAD_DECIMAL:110,NUMPAD_DIVIDE:111,NUMPAD_ENTER:108,NUMPAD_MULTIPLY:106,NUMPAD_SUBTRACT:109,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SPACE:32,TAB:9,UP:38}}),e.fn.extend({focus:function(t){return function(i,s){return"number"==typeof i?this.each(function(){var t=this;setTimeout(function(){e(t).focus(),s&&s.call(t)},i)}):t.apply(this,arguments)}}(e.fn.focus),scrollParent:function(){var t;return t=e.ui.ie&&/(static|relative)/.test(this.css("position"))||/absolute/.test(this.css("position"))?this.parents().filter(function(){return/(relative|absolute|fixed)/.test(e.css(this,"position"))&&/(auto|scroll)/.test(e.css(this,"overflow")+e.css(this,"overflow-y")+e.css(this,"overflow-x"))}).eq(0):this.parents().filter(function(){return/(auto|scroll)/.test(e.css(this,"overflow")+e.css(this,"overflow-y")+e.css(this,"overflow-x"))}).eq(0),/fixed/.test(this.css("position"))||!t.length?e(document):t},zIndex:function(i){if(i!==t)return this.css("zIndex",i);if(this.length)for(var s,a,n=e(this[0]);n.length&&n[0]!==document;){if(s=n.css("position"),("absolute"===s||"relative"===s||"fixed"===s)&&(a=parseInt(n.css("zIndex"),10),!isNaN(a)&&0!==a))return a;n=n.parent()}return 0},uniqueId:function(){return this.each(function(){this.id||(this.id="ui-id-"+ ++a)})},removeUniqueId:function(){return this.each(function(){n.test(this.id)&&e(this).removeAttr("id")})}}),e.extend(e.expr[":"],{data:e.expr.createPseudo?e.expr.createPseudo(function(t){return function(i){return!!e.data(i,t)}}):function(t,i,s){return!!e.data(t,s[3])},focusable:function(t){return i(t,!isNaN(e.attr(t,"tabindex")))},tabbable:function(t){var s=e.attr(t,"tabindex"),a=isNaN(s);return(a||s>=0)&&i(t,!a)}}),e("").outerWidth(1).jquery||e.each(["Width","Height"],function(i,s){function a(t,i,s,a){return e.each(n,function(){i-=parseFloat(e.css(t,"padding"+this))||0,s&&(i-=parseFloat(e.css(t,"border"+this+"Width"))||0),a&&(i-=parseFloat(e.css(t,"margin"+this))||0)}),i}var n="Width"===s?["Left","Right"]:["Top","Bottom"],r=s.toLowerCase(),o={innerWidth:e.fn.innerWidth,innerHeight:e.fn.innerHeight,outerWidth:e.fn.outerWidth,outerHeight:e.fn.outerHeight};e.fn["inner"+s]=function(i){return i===t?o["inner"+s].call(this):this.each(function(){e(this).css(r,a(this,i)+"px")})},e.fn["outer"+s]=function(t,i){return"number"!=typeof t?o["outer"+s].call(this,t):this.each(function(){e(this).css(r,a(this,t,!0,i)+"px")})}}),e.fn.addBack||(e.fn.addBack=function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}),e(" ").data("a-b","a").removeData("a-b").data("a-b")&&(e.fn.removeData=function(t){return function(i){return arguments.length?t.call(this,e.camelCase(i)):t.call(this)}}(e.fn.removeData)),e.ui.ie=!!/msie [\w.]+/.exec(navigator.userAgent.toLowerCase()),e.support.selectstart="onselectstart"in document.createElement("div"),e.fn.extend({disableSelection:function(){return this.bind((e.support.selectstart?"selectstart":"mousedown")+".ui-disableSelection",function(e){e.preventDefault()})},enableSelection:function(){return this.unbind(".ui-disableSelection")}}),e.extend(e.ui,{plugin:{add:function(t,i,s){var a,n=e.ui[t].prototype;for(a in s)n.plugins[a]=n.plugins[a]||[],n.plugins[a].push([i,s[a]])},call:function(e,t,i){var s,a=e.plugins[t];if(a&&e.element[0].parentNode&&11!==e.element[0].parentNode.nodeType)for(s=0;a.length>s;s++)e.options[a[s][0]]&&a[s][1].apply(e.element,i)}},hasScroll:function(t,i){if("hidden"===e(t).css("overflow"))return!1;var s=i&&"left"===i?"scrollLeft":"scrollTop",a=!1;return t[s]>0?!0:(t[s]=1,a=t[s]>0,t[s]=0,a)}})})(jQuery);(function(e,t){var i=0,s=Array.prototype.slice,n=e.cleanData;e.cleanData=function(t){for(var i,s=0;null!=(i=t[s]);s++)try{e(i).triggerHandler("remove")}catch(a){}n(t)},e.widget=function(i,s,n){var a,r,o,h,l={},u=i.split(".")[0];i=i.split(".")[1],a=u+"-"+i,n||(n=s,s=e.Widget),e.expr[":"][a.toLowerCase()]=function(t){return!!e.data(t,a)},e[u]=e[u]||{},r=e[u][i],o=e[u][i]=function(e,i){return this._createWidget?(arguments.length&&this._createWidget(e,i),t):new o(e,i)},e.extend(o,r,{version:n.version,_proto:e.extend({},n),_childConstructors:[]}),h=new s,h.options=e.widget.extend({},h.options),e.each(n,function(i,n){return e.isFunction(n)?(l[i]=function(){var e=function(){return s.prototype[i].apply(this,arguments)},t=function(e){return s.prototype[i].apply(this,e)};return function(){var i,s=this._super,a=this._superApply;return this._super=e,this._superApply=t,i=n.apply(this,arguments),this._super=s,this._superApply=a,i}}(),t):(l[i]=n,t)}),o.prototype=e.widget.extend(h,{widgetEventPrefix:r?h.widgetEventPrefix:i},l,{constructor:o,namespace:u,widgetName:i,widgetFullName:a}),r?(e.each(r._childConstructors,function(t,i){var s=i.prototype;e.widget(s.namespace+"."+s.widgetName,o,i._proto)}),delete r._childConstructors):s._childConstructors.push(o),e.widget.bridge(i,o)},e.widget.extend=function(i){for(var n,a,r=s.call(arguments,1),o=0,h=r.length;h>o;o++)for(n in r[o])a=r[o][n],r[o].hasOwnProperty(n)&&a!==t&&(i[n]=e.isPlainObject(a)?e.isPlainObject(i[n])?e.widget.extend({},i[n],a):e.widget.extend({},a):a);return i},e.widget.bridge=function(i,n){var a=n.prototype.widgetFullName||i;e.fn[i]=function(r){var o="string"==typeof r,h=s.call(arguments,1),l=this;return r=!o&&h.length?e.widget.extend.apply(null,[r].concat(h)):r,o?this.each(function(){var s,n=e.data(this,a);return n?e.isFunction(n[r])&&"_"!==r.charAt(0)?(s=n[r].apply(n,h),s!==n&&s!==t?(l=s&&s.jquery?l.pushStack(s.get()):s,!1):t):e.error("no such method '"+r+"' for "+i+" widget instance"):e.error("cannot call methods on "+i+" prior to initialization; "+"attempted to call method '"+r+"'")}):this.each(function(){var t=e.data(this,a);t?t.option(r||{})._init():e.data(this,a,new n(r,this))}),l}},e.Widget=function(){},e.Widget._childConstructors=[],e.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",defaultElement:"",options:{disabled:!1,create:null},_createWidget:function(t,s){s=e(s||this.defaultElement||this)[0],this.element=e(s),this.uuid=i++,this.eventNamespace="."+this.widgetName+this.uuid,this.options=e.widget.extend({},this.options,this._getCreateOptions(),t),this.bindings=e(),this.hoverable=e(),this.focusable=e(),s!==this&&(e.data(s,this.widgetFullName,this),this._on(!0,this.element,{remove:function(e){e.target===s&&this.destroy()}}),this.document=e(s.style?s.ownerDocument:s.document||s),this.window=e(this.document[0].defaultView||this.document[0].parentWindow)),this._create(),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:e.noop,_getCreateEventData:e.noop,_create:e.noop,_init:e.noop,destroy:function(){this._destroy(),this.element.unbind(this.eventNamespace).removeData(this.widgetName).removeData(this.widgetFullName).removeData(e.camelCase(this.widgetFullName)),this.widget().unbind(this.eventNamespace).removeAttr("aria-disabled").removeClass(this.widgetFullName+"-disabled "+"ui-state-disabled"),this.bindings.unbind(this.eventNamespace),this.hoverable.removeClass("ui-state-hover"),this.focusable.removeClass("ui-state-focus")},_destroy:e.noop,widget:function(){return this.element},option:function(i,s){var n,a,r,o=i;if(0===arguments.length)return e.widget.extend({},this.options);if("string"==typeof i)if(o={},n=i.split("."),i=n.shift(),n.length){for(a=o[i]=e.widget.extend({},this.options[i]),r=0;n.length-1>r;r++)a[n[r]]=a[n[r]]||{},a=a[n[r]];if(i=n.pop(),s===t)return a[i]===t?null:a[i];a[i]=s}else{if(s===t)return this.options[i]===t?null:this.options[i];o[i]=s}return this._setOptions(o),this},_setOptions:function(e){var t;for(t in e)this._setOption(t,e[t]);return this},_setOption:function(e,t){return this.options[e]=t,"disabled"===e&&(this.widget().toggleClass(this.widgetFullName+"-disabled ui-state-disabled",!!t).attr("aria-disabled",t),this.hoverable.removeClass("ui-state-hover"),this.focusable.removeClass("ui-state-focus")),this},enable:function(){return this._setOption("disabled",!1)},disable:function(){return this._setOption("disabled",!0)},_on:function(i,s,n){var a,r=this;"boolean"!=typeof i&&(n=s,s=i,i=!1),n?(s=a=e(s),this.bindings=this.bindings.add(s)):(n=s,s=this.element,a=this.widget()),e.each(n,function(n,o){function h(){return i||r.options.disabled!==!0&&!e(this).hasClass("ui-state-disabled")?("string"==typeof o?r[o]:o).apply(r,arguments):t}"string"!=typeof o&&(h.guid=o.guid=o.guid||h.guid||e.guid++);var l=n.match(/^(\w+)\s*(.*)$/),u=l[1]+r.eventNamespace,c=l[2];c?a.delegate(c,u,h):s.bind(u,h)})},_off:function(e,t){t=(t||"").split(" ").join(this.eventNamespace+" ")+this.eventNamespace,e.unbind(t).undelegate(t)},_delay:function(e,t){function i(){return("string"==typeof e?s[e]:e).apply(s,arguments)}var s=this;return setTimeout(i,t||0)},_hoverable:function(t){this.hoverable=this.hoverable.add(t),this._on(t,{mouseenter:function(t){e(t.currentTarget).addClass("ui-state-hover")},mouseleave:function(t){e(t.currentTarget).removeClass("ui-state-hover")}})},_focusable:function(t){this.focusable=this.focusable.add(t),this._on(t,{focusin:function(t){e(t.currentTarget).addClass("ui-state-focus")},focusout:function(t){e(t.currentTarget).removeClass("ui-state-focus")}})},_trigger:function(t,i,s){var n,a,r=this.options[t];if(s=s||{},i=e.Event(i),i.type=(t===this.widgetEventPrefix?t:this.widgetEventPrefix+t).toLowerCase(),i.target=this.element[0],a=i.originalEvent)for(n in a)n in i||(i[n]=a[n]);return this.element.trigger(i,s),!(e.isFunction(r)&&r.apply(this.element[0],[i].concat(s))===!1||i.isDefaultPrevented())}},e.each({show:"fadeIn",hide:"fadeOut"},function(t,i){e.Widget.prototype["_"+t]=function(s,n,a){"string"==typeof n&&(n={effect:n});var r,o=n?n===!0||"number"==typeof n?i:n.effect||i:t;n=n||{},"number"==typeof n&&(n={duration:n}),r=!e.isEmptyObject(n),n.complete=a,n.delay&&s.delay(n.delay),r&&e.effects&&e.effects.effect[o]?s[t](n):o!==t&&s[o]?s[o](n.duration,n.easing,a):s.queue(function(i){e(this)[t](),a&&a.call(s[0]),i()})}})})(jQuery);(function(e){var t=!1;e(document).mouseup(function(){t=!1}),e.widget("ui.mouse",{version:"1.10.2",options:{cancel:"input,textarea,button,select,option",distance:1,delay:0},_mouseInit:function(){var t=this;this.element.bind("mousedown."+this.widgetName,function(e){return t._mouseDown(e)}).bind("click."+this.widgetName,function(i){return!0===e.data(i.target,t.widgetName+".preventClickEvent")?(e.removeData(i.target,t.widgetName+".preventClickEvent"),i.stopImmediatePropagation(),!1):undefined}),this.started=!1},_mouseDestroy:function(){this.element.unbind("."+this.widgetName),this._mouseMoveDelegate&&e(document).unbind("mousemove."+this.widgetName,this._mouseMoveDelegate).unbind("mouseup."+this.widgetName,this._mouseUpDelegate)},_mouseDown:function(i){if(!t){this._mouseStarted&&this._mouseUp(i),this._mouseDownEvent=i;var s=this,n=1===i.which,a="string"==typeof this.options.cancel&&i.target.nodeName?e(i.target).closest(this.options.cancel).length:!1;return n&&!a&&this._mouseCapture(i)?(this.mouseDelayMet=!this.options.delay,this.mouseDelayMet||(this._mouseDelayTimer=setTimeout(function(){s.mouseDelayMet=!0},this.options.delay)),this._mouseDistanceMet(i)&&this._mouseDelayMet(i)&&(this._mouseStarted=this._mouseStart(i)!==!1,!this._mouseStarted)?(i.preventDefault(),!0):(!0===e.data(i.target,this.widgetName+".preventClickEvent")&&e.removeData(i.target,this.widgetName+".preventClickEvent"),this._mouseMoveDelegate=function(e){return s._mouseMove(e)},this._mouseUpDelegate=function(e){return s._mouseUp(e)},e(document).bind("mousemove."+this.widgetName,this._mouseMoveDelegate).bind("mouseup."+this.widgetName,this._mouseUpDelegate),i.preventDefault(),t=!0,!0)):!0}},_mouseMove:function(t){return e.ui.ie&&(!document.documentMode||9>document.documentMode)&&!t.button?this._mouseUp(t):this._mouseStarted?(this._mouseDrag(t),t.preventDefault()):(this._mouseDistanceMet(t)&&this._mouseDelayMet(t)&&(this._mouseStarted=this._mouseStart(this._mouseDownEvent,t)!==!1,this._mouseStarted?this._mouseDrag(t):this._mouseUp(t)),!this._mouseStarted)},_mouseUp:function(t){return e(document).unbind("mousemove."+this.widgetName,this._mouseMoveDelegate).unbind("mouseup."+this.widgetName,this._mouseUpDelegate),this._mouseStarted&&(this._mouseStarted=!1,t.target===this._mouseDownEvent.target&&e.data(t.target,this.widgetName+".preventClickEvent",!0),this._mouseStop(t)),!1},_mouseDistanceMet:function(e){return Math.max(Math.abs(this._mouseDownEvent.pageX-e.pageX),Math.abs(this._mouseDownEvent.pageY-e.pageY))>=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return!0}})})(jQuery);(function(e){function t(e){return parseInt(e,10)||0}function i(e){return!isNaN(parseInt(e,10))}e.widget("ui.resizable",e.ui.mouse,{version:"1.10.2",widgetEventPrefix:"resize",options:{alsoResize:!1,animate:!1,animateDuration:"slow",animateEasing:"swing",aspectRatio:!1,autoHide:!1,containment:!1,ghost:!1,grid:!1,handles:"e,s,se",helper:!1,maxHeight:null,maxWidth:null,minHeight:10,minWidth:10,zIndex:90,resize:null,start:null,stop:null},_create:function(){var t,i,s,n,a,o=this,r=this.options;if(this.element.addClass("ui-resizable"),e.extend(this,{_aspectRatio:!!r.aspectRatio,aspectRatio:r.aspectRatio,originalElement:this.element,_proportionallyResizeElements:[],_helper:r.helper||r.ghost||r.animate?r.helper||"ui-resizable-helper":null}),this.element[0].nodeName.match(/canvas|textarea|input|select|button|img/i)&&(this.element.wrap(e("
").css({position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css("top"),left:this.element.css("left")})),this.element=this.element.parent().data("ui-resizable",this.element.data("ui-resizable")),this.elementIsWrapper=!0,this.element.css({marginLeft:this.originalElement.css("marginLeft"),marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom")}),this.originalElement.css({marginLeft:0,marginTop:0,marginRight:0,marginBottom:0}),this.originalResizeStyle=this.originalElement.css("resize"),this.originalElement.css("resize","none"),this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"})),this.originalElement.css({margin:this.originalElement.css("margin")}),this._proportionallyResize()),this.handles=r.handles||(e(".ui-resizable-handle",this.element).length?{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",nw:".ui-resizable-nw"}:"e,s,se"),this.handles.constructor===String)for("all"===this.handles&&(this.handles="n,e,s,w,se,sw,ne,nw"),t=this.handles.split(","),this.handles={},i=0;t.length>i;i++)s=e.trim(t[i]),a="ui-resizable-"+s,n=e("
"),n.css({zIndex:r.zIndex}),"se"===s&&n.addClass("ui-icon ui-icon-gripsmall-diagonal-se"),this.handles[s]=".ui-resizable-"+s,this.element.append(n);this._renderAxis=function(t){var i,s,n,a;t=t||this.element;for(i in this.handles)this.handles[i].constructor===String&&(this.handles[i]=e(this.handles[i],this.element).show()),this.elementIsWrapper&&this.originalElement[0].nodeName.match(/textarea|input|select|button/i)&&(s=e(this.handles[i],this.element),a=/sw|ne|nw|se|n|s/.test(i)?s.outerHeight():s.outerWidth(),n=["padding",/ne|nw|n/.test(i)?"Top":/se|sw|s/.test(i)?"Bottom":/^e$/.test(i)?"Right":"Left"].join(""),t.css(n,a),this._proportionallyResize()),e(this.handles[i]).length},this._renderAxis(this.element),this._handles=e(".ui-resizable-handle",this.element).disableSelection(),this._handles.mouseover(function(){o.resizing||(this.className&&(n=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)),o.axis=n&&n[1]?n[1]:"se")}),r.autoHide&&(this._handles.hide(),e(this.element).addClass("ui-resizable-autohide").mouseenter(function(){r.disabled||(e(this).removeClass("ui-resizable-autohide"),o._handles.show())}).mouseleave(function(){r.disabled||o.resizing||(e(this).addClass("ui-resizable-autohide"),o._handles.hide())})),this._mouseInit()},_destroy:function(){this._mouseDestroy();var t,i=function(t){e(t).removeClass("ui-resizable ui-resizable-disabled ui-resizable-resizing").removeData("resizable").removeData("ui-resizable").unbind(".resizable").find(".ui-resizable-handle").remove()};return this.elementIsWrapper&&(i(this.element),t=this.element,this.originalElement.css({position:t.css("position"),width:t.outerWidth(),height:t.outerHeight(),top:t.css("top"),left:t.css("left")}).insertAfter(t),t.remove()),this.originalElement.css("resize",this.originalResizeStyle),i(this.originalElement),this},_mouseCapture:function(t){var i,s,n=!1;for(i in this.handles)s=e(this.handles[i])[0],(s===t.target||e.contains(s,t.target))&&(n=!0);return!this.options.disabled&&n},_mouseStart:function(i){var s,n,a,o=this.options,r=this.element.position(),h=this.element;return this.resizing=!0,/absolute/.test(h.css("position"))?h.css({position:"absolute",top:h.css("top"),left:h.css("left")}):h.is(".ui-draggable")&&h.css({position:"absolute",top:r.top,left:r.left}),this._renderProxy(),s=t(this.helper.css("left")),n=t(this.helper.css("top")),o.containment&&(s+=e(o.containment).scrollLeft()||0,n+=e(o.containment).scrollTop()||0),this.offset=this.helper.offset(),this.position={left:s,top:n},this.size=this._helper?{width:h.outerWidth(),height:h.outerHeight()}:{width:h.width(),height:h.height()},this.originalSize=this._helper?{width:h.outerWidth(),height:h.outerHeight()}:{width:h.width(),height:h.height()},this.originalPosition={left:s,top:n},this.sizeDiff={width:h.outerWidth()-h.width(),height:h.outerHeight()-h.height()},this.originalMousePosition={left:i.pageX,top:i.pageY},this.aspectRatio="number"==typeof o.aspectRatio?o.aspectRatio:this.originalSize.width/this.originalSize.height||1,a=e(".ui-resizable-"+this.axis).css("cursor"),e("body").css("cursor","auto"===a?this.axis+"-resize":a),h.addClass("ui-resizable-resizing"),this._propagate("start",i),!0},_mouseDrag:function(t){var i,s=this.helper,n={},a=this.originalMousePosition,o=this.axis,r=this.position.top,h=this.position.left,l=this.size.width,u=this.size.height,c=t.pageX-a.left||0,d=t.pageY-a.top||0,p=this._change[o];return p?(i=p.apply(this,[t,c,d]),this._updateVirtualBoundaries(t.shiftKey),(this._aspectRatio||t.shiftKey)&&(i=this._updateRatio(i,t)),i=this._respectSize(i,t),this._updateCache(i),this._propagate("resize",t),this.position.top!==r&&(n.top=this.position.top+"px"),this.position.left!==h&&(n.left=this.position.left+"px"),this.size.width!==l&&(n.width=this.size.width+"px"),this.size.height!==u&&(n.height=this.size.height+"px"),s.css(n),!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize(),e.isEmptyObject(n)||this._trigger("resize",t,this.ui()),!1):!1},_mouseStop:function(t){this.resizing=!1;var i,s,n,a,o,r,h,l=this.options,u=this;return this._helper&&(i=this._proportionallyResizeElements,s=i.length&&/textarea/i.test(i[0].nodeName),n=s&&e.ui.hasScroll(i[0],"left")?0:u.sizeDiff.height,a=s?0:u.sizeDiff.width,o={width:u.helper.width()-a,height:u.helper.height()-n},r=parseInt(u.element.css("left"),10)+(u.position.left-u.originalPosition.left)||null,h=parseInt(u.element.css("top"),10)+(u.position.top-u.originalPosition.top)||null,l.animate||this.element.css(e.extend(o,{top:h,left:r})),u.helper.height(u.size.height),u.helper.width(u.size.width),this._helper&&!l.animate&&this._proportionallyResize()),e("body").css("cursor","auto"),this.element.removeClass("ui-resizable-resizing"),this._propagate("stop",t),this._helper&&this.helper.remove(),!1},_updateVirtualBoundaries:function(e){var t,s,n,a,o,r=this.options;o={minWidth:i(r.minWidth)?r.minWidth:0,maxWidth:i(r.maxWidth)?r.maxWidth:1/0,minHeight:i(r.minHeight)?r.minHeight:0,maxHeight:i(r.maxHeight)?r.maxHeight:1/0},(this._aspectRatio||e)&&(t=o.minHeight*this.aspectRatio,n=o.minWidth/this.aspectRatio,s=o.maxHeight*this.aspectRatio,a=o.maxWidth/this.aspectRatio,t>o.minWidth&&(o.minWidth=t),n>o.minHeight&&(o.minHeight=n),o.maxWidth>s&&(o.maxWidth=s),o.maxHeight>a&&(o.maxHeight=a)),this._vBoundaries=o},_updateCache:function(e){this.offset=this.helper.offset(),i(e.left)&&(this.position.left=e.left),i(e.top)&&(this.position.top=e.top),i(e.height)&&(this.size.height=e.height),i(e.width)&&(this.size.width=e.width)},_updateRatio:function(e){var t=this.position,s=this.size,n=this.axis;return i(e.height)?e.width=e.height*this.aspectRatio:i(e.width)&&(e.height=e.width/this.aspectRatio),"sw"===n&&(e.left=t.left+(s.width-e.width),e.top=null),"nw"===n&&(e.top=t.top+(s.height-e.height),e.left=t.left+(s.width-e.width)),e},_respectSize:function(e){var t=this._vBoundaries,s=this.axis,n=i(e.width)&&t.maxWidth&&t.maxWidth
e.width,r=i(e.height)&&t.minHeight&&t.minHeight>e.height,h=this.originalPosition.left+this.originalSize.width,l=this.position.top+this.size.height,u=/sw|nw|w/.test(s),c=/nw|ne|n/.test(s);return o&&(e.width=t.minWidth),r&&(e.height=t.minHeight),n&&(e.width=t.maxWidth),a&&(e.height=t.maxHeight),o&&u&&(e.left=h-t.minWidth),n&&u&&(e.left=h-t.maxWidth),r&&c&&(e.top=l-t.minHeight),a&&c&&(e.top=l-t.maxHeight),e.width||e.height||e.left||!e.top?e.width||e.height||e.top||!e.left||(e.left=null):e.top=null,e},_proportionallyResize:function(){if(this._proportionallyResizeElements.length){var e,t,i,s,n,a=this.helper||this.element;for(e=0;this._proportionallyResizeElements.length>e;e++){if(n=this._proportionallyResizeElements[e],!this.borderDif)for(this.borderDif=[],i=[n.css("borderTopWidth"),n.css("borderRightWidth"),n.css("borderBottomWidth"),n.css("borderLeftWidth")],s=[n.css("paddingTop"),n.css("paddingRight"),n.css("paddingBottom"),n.css("paddingLeft")],t=0;i.length>t;t++)this.borderDif[t]=(parseInt(i[t],10)||0)+(parseInt(s[t],10)||0);n.css({height:a.height()-this.borderDif[0]-this.borderDif[2]||0,width:a.width()-this.borderDif[1]-this.borderDif[3]||0})}}},_renderProxy:function(){var t=this.element,i=this.options;this.elementOffset=t.offset(),this._helper?(this.helper=this.helper||e("
"),this.helper.addClass(this._helper).css({width:this.element.outerWidth()-1,height:this.element.outerHeight()-1,position:"absolute",left:this.elementOffset.left+"px",top:this.elementOffset.top+"px",zIndex:++i.zIndex}),this.helper.appendTo("body").disableSelection()):this.helper=this.element},_change:{e:function(e,t){return{width:this.originalSize.width+t}},w:function(e,t){var i=this.originalSize,s=this.originalPosition;return{left:s.left+t,width:i.width-t}},n:function(e,t,i){var s=this.originalSize,n=this.originalPosition;return{top:n.top+i,height:s.height-i}},s:function(e,t,i){return{height:this.originalSize.height+i}},se:function(t,i,s){return e.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[t,i,s]))},sw:function(t,i,s){return e.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[t,i,s]))},ne:function(t,i,s){return e.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[t,i,s]))},nw:function(t,i,s){return e.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[t,i,s]))}},_propagate:function(t,i){e.ui.plugin.call(this,t,[i,this.ui()]),"resize"!==t&&this._trigger(t,i,this.ui())},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}}),e.ui.plugin.add("resizable","animate",{stop:function(t){var i=e(this).data("ui-resizable"),s=i.options,n=i._proportionallyResizeElements,a=n.length&&/textarea/i.test(n[0].nodeName),o=a&&e.ui.hasScroll(n[0],"left")?0:i.sizeDiff.height,r=a?0:i.sizeDiff.width,h={width:i.size.width-r,height:i.size.height-o},l=parseInt(i.element.css("left"),10)+(i.position.left-i.originalPosition.left)||null,u=parseInt(i.element.css("top"),10)+(i.position.top-i.originalPosition.top)||null;i.element.animate(e.extend(h,u&&l?{top:u,left:l}:{}),{duration:s.animateDuration,easing:s.animateEasing,step:function(){var s={width:parseInt(i.element.css("width"),10),height:parseInt(i.element.css("height"),10),top:parseInt(i.element.css("top"),10),left:parseInt(i.element.css("left"),10)};n&&n.length&&e(n[0]).css({width:s.width,height:s.height}),i._updateCache(s),i._propagate("resize",t)}})}}),e.ui.plugin.add("resizable","containment",{start:function(){var i,s,n,a,o,r,h,l=e(this).data("ui-resizable"),u=l.options,c=l.element,d=u.containment,p=d instanceof e?d.get(0):/parent/.test(d)?c.parent().get(0):d;p&&(l.containerElement=e(p),/document/.test(d)||d===document?(l.containerOffset={left:0,top:0},l.containerPosition={left:0,top:0},l.parentData={element:e(document),left:0,top:0,width:e(document).width(),height:e(document).height()||document.body.parentNode.scrollHeight}):(i=e(p),s=[],e(["Top","Right","Left","Bottom"]).each(function(e,n){s[e]=t(i.css("padding"+n))}),l.containerOffset=i.offset(),l.containerPosition=i.position(),l.containerSize={height:i.innerHeight()-s[3],width:i.innerWidth()-s[1]},n=l.containerOffset,a=l.containerSize.height,o=l.containerSize.width,r=e.ui.hasScroll(p,"left")?p.scrollWidth:o,h=e.ui.hasScroll(p)?p.scrollHeight:a,l.parentData={element:p,left:n.left,top:n.top,width:r,height:h}))},resize:function(t){var i,s,n,a,o=e(this).data("ui-resizable"),r=o.options,h=o.containerOffset,l=o.position,u=o._aspectRatio||t.shiftKey,c={top:0,left:0},d=o.containerElement;d[0]!==document&&/static/.test(d.css("position"))&&(c=h),l.left<(o._helper?h.left:0)&&(o.size.width=o.size.width+(o._helper?o.position.left-h.left:o.position.left-c.left),u&&(o.size.height=o.size.width/o.aspectRatio),o.position.left=r.helper?h.left:0),l.top<(o._helper?h.top:0)&&(o.size.height=o.size.height+(o._helper?o.position.top-h.top:o.position.top),u&&(o.size.width=o.size.height*o.aspectRatio),o.position.top=o._helper?h.top:0),o.offset.left=o.parentData.left+o.position.left,o.offset.top=o.parentData.top+o.position.top,i=Math.abs((o._helper?o.offset.left-c.left:o.offset.left-c.left)+o.sizeDiff.width),s=Math.abs((o._helper?o.offset.top-c.top:o.offset.top-h.top)+o.sizeDiff.height),n=o.containerElement.get(0)===o.element.parent().get(0),a=/relative|absolute/.test(o.containerElement.css("position")),n&&a&&(i-=o.parentData.left),i+o.size.width>=o.parentData.width&&(o.size.width=o.parentData.width-i,u&&(o.size.height=o.size.width/o.aspectRatio)),s+o.size.height>=o.parentData.height&&(o.size.height=o.parentData.height-s,u&&(o.size.width=o.size.height*o.aspectRatio))},stop:function(){var t=e(this).data("ui-resizable"),i=t.options,s=t.containerOffset,n=t.containerPosition,a=t.containerElement,o=e(t.helper),r=o.offset(),h=o.outerWidth()-t.sizeDiff.width,l=o.outerHeight()-t.sizeDiff.height;t._helper&&!i.animate&&/relative/.test(a.css("position"))&&e(this).css({left:r.left-n.left-s.left,width:h,height:l}),t._helper&&!i.animate&&/static/.test(a.css("position"))&&e(this).css({left:r.left-n.left-s.left,width:h,height:l})}}),e.ui.plugin.add("resizable","alsoResize",{start:function(){var t=e(this).data("ui-resizable"),i=t.options,s=function(t){e(t).each(function(){var t=e(this);t.data("ui-resizable-alsoresize",{width:parseInt(t.width(),10),height:parseInt(t.height(),10),left:parseInt(t.css("left"),10),top:parseInt(t.css("top"),10)})})};"object"!=typeof i.alsoResize||i.alsoResize.parentNode?s(i.alsoResize):i.alsoResize.length?(i.alsoResize=i.alsoResize[0],s(i.alsoResize)):e.each(i.alsoResize,function(e){s(e)})},resize:function(t,i){var s=e(this).data("ui-resizable"),n=s.options,a=s.originalSize,o=s.originalPosition,r={height:s.size.height-a.height||0,width:s.size.width-a.width||0,top:s.position.top-o.top||0,left:s.position.left-o.left||0},h=function(t,s){e(t).each(function(){var t=e(this),n=e(this).data("ui-resizable-alsoresize"),a={},o=s&&s.length?s:t.parents(i.originalElement[0]).length?["width","height"]:["width","height","top","left"];e.each(o,function(e,t){var i=(n[t]||0)+(r[t]||0);i&&i>=0&&(a[t]=i||null)}),t.css(a)})};"object"!=typeof n.alsoResize||n.alsoResize.nodeType?h(n.alsoResize):e.each(n.alsoResize,function(e,t){h(e,t)})},stop:function(){e(this).removeData("resizable-alsoresize")}}),e.ui.plugin.add("resizable","ghost",{start:function(){var t=e(this).data("ui-resizable"),i=t.options,s=t.size;t.ghost=t.originalElement.clone(),t.ghost.css({opacity:.25,display:"block",position:"relative",height:s.height,width:s.width,margin:0,left:0,top:0}).addClass("ui-resizable-ghost").addClass("string"==typeof i.ghost?i.ghost:""),t.ghost.appendTo(t.helper)},resize:function(){var t=e(this).data("ui-resizable");t.ghost&&t.ghost.css({position:"relative",height:t.size.height,width:t.size.width})},stop:function(){var t=e(this).data("ui-resizable");t.ghost&&t.helper&&t.helper.get(0).removeChild(t.ghost.get(0))}}),e.ui.plugin.add("resizable","grid",{resize:function(){var t=e(this).data("ui-resizable"),i=t.options,s=t.size,n=t.originalSize,a=t.originalPosition,o=t.axis,r="number"==typeof i.grid?[i.grid,i.grid]:i.grid,h=r[0]||1,l=r[1]||1,u=Math.round((s.width-n.width)/h)*h,c=Math.round((s.height-n.height)/l)*l,d=n.width+u,p=n.height+c,f=i.maxWidth&&d>i.maxWidth,m=i.maxHeight&&p>i.maxHeight,g=i.minWidth&&i.minWidth>d,v=i.minHeight&&i.minHeight>p;i.grid=r,g&&(d+=h),v&&(p+=l),f&&(d-=h),m&&(p-=l),/^(se|s|e)$/.test(o)?(t.size.width=d,t.size.height=p):/^(ne)$/.test(o)?(t.size.width=d,t.size.height=p,t.position.top=a.top-c):/^(sw)$/.test(o)?(t.size.width=d,t.size.height=p,t.position.left=a.left-u):(t.size.width=d,t.size.height=p,t.position.top=a.top-c,t.position.left=a.left-u)}})})(jQuery);
\ No newline at end of file
diff --git a/vendor/golang.org/x/tools/cmd/present/static/notes.css b/vendor/golang.org/x/tools/cmd/present/static/notes.css
deleted file mode 100644
index 0b44583..0000000
--- a/vendor/golang.org/x/tools/cmd/present/static/notes.css
+++ /dev/null
@@ -1,32 +0,0 @@
-p {
- margin: 10px;
-}
-
-#presenter-slides {
- display: block;
- margin-top: -10px;
- margin-left: -17px;
- position: fixed;
- border: 0;
- width : 146%;
- height: 750px;
-
- transform: scale(0.7, 0.7);
- transform-origin: top left;
- -moz-transform: scale(0.7);
- -moz-transform-origin: top left;
- -o-transform: scale(0.7);
- -o-transform-origin: top left;
- -webkit-transform: scale(0.7);
- -webkit-transform-origin: top left;
-}
-
-#presenter-notes {
- margin-top: -180px;
- font-family: 'Open Sans', Arial, sans-serif;
- height: 30%;
- width: 100%;
- overflow: scroll;
- position: fixed;
- top: 706px;
-}
diff --git a/vendor/golang.org/x/tools/cmd/present/static/notes.js b/vendor/golang.org/x/tools/cmd/present/static/notes.js
deleted file mode 100644
index a19f21e..0000000
--- a/vendor/golang.org/x/tools/cmd/present/static/notes.js
+++ /dev/null
@@ -1,161 +0,0 @@
-// Copyright 2016 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Store child window object which will display slides with notes
-var notesWindow = null;
-
-var isParentWindow = window.parent == window;
-
-// When parent window closes, clear storage and close child window
-if (isParentWindow) {
- window.onbeforeunload = function() {
- localStorage.clear();
- if (notesWindow) notesWindow.close();
- }
-};
-
-function toggleNotesWindow() {
- if (!isParentWindow) return;
- if (notesWindow) {
- notesWindow.close();
- notesWindow = null;
- return;
- }
-
- initNotes();
-};
-
-function initNotes() {
- notesWindow = window.open('', '', 'width=1000,height=700');
- var w = notesWindow;
- var slidesUrl = window.location.href;
-
- var curSlide = parseInt(localStorage.getItem('destSlide'), 10);
- var formattedNotes = '';
- var section = sections[curSlide - 1];
- // curSlide is 0 when initialized from the first page of slides.
- // Check if section is valid before retrieving Notes.
- if (section) {
- formattedNotes = formatNotes(section.Notes);
- } else if (curSlide == 0) {
- formattedNotes = formatNotes(titleNotes);
- }
-
- // Hack to apply css. Requires existing html on notesWindow.
- w.document.write("
");
-
- w.document.title = window.document.title;
-
- var slides = w.document.createElement('iframe');
- slides.id = 'presenter-slides';
- slides.src = slidesUrl;
- w.document.body.appendChild(slides);
- // setTimeout needed for Firefox
- setTimeout(function() {
- slides.focus();
- }, 100);
-
- var notes = w.document.createElement('div');
- notes.id = 'presenter-notes';
- notes.innerHTML = formattedNotes;
- w.document.body.appendChild(notes);
-
- w.document.close();
-
- function addPresenterNotesStyle() {
- var el = w.document.createElement('link');
- el.rel = 'stylesheet';
- el.type = 'text/css';
- el.href = PERMANENT_URL_PREFIX + 'notes.css';
- w.document.body.appendChild(el);
- w.document.querySelector('head').appendChild(el);
- }
-
- addPresenterNotesStyle();
-
- // Add listener on notesWindow to update notes when triggered from
- // parent window
- w.addEventListener('storage', updateNotes, false);
-};
-
-function formatNotes(notes) {
- var formattedNotes = '';
- if (notes) {
- for (var i = 0; i < notes.length; i++) {
- formattedNotes = formattedNotes + '' + notes[i] + '
';
- }
- }
- return formattedNotes;
-};
-
-function updateNotes() {
- // When triggered from parent window, notesWindow is null
- // The storage event listener on notesWindow will update notes
- if (!notesWindow) return;
- var destSlide = parseInt(localStorage.getItem('destSlide'), 10);
- var section = sections[destSlide - 1];
- var el = notesWindow.document.getElementById('presenter-notes');
-
- if (!el) return;
-
- if (section && section.Notes) {
- el.innerHTML = formatNotes(section.Notes);
- } else if (destSlide == 0) {
- el.innerHTML = formatNotes(titleNotes);
- } else {
- el.innerHTML = '';
- }
-};
-
-/* Playground syncing */
-
-// When presenter notes are enabled, playground click handlers are
-// stored here to sync click events on the correct playground
-var playgroundHandlers = {onRun: [], onKill: [], onClose: []};
-
-function updatePlay(e) {
- var i = localStorage.getItem('play-index');
-
- switch (e.key) {
- case 'play-index':
- return;
- case 'play-action':
- // Sync 'run', 'kill', 'close' actions
- var action = localStorage.getItem('play-action');
- playgroundHandlers[action][i](e);
- return;
- case 'play-code':
- // Sync code editing
- var play = document.querySelectorAll('div.playground')[i];
- play.innerHTML = localStorage.getItem('play-code');
- return;
- case 'output-style':
- // Sync resizing of playground output
- var out = document.querySelectorAll('.output')[i];
- out.style = localStorage.getItem('output-style');
- return;
- }
-};
-
-// Reset 'run', 'kill', 'close' storage items when synced
-// so that successive actions can be synced correctly
-function updatePlayStorage(action, index, e) {
- localStorage.setItem('play-index', index);
-
- if (localStorage.getItem('play-action') === action) {
- // We're the receiving window, and the message has been received
- localStorage.removeItem('play-action');
- } else {
- // We're the triggering window, send the message
- localStorage.setItem('play-action', action);
- }
-
- if (action === 'onRun') {
- if (localStorage.getItem('play-shiftKey') === 'true') {
- localStorage.removeItem('play-shiftKey');
- } else if (e.shiftKey) {
- localStorage.setItem('play-shiftKey', e.shiftKey);
- }
- }
-};
diff --git a/vendor/golang.org/x/tools/cmd/present/static/slides.js b/vendor/golang.org/x/tools/cmd/present/static/slides.js
deleted file mode 100644
index df10647..0000000
--- a/vendor/golang.org/x/tools/cmd/present/static/slides.js
+++ /dev/null
@@ -1,612 +0,0 @@
-// Copyright 2012 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-var PERMANENT_URL_PREFIX = '/static/';
-
-var SLIDE_CLASSES = ['far-past', 'past', 'current', 'next', 'far-next'];
-
-var PM_TOUCH_SENSITIVITY = 15;
-
-var curSlide;
-
-/* ---------------------------------------------------------------------- */
-/* classList polyfill by Eli Grey
- * (http://purl.eligrey.com/github/classList.js/blob/master/classList.js) */
-
-if (typeof document !== 'undefined' && !('classList' in document.createElement('a'))) {
-
-(function (view) {
-
-var
- classListProp = 'classList'
- , protoProp = 'prototype'
- , elemCtrProto = (view.HTMLElement || view.Element)[protoProp]
- , objCtr = Object
- strTrim = String[protoProp].trim || function () {
- return this.replace(/^\s+|\s+$/g, '');
- }
- , arrIndexOf = Array[protoProp].indexOf || function (item) {
- for (var i = 0, len = this.length; i < len; i++) {
- if (i in this && this[i] === item) {
- return i;
- }
- }
- return -1;
- }
- // Vendors: please allow content code to instantiate DOMExceptions
- , DOMEx = function (type, message) {
- this.name = type;
- this.code = DOMException[type];
- this.message = message;
- }
- , checkTokenAndGetIndex = function (classList, token) {
- if (token === '') {
- throw new DOMEx(
- 'SYNTAX_ERR'
- , 'An invalid or illegal string was specified'
- );
- }
- if (/\s/.test(token)) {
- throw new DOMEx(
- 'INVALID_CHARACTER_ERR'
- , 'String contains an invalid character'
- );
- }
- return arrIndexOf.call(classList, token);
- }
- , ClassList = function (elem) {
- var
- trimmedClasses = strTrim.call(elem.className)
- , classes = trimmedClasses ? trimmedClasses.split(/\s+/) : []
- ;
- for (var i = 0, len = classes.length; i < len; i++) {
- this.push(classes[i]);
- }
- this._updateClassName = function () {
- elem.className = this.toString();
- };
- }
- , classListProto = ClassList[protoProp] = []
- , classListGetter = function () {
- return new ClassList(this);
- }
-;
-// Most DOMException implementations don't allow calling DOMException's toString()
-// on non-DOMExceptions. Error's toString() is sufficient here.
-DOMEx[protoProp] = Error[protoProp];
-classListProto.item = function (i) {
- return this[i] || null;
-};
-classListProto.contains = function (token) {
- token += '';
- return checkTokenAndGetIndex(this, token) !== -1;
-};
-classListProto.add = function (token) {
- token += '';
- if (checkTokenAndGetIndex(this, token) === -1) {
- this.push(token);
- this._updateClassName();
- }
-};
-classListProto.remove = function (token) {
- token += '';
- var index = checkTokenAndGetIndex(this, token);
- if (index !== -1) {
- this.splice(index, 1);
- this._updateClassName();
- }
-};
-classListProto.toggle = function (token) {
- token += '';
- if (checkTokenAndGetIndex(this, token) === -1) {
- this.add(token);
- } else {
- this.remove(token);
- }
-};
-classListProto.toString = function () {
- return this.join(' ');
-};
-
-if (objCtr.defineProperty) {
- var classListPropDesc = {
- get: classListGetter
- , enumerable: true
- , configurable: true
- };
- try {
- objCtr.defineProperty(elemCtrProto, classListProp, classListPropDesc);
- } catch (ex) { // IE 8 doesn't support enumerable:true
- if (ex.number === -0x7FF5EC54) {
- classListPropDesc.enumerable = false;
- objCtr.defineProperty(elemCtrProto, classListProp, classListPropDesc);
- }
- }
-} else if (objCtr[protoProp].__defineGetter__) {
- elemCtrProto.__defineGetter__(classListProp, classListGetter);
-}
-
-}(self));
-
-}
-/* ---------------------------------------------------------------------- */
-
-/* Slide movement */
-
-function hideHelpText() {
- document.getElementById('help').style.display = 'none';
-};
-
-function getSlideEl(no) {
- if ((no < 0) || (no >= slideEls.length)) {
- return null;
- } else {
- return slideEls[no];
- }
-};
-
-function updateSlideClass(slideNo, className) {
- var el = getSlideEl(slideNo);
-
- if (!el) {
- return;
- }
-
- if (className) {
- el.classList.add(className);
- }
-
- for (var i in SLIDE_CLASSES) {
- if (className != SLIDE_CLASSES[i]) {
- el.classList.remove(SLIDE_CLASSES[i]);
- }
- }
-};
-
-function updateSlides() {
- if (window.trackPageview) window.trackPageview();
-
- for (var i = 0; i < slideEls.length; i++) {
- switch (i) {
- case curSlide - 2:
- updateSlideClass(i, 'far-past');
- break;
- case curSlide - 1:
- updateSlideClass(i, 'past');
- break;
- case curSlide:
- updateSlideClass(i, 'current');
- break;
- case curSlide + 1:
- updateSlideClass(i, 'next');
- break;
- case curSlide + 2:
- updateSlideClass(i, 'far-next');
- break;
- default:
- updateSlideClass(i);
- break;
- }
- }
-
- triggerLeaveEvent(curSlide - 1);
- triggerEnterEvent(curSlide);
-
- window.setTimeout(function() {
- // Hide after the slide
- disableSlideFrames(curSlide - 2);
- }, 301);
-
- enableSlideFrames(curSlide - 1);
- enableSlideFrames(curSlide + 2);
-
- updateHash();
-};
-
-function prevSlide() {
- hideHelpText();
- if (curSlide > 0) {
- curSlide--;
-
- updateSlides();
- }
-
- if (notesEnabled) localStorage.setItem('destSlide', curSlide);
-};
-
-function nextSlide() {
- hideHelpText();
- if (curSlide < slideEls.length - 1) {
- curSlide++;
-
- updateSlides();
- }
-
- if (notesEnabled) localStorage.setItem('destSlide', curSlide);
-};
-
-/* Slide events */
-
-function triggerEnterEvent(no) {
- var el = getSlideEl(no);
- if (!el) {
- return;
- }
-
- var onEnter = el.getAttribute('onslideenter');
- if (onEnter) {
- new Function(onEnter).call(el);
- }
-
- var evt = document.createEvent('Event');
- evt.initEvent('slideenter', true, true);
- evt.slideNumber = no + 1; // Make it readable
-
- el.dispatchEvent(evt);
-};
-
-function triggerLeaveEvent(no) {
- var el = getSlideEl(no);
- if (!el) {
- return;
- }
-
- var onLeave = el.getAttribute('onslideleave');
- if (onLeave) {
- new Function(onLeave).call(el);
- }
-
- var evt = document.createEvent('Event');
- evt.initEvent('slideleave', true, true);
- evt.slideNumber = no + 1; // Make it readable
-
- el.dispatchEvent(evt);
-};
-
-/* Touch events */
-
-function handleTouchStart(event) {
- if (event.touches.length == 1) {
- touchDX = 0;
- touchDY = 0;
-
- touchStartX = event.touches[0].pageX;
- touchStartY = event.touches[0].pageY;
-
- document.body.addEventListener('touchmove', handleTouchMove, true);
- document.body.addEventListener('touchend', handleTouchEnd, true);
- }
-};
-
-function handleTouchMove(event) {
- if (event.touches.length > 1) {
- cancelTouch();
- } else {
- touchDX = event.touches[0].pageX - touchStartX;
- touchDY = event.touches[0].pageY - touchStartY;
- event.preventDefault();
- }
-};
-
-function handleTouchEnd(event) {
- var dx = Math.abs(touchDX);
- var dy = Math.abs(touchDY);
-
- if ((dx > PM_TOUCH_SENSITIVITY) && (dy < (dx * 2 / 3))) {
- if (touchDX > 0) {
- prevSlide();
- } else {
- nextSlide();
- }
- }
-
- cancelTouch();
-};
-
-function cancelTouch() {
- document.body.removeEventListener('touchmove', handleTouchMove, true);
- document.body.removeEventListener('touchend', handleTouchEnd, true);
-};
-
-/* Preloading frames */
-
-function disableSlideFrames(no) {
- var el = getSlideEl(no);
- if (!el) {
- return;
- }
-
- var frames = el.getElementsByTagName('iframe');
- for (var i = 0, frame; frame = frames[i]; i++) {
- disableFrame(frame);
- }
-};
-
-function enableSlideFrames(no) {
- var el = getSlideEl(no);
- if (!el) {
- return;
- }
-
- var frames = el.getElementsByTagName('iframe');
- for (var i = 0, frame; frame = frames[i]; i++) {
- enableFrame(frame);
- }
-};
-
-function disableFrame(frame) {
- frame.src = 'about:blank';
-};
-
-function enableFrame(frame) {
- var src = frame._src;
-
- if (frame.src != src && src != 'about:blank') {
- frame.src = src;
- }
-};
-
-function setupFrames() {
- var frames = document.querySelectorAll('iframe');
- for (var i = 0, frame; frame = frames[i]; i++) {
- frame._src = frame.src;
- disableFrame(frame);
- }
-
- enableSlideFrames(curSlide);
- enableSlideFrames(curSlide + 1);
- enableSlideFrames(curSlide + 2);
-};
-
-function setupInteraction() {
- /* Clicking and tapping */
-
- var el = document.createElement('div');
- el.className = 'slide-area';
- el.id = 'prev-slide-area';
- el.addEventListener('click', prevSlide, false);
- document.querySelector('section.slides').appendChild(el);
-
- var el = document.createElement('div');
- el.className = 'slide-area';
- el.id = 'next-slide-area';
- el.addEventListener('click', nextSlide, false);
- document.querySelector('section.slides').appendChild(el);
-
- /* Swiping */
-
- document.body.addEventListener('touchstart', handleTouchStart, false);
-}
-
-/* Hash functions */
-
-function getCurSlideFromHash() {
- var slideNo = parseInt(location.hash.substr(1));
-
- if (slideNo) {
- curSlide = slideNo - 1;
- } else {
- curSlide = 0;
- }
-};
-
-function updateHash() {
- location.replace('#' + (curSlide + 1));
-};
-
-/* Event listeners */
-
-function handleBodyKeyDown(event) {
- // If we're in a code element, only handle pgup/down.
- var inCode = event.target.classList.contains('code');
-
- switch (event.keyCode) {
- case 78: // 'N' opens presenter notes window
- if (!inCode && notesEnabled) toggleNotesWindow();
- break;
- case 72: // 'H' hides the help text
- case 27: // escape key
- if (!inCode) hideHelpText();
- break;
-
- case 39: // right arrow
- case 13: // Enter
- case 32: // space
- if (inCode) break;
- case 34: // PgDn
- nextSlide();
- event.preventDefault();
- break;
-
- case 37: // left arrow
- case 8: // Backspace
- if (inCode) break;
- case 33: // PgUp
- prevSlide();
- event.preventDefault();
- break;
-
- case 40: // down arrow
- if (inCode) break;
- nextSlide();
- event.preventDefault();
- break;
-
- case 38: // up arrow
- if (inCode) break;
- prevSlide();
- event.preventDefault();
- break;
- }
-};
-
-function scaleSmallViewports() {
- var el = document.querySelector('.slides');
- var transform = '';
- var sWidthPx = 1250;
- var sHeightPx = 750;
- var sAspectRatio = sWidthPx / sHeightPx;
- var wAspectRatio = window.innerWidth / window.innerHeight;
-
- if (wAspectRatio <= sAspectRatio && window.innerWidth < sWidthPx) {
- transform = 'scale(' + window.innerWidth / sWidthPx + ')';
- } else if (window.innerHeight < sHeightPx) {
- transform = 'scale(' + window.innerHeight / sHeightPx + ')';
- }
- el.style.transform = transform;
-}
-
-function addEventListeners() {
- document.addEventListener('keydown', handleBodyKeyDown, false);
- var resizeTimeout;
- window.addEventListener('resize', function() {
- // throttle resize events
- window.clearTimeout(resizeTimeout);
- resizeTimeout = window.setTimeout(function() {
- resizeTimeout = null;
- scaleSmallViewports();
- }, 50);
- });
-}
-
-/* Initialization */
-
-function addFontStyle() {
- var el = document.createElement('link');
- el.rel = 'stylesheet';
- el.type = 'text/css';
- el.href = '//fonts.googleapis.com/css?family=' +
- 'Open+Sans:regular,semibold,italic,italicsemibold|Droid+Sans+Mono';
-
- document.body.appendChild(el);
-};
-
-function addGeneralStyle() {
- var el = document.createElement('link');
- el.rel = 'stylesheet';
- el.type = 'text/css';
- el.href = PERMANENT_URL_PREFIX + 'styles.css';
- document.body.appendChild(el);
-
- var el = document.createElement('meta');
- el.name = 'viewport';
- el.content = 'width=device-width,height=device-height,initial-scale=1';
- document.querySelector('head').appendChild(el);
-
- var el = document.createElement('meta');
- el.name = 'apple-mobile-web-app-capable';
- el.content = 'yes';
- document.querySelector('head').appendChild(el);
-
- scaleSmallViewports();
-};
-
-function handleDomLoaded() {
- slideEls = document.querySelectorAll('section.slides > article');
-
- setupFrames();
-
- addFontStyle();
- addGeneralStyle();
- addEventListeners();
-
- updateSlides();
-
- setupInteraction();
-
- if (window.location.hostname == 'localhost' || window.location.hostname == '127.0.0.1' || window.location.hostname == '::1') {
- hideHelpText();
- }
-
- document.body.classList.add('loaded');
-
- setupNotesSync();
-};
-
-function initialize() {
- getCurSlideFromHash();
-
- if (window['_DEBUG']) {
- PERMANENT_URL_PREFIX = '../';
- }
-
- if (window['_DCL']) {
- handleDomLoaded();
- } else {
- document.addEventListener('DOMContentLoaded', handleDomLoaded, false);
- }
-}
-
-// If ?debug exists then load the script relative instead of absolute
-if (!window['_DEBUG'] && document.location.href.indexOf('?debug') !== -1) {
- document.addEventListener('DOMContentLoaded', function() {
- // Avoid missing the DomContentLoaded event
- window['_DCL'] = true
- }, false);
-
- window['_DEBUG'] = true;
- var script = document.createElement('script');
- script.type = 'text/javascript';
- script.src = '../slides.js';
- var s = document.getElementsByTagName('script')[0];
- s.parentNode.insertBefore(script, s);
-
- // Remove this script
- s.parentNode.removeChild(s);
-} else {
- initialize();
-}
-
-/* Synchronize windows when notes are enabled */
-
-function setupNotesSync() {
- if (!notesEnabled) return;
-
- function setupPlayResizeSync() {
- var out = document.getElementsByClassName('output');
- for (var i = 0; i < out.length; i++) {
- $(out[i]).bind('resize', function(event) {
- if ($(event.target).hasClass('ui-resizable')) {
- localStorage.setItem('play-index', i);
- localStorage.setItem('output-style', out[i].style.cssText);
- }
- })
- }
- };
- function setupPlayCodeSync() {
- var play = document.querySelectorAll('div.playground');
- for (var i = 0; i < play.length; i++) {
- play[i].addEventListener('input', inputHandler, false);
-
- function inputHandler(e) {
- localStorage.setItem('play-index', i);
- localStorage.setItem('play-code', e.target.innerHTML);
- }
- }
- };
-
- setupPlayCodeSync();
- setupPlayResizeSync();
- localStorage.setItem('destSlide', curSlide);
- window.addEventListener('storage', updateOtherWindow, false);
-}
-
-// An update to local storage is caught only by the other window
-// The triggering window does not handle any sync actions
-function updateOtherWindow(e) {
- // Ignore remove storage events which are not meant to update the other window
- var isRemoveStorageEvent = !e.newValue;
- if (isRemoveStorageEvent) return;
-
- var destSlide = localStorage.getItem('destSlide');
- while (destSlide > curSlide) {
- nextSlide();
- }
- while (destSlide < curSlide) {
- prevSlide();
- }
-
- updatePlay(e);
- updateNotes();
-}
diff --git a/vendor/golang.org/x/tools/cmd/present/static/styles.css b/vendor/golang.org/x/tools/cmd/present/static/styles.css
deleted file mode 100644
index 2d8d354..0000000
--- a/vendor/golang.org/x/tools/cmd/present/static/styles.css
+++ /dev/null
@@ -1,534 +0,0 @@
-@media screen {
- /* Framework */
- html {
- height: 100%;
- }
-
- body {
- margin: 0;
- padding: 0;
-
- display: block !important;
-
- height: 100%;
- height: 100vh;
-
- overflow: hidden;
-
- background: rgb(215, 215, 215);
- background: -o-radial-gradient(rgb(240, 240, 240), rgb(190, 190, 190));
- background: -moz-radial-gradient(rgb(240, 240, 240), rgb(190, 190, 190));
- background: -webkit-radial-gradient(rgb(240, 240, 240), rgb(190, 190, 190));
- background: -webkit-gradient(radial, 50% 50%, 0, 50% 50%, 500, from(rgb(240, 240, 240)), to(rgb(190, 190, 190)));
-
- -webkit-font-smoothing: antialiased;
- }
-
- .slides {
- width: 100%;
- height: 100%;
- left: 0;
- top: 0;
-
- position: absolute;
-
- -webkit-transform: translate3d(0, 0, 0);
- }
-
- .slides > article {
- display: block;
-
- position: absolute;
- overflow: hidden;
-
- width: 900px;
- height: 700px;
-
- left: 50%;
- top: 50%;
-
- margin-left: -450px;
- margin-top: -350px;
-
- padding: 40px 60px;
-
- box-sizing: border-box;
- -o-box-sizing: border-box;
- -moz-box-sizing: border-box;
- -webkit-box-sizing: border-box;
-
- border-radius: 10px;
- -o-border-radius: 10px;
- -moz-border-radius: 10px;
- -webkit-border-radius: 10px;
-
- background-color: white;
-
- border: 1px solid rgba(0, 0, 0, .3);
-
- transition: transform .3s ease-out;
- -o-transition: -o-transform .3s ease-out;
- -moz-transition: -moz-transform .3s ease-out;
- -webkit-transition: -webkit-transform .3s ease-out;
- }
- .slides.layout-widescreen > article {
- margin-left: -550px;
- width: 1100px;
- }
- .slides.layout-faux-widescreen > article {
- margin-left: -550px;
- width: 1100px;
-
- padding: 40px 160px;
- }
-
- .slides.layout-widescreen > article:not(.nobackground):not(.biglogo),
- .slides.layout-faux-widescreen > article:not(.nobackground):not(.biglogo) {
- background-position-x: 0, 840px;
- }
-
- /* Clickable/tappable areas */
-
- .slide-area {
- z-index: 1000;
-
- position: absolute;
- left: 0;
- top: 0;
- width: 150px;
- height: 700px;
-
- left: 50%;
- top: 50%;
-
- cursor: pointer;
- margin-top: -350px;
-
- tap-highlight-color: transparent;
- -o-tap-highlight-color: transparent;
- -moz-tap-highlight-color: transparent;
- -webkit-tap-highlight-color: transparent;
- }
- #prev-slide-area {
- margin-left: -550px;
- }
- #next-slide-area {
- margin-left: 400px;
- }
- .slides.layout-widescreen #prev-slide-area,
- .slides.layout-faux-widescreen #prev-slide-area {
- margin-left: -650px;
- }
- .slides.layout-widescreen #next-slide-area,
- .slides.layout-faux-widescreen #next-slide-area {
- margin-left: 500px;
- }
-
- /* Slides */
-
- .slides > article {
- display: none;
- }
- .slides > article.far-past {
- display: block;
- transform: translate(-2040px);
- -o-transform: translate(-2040px);
- -moz-transform: translate(-2040px);
- -webkit-transform: translate3d(-2040px, 0, 0);
- }
- .slides > article.past {
- display: block;
- transform: translate(-1020px);
- -o-transform: translate(-1020px);
- -moz-transform: translate(-1020px);
- -webkit-transform: translate3d(-1020px, 0, 0);
- }
- .slides > article.current {
- display: block;
- transform: translate(0);
- -o-transform: translate(0);
- -moz-transform: translate(0);
- -webkit-transform: translate3d(0, 0, 0);
- }
- .slides > article.next {
- display: block;
- transform: translate(1020px);
- -o-transform: translate(1020px);
- -moz-transform: translate(1020px);
- -webkit-transform: translate3d(1020px, 0, 0);
- }
- .slides > article.far-next {
- display: block;
- transform: translate(2040px);
- -o-transform: translate(2040px);
- -moz-transform: translate(2040px);
- -webkit-transform: translate3d(2040px, 0, 0);
- }
-
- .slides.layout-widescreen > article.far-past,
- .slides.layout-faux-widescreen > article.far-past {
- display: block;
- transform: translate(-2260px);
- -o-transform: translate(-2260px);
- -moz-transform: translate(-2260px);
- -webkit-transform: translate3d(-2260px, 0, 0);
- }
- .slides.layout-widescreen > article.past,
- .slides.layout-faux-widescreen > article.past {
- display: block;
- transform: translate(-1130px);
- -o-transform: translate(-1130px);
- -moz-transform: translate(-1130px);
- -webkit-transform: translate3d(-1130px, 0, 0);
- }
- .slides.layout-widescreen > article.current,
- .slides.layout-faux-widescreen > article.current {
- display: block;
- transform: translate(0);
- -o-transform: translate(0);
- -moz-transform: translate(0);
- -webkit-transform: translate3d(0, 0, 0);
- }
- .slides.layout-widescreen > article.next,
- .slides.layout-faux-widescreen > article.next {
- display: block;
- transform: translate(1130px);
- -o-transform: translate(1130px);
- -moz-transform: translate(1130px);
- -webkit-transform: translate3d(1130px, 0, 0);
- }
- .slides.layout-widescreen > article.far-next,
- .slides.layout-faux-widescreen > article.far-next {
- display: block;
- transform: translate(2260px);
- -o-transform: translate(2260px);
- -moz-transform: translate(2260px);
- -webkit-transform: translate3d(2260px, 0, 0);
- }
-}
-
-@media print {
- /* Set page layout */
- @page {
- size: A4 landscape;
- }
-
- body {
- display: block !important;
- }
-
- .slides > article {
- display: block;
-
- position: relative;
-
- page-break-inside: never;
- page-break-after: always;
-
- overflow: hidden;
- }
-
- h2 {
- position: static !important;
- margin-top: 400px !important;
- margin-bottom: 100px !important;
- }
-
- div.code {
- background: rgb(240, 240, 240);
- }
-
- /* Add explicit links */
- a:link:after, a:visited:after {
- content: " (" attr(href) ") ";
- font-size: 50%;
- }
-
- #help {
- display: none;
- visibility: hidden;
- }
-}
-
-/* Styles for slides */
-
-.slides > article {
- font-family: 'Open Sans', Arial, sans-serif;
-
- color: black;
- text-shadow: 0 1px 1px rgba(0, 0, 0, .1);
-
- font-size: 26px;
- line-height: 36px;
-
- letter-spacing: -1px;
-}
-
-b {
- font-weight: 600;
-}
-
-a {
- color: rgb(0, 102, 204);
- text-decoration: none;
-}
-a:visited {
- color: rgba(0, 102, 204, .75);
-}
-a:hover {
- color: black;
-}
-
-p {
- margin: 0;
- padding: 0;
-
- margin-top: 20px;
-}
-p:first-child {
- margin-top: 0;
-}
-
-h1 {
- font-size: 60px;
- line-height: 60px;
-
- padding: 0;
- margin: 0;
- margin-top: 200px;
- margin-bottom: 5px;
- padding-right: 40px;
-
- font-weight: 600;
-
- letter-spacing: -3px;
-
- color: rgb(51, 51, 51);
-}
-
-h2 {
- font-size: 45px;
- line-height: 45px;
-
- position: absolute;
- bottom: 150px;
-
- padding: 0;
- margin: 0;
- padding-right: 40px;
-
- font-weight: 600;
-
- letter-spacing: -2px;
-
- color: rgb(51, 51, 51);
-}
-
-h3 {
- font-size: 30px;
- line-height: 36px;
-
- padding: 0;
- margin: 0;
- padding-right: 40px;
-
- font-weight: 600;
-
- letter-spacing: -1px;
-
- color: rgb(51, 51, 51);
-}
-
-ul {
- margin: 0;
- padding: 0;
- margin-top: 20px;
- margin-left: 1.5em;
-}
-li {
- padding: 0;
- margin: 0 0 .5em 0;
-}
-
-div.code {
- padding: 5px 10px;
- margin-top: 20px;
- margin-bottom: 20px;
- overflow: hidden;
-
- background: rgb(240, 240, 240);
- border: 1px solid rgb(224, 224, 224);
-}
-pre {
- margin: 0;
- padding: 0;
-
- font-family: 'Droid Sans Mono', 'Courier New', monospace;
- font-size: 18px;
- line-height: 24px;
- letter-spacing: -1px;
-
- color: black;
-}
-
-pre.numbers span:before {
- content: attr(num);
- margin-right: 1em;
- display: inline-block;
-}
-
-code {
- font-size: 95%;
- font-family: 'Droid Sans Mono', 'Courier New', monospace;
-
- color: black;
-}
-
-article > .image,
-article > .video {
- text-align: center;
- margin-top: 40px;
-}
-
-article.background {
- background-size: contain;
- background-repeat: round;
-}
-
-table {
- width: 100%;
- border-collapse: collapse;
- margin-top: 40px;
-}
-th {
- font-weight: 600;
- text-align: left;
-}
-td,
-th {
- border: 1px solid rgb(224, 224, 224);
- padding: 5px 10px;
- vertical-align: top;
-}
-
-p.link {
- margin-left: 20px;
-}
-
-/* Code */
-div.code {
- outline: 0px solid transparent;
-}
-div.playground {
- position: relative;
-}
-div.output {
- position: absolute;
- left: 50%;
- top: 50%;
- right: 40px;
- bottom: 40px;
- background: #202020;
- padding: 5px 10px;
- z-index: 2;
-
- border-radius: 10px;
- -o-border-radius: 10px;
- -moz-border-radius: 10px;
- -webkit-border-radius: 10px;
-
-}
-div.output pre {
- margin: 0;
- padding: 0;
- background: none;
- border: none;
- width: 100%;
- height: 100%;
- overflow: auto;
-}
-div.output .stdout, div.output pre {
- color: #e6e6e6;
-}
-div.output .stderr, div.output .error {
- color: rgb(255, 200, 200);
-}
-div.output .system, div.output .exit {
- color: rgb(255, 230, 120)
-}
-.buttons {
- position: relative;
- float: right;
- top: -60px;
- right: 10px;
-}
-div.output .buttons {
- position: absolute;
- float: none;
- top: auto;
- right: 5px;
- bottom: 5px;
-}
-
-/* Presenter details */
-.presenter {
- margin-top: 20px;
-}
-.presenter p,
-.presenter .link {
- margin: 0;
- font-size: 28px;
- line-height: 1.2em;
-}
-
-/* Output resize details */
-.ui-resizable-handle {
- position: absolute;
-}
-.ui-resizable-n {
- cursor: n-resize;
- height: 7px;
- width: 100%;
- top: -5px;
- left: 0;
-}
-.ui-resizable-w {
- cursor: w-resize;
- width: 7px;
- left: -5px;
- top: 0;
- height: 100%;
-}
-.ui-resizable-nw {
- cursor: nw-resize;
- width: 9px;
- height: 9px;
- left: -5px;
- top: -5px;
-}
-iframe {
- border: none;
-}
-figcaption {
- color: #666;
- text-align: center;
- font-size: 0.75em;
-}
-
-#help {
- font-family: 'Open Sans', Arial, sans-serif;
- text-align: center;
- color: white;
- background: #000;
- opacity: 0.5;
- position: fixed;
- bottom: 25px;
- left: 50px;
- right: 50px;
- padding: 20px;
-
- border-radius: 10px;
- -o-border-radius: 10px;
- -moz-border-radius: 10px;
- -webkit-border-radius: 10px;
-}
diff --git a/vendor/golang.org/x/tools/cmd/present/templates/action.tmpl b/vendor/golang.org/x/tools/cmd/present/templates/action.tmpl
deleted file mode 100644
index 8bde042..0000000
--- a/vendor/golang.org/x/tools/cmd/present/templates/action.tmpl
+++ /dev/null
@@ -1,62 +0,0 @@
-{/*
-This is the action template.
-It determines how the formatting actions are rendered.
-*/}
-
-{{define "section"}}
- {{.FormattedNumber}} {{.Title}}
- {{range .Elem}}{{elem $.Template .}}{{end}}
-{{end}}
-
-{{define "list"}}
-
- {{range .Bullet}}
- {{style .}}
- {{end}}
-
-{{end}}
-
-{{define "text"}}
- {{if .Pre}}
- {{range .Lines}}{{.}}{{end}}
- {{else}}
-
- {{range $i, $l := .Lines}}{{if $i}}{{template "newline"}}
- {{end}}{{style $l}}{{end}}
-
- {{end}}
-{{end}}
-
-{{define "code"}}
- {{.Text}}
-{{end}}
-
-{{define "image"}}
-
-
-
-{{end}}
-
-{{define "video"}}
-
-
-
-
-
-{{end}}
-
-{{define "background"}}
-
-
-
-{{end}}
-
-{{define "iframe"}}
-
-{{end}}
-
-{{define "link"}}{{style .Label}}
{{end}}
-
-{{define "html"}}{{.HTML}}{{end}}
-
-{{define "caption"}}{{style .Text}} {{end}}
diff --git a/vendor/golang.org/x/tools/cmd/present/templates/article.tmpl b/vendor/golang.org/x/tools/cmd/present/templates/article.tmpl
deleted file mode 100644
index 0a223c6..0000000
--- a/vendor/golang.org/x/tools/cmd/present/templates/article.tmpl
+++ /dev/null
@@ -1,98 +0,0 @@
-{/* This is the article template. It defines how articles are formatted. */}
-
-{{define "root"}}
-
-
-
- {{.Title}}
-
-
-
-
-
-
-
-
-
{{.Title}}
- {{with .Subtitle}}{{.}}{{end}}
- {{if .Authors}}
- {{range .Authors}}
-
- {{range .Elem}}{{elem $.Template .}}{{end}}
-
- {{end}}
- {{end}}
-
-
-
-
-
- {{with .Sections}}
-
-
Contents
- {{template "TOC" .}}
-
- {{end}}
-
- {{range .Sections}}
- {{elem $.Template .}}
- {{end}}{{/* of Section block */}}
-
-
-
-
- {{if .PlayEnabled}}
-
- {{end}}
-
-
-
-
-{{end}}
-
-{{define "TOC"}}
-
- {{range .}}
- {{.Title}}
- {{with .Sections}}{{template "TOC-Inner" .}}{{end}}
- {{end}}
-
-{{end}}
-
-{{define "TOC-Inner"}}
-
- {{range .}}
- {{.Title}}
- {{with .Sections}}{{template "TOC-Inner" .}}{{end}}
- {{end}}
-
-{{end}}
-
-{{define "newline"}}
-{{/* No automatic line break. Paragraphs are free-form. */}}
-{{end}}
diff --git a/vendor/golang.org/x/tools/cmd/present/templates/dir.tmpl b/vendor/golang.org/x/tools/cmd/present/templates/dir.tmpl
deleted file mode 100644
index 1732623..0000000
--- a/vendor/golang.org/x/tools/cmd/present/templates/dir.tmpl
+++ /dev/null
@@ -1,108 +0,0 @@
-
-
-
-
- Talks - The Go Programming Language
-
-
-
-
-
-
-
-
-
-
-
Go talks
-
- {{with .Path}}
{{.}} {{end}}
-
- {{with .Articles}}
-
Articles:
-
- {{range .}}
- {{.Name}} : {{.Title}}
- {{end}}
-
- {{end}}
-
- {{with .Slides}}
-
Slide decks:
-
- {{range .}}
- {{.Name}} : {{.Title}}
- {{end}}
-
- {{end}}
-
- {{with .Other}}
-
Files:
-
- {{range .}}
- {{.Name}}
- {{end}}
-
- {{end}}
-
- {{with .Dirs}}
-
Sub-directories:
-
- {{range .}}
- {{.Name}}
- {{end}}
-
- {{end}}
-
-
-
-
-
-
-
-
diff --git a/vendor/golang.org/x/tools/cmd/present/templates/slides.tmpl b/vendor/golang.org/x/tools/cmd/present/templates/slides.tmpl
deleted file mode 100644
index 3748400..0000000
--- a/vendor/golang.org/x/tools/cmd/present/templates/slides.tmpl
+++ /dev/null
@@ -1,106 +0,0 @@
-{/* This is the slide template. It defines how presentations are formatted. */}
-
-{{define "root"}}
-
-
-
- {{.Title}}
-
-
-
-
- {{if .NotesEnabled}}
-
-
- {{end}}
-
-
-
-
-
-
-
-
-
- {{.Title}}
- {{with .Subtitle}}{{.}} {{end}}
- {{if not .Time.IsZero}}{{.Time.Format "2 January 2006"}} {{end}}
- {{range .Authors}}
-
- {{range .TextElem}}{{elem $.Template .}}{{end}}
-
- {{end}}
-
-
- {{range $i, $s := .Sections}}
-
-
- {{if $s.Elem}}
- {{$s.Title}}
- {{range $s.Elem}}{{elem $.Template .}}{{end}}
- {{else}}
- {{$s.Title}}
- {{end}}
-
-
- {{end}}{{/* of Slide block */}}
-
-
- Thank you
- {{range .Authors}}
-
- {{range .Elem}}{{elem $.Template .}}{{end}}
-
- {{end}}
-
-
-
-
-
- Use the left and right arrow keys or click the left and right
- edges of the page to navigate between slides.
- (Press 'H' or navigate to hide this message.)
-
-
- {{if .PlayEnabled}}
-
- {{end}}
-
-
-
-
-{{end}}
-
-{{define "newline"}}
-
-{{end}}
diff --git a/vendor/golang.org/x/tools/cmd/ssadump/main.go b/vendor/golang.org/x/tools/cmd/ssadump/main.go
deleted file mode 100644
index 8c4dbd1..0000000
--- a/vendor/golang.org/x/tools/cmd/ssadump/main.go
+++ /dev/null
@@ -1,180 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// ssadump: a tool for displaying and interpreting the SSA form of Go programs.
-package main // import "golang.org/x/tools/cmd/ssadump"
-
-import (
- "flag"
- "fmt"
- "go/build"
- "go/types"
- "os"
- "runtime"
- "runtime/pprof"
-
- "golang.org/x/tools/go/buildutil"
- "golang.org/x/tools/go/loader"
- "golang.org/x/tools/go/ssa"
- "golang.org/x/tools/go/ssa/interp"
- "golang.org/x/tools/go/ssa/ssautil"
-)
-
-// flags
-var (
- mode = ssa.BuilderMode(0)
-
- testFlag = flag.Bool("test", false, "Loads test code (*_test.go) for imported packages.")
-
- runFlag = flag.Bool("run", false, "Invokes the SSA interpreter on the program.")
-
- interpFlag = flag.String("interp", "", `Options controlling the SSA test interpreter.
-The value is a sequence of zero or more more of these letters:
-R disable [R]ecover() from panic; show interpreter crash instead.
-T [T]race execution of the program. Best for single-threaded programs!
-`)
-
- cpuprofile = flag.String("cpuprofile", "", "write cpu profile to file")
-)
-
-func init() {
- flag.Var(&mode, "build", ssa.BuilderModeDoc)
- flag.Var((*buildutil.TagsFlag)(&build.Default.BuildTags), "tags", buildutil.TagsFlagDoc)
-}
-
-const usage = `SSA builder and interpreter.
-Usage: ssadump [ ...] ...
-Use -help flag to display options.
-
-Examples:
-% ssadump -build=F hello.go # dump SSA form of a single package
-% ssadump -build=F -test fmt # dump SSA form of a package and its tests
-% ssadump -run -interp=T hello.go # interpret a program, with tracing
-` + loader.FromArgsUsage +
- `
-The -run flag causes ssadump to run the first package named main.
-
-Interpretation of the standard "testing" package is no longer supported.
-`
-
-func main() {
- if err := doMain(); err != nil {
- fmt.Fprintf(os.Stderr, "ssadump: %s\n", err)
- os.Exit(1)
- }
-}
-
-func doMain() error {
- flag.Parse()
- args := flag.Args()
-
- conf := loader.Config{Build: &build.Default}
-
- // Choose types.Sizes from conf.Build.
- var wordSize int64 = 8
- switch conf.Build.GOARCH {
- case "386", "arm":
- wordSize = 4
- }
- conf.TypeChecker.Sizes = &types.StdSizes{
- MaxAlign: 8,
- WordSize: wordSize,
- }
-
- var interpMode interp.Mode
- for _, c := range *interpFlag {
- switch c {
- case 'T':
- interpMode |= interp.EnableTracing
- case 'R':
- interpMode |= interp.DisableRecover
- default:
- return fmt.Errorf("unknown -interp option: '%c'", c)
- }
- }
-
- if len(args) == 0 {
- fmt.Fprint(os.Stderr, usage)
- os.Exit(1)
- }
-
- // Profiling support.
- if *cpuprofile != "" {
- f, err := os.Create(*cpuprofile)
- if err != nil {
- fmt.Fprintln(os.Stderr, err)
- os.Exit(1)
- }
- pprof.StartCPUProfile(f)
- defer pprof.StopCPUProfile()
- }
-
- // Use the initial packages from the command line.
- args, err := conf.FromArgs(args, *testFlag)
- if err != nil {
- return err
- }
-
- // The interpreter needs the runtime package.
- if *runFlag {
- conf.Import("runtime")
- }
-
- // Load, parse and type-check the whole program.
- lprog, err := conf.Load()
- if err != nil {
- return err
- }
-
- // Create and build SSA-form program representation.
- prog := ssautil.CreateProgram(lprog, mode)
-
- // Build and display only the initial packages
- // (and synthetic wrappers), unless -run is specified.
- var initpkgs []*ssa.Package
- for _, info := range lprog.InitialPackages() {
- ssapkg := prog.Package(info.Pkg)
- ssapkg.Build()
- if info.Pkg.Path() != "runtime" {
- initpkgs = append(initpkgs, ssapkg)
- }
- }
-
- // Run the interpreter.
- if *runFlag {
- prog.Build()
-
- var mains []*ssa.Package
- if *testFlag {
- // If -test, run the tests.
- for _, pkg := range initpkgs {
- if main := prog.CreateTestMainPackage(pkg); main != nil {
- mains = append(mains, main)
- }
- }
- if mains == nil {
- return fmt.Errorf("no tests")
- }
- } else {
- // Otherwise, run the main packages.
- mains = ssautil.MainPackages(initpkgs)
- if len(mains) == 0 {
- return fmt.Errorf("no main package")
- }
- }
-
- if runtime.GOARCH != build.Default.GOARCH {
- return fmt.Errorf("cross-interpretation is not supported (target has GOARCH %s, interpreter has %s)",
- build.Default.GOARCH, runtime.GOARCH)
- }
-
- for _, main := range mains {
- if len(mains) > 1 {
- fmt.Fprintf(os.Stderr, "Running: %s\n", main.Pkg.Path())
- }
- interp.Interpret(main, interpMode, conf.TypeChecker.Sizes, main.Pkg.Path(), args)
- }
- }
- return nil
-}
diff --git a/vendor/golang.org/x/tools/cmd/stress/stress.go b/vendor/golang.org/x/tools/cmd/stress/stress.go
deleted file mode 100644
index ee68917..0000000
--- a/vendor/golang.org/x/tools/cmd/stress/stress.go
+++ /dev/null
@@ -1,133 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build !plan9
-
-// The stress utility is intended for catching sporadic failures.
-// It runs a given process in parallel in a loop and collects any failures.
-// Usage:
-// $ stress ./fmt.test -test.run=TestSometing -test.cpu=10
-// You can also specify a number of parallel processes with -p flag;
-// instruct the utility to not kill hanged processes for gdb attach;
-// or specify the failure output you are looking for (if you want to
-// ignore some other sporadic failures).
-package main
-
-import (
- "flag"
- "fmt"
- "io/ioutil"
- "os"
- "os/exec"
- "regexp"
- "runtime"
- "syscall"
- "time"
-)
-
-var (
- flagP = flag.Int("p", runtime.NumCPU(), "run `N` processes in parallel")
- flagTimeout = flag.Duration("timeout", 10*time.Minute, "timeout each process after `duration`")
- flagKill = flag.Bool("kill", true, "kill timed out processes if true, otherwise just print pid (to attach with gdb)")
- flagFailure = flag.String("failure", "", "fail only if output matches `regexp`")
- flagIgnore = flag.String("ignore", "", "ignore failure if output matches `regexp`")
-)
-
-func init() {
- flag.Usage = func() {
- os.Stderr.WriteString(`The stress utility is intended for catching sporadic failures.
-It runs a given process in parallel in a loop and collects any failures.
-Usage:
-
- $ stress ./fmt.test -test.run=TestSometing -test.cpu=10
-
-`)
- flag.PrintDefaults()
- }
-}
-
-func main() {
- flag.Parse()
- if *flagP <= 0 || *flagTimeout <= 0 || len(flag.Args()) == 0 {
- flag.Usage()
- os.Exit(1)
- }
- var failureRe, ignoreRe *regexp.Regexp
- if *flagFailure != "" {
- var err error
- if failureRe, err = regexp.Compile(*flagFailure); err != nil {
- fmt.Println("bad failure regexp:", err)
- os.Exit(1)
- }
- }
- if *flagIgnore != "" {
- var err error
- if ignoreRe, err = regexp.Compile(*flagIgnore); err != nil {
- fmt.Println("bad ignore regexp:", err)
- os.Exit(1)
- }
- }
- res := make(chan []byte)
- for i := 0; i < *flagP; i++ {
- go func() {
- for {
- cmd := exec.Command(flag.Args()[0], flag.Args()[1:]...)
- done := make(chan bool)
- if *flagTimeout > 0 {
- go func() {
- select {
- case <-done:
- return
- case <-time.After(*flagTimeout):
- }
- if !*flagKill {
- fmt.Printf("process %v timed out\n", cmd.Process.Pid)
- return
- }
- cmd.Process.Signal(syscall.SIGABRT)
- select {
- case <-done:
- return
- case <-time.After(10 * time.Second):
- }
- cmd.Process.Kill()
- }()
- }
- out, err := cmd.CombinedOutput()
- close(done)
- if err != nil && (failureRe == nil || failureRe.Match(out)) && (ignoreRe == nil || !ignoreRe.Match(out)) {
- out = append(out, fmt.Sprintf("\n\nERROR: %v\n", err)...)
- } else {
- out = []byte{}
- }
- res <- out
- }
- }()
- }
- runs, fails := 0, 0
- ticker := time.NewTicker(5 * time.Second).C
- for {
- select {
- case out := <-res:
- runs++
- if len(out) == 0 {
- continue
- }
- fails++
- f, err := ioutil.TempFile("", "go-stress")
- if err != nil {
- fmt.Printf("failed to create temp file: %v\n", err)
- os.Exit(1)
- }
- f.Write(out)
- f.Close()
- if len(out) > 2<<10 {
- out = out[:2<<10]
- }
- fmt.Printf("\n%s\n%s\n", f.Name(), out)
- case <-ticker:
- fmt.Printf("%v runs so far, %v failures\n", runs, fails)
- }
- }
-}
diff --git a/vendor/golang.org/x/tools/cmd/stringer/endtoend_test.go b/vendor/golang.org/x/tools/cmd/stringer/endtoend_test.go
deleted file mode 100644
index 273f29b..0000000
--- a/vendor/golang.org/x/tools/cmd/stringer/endtoend_test.go
+++ /dev/null
@@ -1,111 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// go command is not available on android
-
-// +build !android
-
-package main
-
-import (
- "fmt"
- "go/build"
- "io"
- "io/ioutil"
- "os"
- "os/exec"
- "path/filepath"
- "strings"
- "testing"
-)
-
-// This file contains a test that compiles and runs each program in testdata
-// after generating the string method for its type. The rule is that for testdata/x.go
-// we run stringer -type X and then compile and run the program. The resulting
-// binary panics if the String method for X is not correct, including for error cases.
-
-func TestEndToEnd(t *testing.T) {
- dir, err := ioutil.TempDir("", "stringer")
- if err != nil {
- t.Fatal(err)
- }
- defer os.RemoveAll(dir)
- // Create stringer in temporary directory.
- stringer := filepath.Join(dir, "stringer.exe")
- err = run("go", "build", "-o", stringer)
- if err != nil {
- t.Fatalf("building stringer: %s", err)
- }
- // Read the testdata directory.
- fd, err := os.Open("testdata")
- if err != nil {
- t.Fatal(err)
- }
- defer fd.Close()
- names, err := fd.Readdirnames(-1)
- if err != nil {
- t.Fatalf("Readdirnames: %s", err)
- }
- // Generate, compile, and run the test programs.
- for _, name := range names {
- if !strings.HasSuffix(name, ".go") {
- t.Errorf("%s is not a Go file", name)
- continue
- }
- if name == "cgo.go" && !build.Default.CgoEnabled {
- t.Logf("cgo is not enabled for %s", name)
- continue
- }
- // Names are known to be ASCII and long enough.
- typeName := fmt.Sprintf("%c%s", name[0]+'A'-'a', name[1:len(name)-len(".go")])
- stringerCompileAndRun(t, dir, stringer, typeName, name)
- }
-}
-
-// stringerCompileAndRun runs stringer for the named file and compiles and
-// runs the target binary in directory dir. That binary will panic if the String method is incorrect.
-func stringerCompileAndRun(t *testing.T, dir, stringer, typeName, fileName string) {
- t.Logf("run: %s %s\n", fileName, typeName)
- source := filepath.Join(dir, fileName)
- err := copy(source, filepath.Join("testdata", fileName))
- if err != nil {
- t.Fatalf("copying file to temporary directory: %s", err)
- }
- stringSource := filepath.Join(dir, typeName+"_string.go")
- // Run stringer in temporary directory.
- err = run(stringer, "-type", typeName, "-output", stringSource, source)
- if err != nil {
- t.Fatal(err)
- }
- // Run the binary in the temporary directory.
- err = run("go", "run", stringSource, source)
- if err != nil {
- t.Fatal(err)
- }
-}
-
-// copy copies the from file to the to file.
-func copy(to, from string) error {
- toFd, err := os.Create(to)
- if err != nil {
- return err
- }
- defer toFd.Close()
- fromFd, err := os.Open(from)
- if err != nil {
- return err
- }
- defer fromFd.Close()
- _, err = io.Copy(toFd, fromFd)
- return err
-}
-
-// run runs a single command and returns an error if it does not succeed.
-// os/exec should have this function, to be honest.
-func run(name string, arg ...string) error {
- cmd := exec.Command(name, arg...)
- cmd.Stdout = os.Stdout
- cmd.Stderr = os.Stderr
- return cmd.Run()
-}
diff --git a/vendor/golang.org/x/tools/cmd/stringer/golden_test.go b/vendor/golang.org/x/tools/cmd/stringer/golden_test.go
deleted file mode 100644
index 4ba7788..0000000
--- a/vendor/golang.org/x/tools/cmd/stringer/golden_test.go
+++ /dev/null
@@ -1,319 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// This file contains simple golden tests for various examples.
-// Besides validating the results when the implementation changes,
-// it provides a way to look at the generated code without having
-// to execute the print statements in one's head.
-
-package main
-
-import (
- "strings"
- "testing"
-)
-
-// Golden represents a test case.
-type Golden struct {
- name string
- trimPrefix string
- lineComment bool
- input string // input; the package clause is provided when running the test.
- output string // exected output.
-}
-
-var golden = []Golden{
- {"day", "", false, day_in, day_out},
- {"offset", "", false, offset_in, offset_out},
- {"gap", "", false, gap_in, gap_out},
- {"num", "", false, num_in, num_out},
- {"unum", "", false, unum_in, unum_out},
- {"prime", "", false, prime_in, prime_out},
- {"prefix", "Type", false, prefix_in, prefix_out},
- {"tokens", "", true, tokens_in, tokens_out},
-}
-
-// Each example starts with "type XXX [u]int", with a single space separating them.
-
-// Simple test: enumeration of type int starting at 0.
-const day_in = `type Day int
-const (
- Monday Day = iota
- Tuesday
- Wednesday
- Thursday
- Friday
- Saturday
- Sunday
-)
-`
-
-const day_out = `
-const _Day_name = "MondayTuesdayWednesdayThursdayFridaySaturdaySunday"
-
-var _Day_index = [...]uint8{0, 6, 13, 22, 30, 36, 44, 50}
-
-func (i Day) String() string {
- if i < 0 || i >= Day(len(_Day_index)-1) {
- return "Day(" + strconv.FormatInt(int64(i), 10) + ")"
- }
- return _Day_name[_Day_index[i]:_Day_index[i+1]]
-}
-`
-
-// Enumeration with an offset.
-// Also includes a duplicate.
-const offset_in = `type Number int
-const (
- _ Number = iota
- One
- Two
- Three
- AnotherOne = One // Duplicate; note that AnotherOne doesn't appear below.
-)
-`
-
-const offset_out = `
-const _Number_name = "OneTwoThree"
-
-var _Number_index = [...]uint8{0, 3, 6, 11}
-
-func (i Number) String() string {
- i -= 1
- if i < 0 || i >= Number(len(_Number_index)-1) {
- return "Number(" + strconv.FormatInt(int64(i+1), 10) + ")"
- }
- return _Number_name[_Number_index[i]:_Number_index[i+1]]
-}
-`
-
-// Gaps and an offset.
-const gap_in = `type Gap int
-const (
- Two Gap = 2
- Three Gap = 3
- Five Gap = 5
- Six Gap = 6
- Seven Gap = 7
- Eight Gap = 8
- Nine Gap = 9
- Eleven Gap = 11
-)
-`
-
-const gap_out = `
-const (
- _Gap_name_0 = "TwoThree"
- _Gap_name_1 = "FiveSixSevenEightNine"
- _Gap_name_2 = "Eleven"
-)
-
-var (
- _Gap_index_0 = [...]uint8{0, 3, 8}
- _Gap_index_1 = [...]uint8{0, 4, 7, 12, 17, 21}
-)
-
-func (i Gap) String() string {
- switch {
- case 2 <= i && i <= 3:
- i -= 2
- return _Gap_name_0[_Gap_index_0[i]:_Gap_index_0[i+1]]
- case 5 <= i && i <= 9:
- i -= 5
- return _Gap_name_1[_Gap_index_1[i]:_Gap_index_1[i+1]]
- case i == 11:
- return _Gap_name_2
- default:
- return "Gap(" + strconv.FormatInt(int64(i), 10) + ")"
- }
-}
-`
-
-// Signed integers spanning zero.
-const num_in = `type Num int
-const (
- m_2 Num = -2 + iota
- m_1
- m0
- m1
- m2
-)
-`
-
-const num_out = `
-const _Num_name = "m_2m_1m0m1m2"
-
-var _Num_index = [...]uint8{0, 3, 6, 8, 10, 12}
-
-func (i Num) String() string {
- i -= -2
- if i < 0 || i >= Num(len(_Num_index)-1) {
- return "Num(" + strconv.FormatInt(int64(i+-2), 10) + ")"
- }
- return _Num_name[_Num_index[i]:_Num_index[i+1]]
-}
-`
-
-// Unsigned integers spanning zero.
-const unum_in = `type Unum uint
-const (
- m_2 Unum = iota + 253
- m_1
-)
-
-const (
- m0 Unum = iota
- m1
- m2
-)
-`
-
-const unum_out = `
-const (
- _Unum_name_0 = "m0m1m2"
- _Unum_name_1 = "m_2m_1"
-)
-
-var (
- _Unum_index_0 = [...]uint8{0, 2, 4, 6}
- _Unum_index_1 = [...]uint8{0, 3, 6}
-)
-
-func (i Unum) String() string {
- switch {
- case 0 <= i && i <= 2:
- return _Unum_name_0[_Unum_index_0[i]:_Unum_index_0[i+1]]
- case 253 <= i && i <= 254:
- i -= 253
- return _Unum_name_1[_Unum_index_1[i]:_Unum_index_1[i+1]]
- default:
- return "Unum(" + strconv.FormatInt(int64(i), 10) + ")"
- }
-}
-`
-
-// Enough gaps to trigger a map implementation of the method.
-// Also includes a duplicate to test that it doesn't cause problems
-const prime_in = `type Prime int
-const (
- p2 Prime = 2
- p3 Prime = 3
- p5 Prime = 5
- p7 Prime = 7
- p77 Prime = 7 // Duplicate; note that p77 doesn't appear below.
- p11 Prime = 11
- p13 Prime = 13
- p17 Prime = 17
- p19 Prime = 19
- p23 Prime = 23
- p29 Prime = 29
- p37 Prime = 31
- p41 Prime = 41
- p43 Prime = 43
-)
-`
-
-const prime_out = `
-const _Prime_name = "p2p3p5p7p11p13p17p19p23p29p37p41p43"
-
-var _Prime_map = map[Prime]string{
- 2: _Prime_name[0:2],
- 3: _Prime_name[2:4],
- 5: _Prime_name[4:6],
- 7: _Prime_name[6:8],
- 11: _Prime_name[8:11],
- 13: _Prime_name[11:14],
- 17: _Prime_name[14:17],
- 19: _Prime_name[17:20],
- 23: _Prime_name[20:23],
- 29: _Prime_name[23:26],
- 31: _Prime_name[26:29],
- 41: _Prime_name[29:32],
- 43: _Prime_name[32:35],
-}
-
-func (i Prime) String() string {
- if str, ok := _Prime_map[i]; ok {
- return str
- }
- return "Prime(" + strconv.FormatInt(int64(i), 10) + ")"
-}
-`
-
-const prefix_in = `type Type int
-const (
- TypeInt Type = iota
- TypeString
- TypeFloat
- TypeRune
- TypeByte
- TypeStruct
- TypeSlice
-)
-`
-
-const prefix_out = `
-const _Type_name = "IntStringFloatRuneByteStructSlice"
-
-var _Type_index = [...]uint8{0, 3, 9, 14, 18, 22, 28, 33}
-
-func (i Type) String() string {
- if i < 0 || i >= Type(len(_Type_index)-1) {
- return "Type(" + strconv.FormatInt(int64(i), 10) + ")"
- }
- return _Type_name[_Type_index[i]:_Type_index[i+1]]
-}
-`
-
-const tokens_in = `type Token int
-const (
- And Token = iota // &
- Or // |
- Add // +
- Sub // -
- Ident
- Period // .
-
- // not to be used
- SingleBefore
- // not to be used
- BeforeAndInline // inline
- InlineGeneral /* inline general */
-)
-`
-
-const tokens_out = `
-const _Token_name = "&|+-Ident.SingleBeforeinlineinline general"
-
-var _Token_index = [...]uint8{0, 1, 2, 3, 4, 9, 10, 22, 28, 42}
-
-func (i Token) String() string {
- if i < 0 || i >= Token(len(_Token_index)-1) {
- return "Token(" + strconv.FormatInt(int64(i), 10) + ")"
- }
- return _Token_name[_Token_index[i]:_Token_index[i+1]]
-}
-`
-
-func TestGolden(t *testing.T) {
- for _, test := range golden {
- g := Generator{
- trimPrefix: test.trimPrefix,
- lineComment: test.lineComment,
- }
- input := "package test\n" + test.input
- file := test.name + ".go"
- g.parsePackage(".", []string{file}, input)
- // Extract the name and type of the constant from the first line.
- tokens := strings.SplitN(test.input, " ", 3)
- if len(tokens) != 3 {
- t.Fatalf("%s: need type declaration on first line", test.name)
- }
- g.generate(tokens[1])
- got := string(g.format())
- if got != test.output {
- t.Errorf("%s: got\n====\n%s====\nexpected\n====%s", test.name, got, test.output)
- }
- }
-}
diff --git a/vendor/golang.org/x/tools/cmd/stringer/importer18.go b/vendor/golang.org/x/tools/cmd/stringer/importer18.go
deleted file mode 100644
index fd21873..0000000
--- a/vendor/golang.org/x/tools/cmd/stringer/importer18.go
+++ /dev/null
@@ -1,16 +0,0 @@
-// Copyright 2017 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build !go1.9
-
-package main
-
-import (
- "go/importer"
- "go/types"
-)
-
-func defaultImporter() types.Importer {
- return importer.Default()
-}
diff --git a/vendor/golang.org/x/tools/cmd/stringer/importer19.go b/vendor/golang.org/x/tools/cmd/stringer/importer19.go
deleted file mode 100644
index deddadb..0000000
--- a/vendor/golang.org/x/tools/cmd/stringer/importer19.go
+++ /dev/null
@@ -1,16 +0,0 @@
-// Copyright 2017 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build go1.9
-
-package main
-
-import (
- "go/importer"
- "go/types"
-)
-
-func defaultImporter() types.Importer {
- return importer.For("source", nil)
-}
diff --git a/vendor/golang.org/x/tools/cmd/stringer/stringer.go b/vendor/golang.org/x/tools/cmd/stringer/stringer.go
deleted file mode 100644
index 4b8d1ba..0000000
--- a/vendor/golang.org/x/tools/cmd/stringer/stringer.go
+++ /dev/null
@@ -1,655 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Stringer is a tool to automate the creation of methods that satisfy the fmt.Stringer
-// interface. Given the name of a (signed or unsigned) integer type T that has constants
-// defined, stringer will create a new self-contained Go source file implementing
-// func (t T) String() string
-// The file is created in the same package and directory as the package that defines T.
-// It has helpful defaults designed for use with go generate.
-//
-// Stringer works best with constants that are consecutive values such as created using iota,
-// but creates good code regardless. In the future it might also provide custom support for
-// constant sets that are bit patterns.
-//
-// For example, given this snippet,
-//
-// package painkiller
-//
-// type Pill int
-//
-// const (
-// Placebo Pill = iota
-// Aspirin
-// Ibuprofen
-// Paracetamol
-// Acetaminophen = Paracetamol
-// )
-//
-// running this command
-//
-// stringer -type=Pill
-//
-// in the same directory will create the file pill_string.go, in package painkiller,
-// containing a definition of
-//
-// func (Pill) String() string
-//
-// That method will translate the value of a Pill constant to the string representation
-// of the respective constant name, so that the call fmt.Print(painkiller.Aspirin) will
-// print the string "Aspirin".
-//
-// Typically this process would be run using go generate, like this:
-//
-// //go:generate stringer -type=Pill
-//
-// If multiple constants have the same value, the lexically first matching name will
-// be used (in the example, Acetaminophen will print as "Paracetamol").
-//
-// With no arguments, it processes the package in the current directory.
-// Otherwise, the arguments must name a single directory holding a Go package
-// or a set of Go source files that represent a single Go package.
-//
-// The -type flag accepts a comma-separated list of types so a single run can
-// generate methods for multiple types. The default output file is t_string.go,
-// where t is the lower-cased name of the first type listed. It can be overridden
-// with the -output flag.
-//
-package main // import "golang.org/x/tools/cmd/stringer"
-
-import (
- "bytes"
- "flag"
- "fmt"
- "go/ast"
- "go/build"
- exact "go/constant"
- "go/format"
- "go/parser"
- "go/token"
- "go/types"
- "io/ioutil"
- "log"
- "os"
- "path/filepath"
- "sort"
- "strings"
-)
-
-var (
- typeNames = flag.String("type", "", "comma-separated list of type names; must be set")
- output = flag.String("output", "", "output file name; default srcdir/_string.go")
- trimprefix = flag.String("trimprefix", "", "trim the `prefix` from the generated constant names")
- linecomment = flag.Bool("linecomment", false, "use line comment text as printed text when present")
-)
-
-// Usage is a replacement usage function for the flags package.
-func Usage() {
- fmt.Fprintf(os.Stderr, "Usage of %s:\n", os.Args[0])
- fmt.Fprintf(os.Stderr, "\tstringer [flags] -type T [directory]\n")
- fmt.Fprintf(os.Stderr, "\tstringer [flags] -type T files... # Must be a single package\n")
- fmt.Fprintf(os.Stderr, "For more information, see:\n")
- fmt.Fprintf(os.Stderr, "\thttp://godoc.org/golang.org/x/tools/cmd/stringer\n")
- fmt.Fprintf(os.Stderr, "Flags:\n")
- flag.PrintDefaults()
-}
-
-func main() {
- log.SetFlags(0)
- log.SetPrefix("stringer: ")
- flag.Usage = Usage
- flag.Parse()
- if len(*typeNames) == 0 {
- flag.Usage()
- os.Exit(2)
- }
- types := strings.Split(*typeNames, ",")
-
- // We accept either one directory or a list of files. Which do we have?
- args := flag.Args()
- if len(args) == 0 {
- // Default: process whole package in current directory.
- args = []string{"."}
- }
-
- // Parse the package once.
- var dir string
- g := Generator{
- trimPrefix: *trimprefix,
- lineComment: *linecomment,
- }
- if len(args) == 1 && isDirectory(args[0]) {
- dir = args[0]
- g.parsePackageDir(args[0])
- } else {
- dir = filepath.Dir(args[0])
- g.parsePackageFiles(args)
- }
-
- // Print the header and package clause.
- g.Printf("// Code generated by \"stringer %s\"; DO NOT EDIT.\n", strings.Join(os.Args[1:], " "))
- g.Printf("\n")
- g.Printf("package %s", g.pkg.name)
- g.Printf("\n")
- g.Printf("import \"strconv\"\n") // Used by all methods.
-
- // Run generate for each type.
- for _, typeName := range types {
- g.generate(typeName)
- }
-
- // Format the output.
- src := g.format()
-
- // Write to file.
- outputName := *output
- if outputName == "" {
- baseName := fmt.Sprintf("%s_string.go", types[0])
- outputName = filepath.Join(dir, strings.ToLower(baseName))
- }
- err := ioutil.WriteFile(outputName, src, 0644)
- if err != nil {
- log.Fatalf("writing output: %s", err)
- }
-}
-
-// isDirectory reports whether the named file is a directory.
-func isDirectory(name string) bool {
- info, err := os.Stat(name)
- if err != nil {
- log.Fatal(err)
- }
- return info.IsDir()
-}
-
-// Generator holds the state of the analysis. Primarily used to buffer
-// the output for format.Source.
-type Generator struct {
- buf bytes.Buffer // Accumulated output.
- pkg *Package // Package we are scanning.
-
- trimPrefix string
- lineComment bool
-}
-
-func (g *Generator) Printf(format string, args ...interface{}) {
- fmt.Fprintf(&g.buf, format, args...)
-}
-
-// File holds a single parsed file and associated data.
-type File struct {
- pkg *Package // Package to which this file belongs.
- file *ast.File // Parsed AST.
- // These fields are reset for each type being generated.
- typeName string // Name of the constant type.
- values []Value // Accumulator for constant values of that type.
-
- trimPrefix string
- lineComment bool
-}
-
-type Package struct {
- dir string
- name string
- defs map[*ast.Ident]types.Object
- files []*File
- typesPkg *types.Package
-}
-
-// parsePackageDir parses the package residing in the directory.
-func (g *Generator) parsePackageDir(directory string) {
- pkg, err := build.Default.ImportDir(directory, 0)
- if err != nil {
- log.Fatalf("cannot process directory %s: %s", directory, err)
- }
- var names []string
- names = append(names, pkg.GoFiles...)
- names = append(names, pkg.CgoFiles...)
- // TODO: Need to think about constants in test files. Maybe write type_string_test.go
- // in a separate pass? For later.
- // names = append(names, pkg.TestGoFiles...) // These are also in the "foo" package.
- names = append(names, pkg.SFiles...)
- names = prefixDirectory(directory, names)
- g.parsePackage(directory, names, nil)
-}
-
-// parsePackageFiles parses the package occupying the named files.
-func (g *Generator) parsePackageFiles(names []string) {
- g.parsePackage(".", names, nil)
-}
-
-// prefixDirectory places the directory name on the beginning of each name in the list.
-func prefixDirectory(directory string, names []string) []string {
- if directory == "." {
- return names
- }
- ret := make([]string, len(names))
- for i, name := range names {
- ret[i] = filepath.Join(directory, name)
- }
- return ret
-}
-
-// parsePackage analyzes the single package constructed from the named files.
-// If text is non-nil, it is a string to be used instead of the content of the file,
-// to be used for testing. parsePackage exits if there is an error.
-func (g *Generator) parsePackage(directory string, names []string, text interface{}) {
- var files []*File
- var astFiles []*ast.File
- g.pkg = new(Package)
- fs := token.NewFileSet()
- for _, name := range names {
- if !strings.HasSuffix(name, ".go") {
- continue
- }
- parsedFile, err := parser.ParseFile(fs, name, text, parser.ParseComments)
- if err != nil {
- log.Fatalf("parsing package: %s: %s", name, err)
- }
- astFiles = append(astFiles, parsedFile)
- files = append(files, &File{
- file: parsedFile,
- pkg: g.pkg,
- trimPrefix: g.trimPrefix,
- lineComment: g.lineComment,
- })
- }
- if len(astFiles) == 0 {
- log.Fatalf("%s: no buildable Go files", directory)
- }
- g.pkg.name = astFiles[0].Name.Name
- g.pkg.files = files
- g.pkg.dir = directory
- // Type check the package.
- g.pkg.check(fs, astFiles)
-}
-
-// check type-checks the package. The package must be OK to proceed.
-func (pkg *Package) check(fs *token.FileSet, astFiles []*ast.File) {
- pkg.defs = make(map[*ast.Ident]types.Object)
- config := types.Config{Importer: defaultImporter(), FakeImportC: true}
- info := &types.Info{
- Defs: pkg.defs,
- }
- typesPkg, err := config.Check(pkg.dir, fs, astFiles, info)
- if err != nil {
- log.Fatalf("checking package: %s", err)
- }
- pkg.typesPkg = typesPkg
-}
-
-// generate produces the String method for the named type.
-func (g *Generator) generate(typeName string) {
- values := make([]Value, 0, 100)
- for _, file := range g.pkg.files {
- // Set the state for this run of the walker.
- file.typeName = typeName
- file.values = nil
- if file.file != nil {
- ast.Inspect(file.file, file.genDecl)
- values = append(values, file.values...)
- }
- }
-
- if len(values) == 0 {
- log.Fatalf("no values defined for type %s", typeName)
- }
- runs := splitIntoRuns(values)
- // The decision of which pattern to use depends on the number of
- // runs in the numbers. If there's only one, it's easy. For more than
- // one, there's a tradeoff between complexity and size of the data
- // and code vs. the simplicity of a map. A map takes more space,
- // but so does the code. The decision here (crossover at 10) is
- // arbitrary, but considers that for large numbers of runs the cost
- // of the linear scan in the switch might become important, and
- // rather than use yet another algorithm such as binary search,
- // we punt and use a map. In any case, the likelihood of a map
- // being necessary for any realistic example other than bitmasks
- // is very low. And bitmasks probably deserve their own analysis,
- // to be done some other day.
- switch {
- case len(runs) == 1:
- g.buildOneRun(runs, typeName)
- case len(runs) <= 10:
- g.buildMultipleRuns(runs, typeName)
- default:
- g.buildMap(runs, typeName)
- }
-}
-
-// splitIntoRuns breaks the values into runs of contiguous sequences.
-// For example, given 1,2,3,5,6,7 it returns {1,2,3},{5,6,7}.
-// The input slice is known to be non-empty.
-func splitIntoRuns(values []Value) [][]Value {
- // We use stable sort so the lexically first name is chosen for equal elements.
- sort.Stable(byValue(values))
- // Remove duplicates. Stable sort has put the one we want to print first,
- // so use that one. The String method won't care about which named constant
- // was the argument, so the first name for the given value is the only one to keep.
- // We need to do this because identical values would cause the switch or map
- // to fail to compile.
- j := 1
- for i := 1; i < len(values); i++ {
- if values[i].value != values[i-1].value {
- values[j] = values[i]
- j++
- }
- }
- values = values[:j]
- runs := make([][]Value, 0, 10)
- for len(values) > 0 {
- // One contiguous sequence per outer loop.
- i := 1
- for i < len(values) && values[i].value == values[i-1].value+1 {
- i++
- }
- runs = append(runs, values[:i])
- values = values[i:]
- }
- return runs
-}
-
-// format returns the gofmt-ed contents of the Generator's buffer.
-func (g *Generator) format() []byte {
- src, err := format.Source(g.buf.Bytes())
- if err != nil {
- // Should never happen, but can arise when developing this code.
- // The user can compile the output to see the error.
- log.Printf("warning: internal error: invalid Go generated: %s", err)
- log.Printf("warning: compile the package to analyze the error")
- return g.buf.Bytes()
- }
- return src
-}
-
-// Value represents a declared constant.
-type Value struct {
- name string // The name of the constant.
- // The value is stored as a bit pattern alone. The boolean tells us
- // whether to interpret it as an int64 or a uint64; the only place
- // this matters is when sorting.
- // Much of the time the str field is all we need; it is printed
- // by Value.String.
- value uint64 // Will be converted to int64 when needed.
- signed bool // Whether the constant is a signed type.
- str string // The string representation given by the "go/exact" package.
-}
-
-func (v *Value) String() string {
- return v.str
-}
-
-// byValue lets us sort the constants into increasing order.
-// We take care in the Less method to sort in signed or unsigned order,
-// as appropriate.
-type byValue []Value
-
-func (b byValue) Len() int { return len(b) }
-func (b byValue) Swap(i, j int) { b[i], b[j] = b[j], b[i] }
-func (b byValue) Less(i, j int) bool {
- if b[i].signed {
- return int64(b[i].value) < int64(b[j].value)
- }
- return b[i].value < b[j].value
-}
-
-// genDecl processes one declaration clause.
-func (f *File) genDecl(node ast.Node) bool {
- decl, ok := node.(*ast.GenDecl)
- if !ok || decl.Tok != token.CONST {
- // We only care about const declarations.
- return true
- }
- // The name of the type of the constants we are declaring.
- // Can change if this is a multi-element declaration.
- typ := ""
- // Loop over the elements of the declaration. Each element is a ValueSpec:
- // a list of names possibly followed by a type, possibly followed by values.
- // If the type and value are both missing, we carry down the type (and value,
- // but the "go/types" package takes care of that).
- for _, spec := range decl.Specs {
- vspec := spec.(*ast.ValueSpec) // Guaranteed to succeed as this is CONST.
- if vspec.Type == nil && len(vspec.Values) > 0 {
- // "X = 1". With no type but a value, the constant is untyped.
- // Skip this vspec and reset the remembered type.
- typ = ""
- continue
- }
- if vspec.Type != nil {
- // "X T". We have a type. Remember it.
- ident, ok := vspec.Type.(*ast.Ident)
- if !ok {
- continue
- }
- typ = ident.Name
- }
- if typ != f.typeName {
- // This is not the type we're looking for.
- continue
- }
- // We now have a list of names (from one line of source code) all being
- // declared with the desired type.
- // Grab their names and actual values and store them in f.values.
- for _, name := range vspec.Names {
- if name.Name == "_" {
- continue
- }
- // This dance lets the type checker find the values for us. It's a
- // bit tricky: look up the object declared by the name, find its
- // types.Const, and extract its value.
- obj, ok := f.pkg.defs[name]
- if !ok {
- log.Fatalf("no value for constant %s", name)
- }
- info := obj.Type().Underlying().(*types.Basic).Info()
- if info&types.IsInteger == 0 {
- log.Fatalf("can't handle non-integer constant type %s", typ)
- }
- value := obj.(*types.Const).Val() // Guaranteed to succeed as this is CONST.
- if value.Kind() != exact.Int {
- log.Fatalf("can't happen: constant is not an integer %s", name)
- }
- i64, isInt := exact.Int64Val(value)
- u64, isUint := exact.Uint64Val(value)
- if !isInt && !isUint {
- log.Fatalf("internal error: value of %s is not an integer: %s", name, value.String())
- }
- if !isInt {
- u64 = uint64(i64)
- }
- v := Value{
- name: name.Name,
- value: u64,
- signed: info&types.IsUnsigned == 0,
- str: value.String(),
- }
- if c := vspec.Comment; f.lineComment && c != nil && len(c.List) == 1 {
- v.name = strings.TrimSpace(c.Text())
- }
- v.name = strings.TrimPrefix(v.name, f.trimPrefix)
- f.values = append(f.values, v)
- }
- }
- return false
-}
-
-// Helpers
-
-// usize returns the number of bits of the smallest unsigned integer
-// type that will hold n. Used to create the smallest possible slice of
-// integers to use as indexes into the concatenated strings.
-func usize(n int) int {
- switch {
- case n < 1<<8:
- return 8
- case n < 1<<16:
- return 16
- default:
- // 2^32 is enough constants for anyone.
- return 32
- }
-}
-
-// declareIndexAndNameVars declares the index slices and concatenated names
-// strings representing the runs of values.
-func (g *Generator) declareIndexAndNameVars(runs [][]Value, typeName string) {
- var indexes, names []string
- for i, run := range runs {
- index, name := g.createIndexAndNameDecl(run, typeName, fmt.Sprintf("_%d", i))
- if len(run) != 1 {
- indexes = append(indexes, index)
- }
- names = append(names, name)
- }
- g.Printf("const (\n")
- for _, name := range names {
- g.Printf("\t%s\n", name)
- }
- g.Printf(")\n\n")
-
- if len(indexes) > 0 {
- g.Printf("var (")
- for _, index := range indexes {
- g.Printf("\t%s\n", index)
- }
- g.Printf(")\n\n")
- }
-}
-
-// declareIndexAndNameVar is the single-run version of declareIndexAndNameVars
-func (g *Generator) declareIndexAndNameVar(run []Value, typeName string) {
- index, name := g.createIndexAndNameDecl(run, typeName, "")
- g.Printf("const %s\n", name)
- g.Printf("var %s\n", index)
-}
-
-// createIndexAndNameDecl returns the pair of declarations for the run. The caller will add "const" and "var".
-func (g *Generator) createIndexAndNameDecl(run []Value, typeName string, suffix string) (string, string) {
- b := new(bytes.Buffer)
- indexes := make([]int, len(run))
- for i := range run {
- b.WriteString(run[i].name)
- indexes[i] = b.Len()
- }
- nameConst := fmt.Sprintf("_%s_name%s = %q", typeName, suffix, b.String())
- nameLen := b.Len()
- b.Reset()
- fmt.Fprintf(b, "_%s_index%s = [...]uint%d{0, ", typeName, suffix, usize(nameLen))
- for i, v := range indexes {
- if i > 0 {
- fmt.Fprintf(b, ", ")
- }
- fmt.Fprintf(b, "%d", v)
- }
- fmt.Fprintf(b, "}")
- return b.String(), nameConst
-}
-
-// declareNameVars declares the concatenated names string representing all the values in the runs.
-func (g *Generator) declareNameVars(runs [][]Value, typeName string, suffix string) {
- g.Printf("const _%s_name%s = \"", typeName, suffix)
- for _, run := range runs {
- for i := range run {
- g.Printf("%s", run[i].name)
- }
- }
- g.Printf("\"\n")
-}
-
-// buildOneRun generates the variables and String method for a single run of contiguous values.
-func (g *Generator) buildOneRun(runs [][]Value, typeName string) {
- values := runs[0]
- g.Printf("\n")
- g.declareIndexAndNameVar(values, typeName)
- // The generated code is simple enough to write as a Printf format.
- lessThanZero := ""
- if values[0].signed {
- lessThanZero = "i < 0 || "
- }
- if values[0].value == 0 { // Signed or unsigned, 0 is still 0.
- g.Printf(stringOneRun, typeName, usize(len(values)), lessThanZero)
- } else {
- g.Printf(stringOneRunWithOffset, typeName, values[0].String(), usize(len(values)), lessThanZero)
- }
-}
-
-// Arguments to format are:
-// [1]: type name
-// [2]: size of index element (8 for uint8 etc.)
-// [3]: less than zero check (for signed types)
-const stringOneRun = `func (i %[1]s) String() string {
- if %[3]si >= %[1]s(len(_%[1]s_index)-1) {
- return "%[1]s(" + strconv.FormatInt(int64(i), 10) + ")"
- }
- return _%[1]s_name[_%[1]s_index[i]:_%[1]s_index[i+1]]
-}
-`
-
-// Arguments to format are:
-// [1]: type name
-// [2]: lowest defined value for type, as a string
-// [3]: size of index element (8 for uint8 etc.)
-// [4]: less than zero check (for signed types)
-/*
- */
-const stringOneRunWithOffset = `func (i %[1]s) String() string {
- i -= %[2]s
- if %[4]si >= %[1]s(len(_%[1]s_index)-1) {
- return "%[1]s(" + strconv.FormatInt(int64(i + %[2]s), 10) + ")"
- }
- return _%[1]s_name[_%[1]s_index[i] : _%[1]s_index[i+1]]
-}
-`
-
-// buildMultipleRuns generates the variables and String method for multiple runs of contiguous values.
-// For this pattern, a single Printf format won't do.
-func (g *Generator) buildMultipleRuns(runs [][]Value, typeName string) {
- g.Printf("\n")
- g.declareIndexAndNameVars(runs, typeName)
- g.Printf("func (i %s) String() string {\n", typeName)
- g.Printf("\tswitch {\n")
- for i, values := range runs {
- if len(values) == 1 {
- g.Printf("\tcase i == %s:\n", &values[0])
- g.Printf("\t\treturn _%s_name_%d\n", typeName, i)
- continue
- }
- g.Printf("\tcase %s <= i && i <= %s:\n", &values[0], &values[len(values)-1])
- if values[0].value != 0 {
- g.Printf("\t\ti -= %s\n", &values[0])
- }
- g.Printf("\t\treturn _%s_name_%d[_%s_index_%d[i]:_%s_index_%d[i+1]]\n",
- typeName, i, typeName, i, typeName, i)
- }
- g.Printf("\tdefault:\n")
- g.Printf("\t\treturn \"%s(\" + strconv.FormatInt(int64(i), 10) + \")\"\n", typeName)
- g.Printf("\t}\n")
- g.Printf("}\n")
-}
-
-// buildMap handles the case where the space is so sparse a map is a reasonable fallback.
-// It's a rare situation but has simple code.
-func (g *Generator) buildMap(runs [][]Value, typeName string) {
- g.Printf("\n")
- g.declareNameVars(runs, typeName, "")
- g.Printf("\nvar _%s_map = map[%s]string{\n", typeName, typeName)
- n := 0
- for _, values := range runs {
- for _, value := range values {
- g.Printf("\t%s: _%s_name[%d:%d],\n", &value, typeName, n, n+len(value.name))
- n += len(value.name)
- }
- }
- g.Printf("}\n\n")
- g.Printf(stringMap, typeName)
-}
-
-// Argument to format is the type name.
-const stringMap = `func (i %[1]s) String() string {
- if str, ok := _%[1]s_map[i]; ok {
- return str
- }
- return "%[1]s(" + strconv.FormatInt(int64(i), 10) + ")"
-}
-`
diff --git a/vendor/golang.org/x/tools/cmd/stringer/testdata/cgo.go b/vendor/golang.org/x/tools/cmd/stringer/testdata/cgo.go
deleted file mode 100644
index ef38f95..0000000
--- a/vendor/golang.org/x/tools/cmd/stringer/testdata/cgo.go
+++ /dev/null
@@ -1,32 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Import "C" shouldn't be imported.
-
-package main
-
-/*
-#define HELLO 1
-*/
-import "C"
-
-import "fmt"
-
-type Cgo uint32
-
-const (
- // MustScanSubDirs indicates that events were coalesced hierarchically.
- MustScanSubDirs Cgo = 1 << iota
-)
-
-func main() {
- _ = C.HELLO
- ck(MustScanSubDirs, "MustScanSubDirs")
-}
-
-func ck(day Cgo, str string) {
- if fmt.Sprint(day) != str {
- panic("cgo.go: " + str)
- }
-}
diff --git a/vendor/golang.org/x/tools/cmd/stringer/testdata/day.go b/vendor/golang.org/x/tools/cmd/stringer/testdata/day.go
deleted file mode 100644
index 35fa8dc..0000000
--- a/vendor/golang.org/x/tools/cmd/stringer/testdata/day.go
+++ /dev/null
@@ -1,39 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Simple test: enumeration of type int starting at 0.
-
-package main
-
-import "fmt"
-
-type Day int
-
-const (
- Monday Day = iota
- Tuesday
- Wednesday
- Thursday
- Friday
- Saturday
- Sunday
-)
-
-func main() {
- ck(Monday, "Monday")
- ck(Tuesday, "Tuesday")
- ck(Wednesday, "Wednesday")
- ck(Thursday, "Thursday")
- ck(Friday, "Friday")
- ck(Saturday, "Saturday")
- ck(Sunday, "Sunday")
- ck(-127, "Day(-127)")
- ck(127, "Day(127)")
-}
-
-func ck(day Day, str string) {
- if fmt.Sprint(day) != str {
- panic("day.go: " + str)
- }
-}
diff --git a/vendor/golang.org/x/tools/cmd/stringer/testdata/gap.go b/vendor/golang.org/x/tools/cmd/stringer/testdata/gap.go
deleted file mode 100644
index bc8a90c..0000000
--- a/vendor/golang.org/x/tools/cmd/stringer/testdata/gap.go
+++ /dev/null
@@ -1,44 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Gaps and an offset.
-
-package main
-
-import "fmt"
-
-type Gap int
-
-const (
- Two Gap = 2
- Three Gap = 3
- Five Gap = 5
- Six Gap = 6
- Seven Gap = 7
- Eight Gap = 8
- Nine Gap = 9
- Eleven Gap = 11
-)
-
-func main() {
- ck(0, "Gap(0)")
- ck(1, "Gap(1)")
- ck(Two, "Two")
- ck(Three, "Three")
- ck(4, "Gap(4)")
- ck(Five, "Five")
- ck(Six, "Six")
- ck(Seven, "Seven")
- ck(Eight, "Eight")
- ck(Nine, "Nine")
- ck(10, "Gap(10)")
- ck(Eleven, "Eleven")
- ck(12, "Gap(12)")
-}
-
-func ck(gap Gap, str string) {
- if fmt.Sprint(gap) != str {
- panic("gap.go: " + str)
- }
-}
diff --git a/vendor/golang.org/x/tools/cmd/stringer/testdata/num.go b/vendor/golang.org/x/tools/cmd/stringer/testdata/num.go
deleted file mode 100644
index 0d5ab10..0000000
--- a/vendor/golang.org/x/tools/cmd/stringer/testdata/num.go
+++ /dev/null
@@ -1,35 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Signed integers spanning zero.
-
-package main
-
-import "fmt"
-
-type Num int
-
-const (
- m_2 Num = -2 + iota
- m_1
- m0
- m1
- m2
-)
-
-func main() {
- ck(-3, "Num(-3)")
- ck(m_2, "m_2")
- ck(m_1, "m_1")
- ck(m0, "m0")
- ck(m1, "m1")
- ck(m2, "m2")
- ck(3, "Num(3)")
-}
-
-func ck(num Num, str string) {
- if fmt.Sprint(num) != str {
- panic("num.go: " + str)
- }
-}
diff --git a/vendor/golang.org/x/tools/cmd/stringer/testdata/number.go b/vendor/golang.org/x/tools/cmd/stringer/testdata/number.go
deleted file mode 100644
index 7f1c824..0000000
--- a/vendor/golang.org/x/tools/cmd/stringer/testdata/number.go
+++ /dev/null
@@ -1,34 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Enumeration with an offset.
-// Also includes a duplicate.
-
-package main
-
-import "fmt"
-
-type Number int
-
-const (
- _ Number = iota
- One
- Two
- Three
- AnotherOne = One // Duplicate; note that AnotherOne doesn't appear below.
-)
-
-func main() {
- ck(One, "One")
- ck(Two, "Two")
- ck(Three, "Three")
- ck(AnotherOne, "One")
- ck(127, "Number(127)")
-}
-
-func ck(num Number, str string) {
- if fmt.Sprint(num) != str {
- panic("number.go: " + str)
- }
-}
diff --git a/vendor/golang.org/x/tools/cmd/stringer/testdata/prime.go b/vendor/golang.org/x/tools/cmd/stringer/testdata/prime.go
deleted file mode 100644
index f551a1a..0000000
--- a/vendor/golang.org/x/tools/cmd/stringer/testdata/prime.go
+++ /dev/null
@@ -1,56 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Enough gaps to trigger a map implementation of the method.
-// Also includes a duplicate to test that it doesn't cause problems
-
-package main
-
-import "fmt"
-
-type Prime int
-
-const (
- p2 Prime = 2
- p3 Prime = 3
- p5 Prime = 5
- p7 Prime = 7
- p77 Prime = 7 // Duplicate; note that p77 doesn't appear below.
- p11 Prime = 11
- p13 Prime = 13
- p17 Prime = 17
- p19 Prime = 19
- p23 Prime = 23
- p29 Prime = 29
- p37 Prime = 31
- p41 Prime = 41
- p43 Prime = 43
-)
-
-func main() {
- ck(0, "Prime(0)")
- ck(1, "Prime(1)")
- ck(p2, "p2")
- ck(p3, "p3")
- ck(4, "Prime(4)")
- ck(p5, "p5")
- ck(p7, "p7")
- ck(p77, "p7")
- ck(p11, "p11")
- ck(p13, "p13")
- ck(p17, "p17")
- ck(p19, "p19")
- ck(p23, "p23")
- ck(p29, "p29")
- ck(p37, "p37")
- ck(p41, "p41")
- ck(p43, "p43")
- ck(44, "Prime(44)")
-}
-
-func ck(prime Prime, str string) {
- if fmt.Sprint(prime) != str {
- panic("prime.go: " + str)
- }
-}
diff --git a/vendor/golang.org/x/tools/cmd/stringer/testdata/unum.go b/vendor/golang.org/x/tools/cmd/stringer/testdata/unum.go
deleted file mode 100644
index 2f8508f..0000000
--- a/vendor/golang.org/x/tools/cmd/stringer/testdata/unum.go
+++ /dev/null
@@ -1,38 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Unsigned integers spanning zero.
-
-package main
-
-import "fmt"
-
-type Unum uint8
-
-const (
- m_2 Unum = iota + 253
- m_1
-)
-
-const (
- m0 Unum = iota
- m1
- m2
-)
-
-func main() {
- ck(^Unum(0)-3, "Unum(252)")
- ck(m_2, "m_2")
- ck(m_1, "m_1")
- ck(m0, "m0")
- ck(m1, "m1")
- ck(m2, "m2")
- ck(3, "Unum(3)")
-}
-
-func ck(unum Unum, str string) {
- if fmt.Sprint(unum) != str {
- panic("unum.go: " + str)
- }
-}
diff --git a/vendor/golang.org/x/tools/cmd/stringer/testdata/unum2.go b/vendor/golang.org/x/tools/cmd/stringer/testdata/unum2.go
deleted file mode 100644
index edbbedf..0000000
--- a/vendor/golang.org/x/tools/cmd/stringer/testdata/unum2.go
+++ /dev/null
@@ -1,31 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Unsigned integers - check maximum size
-
-package main
-
-import "fmt"
-
-type Unum2 uint8
-
-const (
- Zero Unum2 = iota
- One
- Two
-)
-
-func main() {
- ck(Zero, "Zero")
- ck(One, "One")
- ck(Two, "Two")
- ck(3, "Unum2(3)")
- ck(255, "Unum2(255)")
-}
-
-func ck(unum Unum2, str string) {
- if fmt.Sprint(unum) != str {
- panic("unum.go: " + str)
- }
-}
diff --git a/vendor/golang.org/x/tools/cmd/stringer/util_test.go b/vendor/golang.org/x/tools/cmd/stringer/util_test.go
deleted file mode 100644
index 1aeba6e..0000000
--- a/vendor/golang.org/x/tools/cmd/stringer/util_test.go
+++ /dev/null
@@ -1,77 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// This file contains tests for some of the internal functions.
-
-package main
-
-import (
- "fmt"
- "testing"
-)
-
-// Helpers to save typing in the test cases.
-type u []uint64
-type uu [][]uint64
-
-type SplitTest struct {
- input u
- output uu
- signed bool
-}
-
-var (
- m2 = uint64(2)
- m1 = uint64(1)
- m0 = uint64(0)
- m_1 = ^uint64(0) // -1 when signed.
- m_2 = ^uint64(0) - 1 // -2 when signed.
-)
-
-var splitTests = []SplitTest{
- // No need for a test for the empty case; that's picked off before splitIntoRuns.
- // Single value.
- {u{1}, uu{u{1}}, false},
- // Out of order.
- {u{3, 2, 1}, uu{u{1, 2, 3}}, true},
- // Out of order.
- {u{3, 2, 1}, uu{u{1, 2, 3}}, false},
- // A gap at the beginning.
- {u{1, 33, 32, 31}, uu{u{1}, u{31, 32, 33}}, true},
- // A gap in the middle, in mixed order.
- {u{33, 7, 32, 31, 9, 8}, uu{u{7, 8, 9}, u{31, 32, 33}}, true},
- // Gaps throughout
- {u{33, 44, 1, 32, 45, 31}, uu{u{1}, u{31, 32, 33}, u{44, 45}}, true},
- // Unsigned values spanning 0.
- {u{m1, m0, m_1, m2, m_2}, uu{u{m0, m1, m2}, u{m_2, m_1}}, false},
- // Signed values spanning 0
- {u{m1, m0, m_1, m2, m_2}, uu{u{m_2, m_1, m0, m1, m2}}, true},
-}
-
-func TestSplitIntoRuns(t *testing.T) {
-Outer:
- for n, test := range splitTests {
- values := make([]Value, len(test.input))
- for i, v := range test.input {
- values[i] = Value{"", v, test.signed, fmt.Sprint(v)}
- }
- runs := splitIntoRuns(values)
- if len(runs) != len(test.output) {
- t.Errorf("#%d: %v: got %d runs; expected %d", n, test.input, len(runs), len(test.output))
- continue
- }
- for i, run := range runs {
- if len(run) != len(test.output[i]) {
- t.Errorf("#%d: got %v; expected %v", n, runs, test.output)
- continue Outer
- }
- for j, v := range run {
- if v.value != test.output[i][j] {
- t.Errorf("#%d: got %v; expected %v", n, runs, test.output)
- continue Outer
- }
- }
- }
- }
-}
diff --git a/vendor/golang.org/x/tools/cmd/tip/Dockerfile b/vendor/golang.org/x/tools/cmd/tip/Dockerfile
deleted file mode 100644
index 51cf6d3..0000000
--- a/vendor/golang.org/x/tools/cmd/tip/Dockerfile
+++ /dev/null
@@ -1,143 +0,0 @@
-FROM golang:1.9
-
-RUN apt-get update && apt-get install --no-install-recommends -y -q build-essential git
-
-# golang puts its go install here (weird but true)
-ENV GOROOT_BOOTSTRAP /usr/local/go
-
-# BEGIN deps (run `make update-deps` to update)
-
-# Repo cloud.google.com/go at 1d0c2da (2018-01-30)
-ENV REV=1d0c2da40456a9b47f5376165f275424acc15c09
-RUN go get -d cloud.google.com/go/compute/metadata `#and 6 other pkgs` &&\
- (cd /go/src/cloud.google.com/go && (git cat-file -t $REV 2>/dev/null || git fetch -q origin $REV) && git reset --hard $REV)
-
-# Repo github.com/golang/protobuf at 9255415 (2018-01-25)
-ENV REV=925541529c1fa6821df4e44ce2723319eb2be768
-RUN go get -d github.com/golang/protobuf/proto `#and 6 other pkgs` &&\
- (cd /go/src/github.com/golang/protobuf && (git cat-file -t $REV 2>/dev/null || git fetch -q origin $REV) && git reset --hard $REV)
-
-# Repo github.com/googleapis/gax-go at 317e000 (2017-09-15)
-ENV REV=317e0006254c44a0ac427cc52a0e083ff0b9622f
-RUN go get -d github.com/googleapis/gax-go &&\
- (cd /go/src/github.com/googleapis/gax-go && (git cat-file -t $REV 2>/dev/null || git fetch -q origin $REV) && git reset --hard $REV)
-
-# Repo golang.org/x/build at e879390 (2018-02-01)
-ENV REV=e8793909ba350594eea4c7c6bdb0f0d9a0d0f77a
-RUN go get -d golang.org/x/build/autocertcache &&\
- (cd /go/src/golang.org/x/build && (git cat-file -t $REV 2>/dev/null || git fetch -q origin $REV) && git reset --hard $REV)
-
-# Repo golang.org/x/crypto at 1875d0a (2018-01-27)
-ENV REV=1875d0a70c90e57f11972aefd42276df65e895b9
-RUN go get -d golang.org/x/crypto/acme `#and 2 other pkgs` &&\
- (cd /go/src/golang.org/x/crypto && (git cat-file -t $REV 2>/dev/null || git fetch -q origin $REV) && git reset --hard $REV)
-
-# Repo golang.org/x/net at 6d90978 (2018-02-01)
-ENV REV=6d90978dc4889d44e8cfbd04c05d17b5417823c7
-RUN go get -d golang.org/x/net/context `#and 8 other pkgs` &&\
- (cd /go/src/golang.org/x/net && (git cat-file -t $REV 2>/dev/null || git fetch -q origin $REV) && git reset --hard $REV)
-
-# Repo golang.org/x/oauth2 at 30785a2 (2018-01-04)
-ENV REV=30785a2c434e431ef7c507b54617d6a951d5f2b4
-RUN go get -d golang.org/x/oauth2 `#and 5 other pkgs` &&\
- (cd /go/src/golang.org/x/oauth2 && (git cat-file -t $REV 2>/dev/null || git fetch -q origin $REV) && git reset --hard $REV)
-
-# Repo golang.org/x/text at e19ae14 (2017-12-27)
-ENV REV=e19ae1496984b1c655b8044a65c0300a3c878dd3
-RUN go get -d golang.org/x/text/secure/bidirule `#and 4 other pkgs` &&\
- (cd /go/src/golang.org/x/text && (git cat-file -t $REV 2>/dev/null || git fetch -q origin $REV) && git reset --hard $REV)
-
-# Repo google.golang.org/api at 7d0e2d3 (2018-01-30)
-ENV REV=7d0e2d350555821bef5a5b8aecf0d12cc1def633
-RUN go get -d google.golang.org/api/gensupport `#and 9 other pkgs` &&\
- (cd /go/src/google.golang.org/api && (git cat-file -t $REV 2>/dev/null || git fetch -q origin $REV) && git reset --hard $REV)
-
-# Repo google.golang.org/genproto at 4eb30f4 (2018-01-25)
-ENV REV=4eb30f4778eed4c258ba66527a0d4f9ec8a36c45
-RUN go get -d google.golang.org/genproto/googleapis/api/annotations `#and 3 other pkgs` &&\
- (cd /go/src/google.golang.org/genproto && (git cat-file -t $REV 2>/dev/null || git fetch -q origin $REV) && git reset --hard $REV)
-
-# Repo google.golang.org/grpc at 0bd008f (2018-01-25)
-ENV REV=0bd008f5fadb62d228f12b18d016709e8139a7af
-RUN go get -d google.golang.org/grpc `#and 23 other pkgs` &&\
- (cd /go/src/google.golang.org/grpc && (git cat-file -t $REV 2>/dev/null || git fetch -q origin $REV) && git reset --hard $REV)
-
-# Optimization to speed up iterative development, not necessary for correctness:
-RUN go install cloud.google.com/go/compute/metadata \
- cloud.google.com/go/iam \
- cloud.google.com/go/internal \
- cloud.google.com/go/internal/optional \
- cloud.google.com/go/internal/version \
- cloud.google.com/go/storage \
- github.com/golang/protobuf/proto \
- github.com/golang/protobuf/protoc-gen-go/descriptor \
- github.com/golang/protobuf/ptypes \
- github.com/golang/protobuf/ptypes/any \
- github.com/golang/protobuf/ptypes/duration \
- github.com/golang/protobuf/ptypes/timestamp \
- github.com/googleapis/gax-go \
- golang.org/x/build/autocertcache \
- golang.org/x/crypto/acme \
- golang.org/x/crypto/acme/autocert \
- golang.org/x/net/context \
- golang.org/x/net/context/ctxhttp \
- golang.org/x/net/http2 \
- golang.org/x/net/http2/hpack \
- golang.org/x/net/idna \
- golang.org/x/net/internal/timeseries \
- golang.org/x/net/lex/httplex \
- golang.org/x/net/trace \
- golang.org/x/oauth2 \
- golang.org/x/oauth2/google \
- golang.org/x/oauth2/internal \
- golang.org/x/oauth2/jws \
- golang.org/x/oauth2/jwt \
- golang.org/x/text/secure/bidirule \
- golang.org/x/text/transform \
- golang.org/x/text/unicode/bidi \
- golang.org/x/text/unicode/norm \
- google.golang.org/api/gensupport \
- google.golang.org/api/googleapi \
- google.golang.org/api/googleapi/internal/uritemplates \
- google.golang.org/api/googleapi/transport \
- google.golang.org/api/internal \
- google.golang.org/api/iterator \
- google.golang.org/api/option \
- google.golang.org/api/storage/v1 \
- google.golang.org/api/transport/http \
- google.golang.org/genproto/googleapis/api/annotations \
- google.golang.org/genproto/googleapis/iam/v1 \
- google.golang.org/genproto/googleapis/rpc/status \
- google.golang.org/grpc \
- google.golang.org/grpc/balancer \
- google.golang.org/grpc/balancer/base \
- google.golang.org/grpc/balancer/roundrobin \
- google.golang.org/grpc/codes \
- google.golang.org/grpc/connectivity \
- google.golang.org/grpc/credentials \
- google.golang.org/grpc/encoding \
- google.golang.org/grpc/encoding/proto \
- google.golang.org/grpc/grpclb/grpc_lb_v1/messages \
- google.golang.org/grpc/grpclog \
- google.golang.org/grpc/internal \
- google.golang.org/grpc/keepalive \
- google.golang.org/grpc/metadata \
- google.golang.org/grpc/naming \
- google.golang.org/grpc/peer \
- google.golang.org/grpc/resolver \
- google.golang.org/grpc/resolver/dns \
- google.golang.org/grpc/resolver/passthrough \
- google.golang.org/grpc/stats \
- google.golang.org/grpc/status \
- google.golang.org/grpc/tap \
- google.golang.org/grpc/transport
-# END deps.
-
-# golang sets GOPATH=/go
-ADD . /go/src/tip
-RUN go install --tags=autocert tip
-ENTRYPOINT ["/go/bin/tip"]
-
-# We listen on 8080 (for historical reasons). The service.yaml maps public port 80 to 8080.
-# We also listen on 443 for LetsEncrypt TLS.
-EXPOSE 8080 443
diff --git a/vendor/golang.org/x/tools/cmd/tip/Makefile b/vendor/golang.org/x/tools/cmd/tip/Makefile
deleted file mode 100644
index 7902688..0000000
--- a/vendor/golang.org/x/tools/cmd/tip/Makefile
+++ /dev/null
@@ -1,25 +0,0 @@
-# Copyright 2017 The Go Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style
-# license that can be found in the LICENSE file.
-
-VERSION=v2
-
-.PHONY: usage
-
-usage:
- echo "See Makefile"
- exit 1
-
-update-deps:
- go install golang.org/x/build/cmd/gitlock
- gitlock --update=Dockerfile --ignore=NONE --tags=autocert golang.org/x/tools/cmd/tip
-
-docker-prod: Dockerfile
- docker build -f Dockerfile --tag=gcr.io/symbolic-datum-552/tip:$(VERSION) .
-docker-dev: Dockerfile
- docker build -f Dockerfile --tag=gcr.io/go-dashboard-dev/tip:$(VERSION) .
-
-push-prod: docker-prod
- gcloud docker -- push gcr.io/symbolic-datum-552/tip:$(VERSION)
-push-dev: docker-dev
- gcloud docker -- push gcr.io/go-dashboard-dev/tip:$(VERSION)
diff --git a/vendor/golang.org/x/tools/cmd/tip/README b/vendor/golang.org/x/tools/cmd/tip/README
deleted file mode 100644
index b96c107..0000000
--- a/vendor/golang.org/x/tools/cmd/tip/README
+++ /dev/null
@@ -1,32 +0,0 @@
-============================================================
-Old instructions, only valid for talks.golang.org:
-============================================================
-
-1. Deploy the app.
-
- To deploy tip.golang.org:
- (See Kubernetes instruction below.)
-
- To deploy talks.golang.org:
- $ gcloud --project golang-org app deploy --no-promote talks.yaml
-
-2. Wait until the deployed version is serving requests.
-
-3. Go to the developer console and upgrade the default version.
- https://console.developers.google.com/appengine/versions?project=golang-org&moduleId=tip
-
-4. Clean up any old versions (they continue to use at least one instance).
-
-============================================================
-New Kubernetes instructions, for tip.golang.org:
-============================================================
-
-Kubernetes instructions:
-
- * build & push images (see Makefile for helpers)
- * create/update resources:
- - kubectl create -f tip-rc.yaml
- - kubectl create -f tip-service.yaml
-
-TODO(bradfitz): flesh out these instructions as I gain experience
-with updating this over time. Also: move talks.golang.org to GKE too?
diff --git a/vendor/golang.org/x/tools/cmd/tip/cert.go b/vendor/golang.org/x/tools/cmd/tip/cert.go
deleted file mode 100644
index f912cf3..0000000
--- a/vendor/golang.org/x/tools/cmd/tip/cert.go
+++ /dev/null
@@ -1,63 +0,0 @@
-// Copyright 2017 The Go Authors. All rights reserved.
-// Use of this source code is governed by the Apache 2.0
-// license that can be found in the LICENSE file.
-
-// +build autocert
-
-// This file contains autocert and cloud.google.com/go/storage
-// dependencies we want to hide by default from the Go build system,
-// which currently doesn't know how to fetch non-golang.org/x/*
-// dependencies. The Dockerfile builds the production binary
-// with this code using --tags=autocert.
-
-package main
-
-import (
- "context"
- "crypto/tls"
- "log"
- "net/http"
-
- "cloud.google.com/go/storage"
- "golang.org/x/build/autocertcache"
- "golang.org/x/crypto/acme/autocert"
-)
-
-func init() {
- runHTTPS = runHTTPSAutocert
- certInit = certInitAutocert
- wrapHTTPMux = wrapHTTPMuxAutocert
-}
-
-var autocertManager *autocert.Manager
-
-func certInitAutocert() {
- var cache autocert.Cache
- if b := *autoCertCacheBucket; b != "" {
- sc, err := storage.NewClient(context.Background())
- if err != nil {
- log.Fatalf("storage.NewClient: %v", err)
- }
- cache = autocertcache.NewGoogleCloudStorageCache(sc, b)
- }
- autocertManager = &autocert.Manager{
- Prompt: autocert.AcceptTOS,
- HostPolicy: autocert.HostWhitelist(*autoCertDomain),
- Cache: cache,
- }
-}
-
-func runHTTPSAutocert(h http.Handler) error {
- s := &http.Server{
- Addr: ":https",
- Handler: h,
- TLSConfig: &tls.Config{
- GetCertificate: autocertManager.GetCertificate,
- },
- }
- return s.ListenAndServeTLS("", "")
-}
-
-func wrapHTTPMuxAutocert(h http.Handler) http.Handler {
- return autocertManager.HTTPHandler(h)
-}
diff --git a/vendor/golang.org/x/tools/cmd/tip/godoc.go b/vendor/golang.org/x/tools/cmd/tip/godoc.go
deleted file mode 100644
index a01b8ca..0000000
--- a/vendor/golang.org/x/tools/cmd/tip/godoc.go
+++ /dev/null
@@ -1,73 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by the Apache 2.0
-// license that can be found in the LICENSE file.
-
-package main
-
-import (
- "bytes"
- "errors"
- "fmt"
- "os"
- "os/exec"
- "path/filepath"
-)
-
-type godocBuilder struct {
-}
-
-func (b godocBuilder) Signature(heads map[string]string) string {
- return fmt.Sprintf("go=%v/tools=%v", heads["go"], heads["tools"])
-}
-
-func (b godocBuilder) Init(dir, hostport string, heads map[string]string) (*exec.Cmd, error) {
- goDir := filepath.Join(dir, "go")
- toolsDir := filepath.Join(dir, "gopath/src/golang.org/x/tools")
- if err := checkout(repoURL+"go", heads["go"], goDir); err != nil {
- return nil, err
- }
- if err := checkout(repoURL+"tools", heads["tools"], toolsDir); err != nil {
- return nil, err
- }
-
- make := exec.Command(filepath.Join(goDir, "src/make.bash"))
- make.Dir = filepath.Join(goDir, "src")
- if err := runErr(make); err != nil {
- return nil, err
- }
- goBin := filepath.Join(goDir, "bin/go")
- goPath := filepath.Join(dir, "gopath")
- install := exec.Command(goBin, "install", "golang.org/x/tools/cmd/godoc")
- install.Env = []string{
- "GOROOT=" + goDir,
- "GOPATH=" + goPath,
- "GOROOT_BOOTSTRAP=" + os.Getenv("GOROOT_BOOTSTRAP"),
- }
- if err := runErr(install); err != nil {
- return nil, err
- }
-
- godocBin := filepath.Join(goPath, "bin/godoc")
- godoc := exec.Command(godocBin, "-http="+hostport, "-index", "-index_interval=-1s")
- godoc.Env = []string{"GOROOT=" + goDir}
- // TODO(adg): log this somewhere useful
- godoc.Stdout = os.Stdout
- godoc.Stderr = os.Stderr
- if err := godoc.Start(); err != nil {
- return nil, err
- }
- return godoc, nil
-}
-
-var indexingMsg = []byte("Indexing in progress: result may be inaccurate")
-
-func (b godocBuilder) HealthCheck(hostport string) error {
- body, err := getOK(fmt.Sprintf("http://%v/search?q=FALLTHROUGH", hostport))
- if err != nil {
- return err
- }
- if bytes.Contains(body, indexingMsg) {
- return errors.New("still indexing")
- }
- return nil
-}
diff --git a/vendor/golang.org/x/tools/cmd/tip/godoc.yaml b/vendor/golang.org/x/tools/cmd/tip/godoc.yaml
deleted file mode 100644
index 64dbb7d..0000000
--- a/vendor/golang.org/x/tools/cmd/tip/godoc.yaml
+++ /dev/null
@@ -1,17 +0,0 @@
-module: tip
-runtime: custom
-vm: true
-
-manual_scaling:
- instances: 4
-
-env_variables:
- TIP_BUILDER: 'godoc'
-
-health_check:
- enable_health_check: True
- check_interval_sec: 5
- timeout_sec: 4
- unhealthy_threshold: 2
- healthy_threshold: 2
- restart_threshold: 240
diff --git a/vendor/golang.org/x/tools/cmd/tip/talks.go b/vendor/golang.org/x/tools/cmd/tip/talks.go
deleted file mode 100644
index a1a7a95..0000000
--- a/vendor/golang.org/x/tools/cmd/tip/talks.go
+++ /dev/null
@@ -1,73 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by the Apache 2.0
-// license that can be found in the LICENSE file.
-
-package main
-
-import (
- "bytes"
- "errors"
- "fmt"
- "os"
- "os/exec"
- "path/filepath"
- "runtime"
-)
-
-type talksBuilder struct {
-}
-
-func (b talksBuilder) Signature(heads map[string]string) string {
- return heads["talks"]
-}
-
-const talksToolsRev = "8cab8a1319f0be9798e7fe78b15da75e5f94b2e9"
-
-func (b talksBuilder) Init(dir, hostport string, heads map[string]string) (*exec.Cmd, error) {
- toolsDir := filepath.Join(dir, "gopath/src/golang.org/x/tools")
- if err := checkout(repoURL+"tools", talksToolsRev, toolsDir); err != nil {
- return nil, err
- }
- talksDir := filepath.Join(dir, "gopath/src/golang.org/x/talks")
- if err := checkout(repoURL+"talks", heads["talks"], talksDir); err != nil {
- return nil, err
- }
-
- goDir := os.Getenv("GOROOT_BOOTSTRAP")
- if goDir == "" {
- goDir = runtime.GOROOT()
- }
- goBin := filepath.Join(goDir, "bin/go")
- goPath := filepath.Join(dir, "gopath")
- presentPath := "golang.org/x/tools/cmd/present"
- install := exec.Command(goBin, "install", "-tags=appenginevm", presentPath)
- install.Env = []string{"GOROOT=" + goDir, "GOPATH=" + goPath}
- if err := runErr(install); err != nil {
- return nil, err
- }
-
- talksBin := filepath.Join(goPath, "bin/present")
- presentSrc := filepath.Join(goPath, "src", presentPath)
- present := exec.Command(talksBin, "-http="+hostport, "-base="+presentSrc)
- present.Dir = talksDir
- // TODO(adg): log this somewhere useful
- present.Stdout = os.Stdout
- present.Stderr = os.Stderr
- if err := present.Start(); err != nil {
- return nil, err
- }
- return present, nil
-}
-
-var talksMsg = []byte("Talks - The Go Programming Language")
-
-func (b talksBuilder) HealthCheck(hostport string) error {
- body, err := getOK(fmt.Sprintf("http://%v/", hostport))
- if err != nil {
- return err
- }
- if !bytes.Contains(body, talksMsg) {
- return errors.New("couldn't match string")
- }
- return nil
-}
diff --git a/vendor/golang.org/x/tools/cmd/tip/talks.yaml b/vendor/golang.org/x/tools/cmd/tip/talks.yaml
deleted file mode 100644
index 24391a7..0000000
--- a/vendor/golang.org/x/tools/cmd/tip/talks.yaml
+++ /dev/null
@@ -1,12 +0,0 @@
-service: talks
-runtime: custom
-env: flex
-
-manual_scaling:
- instances: 1
-
-env_variables:
- TIP_BUILDER: 'talks'
-
-health_check:
- enable_health_check: False
diff --git a/vendor/golang.org/x/tools/cmd/tip/tip-rc.yaml b/vendor/golang.org/x/tools/cmd/tip/tip-rc.yaml
deleted file mode 100644
index 82af3b7..0000000
--- a/vendor/golang.org/x/tools/cmd/tip/tip-rc.yaml
+++ /dev/null
@@ -1,40 +0,0 @@
-apiVersion: v1
-kind: ReplicationController
-metadata:
- name: tipgodoc
-spec:
- replicas: 1
- selector:
- app: tipgodoc
- template:
- metadata:
- name: tipgodoc
- labels:
- app: tipgodoc
- spec:
- volumes:
- - name: cache-volume
- emptyDir: {}
- containers:
- - name: gitmirror
- image: gcr.io/symbolic-datum-552/tip:v2
- imagePullPolicy: Always
- command: ["/go/bin/tip", "--autocert=tip.golang.org", "--autocert-bucket=golang-tip-autocert"]
- env:
- - name: TMPDIR
- value: /build
- - name: TIP_BUILDER
- value: godoc
- volumeMounts:
- - mountPath: /build
- name: cache-volume
- ports:
- - containerPort: 8080
- - containerPort: 443
- resources:
- requests:
- cpu: "1"
- memory: "2Gi"
- limits:
- cpu: "2"
- memory: "4Gi"
diff --git a/vendor/golang.org/x/tools/cmd/tip/tip-service.yaml b/vendor/golang.org/x/tools/cmd/tip/tip-service.yaml
deleted file mode 100644
index eeb2a1c..0000000
--- a/vendor/golang.org/x/tools/cmd/tip/tip-service.yaml
+++ /dev/null
@@ -1,16 +0,0 @@
-apiVersion: v1
-kind: Service
-metadata:
- name: tipgodoc
-spec:
- ports:
- - port: 80
- targetPort: 8080
- name: http
- - port: 443
- targetPort: 443
- name: https
- selector:
- app: tipgodoc
- type: LoadBalancer
- loadBalancerIP: 130.211.180.236
diff --git a/vendor/golang.org/x/tools/cmd/tip/tip.go b/vendor/golang.org/x/tools/cmd/tip/tip.go
deleted file mode 100644
index 91032dc..0000000
--- a/vendor/golang.org/x/tools/cmd/tip/tip.go
+++ /dev/null
@@ -1,414 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by the Apache 2.0
-// license that can be found in the LICENSE file.
-
-// Command tip is the tip.golang.org server,
-// serving the latest HEAD straight from the Git oven.
-package main
-
-import (
- "bufio"
- "encoding/json"
- "errors"
- "flag"
- "fmt"
- "io"
- "io/ioutil"
- "log"
- "net/http"
- "net/http/httputil"
- "net/url"
- "os"
- "os/exec"
- "path/filepath"
- "sync"
- "time"
-)
-
-const (
- repoURL = "https://go.googlesource.com/"
- metaURL = "https://go.googlesource.com/?b=master&format=JSON"
- startTimeout = 10 * time.Minute
-)
-
-var startTime = time.Now()
-
-var (
- autoCertDomain = flag.String("autocert", "", "if non-empty, listen on port 443 and serve a LetsEncrypt cert for this hostname")
- autoCertCacheBucket = flag.String("autocert-bucket", "", "if non-empty, the Google Cloud Storage bucket in which to store the LetsEncrypt cache")
-)
-
-// Hooks that are set non-nil in cert.go if the "autocert" build tag
-// is used.
-var (
- certInit func()
- runHTTPS func(http.Handler) error
- wrapHTTPMux func(http.Handler) http.Handler
-)
-
-func main() {
- flag.Parse()
-
- const k = "TIP_BUILDER"
- var b Builder
- switch os.Getenv(k) {
- case "godoc":
- b = godocBuilder{}
- case "talks":
- b = talksBuilder{}
- default:
- log.Fatalf("Unknown %v value: %q", k, os.Getenv(k))
- }
-
- if certInit != nil {
- certInit()
- }
-
- p := &Proxy{builder: b}
- go p.run()
- mux := newServeMux(p)
-
- log.Printf("Starting up tip server for builder %q", os.Getenv(k))
-
- errc := make(chan error, 1)
-
- go func() {
- var httpMux http.Handler = mux
- if wrapHTTPMux != nil {
- httpMux = wrapHTTPMux(httpMux)
- }
- errc <- http.ListenAndServe(":8080", httpMux)
- }()
- if *autoCertDomain != "" {
- if runHTTPS == nil {
- errc <- errors.New("can't use --autocert without building binary with the autocert build tag")
- } else {
- go func() {
- errc <- runHTTPS(mux)
- }()
- }
- log.Printf("Listening on port 443 with LetsEncrypt support on domain %q", *autoCertDomain)
- }
- if err := <-errc; err != nil {
- p.stop()
- log.Fatal(err)
- }
-}
-
-// Proxy implements the tip.golang.org server: a reverse-proxy
-// that builds and runs godoc instances showing the latest docs.
-type Proxy struct {
- builder Builder
-
- mu sync.Mutex // protects the followin'
- proxy http.Handler
- cur string // signature of gorepo+toolsrepo
- cmd *exec.Cmd // live godoc instance, or nil for none
- side string
- hostport string // host and port of the live instance
- err error
-}
-
-type Builder interface {
- Signature(heads map[string]string) string
- Init(dir, hostport string, heads map[string]string) (*exec.Cmd, error)
- HealthCheck(hostport string) error
-}
-
-func (p *Proxy) ServeHTTP(w http.ResponseWriter, r *http.Request) {
- if r.URL.Path == "/_tipstatus" {
- p.serveStatus(w, r)
- return
- }
- p.mu.Lock()
- proxy := p.proxy
- err := p.err
- p.mu.Unlock()
- if proxy == nil {
- s := "starting up"
- if err != nil {
- s = err.Error()
- }
- http.Error(w, s, http.StatusInternalServerError)
- return
- }
- proxy.ServeHTTP(w, r)
-}
-
-func (p *Proxy) serveStatus(w http.ResponseWriter, r *http.Request) {
- p.mu.Lock()
- defer p.mu.Unlock()
- fmt.Fprintf(w, "side=%v\ncurrent=%v\nerror=%v\nuptime=%v\n", p.side, p.cur, p.err, int(time.Since(startTime).Seconds()))
-}
-
-func (p *Proxy) serveHealthCheck(w http.ResponseWriter, r *http.Request) {
- p.mu.Lock()
- defer p.mu.Unlock()
-
- // NOTE: (App Engine only; not GKE) Status 502, 503, 504 are
- // the only status codes that signify an unhealthy app. So
- // long as this handler returns one of those codes, this
- // instance will not be sent any requests.
- if p.proxy == nil {
- log.Printf("Health check: not ready")
- http.Error(w, "Not ready", http.StatusServiceUnavailable)
- return
- }
-
- if err := p.builder.HealthCheck(p.hostport); err != nil {
- log.Printf("Health check failed: %v", err)
- http.Error(w, "Health check failed", http.StatusServiceUnavailable)
- return
- }
- io.WriteString(w, "ok")
-}
-
-// run runs in its own goroutine.
-func (p *Proxy) run() {
- p.side = "a"
- for {
- p.poll()
- time.Sleep(30 * time.Second)
- }
-}
-
-func (p *Proxy) stop() {
- p.mu.Lock()
- defer p.mu.Unlock()
- if p.cmd != nil {
- p.cmd.Process.Kill()
- }
-}
-
-// poll runs from the run loop goroutine.
-func (p *Proxy) poll() {
- heads := gerritMetaMap()
- if heads == nil {
- return
- }
-
- sig := p.builder.Signature(heads)
-
- p.mu.Lock()
- changes := sig != p.cur
- curSide := p.side
- p.cur = sig
- p.mu.Unlock()
-
- if !changes {
- return
- }
-
- newSide := "b"
- if curSide == "b" {
- newSide = "a"
- }
-
- dir := filepath.Join(os.TempDir(), "tip", newSide)
- if err := os.MkdirAll(dir, 0755); err != nil {
- p.err = err
- return
- }
- hostport := "localhost:8081"
- if newSide == "b" {
- hostport = "localhost:8082"
- }
- cmd, err := p.builder.Init(dir, hostport, heads)
- if err != nil {
- err = fmt.Errorf("builder.Init: %v", err)
- } else {
- go func() {
- // TODO(adg,bradfitz): be smarter about dead processes
- if err := cmd.Wait(); err != nil {
- log.Printf("process in %v exited: %v", dir, err)
- }
- }()
- err = waitReady(p.builder, hostport)
- if err != nil {
- cmd.Process.Kill()
- err = fmt.Errorf("waitReady: %v", err)
- }
- }
-
- p.mu.Lock()
- defer p.mu.Unlock()
- if err != nil {
- log.Println(err)
- p.err = err
- return
- }
-
- u, err := url.Parse(fmt.Sprintf("http://%v/", hostport))
- if err != nil {
- err = fmt.Errorf("parsing hostport: %v", err)
- log.Println(err)
- p.err = err
- return
- }
- p.proxy = httputil.NewSingleHostReverseProxy(u)
- p.side = newSide
- p.hostport = hostport
- if p.cmd != nil {
- p.cmd.Process.Kill()
- }
- p.cmd = cmd
-}
-
-func newServeMux(p *Proxy) http.Handler {
- mux := http.NewServeMux()
- mux.Handle("/", httpsOnlyHandler{p})
- mux.HandleFunc("/_ah/health", p.serveHealthCheck)
- return mux
-}
-
-func waitReady(b Builder, hostport string) error {
- var err error
- deadline := time.Now().Add(startTimeout)
- for time.Now().Before(deadline) {
- if err = b.HealthCheck(hostport); err == nil {
- return nil
- }
- time.Sleep(time.Second)
- }
- return fmt.Errorf("timed out waiting for process at %v: %v", hostport, err)
-}
-
-func runErr(cmd *exec.Cmd) error {
- out, err := cmd.CombinedOutput()
- if err != nil {
- if len(out) == 0 {
- return err
- }
- return fmt.Errorf("%s\n%v", out, err)
- }
- return nil
-}
-
-func checkout(repo, hash, path string) error {
- // Clone git repo if it doesn't exist.
- if _, err := os.Stat(filepath.Join(path, ".git")); os.IsNotExist(err) {
- if err := os.MkdirAll(filepath.Dir(path), 0755); err != nil {
- return fmt.Errorf("mkdir: %v", err)
- }
- if err := runErr(exec.Command("git", "clone", repo, path)); err != nil {
- return fmt.Errorf("clone: %v", err)
- }
- } else if err != nil {
- return fmt.Errorf("stat .git: %v", err)
- }
-
- // Pull down changes and update to hash.
- cmd := exec.Command("git", "fetch")
- cmd.Dir = path
- if err := runErr(cmd); err != nil {
- return fmt.Errorf("fetch: %v", err)
- }
- cmd = exec.Command("git", "reset", "--hard", hash)
- cmd.Dir = path
- if err := runErr(cmd); err != nil {
- return fmt.Errorf("reset: %v", err)
- }
- cmd = exec.Command("git", "clean", "-d", "-f", "-x")
- cmd.Dir = path
- if err := runErr(cmd); err != nil {
- return fmt.Errorf("clean: %v", err)
- }
- return nil
-}
-
-var timeoutClient = &http.Client{Timeout: 10 * time.Second}
-
-// gerritMetaMap returns the map from repo name (e.g. "go") to its
-// latest master hash.
-// The returned map is nil on any transient error.
-func gerritMetaMap() map[string]string {
- res, err := timeoutClient.Get(metaURL)
- if err != nil {
- log.Printf("Error getting Gerrit meta map: %v", err)
- return nil
- }
- defer res.Body.Close()
- defer io.Copy(ioutil.Discard, res.Body) // ensure EOF for keep-alive
- if res.StatusCode != 200 {
- return nil
- }
- var meta map[string]struct {
- Branches map[string]string
- }
- br := bufio.NewReader(res.Body)
- // For security reasons or something, this URL starts with ")]}'\n" before
- // the JSON object. So ignore that.
- // Shawn Pearce says it's guaranteed to always be just one line, ending in '\n'.
- for {
- b, err := br.ReadByte()
- if err != nil {
- return nil
- }
- if b == '\n' {
- break
- }
- }
- if err := json.NewDecoder(br).Decode(&meta); err != nil {
- log.Printf("JSON decoding error from %v: %s", metaURL, err)
- return nil
- }
- m := map[string]string{}
- for repo, v := range meta {
- if master, ok := v.Branches["master"]; ok {
- m[repo] = master
- }
- }
- return m
-}
-
-func getOK(url string) (body []byte, err error) {
- res, err := timeoutClient.Get(url)
- if err != nil {
- return nil, err
- }
- body, err = ioutil.ReadAll(res.Body)
- res.Body.Close()
- if err != nil {
- return nil, err
- }
- if res.StatusCode != http.StatusOK {
- return nil, errors.New(res.Status)
- }
- return body, nil
-}
-
-// httpsOnlyHandler redirects requests to "http://example.com/foo?bar" to
-// "https://example.com/foo?bar". It should be used when the server is listening
-// for HTTP traffic behind a proxy that terminates TLS traffic, not when the Go
-// server is terminating TLS directly.
-type httpsOnlyHandler struct {
- h http.Handler
-}
-
-// isProxiedReq checks whether the server is running behind a proxy that may be
-// terminating TLS.
-func isProxiedReq(r *http.Request) bool {
- if _, ok := r.Header["X-Appengine-Https"]; ok {
- return true
- }
- if _, ok := r.Header["X-Forwarded-Proto"]; ok {
- return true
- }
- return false
-}
-
-func (h httpsOnlyHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
- if r.Header.Get("X-Appengine-Https") == "off" || r.Header.Get("X-Forwarded-Proto") == "http" ||
- (!isProxiedReq(r) && r.TLS == nil) {
- r.URL.Scheme = "https"
- r.URL.Host = r.Host
- http.Redirect(w, r, r.URL.String(), http.StatusFound)
- return
- }
- if r.Header.Get("X-Appengine-Https") == "on" || r.Header.Get("X-Forwarded-Proto") == "https" ||
- (!isProxiedReq(r) && r.TLS != nil) {
- // Only set this header when we're actually in production.
- w.Header().Set("Strict-Transport-Security", "max-age=31536000; preload")
- }
- h.h.ServeHTTP(w, r)
-}
diff --git a/vendor/golang.org/x/tools/cmd/tip/tip_test.go b/vendor/golang.org/x/tools/cmd/tip/tip_test.go
deleted file mode 100644
index 878954d..0000000
--- a/vendor/golang.org/x/tools/cmd/tip/tip_test.go
+++ /dev/null
@@ -1,25 +0,0 @@
-// Copyright 2017 The Go Authors. All rights reserved.
-// Use of this source code is governed by the Apache 2.0
-// license that can be found in the LICENSE file.
-
-package main
-
-import (
- "net/http/httptest"
- "testing"
-)
-
-func TestTipRedirects(t *testing.T) {
- mux := newServeMux(&Proxy{builder: &godocBuilder{}})
- req := httptest.NewRequest("GET", "http://example.com/foo?bar=baz", nil)
- req.Header.Set("X-Forwarded-Proto", "http")
- w := httptest.NewRecorder()
- mux.ServeHTTP(w, req)
- if w.Code != 302 {
- t.Errorf("expected Code to be 302, got %d", w.Code)
- }
- want := "https://example.com/foo?bar=baz"
- if loc := w.Header().Get("Location"); loc != want {
- t.Errorf("Location header: got %s, want %s", loc, want)
- }
-}
diff --git a/vendor/golang.org/x/tools/cmd/toolstash/buildall b/vendor/golang.org/x/tools/cmd/toolstash/buildall
deleted file mode 100644
index 40d88f5..0000000
--- a/vendor/golang.org/x/tools/cmd/toolstash/buildall
+++ /dev/null
@@ -1,68 +0,0 @@
-#!/bin/bash
-
-# Usage: buildall [-e] [-nocmp] [-work]
-#
-# Builds everything (std) for every GOOS/GOARCH combination but installs nothing.
-#
-# By default, runs the builds with -toolexec 'toolstash -cmp', to test that the
-# toolchain is producing bit identical output to a previous known good toolchain.
-#
-# Options:
-# -e: stop at first failure
-# -nocmp: turn off toolstash -cmp; just check that ordinary builds succeed
-# -work: pass -work to go command
-
-sete=false
-if [ "$1" = "-e" ]; then
- sete=true
- shift
-fi
-
-cmp=true
-if [ "$1" = "-nocmp" ]; then
- cmp=false
- shift
-fi
-
-work=""
-if [ "$1" = "-work" ]; then
- work="-work"
- shift
-fi
-
-cd $(go env GOROOT)/src
-go install cmd/compile cmd/link cmd/asm || exit 1
-pattern="$1"
-if [ "$pattern" = "" ]; then
- pattern=.
-fi
-
-targets="$(go tool dist list; echo linux/386/387)"
-targets="$(echo "$targets" | tr '/' '-' | sort | egrep "$pattern" | egrep -v 'android-arm|darwin-arm')"
-
-# put linux, nacl first in the target list to get all the architectures up front.
-targets="$(echo "$targets" | egrep 'linux|nacl') $(echo "$targets" | egrep -v 'linux|nacl')"
-
-if [ "$sete" = true ]; then
- set -e
-fi
-for target in $targets
-do
- echo $target
- export GOOS=$(echo $target | sed 's/-.*//')
- export GOARCH=$(echo $target | sed 's/.*-//')
- unset GO386
- if [ "$GOARCH" = "387" ]; then
- export GOARCH=386
- export GO386=387
- fi
- if $cmp; then
- if [ "$GOOS" = "android" ]; then
- go build $work -a -toolexec 'toolstash -cmp' std
- else
- go build $work -a -toolexec 'toolstash -cmp' std cmd
- fi
- else
- go build $work -a std
- fi
-done
diff --git a/vendor/golang.org/x/tools/cmd/toolstash/cmp.go b/vendor/golang.org/x/tools/cmd/toolstash/cmp.go
deleted file mode 100644
index f5974e1..0000000
--- a/vendor/golang.org/x/tools/cmd/toolstash/cmp.go
+++ /dev/null
@@ -1,157 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-import (
- "bufio"
- "bytes"
- "fmt"
- "io"
- "log"
- "os"
- "regexp"
- "strconv"
- "strings"
-)
-
-var (
- hexDumpRE = regexp.MustCompile(`^\t(0x[0-9a-f]{4,})(( ([0-9a-f]{2}| )){16}) [ -\x7F]{1,16}\n`)
- listingRE = regexp.MustCompile(`^\t(0x[0-9a-f]{4,}) ([0-9]{4,}) \(.*:[0-9]+\)\t`)
-)
-
-// okdiffs lists regular expressions for lines to consider minor mismatches.
-// If one of these regexps matches both of a pair of unequal lines, the mismatch
-// is reported but not treated as the one worth looking for.
-// For example, differences in the TEXT line are typically frame size
-// changes due to optimization decisions made in the body of the function.
-// Better to keep looking for the actual difference.
-// Similarly, forward jumps might have different offsets due to a
-// change in instruction encoding later on.
-// Better to find that change.
-var okdiffs = []*regexp.Regexp{
- regexp.MustCompile(`\) TEXT[ ].*,\$`),
- regexp.MustCompile(`\) WORD[ ].*,\$`),
- regexp.MustCompile(`\) (B|BR|JMP) `),
- regexp.MustCompile(`\) FUNCDATA `),
- regexp.MustCompile(`\\(z|x00)`),
- regexp.MustCompile(`\$\([0-9]\.[0-9]+e[+\-][0-9]+\)`),
- regexp.MustCompile(`size=.*value=.*args=.*locals=`),
-}
-
-func compareLogs(outfile string) string {
- f1, err := os.Open(outfile + ".log")
- if err != nil {
- log.Fatal(err)
- }
- defer f1.Close()
-
- f2, err := os.Open(outfile + ".stash.log")
- if err != nil {
- log.Fatal(err)
- }
- defer f2.Close()
-
- b1 := bufio.NewReader(f1)
- b2 := bufio.NewReader(f2)
-
- offset := int64(0)
- textOffset := offset
- textLineno := 0
- lineno := 0
- var line1, line2 string
- var prefix bytes.Buffer
-Reading:
- for {
- var err1, err2 error
- line1, err1 = b1.ReadString('\n')
- line2, err2 = b2.ReadString('\n')
- if strings.Contains(line1, ")\tTEXT\t") {
- textOffset = offset
- textLineno = lineno
- }
- offset += int64(len(line1))
- lineno++
- if err1 == io.EOF && err2 == io.EOF {
- return "no differences in debugging output"
- }
-
- if lineno == 1 || line1 == line2 && err1 == nil && err2 == nil {
- continue
- }
- // Lines are inconsistent. Worth stopping?
- for _, re := range okdiffs {
- if re.MatchString(line1) && re.MatchString(line2) {
- fmt.Fprintf(&prefix, "inconsistent log line:\n%s:%d:\n\t%s\n%s:%d:\n\t%s\n\n",
- f1.Name(), lineno, strings.TrimSuffix(line1, "\n"),
- f2.Name(), lineno, strings.TrimSuffix(line2, "\n"))
- continue Reading
- }
- }
-
- if err1 != nil {
- line1 = err1.Error()
- }
- if err2 != nil {
- line2 = err2.Error()
- }
- break
- }
-
- msg := fmt.Sprintf("inconsistent log line:\n%s:%d:\n\t%s\n%s:%d:\n\t%s",
- f1.Name(), lineno, strings.TrimSuffix(line1, "\n"),
- f2.Name(), lineno, strings.TrimSuffix(line2, "\n"))
-
- if m := hexDumpRE.FindStringSubmatch(line1); m != nil {
- target, err := strconv.ParseUint(m[1], 0, 64)
- if err != nil {
- goto Skip
- }
-
- m2 := hexDumpRE.FindStringSubmatch(line2)
- if m2 == nil {
- goto Skip
- }
-
- fields1 := strings.Fields(m[2])
- fields2 := strings.Fields(m2[2])
- i := 0
- for i < len(fields1) && i < len(fields2) && fields1[i] == fields2[i] {
- i++
- }
- target += uint64(i)
-
- f1.Seek(textOffset, 0)
- b1 = bufio.NewReader(f1)
- last := ""
- lineno := textLineno
- limitAddr := uint64(0)
- lastAddr := uint64(0)
- for {
- line1, err1 := b1.ReadString('\n')
- if err1 != nil {
- break
- }
- lineno++
- if m := listingRE.FindStringSubmatch(line1); m != nil {
- addr, _ := strconv.ParseUint(m[1], 0, 64)
- if addr > target {
- limitAddr = addr
- break
- }
- last = line1
- lastAddr = addr
- } else if hexDumpRE.FindStringSubmatch(line1) != nil {
- break
- }
- }
- if last != "" {
- msg = fmt.Sprintf("assembly instruction at %#04x-%#04x:\n%s:%d\n\t%s\n\n%s",
- lastAddr, limitAddr, f1.Name(), lineno-1, strings.TrimSuffix(last, "\n"), msg)
- }
- }
-Skip:
-
- return prefix.String() + msg
-}
diff --git a/vendor/golang.org/x/tools/cmd/toolstash/main.go b/vendor/golang.org/x/tools/cmd/toolstash/main.go
deleted file mode 100644
index da56361..0000000
--- a/vendor/golang.org/x/tools/cmd/toolstash/main.go
+++ /dev/null
@@ -1,637 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Toolstash provides a way to save, run, and restore a known good copy of the Go toolchain
-// and to compare the object files generated by two toolchains.
-//
-// Usage:
-//
-// toolstash [-n] [-v] save [tool...]
-// toolstash [-n] [-v] restore [tool...]
-// toolstash [-n] [-v] [-t] go run x.go
-// toolstash [-n] [-v] [-t] [-cmp] compile x.go
-//
-// The toolstash command manages a ``stashed'' copy of the Go toolchain
-// kept in $GOROOT/pkg/toolstash. In this case, the toolchain means the
-// tools available with the 'go tool' command as well as the go, godoc, and gofmt
-// binaries.
-//
-// The command ``toolstash save'', typically run when the toolchain is known to be working,
-// copies the toolchain from its installed location to the toolstash directory.
-// Its inverse, ``toolchain restore'', typically run when the toolchain is known to be broken,
-// copies the toolchain from the toolstash directory back to the installed locations.
-// If additional arguments are given, the save or restore applies only to the named tools.
-// Otherwise, it applies to all tools.
-//
-// Otherwise, toolstash's arguments should be a command line beginning with the
-// name of a toolchain binary, which may be a short name like compile or a complete path
-// to an installed binary. Toolstash runs the command line using the stashed
-// copy of the binary instead of the installed one.
-//
-// The -n flag causes toolstash to print the commands that would be executed
-// but not execute them. The combination -n -cmp shows the two commands
-// that would be compared and then exits successfully. A real -cmp run might
-// run additional commands for diagnosis of an output mismatch.
-//
-// The -v flag causes toolstash to print the commands being executed.
-//
-// The -t flag causes toolstash to print the time elapsed during while the
-// command ran.
-//
-// Comparing
-//
-// The -cmp flag causes toolstash to run both the installed and the stashed
-// copy of an assembler or compiler and check that they produce identical
-// object files. If not, toolstash reports the mismatch and exits with a failure status.
-// As part of reporting the mismatch, toolstash reinvokes the command with
-// the -S flag and identifies the first divergence in the assembly output.
-// If the command is a Go compiler, toolstash also determines whether the
-// difference is triggered by optimization passes.
-// On failure, toolstash leaves additional information in files named
-// similarly to the default output file. If the compilation would normally
-// produce a file x.6, the output from the stashed tool is left in x.6.stash
-// and the debugging traces are left in x.6.log and x.6.stash.log.
-//
-// The -cmp flag is a no-op when the command line is not invoking an
-// assembler or compiler.
-//
-// For example, when working on code cleanup that should not affect
-// compiler output, toolstash can be used to compare the old and new
-// compiler output:
-//
-// toolstash save
-//
-// go tool dist install cmd/compile # install compiler only
-// toolstash -cmp compile x.go
-//
-// Go Command Integration
-//
-// The go command accepts a -toolexec flag that specifies a program
-// to use to run the build tools.
-//
-// To build with the stashed tools:
-//
-// go build -toolexec toolstash x.go
-//
-// To build with the stashed go command and the stashed tools:
-//
-// toolstash go build -toolexec toolstash x.go
-//
-// To verify that code cleanup in the compilers does not make any
-// changes to the objects being generated for the entire tree:
-//
-// # Build working tree and save tools.
-// ./make.bash
-// toolstash save
-//
-//
-//
-// # Install new tools, but do not rebuild the rest of tree,
-// # since the compilers might generate buggy code.
-// go tool dist install cmd/compile
-//
-// # Check that new tools behave identically to saved tools.
-// go build -toolexec 'toolstash -cmp' -a std
-//
-// # If not, restore, in order to keep working on Go code.
-// toolstash restore
-//
-// Version Skew
-//
-// The Go tools write the current Go version to object files, and (outside
-// release branches) that version includes the hash and time stamp
-// of the most recent Git commit. Functionally equivalent
-// compilers built at different Git versions may produce object files that
-// differ only in the recorded version. Toolstash ignores version mismatches
-// when comparing object files, but the standard tools will refuse to compile
-// or link together packages with different object versions.
-//
-// For the full build in the final example above to work, both the stashed
-// and the installed tools must use the same version string.
-// One way to ensure this is not to commit any of the changes being
-// tested, so that the Git HEAD hash is the same for both builds.
-// A more robust way to force the tools to have the same version string
-// is to write a $GOROOT/VERSION file, which overrides the Git-based version
-// computation:
-//
-// echo devel >$GOROOT/VERSION
-//
-// The version can be arbitrary text, but to pass all.bash's API check, it must
-// contain the substring ``devel''. The VERSION file must be created before
-// building either version of the toolchain.
-//
-package main // import "golang.org/x/tools/cmd/toolstash"
-
-import (
- "bufio"
- "flag"
- "fmt"
- "io"
- "io/ioutil"
- "log"
- "os"
- "os/exec"
- "path/filepath"
- "runtime"
- "strings"
- "time"
-)
-
-var usageMessage = `usage: toolstash [-n] [-v] [-cmp] command line
-
-Examples:
- toolstash save
- toolstash restore
- toolstash go run x.go
- toolstash compile x.go
- toolstash -cmp compile x.go
-
-For details, godoc golang.org/x/tools/cmd/toolstash
-`
-
-func usage() {
- fmt.Fprint(os.Stderr, usageMessage)
- os.Exit(2)
-}
-
-var (
- goCmd = flag.String("go", "go", "path to \"go\" command")
- norun = flag.Bool("n", false, "print but do not run commands")
- verbose = flag.Bool("v", false, "print commands being run")
- cmp = flag.Bool("cmp", false, "compare tool object files")
- timing = flag.Bool("t", false, "print time commands take")
-)
-
-var (
- cmd []string
- tool string // name of tool: "go", "compile", etc
- toolStash string // path to stashed tool
-
- goroot string
- toolDir string
- stashDir string
- binDir string
-)
-
-func canCmp(name string, args []string) bool {
- switch name {
- case "asm", "compile", "link":
- if len(args) == 1 && (args[0] == "-V" || strings.HasPrefix(args[0], "-V=")) {
- // cmd/go uses "compile -V=full" to query the tool's build ID.
- return false
- }
- return true
- }
- return len(name) == 2 && '0' <= name[0] && name[0] <= '9' && (name[1] == 'a' || name[1] == 'g' || name[1] == 'l')
-}
-
-var binTools = []string{"go", "godoc", "gofmt"}
-
-func isBinTool(name string) bool {
- return strings.HasPrefix(name, "go")
-}
-
-func main() {
- log.SetFlags(0)
- log.SetPrefix("toolstash: ")
-
- flag.Usage = usage
- flag.Parse()
- cmd = flag.Args()
-
- if len(cmd) < 1 {
- usage()
- }
-
- s, err := exec.Command(*goCmd, "env", "GOROOT").CombinedOutput()
- if err != nil {
- log.Fatalf("%s env GOROOT: %v", *goCmd, err)
- }
- goroot = strings.TrimSpace(string(s))
- toolDir = filepath.Join(goroot, fmt.Sprintf("pkg/tool/%s_%s", runtime.GOOS, runtime.GOARCH))
- stashDir = filepath.Join(goroot, "pkg/toolstash")
-
- binDir = os.Getenv("GOBIN")
- if binDir == "" {
- binDir = filepath.Join(goroot, "bin")
- }
-
- switch cmd[0] {
- case "save":
- save()
- return
-
- case "restore":
- restore()
- return
- }
-
- tool = cmd[0]
- if i := strings.LastIndexAny(tool, `/\`); i >= 0 {
- tool = tool[i+1:]
- }
-
- if !strings.HasPrefix(tool, "a.out") {
- toolStash = filepath.Join(stashDir, tool)
- if _, err := os.Stat(toolStash); err != nil {
- log.Print(err)
- os.Exit(2)
- }
-
- if *cmp && canCmp(tool, cmd[1:]) {
- compareTool()
- return
- }
- cmd[0] = toolStash
- }
-
- if *norun {
- fmt.Printf("%s\n", strings.Join(cmd, " "))
- return
- }
- if *verbose {
- log.Print(strings.Join(cmd, " "))
- }
- xcmd := exec.Command(cmd[0], cmd[1:]...)
- xcmd.Stdin = os.Stdin
- xcmd.Stdout = os.Stdout
- xcmd.Stderr = os.Stderr
- err = xcmd.Run()
- if err != nil {
- log.Fatal(err)
- }
- os.Exit(0)
-}
-
-func compareTool() {
- if !strings.Contains(cmd[0], "/") && !strings.Contains(cmd[0], `\`) {
- cmd[0] = filepath.Join(toolDir, tool)
- }
-
- outfile, ok := cmpRun(false, cmd)
- if ok {
- os.Remove(outfile + ".stash")
- return
- }
-
- extra := "-S"
- switch {
- default:
- log.Fatalf("unknown tool %s", tool)
-
- case tool == "compile" || strings.HasSuffix(tool, "g"): // compiler
- useDashN := true
- dashcIndex := -1
- for i, s := range cmd {
- if s == "-+" {
- // Compiling runtime. Don't use -N.
- useDashN = false
- }
- if strings.HasPrefix(s, "-c=") {
- dashcIndex = i
- }
- }
- cmdN := injectflags(cmd, nil, useDashN)
- _, ok := cmpRun(false, cmdN)
- if !ok {
- if useDashN {
- log.Printf("compiler output differs, with optimizers disabled (-N)")
- } else {
- log.Printf("compiler output differs")
- }
- if dashcIndex >= 0 {
- cmd[dashcIndex] = "-c=1"
- }
- cmd = injectflags(cmd, []string{"-v", "-m=2"}, useDashN)
- break
- }
- if dashcIndex >= 0 {
- cmd[dashcIndex] = "-c=1"
- }
- cmd = injectflags(cmd, []string{"-v", "-m=2"}, false)
- log.Printf("compiler output differs, only with optimizers enabled")
-
- case tool == "asm" || strings.HasSuffix(tool, "a"): // assembler
- log.Printf("assembler output differs")
-
- case tool == "link" || strings.HasSuffix(tool, "l"): // linker
- log.Printf("linker output differs")
- extra = "-v=2"
- }
-
- cmdS := injectflags(cmd, []string{extra}, false)
- outfile, _ = cmpRun(true, cmdS)
-
- fmt.Fprintf(os.Stderr, "\n%s\n", compareLogs(outfile))
- os.Exit(2)
-}
-
-func injectflags(cmd []string, extra []string, addDashN bool) []string {
- x := []string{cmd[0]}
- if addDashN {
- x = append(x, "-N")
- }
- x = append(x, extra...)
- x = append(x, cmd[1:]...)
- return x
-}
-
-func cmpRun(keepLog bool, cmd []string) (outfile string, match bool) {
- cmdStash := make([]string, len(cmd))
- copy(cmdStash, cmd)
- cmdStash[0] = toolStash
- for i, arg := range cmdStash {
- if arg == "-o" {
- outfile = cmdStash[i+1]
- cmdStash[i+1] += ".stash"
- break
- }
- if strings.HasSuffix(arg, ".s") || strings.HasSuffix(arg, ".go") && '0' <= tool[0] && tool[0] <= '9' {
- outfile = filepath.Base(arg[:strings.LastIndex(arg, ".")] + "." + tool[:1])
- cmdStash = append([]string{cmdStash[0], "-o", outfile + ".stash"}, cmdStash[1:]...)
- break
- }
- }
-
- if outfile == "" {
- log.Fatalf("cannot determine output file for command: %s", strings.Join(cmd, " "))
- }
-
- if *norun {
- fmt.Printf("%s\n", strings.Join(cmd, " "))
- fmt.Printf("%s\n", strings.Join(cmdStash, " "))
- os.Exit(0)
- }
-
- out, err := runCmd(cmd, keepLog, outfile+".log")
- if err != nil {
- log.Printf("running: %s", strings.Join(cmd, " "))
- os.Stderr.Write(out)
- log.Fatal(err)
- }
-
- outStash, err := runCmd(cmdStash, keepLog, outfile+".stash.log")
- if err != nil {
- log.Printf("running: %s", strings.Join(cmdStash, " "))
- log.Printf("installed tool succeeded but stashed tool failed.\n")
- if len(out) > 0 {
- log.Printf("installed tool output:")
- os.Stderr.Write(out)
- }
- if len(outStash) > 0 {
- log.Printf("stashed tool output:")
- os.Stderr.Write(outStash)
- }
- log.Fatal(err)
- }
-
- return outfile, sameObject(outfile, outfile+".stash")
-}
-
-func sameObject(file1, file2 string) bool {
- f1, err := os.Open(file1)
- if err != nil {
- log.Fatal(err)
- }
- defer f1.Close()
-
- f2, err := os.Open(file2)
- if err != nil {
- log.Fatal(err)
- }
- defer f2.Close()
-
- b1 := bufio.NewReader(f1)
- b2 := bufio.NewReader(f2)
-
- // Go object files and archives contain lines of the form
- // go object
- // By default, the version on development branches includes
- // the Git hash and time stamp for the most recent commit.
- // We allow the versions to differ.
- if !skipVersion(b1, b2, file1, file2) {
- return false
- }
-
- lastByte := byte(0)
- for {
- c1, err1 := b1.ReadByte()
- c2, err2 := b2.ReadByte()
- if err1 == io.EOF && err2 == io.EOF {
- return true
- }
- if err1 != nil {
- log.Fatalf("reading %s: %v", file1, err1)
- }
- if err2 != nil {
- log.Fatalf("reading %s: %v", file2, err1)
- }
- if c1 != c2 {
- return false
- }
- if lastByte == '`' && c1 == '\n' {
- if !skipVersion(b1, b2, file1, file2) {
- return false
- }
- }
- lastByte = c1
- }
-}
-
-func skipVersion(b1, b2 *bufio.Reader, file1, file2 string) bool {
- // Consume "go object " prefix, if there.
- prefix := "go object "
- for i := 0; i < len(prefix); i++ {
- c1, err1 := b1.ReadByte()
- c2, err2 := b2.ReadByte()
- if err1 == io.EOF && err2 == io.EOF {
- return true
- }
- if err1 != nil {
- log.Fatalf("reading %s: %v", file1, err1)
- }
- if err2 != nil {
- log.Fatalf("reading %s: %v", file2, err1)
- }
- if c1 != c2 {
- return false
- }
- if c1 != prefix[i] {
- return true // matching bytes, just not a version
- }
- }
-
- // Keep comparing until second space.
- // Must continue to match.
- // If we see a \n, it's not a version string after all.
- for numSpace := 0; numSpace < 2; {
- c1, err1 := b1.ReadByte()
- c2, err2 := b2.ReadByte()
- if err1 == io.EOF && err2 == io.EOF {
- return true
- }
- if err1 != nil {
- log.Fatalf("reading %s: %v", file1, err1)
- }
- if err2 != nil {
- log.Fatalf("reading %s: %v", file2, err1)
- }
- if c1 != c2 {
- return false
- }
- if c1 == '\n' {
- return true
- }
- if c1 == ' ' {
- numSpace++
- }
- }
-
- // Have now seen 'go object goos goarch ' in both files.
- // Now they're allowed to diverge, until the \n, which
- // must be present.
- for {
- c1, err1 := b1.ReadByte()
- if err1 == io.EOF {
- log.Fatalf("reading %s: unexpected EOF", file1)
- }
- if err1 != nil {
- log.Fatalf("reading %s: %v", file1, err1)
- }
- if c1 == '\n' {
- break
- }
- }
- for {
- c2, err2 := b2.ReadByte()
- if err2 == io.EOF {
- log.Fatalf("reading %s: unexpected EOF", file2)
- }
- if err2 != nil {
- log.Fatalf("reading %s: %v", file2, err2)
- }
- if c2 == '\n' {
- break
- }
- }
-
- // Consumed "matching" versions from both.
- return true
-}
-
-func runCmd(cmd []string, keepLog bool, logName string) (output []byte, err error) {
- if *verbose {
- log.Print(strings.Join(cmd, " "))
- }
-
- if *timing {
- t0 := time.Now()
- defer func() {
- log.Printf("%.3fs elapsed # %s\n", time.Since(t0).Seconds(), strings.Join(cmd, " "))
- }()
- }
-
- xcmd := exec.Command(cmd[0], cmd[1:]...)
- if !keepLog {
- return xcmd.CombinedOutput()
- }
-
- f, err := os.Create(logName)
- if err != nil {
- log.Fatal(err)
- }
- fmt.Fprintf(f, "GOOS=%s GOARCH=%s %s\n", os.Getenv("GOOS"), os.Getenv("GOARCH"), strings.Join(cmd, " "))
- xcmd.Stdout = f
- xcmd.Stderr = f
- defer f.Close()
- return nil, xcmd.Run()
-}
-
-func save() {
- if err := os.MkdirAll(stashDir, 0777); err != nil {
- log.Fatal(err)
- }
-
- toolDir := filepath.Join(goroot, fmt.Sprintf("pkg/tool/%s_%s", runtime.GOOS, runtime.GOARCH))
- files, err := ioutil.ReadDir(toolDir)
- if err != nil {
- log.Fatal(err)
- }
-
- for _, file := range files {
- if shouldSave(file.Name()) && file.Mode().IsRegular() {
- cp(filepath.Join(toolDir, file.Name()), filepath.Join(stashDir, file.Name()))
- }
- }
-
- for _, name := range binTools {
- if !shouldSave(name) {
- continue
- }
- src := filepath.Join(binDir, name)
- if _, err := os.Stat(src); err == nil {
- cp(src, filepath.Join(stashDir, name))
- }
- }
-
- checkShouldSave()
-}
-
-func restore() {
- files, err := ioutil.ReadDir(stashDir)
- if err != nil {
- log.Fatal(err)
- }
-
- for _, file := range files {
- if shouldSave(file.Name()) && file.Mode().IsRegular() {
- targ := toolDir
- if isBinTool(file.Name()) {
- targ = binDir
- }
- cp(filepath.Join(stashDir, file.Name()), filepath.Join(targ, file.Name()))
- }
- }
-
- checkShouldSave()
-}
-
-func shouldSave(name string) bool {
- if len(cmd) == 1 {
- return true
- }
- ok := false
- for i, arg := range cmd {
- if i > 0 && name == arg {
- ok = true
- cmd[i] = "DONE"
- }
- }
- return ok
-}
-
-func checkShouldSave() {
- var missing []string
- for _, arg := range cmd[1:] {
- if arg != "DONE" {
- missing = append(missing, arg)
- }
- }
- if len(missing) > 0 {
- log.Fatalf("%s did not find tools: %s", cmd[0], strings.Join(missing, " "))
- }
-}
-
-func cp(src, dst string) {
- if *verbose {
- fmt.Printf("cp %s %s\n", src, dst)
- }
- data, err := ioutil.ReadFile(src)
- if err != nil {
- log.Fatal(err)
- }
- if err := ioutil.WriteFile(dst, data, 0777); err != nil {
- log.Fatal(err)
- }
-}
diff --git a/vendor/golang.org/x/tools/codereview.cfg b/vendor/golang.org/x/tools/codereview.cfg
deleted file mode 100644
index 3f8b14b..0000000
--- a/vendor/golang.org/x/tools/codereview.cfg
+++ /dev/null
@@ -1 +0,0 @@
-issuerepo: golang/go
diff --git a/vendor/golang.org/x/tools/container/intsets/popcnt_amd64.go b/vendor/golang.org/x/tools/container/intsets/popcnt_amd64.go
deleted file mode 100644
index 99ea813..0000000
--- a/vendor/golang.org/x/tools/container/intsets/popcnt_amd64.go
+++ /dev/null
@@ -1,20 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build amd64,!appengine,!gccgo
-
-package intsets
-
-func popcnt(x word) int
-func havePOPCNT() bool
-
-var hasPOPCNT = havePOPCNT()
-
-// popcount returns the population count (number of set bits) of x.
-func popcount(x word) int {
- if hasPOPCNT {
- return popcnt(x)
- }
- return popcountTable(x) // faster than Hacker's Delight
-}
diff --git a/vendor/golang.org/x/tools/container/intsets/popcnt_amd64.s b/vendor/golang.org/x/tools/container/intsets/popcnt_amd64.s
deleted file mode 100644
index 05c3d6f..0000000
--- a/vendor/golang.org/x/tools/container/intsets/popcnt_amd64.s
+++ /dev/null
@@ -1,30 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build amd64,!appengine,!gccgo
-
-#include "textflag.h"
-
-// func havePOPCNT() bool
-TEXT ·havePOPCNT(SB),4,$0
- MOVQ $1, AX
- CPUID
- SHRQ $23, CX
- ANDQ $1, CX
- MOVB CX, ret+0(FP)
- RET
-
-// func popcnt(word) int
-TEXT ·popcnt(SB),NOSPLIT,$0-8
- XORQ AX, AX
- MOVQ x+0(FP), SI
- // POPCNT (SI), AX is not recognized by Go assembler,
- // so we assemble it ourselves.
- BYTE $0xf3
- BYTE $0x48
- BYTE $0x0f
- BYTE $0xb8
- BYTE $0xc6
- MOVQ AX, ret+8(FP)
- RET
diff --git a/vendor/golang.org/x/tools/container/intsets/popcnt_gccgo.go b/vendor/golang.org/x/tools/container/intsets/popcnt_gccgo.go
deleted file mode 100644
index 82a8875..0000000
--- a/vendor/golang.org/x/tools/container/intsets/popcnt_gccgo.go
+++ /dev/null
@@ -1,9 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build gccgo
-
-package intsets
-
-func popcount(x word) int
diff --git a/vendor/golang.org/x/tools/container/intsets/popcnt_gccgo_c.c b/vendor/golang.org/x/tools/container/intsets/popcnt_gccgo_c.c
deleted file mode 100644
index 08abb32..0000000
--- a/vendor/golang.org/x/tools/container/intsets/popcnt_gccgo_c.c
+++ /dev/null
@@ -1,19 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build gccgo
-
-#include
-#include
-#include
-
-#define _STRINGIFY2_(x) #x
-#define _STRINGIFY_(x) _STRINGIFY2_(x)
-#define GOSYM_PREFIX _STRINGIFY_(__USER_LABEL_PREFIX__)
-
-extern intptr_t popcount(uintptr_t x) __asm__(GOSYM_PREFIX GOPKGPATH ".popcount");
-
-intptr_t popcount(uintptr_t x) {
- return __builtin_popcountl((unsigned long)(x));
-}
diff --git a/vendor/golang.org/x/tools/container/intsets/popcnt_generic.go b/vendor/golang.org/x/tools/container/intsets/popcnt_generic.go
deleted file mode 100644
index 3985a1d..0000000
--- a/vendor/golang.org/x/tools/container/intsets/popcnt_generic.go
+++ /dev/null
@@ -1,33 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build !amd64 appengine
-// +build !gccgo
-
-package intsets
-
-import "runtime"
-
-// We compared three algorithms---Hacker's Delight, table lookup,
-// and AMD64's SSE4.1 hardware POPCNT---on a 2.67GHz Xeon X5550.
-//
-// % GOARCH=amd64 go test -run=NONE -bench=Popcount
-// POPCNT 5.12 ns/op
-// Table 8.53 ns/op
-// HackersDelight 9.96 ns/op
-//
-// % GOARCH=386 go test -run=NONE -bench=Popcount
-// Table 10.4 ns/op
-// HackersDelight 5.23 ns/op
-//
-// (AMD64's ABM1 hardware supports ntz and nlz too,
-// but they aren't critical.)
-
-// popcount returns the population count (number of set bits) of x.
-func popcount(x word) int {
- if runtime.GOARCH == "386" {
- return popcountHD(uint32(x))
- }
- return popcountTable(x)
-}
diff --git a/vendor/golang.org/x/tools/container/intsets/sparse.go b/vendor/golang.org/x/tools/container/intsets/sparse.go
deleted file mode 100644
index 5db01c1..0000000
--- a/vendor/golang.org/x/tools/container/intsets/sparse.go
+++ /dev/null
@@ -1,1091 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Package intsets provides Sparse, a compact and fast representation
-// for sparse sets of int values.
-//
-// The time complexity of the operations Len, Insert, Remove and Has
-// is in O(n) but in practice those methods are faster and more
-// space-efficient than equivalent operations on sets based on the Go
-// map type. The IsEmpty, Min, Max, Clear and TakeMin operations
-// require constant time.
-//
-package intsets // import "golang.org/x/tools/container/intsets"
-
-// TODO(adonovan):
-// - Add InsertAll(...int), RemoveAll(...int)
-// - Add 'bool changed' results for {Intersection,Difference}With too.
-//
-// TODO(adonovan): implement Dense, a dense bit vector with a similar API.
-// The space usage would be proportional to Max(), not Len(), and the
-// implementation would be based upon big.Int.
-//
-// TODO(adonovan): opt: make UnionWith and Difference faster.
-// These are the hot-spots for go/pointer.
-
-import (
- "bytes"
- "fmt"
-)
-
-// A Sparse is a set of int values.
-// Sparse operations (even queries) are not concurrency-safe.
-//
-// The zero value for Sparse is a valid empty set.
-//
-// Sparse sets must be copied using the Copy method, not by assigning
-// a Sparse value.
-//
-type Sparse struct {
- // An uninitialized Sparse represents an empty set.
- // An empty set may also be represented by
- // root.next == root.prev == &root.
- //
- // The root is always the block with the smallest offset.
- // It can be empty, but only if it is the only block; in that case, offset is
- // MaxInt (which is not a valid offset).
- root block
-}
-
-type word uintptr
-
-const (
- _m = ^word(0)
- bitsPerWord = 8 << (_m>>8&1 + _m>>16&1 + _m>>32&1)
- bitsPerBlock = 256 // optimal value for go/pointer solver performance
- wordsPerBlock = bitsPerBlock / bitsPerWord
-)
-
-// Limit values of implementation-specific int type.
-const (
- MaxInt = int(^uint(0) >> 1)
- MinInt = -MaxInt - 1
-)
-
-// -- block ------------------------------------------------------------
-
-// A set is represented as a circular doubly-linked list of blocks,
-// each containing an offset and a bit array of fixed size
-// bitsPerBlock; the blocks are ordered by increasing offset.
-//
-// The set contains an element x iff the block whose offset is x - (x
-// mod bitsPerBlock) has the bit (x mod bitsPerBlock) set, where mod
-// is the Euclidean remainder.
-//
-// A block may only be empty transiently.
-//
-type block struct {
- offset int // offset mod bitsPerBlock == 0
- bits [wordsPerBlock]word // contains at least one set bit
- next, prev *block // doubly-linked list of blocks
-}
-
-// wordMask returns the word index (in block.bits)
-// and single-bit mask for the block's ith bit.
-func wordMask(i uint) (w uint, mask word) {
- w = i / bitsPerWord
- mask = 1 << (i % bitsPerWord)
- return
-}
-
-// insert sets the block b's ith bit and
-// returns true if it was not already set.
-//
-func (b *block) insert(i uint) bool {
- w, mask := wordMask(i)
- if b.bits[w]&mask == 0 {
- b.bits[w] |= mask
- return true
- }
- return false
-}
-
-// remove clears the block's ith bit and
-// returns true if the bit was previously set.
-// NB: may leave the block empty.
-//
-func (b *block) remove(i uint) bool {
- w, mask := wordMask(i)
- if b.bits[w]&mask != 0 {
- b.bits[w] &^= mask
- return true
- }
- return false
-}
-
-// has reports whether the block's ith bit is set.
-func (b *block) has(i uint) bool {
- w, mask := wordMask(i)
- return b.bits[w]&mask != 0
-}
-
-// empty reports whether b.len()==0, but more efficiently.
-func (b *block) empty() bool {
- for _, w := range b.bits {
- if w != 0 {
- return false
- }
- }
- return true
-}
-
-// len returns the number of set bits in block b.
-func (b *block) len() int {
- var l int
- for _, w := range b.bits {
- l += popcount(w)
- }
- return l
-}
-
-// max returns the maximum element of the block.
-// The block must not be empty.
-func (b *block) max() int {
- bi := b.offset + bitsPerBlock
- // Decrement bi by number of high zeros in last.bits.
- for i := len(b.bits) - 1; i >= 0; i-- {
- if w := b.bits[i]; w != 0 {
- return bi - nlz(w) - 1
- }
- bi -= bitsPerWord
- }
- panic("BUG: empty block")
-}
-
-// min returns the minimum element of the block,
-// and also removes it if take is set.
-// The block must not be initially empty.
-// NB: may leave the block empty.
-func (b *block) min(take bool) int {
- for i, w := range b.bits {
- if w != 0 {
- tz := ntz(w)
- if take {
- b.bits[i] = w &^ (1 << uint(tz))
- }
- return b.offset + int(i*bitsPerWord) + tz
- }
- }
- panic("BUG: empty block")
-}
-
-// lowerBound returns the smallest element of the block that is greater than or
-// equal to the element corresponding to the ith bit. If there is no such
-// element, the second return value is false.
-func (b *block) lowerBound(i uint) (int, bool) {
- w := i / bitsPerWord
- bit := i % bitsPerWord
-
- if val := b.bits[w] >> bit; val != 0 {
- return b.offset + int(i) + ntz(val), true
- }
-
- for w++; w < wordsPerBlock; w++ {
- if val := b.bits[w]; val != 0 {
- return b.offset + int(w*bitsPerWord) + ntz(val), true
- }
- }
-
- return 0, false
-}
-
-// forEach calls f for each element of block b.
-// f must not mutate b's enclosing Sparse.
-func (b *block) forEach(f func(int)) {
- for i, w := range b.bits {
- offset := b.offset + i*bitsPerWord
- for bi := 0; w != 0 && bi < bitsPerWord; bi++ {
- if w&1 != 0 {
- f(offset)
- }
- offset++
- w >>= 1
- }
- }
-}
-
-// offsetAndBitIndex returns the offset of the block that would
-// contain x and the bit index of x within that block.
-//
-func offsetAndBitIndex(x int) (int, uint) {
- mod := x % bitsPerBlock
- if mod < 0 {
- // Euclidean (non-negative) remainder
- mod += bitsPerBlock
- }
- return x - mod, uint(mod)
-}
-
-// -- Sparse --------------------------------------------------------------
-
-// none is a shared, empty, sentinel block that indicates the end of a block
-// list.
-var none block
-
-// Dummy type used to generate an implicit panic. This must be defined at the
-// package level; if it is defined inside a function, it prevents the inlining
-// of that function.
-type to_copy_a_sparse_you_must_call_its_Copy_method struct{}
-
-// init ensures s is properly initialized.
-func (s *Sparse) init() {
- root := &s.root
- if root.next == nil {
- root.offset = MaxInt
- root.next = root
- root.prev = root
- } else if root.next.prev != root {
- // Copying a Sparse x leads to pernicious corruption: the
- // new Sparse y shares the old linked list, but iteration
- // on y will never encounter &y.root so it goes into a
- // loop. Fail fast before this occurs.
- // We don't want to call panic here because it prevents the
- // inlining of this function.
- _ = (interface{}(nil)).(to_copy_a_sparse_you_must_call_its_Copy_method)
- }
-}
-
-func (s *Sparse) first() *block {
- s.init()
- if s.root.offset == MaxInt {
- return &none
- }
- return &s.root
-}
-
-// next returns the next block in the list, or end if b is the last block.
-func (s *Sparse) next(b *block) *block {
- if b.next == &s.root {
- return &none
- }
- return b.next
-}
-
-// prev returns the previous block in the list, or end if b is the first block.
-func (s *Sparse) prev(b *block) *block {
- if b.prev == &s.root {
- return &none
- }
- return b.prev
-}
-
-// IsEmpty reports whether the set s is empty.
-func (s *Sparse) IsEmpty() bool {
- return s.root.next == nil || s.root.offset == MaxInt
-}
-
-// Len returns the number of elements in the set s.
-func (s *Sparse) Len() int {
- var l int
- for b := s.first(); b != &none; b = s.next(b) {
- l += b.len()
- }
- return l
-}
-
-// Max returns the maximum element of the set s, or MinInt if s is empty.
-func (s *Sparse) Max() int {
- if s.IsEmpty() {
- return MinInt
- }
- return s.root.prev.max()
-}
-
-// Min returns the minimum element of the set s, or MaxInt if s is empty.
-func (s *Sparse) Min() int {
- if s.IsEmpty() {
- return MaxInt
- }
- return s.root.min(false)
-}
-
-// LowerBound returns the smallest element >= x, or MaxInt if there is no such
-// element.
-func (s *Sparse) LowerBound(x int) int {
- offset, i := offsetAndBitIndex(x)
- for b := s.first(); b != &none; b = s.next(b) {
- if b.offset > offset {
- return b.min(false)
- }
- if b.offset == offset {
- if y, ok := b.lowerBound(i); ok {
- return y
- }
- }
- }
- return MaxInt
-}
-
-// block returns the block that would contain offset,
-// or nil if s contains no such block.
-// Precondition: offset is a multiple of bitsPerBlock.
-func (s *Sparse) block(offset int) *block {
- for b := s.first(); b != &none && b.offset <= offset; b = s.next(b) {
- if b.offset == offset {
- return b
- }
- }
- return nil
-}
-
-// Insert adds x to the set s, and reports whether the set grew.
-func (s *Sparse) Insert(x int) bool {
- offset, i := offsetAndBitIndex(x)
-
- b := s.first()
- for ; b != &none && b.offset <= offset; b = s.next(b) {
- if b.offset == offset {
- return b.insert(i)
- }
- }
-
- // Insert new block before b.
- new := s.insertBlockBefore(b)
- new.offset = offset
- return new.insert(i)
-}
-
-// removeBlock removes a block and returns the block that followed it (or end if
-// it was the last block).
-func (s *Sparse) removeBlock(b *block) *block {
- if b != &s.root {
- b.prev.next = b.next
- b.next.prev = b.prev
- if b.next == &s.root {
- return &none
- }
- return b.next
- }
-
- first := s.root.next
- if first == &s.root {
- // This was the only block.
- s.Clear()
- return &none
- }
- s.root.offset = first.offset
- s.root.bits = first.bits
- if first.next == &s.root {
- // Single block remaining.
- s.root.next = &s.root
- s.root.prev = &s.root
- } else {
- s.root.next = first.next
- first.next.prev = &s.root
- }
- return &s.root
-}
-
-// Remove removes x from the set s, and reports whether the set shrank.
-func (s *Sparse) Remove(x int) bool {
- offset, i := offsetAndBitIndex(x)
- if b := s.block(offset); b != nil {
- if !b.remove(i) {
- return false
- }
- if b.empty() {
- s.removeBlock(b)
- }
- return true
- }
- return false
-}
-
-// Clear removes all elements from the set s.
-func (s *Sparse) Clear() {
- s.root = block{
- offset: MaxInt,
- next: &s.root,
- prev: &s.root,
- }
-}
-
-// If set s is non-empty, TakeMin sets *p to the minimum element of
-// the set s, removes that element from the set and returns true.
-// Otherwise, it returns false and *p is undefined.
-//
-// This method may be used for iteration over a worklist like so:
-//
-// var x int
-// for worklist.TakeMin(&x) { use(x) }
-//
-func (s *Sparse) TakeMin(p *int) bool {
- if s.IsEmpty() {
- return false
- }
- *p = s.root.min(true)
- if s.root.empty() {
- s.removeBlock(&s.root)
- }
- return true
-}
-
-// Has reports whether x is an element of the set s.
-func (s *Sparse) Has(x int) bool {
- offset, i := offsetAndBitIndex(x)
- if b := s.block(offset); b != nil {
- return b.has(i)
- }
- return false
-}
-
-// forEach applies function f to each element of the set s in order.
-//
-// f must not mutate s. Consequently, forEach is not safe to expose
-// to clients. In any case, using "range s.AppendTo()" allows more
-// natural control flow with continue/break/return.
-//
-func (s *Sparse) forEach(f func(int)) {
- for b := s.first(); b != &none; b = s.next(b) {
- b.forEach(f)
- }
-}
-
-// Copy sets s to the value of x.
-func (s *Sparse) Copy(x *Sparse) {
- if s == x {
- return
- }
-
- xb := x.first()
- sb := s.first()
- for xb != &none {
- if sb == &none {
- sb = s.insertBlockBefore(sb)
- }
- sb.offset = xb.offset
- sb.bits = xb.bits
- xb = x.next(xb)
- sb = s.next(sb)
- }
- s.discardTail(sb)
-}
-
-// insertBlockBefore returns a new block, inserting it before next.
-// If next is the root, the root is replaced. If next is end, the block is
-// inserted at the end.
-func (s *Sparse) insertBlockBefore(next *block) *block {
- if s.IsEmpty() {
- if next != &none {
- panic("BUG: passed block with empty set")
- }
- return &s.root
- }
-
- if next == &s.root {
- // Special case: we need to create a new block that will become the root
- // block.The old root block becomes the second block.
- second := s.root
- s.root = block{
- next: &second,
- }
- if second.next == &s.root {
- s.root.prev = &second
- } else {
- s.root.prev = second.prev
- second.next.prev = &second
- second.prev = &s.root
- }
- return &s.root
- }
- if next == &none {
- // Insert before root.
- next = &s.root
- }
- b := new(block)
- b.next = next
- b.prev = next.prev
- b.prev.next = b
- next.prev = b
- return b
-}
-
-// discardTail removes block b and all its successors from s.
-func (s *Sparse) discardTail(b *block) {
- if b != &none {
- if b == &s.root {
- s.Clear()
- } else {
- b.prev.next = &s.root
- s.root.prev = b.prev
- }
- }
-}
-
-// IntersectionWith sets s to the intersection s ∩ x.
-func (s *Sparse) IntersectionWith(x *Sparse) {
- if s == x {
- return
- }
-
- xb := x.first()
- sb := s.first()
- for xb != &none && sb != &none {
- switch {
- case xb.offset < sb.offset:
- xb = x.next(xb)
-
- case xb.offset > sb.offset:
- sb = s.removeBlock(sb)
-
- default:
- var sum word
- for i := range sb.bits {
- r := xb.bits[i] & sb.bits[i]
- sb.bits[i] = r
- sum |= r
- }
- if sum != 0 {
- sb = s.next(sb)
- } else {
- // sb will be overwritten or removed
- }
-
- xb = x.next(xb)
- }
- }
-
- s.discardTail(sb)
-}
-
-// Intersection sets s to the intersection x ∩ y.
-func (s *Sparse) Intersection(x, y *Sparse) {
- switch {
- case s == x:
- s.IntersectionWith(y)
- return
- case s == y:
- s.IntersectionWith(x)
- return
- case x == y:
- s.Copy(x)
- return
- }
-
- xb := x.first()
- yb := y.first()
- sb := s.first()
- for xb != &none && yb != &none {
- switch {
- case xb.offset < yb.offset:
- xb = x.next(xb)
- continue
- case xb.offset > yb.offset:
- yb = y.next(yb)
- continue
- }
-
- if sb == &none {
- sb = s.insertBlockBefore(sb)
- }
- sb.offset = xb.offset
-
- var sum word
- for i := range sb.bits {
- r := xb.bits[i] & yb.bits[i]
- sb.bits[i] = r
- sum |= r
- }
- if sum != 0 {
- sb = s.next(sb)
- } else {
- // sb will be overwritten or removed
- }
-
- xb = x.next(xb)
- yb = y.next(yb)
- }
-
- s.discardTail(sb)
-}
-
-// Intersects reports whether s ∩ x ≠ ∅.
-func (s *Sparse) Intersects(x *Sparse) bool {
- sb := s.first()
- xb := x.first()
- for sb != &none && xb != &none {
- switch {
- case xb.offset < sb.offset:
- xb = x.next(xb)
- case xb.offset > sb.offset:
- sb = s.next(sb)
- default:
- for i := range sb.bits {
- if sb.bits[i]&xb.bits[i] != 0 {
- return true
- }
- }
- sb = s.next(sb)
- xb = x.next(xb)
- }
- }
- return false
-}
-
-// UnionWith sets s to the union s ∪ x, and reports whether s grew.
-func (s *Sparse) UnionWith(x *Sparse) bool {
- if s == x {
- return false
- }
-
- var changed bool
- xb := x.first()
- sb := s.first()
- for xb != &none {
- if sb != &none && sb.offset == xb.offset {
- for i := range xb.bits {
- if sb.bits[i] != xb.bits[i] {
- sb.bits[i] |= xb.bits[i]
- changed = true
- }
- }
- xb = x.next(xb)
- } else if sb == &none || sb.offset > xb.offset {
- sb = s.insertBlockBefore(sb)
- sb.offset = xb.offset
- sb.bits = xb.bits
- changed = true
-
- xb = x.next(xb)
- }
- sb = s.next(sb)
- }
- return changed
-}
-
-// Union sets s to the union x ∪ y.
-func (s *Sparse) Union(x, y *Sparse) {
- switch {
- case x == y:
- s.Copy(x)
- return
- case s == x:
- s.UnionWith(y)
- return
- case s == y:
- s.UnionWith(x)
- return
- }
-
- xb := x.first()
- yb := y.first()
- sb := s.first()
- for xb != &none || yb != &none {
- if sb == &none {
- sb = s.insertBlockBefore(sb)
- }
- switch {
- case yb == &none || (xb != &none && xb.offset < yb.offset):
- sb.offset = xb.offset
- sb.bits = xb.bits
- xb = x.next(xb)
-
- case xb == &none || (yb != &none && yb.offset < xb.offset):
- sb.offset = yb.offset
- sb.bits = yb.bits
- yb = y.next(yb)
-
- default:
- sb.offset = xb.offset
- for i := range xb.bits {
- sb.bits[i] = xb.bits[i] | yb.bits[i]
- }
- xb = x.next(xb)
- yb = y.next(yb)
- }
- sb = s.next(sb)
- }
-
- s.discardTail(sb)
-}
-
-// DifferenceWith sets s to the difference s ∖ x.
-func (s *Sparse) DifferenceWith(x *Sparse) {
- if s == x {
- s.Clear()
- return
- }
-
- xb := x.first()
- sb := s.first()
- for xb != &none && sb != &none {
- switch {
- case xb.offset > sb.offset:
- sb = s.next(sb)
-
- case xb.offset < sb.offset:
- xb = x.next(xb)
-
- default:
- var sum word
- for i := range sb.bits {
- r := sb.bits[i] & ^xb.bits[i]
- sb.bits[i] = r
- sum |= r
- }
- if sum == 0 {
- sb = s.removeBlock(sb)
- } else {
- sb = s.next(sb)
- }
- xb = x.next(xb)
- }
- }
-}
-
-// Difference sets s to the difference x ∖ y.
-func (s *Sparse) Difference(x, y *Sparse) {
- switch {
- case x == y:
- s.Clear()
- return
- case s == x:
- s.DifferenceWith(y)
- return
- case s == y:
- var y2 Sparse
- y2.Copy(y)
- s.Difference(x, &y2)
- return
- }
-
- xb := x.first()
- yb := y.first()
- sb := s.first()
- for xb != &none && yb != &none {
- if xb.offset > yb.offset {
- // y has block, x has &none
- yb = y.next(yb)
- continue
- }
-
- if sb == &none {
- sb = s.insertBlockBefore(sb)
- }
- sb.offset = xb.offset
-
- switch {
- case xb.offset < yb.offset:
- // x has block, y has &none
- sb.bits = xb.bits
-
- sb = s.next(sb)
-
- default:
- // x and y have corresponding blocks
- var sum word
- for i := range sb.bits {
- r := xb.bits[i] & ^yb.bits[i]
- sb.bits[i] = r
- sum |= r
- }
- if sum != 0 {
- sb = s.next(sb)
- } else {
- // sb will be overwritten or removed
- }
-
- yb = y.next(yb)
- }
- xb = x.next(xb)
- }
-
- for xb != &none {
- if sb == &none {
- sb = s.insertBlockBefore(sb)
- }
- sb.offset = xb.offset
- sb.bits = xb.bits
- sb = s.next(sb)
-
- xb = x.next(xb)
- }
-
- s.discardTail(sb)
-}
-
-// SymmetricDifferenceWith sets s to the symmetric difference s ∆ x.
-func (s *Sparse) SymmetricDifferenceWith(x *Sparse) {
- if s == x {
- s.Clear()
- return
- }
-
- sb := s.first()
- xb := x.first()
- for xb != &none && sb != &none {
- switch {
- case sb.offset < xb.offset:
- sb = s.next(sb)
- case xb.offset < sb.offset:
- nb := s.insertBlockBefore(sb)
- nb.offset = xb.offset
- nb.bits = xb.bits
- xb = x.next(xb)
- default:
- var sum word
- for i := range sb.bits {
- r := sb.bits[i] ^ xb.bits[i]
- sb.bits[i] = r
- sum |= r
- }
- if sum == 0 {
- sb = s.removeBlock(sb)
- } else {
- sb = s.next(sb)
- }
- xb = x.next(xb)
- }
- }
-
- for xb != &none { // append the tail of x to s
- sb = s.insertBlockBefore(sb)
- sb.offset = xb.offset
- sb.bits = xb.bits
- sb = s.next(sb)
- xb = x.next(xb)
- }
-}
-
-// SymmetricDifference sets s to the symmetric difference x ∆ y.
-func (s *Sparse) SymmetricDifference(x, y *Sparse) {
- switch {
- case x == y:
- s.Clear()
- return
- case s == x:
- s.SymmetricDifferenceWith(y)
- return
- case s == y:
- s.SymmetricDifferenceWith(x)
- return
- }
-
- sb := s.first()
- xb := x.first()
- yb := y.first()
- for xb != &none && yb != &none {
- if sb == &none {
- sb = s.insertBlockBefore(sb)
- }
- switch {
- case yb.offset < xb.offset:
- sb.offset = yb.offset
- sb.bits = yb.bits
- sb = s.next(sb)
- yb = y.next(yb)
- case xb.offset < yb.offset:
- sb.offset = xb.offset
- sb.bits = xb.bits
- sb = s.next(sb)
- xb = x.next(xb)
- default:
- var sum word
- for i := range sb.bits {
- r := xb.bits[i] ^ yb.bits[i]
- sb.bits[i] = r
- sum |= r
- }
- if sum != 0 {
- sb.offset = xb.offset
- sb = s.next(sb)
- }
- xb = x.next(xb)
- yb = y.next(yb)
- }
- }
-
- for xb != &none { // append the tail of x to s
- if sb == &none {
- sb = s.insertBlockBefore(sb)
- }
- sb.offset = xb.offset
- sb.bits = xb.bits
- sb = s.next(sb)
- xb = x.next(xb)
- }
-
- for yb != &none { // append the tail of y to s
- if sb == &none {
- sb = s.insertBlockBefore(sb)
- }
- sb.offset = yb.offset
- sb.bits = yb.bits
- sb = s.next(sb)
- yb = y.next(yb)
- }
-
- s.discardTail(sb)
-}
-
-// SubsetOf reports whether s ∖ x = ∅.
-func (s *Sparse) SubsetOf(x *Sparse) bool {
- if s == x {
- return true
- }
-
- sb := s.first()
- xb := x.first()
- for sb != &none {
- switch {
- case xb == &none || xb.offset > sb.offset:
- return false
- case xb.offset < sb.offset:
- xb = x.next(xb)
- default:
- for i := range sb.bits {
- if sb.bits[i]&^xb.bits[i] != 0 {
- return false
- }
- }
- sb = s.next(sb)
- xb = x.next(xb)
- }
- }
- return true
-}
-
-// Equals reports whether the sets s and t have the same elements.
-func (s *Sparse) Equals(t *Sparse) bool {
- if s == t {
- return true
- }
- sb := s.first()
- tb := t.first()
- for {
- switch {
- case sb == &none && tb == &none:
- return true
- case sb == &none || tb == &none:
- return false
- case sb.offset != tb.offset:
- return false
- case sb.bits != tb.bits:
- return false
- }
-
- sb = s.next(sb)
- tb = t.next(tb)
- }
-}
-
-// String returns a human-readable description of the set s.
-func (s *Sparse) String() string {
- var buf bytes.Buffer
- buf.WriteByte('{')
- s.forEach(func(x int) {
- if buf.Len() > 1 {
- buf.WriteByte(' ')
- }
- fmt.Fprintf(&buf, "%d", x)
- })
- buf.WriteByte('}')
- return buf.String()
-}
-
-// BitString returns the set as a string of 1s and 0s denoting the sum
-// of the i'th powers of 2, for each i in s. A radix point, always
-// preceded by a digit, appears if the sum is non-integral.
-//
-// Examples:
-// {}.BitString() = "0"
-// {4,5}.BitString() = "110000"
-// {-3}.BitString() = "0.001"
-// {-3,0,4,5}.BitString() = "110001.001"
-//
-func (s *Sparse) BitString() string {
- if s.IsEmpty() {
- return "0"
- }
-
- min, max := s.Min(), s.Max()
- var nbytes int
- if max > 0 {
- nbytes = max
- }
- nbytes++ // zero bit
- radix := nbytes
- if min < 0 {
- nbytes += len(".") - min
- }
-
- b := make([]byte, nbytes)
- for i := range b {
- b[i] = '0'
- }
- if radix < nbytes {
- b[radix] = '.'
- }
- s.forEach(func(x int) {
- if x >= 0 {
- x += len(".")
- }
- b[radix-x] = '1'
- })
- return string(b)
-}
-
-// GoString returns a string showing the internal representation of
-// the set s.
-//
-func (s *Sparse) GoString() string {
- var buf bytes.Buffer
- for b := s.first(); b != &none; b = s.next(b) {
- fmt.Fprintf(&buf, "block %p {offset=%d next=%p prev=%p",
- b, b.offset, b.next, b.prev)
- for _, w := range b.bits {
- fmt.Fprintf(&buf, " 0%016x", w)
- }
- fmt.Fprintf(&buf, "}\n")
- }
- return buf.String()
-}
-
-// AppendTo returns the result of appending the elements of s to slice
-// in order.
-func (s *Sparse) AppendTo(slice []int) []int {
- s.forEach(func(x int) {
- slice = append(slice, x)
- })
- return slice
-}
-
-// -- Testing/debugging ------------------------------------------------
-
-// check returns an error if the representation invariants of s are violated.
-func (s *Sparse) check() error {
- s.init()
- if s.root.empty() {
- // An empty set must have only the root block with offset MaxInt.
- if s.root.next != &s.root {
- return fmt.Errorf("multiple blocks with empty root block")
- }
- if s.root.offset != MaxInt {
- return fmt.Errorf("empty set has offset %d, should be MaxInt", s.root.offset)
- }
- return nil
- }
- for b := s.first(); ; b = s.next(b) {
- if b.offset%bitsPerBlock != 0 {
- return fmt.Errorf("bad offset modulo: %d", b.offset)
- }
- if b.empty() {
- return fmt.Errorf("empty block")
- }
- if b.prev.next != b {
- return fmt.Errorf("bad prev.next link")
- }
- if b.next.prev != b {
- return fmt.Errorf("bad next.prev link")
- }
- if b.next == &s.root {
- break
- }
- if b.offset >= b.next.offset {
- return fmt.Errorf("bad offset order: b.offset=%d, b.next.offset=%d",
- b.offset, b.next.offset)
- }
- }
- return nil
-}
diff --git a/vendor/golang.org/x/tools/container/intsets/sparse_test.go b/vendor/golang.org/x/tools/container/intsets/sparse_test.go
deleted file mode 100644
index e3ef9d3..0000000
--- a/vendor/golang.org/x/tools/container/intsets/sparse_test.go
+++ /dev/null
@@ -1,710 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package intsets_test
-
-import (
- "fmt"
- "log"
- "math/rand"
- "sort"
- "strings"
- "testing"
-
- "golang.org/x/tools/container/intsets"
-)
-
-func TestBasics(t *testing.T) {
- var s intsets.Sparse
- if len := s.Len(); len != 0 {
- t.Errorf("Len({}): got %d, want 0", len)
- }
- if s := s.String(); s != "{}" {
- t.Errorf("String({}): got %q, want \"{}\"", s)
- }
- if s.Has(3) {
- t.Errorf("Has(3): got true, want false")
- }
- if err := s.Check(); err != nil {
- t.Error(err)
- }
-
- if !s.Insert(3) {
- t.Errorf("Insert(3): got false, want true")
- }
- if max := s.Max(); max != 3 {
- t.Errorf("Max: got %d, want 3", max)
- }
-
- if !s.Insert(435) {
- t.Errorf("Insert(435): got false, want true")
- }
- if s := s.String(); s != "{3 435}" {
- t.Errorf("String({3 435}): got %q, want \"{3 435}\"", s)
- }
- if max := s.Max(); max != 435 {
- t.Errorf("Max: got %d, want 435", max)
- }
- if len := s.Len(); len != 2 {
- t.Errorf("Len: got %d, want 2", len)
- }
-
- if !s.Remove(435) {
- t.Errorf("Remove(435): got false, want true")
- }
- if s := s.String(); s != "{3}" {
- t.Errorf("String({3}): got %q, want \"{3}\"", s)
- }
-}
-
-// Insert, Len, IsEmpty, Hash, Clear, AppendTo.
-func TestMoreBasics(t *testing.T) {
- set := new(intsets.Sparse)
- set.Insert(456)
- set.Insert(123)
- set.Insert(789)
- if set.Len() != 3 {
- t.Errorf("%s.Len: got %d, want 3", set, set.Len())
- }
- if set.IsEmpty() {
- t.Errorf("%s.IsEmpty: got true", set)
- }
- if !set.Has(123) {
- t.Errorf("%s.Has(123): got false", set)
- }
- if set.Has(1234) {
- t.Errorf("%s.Has(1234): got true", set)
- }
- got := set.AppendTo([]int{-1})
- if want := []int{-1, 123, 456, 789}; fmt.Sprint(got) != fmt.Sprint(want) {
- t.Errorf("%s.AppendTo: got %v, want %v", set, got, want)
- }
-
- set.Clear()
-
- if set.Len() != 0 {
- t.Errorf("Clear: got %d, want 0", set.Len())
- }
- if !set.IsEmpty() {
- t.Errorf("IsEmpty: got false")
- }
- if set.Has(123) {
- t.Errorf("%s.Has: got false", set)
- }
-}
-
-func TestTakeMin(t *testing.T) {
- var set intsets.Sparse
- set.Insert(456)
- set.Insert(123)
- set.Insert(789)
- set.Insert(-123)
- var got int
- for i, want := range []int{-123, 123, 456, 789} {
- if !set.TakeMin(&got) || got != want {
- t.Errorf("TakeMin #%d: got %d, want %d", i, got, want)
- }
- }
- if set.TakeMin(&got) {
- t.Errorf("%s.TakeMin returned true", &set)
- }
- if err := set.Check(); err != nil {
- t.Fatalf("check: %s: %#v", err, &set)
- }
-}
-
-func TestMinAndMax(t *testing.T) {
- values := []int{0, 456, 123, 789, -123} // elt 0 => empty set
- wantMax := []int{intsets.MinInt, 456, 456, 789, 789}
- wantMin := []int{intsets.MaxInt, 456, 123, 123, -123}
-
- var set intsets.Sparse
- for i, x := range values {
- if i != 0 {
- set.Insert(x)
- }
- if got, want := set.Min(), wantMin[i]; got != want {
- t.Errorf("Min #%d: got %d, want %d", i, got, want)
- }
- if got, want := set.Max(), wantMax[i]; got != want {
- t.Errorf("Max #%d: got %d, want %d", i, got, want)
- }
- }
-
- set.Insert(intsets.MinInt)
- if got, want := set.Min(), intsets.MinInt; got != want {
- t.Errorf("Min: got %d, want %d", got, want)
- }
-
- set.Insert(intsets.MaxInt)
- if got, want := set.Max(), intsets.MaxInt; got != want {
- t.Errorf("Max: got %d, want %d", got, want)
- }
-}
-
-func TestEquals(t *testing.T) {
- var setX intsets.Sparse
- setX.Insert(456)
- setX.Insert(123)
- setX.Insert(789)
-
- if !setX.Equals(&setX) {
- t.Errorf("Equals(%s, %s): got false", &setX, &setX)
- }
-
- var setY intsets.Sparse
- setY.Insert(789)
- setY.Insert(456)
- setY.Insert(123)
-
- if !setX.Equals(&setY) {
- t.Errorf("Equals(%s, %s): got false", &setX, &setY)
- }
-
- setY.Insert(1)
- if setX.Equals(&setY) {
- t.Errorf("Equals(%s, %s): got true", &setX, &setY)
- }
-
- var empty intsets.Sparse
- if setX.Equals(&empty) {
- t.Errorf("Equals(%s, %s): got true", &setX, &empty)
- }
-
- // Edge case: some block (with offset=0) appears in X but not Y.
- setY.Remove(123)
- if setX.Equals(&setY) {
- t.Errorf("Equals(%s, %s): got true", &setX, &setY)
- }
-}
-
-// A pset is a parallel implementation of a set using both an intsets.Sparse
-// and a built-in hash map.
-type pset struct {
- hash map[int]bool
- bits intsets.Sparse
-}
-
-func makePset() *pset {
- return &pset{hash: make(map[int]bool)}
-}
-
-func (set *pset) add(n int) {
- prev := len(set.hash)
- set.hash[n] = true
- grewA := len(set.hash) > prev
-
- grewB := set.bits.Insert(n)
-
- if grewA != grewB {
- panic(fmt.Sprintf("add(%d): grewA=%t grewB=%t", n, grewA, grewB))
- }
-}
-
-func (set *pset) remove(n int) {
- prev := len(set.hash)
- delete(set.hash, n)
- shrankA := len(set.hash) < prev
-
- shrankB := set.bits.Remove(n)
-
- if shrankA != shrankB {
- panic(fmt.Sprintf("remove(%d): shrankA=%t shrankB=%t", n, shrankA, shrankB))
- }
-}
-
-func (set *pset) check(t *testing.T, msg string) {
- var eltsA []int
- for elt := range set.hash {
- eltsA = append(eltsA, int(elt))
- }
- sort.Ints(eltsA)
-
- eltsB := set.bits.AppendTo(nil)
-
- if a, b := fmt.Sprint(eltsA), fmt.Sprint(eltsB); a != b {
- t.Errorf("check(%s): hash=%s bits=%s (%s)", msg, a, b, &set.bits)
- }
-
- if err := set.bits.Check(); err != nil {
- t.Fatalf("Check(%s): %s: %#v", msg, err, &set.bits)
- }
-}
-
-// randomPset returns a parallel set of random size and elements.
-func randomPset(prng *rand.Rand, maxSize int) *pset {
- set := makePset()
- size := int(prng.Int()) % maxSize
- for i := 0; i < size; i++ {
- // TODO(adonovan): benchmark how performance varies
- // with this sparsity parameter.
- n := int(prng.Int()) % 10000
- set.add(n)
- }
- return set
-}
-
-// TestRandomMutations performs the same random adds/removes on two
-// set implementations and ensures that they compute the same result.
-func TestRandomMutations(t *testing.T) {
- const debug = false
-
- set := makePset()
- prng := rand.New(rand.NewSource(0))
- for i := 0; i < 10000; i++ {
- n := int(prng.Int())%2000 - 1000
- if i%2 == 0 {
- if debug {
- log.Printf("add %d", n)
- }
- set.add(n)
- } else {
- if debug {
- log.Printf("remove %d", n)
- }
- set.remove(n)
- }
- if debug {
- set.check(t, "post mutation")
- }
- }
- set.check(t, "final")
- if debug {
- log.Print(&set.bits)
- }
-}
-
-func TestLowerBound(t *testing.T) {
- // Use random sets of sizes from 0 to about 4000.
- prng := rand.New(rand.NewSource(0))
- for i := uint(0); i < 12; i++ {
- x := randomPset(prng, 1<= j && e < found {
- found = e
- }
- }
- if res := x.bits.LowerBound(j); res != found {
- t.Errorf("%s: LowerBound(%d)=%d, expected %d", &x.bits, j, res, found)
- }
- }
- }
-}
-
-// TestSetOperations exercises classic set operations: ∩ , ∪, \.
-func TestSetOperations(t *testing.T) {
- prng := rand.New(rand.NewSource(0))
-
- // Use random sets of sizes from 0 to about 4000.
- // For each operator, we test variations such as
- // Z.op(X, Y), Z.op(X, Z) and Z.op(Z, Y) to exercise
- // the degenerate cases of each method implementation.
- for i := uint(0); i < 12; i++ {
- X := randomPset(prng, 1<, == cases in IntersectionWith that the
- // TestSetOperations data is too dense to cover.
- var X, Y intsets.Sparse
- X.Insert(1)
- X.Insert(1000)
- X.Insert(8000)
- Y.Insert(1)
- Y.Insert(2000)
- Y.Insert(4000)
- X.IntersectionWith(&Y)
- if got, want := X.String(), "{1}"; got != want {
- t.Errorf("IntersectionWith: got %s, want %s", got, want)
- }
-}
-
-func TestIntersects(t *testing.T) {
- prng := rand.New(rand.NewSource(0))
-
- for i := uint(0); i < 12; i++ {
- X, Y := randomPset(prng, 1< len(probe) {
- b.Fatalf("%d hits, only %d probes", hits, len(probe))
- }
- }
-}
-
-func BenchmarkInsertProbeSparse_2_10(b *testing.B) {
- benchmarkInsertProbeSparse(b, 2, 10)
-}
-
-func BenchmarkInsertProbeSparse_10_10(b *testing.B) {
- benchmarkInsertProbeSparse(b, 10, 10)
-}
-
-func BenchmarkInsertProbeSparse_10_1000(b *testing.B) {
- benchmarkInsertProbeSparse(b, 10, 1000)
-}
-
-func BenchmarkInsertProbeSparse_100_100(b *testing.B) {
- benchmarkInsertProbeSparse(b, 100, 100)
-}
-
-func BenchmarkInsertProbeSparse_100_10000(b *testing.B) {
- benchmarkInsertProbeSparse(b, 100, 1000)
-}
-
-func BenchmarkUnionDifferenceSparse(b *testing.B) {
- prng := rand.New(rand.NewSource(0))
- for tries := 0; tries < b.N; tries++ {
- var x, y, z intsets.Sparse
- for i := 0; i < 1000; i++ {
- n := int(prng.Int()) % 100000
- if i%2 == 0 {
- x.Insert(n)
- } else {
- y.Insert(n)
- }
- }
- z.Union(&x, &y)
- z.Difference(&x, &y)
- }
-}
-
-func BenchmarkUnionDifferenceHashTable(b *testing.B) {
- prng := rand.New(rand.NewSource(0))
- for tries := 0; tries < b.N; tries++ {
- x, y, z := make(map[int]bool), make(map[int]bool), make(map[int]bool)
- for i := 0; i < 1000; i++ {
- n := int(prng.Int()) % 100000
- if i%2 == 0 {
- x[n] = true
- } else {
- y[n] = true
- }
- }
- // union
- for n := range x {
- z[n] = true
- }
- for n := range y {
- z[n] = true
- }
- // difference
- z = make(map[int]bool)
- for n := range y {
- if !x[n] {
- z[n] = true
- }
- }
- }
-}
-
-func BenchmarkAppendTo(b *testing.B) {
- prng := rand.New(rand.NewSource(0))
- var x intsets.Sparse
- for i := 0; i < 1000; i++ {
- x.Insert(int(prng.Int()) % 10000)
- }
- var space [1000]int
- for tries := 0; tries < b.N; tries++ {
- x.AppendTo(space[:0])
- }
-}
diff --git a/vendor/golang.org/x/tools/container/intsets/util.go b/vendor/golang.org/x/tools/container/intsets/util.go
deleted file mode 100644
index dd1db86..0000000
--- a/vendor/golang.org/x/tools/container/intsets/util.go
+++ /dev/null
@@ -1,84 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package intsets
-
-// From Hacker's Delight, fig 5.2.
-func popcountHD(x uint32) int {
- x -= (x >> 1) & 0x55555555
- x = (x & 0x33333333) + ((x >> 2) & 0x33333333)
- x = (x + (x >> 4)) & 0x0f0f0f0f
- x = x + (x >> 8)
- x = x + (x >> 16)
- return int(x & 0x0000003f)
-}
-
-var a [1 << 8]byte
-
-func init() {
- for i := range a {
- var n byte
- for x := i; x != 0; x >>= 1 {
- if x&1 != 0 {
- n++
- }
- }
- a[i] = n
- }
-}
-
-func popcountTable(x word) int {
- return int(a[byte(x>>(0*8))] +
- a[byte(x>>(1*8))] +
- a[byte(x>>(2*8))] +
- a[byte(x>>(3*8))] +
- a[byte(x>>(4*8))] +
- a[byte(x>>(5*8))] +
- a[byte(x>>(6*8))] +
- a[byte(x>>(7*8))])
-}
-
-// nlz returns the number of leading zeros of x.
-// From Hacker's Delight, fig 5.11.
-func nlz(x word) int {
- x |= (x >> 1)
- x |= (x >> 2)
- x |= (x >> 4)
- x |= (x >> 8)
- x |= (x >> 16)
- x |= (x >> 32)
- return popcount(^x)
-}
-
-// ntz returns the number of trailing zeros of x.
-// From Hacker's Delight, fig 5.13.
-func ntz(x word) int {
- if x == 0 {
- return bitsPerWord
- }
- n := 1
- if bitsPerWord == 64 {
- if (x & 0xffffffff) == 0 {
- n = n + 32
- x = x >> 32
- }
- }
- if (x & 0x0000ffff) == 0 {
- n = n + 16
- x = x >> 16
- }
- if (x & 0x000000ff) == 0 {
- n = n + 8
- x = x >> 8
- }
- if (x & 0x0000000f) == 0 {
- n = n + 4
- x = x >> 4
- }
- if (x & 0x00000003) == 0 {
- n = n + 2
- x = x >> 2
- }
- return n - int(x&1)
-}
diff --git a/vendor/golang.org/x/tools/container/intsets/util_test.go b/vendor/golang.org/x/tools/container/intsets/util_test.go
deleted file mode 100644
index e4cc659..0000000
--- a/vendor/golang.org/x/tools/container/intsets/util_test.go
+++ /dev/null
@@ -1,58 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package intsets
-
-import (
- "math/rand"
- "testing"
-)
-
-func TestNLZ(t *testing.T) {
- // Test the platform-specific edge case.
- // NB: v must be a var (not const) so that the word() conversion is dynamic.
- // Otherwise the compiler will report an error.
- v := uint64(0x0000801000000000)
- n := nlz(word(v))
- want := 32 // (on 32-bit)
- if bitsPerWord == 64 {
- want = 16
- }
- if n != want {
- t.Errorf("%d-bit nlz(%d) = %d, want %d", bitsPerWord, v, n, want)
- }
-}
-
-// Backdoor for testing.
-func (s *Sparse) Check() error { return s.check() }
-
-func dumbPopcount(x word) int {
- var popcnt int
- for i := uint(0); i < bitsPerWord; i++ {
- if x&(1< tag and will be used to colorize the source
-type Boundary struct {
- Offset int // Location as a byte offset in the source file.
- Start bool // Is this the start of a block?
- Count int // Event count from the cover profile.
- Norm float64 // Count normalized to [0..1].
-}
-
-// Boundaries returns a Profile as a set of Boundary objects within the provided src.
-func (p *Profile) Boundaries(src []byte) (boundaries []Boundary) {
- // Find maximum count.
- max := 0
- for _, b := range p.Blocks {
- if b.Count > max {
- max = b.Count
- }
- }
- // Divisor for normalization.
- divisor := math.Log(float64(max))
-
- // boundary returns a Boundary, populating the Norm field with a normalized Count.
- boundary := func(offset int, start bool, count int) Boundary {
- b := Boundary{Offset: offset, Start: start, Count: count}
- if !start || count == 0 {
- return b
- }
- if max <= 1 {
- b.Norm = 0.8 // Profile is in"set" mode; we want a heat map. Use cov8 in the CSS.
- } else if count > 0 {
- b.Norm = math.Log(float64(count)) / divisor
- }
- return b
- }
-
- line, col := 1, 2 // TODO: Why is this 2?
- for si, bi := 0, 0; si < len(src) && bi < len(p.Blocks); {
- b := p.Blocks[bi]
- if b.StartLine == line && b.StartCol == col {
- boundaries = append(boundaries, boundary(si, true, b.Count))
- }
- if b.EndLine == line && b.EndCol == col || line > b.EndLine {
- boundaries = append(boundaries, boundary(si, false, 0))
- bi++
- continue // Don't advance through src; maybe the next block starts here.
- }
- if src[si] == '\n' {
- line++
- col = 0
- }
- col++
- si++
- }
- sort.Sort(boundariesByPos(boundaries))
- return
-}
-
-type boundariesByPos []Boundary
-
-func (b boundariesByPos) Len() int { return len(b) }
-func (b boundariesByPos) Swap(i, j int) { b[i], b[j] = b[j], b[i] }
-func (b boundariesByPos) Less(i, j int) bool {
- if b[i].Offset == b[j].Offset {
- return !b[i].Start && b[j].Start
- }
- return b[i].Offset < b[j].Offset
-}
diff --git a/vendor/golang.org/x/tools/go/ast/astutil/enclosing.go b/vendor/golang.org/x/tools/go/ast/astutil/enclosing.go
deleted file mode 100644
index 6b7052b..0000000
--- a/vendor/golang.org/x/tools/go/ast/astutil/enclosing.go
+++ /dev/null
@@ -1,627 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package astutil
-
-// This file defines utilities for working with source positions.
-
-import (
- "fmt"
- "go/ast"
- "go/token"
- "sort"
-)
-
-// PathEnclosingInterval returns the node that encloses the source
-// interval [start, end), and all its ancestors up to the AST root.
-//
-// The definition of "enclosing" used by this function considers
-// additional whitespace abutting a node to be enclosed by it.
-// In this example:
-//
-// z := x + y // add them
-// <-A->
-// <----B----->
-//
-// the ast.BinaryExpr(+) node is considered to enclose interval B
-// even though its [Pos()..End()) is actually only interval A.
-// This behaviour makes user interfaces more tolerant of imperfect
-// input.
-//
-// This function treats tokens as nodes, though they are not included
-// in the result. e.g. PathEnclosingInterval("+") returns the
-// enclosing ast.BinaryExpr("x + y").
-//
-// If start==end, the 1-char interval following start is used instead.
-//
-// The 'exact' result is true if the interval contains only path[0]
-// and perhaps some adjacent whitespace. It is false if the interval
-// overlaps multiple children of path[0], or if it contains only
-// interior whitespace of path[0].
-// In this example:
-//
-// z := x + y // add them
-// <--C--> <---E-->
-// ^
-// D
-//
-// intervals C, D and E are inexact. C is contained by the
-// z-assignment statement, because it spans three of its children (:=,
-// x, +). So too is the 1-char interval D, because it contains only
-// interior whitespace of the assignment. E is considered interior
-// whitespace of the BlockStmt containing the assignment.
-//
-// Precondition: [start, end) both lie within the same file as root.
-// TODO(adonovan): return (nil, false) in this case and remove precond.
-// Requires FileSet; see loader.tokenFileContainsPos.
-//
-// Postcondition: path is never nil; it always contains at least 'root'.
-//
-func PathEnclosingInterval(root *ast.File, start, end token.Pos) (path []ast.Node, exact bool) {
- // fmt.Printf("EnclosingInterval %d %d\n", start, end) // debugging
-
- // Precondition: node.[Pos..End) and adjoining whitespace contain [start, end).
- var visit func(node ast.Node) bool
- visit = func(node ast.Node) bool {
- path = append(path, node)
-
- nodePos := node.Pos()
- nodeEnd := node.End()
-
- // fmt.Printf("visit(%T, %d, %d)\n", node, nodePos, nodeEnd) // debugging
-
- // Intersect [start, end) with interval of node.
- if start < nodePos {
- start = nodePos
- }
- if end > nodeEnd {
- end = nodeEnd
- }
-
- // Find sole child that contains [start, end).
- children := childrenOf(node)
- l := len(children)
- for i, child := range children {
- // [childPos, childEnd) is unaugmented interval of child.
- childPos := child.Pos()
- childEnd := child.End()
-
- // [augPos, augEnd) is whitespace-augmented interval of child.
- augPos := childPos
- augEnd := childEnd
- if i > 0 {
- augPos = children[i-1].End() // start of preceding whitespace
- }
- if i < l-1 {
- nextChildPos := children[i+1].Pos()
- // Does [start, end) lie between child and next child?
- if start >= augEnd && end <= nextChildPos {
- return false // inexact match
- }
- augEnd = nextChildPos // end of following whitespace
- }
-
- // fmt.Printf("\tchild %d: [%d..%d)\tcontains interval [%d..%d)?\n",
- // i, augPos, augEnd, start, end) // debugging
-
- // Does augmented child strictly contain [start, end)?
- if augPos <= start && end <= augEnd {
- _, isToken := child.(tokenNode)
- return isToken || visit(child)
- }
-
- // Does [start, end) overlap multiple children?
- // i.e. left-augmented child contains start
- // but LR-augmented child does not contain end.
- if start < childEnd && end > augEnd {
- break
- }
- }
-
- // No single child contained [start, end),
- // so node is the result. Is it exact?
-
- // (It's tempting to put this condition before the
- // child loop, but it gives the wrong result in the
- // case where a node (e.g. ExprStmt) and its sole
- // child have equal intervals.)
- if start == nodePos && end == nodeEnd {
- return true // exact match
- }
-
- return false // inexact: overlaps multiple children
- }
-
- if start > end {
- start, end = end, start
- }
-
- if start < root.End() && end > root.Pos() {
- if start == end {
- end = start + 1 // empty interval => interval of size 1
- }
- exact = visit(root)
-
- // Reverse the path:
- for i, l := 0, len(path); i < l/2; i++ {
- path[i], path[l-1-i] = path[l-1-i], path[i]
- }
- } else {
- // Selection lies within whitespace preceding the
- // first (or following the last) declaration in the file.
- // The result nonetheless always includes the ast.File.
- path = append(path, root)
- }
-
- return
-}
-
-// tokenNode is a dummy implementation of ast.Node for a single token.
-// They are used transiently by PathEnclosingInterval but never escape
-// this package.
-//
-type tokenNode struct {
- pos token.Pos
- end token.Pos
-}
-
-func (n tokenNode) Pos() token.Pos {
- return n.pos
-}
-
-func (n tokenNode) End() token.Pos {
- return n.end
-}
-
-func tok(pos token.Pos, len int) ast.Node {
- return tokenNode{pos, pos + token.Pos(len)}
-}
-
-// childrenOf returns the direct non-nil children of ast.Node n.
-// It may include fake ast.Node implementations for bare tokens.
-// it is not safe to call (e.g.) ast.Walk on such nodes.
-//
-func childrenOf(n ast.Node) []ast.Node {
- var children []ast.Node
-
- // First add nodes for all true subtrees.
- ast.Inspect(n, func(node ast.Node) bool {
- if node == n { // push n
- return true // recur
- }
- if node != nil { // push child
- children = append(children, node)
- }
- return false // no recursion
- })
-
- // Then add fake Nodes for bare tokens.
- switch n := n.(type) {
- case *ast.ArrayType:
- children = append(children,
- tok(n.Lbrack, len("[")),
- tok(n.Elt.End(), len("]")))
-
- case *ast.AssignStmt:
- children = append(children,
- tok(n.TokPos, len(n.Tok.String())))
-
- case *ast.BasicLit:
- children = append(children,
- tok(n.ValuePos, len(n.Value)))
-
- case *ast.BinaryExpr:
- children = append(children, tok(n.OpPos, len(n.Op.String())))
-
- case *ast.BlockStmt:
- children = append(children,
- tok(n.Lbrace, len("{")),
- tok(n.Rbrace, len("}")))
-
- case *ast.BranchStmt:
- children = append(children,
- tok(n.TokPos, len(n.Tok.String())))
-
- case *ast.CallExpr:
- children = append(children,
- tok(n.Lparen, len("(")),
- tok(n.Rparen, len(")")))
- if n.Ellipsis != 0 {
- children = append(children, tok(n.Ellipsis, len("...")))
- }
-
- case *ast.CaseClause:
- if n.List == nil {
- children = append(children,
- tok(n.Case, len("default")))
- } else {
- children = append(children,
- tok(n.Case, len("case")))
- }
- children = append(children, tok(n.Colon, len(":")))
-
- case *ast.ChanType:
- switch n.Dir {
- case ast.RECV:
- children = append(children, tok(n.Begin, len("<-chan")))
- case ast.SEND:
- children = append(children, tok(n.Begin, len("chan<-")))
- case ast.RECV | ast.SEND:
- children = append(children, tok(n.Begin, len("chan")))
- }
-
- case *ast.CommClause:
- if n.Comm == nil {
- children = append(children,
- tok(n.Case, len("default")))
- } else {
- children = append(children,
- tok(n.Case, len("case")))
- }
- children = append(children, tok(n.Colon, len(":")))
-
- case *ast.Comment:
- // nop
-
- case *ast.CommentGroup:
- // nop
-
- case *ast.CompositeLit:
- children = append(children,
- tok(n.Lbrace, len("{")),
- tok(n.Rbrace, len("{")))
-
- case *ast.DeclStmt:
- // nop
-
- case *ast.DeferStmt:
- children = append(children,
- tok(n.Defer, len("defer")))
-
- case *ast.Ellipsis:
- children = append(children,
- tok(n.Ellipsis, len("...")))
-
- case *ast.EmptyStmt:
- // nop
-
- case *ast.ExprStmt:
- // nop
-
- case *ast.Field:
- // TODO(adonovan): Field.{Doc,Comment,Tag}?
-
- case *ast.FieldList:
- children = append(children,
- tok(n.Opening, len("(")),
- tok(n.Closing, len(")")))
-
- case *ast.File:
- // TODO test: Doc
- children = append(children,
- tok(n.Package, len("package")))
-
- case *ast.ForStmt:
- children = append(children,
- tok(n.For, len("for")))
-
- case *ast.FuncDecl:
- // TODO(adonovan): FuncDecl.Comment?
-
- // Uniquely, FuncDecl breaks the invariant that
- // preorder traversal yields tokens in lexical order:
- // in fact, FuncDecl.Recv precedes FuncDecl.Type.Func.
- //
- // As a workaround, we inline the case for FuncType
- // here and order things correctly.
- //
- children = nil // discard ast.Walk(FuncDecl) info subtrees
- children = append(children, tok(n.Type.Func, len("func")))
- if n.Recv != nil {
- children = append(children, n.Recv)
- }
- children = append(children, n.Name)
- if n.Type.Params != nil {
- children = append(children, n.Type.Params)
- }
- if n.Type.Results != nil {
- children = append(children, n.Type.Results)
- }
- if n.Body != nil {
- children = append(children, n.Body)
- }
-
- case *ast.FuncLit:
- // nop
-
- case *ast.FuncType:
- if n.Func != 0 {
- children = append(children,
- tok(n.Func, len("func")))
- }
-
- case *ast.GenDecl:
- children = append(children,
- tok(n.TokPos, len(n.Tok.String())))
- if n.Lparen != 0 {
- children = append(children,
- tok(n.Lparen, len("(")),
- tok(n.Rparen, len(")")))
- }
-
- case *ast.GoStmt:
- children = append(children,
- tok(n.Go, len("go")))
-
- case *ast.Ident:
- children = append(children,
- tok(n.NamePos, len(n.Name)))
-
- case *ast.IfStmt:
- children = append(children,
- tok(n.If, len("if")))
-
- case *ast.ImportSpec:
- // TODO(adonovan): ImportSpec.{Doc,EndPos}?
-
- case *ast.IncDecStmt:
- children = append(children,
- tok(n.TokPos, len(n.Tok.String())))
-
- case *ast.IndexExpr:
- children = append(children,
- tok(n.Lbrack, len("{")),
- tok(n.Rbrack, len("}")))
-
- case *ast.InterfaceType:
- children = append(children,
- tok(n.Interface, len("interface")))
-
- case *ast.KeyValueExpr:
- children = append(children,
- tok(n.Colon, len(":")))
-
- case *ast.LabeledStmt:
- children = append(children,
- tok(n.Colon, len(":")))
-
- case *ast.MapType:
- children = append(children,
- tok(n.Map, len("map")))
-
- case *ast.ParenExpr:
- children = append(children,
- tok(n.Lparen, len("(")),
- tok(n.Rparen, len(")")))
-
- case *ast.RangeStmt:
- children = append(children,
- tok(n.For, len("for")),
- tok(n.TokPos, len(n.Tok.String())))
-
- case *ast.ReturnStmt:
- children = append(children,
- tok(n.Return, len("return")))
-
- case *ast.SelectStmt:
- children = append(children,
- tok(n.Select, len("select")))
-
- case *ast.SelectorExpr:
- // nop
-
- case *ast.SendStmt:
- children = append(children,
- tok(n.Arrow, len("<-")))
-
- case *ast.SliceExpr:
- children = append(children,
- tok(n.Lbrack, len("[")),
- tok(n.Rbrack, len("]")))
-
- case *ast.StarExpr:
- children = append(children, tok(n.Star, len("*")))
-
- case *ast.StructType:
- children = append(children, tok(n.Struct, len("struct")))
-
- case *ast.SwitchStmt:
- children = append(children, tok(n.Switch, len("switch")))
-
- case *ast.TypeAssertExpr:
- children = append(children,
- tok(n.Lparen-1, len(".")),
- tok(n.Lparen, len("(")),
- tok(n.Rparen, len(")")))
-
- case *ast.TypeSpec:
- // TODO(adonovan): TypeSpec.{Doc,Comment}?
-
- case *ast.TypeSwitchStmt:
- children = append(children, tok(n.Switch, len("switch")))
-
- case *ast.UnaryExpr:
- children = append(children, tok(n.OpPos, len(n.Op.String())))
-
- case *ast.ValueSpec:
- // TODO(adonovan): ValueSpec.{Doc,Comment}?
-
- case *ast.BadDecl, *ast.BadExpr, *ast.BadStmt:
- // nop
- }
-
- // TODO(adonovan): opt: merge the logic of ast.Inspect() into
- // the switch above so we can make interleaved callbacks for
- // both Nodes and Tokens in the right order and avoid the need
- // to sort.
- sort.Sort(byPos(children))
-
- return children
-}
-
-type byPos []ast.Node
-
-func (sl byPos) Len() int {
- return len(sl)
-}
-func (sl byPos) Less(i, j int) bool {
- return sl[i].Pos() < sl[j].Pos()
-}
-func (sl byPos) Swap(i, j int) {
- sl[i], sl[j] = sl[j], sl[i]
-}
-
-// NodeDescription returns a description of the concrete type of n suitable
-// for a user interface.
-//
-// TODO(adonovan): in some cases (e.g. Field, FieldList, Ident,
-// StarExpr) we could be much more specific given the path to the AST
-// root. Perhaps we should do that.
-//
-func NodeDescription(n ast.Node) string {
- switch n := n.(type) {
- case *ast.ArrayType:
- return "array type"
- case *ast.AssignStmt:
- return "assignment"
- case *ast.BadDecl:
- return "bad declaration"
- case *ast.BadExpr:
- return "bad expression"
- case *ast.BadStmt:
- return "bad statement"
- case *ast.BasicLit:
- return "basic literal"
- case *ast.BinaryExpr:
- return fmt.Sprintf("binary %s operation", n.Op)
- case *ast.BlockStmt:
- return "block"
- case *ast.BranchStmt:
- switch n.Tok {
- case token.BREAK:
- return "break statement"
- case token.CONTINUE:
- return "continue statement"
- case token.GOTO:
- return "goto statement"
- case token.FALLTHROUGH:
- return "fall-through statement"
- }
- case *ast.CallExpr:
- if len(n.Args) == 1 && !n.Ellipsis.IsValid() {
- return "function call (or conversion)"
- }
- return "function call"
- case *ast.CaseClause:
- return "case clause"
- case *ast.ChanType:
- return "channel type"
- case *ast.CommClause:
- return "communication clause"
- case *ast.Comment:
- return "comment"
- case *ast.CommentGroup:
- return "comment group"
- case *ast.CompositeLit:
- return "composite literal"
- case *ast.DeclStmt:
- return NodeDescription(n.Decl) + " statement"
- case *ast.DeferStmt:
- return "defer statement"
- case *ast.Ellipsis:
- return "ellipsis"
- case *ast.EmptyStmt:
- return "empty statement"
- case *ast.ExprStmt:
- return "expression statement"
- case *ast.Field:
- // Can be any of these:
- // struct {x, y int} -- struct field(s)
- // struct {T} -- anon struct field
- // interface {I} -- interface embedding
- // interface {f()} -- interface method
- // func (A) func(B) C -- receiver, param(s), result(s)
- return "field/method/parameter"
- case *ast.FieldList:
- return "field/method/parameter list"
- case *ast.File:
- return "source file"
- case *ast.ForStmt:
- return "for loop"
- case *ast.FuncDecl:
- return "function declaration"
- case *ast.FuncLit:
- return "function literal"
- case *ast.FuncType:
- return "function type"
- case *ast.GenDecl:
- switch n.Tok {
- case token.IMPORT:
- return "import declaration"
- case token.CONST:
- return "constant declaration"
- case token.TYPE:
- return "type declaration"
- case token.VAR:
- return "variable declaration"
- }
- case *ast.GoStmt:
- return "go statement"
- case *ast.Ident:
- return "identifier"
- case *ast.IfStmt:
- return "if statement"
- case *ast.ImportSpec:
- return "import specification"
- case *ast.IncDecStmt:
- if n.Tok == token.INC {
- return "increment statement"
- }
- return "decrement statement"
- case *ast.IndexExpr:
- return "index expression"
- case *ast.InterfaceType:
- return "interface type"
- case *ast.KeyValueExpr:
- return "key/value association"
- case *ast.LabeledStmt:
- return "statement label"
- case *ast.MapType:
- return "map type"
- case *ast.Package:
- return "package"
- case *ast.ParenExpr:
- return "parenthesized " + NodeDescription(n.X)
- case *ast.RangeStmt:
- return "range loop"
- case *ast.ReturnStmt:
- return "return statement"
- case *ast.SelectStmt:
- return "select statement"
- case *ast.SelectorExpr:
- return "selector"
- case *ast.SendStmt:
- return "channel send"
- case *ast.SliceExpr:
- return "slice expression"
- case *ast.StarExpr:
- return "*-operation" // load/store expr or pointer type
- case *ast.StructType:
- return "struct type"
- case *ast.SwitchStmt:
- return "switch statement"
- case *ast.TypeAssertExpr:
- return "type assertion"
- case *ast.TypeSpec:
- return "type specification"
- case *ast.TypeSwitchStmt:
- return "type switch"
- case *ast.UnaryExpr:
- return fmt.Sprintf("unary %s operation", n.Op)
- case *ast.ValueSpec:
- return "value specification"
-
- }
- panic(fmt.Sprintf("unexpected node type: %T", n))
-}
diff --git a/vendor/golang.org/x/tools/go/ast/astutil/enclosing_test.go b/vendor/golang.org/x/tools/go/ast/astutil/enclosing_test.go
deleted file mode 100644
index 107f87c..0000000
--- a/vendor/golang.org/x/tools/go/ast/astutil/enclosing_test.go
+++ /dev/null
@@ -1,195 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package astutil_test
-
-// This file defines tests of PathEnclosingInterval.
-
-// TODO(adonovan): exhaustive tests that run over the whole input
-// tree, not just handcrafted examples.
-
-import (
- "bytes"
- "fmt"
- "go/ast"
- "go/parser"
- "go/token"
- "strings"
- "testing"
-
- "golang.org/x/tools/go/ast/astutil"
-)
-
-// pathToString returns a string containing the concrete types of the
-// nodes in path.
-func pathToString(path []ast.Node) string {
- var buf bytes.Buffer
- fmt.Fprint(&buf, "[")
- for i, n := range path {
- if i > 0 {
- fmt.Fprint(&buf, " ")
- }
- fmt.Fprint(&buf, strings.TrimPrefix(fmt.Sprintf("%T", n), "*ast."))
- }
- fmt.Fprint(&buf, "]")
- return buf.String()
-}
-
-// findInterval parses input and returns the [start, end) positions of
-// the first occurrence of substr in input. f==nil indicates failure;
-// an error has already been reported in that case.
-//
-func findInterval(t *testing.T, fset *token.FileSet, input, substr string) (f *ast.File, start, end token.Pos) {
- f, err := parser.ParseFile(fset, " ", input, 0)
- if err != nil {
- t.Errorf("parse error: %s", err)
- return
- }
-
- i := strings.Index(input, substr)
- if i < 0 {
- t.Errorf("%q is not a substring of input", substr)
- f = nil
- return
- }
-
- filePos := fset.File(f.Package)
- return f, filePos.Pos(i), filePos.Pos(i + len(substr))
-}
-
-// Common input for following tests.
-const input = `
-// Hello.
-package main
-import "fmt"
-func f() {}
-func main() {
- z := (x + y) // add them
- f() // NB: ExprStmt and its CallExpr have same Pos/End
-}
-`
-
-func TestPathEnclosingInterval_Exact(t *testing.T) {
- // For the exact tests, we check that a substring is mapped to
- // the canonical string for the node it denotes.
- tests := []struct {
- substr string // first occurrence of this string indicates interval
- node string // complete text of expected containing node
- }{
- {"package",
- input[11 : len(input)-1]},
- {"\npack",
- input[11 : len(input)-1]},
- {"main",
- "main"},
- {"import",
- "import \"fmt\""},
- {"\"fmt\"",
- "\"fmt\""},
- {"\nfunc f() {}\n",
- "func f() {}"},
- {"x ",
- "x"},
- {" y",
- "y"},
- {"z",
- "z"},
- {" + ",
- "x + y"},
- {" :=",
- "z := (x + y)"},
- {"x + y",
- "x + y"},
- {"(x + y)",
- "(x + y)"},
- {" (x + y) ",
- "(x + y)"},
- {" (x + y) // add",
- "(x + y)"},
- {"func",
- "func f() {}"},
- {"func f() {}",
- "func f() {}"},
- {"\nfun",
- "func f() {}"},
- {" f",
- "f"},
- }
- for _, test := range tests {
- f, start, end := findInterval(t, new(token.FileSet), input, test.substr)
- if f == nil {
- continue
- }
-
- path, exact := astutil.PathEnclosingInterval(f, start, end)
- if !exact {
- t.Errorf("PathEnclosingInterval(%q) not exact", test.substr)
- continue
- }
-
- if len(path) == 0 {
- if test.node != "" {
- t.Errorf("PathEnclosingInterval(%q).path: got [], want %q",
- test.substr, test.node)
- }
- continue
- }
-
- if got := input[path[0].Pos():path[0].End()]; got != test.node {
- t.Errorf("PathEnclosingInterval(%q): got %q, want %q (path was %s)",
- test.substr, got, test.node, pathToString(path))
- continue
- }
- }
-}
-
-func TestPathEnclosingInterval_Paths(t *testing.T) {
- // For these tests, we check only the path of the enclosing
- // node, but not its complete text because it's often quite
- // large when !exact.
- tests := []struct {
- substr string // first occurrence of this string indicates interval
- path string // the pathToString(),exact of the expected path
- }{
- {"// add",
- "[BlockStmt FuncDecl File],false"},
- {"(x + y",
- "[ParenExpr AssignStmt BlockStmt FuncDecl File],false"},
- {"x +",
- "[BinaryExpr ParenExpr AssignStmt BlockStmt FuncDecl File],false"},
- {"z := (x",
- "[AssignStmt BlockStmt FuncDecl File],false"},
- {"func f",
- "[FuncDecl File],false"},
- {"func f()",
- "[FuncDecl File],false"},
- {" f()",
- "[FuncDecl File],false"},
- {"() {}",
- "[FuncDecl File],false"},
- {"// Hello",
- "[File],false"},
- {" f",
- "[Ident FuncDecl File],true"},
- {"func ",
- "[FuncDecl File],true"},
- {"mai",
- "[Ident File],true"},
- {"f() // NB",
- "[CallExpr ExprStmt BlockStmt FuncDecl File],true"},
- }
- for _, test := range tests {
- f, start, end := findInterval(t, new(token.FileSet), input, test.substr)
- if f == nil {
- continue
- }
-
- path, exact := astutil.PathEnclosingInterval(f, start, end)
- if got := fmt.Sprintf("%s,%v", pathToString(path), exact); got != test.path {
- t.Errorf("PathEnclosingInterval(%q): got %q, want %q",
- test.substr, got, test.path)
- continue
- }
- }
-}
diff --git a/vendor/golang.org/x/tools/go/ast/astutil/imports.go b/vendor/golang.org/x/tools/go/ast/astutil/imports.go
deleted file mode 100644
index 83f196c..0000000
--- a/vendor/golang.org/x/tools/go/ast/astutil/imports.go
+++ /dev/null
@@ -1,470 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Package astutil contains common utilities for working with the Go AST.
-package astutil // import "golang.org/x/tools/go/ast/astutil"
-
-import (
- "fmt"
- "go/ast"
- "go/token"
- "strconv"
- "strings"
-)
-
-// AddImport adds the import path to the file f, if absent.
-func AddImport(fset *token.FileSet, f *ast.File, ipath string) (added bool) {
- return AddNamedImport(fset, f, "", ipath)
-}
-
-// AddNamedImport adds the import path to the file f, if absent.
-// If name is not empty, it is used to rename the import.
-//
-// For example, calling
-// AddNamedImport(fset, f, "pathpkg", "path")
-// adds
-// import pathpkg "path"
-func AddNamedImport(fset *token.FileSet, f *ast.File, name, ipath string) (added bool) {
- if imports(f, ipath) {
- return false
- }
-
- newImport := &ast.ImportSpec{
- Path: &ast.BasicLit{
- Kind: token.STRING,
- Value: strconv.Quote(ipath),
- },
- }
- if name != "" {
- newImport.Name = &ast.Ident{Name: name}
- }
-
- // Find an import decl to add to.
- // The goal is to find an existing import
- // whose import path has the longest shared
- // prefix with ipath.
- var (
- bestMatch = -1 // length of longest shared prefix
- lastImport = -1 // index in f.Decls of the file's final import decl
- impDecl *ast.GenDecl // import decl containing the best match
- impIndex = -1 // spec index in impDecl containing the best match
-
- isThirdPartyPath = isThirdParty(ipath)
- )
- for i, decl := range f.Decls {
- gen, ok := decl.(*ast.GenDecl)
- if ok && gen.Tok == token.IMPORT {
- lastImport = i
- // Do not add to import "C", to avoid disrupting the
- // association with its doc comment, breaking cgo.
- if declImports(gen, "C") {
- continue
- }
-
- // Match an empty import decl if that's all that is available.
- if len(gen.Specs) == 0 && bestMatch == -1 {
- impDecl = gen
- }
-
- // Compute longest shared prefix with imports in this group and find best
- // matched import spec.
- // 1. Always prefer import spec with longest shared prefix.
- // 2. While match length is 0,
- // - for stdlib package: prefer first import spec.
- // - for third party package: prefer first third party import spec.
- // We cannot use last import spec as best match for third party package
- // because grouped imports are usually placed last by goimports -local
- // flag.
- // See issue #19190.
- seenAnyThirdParty := false
- for j, spec := range gen.Specs {
- impspec := spec.(*ast.ImportSpec)
- p := importPath(impspec)
- n := matchLen(p, ipath)
- if n > bestMatch || (bestMatch == 0 && !seenAnyThirdParty && isThirdPartyPath) {
- bestMatch = n
- impDecl = gen
- impIndex = j
- }
- seenAnyThirdParty = seenAnyThirdParty || isThirdParty(p)
- }
- }
- }
-
- // If no import decl found, add one after the last import.
- if impDecl == nil {
- impDecl = &ast.GenDecl{
- Tok: token.IMPORT,
- }
- if lastImport >= 0 {
- impDecl.TokPos = f.Decls[lastImport].End()
- } else {
- // There are no existing imports.
- // Our new import goes after the package declaration and after
- // the comment, if any, that starts on the same line as the
- // package declaration.
- impDecl.TokPos = f.Package
-
- file := fset.File(f.Package)
- pkgLine := file.Line(f.Package)
- for _, c := range f.Comments {
- if file.Line(c.Pos()) > pkgLine {
- break
- }
- impDecl.TokPos = c.End()
- }
- }
- f.Decls = append(f.Decls, nil)
- copy(f.Decls[lastImport+2:], f.Decls[lastImport+1:])
- f.Decls[lastImport+1] = impDecl
- }
-
- // Insert new import at insertAt.
- insertAt := 0
- if impIndex >= 0 {
- // insert after the found import
- insertAt = impIndex + 1
- }
- impDecl.Specs = append(impDecl.Specs, nil)
- copy(impDecl.Specs[insertAt+1:], impDecl.Specs[insertAt:])
- impDecl.Specs[insertAt] = newImport
- pos := impDecl.Pos()
- if insertAt > 0 {
- // If there is a comment after an existing import, preserve the comment
- // position by adding the new import after the comment.
- if spec, ok := impDecl.Specs[insertAt-1].(*ast.ImportSpec); ok && spec.Comment != nil {
- pos = spec.Comment.End()
- } else {
- // Assign same position as the previous import,
- // so that the sorter sees it as being in the same block.
- pos = impDecl.Specs[insertAt-1].Pos()
- }
- }
- if newImport.Name != nil {
- newImport.Name.NamePos = pos
- }
- newImport.Path.ValuePos = pos
- newImport.EndPos = pos
-
- // Clean up parens. impDecl contains at least one spec.
- if len(impDecl.Specs) == 1 {
- // Remove unneeded parens.
- impDecl.Lparen = token.NoPos
- } else if !impDecl.Lparen.IsValid() {
- // impDecl needs parens added.
- impDecl.Lparen = impDecl.Specs[0].Pos()
- }
-
- f.Imports = append(f.Imports, newImport)
-
- if len(f.Decls) <= 1 {
- return true
- }
-
- // Merge all the import declarations into the first one.
- var first *ast.GenDecl
- for i := 0; i < len(f.Decls); i++ {
- decl := f.Decls[i]
- gen, ok := decl.(*ast.GenDecl)
- if !ok || gen.Tok != token.IMPORT || declImports(gen, "C") {
- continue
- }
- if first == nil {
- first = gen
- continue // Don't touch the first one.
- }
- // We now know there is more than one package in this import
- // declaration. Ensure that it ends up parenthesized.
- first.Lparen = first.Pos()
- // Move the imports of the other import declaration to the first one.
- for _, spec := range gen.Specs {
- spec.(*ast.ImportSpec).Path.ValuePos = first.Pos()
- first.Specs = append(first.Specs, spec)
- }
- f.Decls = append(f.Decls[:i], f.Decls[i+1:]...)
- i--
- }
-
- return true
-}
-
-func isThirdParty(importPath string) bool {
- // Third party package import path usually contains "." (".com", ".org", ...)
- // This logic is taken from golang.org/x/tools/imports package.
- return strings.Contains(importPath, ".")
-}
-
-// DeleteImport deletes the import path from the file f, if present.
-func DeleteImport(fset *token.FileSet, f *ast.File, path string) (deleted bool) {
- return DeleteNamedImport(fset, f, "", path)
-}
-
-// DeleteNamedImport deletes the import with the given name and path from the file f, if present.
-func DeleteNamedImport(fset *token.FileSet, f *ast.File, name, path string) (deleted bool) {
- var delspecs []*ast.ImportSpec
- var delcomments []*ast.CommentGroup
-
- // Find the import nodes that import path, if any.
- for i := 0; i < len(f.Decls); i++ {
- decl := f.Decls[i]
- gen, ok := decl.(*ast.GenDecl)
- if !ok || gen.Tok != token.IMPORT {
- continue
- }
- for j := 0; j < len(gen.Specs); j++ {
- spec := gen.Specs[j]
- impspec := spec.(*ast.ImportSpec)
- if impspec.Name == nil && name != "" {
- continue
- }
- if impspec.Name != nil && impspec.Name.Name != name {
- continue
- }
- if importPath(impspec) != path {
- continue
- }
-
- // We found an import spec that imports path.
- // Delete it.
- delspecs = append(delspecs, impspec)
- deleted = true
- copy(gen.Specs[j:], gen.Specs[j+1:])
- gen.Specs = gen.Specs[:len(gen.Specs)-1]
-
- // If this was the last import spec in this decl,
- // delete the decl, too.
- if len(gen.Specs) == 0 {
- copy(f.Decls[i:], f.Decls[i+1:])
- f.Decls = f.Decls[:len(f.Decls)-1]
- i--
- break
- } else if len(gen.Specs) == 1 {
- if impspec.Doc != nil {
- delcomments = append(delcomments, impspec.Doc)
- }
- if impspec.Comment != nil {
- delcomments = append(delcomments, impspec.Comment)
- }
- for _, cg := range f.Comments {
- // Found comment on the same line as the import spec.
- if cg.End() < impspec.Pos() && fset.Position(cg.End()).Line == fset.Position(impspec.Pos()).Line {
- delcomments = append(delcomments, cg)
- break
- }
- }
-
- spec := gen.Specs[0].(*ast.ImportSpec)
-
- // Move the documentation right after the import decl.
- if spec.Doc != nil {
- for fset.Position(gen.TokPos).Line+1 < fset.Position(spec.Doc.Pos()).Line {
- fset.File(gen.TokPos).MergeLine(fset.Position(gen.TokPos).Line)
- }
- }
- for _, cg := range f.Comments {
- if cg.End() < spec.Pos() && fset.Position(cg.End()).Line == fset.Position(spec.Pos()).Line {
- for fset.Position(gen.TokPos).Line+1 < fset.Position(spec.Pos()).Line {
- fset.File(gen.TokPos).MergeLine(fset.Position(gen.TokPos).Line)
- }
- break
- }
- }
- }
- if j > 0 {
- lastImpspec := gen.Specs[j-1].(*ast.ImportSpec)
- lastLine := fset.Position(lastImpspec.Path.ValuePos).Line
- line := fset.Position(impspec.Path.ValuePos).Line
-
- // We deleted an entry but now there may be
- // a blank line-sized hole where the import was.
- if line-lastLine > 1 {
- // There was a blank line immediately preceding the deleted import,
- // so there's no need to close the hole.
- // Do nothing.
- } else if line != fset.File(gen.Rparen).LineCount() {
- // There was no blank line. Close the hole.
- fset.File(gen.Rparen).MergeLine(line)
- }
- }
- j--
- }
- }
-
- // Delete imports from f.Imports.
- for i := 0; i < len(f.Imports); i++ {
- imp := f.Imports[i]
- for j, del := range delspecs {
- if imp == del {
- copy(f.Imports[i:], f.Imports[i+1:])
- f.Imports = f.Imports[:len(f.Imports)-1]
- copy(delspecs[j:], delspecs[j+1:])
- delspecs = delspecs[:len(delspecs)-1]
- i--
- break
- }
- }
- }
-
- // Delete comments from f.Comments.
- for i := 0; i < len(f.Comments); i++ {
- cg := f.Comments[i]
- for j, del := range delcomments {
- if cg == del {
- copy(f.Comments[i:], f.Comments[i+1:])
- f.Comments = f.Comments[:len(f.Comments)-1]
- copy(delcomments[j:], delcomments[j+1:])
- delcomments = delcomments[:len(delcomments)-1]
- i--
- break
- }
- }
- }
-
- if len(delspecs) > 0 {
- panic(fmt.Sprintf("deleted specs from Decls but not Imports: %v", delspecs))
- }
-
- return
-}
-
-// RewriteImport rewrites any import of path oldPath to path newPath.
-func RewriteImport(fset *token.FileSet, f *ast.File, oldPath, newPath string) (rewrote bool) {
- for _, imp := range f.Imports {
- if importPath(imp) == oldPath {
- rewrote = true
- // record old End, because the default is to compute
- // it using the length of imp.Path.Value.
- imp.EndPos = imp.End()
- imp.Path.Value = strconv.Quote(newPath)
- }
- }
- return
-}
-
-// UsesImport reports whether a given import is used.
-func UsesImport(f *ast.File, path string) (used bool) {
- spec := importSpec(f, path)
- if spec == nil {
- return
- }
-
- name := spec.Name.String()
- switch name {
- case "":
- // If the package name is not explicitly specified,
- // make an educated guess. This is not guaranteed to be correct.
- lastSlash := strings.LastIndex(path, "/")
- if lastSlash == -1 {
- name = path
- } else {
- name = path[lastSlash+1:]
- }
- case "_", ".":
- // Not sure if this import is used - err on the side of caution.
- return true
- }
-
- ast.Walk(visitFn(func(n ast.Node) {
- sel, ok := n.(*ast.SelectorExpr)
- if ok && isTopName(sel.X, name) {
- used = true
- }
- }), f)
-
- return
-}
-
-type visitFn func(node ast.Node)
-
-func (fn visitFn) Visit(node ast.Node) ast.Visitor {
- fn(node)
- return fn
-}
-
-// imports returns true if f imports path.
-func imports(f *ast.File, path string) bool {
- return importSpec(f, path) != nil
-}
-
-// importSpec returns the import spec if f imports path,
-// or nil otherwise.
-func importSpec(f *ast.File, path string) *ast.ImportSpec {
- for _, s := range f.Imports {
- if importPath(s) == path {
- return s
- }
- }
- return nil
-}
-
-// importPath returns the unquoted import path of s,
-// or "" if the path is not properly quoted.
-func importPath(s *ast.ImportSpec) string {
- t, err := strconv.Unquote(s.Path.Value)
- if err == nil {
- return t
- }
- return ""
-}
-
-// declImports reports whether gen contains an import of path.
-func declImports(gen *ast.GenDecl, path string) bool {
- if gen.Tok != token.IMPORT {
- return false
- }
- for _, spec := range gen.Specs {
- impspec := spec.(*ast.ImportSpec)
- if importPath(impspec) == path {
- return true
- }
- }
- return false
-}
-
-// matchLen returns the length of the longest path segment prefix shared by x and y.
-func matchLen(x, y string) int {
- n := 0
- for i := 0; i < len(x) && i < len(y) && x[i] == y[i]; i++ {
- if x[i] == '/' {
- n++
- }
- }
- return n
-}
-
-// isTopName returns true if n is a top-level unresolved identifier with the given name.
-func isTopName(n ast.Expr, name string) bool {
- id, ok := n.(*ast.Ident)
- return ok && id.Name == name && id.Obj == nil
-}
-
-// Imports returns the file imports grouped by paragraph.
-func Imports(fset *token.FileSet, f *ast.File) [][]*ast.ImportSpec {
- var groups [][]*ast.ImportSpec
-
- for _, decl := range f.Decls {
- genDecl, ok := decl.(*ast.GenDecl)
- if !ok || genDecl.Tok != token.IMPORT {
- break
- }
-
- group := []*ast.ImportSpec{}
-
- var lastLine int
- for _, spec := range genDecl.Specs {
- importSpec := spec.(*ast.ImportSpec)
- pos := importSpec.Path.ValuePos
- line := fset.Position(pos).Line
- if lastLine > 0 && pos > 0 && line-lastLine > 1 {
- groups = append(groups, group)
- group = []*ast.ImportSpec{}
- }
- group = append(group, importSpec)
- lastLine = line
- }
- groups = append(groups, group)
- }
-
- return groups
-}
diff --git a/vendor/golang.org/x/tools/go/ast/astutil/imports_test.go b/vendor/golang.org/x/tools/go/ast/astutil/imports_test.go
deleted file mode 100644
index 8bc3480..0000000
--- a/vendor/golang.org/x/tools/go/ast/astutil/imports_test.go
+++ /dev/null
@@ -1,1818 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package astutil
-
-import (
- "bytes"
- "go/ast"
- "go/format"
- "go/parser"
- "go/token"
- "reflect"
- "strconv"
- "testing"
-)
-
-var fset = token.NewFileSet()
-
-func parse(t *testing.T, name, in string) *ast.File {
- file, err := parser.ParseFile(fset, name, in, parser.ParseComments)
- if err != nil {
- t.Fatalf("%s parse: %v", name, err)
- }
- return file
-}
-
-func print(t *testing.T, name string, f *ast.File) string {
- var buf bytes.Buffer
- if err := format.Node(&buf, fset, f); err != nil {
- t.Fatalf("%s gofmt: %v", name, err)
- }
- return string(buf.Bytes())
-}
-
-type test struct {
- name string
- renamedPkg string
- pkg string
- in string
- out string
- broken bool // known broken
-}
-
-var addTests = []test{
- {
- name: "leave os alone",
- pkg: "os",
- in: `package main
-
-import (
- "os"
-)
-`,
- out: `package main
-
-import (
- "os"
-)
-`,
- },
- {
- name: "import.1",
- pkg: "os",
- in: `package main
-`,
- out: `package main
-
-import "os"
-`,
- },
- {
- name: "import.2",
- pkg: "os",
- in: `package main
-
-// Comment
-import "C"
-`,
- out: `package main
-
-// Comment
-import "C"
-import "os"
-`,
- },
- {
- name: "import.3",
- pkg: "os",
- in: `package main
-
-// Comment
-import "C"
-
-import (
- "io"
- "utf8"
-)
-`,
- out: `package main
-
-// Comment
-import "C"
-
-import (
- "io"
- "os"
- "utf8"
-)
-`,
- },
- {
- name: "import.17",
- pkg: "x/y/z",
- in: `package main
-
-// Comment
-import "C"
-
-import (
- "a"
- "b"
-
- "x/w"
-
- "d/f"
-)
-`,
- out: `package main
-
-// Comment
-import "C"
-
-import (
- "a"
- "b"
-
- "x/w"
- "x/y/z"
-
- "d/f"
-)
-`,
- },
- {
- name: "issue #19190",
- pkg: "x.org/y/z",
- in: `package main
-
-// Comment
-import "C"
-
-import (
- "bytes"
- "os"
-
- "d.com/f"
-)
-`,
- out: `package main
-
-// Comment
-import "C"
-
-import (
- "bytes"
- "os"
-
- "d.com/f"
- "x.org/y/z"
-)
-`,
- },
- {
- name: "issue #19190 with existing grouped import packages",
- pkg: "x.org/y/z",
- in: `package main
-
-// Comment
-import "C"
-
-import (
- "bytes"
- "os"
-
- "c.com/f"
- "d.com/f"
-
- "y.com/a"
- "y.com/b"
- "y.com/c"
-)
-`,
- out: `package main
-
-// Comment
-import "C"
-
-import (
- "bytes"
- "os"
-
- "c.com/f"
- "d.com/f"
- "x.org/y/z"
-
- "y.com/a"
- "y.com/b"
- "y.com/c"
-)
-`,
- },
- {
- name: "issue #19190 - match score is still respected",
- pkg: "y.org/c",
- in: `package main
-
-import (
- "x.org/a"
-
- "y.org/b"
-)
-`,
- out: `package main
-
-import (
- "x.org/a"
-
- "y.org/b"
- "y.org/c"
-)
-`,
- },
- {
- name: "import into singular group",
- pkg: "bytes",
- in: `package main
-
-import "os"
-
-`,
- out: `package main
-
-import (
- "bytes"
- "os"
-)
-`,
- },
- {
- name: "import into singular group with comment",
- pkg: "bytes",
- in: `package main
-
-import /* why */ /* comment here? */ "os"
-
-`,
- out: `package main
-
-import /* why */ /* comment here? */ (
- "bytes"
- "os"
-)
-`,
- },
- {
- name: "import into group with leading comment",
- pkg: "strings",
- in: `package main
-
-import (
- // comment before bytes
- "bytes"
- "os"
-)
-
-`,
- out: `package main
-
-import (
- // comment before bytes
- "bytes"
- "os"
- "strings"
-)
-`,
- },
- {
- name: "",
- renamedPkg: "fmtpkg",
- pkg: "fmt",
- in: `package main
-
-import "os"
-
-`,
- out: `package main
-
-import (
- fmtpkg "fmt"
- "os"
-)
-`,
- },
- {
- name: "struct comment",
- pkg: "time",
- in: `package main
-
-// This is a comment before a struct.
-type T struct {
- t time.Time
-}
-`,
- out: `package main
-
-import "time"
-
-// This is a comment before a struct.
-type T struct {
- t time.Time
-}
-`,
- },
- {
- name: "issue 8729 import C",
- pkg: "time",
- in: `package main
-
-import "C"
-
-// comment
-type T time.Time
-`,
- out: `package main
-
-import "C"
-import "time"
-
-// comment
-type T time.Time
-`,
- },
- {
- name: "issue 8729 empty import",
- pkg: "time",
- in: `package main
-
-import ()
-
-// comment
-type T time.Time
-`,
- out: `package main
-
-import "time"
-
-// comment
-type T time.Time
-`,
- },
- {
- name: "issue 8729 comment on package line",
- pkg: "time",
- in: `package main // comment
-
-type T time.Time
-`,
- out: `package main // comment
-import "time"
-
-type T time.Time
-`,
- },
- {
- name: "issue 8729 comment after package",
- pkg: "time",
- in: `package main
-// comment
-
-type T time.Time
-`,
- out: `package main
-
-import "time"
-
-// comment
-
-type T time.Time
-`,
- },
- {
- name: "issue 8729 comment before and on package line",
- pkg: "time",
- in: `// comment before
-package main // comment on
-
-type T time.Time
-`,
- out: `// comment before
-package main // comment on
-import "time"
-
-type T time.Time
-`,
- },
-
- // Issue 9961: Match prefixes using path segments rather than bytes
- {
- name: "issue 9961",
- pkg: "regexp",
- in: `package main
-
-import (
- "flag"
- "testing"
-
- "rsc.io/p"
-)
-`,
- out: `package main
-
-import (
- "flag"
- "regexp"
- "testing"
-
- "rsc.io/p"
-)
-`,
- },
- // Issue 10337: Preserve comment position
- {
- name: "issue 10337",
- pkg: "fmt",
- in: `package main
-
-import (
- "bytes" // a
- "log" // c
-)
-`,
- out: `package main
-
-import (
- "bytes" // a
- "fmt"
- "log" // c
-)
-`,
- },
- {
- name: "issue 10337 new import at the start",
- pkg: "bytes",
- in: `package main
-
-import (
- "fmt" // b
- "log" // c
-)
-`,
- out: `package main
-
-import (
- "bytes"
- "fmt" // b
- "log" // c
-)
-`,
- },
- {
- name: "issue 10337 new import at the end",
- pkg: "log",
- in: `package main
-
-import (
- "bytes" // a
- "fmt" // b
-)
-`,
- out: `package main
-
-import (
- "bytes" // a
- "fmt" // b
- "log"
-)
-`,
- },
- // Issue 14075: Merge import declarations
- {
- name: "issue 14075",
- pkg: "bufio",
- in: `package main
-
-import "bytes"
-import "fmt"
-`,
- out: `package main
-
-import (
- "bufio"
- "bytes"
- "fmt"
-)
-`,
- },
- {
- name: "issue 14075 update position",
- pkg: "bufio",
- in: `package main
-
-import "bytes"
-import (
- "fmt"
-)
-`,
- out: `package main
-
-import (
- "bufio"
- "bytes"
- "fmt"
-)
-`,
- },
- {
- name: `issue 14075 ignore import "C"`,
- pkg: "bufio",
- in: `package main
-
-// Comment
-import "C"
-
-import "bytes"
-import "fmt"
-`,
- out: `package main
-
-// Comment
-import "C"
-
-import (
- "bufio"
- "bytes"
- "fmt"
-)
-`,
- },
- {
- name: `issue 14075 ignore adjacent import "C"`,
- pkg: "bufio",
- in: `package main
-
-// Comment
-import "C"
-import "fmt"
-`,
- out: `package main
-
-// Comment
-import "C"
-import (
- "bufio"
- "fmt"
-)
-`,
- },
- {
- name: `issue 14075 ignore adjacent import "C" (without factored import)`,
- pkg: "bufio",
- in: `package main
-
-// Comment
-import "C"
-import "fmt"
-`,
- out: `package main
-
-// Comment
-import "C"
-import (
- "bufio"
- "fmt"
-)
-`,
- },
- {
- name: `issue 14075 ignore single import "C"`,
- pkg: "bufio",
- in: `package main
-
-// Comment
-import "C"
-`,
- out: `package main
-
-// Comment
-import "C"
-import "bufio"
-`,
- },
- {
- name: `issue 17212 several single-import lines with shared prefix ending in a slash`,
- pkg: "net/http",
- in: `package main
-
-import "bufio"
-import "net/url"
-`,
- out: `package main
-
-import (
- "bufio"
- "net/http"
- "net/url"
-)
-`,
- },
- {
- name: `issue 17212 block imports lines with shared prefix ending in a slash`,
- pkg: "net/http",
- in: `package main
-
-import (
- "bufio"
- "net/url"
-)
-`,
- out: `package main
-
-import (
- "bufio"
- "net/http"
- "net/url"
-)
-`,
- },
- {
- name: `issue 17213 many single-import lines`,
- pkg: "fmt",
- in: `package main
-
-import "bufio"
-import "bytes"
-import "errors"
-`,
- out: `package main
-
-import (
- "bufio"
- "bytes"
- "errors"
- "fmt"
-)
-`,
- },
-}
-
-func TestAddImport(t *testing.T) {
- for _, test := range addTests {
- file := parse(t, test.name, test.in)
- var before bytes.Buffer
- ast.Fprint(&before, fset, file, nil)
- AddNamedImport(fset, file, test.renamedPkg, test.pkg)
- if got := print(t, test.name, file); got != test.out {
- if test.broken {
- t.Logf("%s is known broken:\ngot: %s\nwant: %s", test.name, got, test.out)
- } else {
- t.Errorf("%s:\ngot: %s\nwant: %s", test.name, got, test.out)
- }
- var after bytes.Buffer
- ast.Fprint(&after, fset, file, nil)
-
- t.Logf("AST before:\n%s\nAST after:\n%s\n", before.String(), after.String())
- }
- }
-}
-
-func TestDoubleAddImport(t *testing.T) {
- file := parse(t, "doubleimport", "package main\n")
- AddImport(fset, file, "os")
- AddImport(fset, file, "bytes")
- want := `package main
-
-import (
- "bytes"
- "os"
-)
-`
- if got := print(t, "doubleimport", file); got != want {
- t.Errorf("got: %s\nwant: %s", got, want)
- }
-}
-
-func TestDoubleAddNamedImport(t *testing.T) {
- file := parse(t, "doublenamedimport", "package main\n")
- AddNamedImport(fset, file, "o", "os")
- AddNamedImport(fset, file, "i", "io")
- want := `package main
-
-import (
- i "io"
- o "os"
-)
-`
- if got := print(t, "doublenamedimport", file); got != want {
- t.Errorf("got: %s\nwant: %s", got, want)
- }
-}
-
-// Part of issue 8729.
-func TestDoubleAddImportWithDeclComment(t *testing.T) {
- file := parse(t, "doubleimport", `package main
-
-import (
-)
-
-// comment
-type I int
-`)
- // The AddImport order here matters.
- AddImport(fset, file, "golang.org/x/tools/go/ast/astutil")
- AddImport(fset, file, "os")
- want := `package main
-
-import (
- "golang.org/x/tools/go/ast/astutil"
- "os"
-)
-
-// comment
-type I int
-`
- if got := print(t, "doubleimport_with_decl_comment", file); got != want {
- t.Errorf("got: %s\nwant: %s", got, want)
- }
-}
-
-var deleteTests = []test{
- {
- name: "import.4",
- pkg: "os",
- in: `package main
-
-import (
- "os"
-)
-`,
- out: `package main
-`,
- },
- {
- name: "import.5",
- pkg: "os",
- in: `package main
-
-// Comment
-import "C"
-import "os"
-`,
- out: `package main
-
-// Comment
-import "C"
-`,
- },
- {
- name: "import.6",
- pkg: "os",
- in: `package main
-
-// Comment
-import "C"
-
-import (
- "io"
- "os"
- "utf8"
-)
-`,
- out: `package main
-
-// Comment
-import "C"
-
-import (
- "io"
- "utf8"
-)
-`,
- },
- {
- name: "import.7",
- pkg: "io",
- in: `package main
-
-import (
- "io" // a
- "os" // b
- "utf8" // c
-)
-`,
- out: `package main
-
-import (
- // a
- "os" // b
- "utf8" // c
-)
-`,
- },
- {
- name: "import.8",
- pkg: "os",
- in: `package main
-
-import (
- "io" // a
- "os" // b
- "utf8" // c
-)
-`,
- out: `package main
-
-import (
- "io" // a
- // b
- "utf8" // c
-)
-`,
- },
- {
- name: "import.9",
- pkg: "utf8",
- in: `package main
-
-import (
- "io" // a
- "os" // b
- "utf8" // c
-)
-`,
- out: `package main
-
-import (
- "io" // a
- "os" // b
- // c
-)
-`,
- },
- {
- name: "import.10",
- pkg: "io",
- in: `package main
-
-import (
- "io"
- "os"
- "utf8"
-)
-`,
- out: `package main
-
-import (
- "os"
- "utf8"
-)
-`,
- },
- {
- name: "import.11",
- pkg: "os",
- in: `package main
-
-import (
- "io"
- "os"
- "utf8"
-)
-`,
- out: `package main
-
-import (
- "io"
- "utf8"
-)
-`,
- },
- {
- name: "import.12",
- pkg: "utf8",
- in: `package main
-
-import (
- "io"
- "os"
- "utf8"
-)
-`,
- out: `package main
-
-import (
- "io"
- "os"
-)
-`,
- },
- {
- name: "handle.raw.quote.imports",
- pkg: "os",
- in: "package main\n\nimport `os`",
- out: `package main
-`,
- },
- {
- name: "import.13",
- pkg: "io",
- in: `package main
-
-import (
- "fmt"
-
- "io"
- "os"
- "utf8"
-
- "go/format"
-)
-`,
- out: `package main
-
-import (
- "fmt"
-
- "os"
- "utf8"
-
- "go/format"
-)
-`,
- },
- {
- name: "import.14",
- pkg: "io",
- in: `package main
-
-import (
- "fmt" // a
-
- "io" // b
- "os" // c
- "utf8" // d
-
- "go/format" // e
-)
-`,
- out: `package main
-
-import (
- "fmt" // a
-
- // b
- "os" // c
- "utf8" // d
-
- "go/format" // e
-)
-`,
- },
- {
- name: "import.15",
- pkg: "double",
- in: `package main
-
-import (
- "double"
- "double"
-)
-`,
- out: `package main
-`,
- },
- {
- name: "import.16",
- pkg: "bubble",
- in: `package main
-
-import (
- "toil"
- "bubble"
- "bubble"
- "trouble"
-)
-`,
- out: `package main
-
-import (
- "toil"
- "trouble"
-)
-`,
- },
- {
- name: "import.17",
- pkg: "quad",
- in: `package main
-
-import (
- "quad"
- "quad"
-)
-
-import (
- "quad"
- "quad"
-)
-`,
- out: `package main
-`,
- },
- {
- name: "import.18",
- renamedPkg: "x",
- pkg: "fmt",
- in: `package main
-
-import (
- "fmt"
- x "fmt"
-)
-`,
- out: `package main
-
-import (
- "fmt"
-)
-`,
- },
- {
- name: "import.18",
- renamedPkg: "x",
- pkg: "fmt",
- in: `package main
-
-import x "fmt"
-import y "fmt"
-`,
- out: `package main
-
-import y "fmt"
-`,
- },
- // Issue #15432, #18051
- {
- name: "import.19",
- pkg: "fmt",
- in: `package main
-
-import (
- "fmt"
-
- // Some comment.
- "io"
-)`,
- out: `package main
-
-import (
- // Some comment.
- "io"
-)
-`,
- },
- {
- name: "import.20",
- pkg: "fmt",
- in: `package main
-
-import (
- "fmt"
-
- // Some
- // comment.
- "io"
-)`,
- out: `package main
-
-import (
- // Some
- // comment.
- "io"
-)
-`,
- },
- {
- name: "import.21",
- pkg: "fmt",
- in: `package main
-
-import (
- "fmt"
-
- /*
- Some
- comment.
- */
- "io"
-)`,
- out: `package main
-
-import (
- /*
- Some
- comment.
- */
- "io"
-)
-`,
- },
- {
- name: "import.22",
- pkg: "fmt",
- in: `package main
-
-import (
- /* Some */
- // comment.
- "io"
- "fmt"
-)`,
- out: `package main
-
-import (
- /* Some */
- // comment.
- "io"
-)
-`,
- },
- {
- name: "import.23",
- pkg: "fmt",
- in: `package main
-
-import (
- // comment 1
- "fmt"
- // comment 2
- "io"
-)`,
- out: `package main
-
-import (
- // comment 2
- "io"
-)
-`,
- },
- {
- name: "import.24",
- pkg: "fmt",
- in: `package main
-
-import (
- "fmt" // comment 1
- "io" // comment 2
-)`,
- out: `package main
-
-import (
- "io" // comment 2
-)
-`,
- },
- {
- name: "import.25",
- pkg: "fmt",
- in: `package main
-
-import (
- "fmt"
- /* comment */ "io"
-)`,
- out: `package main
-
-import (
- /* comment */ "io"
-)
-`,
- },
- {
- name: "import.26",
- pkg: "fmt",
- in: `package main
-
-import (
- "fmt"
- "io" /* comment */
-)`,
- out: `package main
-
-import (
- "io" /* comment */
-)
-`,
- },
- {
- name: "import.27",
- pkg: "fmt",
- in: `package main
-
-import (
- "fmt" /* comment */
- "io"
-)`,
- out: `package main
-
-import (
- "io"
-)
-`,
- },
- {
- name: "import.28",
- pkg: "fmt",
- in: `package main
-
-import (
- /* comment */ "fmt"
- "io"
-)`,
- out: `package main
-
-import (
- "io"
-)
-`,
- },
- {
- name: "import.29",
- pkg: "fmt",
- in: `package main
-
-// comment 1
-import (
- "fmt"
- "io" // comment 2
-)`,
- out: `package main
-
-// comment 1
-import (
- "io" // comment 2
-)
-`,
- },
- {
- name: "import.30",
- pkg: "fmt",
- in: `package main
-
-// comment 1
-import (
- "fmt" // comment 2
- "io"
-)`,
- out: `package main
-
-// comment 1
-import (
- "io"
-)
-`,
- },
- {
- name: "import.31",
- pkg: "fmt",
- in: `package main
-
-// comment 1
-import (
- "fmt"
- /* comment 2 */ "io"
-)`,
- out: `package main
-
-// comment 1
-import (
- /* comment 2 */ "io"
-)
-`,
- },
- {
- name: "import.32",
- pkg: "fmt",
- renamedPkg: "f",
- in: `package main
-
-// comment 1
-import (
- f "fmt"
- /* comment 2 */ i "io"
-)`,
- out: `package main
-
-// comment 1
-import (
- /* comment 2 */ i "io"
-)
-`,
- },
- {
- name: "import.33",
- pkg: "fmt",
- renamedPkg: "f",
- in: `package main
-
-// comment 1
-import (
- /* comment 2 */ f "fmt"
- i "io"
-)`,
- out: `package main
-
-// comment 1
-import (
- i "io"
-)
-`,
- },
- {
- name: "import.34",
- pkg: "fmt",
- renamedPkg: "f",
- in: `package main
-
-// comment 1
-import (
- f "fmt" /* comment 2 */
- i "io"
-)`,
- out: `package main
-
-// comment 1
-import (
- i "io"
-)
-`,
- },
- {
- name: "import.35",
- pkg: "fmt",
- in: `package main
-
-// comment 1
-import (
- "fmt"
- // comment 2
- "io"
-)`,
- out: `package main
-
-// comment 1
-import (
- // comment 2
- "io"
-)
-`,
- },
- {
- name: "import.36",
- pkg: "fmt",
- in: `package main
-
-/* comment 1 */
-import (
- "fmt"
- /* comment 2 */
- "io"
-)`,
- out: `package main
-
-/* comment 1 */
-import (
- /* comment 2 */
- "io"
-)
-`,
- },
-
- // Issue 20229: MergeLine panic on weird input
- {
- name: "import.37",
- pkg: "io",
- in: `package main
-import("_"
-"io")`,
- out: `package main
-
-import (
- "_"
-)
-`,
- },
-}
-
-func TestDeleteImport(t *testing.T) {
- for _, test := range deleteTests {
- file := parse(t, test.name, test.in)
- DeleteNamedImport(fset, file, test.renamedPkg, test.pkg)
- if got := print(t, test.name, file); got != test.out {
- t.Errorf("%s:\ngot: %s\nwant: %s", test.name, got, test.out)
- }
- }
-}
-
-type rewriteTest struct {
- name string
- srcPkg string
- dstPkg string
- in string
- out string
-}
-
-var rewriteTests = []rewriteTest{
- {
- name: "import.13",
- srcPkg: "utf8",
- dstPkg: "encoding/utf8",
- in: `package main
-
-import (
- "io"
- "os"
- "utf8" // thanks ken
-)
-`,
- out: `package main
-
-import (
- "encoding/utf8" // thanks ken
- "io"
- "os"
-)
-`,
- },
- {
- name: "import.14",
- srcPkg: "asn1",
- dstPkg: "encoding/asn1",
- in: `package main
-
-import (
- "asn1"
- "crypto"
- "crypto/rsa"
- _ "crypto/sha1"
- "crypto/x509"
- "crypto/x509/pkix"
- "time"
-)
-
-var x = 1
-`,
- out: `package main
-
-import (
- "crypto"
- "crypto/rsa"
- _ "crypto/sha1"
- "crypto/x509"
- "crypto/x509/pkix"
- "encoding/asn1"
- "time"
-)
-
-var x = 1
-`,
- },
- {
- name: "import.15",
- srcPkg: "url",
- dstPkg: "net/url",
- in: `package main
-
-import (
- "bufio"
- "net"
- "path"
- "url"
-)
-
-var x = 1 // comment on x, not on url
-`,
- out: `package main
-
-import (
- "bufio"
- "net"
- "net/url"
- "path"
-)
-
-var x = 1 // comment on x, not on url
-`,
- },
- {
- name: "import.16",
- srcPkg: "http",
- dstPkg: "net/http",
- in: `package main
-
-import (
- "flag"
- "http"
- "log"
- "text/template"
-)
-
-var addr = flag.String("addr", ":1718", "http service address") // Q=17, R=18
-`,
- out: `package main
-
-import (
- "flag"
- "log"
- "net/http"
- "text/template"
-)
-
-var addr = flag.String("addr", ":1718", "http service address") // Q=17, R=18
-`,
- },
-}
-
-func TestRewriteImport(t *testing.T) {
- for _, test := range rewriteTests {
- file := parse(t, test.name, test.in)
- RewriteImport(fset, file, test.srcPkg, test.dstPkg)
- if got := print(t, test.name, file); got != test.out {
- t.Errorf("%s:\ngot: %s\nwant: %s", test.name, got, test.out)
- }
- }
-}
-
-var importsTests = []struct {
- name string
- in string
- want [][]string
-}{
- {
- name: "no packages",
- in: `package foo
-`,
- want: nil,
- },
- {
- name: "one group",
- in: `package foo
-
-import (
- "fmt"
- "testing"
-)
-`,
- want: [][]string{{"fmt", "testing"}},
- },
- {
- name: "four groups",
- in: `package foo
-
-import "C"
-import (
- "fmt"
- "testing"
-
- "appengine"
-
- "myproject/mylib1"
- "myproject/mylib2"
-)
-`,
- want: [][]string{
- {"C"},
- {"fmt", "testing"},
- {"appengine"},
- {"myproject/mylib1", "myproject/mylib2"},
- },
- },
- {
- name: "multiple factored groups",
- in: `package foo
-
-import (
- "fmt"
- "testing"
-
- "appengine"
-)
-import (
- "reflect"
-
- "bytes"
-)
-`,
- want: [][]string{
- {"fmt", "testing"},
- {"appengine"},
- {"reflect"},
- {"bytes"},
- },
- },
-}
-
-func unquote(s string) string {
- res, err := strconv.Unquote(s)
- if err != nil {
- return "could_not_unquote"
- }
- return res
-}
-
-func TestImports(t *testing.T) {
- fset := token.NewFileSet()
- for _, test := range importsTests {
- f, err := parser.ParseFile(fset, "test.go", test.in, 0)
- if err != nil {
- t.Errorf("%s: %v", test.name, err)
- continue
- }
- var got [][]string
- for _, group := range Imports(fset, f) {
- var b []string
- for _, spec := range group {
- b = append(b, unquote(spec.Path.Value))
- }
- got = append(got, b)
- }
- if !reflect.DeepEqual(got, test.want) {
- t.Errorf("Imports(%s)=%v, want %v", test.name, got, test.want)
- }
- }
-}
-
-var usesImportTests = []struct {
- name string
- path string
- in string
- want bool
-}{
- {
- name: "no packages",
- path: "io",
- in: `package foo
-`,
- want: false,
- },
- {
- name: "import.1",
- path: "io",
- in: `package foo
-
-import "io"
-
-var _ io.Writer
-`,
- want: true,
- },
- {
- name: "import.2",
- path: "io",
- in: `package foo
-
-import "io"
-`,
- want: false,
- },
- {
- name: "import.3",
- path: "io",
- in: `package foo
-
-import "io"
-
-var io = 42
-`,
- want: false,
- },
- {
- name: "import.4",
- path: "io",
- in: `package foo
-
-import i "io"
-
-var _ i.Writer
-`,
- want: true,
- },
- {
- name: "import.5",
- path: "io",
- in: `package foo
-
-import i "io"
-`,
- want: false,
- },
- {
- name: "import.6",
- path: "io",
- in: `package foo
-
-import i "io"
-
-var i = 42
-var io = 42
-`,
- want: false,
- },
- {
- name: "import.7",
- path: "encoding/json",
- in: `package foo
-
-import "encoding/json"
-
-var _ json.Encoder
-`,
- want: true,
- },
- {
- name: "import.8",
- path: "encoding/json",
- in: `package foo
-
-import "encoding/json"
-`,
- want: false,
- },
- {
- name: "import.9",
- path: "encoding/json",
- in: `package foo
-
-import "encoding/json"
-
-var json = 42
-`,
- want: false,
- },
- {
- name: "import.10",
- path: "encoding/json",
- in: `package foo
-
-import j "encoding/json"
-
-var _ j.Encoder
-`,
- want: true,
- },
- {
- name: "import.11",
- path: "encoding/json",
- in: `package foo
-
-import j "encoding/json"
-`,
- want: false,
- },
- {
- name: "import.12",
- path: "encoding/json",
- in: `package foo
-
-import j "encoding/json"
-
-var j = 42
-var json = 42
-`,
- want: false,
- },
- {
- name: "import.13",
- path: "io",
- in: `package foo
-
-import _ "io"
-`,
- want: true,
- },
- {
- name: "import.14",
- path: "io",
- in: `package foo
-
-import . "io"
-`,
- want: true,
- },
-}
-
-func TestUsesImport(t *testing.T) {
- fset := token.NewFileSet()
- for _, test := range usesImportTests {
- f, err := parser.ParseFile(fset, "test.go", test.in, 0)
- if err != nil {
- t.Errorf("%s: %v", test.name, err)
- continue
- }
- got := UsesImport(f, test.path)
- if got != test.want {
- t.Errorf("UsesImport(%s)=%v, want %v", test.name, got, test.want)
- }
- }
-}
diff --git a/vendor/golang.org/x/tools/go/ast/astutil/rewrite.go b/vendor/golang.org/x/tools/go/ast/astutil/rewrite.go
deleted file mode 100644
index cf72ea9..0000000
--- a/vendor/golang.org/x/tools/go/ast/astutil/rewrite.go
+++ /dev/null
@@ -1,477 +0,0 @@
-// Copyright 2017 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package astutil
-
-import (
- "fmt"
- "go/ast"
- "reflect"
- "sort"
-)
-
-// An ApplyFunc is invoked by Apply for each node n, even if n is nil,
-// before and/or after the node's children, using a Cursor describing
-// the current node and providing operations on it.
-//
-// The return value of ApplyFunc controls the syntax tree traversal.
-// See Apply for details.
-type ApplyFunc func(*Cursor) bool
-
-// Apply traverses a syntax tree recursively, starting with root,
-// and calling pre and post for each node as described below.
-// Apply returns the syntax tree, possibly modified.
-//
-// If pre is not nil, it is called for each node before the node's
-// children are traversed (pre-order). If pre returns false, no
-// children are traversed, and post is not called for that node.
-//
-// If post is not nil, and a prior call of pre didn't return false,
-// post is called for each node after its children are traversed
-// (post-order). If post returns false, traversal is terminated and
-// Apply returns immediately.
-//
-// Only fields that refer to AST nodes are considered children;
-// i.e., token.Pos, Scopes, Objects, and fields of basic types
-// (strings, etc.) are ignored.
-//
-// Children are traversed in the order in which they appear in the
-// respective node's struct definition. A package's files are
-// traversed in the filenames' alphabetical order.
-//
-func Apply(root ast.Node, pre, post ApplyFunc) (result ast.Node) {
- parent := &struct{ ast.Node }{root}
- defer func() {
- if r := recover(); r != nil && r != abort {
- panic(r)
- }
- result = parent.Node
- }()
- a := &application{pre: pre, post: post}
- a.apply(parent, "Node", nil, root)
- return
-}
-
-var abort = new(int) // singleton, to signal termination of Apply
-
-// A Cursor describes a node encountered during Apply.
-// Information about the node and its parent is available
-// from the Node, Parent, Name, and Index methods.
-//
-// If p is a variable of type and value of the current parent node
-// c.Parent(), and f is the field identifier with name c.Name(),
-// the following invariants hold:
-//
-// p.f == c.Node() if c.Index() < 0
-// p.f[c.Index()] == c.Node() if c.Index() >= 0
-//
-// The methods Replace, Delete, InsertBefore, and InsertAfter
-// can be used to change the AST without disrupting Apply.
-type Cursor struct {
- parent ast.Node
- name string
- iter *iterator // valid if non-nil
- node ast.Node
-}
-
-// Node returns the current Node.
-func (c *Cursor) Node() ast.Node { return c.node }
-
-// Parent returns the parent of the current Node.
-func (c *Cursor) Parent() ast.Node { return c.parent }
-
-// Name returns the name of the parent Node field that contains the current Node.
-// If the parent is a *ast.Package and the current Node is a *ast.File, Name returns
-// the filename for the current Node.
-func (c *Cursor) Name() string { return c.name }
-
-// Index reports the index >= 0 of the current Node in the slice of Nodes that
-// contains it, or a value < 0 if the current Node is not part of a slice.
-// The index of the current node changes if InsertBefore is called while
-// processing the current node.
-func (c *Cursor) Index() int {
- if c.iter != nil {
- return c.iter.index
- }
- return -1
-}
-
-// field returns the current node's parent field value.
-func (c *Cursor) field() reflect.Value {
- return reflect.Indirect(reflect.ValueOf(c.parent)).FieldByName(c.name)
-}
-
-// Replace replaces the current Node with n.
-// The replacement node is not walked by Apply.
-func (c *Cursor) Replace(n ast.Node) {
- if _, ok := c.node.(*ast.File); ok {
- file, ok := n.(*ast.File)
- if !ok {
- panic("attempt to replace *ast.File with non-*ast.File")
- }
- c.parent.(*ast.Package).Files[c.name] = file
- return
- }
-
- v := c.field()
- if i := c.Index(); i >= 0 {
- v = v.Index(i)
- }
- v.Set(reflect.ValueOf(n))
-}
-
-// Delete deletes the current Node from its containing slice.
-// If the current Node is not part of a slice, Delete panics.
-// As a special case, if the current node is a package file,
-// Delete removes it from the package's Files map.
-func (c *Cursor) Delete() {
- if _, ok := c.node.(*ast.File); ok {
- delete(c.parent.(*ast.Package).Files, c.name)
- return
- }
-
- i := c.Index()
- if i < 0 {
- panic("Delete node not contained in slice")
- }
- v := c.field()
- l := v.Len()
- reflect.Copy(v.Slice(i, l), v.Slice(i+1, l))
- v.Index(l - 1).Set(reflect.Zero(v.Type().Elem()))
- v.SetLen(l - 1)
- c.iter.step--
-}
-
-// InsertAfter inserts n after the current Node in its containing slice.
-// If the current Node is not part of a slice, InsertAfter panics.
-// Apply does not walk n.
-func (c *Cursor) InsertAfter(n ast.Node) {
- i := c.Index()
- if i < 0 {
- panic("InsertAfter node not contained in slice")
- }
- v := c.field()
- v.Set(reflect.Append(v, reflect.Zero(v.Type().Elem())))
- l := v.Len()
- reflect.Copy(v.Slice(i+2, l), v.Slice(i+1, l))
- v.Index(i + 1).Set(reflect.ValueOf(n))
- c.iter.step++
-}
-
-// InsertBefore inserts n before the current Node in its containing slice.
-// If the current Node is not part of a slice, InsertBefore panics.
-// Apply will not walk n.
-func (c *Cursor) InsertBefore(n ast.Node) {
- i := c.Index()
- if i < 0 {
- panic("InsertBefore node not contained in slice")
- }
- v := c.field()
- v.Set(reflect.Append(v, reflect.Zero(v.Type().Elem())))
- l := v.Len()
- reflect.Copy(v.Slice(i+1, l), v.Slice(i, l))
- v.Index(i).Set(reflect.ValueOf(n))
- c.iter.index++
-}
-
-// application carries all the shared data so we can pass it around cheaply.
-type application struct {
- pre, post ApplyFunc
- cursor Cursor
- iter iterator
-}
-
-func (a *application) apply(parent ast.Node, name string, iter *iterator, n ast.Node) {
- // convert typed nil into untyped nil
- if v := reflect.ValueOf(n); v.Kind() == reflect.Ptr && v.IsNil() {
- n = nil
- }
-
- // avoid heap-allocating a new cursor for each apply call; reuse a.cursor instead
- saved := a.cursor
- a.cursor.parent = parent
- a.cursor.name = name
- a.cursor.iter = iter
- a.cursor.node = n
-
- if a.pre != nil && !a.pre(&a.cursor) {
- a.cursor = saved
- return
- }
-
- // walk children
- // (the order of the cases matches the order of the corresponding node types in go/ast)
- switch n := n.(type) {
- case nil:
- // nothing to do
-
- // Comments and fields
- case *ast.Comment:
- // nothing to do
-
- case *ast.CommentGroup:
- if n != nil {
- a.applyList(n, "List")
- }
-
- case *ast.Field:
- a.apply(n, "Doc", nil, n.Doc)
- a.applyList(n, "Names")
- a.apply(n, "Type", nil, n.Type)
- a.apply(n, "Tag", nil, n.Tag)
- a.apply(n, "Comment", nil, n.Comment)
-
- case *ast.FieldList:
- a.applyList(n, "List")
-
- // Expressions
- case *ast.BadExpr, *ast.Ident, *ast.BasicLit:
- // nothing to do
-
- case *ast.Ellipsis:
- a.apply(n, "Elt", nil, n.Elt)
-
- case *ast.FuncLit:
- a.apply(n, "Type", nil, n.Type)
- a.apply(n, "Body", nil, n.Body)
-
- case *ast.CompositeLit:
- a.apply(n, "Type", nil, n.Type)
- a.applyList(n, "Elts")
-
- case *ast.ParenExpr:
- a.apply(n, "X", nil, n.X)
-
- case *ast.SelectorExpr:
- a.apply(n, "X", nil, n.X)
- a.apply(n, "Sel", nil, n.Sel)
-
- case *ast.IndexExpr:
- a.apply(n, "X", nil, n.X)
- a.apply(n, "Index", nil, n.Index)
-
- case *ast.SliceExpr:
- a.apply(n, "X", nil, n.X)
- a.apply(n, "Low", nil, n.Low)
- a.apply(n, "High", nil, n.High)
- a.apply(n, "Max", nil, n.Max)
-
- case *ast.TypeAssertExpr:
- a.apply(n, "X", nil, n.X)
- a.apply(n, "Type", nil, n.Type)
-
- case *ast.CallExpr:
- a.apply(n, "Fun", nil, n.Fun)
- a.applyList(n, "Args")
-
- case *ast.StarExpr:
- a.apply(n, "X", nil, n.X)
-
- case *ast.UnaryExpr:
- a.apply(n, "X", nil, n.X)
-
- case *ast.BinaryExpr:
- a.apply(n, "X", nil, n.X)
- a.apply(n, "Y", nil, n.Y)
-
- case *ast.KeyValueExpr:
- a.apply(n, "Key", nil, n.Key)
- a.apply(n, "Value", nil, n.Value)
-
- // Types
- case *ast.ArrayType:
- a.apply(n, "Len", nil, n.Len)
- a.apply(n, "Elt", nil, n.Elt)
-
- case *ast.StructType:
- a.apply(n, "Fields", nil, n.Fields)
-
- case *ast.FuncType:
- a.apply(n, "Params", nil, n.Params)
- a.apply(n, "Results", nil, n.Results)
-
- case *ast.InterfaceType:
- a.apply(n, "Methods", nil, n.Methods)
-
- case *ast.MapType:
- a.apply(n, "Key", nil, n.Key)
- a.apply(n, "Value", nil, n.Value)
-
- case *ast.ChanType:
- a.apply(n, "Value", nil, n.Value)
-
- // Statements
- case *ast.BadStmt:
- // nothing to do
-
- case *ast.DeclStmt:
- a.apply(n, "Decl", nil, n.Decl)
-
- case *ast.EmptyStmt:
- // nothing to do
-
- case *ast.LabeledStmt:
- a.apply(n, "Label", nil, n.Label)
- a.apply(n, "Stmt", nil, n.Stmt)
-
- case *ast.ExprStmt:
- a.apply(n, "X", nil, n.X)
-
- case *ast.SendStmt:
- a.apply(n, "Chan", nil, n.Chan)
- a.apply(n, "Value", nil, n.Value)
-
- case *ast.IncDecStmt:
- a.apply(n, "X", nil, n.X)
-
- case *ast.AssignStmt:
- a.applyList(n, "Lhs")
- a.applyList(n, "Rhs")
-
- case *ast.GoStmt:
- a.apply(n, "Call", nil, n.Call)
-
- case *ast.DeferStmt:
- a.apply(n, "Call", nil, n.Call)
-
- case *ast.ReturnStmt:
- a.applyList(n, "Results")
-
- case *ast.BranchStmt:
- a.apply(n, "Label", nil, n.Label)
-
- case *ast.BlockStmt:
- a.applyList(n, "List")
-
- case *ast.IfStmt:
- a.apply(n, "Init", nil, n.Init)
- a.apply(n, "Cond", nil, n.Cond)
- a.apply(n, "Body", nil, n.Body)
- a.apply(n, "Else", nil, n.Else)
-
- case *ast.CaseClause:
- a.applyList(n, "List")
- a.applyList(n, "Body")
-
- case *ast.SwitchStmt:
- a.apply(n, "Init", nil, n.Init)
- a.apply(n, "Tag", nil, n.Tag)
- a.apply(n, "Body", nil, n.Body)
-
- case *ast.TypeSwitchStmt:
- a.apply(n, "Init", nil, n.Init)
- a.apply(n, "Assign", nil, n.Assign)
- a.apply(n, "Body", nil, n.Body)
-
- case *ast.CommClause:
- a.apply(n, "Comm", nil, n.Comm)
- a.applyList(n, "Body")
-
- case *ast.SelectStmt:
- a.apply(n, "Body", nil, n.Body)
-
- case *ast.ForStmt:
- a.apply(n, "Init", nil, n.Init)
- a.apply(n, "Cond", nil, n.Cond)
- a.apply(n, "Post", nil, n.Post)
- a.apply(n, "Body", nil, n.Body)
-
- case *ast.RangeStmt:
- a.apply(n, "Key", nil, n.Key)
- a.apply(n, "Value", nil, n.Value)
- a.apply(n, "X", nil, n.X)
- a.apply(n, "Body", nil, n.Body)
-
- // Declarations
- case *ast.ImportSpec:
- a.apply(n, "Doc", nil, n.Doc)
- a.apply(n, "Name", nil, n.Name)
- a.apply(n, "Path", nil, n.Path)
- a.apply(n, "Comment", nil, n.Comment)
-
- case *ast.ValueSpec:
- a.apply(n, "Doc", nil, n.Doc)
- a.applyList(n, "Names")
- a.apply(n, "Type", nil, n.Type)
- a.applyList(n, "Values")
- a.apply(n, "Comment", nil, n.Comment)
-
- case *ast.TypeSpec:
- a.apply(n, "Doc", nil, n.Doc)
- a.apply(n, "Name", nil, n.Name)
- a.apply(n, "Type", nil, n.Type)
- a.apply(n, "Comment", nil, n.Comment)
-
- case *ast.BadDecl:
- // nothing to do
-
- case *ast.GenDecl:
- a.apply(n, "Doc", nil, n.Doc)
- a.applyList(n, "Specs")
-
- case *ast.FuncDecl:
- a.apply(n, "Doc", nil, n.Doc)
- a.apply(n, "Recv", nil, n.Recv)
- a.apply(n, "Name", nil, n.Name)
- a.apply(n, "Type", nil, n.Type)
- a.apply(n, "Body", nil, n.Body)
-
- // Files and packages
- case *ast.File:
- a.apply(n, "Doc", nil, n.Doc)
- a.apply(n, "Name", nil, n.Name)
- a.applyList(n, "Decls")
- // Don't walk n.Comments; they have either been walked already if
- // they are Doc comments, or they can be easily walked explicitly.
-
- case *ast.Package:
- // collect and sort names for reproducible behavior
- var names []string
- for name := range n.Files {
- names = append(names, name)
- }
- sort.Strings(names)
- for _, name := range names {
- a.apply(n, name, nil, n.Files[name])
- }
-
- default:
- panic(fmt.Sprintf("Apply: unexpected node type %T", n))
- }
-
- if a.post != nil && !a.post(&a.cursor) {
- panic(abort)
- }
-
- a.cursor = saved
-}
-
-// An iterator controls iteration over a slice of nodes.
-type iterator struct {
- index, step int
-}
-
-func (a *application) applyList(parent ast.Node, name string) {
- // avoid heap-allocating a new iterator for each applyList call; reuse a.iter instead
- saved := a.iter
- a.iter.index = 0
- for {
- // must reload parent.name each time, since cursor modifications might change it
- v := reflect.Indirect(reflect.ValueOf(parent)).FieldByName(name)
- if a.iter.index >= v.Len() {
- break
- }
-
- // element x may be nil in a bad AST - be cautious
- var x ast.Node
- if e := v.Index(a.iter.index); e.IsValid() {
- x = e.Interface().(ast.Node)
- }
-
- a.iter.step = 1
- a.apply(parent, name, &a.iter, x)
- a.iter.index += a.iter.step
- }
- a.iter = saved
-}
diff --git a/vendor/golang.org/x/tools/go/ast/astutil/rewrite_test.go b/vendor/golang.org/x/tools/go/ast/astutil/rewrite_test.go
deleted file mode 100644
index 1c86970..0000000
--- a/vendor/golang.org/x/tools/go/ast/astutil/rewrite_test.go
+++ /dev/null
@@ -1,248 +0,0 @@
-// Copyright 2017 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package astutil_test
-
-import (
- "bytes"
- "go/ast"
- "go/format"
- "go/parser"
- "go/token"
- "testing"
-
- "golang.org/x/tools/go/ast/astutil"
-)
-
-var rewriteTests = [...]struct {
- name string
- orig, want string
- pre, post astutil.ApplyFunc
-}{
- {name: "nop", orig: "package p\n", want: "package p\n"},
-
- {name: "replace",
- orig: `package p
-
-var x int
-`,
- want: `package p
-
-var t T
-`,
- post: func(c *astutil.Cursor) bool {
- if _, ok := c.Node().(*ast.ValueSpec); ok {
- c.Replace(valspec("t", "T"))
- return false
- }
- return true
- },
- },
-
- {name: "set doc strings",
- orig: `package p
-
-const z = 0
-
-type T struct{}
-
-var x int
-`,
- want: `package p
-// a foo is a foo
-const z = 0
-// a foo is a foo
-type T struct{}
-// a foo is a foo
-var x int
-`,
- post: func(c *astutil.Cursor) bool {
- if _, ok := c.Parent().(*ast.GenDecl); ok && c.Name() == "Doc" && c.Node() == nil {
- c.Replace(&ast.CommentGroup{List: []*ast.Comment{{Text: "// a foo is a foo"}}})
- }
- return true
- },
- },
-
- {name: "insert names",
- orig: `package p
-
-const a = 1
-`,
- want: `package p
-
-const a, b, c = 1, 2, 3
-`,
- pre: func(c *astutil.Cursor) bool {
- if _, ok := c.Parent().(*ast.ValueSpec); ok {
- switch c.Name() {
- case "Names":
- c.InsertAfter(ast.NewIdent("c"))
- c.InsertAfter(ast.NewIdent("b"))
- case "Values":
- c.InsertAfter(&ast.BasicLit{Kind: token.INT, Value: "3"})
- c.InsertAfter(&ast.BasicLit{Kind: token.INT, Value: "2"})
- }
- }
- return true
- },
- },
-
- {name: "insert",
- orig: `package p
-
-var (
- x int
- y int
-)
-`,
- want: `package p
-
-var before1 int
-var before2 int
-
-var (
- x int
- y int
-)
-var after2 int
-var after1 int
-`,
- pre: func(c *astutil.Cursor) bool {
- if _, ok := c.Node().(*ast.GenDecl); ok {
- c.InsertBefore(vardecl("before1", "int"))
- c.InsertAfter(vardecl("after1", "int"))
- c.InsertAfter(vardecl("after2", "int"))
- c.InsertBefore(vardecl("before2", "int"))
- }
- return true
- },
- },
-
- {name: "delete",
- orig: `package p
-
-var x int
-var y int
-var z int
-`,
- want: `package p
-
-var y int
-var z int
-`,
- pre: func(c *astutil.Cursor) bool {
- n := c.Node()
- if d, ok := n.(*ast.GenDecl); ok && d.Specs[0].(*ast.ValueSpec).Names[0].Name == "x" {
- c.Delete()
- }
- return true
- },
- },
-
- {name: "insertafter-delete",
- orig: `package p
-
-var x int
-var y int
-var z int
-`,
- want: `package p
-
-var x1 int
-
-var y int
-var z int
-`,
- pre: func(c *astutil.Cursor) bool {
- n := c.Node()
- if d, ok := n.(*ast.GenDecl); ok && d.Specs[0].(*ast.ValueSpec).Names[0].Name == "x" {
- c.InsertAfter(vardecl("x1", "int"))
- c.Delete()
- }
- return true
- },
- },
-
- {name: "delete-insertafter",
- orig: `package p
-
-var x int
-var y int
-var z int
-`,
- want: `package p
-
-var y int
-var x1 int
-var z int
-`,
- pre: func(c *astutil.Cursor) bool {
- n := c.Node()
- if d, ok := n.(*ast.GenDecl); ok && d.Specs[0].(*ast.ValueSpec).Names[0].Name == "x" {
- c.Delete()
- // The cursor is now effectively atop the 'var y int' node.
- c.InsertAfter(vardecl("x1", "int"))
- }
- return true
- },
- },
-}
-
-func valspec(name, typ string) *ast.ValueSpec {
- return &ast.ValueSpec{Names: []*ast.Ident{ast.NewIdent(name)},
- Type: ast.NewIdent(typ),
- }
-}
-
-func vardecl(name, typ string) *ast.GenDecl {
- return &ast.GenDecl{
- Tok: token.VAR,
- Specs: []ast.Spec{valspec(name, typ)},
- }
-}
-
-func TestRewrite(t *testing.T) {
- t.Run("*", func(t *testing.T) {
- for _, test := range rewriteTests {
- test := test
- t.Run(test.name, func(t *testing.T) {
- t.Parallel()
- fset := token.NewFileSet()
- f, err := parser.ParseFile(fset, test.name, test.orig, parser.ParseComments)
- if err != nil {
- t.Fatal(err)
- }
- n := astutil.Apply(f, test.pre, test.post)
- var buf bytes.Buffer
- if err := format.Node(&buf, fset, n); err != nil {
- t.Fatal(err)
- }
- got := buf.String()
- if got != test.want {
- t.Errorf("got:\n\n%s\nwant:\n\n%s\n", got, test.want)
- }
- })
- }
- })
-}
-
-var sink ast.Node
-
-func BenchmarkRewrite(b *testing.B) {
- for _, test := range rewriteTests {
- b.Run(test.name, func(b *testing.B) {
- for i := 0; i < b.N; i++ {
- b.StopTimer()
- fset := token.NewFileSet()
- f, err := parser.ParseFile(fset, test.name, test.orig, parser.ParseComments)
- if err != nil {
- b.Fatal(err)
- }
- b.StartTimer()
- sink = astutil.Apply(f, test.pre, test.post)
- }
- })
- }
-}
diff --git a/vendor/golang.org/x/tools/go/ast/astutil/util.go b/vendor/golang.org/x/tools/go/ast/astutil/util.go
deleted file mode 100644
index 7630629..0000000
--- a/vendor/golang.org/x/tools/go/ast/astutil/util.go
+++ /dev/null
@@ -1,14 +0,0 @@
-package astutil
-
-import "go/ast"
-
-// Unparen returns e with any enclosing parentheses stripped.
-func Unparen(e ast.Expr) ast.Expr {
- for {
- p, ok := e.(*ast.ParenExpr)
- if !ok {
- return e
- }
- e = p.X
- }
-}
diff --git a/vendor/golang.org/x/tools/go/buildutil/allpackages.go b/vendor/golang.org/x/tools/go/buildutil/allpackages.go
deleted file mode 100644
index c0cb03e..0000000
--- a/vendor/golang.org/x/tools/go/buildutil/allpackages.go
+++ /dev/null
@@ -1,198 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Package buildutil provides utilities related to the go/build
-// package in the standard library.
-//
-// All I/O is done via the build.Context file system interface, which must
-// be concurrency-safe.
-package buildutil // import "golang.org/x/tools/go/buildutil"
-
-import (
- "go/build"
- "os"
- "path/filepath"
- "sort"
- "strings"
- "sync"
-)
-
-// AllPackages returns the package path of each Go package in any source
-// directory of the specified build context (e.g. $GOROOT or an element
-// of $GOPATH). Errors are ignored. The results are sorted.
-// All package paths are canonical, and thus may contain "/vendor/".
-//
-// The result may include import paths for directories that contain no
-// *.go files, such as "archive" (in $GOROOT/src).
-//
-// All I/O is done via the build.Context file system interface,
-// which must be concurrency-safe.
-//
-func AllPackages(ctxt *build.Context) []string {
- var list []string
- ForEachPackage(ctxt, func(pkg string, _ error) {
- list = append(list, pkg)
- })
- sort.Strings(list)
- return list
-}
-
-// ForEachPackage calls the found function with the package path of
-// each Go package it finds in any source directory of the specified
-// build context (e.g. $GOROOT or an element of $GOPATH).
-// All package paths are canonical, and thus may contain "/vendor/".
-//
-// If the package directory exists but could not be read, the second
-// argument to the found function provides the error.
-//
-// All I/O is done via the build.Context file system interface,
-// which must be concurrency-safe.
-//
-func ForEachPackage(ctxt *build.Context, found func(importPath string, err error)) {
- ch := make(chan item)
-
- var wg sync.WaitGroup
- for _, root := range ctxt.SrcDirs() {
- root := root
- wg.Add(1)
- go func() {
- allPackages(ctxt, root, ch)
- wg.Done()
- }()
- }
- go func() {
- wg.Wait()
- close(ch)
- }()
-
- // All calls to found occur in the caller's goroutine.
- for i := range ch {
- found(i.importPath, i.err)
- }
-}
-
-type item struct {
- importPath string
- err error // (optional)
-}
-
-// We use a process-wide counting semaphore to limit
-// the number of parallel calls to ReadDir.
-var ioLimit = make(chan bool, 20)
-
-func allPackages(ctxt *build.Context, root string, ch chan<- item) {
- root = filepath.Clean(root) + string(os.PathSeparator)
-
- var wg sync.WaitGroup
-
- var walkDir func(dir string)
- walkDir = func(dir string) {
- // Avoid .foo, _foo, and testdata directory trees.
- base := filepath.Base(dir)
- if base == "" || base[0] == '.' || base[0] == '_' || base == "testdata" {
- return
- }
-
- pkg := filepath.ToSlash(strings.TrimPrefix(dir, root))
-
- // Prune search if we encounter any of these import paths.
- switch pkg {
- case "builtin":
- return
- }
-
- ioLimit <- true
- files, err := ReadDir(ctxt, dir)
- <-ioLimit
- if pkg != "" || err != nil {
- ch <- item{pkg, err}
- }
- for _, fi := range files {
- fi := fi
- if fi.IsDir() {
- wg.Add(1)
- go func() {
- walkDir(filepath.Join(dir, fi.Name()))
- wg.Done()
- }()
- }
- }
- }
-
- walkDir(root)
- wg.Wait()
-}
-
-// ExpandPatterns returns the set of packages matched by patterns,
-// which may have the following forms:
-//
-// golang.org/x/tools/cmd/guru # a single package
-// golang.org/x/tools/... # all packages beneath dir
-// ... # the entire workspace.
-//
-// Order is significant: a pattern preceded by '-' removes matching
-// packages from the set. For example, these patterns match all encoding
-// packages except encoding/xml:
-//
-// encoding/... -encoding/xml
-//
-// A trailing slash in a pattern is ignored. (Path components of Go
-// package names are separated by slash, not the platform's path separator.)
-//
-func ExpandPatterns(ctxt *build.Context, patterns []string) map[string]bool {
- // TODO(adonovan): support other features of 'go list':
- // - "std"/"cmd"/"all" meta-packages
- // - "..." not at the end of a pattern
- // - relative patterns using "./" or "../" prefix
-
- pkgs := make(map[string]bool)
- doPkg := func(pkg string, neg bool) {
- if neg {
- delete(pkgs, pkg)
- } else {
- pkgs[pkg] = true
- }
- }
-
- // Scan entire workspace if wildcards are present.
- // TODO(adonovan): opt: scan only the necessary subtrees of the workspace.
- var all []string
- for _, arg := range patterns {
- if strings.HasSuffix(arg, "...") {
- all = AllPackages(ctxt)
- break
- }
- }
-
- for _, arg := range patterns {
- if arg == "" {
- continue
- }
-
- neg := arg[0] == '-'
- if neg {
- arg = arg[1:]
- }
-
- if arg == "..." {
- // ... matches all packages
- for _, pkg := range all {
- doPkg(pkg, neg)
- }
- } else if dir := strings.TrimSuffix(arg, "/..."); dir != arg {
- // dir/... matches all packages beneath dir
- for _, pkg := range all {
- if strings.HasPrefix(pkg, dir) &&
- (len(pkg) == len(dir) || pkg[len(dir)] == '/') {
- doPkg(pkg, neg)
- }
- }
- } else {
- // single package
- doPkg(strings.TrimSuffix(arg, "/"), neg)
- }
- }
-
- return pkgs
-}
diff --git a/vendor/golang.org/x/tools/go/buildutil/allpackages_test.go b/vendor/golang.org/x/tools/go/buildutil/allpackages_test.go
deleted file mode 100644
index 0440ff2..0000000
--- a/vendor/golang.org/x/tools/go/buildutil/allpackages_test.go
+++ /dev/null
@@ -1,78 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Incomplete source tree on Android.
-
-// +build !android
-
-package buildutil_test
-
-import (
- "go/build"
- "sort"
- "strings"
- "testing"
-
- "golang.org/x/tools/go/buildutil"
-)
-
-func TestAllPackages(t *testing.T) {
- all := buildutil.AllPackages(&build.Default)
-
- set := make(map[string]bool)
- for _, pkg := range all {
- set[pkg] = true
- }
-
- const wantAtLeast = 250
- if len(all) < wantAtLeast {
- t.Errorf("Found only %d packages, want at least %d", len(all), wantAtLeast)
- }
-
- for _, want := range []string{"fmt", "crypto/sha256", "golang.org/x/tools/go/buildutil"} {
- if !set[want] {
- t.Errorf("Package %q not found; got %s", want, all)
- }
- }
-}
-
-func TestExpandPatterns(t *testing.T) {
- tree := make(map[string]map[string]string)
- for _, pkg := range []string{
- "encoding",
- "encoding/xml",
- "encoding/hex",
- "encoding/json",
- "fmt",
- } {
- tree[pkg] = make(map[string]string)
- }
- ctxt := buildutil.FakeContext(tree)
-
- for _, test := range []struct {
- patterns string
- want string
- }{
- {"", ""},
- {"fmt", "fmt"},
- {"nosuchpkg", "nosuchpkg"},
- {"nosuchdir/...", ""},
- {"...", "encoding encoding/hex encoding/json encoding/xml fmt"},
- {"encoding/... -encoding/xml", "encoding encoding/hex encoding/json"},
- {"... -encoding/...", "fmt"},
- {"encoding", "encoding"},
- {"encoding/", "encoding"},
- } {
- var pkgs []string
- for pkg := range buildutil.ExpandPatterns(ctxt, strings.Fields(test.patterns)) {
- pkgs = append(pkgs, pkg)
- }
- sort.Strings(pkgs)
- got := strings.Join(pkgs, " ")
- if got != test.want {
- t.Errorf("ExpandPatterns(%s) = %s, want %s",
- test.patterns, got, test.want)
- }
- }
-}
diff --git a/vendor/golang.org/x/tools/go/buildutil/fakecontext.go b/vendor/golang.org/x/tools/go/buildutil/fakecontext.go
deleted file mode 100644
index 24cbcbe..0000000
--- a/vendor/golang.org/x/tools/go/buildutil/fakecontext.go
+++ /dev/null
@@ -1,108 +0,0 @@
-package buildutil
-
-import (
- "fmt"
- "go/build"
- "io"
- "io/ioutil"
- "os"
- "path"
- "path/filepath"
- "sort"
- "strings"
- "time"
-)
-
-// FakeContext returns a build.Context for the fake file tree specified
-// by pkgs, which maps package import paths to a mapping from file base
-// names to contents.
-//
-// The fake Context has a GOROOT of "/go" and no GOPATH, and overrides
-// the necessary file access methods to read from memory instead of the
-// real file system.
-//
-// Unlike a real file tree, the fake one has only two levels---packages
-// and files---so ReadDir("/go/src/") returns all packages under
-// /go/src/ including, for instance, "math" and "math/big".
-// ReadDir("/go/src/math/big") would return all the files in the
-// "math/big" package.
-//
-func FakeContext(pkgs map[string]map[string]string) *build.Context {
- clean := func(filename string) string {
- f := path.Clean(filepath.ToSlash(filename))
- // Removing "/go/src" while respecting segment
- // boundaries has this unfortunate corner case:
- if f == "/go/src" {
- return ""
- }
- return strings.TrimPrefix(f, "/go/src/")
- }
-
- ctxt := build.Default // copy
- ctxt.GOROOT = "/go"
- ctxt.GOPATH = ""
- ctxt.IsDir = func(dir string) bool {
- dir = clean(dir)
- if dir == "" {
- return true // needed by (*build.Context).SrcDirs
- }
- return pkgs[dir] != nil
- }
- ctxt.ReadDir = func(dir string) ([]os.FileInfo, error) {
- dir = clean(dir)
- var fis []os.FileInfo
- if dir == "" {
- // enumerate packages
- for importPath := range pkgs {
- fis = append(fis, fakeDirInfo(importPath))
- }
- } else {
- // enumerate files of package
- for basename := range pkgs[dir] {
- fis = append(fis, fakeFileInfo(basename))
- }
- }
- sort.Sort(byName(fis))
- return fis, nil
- }
- ctxt.OpenFile = func(filename string) (io.ReadCloser, error) {
- filename = clean(filename)
- dir, base := path.Split(filename)
- content, ok := pkgs[path.Clean(dir)][base]
- if !ok {
- return nil, fmt.Errorf("file not found: %s", filename)
- }
- return ioutil.NopCloser(strings.NewReader(content)), nil
- }
- ctxt.IsAbsPath = func(path string) bool {
- path = filepath.ToSlash(path)
- // Don't rely on the default (filepath.Path) since on
- // Windows, it reports virtual paths as non-absolute.
- return strings.HasPrefix(path, "/")
- }
- return &ctxt
-}
-
-type byName []os.FileInfo
-
-func (s byName) Len() int { return len(s) }
-func (s byName) Swap(i, j int) { s[i], s[j] = s[j], s[i] }
-func (s byName) Less(i, j int) bool { return s[i].Name() < s[j].Name() }
-
-type fakeFileInfo string
-
-func (fi fakeFileInfo) Name() string { return string(fi) }
-func (fakeFileInfo) Sys() interface{} { return nil }
-func (fakeFileInfo) ModTime() time.Time { return time.Time{} }
-func (fakeFileInfo) IsDir() bool { return false }
-func (fakeFileInfo) Size() int64 { return 0 }
-func (fakeFileInfo) Mode() os.FileMode { return 0644 }
-
-type fakeDirInfo string
-
-func (fd fakeDirInfo) Name() string { return string(fd) }
-func (fakeDirInfo) Sys() interface{} { return nil }
-func (fakeDirInfo) ModTime() time.Time { return time.Time{} }
-func (fakeDirInfo) IsDir() bool { return true }
-func (fakeDirInfo) Size() int64 { return 0 }
-func (fakeDirInfo) Mode() os.FileMode { return 0755 }
diff --git a/vendor/golang.org/x/tools/go/buildutil/overlay.go b/vendor/golang.org/x/tools/go/buildutil/overlay.go
deleted file mode 100644
index 3f71c4f..0000000
--- a/vendor/golang.org/x/tools/go/buildutil/overlay.go
+++ /dev/null
@@ -1,103 +0,0 @@
-// Copyright 2016 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package buildutil
-
-import (
- "bufio"
- "bytes"
- "fmt"
- "go/build"
- "io"
- "io/ioutil"
- "path/filepath"
- "strconv"
- "strings"
-)
-
-// OverlayContext overlays a build.Context with additional files from
-// a map. Files in the map take precedence over other files.
-//
-// In addition to plain string comparison, two file names are
-// considered equal if their base names match and their directory
-// components point at the same directory on the file system. That is,
-// symbolic links are followed for directories, but not files.
-//
-// A common use case for OverlayContext is to allow editors to pass in
-// a set of unsaved, modified files.
-//
-// Currently, only the Context.OpenFile function will respect the
-// overlay. This may change in the future.
-func OverlayContext(orig *build.Context, overlay map[string][]byte) *build.Context {
- // TODO(dominikh): Implement IsDir, HasSubdir and ReadDir
-
- rc := func(data []byte) (io.ReadCloser, error) {
- return ioutil.NopCloser(bytes.NewBuffer(data)), nil
- }
-
- copy := *orig // make a copy
- ctxt := ©
- ctxt.OpenFile = func(path string) (io.ReadCloser, error) {
- // Fast path: names match exactly.
- if content, ok := overlay[path]; ok {
- return rc(content)
- }
-
- // Slow path: check for same file under a different
- // alias, perhaps due to a symbolic link.
- for filename, content := range overlay {
- if sameFile(path, filename) {
- return rc(content)
- }
- }
-
- return OpenFile(orig, path)
- }
- return ctxt
-}
-
-// ParseOverlayArchive parses an archive containing Go files and their
-// contents. The result is intended to be used with OverlayContext.
-//
-//
-// Archive format
-//
-// The archive consists of a series of files. Each file consists of a
-// name, a decimal file size and the file contents, separated by
-// newlinews. No newline follows after the file contents.
-func ParseOverlayArchive(archive io.Reader) (map[string][]byte, error) {
- overlay := make(map[string][]byte)
- r := bufio.NewReader(archive)
- for {
- // Read file name.
- filename, err := r.ReadString('\n')
- if err != nil {
- if err == io.EOF {
- break // OK
- }
- return nil, fmt.Errorf("reading archive file name: %v", err)
- }
- filename = filepath.Clean(strings.TrimSpace(filename))
-
- // Read file size.
- sz, err := r.ReadString('\n')
- if err != nil {
- return nil, fmt.Errorf("reading size of archive file %s: %v", filename, err)
- }
- sz = strings.TrimSpace(sz)
- size, err := strconv.ParseUint(sz, 10, 32)
- if err != nil {
- return nil, fmt.Errorf("parsing size of archive file %s: %v", filename, err)
- }
-
- // Read file content.
- content := make([]byte, size)
- if _, err := io.ReadFull(r, content); err != nil {
- return nil, fmt.Errorf("reading archive file %s: %v", filename, err)
- }
- overlay[filename] = content
- }
-
- return overlay, nil
-}
diff --git a/vendor/golang.org/x/tools/go/buildutil/overlay_test.go b/vendor/golang.org/x/tools/go/buildutil/overlay_test.go
deleted file mode 100644
index 92e2258..0000000
--- a/vendor/golang.org/x/tools/go/buildutil/overlay_test.go
+++ /dev/null
@@ -1,70 +0,0 @@
-package buildutil_test
-
-import (
- "go/build"
- "io/ioutil"
- "reflect"
- "strings"
- "testing"
-
- "golang.org/x/tools/go/buildutil"
-)
-
-func TestParseOverlayArchive(t *testing.T) {
- var tt = []struct {
- in string
- out map[string][]byte
- hasErr bool
- }{
- {
- "a.go\n5\n12345",
- map[string][]byte{"a.go": []byte("12345")},
- false,
- },
- {
- "a.go\n5\n1234",
- nil,
- true,
- },
- {
- "a.go\n5\n12345b.go\n4\n1234",
- map[string][]byte{"a.go": []byte("12345"), "b.go": []byte("1234")},
- false,
- },
- }
-
- for _, test := range tt {
- got, err := buildutil.ParseOverlayArchive(strings.NewReader(test.in))
- if err == nil && test.hasErr {
- t.Errorf("expected error for %q", test.in)
- }
- if err != nil && !test.hasErr {
- t.Errorf("unexpected error %v for %q", err, test.in)
- }
- if !reflect.DeepEqual(got, test.out) {
- t.Errorf("got %#v, want %#v", got, test.out)
- }
- }
-}
-
-func TestOverlay(t *testing.T) {
- ctx := &build.Default
- ov := map[string][]byte{
- "/somewhere/a.go": []byte("file contents"),
- }
- names := []string{"/somewhere/a.go", "/somewhere//a.go"}
- ctx = buildutil.OverlayContext(ctx, ov)
- for _, name := range names {
- f, err := buildutil.OpenFile(ctx, name)
- if err != nil {
- t.Errorf("unexpected error %v", err)
- }
- b, err := ioutil.ReadAll(f)
- if err != nil {
- t.Errorf("unexpected error %v", err)
- }
- if got, expected := string(b), string(ov["/somewhere/a.go"]); got != expected {
- t.Errorf("read %q, expected %q", got, expected)
- }
- }
-}
diff --git a/vendor/golang.org/x/tools/go/buildutil/tags.go b/vendor/golang.org/x/tools/go/buildutil/tags.go
deleted file mode 100644
index 486606f..0000000
--- a/vendor/golang.org/x/tools/go/buildutil/tags.go
+++ /dev/null
@@ -1,75 +0,0 @@
-package buildutil
-
-// This logic was copied from stringsFlag from $GOROOT/src/cmd/go/build.go.
-
-import "fmt"
-
-const TagsFlagDoc = "a list of `build tags` to consider satisfied during the build. " +
- "For more information about build tags, see the description of " +
- "build constraints in the documentation for the go/build package"
-
-// TagsFlag is an implementation of the flag.Value and flag.Getter interfaces that parses
-// a flag value in the same manner as go build's -tags flag and
-// populates a []string slice.
-//
-// See $GOROOT/src/go/build/doc.go for description of build tags.
-// See $GOROOT/src/cmd/go/doc.go for description of 'go build -tags' flag.
-//
-// Example:
-// flag.Var((*buildutil.TagsFlag)(&build.Default.BuildTags), "tags", buildutil.TagsFlagDoc)
-type TagsFlag []string
-
-func (v *TagsFlag) Set(s string) error {
- var err error
- *v, err = splitQuotedFields(s)
- if *v == nil {
- *v = []string{}
- }
- return err
-}
-
-func (v *TagsFlag) Get() interface{} { return *v }
-
-func splitQuotedFields(s string) ([]string, error) {
- // Split fields allowing '' or "" around elements.
- // Quotes further inside the string do not count.
- var f []string
- for len(s) > 0 {
- for len(s) > 0 && isSpaceByte(s[0]) {
- s = s[1:]
- }
- if len(s) == 0 {
- break
- }
- // Accepted quoted string. No unescaping inside.
- if s[0] == '"' || s[0] == '\'' {
- quote := s[0]
- s = s[1:]
- i := 0
- for i < len(s) && s[i] != quote {
- i++
- }
- if i >= len(s) {
- return nil, fmt.Errorf("unterminated %c string", quote)
- }
- f = append(f, s[:i])
- s = s[i+1:]
- continue
- }
- i := 0
- for i < len(s) && !isSpaceByte(s[i]) {
- i++
- }
- f = append(f, s[:i])
- s = s[i:]
- }
- return f, nil
-}
-
-func (v *TagsFlag) String() string {
- return ""
-}
-
-func isSpaceByte(c byte) bool {
- return c == ' ' || c == '\t' || c == '\n' || c == '\r'
-}
diff --git a/vendor/golang.org/x/tools/go/buildutil/tags_test.go b/vendor/golang.org/x/tools/go/buildutil/tags_test.go
deleted file mode 100644
index 0fc2618..0000000
--- a/vendor/golang.org/x/tools/go/buildutil/tags_test.go
+++ /dev/null
@@ -1,28 +0,0 @@
-package buildutil_test
-
-import (
- "flag"
- "go/build"
- "reflect"
- "testing"
-
- "golang.org/x/tools/go/buildutil"
-)
-
-func TestTags(t *testing.T) {
- f := flag.NewFlagSet("TestTags", flag.PanicOnError)
- var ctxt build.Context
- f.Var((*buildutil.TagsFlag)(&ctxt.BuildTags), "tags", buildutil.TagsFlagDoc)
- f.Parse([]string{"-tags", ` 'one'"two" 'three "four"'`, "rest"})
-
- // BuildTags
- want := []string{"one", "two", "three \"four\""}
- if !reflect.DeepEqual(ctxt.BuildTags, want) {
- t.Errorf("BuildTags = %q, want %q", ctxt.BuildTags, want)
- }
-
- // Args()
- if want := []string{"rest"}; !reflect.DeepEqual(f.Args(), want) {
- t.Errorf("f.Args() = %q, want %q", f.Args(), want)
- }
-}
diff --git a/vendor/golang.org/x/tools/go/buildutil/util.go b/vendor/golang.org/x/tools/go/buildutil/util.go
deleted file mode 100644
index fc923d7..0000000
--- a/vendor/golang.org/x/tools/go/buildutil/util.go
+++ /dev/null
@@ -1,212 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package buildutil
-
-import (
- "fmt"
- "go/ast"
- "go/build"
- "go/parser"
- "go/token"
- "io"
- "io/ioutil"
- "os"
- "path"
- "path/filepath"
- "strings"
-)
-
-// ParseFile behaves like parser.ParseFile,
-// but uses the build context's file system interface, if any.
-//
-// If file is not absolute (as defined by IsAbsPath), the (dir, file)
-// components are joined using JoinPath; dir must be absolute.
-//
-// The displayPath function, if provided, is used to transform the
-// filename that will be attached to the ASTs.
-//
-// TODO(adonovan): call this from go/loader.parseFiles when the tree thaws.
-//
-func ParseFile(fset *token.FileSet, ctxt *build.Context, displayPath func(string) string, dir string, file string, mode parser.Mode) (*ast.File, error) {
- if !IsAbsPath(ctxt, file) {
- file = JoinPath(ctxt, dir, file)
- }
- rd, err := OpenFile(ctxt, file)
- if err != nil {
- return nil, err
- }
- defer rd.Close() // ignore error
- if displayPath != nil {
- file = displayPath(file)
- }
- return parser.ParseFile(fset, file, rd, mode)
-}
-
-// ContainingPackage returns the package containing filename.
-//
-// If filename is not absolute, it is interpreted relative to working directory dir.
-// All I/O is via the build context's file system interface, if any.
-//
-// The '...Files []string' fields of the resulting build.Package are not
-// populated (build.FindOnly mode).
-//
-func ContainingPackage(ctxt *build.Context, dir, filename string) (*build.Package, error) {
- if !IsAbsPath(ctxt, filename) {
- filename = JoinPath(ctxt, dir, filename)
- }
-
- // We must not assume the file tree uses
- // "/" always,
- // `\` always,
- // or os.PathSeparator (which varies by platform),
- // but to make any progress, we are forced to assume that
- // paths will not use `\` unless the PathSeparator
- // is also `\`, thus we can rely on filepath.ToSlash for some sanity.
-
- dirSlash := path.Dir(filepath.ToSlash(filename)) + "/"
-
- // We assume that no source root (GOPATH[i] or GOROOT) contains any other.
- for _, srcdir := range ctxt.SrcDirs() {
- srcdirSlash := filepath.ToSlash(srcdir) + "/"
- if importPath, ok := HasSubdir(ctxt, srcdirSlash, dirSlash); ok {
- return ctxt.Import(importPath, dir, build.FindOnly)
- }
- }
-
- return nil, fmt.Errorf("can't find package containing %s", filename)
-}
-
-// -- Effective methods of file system interface -------------------------
-
-// (go/build.Context defines these as methods, but does not export them.)
-
-// hasSubdir calls ctxt.HasSubdir (if not nil) or else uses
-// the local file system to answer the question.
-func HasSubdir(ctxt *build.Context, root, dir string) (rel string, ok bool) {
- if f := ctxt.HasSubdir; f != nil {
- return f(root, dir)
- }
-
- // Try using paths we received.
- if rel, ok = hasSubdir(root, dir); ok {
- return
- }
-
- // Try expanding symlinks and comparing
- // expanded against unexpanded and
- // expanded against expanded.
- rootSym, _ := filepath.EvalSymlinks(root)
- dirSym, _ := filepath.EvalSymlinks(dir)
-
- if rel, ok = hasSubdir(rootSym, dir); ok {
- return
- }
- if rel, ok = hasSubdir(root, dirSym); ok {
- return
- }
- return hasSubdir(rootSym, dirSym)
-}
-
-func hasSubdir(root, dir string) (rel string, ok bool) {
- const sep = string(filepath.Separator)
- root = filepath.Clean(root)
- if !strings.HasSuffix(root, sep) {
- root += sep
- }
-
- dir = filepath.Clean(dir)
- if !strings.HasPrefix(dir, root) {
- return "", false
- }
-
- return filepath.ToSlash(dir[len(root):]), true
-}
-
-// FileExists returns true if the specified file exists,
-// using the build context's file system interface.
-func FileExists(ctxt *build.Context, path string) bool {
- if ctxt.OpenFile != nil {
- r, err := ctxt.OpenFile(path)
- if err != nil {
- return false
- }
- r.Close() // ignore error
- return true
- }
- _, err := os.Stat(path)
- return err == nil
-}
-
-// OpenFile behaves like os.Open,
-// but uses the build context's file system interface, if any.
-func OpenFile(ctxt *build.Context, path string) (io.ReadCloser, error) {
- if ctxt.OpenFile != nil {
- return ctxt.OpenFile(path)
- }
- return os.Open(path)
-}
-
-// IsAbsPath behaves like filepath.IsAbs,
-// but uses the build context's file system interface, if any.
-func IsAbsPath(ctxt *build.Context, path string) bool {
- if ctxt.IsAbsPath != nil {
- return ctxt.IsAbsPath(path)
- }
- return filepath.IsAbs(path)
-}
-
-// JoinPath behaves like filepath.Join,
-// but uses the build context's file system interface, if any.
-func JoinPath(ctxt *build.Context, path ...string) string {
- if ctxt.JoinPath != nil {
- return ctxt.JoinPath(path...)
- }
- return filepath.Join(path...)
-}
-
-// IsDir behaves like os.Stat plus IsDir,
-// but uses the build context's file system interface, if any.
-func IsDir(ctxt *build.Context, path string) bool {
- if ctxt.IsDir != nil {
- return ctxt.IsDir(path)
- }
- fi, err := os.Stat(path)
- return err == nil && fi.IsDir()
-}
-
-// ReadDir behaves like ioutil.ReadDir,
-// but uses the build context's file system interface, if any.
-func ReadDir(ctxt *build.Context, path string) ([]os.FileInfo, error) {
- if ctxt.ReadDir != nil {
- return ctxt.ReadDir(path)
- }
- return ioutil.ReadDir(path)
-}
-
-// SplitPathList behaves like filepath.SplitList,
-// but uses the build context's file system interface, if any.
-func SplitPathList(ctxt *build.Context, s string) []string {
- if ctxt.SplitPathList != nil {
- return ctxt.SplitPathList(s)
- }
- return filepath.SplitList(s)
-}
-
-// sameFile returns true if x and y have the same basename and denote
-// the same file.
-//
-func sameFile(x, y string) bool {
- if path.Clean(x) == path.Clean(y) {
- return true
- }
- if filepath.Base(x) == filepath.Base(y) { // (optimisation)
- if xi, err := os.Stat(x); err == nil {
- if yi, err := os.Stat(y); err == nil {
- return os.SameFile(xi, yi)
- }
- }
- }
- return false
-}
diff --git a/vendor/golang.org/x/tools/go/buildutil/util_test.go b/vendor/golang.org/x/tools/go/buildutil/util_test.go
deleted file mode 100644
index f7c26dd..0000000
--- a/vendor/golang.org/x/tools/go/buildutil/util_test.go
+++ /dev/null
@@ -1,81 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package buildutil_test
-
-import (
- "go/build"
- "io/ioutil"
- "os"
- "runtime"
- "testing"
-
- "golang.org/x/tools/go/buildutil"
-)
-
-func TestContainingPackage(t *testing.T) {
- // unvirtualized:
- goroot := runtime.GOROOT()
- gopath := gopathContainingTools(t)
-
- type Test struct {
- gopath, filename, wantPkg string
- }
-
- tests := []Test{
- {gopath, goroot + "/src/fmt/print.go", "fmt"},
- {gopath, goroot + "/src/encoding/json/foo.go", "encoding/json"},
- {gopath, goroot + "/src/encoding/missing/foo.go", "(not found)"},
- {gopath, gopath + "/src/golang.org/x/tools/go/buildutil/util_test.go",
- "golang.org/x/tools/go/buildutil"},
- }
-
- if runtime.GOOS != "windows" && runtime.GOOS != "plan9" {
- // Make a symlink to gopath for test
- tmp, err := ioutil.TempDir(os.TempDir(), "go")
- if err != nil {
- t.Errorf("Unable to create a temporary directory in %s", os.TempDir())
- }
-
- defer os.RemoveAll(tmp)
-
- // symlink between $GOPATH/src and /tmp/go/src
- // in order to test all possible symlink cases
- if err := os.Symlink(gopath+"/src", tmp+"/src"); err != nil {
- t.Fatal(err)
- }
- tests = append(tests, []Test{
- {gopath, tmp + "/src/golang.org/x/tools/go/buildutil/util_test.go", "golang.org/x/tools/go/buildutil"},
- {tmp, gopath + "/src/golang.org/x/tools/go/buildutil/util_test.go", "golang.org/x/tools/go/buildutil"},
- {tmp, tmp + "/src/golang.org/x/tools/go/buildutil/util_test.go", "golang.org/x/tools/go/buildutil"},
- }...)
- }
-
- for _, test := range tests {
- var got string
- var buildContext = build.Default
- buildContext.GOPATH = test.gopath
- bp, err := buildutil.ContainingPackage(&buildContext, ".", test.filename)
- if err != nil {
- got = "(not found)"
- } else {
- got = bp.ImportPath
- }
- if got != test.wantPkg {
- t.Errorf("ContainingPackage(%q) = %s, want %s", test.filename, got, test.wantPkg)
- }
- }
-
- // TODO(adonovan): test on virtualized GOPATH too.
-}
-
-// gopathContainingTools returns the path of the GOPATH workspace
-// with golang.org/x/tools, or fails the test if it can't locate it.
-func gopathContainingTools(t *testing.T) string {
- p, err := build.Import("golang.org/x/tools", "", build.FindOnly)
- if err != nil {
- t.Fatal(err)
- }
- return p.Root
-}
diff --git a/vendor/golang.org/x/tools/go/buildutil/util_windows_test.go b/vendor/golang.org/x/tools/go/buildutil/util_windows_test.go
deleted file mode 100644
index 86fe9c7..0000000
--- a/vendor/golang.org/x/tools/go/buildutil/util_windows_test.go
+++ /dev/null
@@ -1,48 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package buildutil_test
-
-import (
- "fmt"
- "go/build"
- "path/filepath"
- "runtime"
- "strings"
- "testing"
-
- "golang.org/x/tools/go/buildutil"
-)
-
-func testContainingPackageCaseFold(file, want string) error {
- bp, err := buildutil.ContainingPackage(&build.Default, ".", file)
- if err != nil {
- return err
- }
- if got := bp.ImportPath; got != want {
- return fmt.Errorf("ContainingPackage(%q) = %s, want %s", file, got, want)
- }
- return nil
-}
-
-func TestContainingPackageCaseFold(t *testing.T) {
- path := filepath.Join(runtime.GOROOT(), `src\fmt\print.go`)
- err := testContainingPackageCaseFold(path, "fmt")
- if err != nil {
- t.Error(err)
- }
- vol := filepath.VolumeName(path)
- if len(vol) != 2 || vol[1] != ':' {
- t.Fatalf("GOROOT path has unexpected volume name: %v", vol)
- }
- rest := path[len(vol):]
- err = testContainingPackageCaseFold(strings.ToUpper(vol)+rest, "fmt")
- if err != nil {
- t.Error(err)
- }
- err = testContainingPackageCaseFold(strings.ToLower(vol)+rest, "fmt")
- if err != nil {
- t.Error(err)
- }
-}
diff --git a/vendor/golang.org/x/tools/go/callgraph/callgraph.go b/vendor/golang.org/x/tools/go/callgraph/callgraph.go
deleted file mode 100644
index 707a319..0000000
--- a/vendor/golang.org/x/tools/go/callgraph/callgraph.go
+++ /dev/null
@@ -1,129 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-/*
-
-Package callgraph defines the call graph and various algorithms
-and utilities to operate on it.
-
-A call graph is a labelled directed graph whose nodes represent
-functions and whose edge labels represent syntactic function call
-sites. The presence of a labelled edge (caller, site, callee)
-indicates that caller may call callee at the specified call site.
-
-A call graph is a multigraph: it may contain multiple edges (caller,
-*, callee) connecting the same pair of nodes, so long as the edges
-differ by label; this occurs when one function calls another function
-from multiple call sites. Also, it may contain multiple edges
-(caller, site, *) that differ only by callee; this indicates a
-polymorphic call.
-
-A SOUND call graph is one that overapproximates the dynamic calling
-behaviors of the program in all possible executions. One call graph
-is more PRECISE than another if it is a smaller overapproximation of
-the dynamic behavior.
-
-All call graphs have a synthetic root node which is responsible for
-calling main() and init().
-
-Calls to built-in functions (e.g. panic, println) are not represented
-in the call graph; they are treated like built-in operators of the
-language.
-
-*/
-package callgraph // import "golang.org/x/tools/go/callgraph"
-
-// TODO(adonovan): add a function to eliminate wrappers from the
-// callgraph, preserving topology.
-// More generally, we could eliminate "uninteresting" nodes such as
-// nodes from packages we don't care about.
-
-import (
- "fmt"
- "go/token"
-
- "golang.org/x/tools/go/ssa"
-)
-
-// A Graph represents a call graph.
-//
-// A graph may contain nodes that are not reachable from the root.
-// If the call graph is sound, such nodes indicate unreachable
-// functions.
-//
-type Graph struct {
- Root *Node // the distinguished root node
- Nodes map[*ssa.Function]*Node // all nodes by function
-}
-
-// New returns a new Graph with the specified root node.
-func New(root *ssa.Function) *Graph {
- g := &Graph{Nodes: make(map[*ssa.Function]*Node)}
- g.Root = g.CreateNode(root)
- return g
-}
-
-// CreateNode returns the Node for fn, creating it if not present.
-func (g *Graph) CreateNode(fn *ssa.Function) *Node {
- n, ok := g.Nodes[fn]
- if !ok {
- n = &Node{Func: fn, ID: len(g.Nodes)}
- g.Nodes[fn] = n
- }
- return n
-}
-
-// A Node represents a node in a call graph.
-type Node struct {
- Func *ssa.Function // the function this node represents
- ID int // 0-based sequence number
- In []*Edge // unordered set of incoming call edges (n.In[*].Callee == n)
- Out []*Edge // unordered set of outgoing call edges (n.Out[*].Caller == n)
-}
-
-func (n *Node) String() string {
- return fmt.Sprintf("n%d:%s", n.ID, n.Func)
-}
-
-// A Edge represents an edge in the call graph.
-//
-// Site is nil for edges originating in synthetic or intrinsic
-// functions, e.g. reflect.Call or the root of the call graph.
-type Edge struct {
- Caller *Node
- Site ssa.CallInstruction
- Callee *Node
-}
-
-func (e Edge) String() string {
- return fmt.Sprintf("%s --> %s", e.Caller, e.Callee)
-}
-
-func (e Edge) Description() string {
- var prefix string
- switch e.Site.(type) {
- case nil:
- return "synthetic call"
- case *ssa.Go:
- prefix = "concurrent "
- case *ssa.Defer:
- prefix = "deferred "
- }
- return prefix + e.Site.Common().Description()
-}
-
-func (e Edge) Pos() token.Pos {
- if e.Site == nil {
- return token.NoPos
- }
- return e.Site.Pos()
-}
-
-// AddEdge adds the edge (caller, site, callee) to the call graph.
-// Elimination of duplicate edges is the caller's responsibility.
-func AddEdge(caller *Node, site ssa.CallInstruction, callee *Node) {
- e := &Edge{caller, site, callee}
- callee.In = append(callee.In, e)
- caller.Out = append(caller.Out, e)
-}
diff --git a/vendor/golang.org/x/tools/go/callgraph/cha/cha.go b/vendor/golang.org/x/tools/go/callgraph/cha/cha.go
deleted file mode 100644
index 215ff17..0000000
--- a/vendor/golang.org/x/tools/go/callgraph/cha/cha.go
+++ /dev/null
@@ -1,139 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Package cha computes the call graph of a Go program using the Class
-// Hierarchy Analysis (CHA) algorithm.
-//
-// CHA was first described in "Optimization of Object-Oriented Programs
-// Using Static Class Hierarchy Analysis", Jeffrey Dean, David Grove,
-// and Craig Chambers, ECOOP'95.
-//
-// CHA is related to RTA (see go/callgraph/rta); the difference is that
-// CHA conservatively computes the entire "implements" relation between
-// interfaces and concrete types ahead of time, whereas RTA uses dynamic
-// programming to construct it on the fly as it encounters new functions
-// reachable from main. CHA may thus include spurious call edges for
-// types that haven't been instantiated yet, or types that are never
-// instantiated.
-//
-// Since CHA conservatively assumes that all functions are address-taken
-// and all concrete types are put into interfaces, it is sound to run on
-// partial programs, such as libraries without a main or test function.
-//
-package cha // import "golang.org/x/tools/go/callgraph/cha"
-
-import (
- "go/types"
-
- "golang.org/x/tools/go/callgraph"
- "golang.org/x/tools/go/ssa"
- "golang.org/x/tools/go/ssa/ssautil"
- "golang.org/x/tools/go/types/typeutil"
-)
-
-// CallGraph computes the call graph of the specified program using the
-// Class Hierarchy Analysis algorithm.
-//
-func CallGraph(prog *ssa.Program) *callgraph.Graph {
- cg := callgraph.New(nil) // TODO(adonovan) eliminate concept of rooted callgraph
-
- allFuncs := ssautil.AllFunctions(prog)
-
- // funcsBySig contains all functions, keyed by signature. It is
- // the effective set of address-taken functions used to resolve
- // a dynamic call of a particular signature.
- var funcsBySig typeutil.Map // value is []*ssa.Function
-
- // methodsByName contains all methods,
- // grouped by name for efficient lookup.
- // (methodsById would be better but not every SSA method has a go/types ID.)
- methodsByName := make(map[string][]*ssa.Function)
-
- // An imethod represents an interface method I.m.
- // (There's no go/types object for it;
- // a *types.Func may be shared by many interfaces due to interface embedding.)
- type imethod struct {
- I *types.Interface
- id string
- }
- // methodsMemo records, for every abstract method call I.m on
- // interface type I, the set of concrete methods C.m of all
- // types C that satisfy interface I.
- //
- // Abstract methods may be shared by several interfaces,
- // hence we must pass I explicitly, not guess from m.
- //
- // methodsMemo is just a cache, so it needn't be a typeutil.Map.
- methodsMemo := make(map[imethod][]*ssa.Function)
- lookupMethods := func(I *types.Interface, m *types.Func) []*ssa.Function {
- id := m.Id()
- methods, ok := methodsMemo[imethod{I, id}]
- if !ok {
- for _, f := range methodsByName[m.Name()] {
- C := f.Signature.Recv().Type() // named or *named
- if types.Implements(C, I) {
- methods = append(methods, f)
- }
- }
- methodsMemo[imethod{I, id}] = methods
- }
- return methods
- }
-
- for f := range allFuncs {
- if f.Signature.Recv() == nil {
- // Package initializers can never be address-taken.
- if f.Name() == "init" && f.Synthetic == "package initializer" {
- continue
- }
- funcs, _ := funcsBySig.At(f.Signature).([]*ssa.Function)
- funcs = append(funcs, f)
- funcsBySig.Set(f.Signature, funcs)
- } else {
- methodsByName[f.Name()] = append(methodsByName[f.Name()], f)
- }
- }
-
- addEdge := func(fnode *callgraph.Node, site ssa.CallInstruction, g *ssa.Function) {
- gnode := cg.CreateNode(g)
- callgraph.AddEdge(fnode, site, gnode)
- }
-
- addEdges := func(fnode *callgraph.Node, site ssa.CallInstruction, callees []*ssa.Function) {
- // Because every call to a highly polymorphic and
- // frequently used abstract method such as
- // (io.Writer).Write is assumed to call every concrete
- // Write method in the program, the call graph can
- // contain a lot of duplication.
- //
- // TODO(adonovan): opt: consider factoring the callgraph
- // API so that the Callers component of each edge is a
- // slice of nodes, not a singleton.
- for _, g := range callees {
- addEdge(fnode, site, g)
- }
- }
-
- for f := range allFuncs {
- fnode := cg.CreateNode(f)
- for _, b := range f.Blocks {
- for _, instr := range b.Instrs {
- if site, ok := instr.(ssa.CallInstruction); ok {
- call := site.Common()
- if call.IsInvoke() {
- tiface := call.Value.Type().Underlying().(*types.Interface)
- addEdges(fnode, site, lookupMethods(tiface, call.Method))
- } else if g := call.StaticCallee(); g != nil {
- addEdge(fnode, site, g)
- } else if _, ok := call.Value.(*ssa.Builtin); !ok {
- callees, _ := funcsBySig.At(call.Signature()).([]*ssa.Function)
- addEdges(fnode, site, callees)
- }
- }
- }
- }
- }
-
- return cg
-}
diff --git a/vendor/golang.org/x/tools/go/callgraph/cha/cha_test.go b/vendor/golang.org/x/tools/go/callgraph/cha/cha_test.go
deleted file mode 100644
index cb2d585..0000000
--- a/vendor/golang.org/x/tools/go/callgraph/cha/cha_test.go
+++ /dev/null
@@ -1,111 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// No testdata on Android.
-
-// +build !android
-
-package cha_test
-
-import (
- "bytes"
- "fmt"
- "go/ast"
- "go/parser"
- "go/token"
- "go/types"
- "io/ioutil"
- "sort"
- "strings"
- "testing"
-
- "golang.org/x/tools/go/callgraph"
- "golang.org/x/tools/go/callgraph/cha"
- "golang.org/x/tools/go/loader"
- "golang.org/x/tools/go/ssa/ssautil"
-)
-
-var inputs = []string{
- "testdata/func.go",
- "testdata/iface.go",
- "testdata/recv.go",
- "testdata/issue23925.go",
-}
-
-func expectation(f *ast.File) (string, token.Pos) {
- for _, c := range f.Comments {
- text := strings.TrimSpace(c.Text())
- if t := strings.TrimPrefix(text, "WANT:\n"); t != text {
- return t, c.Pos()
- }
- }
- return "", token.NoPos
-}
-
-// TestCHA runs CHA on each file in inputs, prints the dynamic edges of
-// the call graph, and compares it with the golden results embedded in
-// the WANT comment at the end of the file.
-//
-func TestCHA(t *testing.T) {
- for _, filename := range inputs {
- content, err := ioutil.ReadFile(filename)
- if err != nil {
- t.Errorf("couldn't read file '%s': %s", filename, err)
- continue
- }
-
- conf := loader.Config{
- ParserMode: parser.ParseComments,
- }
- f, err := conf.ParseFile(filename, content)
- if err != nil {
- t.Error(err)
- continue
- }
-
- want, pos := expectation(f)
- if pos == token.NoPos {
- t.Errorf("No WANT: comment in %s", filename)
- continue
- }
-
- conf.CreateFromFiles("main", f)
- iprog, err := conf.Load()
- if err != nil {
- t.Error(err)
- continue
- }
-
- prog := ssautil.CreateProgram(iprog, 0)
- mainPkg := prog.Package(iprog.Created[0].Pkg)
- prog.Build()
-
- cg := cha.CallGraph(prog)
-
- if got := printGraph(cg, mainPkg.Pkg); got != want {
- t.Errorf("%s: got:\n%s\nwant:\n%s",
- prog.Fset.Position(pos), got, want)
- }
- }
-}
-
-func printGraph(cg *callgraph.Graph, from *types.Package) string {
- var edges []string
- callgraph.GraphVisitEdges(cg, func(e *callgraph.Edge) error {
- if strings.Contains(e.Description(), "dynamic") {
- edges = append(edges, fmt.Sprintf("%s --> %s",
- e.Caller.Func.RelString(from),
- e.Callee.Func.RelString(from)))
- }
- return nil
- })
- sort.Strings(edges)
-
- var buf bytes.Buffer
- buf.WriteString("Dynamic calls\n")
- for _, edge := range edges {
- fmt.Fprintf(&buf, " %s\n", edge)
- }
- return strings.TrimSpace(buf.String())
-}
diff --git a/vendor/golang.org/x/tools/go/callgraph/cha/testdata/func.go b/vendor/golang.org/x/tools/go/callgraph/cha/testdata/func.go
deleted file mode 100644
index ad483f1..0000000
--- a/vendor/golang.org/x/tools/go/callgraph/cha/testdata/func.go
+++ /dev/null
@@ -1,23 +0,0 @@
-//+build ignore
-
-package main
-
-// Test of dynamic function calls; no interfaces.
-
-func A(int) {}
-
-var (
- B = func(int) {}
- C = func(int) {}
-)
-
-func f() {
- pfn := B
- pfn(0) // calls A, B, C, even though A is not even address-taken
-}
-
-// WANT:
-// Dynamic calls
-// f --> A
-// f --> init$1
-// f --> init$2
diff --git a/vendor/golang.org/x/tools/go/callgraph/cha/testdata/iface.go b/vendor/golang.org/x/tools/go/callgraph/cha/testdata/iface.go
deleted file mode 100644
index 1622ec1..0000000
--- a/vendor/golang.org/x/tools/go/callgraph/cha/testdata/iface.go
+++ /dev/null
@@ -1,65 +0,0 @@
-//+build ignore
-
-package main
-
-// Test of interface calls. None of the concrete types are ever
-// instantiated or converted to interfaces.
-
-type I interface {
- f()
-}
-
-type J interface {
- f()
- g()
-}
-
-type C int // implements I
-
-func (*C) f()
-
-type D int // implements I and J
-
-func (*D) f()
-func (*D) g()
-
-func one(i I, j J) {
- i.f() // calls *C and *D
-}
-
-func two(i I, j J) {
- j.f() // calls *D (but not *C, even though it defines method f)
-}
-
-func three(i I, j J) {
- j.g() // calls *D
-}
-
-func four(i I, j J) {
- Jf := J.f
- if unknown {
- Jf = nil // suppress SSA constant propagation
- }
- Jf(nil) // calls *D
-}
-
-func five(i I, j J) {
- jf := j.f
- if unknown {
- jf = nil // suppress SSA constant propagation
- }
- jf() // calls *D
-}
-
-var unknown bool
-
-// WANT:
-// Dynamic calls
-// (J).f$bound --> (*D).f
-// (J).f$thunk --> (*D).f
-// five --> (J).f$bound
-// four --> (J).f$thunk
-// one --> (*C).f
-// one --> (*D).f
-// three --> (*D).g
-// two --> (*D).f
diff --git a/vendor/golang.org/x/tools/go/callgraph/cha/testdata/issue23925.go b/vendor/golang.org/x/tools/go/callgraph/cha/testdata/issue23925.go
deleted file mode 100644
index 59eaf18..0000000
--- a/vendor/golang.org/x/tools/go/callgraph/cha/testdata/issue23925.go
+++ /dev/null
@@ -1,38 +0,0 @@
-package main
-
-// Regression test for https://github.com/golang/go/issues/23925
-
-type stringFlagImpl string
-
-func (*stringFlagImpl) Set(s string) error { return nil }
-
-type boolFlagImpl bool
-
-func (*boolFlagImpl) Set(s string) error { return nil }
-func (*boolFlagImpl) extra() {}
-
-// A copy of flag.boolFlag interface, without a dependency.
-// Must appear first, so that it becomes the owner of the Set methods.
-type boolFlag interface {
- flagValue
- extra()
-}
-
-// A copy of flag.Value, without adding a dependency.
-type flagValue interface {
- Set(string) error
-}
-
-func main() {
- var x flagValue = new(stringFlagImpl)
- x.Set("")
-
- var y boolFlag = new(boolFlagImpl)
- y.Set("")
-}
-
-// WANT:
-// Dynamic calls
-// main --> (*boolFlagImpl).Set
-// main --> (*boolFlagImpl).Set
-// main --> (*stringFlagImpl).Set
diff --git a/vendor/golang.org/x/tools/go/callgraph/cha/testdata/recv.go b/vendor/golang.org/x/tools/go/callgraph/cha/testdata/recv.go
deleted file mode 100644
index 5ba48e9..0000000
--- a/vendor/golang.org/x/tools/go/callgraph/cha/testdata/recv.go
+++ /dev/null
@@ -1,37 +0,0 @@
-//+build ignore
-
-package main
-
-type I interface {
- f()
-}
-
-type J interface {
- g()
-}
-
-type C int // C and *C implement I; *C implements J
-
-func (C) f()
-func (*C) g()
-
-type D int // *D implements I and J
-
-func (*D) f()
-func (*D) g()
-
-func f(i I) {
- i.f() // calls C, *C, *D
-}
-
-func g(j J) {
- j.g() // calls *C, *D
-}
-
-// WANT:
-// Dynamic calls
-// f --> (*C).f
-// f --> (*D).f
-// f --> (C).f
-// g --> (*C).g
-// g --> (*D).g
diff --git a/vendor/golang.org/x/tools/go/callgraph/rta/rta.go b/vendor/golang.org/x/tools/go/callgraph/rta/rta.go
deleted file mode 100644
index 1a2dadf..0000000
--- a/vendor/golang.org/x/tools/go/callgraph/rta/rta.go
+++ /dev/null
@@ -1,459 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// This package provides Rapid Type Analysis (RTA) for Go, a fast
-// algorithm for call graph construction and discovery of reachable code
-// (and hence dead code) and runtime types. The algorithm was first
-// described in:
-//
-// David F. Bacon and Peter F. Sweeney. 1996.
-// Fast static analysis of C++ virtual function calls. (OOPSLA '96)
-// http://doi.acm.org/10.1145/236337.236371
-//
-// The algorithm uses dynamic programming to tabulate the cross-product
-// of the set of known "address taken" functions with the set of known
-// dynamic calls of the same type. As each new address-taken function
-// is discovered, call graph edges are added from each known callsite,
-// and as each new call site is discovered, call graph edges are added
-// from it to each known address-taken function.
-//
-// A similar approach is used for dynamic calls via interfaces: it
-// tabulates the cross-product of the set of known "runtime types",
-// i.e. types that may appear in an interface value, or be derived from
-// one via reflection, with the set of known "invoke"-mode dynamic
-// calls. As each new "runtime type" is discovered, call edges are
-// added from the known call sites, and as each new call site is
-// discovered, call graph edges are added to each compatible
-// method.
-//
-// In addition, we must consider all exported methods of any runtime type
-// as reachable, since they may be called via reflection.
-//
-// Each time a newly added call edge causes a new function to become
-// reachable, the code of that function is analyzed for more call sites,
-// address-taken functions, and runtime types. The process continues
-// until a fixed point is achieved.
-//
-// The resulting call graph is less precise than one produced by pointer
-// analysis, but the algorithm is much faster. For example, running the
-// cmd/callgraph tool on its own source takes ~2.1s for RTA and ~5.4s
-// for points-to analysis.
-//
-package rta // import "golang.org/x/tools/go/callgraph/rta"
-
-// TODO(adonovan): test it by connecting it to the interpreter and
-// replacing all "unreachable" functions by a special intrinsic, and
-// ensure that that intrinsic is never called.
-
-import (
- "fmt"
- "go/types"
-
- "golang.org/x/tools/go/callgraph"
- "golang.org/x/tools/go/ssa"
- "golang.org/x/tools/go/types/typeutil"
-)
-
-// A Result holds the results of Rapid Type Analysis, which includes the
-// set of reachable functions/methods, runtime types, and the call graph.
-//
-type Result struct {
- // CallGraph is the discovered callgraph.
- // It does not include edges for calls made via reflection.
- CallGraph *callgraph.Graph
-
- // Reachable contains the set of reachable functions and methods.
- // This includes exported methods of runtime types, since
- // they may be accessed via reflection.
- // The value indicates whether the function is address-taken.
- //
- // (We wrap the bool in a struct to avoid inadvertent use of
- // "if Reachable[f] {" to test for set membership.)
- Reachable map[*ssa.Function]struct{ AddrTaken bool }
-
- // RuntimeTypes contains the set of types that are needed at
- // runtime, for interfaces or reflection.
- //
- // The value indicates whether the type is inaccessible to reflection.
- // Consider:
- // type A struct{B}
- // fmt.Println(new(A))
- // Types *A, A and B are accessible to reflection, but the unnamed
- // type struct{B} is not.
- RuntimeTypes typeutil.Map
-}
-
-// Working state of the RTA algorithm.
-type rta struct {
- result *Result
-
- prog *ssa.Program
-
- worklist []*ssa.Function // list of functions to visit
-
- // addrTakenFuncsBySig contains all address-taken *Functions, grouped by signature.
- // Keys are *types.Signature, values are map[*ssa.Function]bool sets.
- addrTakenFuncsBySig typeutil.Map
-
- // dynCallSites contains all dynamic "call"-mode call sites, grouped by signature.
- // Keys are *types.Signature, values are unordered []ssa.CallInstruction.
- dynCallSites typeutil.Map
-
- // invokeSites contains all "invoke"-mode call sites, grouped by interface.
- // Keys are *types.Interface (never *types.Named),
- // Values are unordered []ssa.CallInstruction sets.
- invokeSites typeutil.Map
-
- // The following two maps together define the subset of the
- // m:n "implements" relation needed by the algorithm.
-
- // concreteTypes maps each concrete type to the set of interfaces that it implements.
- // Keys are types.Type, values are unordered []*types.Interface.
- // Only concrete types used as MakeInterface operands are included.
- concreteTypes typeutil.Map
-
- // interfaceTypes maps each interface type to
- // the set of concrete types that implement it.
- // Keys are *types.Interface, values are unordered []types.Type.
- // Only interfaces used in "invoke"-mode CallInstructions are included.
- interfaceTypes typeutil.Map
-}
-
-// addReachable marks a function as potentially callable at run-time,
-// and ensures that it gets processed.
-func (r *rta) addReachable(f *ssa.Function, addrTaken bool) {
- reachable := r.result.Reachable
- n := len(reachable)
- v := reachable[f]
- if addrTaken {
- v.AddrTaken = true
- }
- reachable[f] = v
- if len(reachable) > n {
- // First time seeing f. Add it to the worklist.
- r.worklist = append(r.worklist, f)
- }
-}
-
-// addEdge adds the specified call graph edge, and marks it reachable.
-// addrTaken indicates whether to mark the callee as "address-taken".
-func (r *rta) addEdge(site ssa.CallInstruction, callee *ssa.Function, addrTaken bool) {
- r.addReachable(callee, addrTaken)
-
- if g := r.result.CallGraph; g != nil {
- if site.Parent() == nil {
- panic(site)
- }
- from := g.CreateNode(site.Parent())
- to := g.CreateNode(callee)
- callgraph.AddEdge(from, site, to)
- }
-}
-
-// ---------- addrTakenFuncs × dynCallSites ----------
-
-// visitAddrTakenFunc is called each time we encounter an address-taken function f.
-func (r *rta) visitAddrTakenFunc(f *ssa.Function) {
- // Create two-level map (Signature -> Function -> bool).
- S := f.Signature
- funcs, _ := r.addrTakenFuncsBySig.At(S).(map[*ssa.Function]bool)
- if funcs == nil {
- funcs = make(map[*ssa.Function]bool)
- r.addrTakenFuncsBySig.Set(S, funcs)
- }
- if !funcs[f] {
- // First time seeing f.
- funcs[f] = true
-
- // If we've seen any dyncalls of this type, mark it reachable,
- // and add call graph edges.
- sites, _ := r.dynCallSites.At(S).([]ssa.CallInstruction)
- for _, site := range sites {
- r.addEdge(site, f, true)
- }
- }
-}
-
-// visitDynCall is called each time we encounter a dynamic "call"-mode call.
-func (r *rta) visitDynCall(site ssa.CallInstruction) {
- S := site.Common().Signature()
-
- // Record the call site.
- sites, _ := r.dynCallSites.At(S).([]ssa.CallInstruction)
- r.dynCallSites.Set(S, append(sites, site))
-
- // For each function of signature S that we know is address-taken,
- // mark it reachable. We'll add the callgraph edges later.
- funcs, _ := r.addrTakenFuncsBySig.At(S).(map[*ssa.Function]bool)
- for g := range funcs {
- r.addEdge(site, g, true)
- }
-}
-
-// ---------- concrete types × invoke sites ----------
-
-// addInvokeEdge is called for each new pair (site, C) in the matrix.
-func (r *rta) addInvokeEdge(site ssa.CallInstruction, C types.Type) {
- // Ascertain the concrete method of C to be called.
- imethod := site.Common().Method
- cmethod := r.prog.MethodValue(r.prog.MethodSets.MethodSet(C).Lookup(imethod.Pkg(), imethod.Name()))
- r.addEdge(site, cmethod, true)
-}
-
-// visitInvoke is called each time the algorithm encounters an "invoke"-mode call.
-func (r *rta) visitInvoke(site ssa.CallInstruction) {
- I := site.Common().Value.Type().Underlying().(*types.Interface)
-
- // Record the invoke site.
- sites, _ := r.invokeSites.At(I).([]ssa.CallInstruction)
- r.invokeSites.Set(I, append(sites, site))
-
- // Add callgraph edge for each existing
- // address-taken concrete type implementing I.
- for _, C := range r.implementations(I) {
- r.addInvokeEdge(site, C)
- }
-}
-
-// ---------- main algorithm ----------
-
-// visitFunc processes function f.
-func (r *rta) visitFunc(f *ssa.Function) {
- var space [32]*ssa.Value // preallocate space for common case
-
- for _, b := range f.Blocks {
- for _, instr := range b.Instrs {
- rands := instr.Operands(space[:0])
-
- switch instr := instr.(type) {
- case ssa.CallInstruction:
- call := instr.Common()
- if call.IsInvoke() {
- r.visitInvoke(instr)
- } else if g := call.StaticCallee(); g != nil {
- r.addEdge(instr, g, false)
- } else if _, ok := call.Value.(*ssa.Builtin); !ok {
- r.visitDynCall(instr)
- }
-
- // Ignore the call-position operand when
- // looking for address-taken Functions.
- // Hack: assume this is rands[0].
- rands = rands[1:]
-
- case *ssa.MakeInterface:
- r.addRuntimeType(instr.X.Type(), false)
- }
-
- // Process all address-taken functions.
- for _, op := range rands {
- if g, ok := (*op).(*ssa.Function); ok {
- r.visitAddrTakenFunc(g)
- }
- }
- }
- }
-}
-
-// Analyze performs Rapid Type Analysis, starting at the specified root
-// functions. It returns nil if no roots were specified.
-//
-// If buildCallGraph is true, Result.CallGraph will contain a call
-// graph; otherwise, only the other fields (reachable functions) are
-// populated.
-//
-func Analyze(roots []*ssa.Function, buildCallGraph bool) *Result {
- if len(roots) == 0 {
- return nil
- }
-
- r := &rta{
- result: &Result{Reachable: make(map[*ssa.Function]struct{ AddrTaken bool })},
- prog: roots[0].Prog,
- }
-
- if buildCallGraph {
- // TODO(adonovan): change callgraph API to eliminate the
- // notion of a distinguished root node. Some callgraphs
- // have many roots, or none.
- r.result.CallGraph = callgraph.New(roots[0])
- }
-
- hasher := typeutil.MakeHasher()
- r.result.RuntimeTypes.SetHasher(hasher)
- r.addrTakenFuncsBySig.SetHasher(hasher)
- r.dynCallSites.SetHasher(hasher)
- r.invokeSites.SetHasher(hasher)
- r.concreteTypes.SetHasher(hasher)
- r.interfaceTypes.SetHasher(hasher)
-
- // Visit functions, processing their instructions, and adding
- // new functions to the worklist, until a fixed point is
- // reached.
- var shadow []*ssa.Function // for efficiency, we double-buffer the worklist
- r.worklist = append(r.worklist, roots...)
- for len(r.worklist) > 0 {
- shadow, r.worklist = r.worklist, shadow[:0]
- for _, f := range shadow {
- r.visitFunc(f)
- }
- }
- return r.result
-}
-
-// interfaces(C) returns all currently known interfaces implemented by C.
-func (r *rta) interfaces(C types.Type) []*types.Interface {
- // Ascertain set of interfaces C implements
- // and update 'implements' relation.
- var ifaces []*types.Interface
- r.interfaceTypes.Iterate(func(I types.Type, concs interface{}) {
- if I := I.(*types.Interface); types.Implements(C, I) {
- concs, _ := concs.([]types.Type)
- r.interfaceTypes.Set(I, append(concs, C))
- ifaces = append(ifaces, I)
- }
- })
- r.concreteTypes.Set(C, ifaces)
- return ifaces
-}
-
-// implementations(I) returns all currently known concrete types that implement I.
-func (r *rta) implementations(I *types.Interface) []types.Type {
- var concs []types.Type
- if v := r.interfaceTypes.At(I); v != nil {
- concs = v.([]types.Type)
- } else {
- // First time seeing this interface.
- // Update the 'implements' relation.
- r.concreteTypes.Iterate(func(C types.Type, ifaces interface{}) {
- if types.Implements(C, I) {
- ifaces, _ := ifaces.([]*types.Interface)
- r.concreteTypes.Set(C, append(ifaces, I))
- concs = append(concs, C)
- }
- })
- r.interfaceTypes.Set(I, concs)
- }
- return concs
-}
-
-// addRuntimeType is called for each concrete type that can be the
-// dynamic type of some interface or reflect.Value.
-// Adapted from needMethods in go/ssa/builder.go
-//
-func (r *rta) addRuntimeType(T types.Type, skip bool) {
- if prev, ok := r.result.RuntimeTypes.At(T).(bool); ok {
- if skip && !prev {
- r.result.RuntimeTypes.Set(T, skip)
- }
- return
- }
- r.result.RuntimeTypes.Set(T, skip)
-
- mset := r.prog.MethodSets.MethodSet(T)
-
- if _, ok := T.Underlying().(*types.Interface); !ok {
- // T is a new concrete type.
- for i, n := 0, mset.Len(); i < n; i++ {
- sel := mset.At(i)
- m := sel.Obj()
-
- if m.Exported() {
- // Exported methods are always potentially callable via reflection.
- r.addReachable(r.prog.MethodValue(sel), true)
- }
- }
-
- // Add callgraph edge for each existing dynamic
- // "invoke"-mode call via that interface.
- for _, I := range r.interfaces(T) {
- sites, _ := r.invokeSites.At(I).([]ssa.CallInstruction)
- for _, site := range sites {
- r.addInvokeEdge(site, T)
- }
- }
- }
-
- // Precondition: T is not a method signature (*Signature with Recv()!=nil).
- // Recursive case: skip => don't call makeMethods(T).
- // Each package maintains its own set of types it has visited.
-
- var n *types.Named
- switch T := T.(type) {
- case *types.Named:
- n = T
- case *types.Pointer:
- n, _ = T.Elem().(*types.Named)
- }
- if n != nil {
- owner := n.Obj().Pkg()
- if owner == nil {
- return // built-in error type
- }
- }
-
- // Recursion over signatures of each exported method.
- for i := 0; i < mset.Len(); i++ {
- if mset.At(i).Obj().Exported() {
- sig := mset.At(i).Type().(*types.Signature)
- r.addRuntimeType(sig.Params(), true) // skip the Tuple itself
- r.addRuntimeType(sig.Results(), true) // skip the Tuple itself
- }
- }
-
- switch t := T.(type) {
- case *types.Basic:
- // nop
-
- case *types.Interface:
- // nop---handled by recursion over method set.
-
- case *types.Pointer:
- r.addRuntimeType(t.Elem(), false)
-
- case *types.Slice:
- r.addRuntimeType(t.Elem(), false)
-
- case *types.Chan:
- r.addRuntimeType(t.Elem(), false)
-
- case *types.Map:
- r.addRuntimeType(t.Key(), false)
- r.addRuntimeType(t.Elem(), false)
-
- case *types.Signature:
- if t.Recv() != nil {
- panic(fmt.Sprintf("Signature %s has Recv %s", t, t.Recv()))
- }
- r.addRuntimeType(t.Params(), true) // skip the Tuple itself
- r.addRuntimeType(t.Results(), true) // skip the Tuple itself
-
- case *types.Named:
- // A pointer-to-named type can be derived from a named
- // type via reflection. It may have methods too.
- r.addRuntimeType(types.NewPointer(T), false)
-
- // Consider 'type T struct{S}' where S has methods.
- // Reflection provides no way to get from T to struct{S},
- // only to S, so the method set of struct{S} is unwanted,
- // so set 'skip' flag during recursion.
- r.addRuntimeType(t.Underlying(), true)
-
- case *types.Array:
- r.addRuntimeType(t.Elem(), false)
-
- case *types.Struct:
- for i, n := 0, t.NumFields(); i < n; i++ {
- r.addRuntimeType(t.Field(i).Type(), false)
- }
-
- case *types.Tuple:
- for i, n := 0, t.Len(); i < n; i++ {
- r.addRuntimeType(t.At(i).Type(), false)
- }
-
- default:
- panic(T)
- }
-}
diff --git a/vendor/golang.org/x/tools/go/callgraph/rta/rta_test.go b/vendor/golang.org/x/tools/go/callgraph/rta/rta_test.go
deleted file mode 100644
index 28a00b3..0000000
--- a/vendor/golang.org/x/tools/go/callgraph/rta/rta_test.go
+++ /dev/null
@@ -1,139 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// No testdata on Android.
-
-// +build !android
-
-package rta_test
-
-import (
- "bytes"
- "fmt"
- "go/ast"
- "go/parser"
- "go/token"
- "go/types"
- "io/ioutil"
- "sort"
- "strings"
- "testing"
-
- "golang.org/x/tools/go/callgraph"
- "golang.org/x/tools/go/callgraph/rta"
- "golang.org/x/tools/go/loader"
- "golang.org/x/tools/go/ssa"
- "golang.org/x/tools/go/ssa/ssautil"
-)
-
-var inputs = []string{
- "testdata/func.go",
- "testdata/rtype.go",
- "testdata/iface.go",
-}
-
-func expectation(f *ast.File) (string, token.Pos) {
- for _, c := range f.Comments {
- text := strings.TrimSpace(c.Text())
- if t := strings.TrimPrefix(text, "WANT:\n"); t != text {
- return t, c.Pos()
- }
- }
- return "", token.NoPos
-}
-
-// TestRTA runs RTA on each file in inputs, prints the results, and
-// compares it with the golden results embedded in the WANT comment at
-// the end of the file.
-//
-// The results string consists of two parts: the set of dynamic call
-// edges, "f --> g", one per line, and the set of reachable functions,
-// one per line. Each set is sorted.
-//
-func TestRTA(t *testing.T) {
- for _, filename := range inputs {
- content, err := ioutil.ReadFile(filename)
- if err != nil {
- t.Errorf("couldn't read file '%s': %s", filename, err)
- continue
- }
-
- conf := loader.Config{
- ParserMode: parser.ParseComments,
- }
- f, err := conf.ParseFile(filename, content)
- if err != nil {
- t.Error(err)
- continue
- }
-
- want, pos := expectation(f)
- if pos == token.NoPos {
- t.Errorf("No WANT: comment in %s", filename)
- continue
- }
-
- conf.CreateFromFiles("main", f)
- iprog, err := conf.Load()
- if err != nil {
- t.Error(err)
- continue
- }
-
- prog := ssautil.CreateProgram(iprog, 0)
- mainPkg := prog.Package(iprog.Created[0].Pkg)
- prog.Build()
-
- res := rta.Analyze([]*ssa.Function{
- mainPkg.Func("main"),
- mainPkg.Func("init"),
- }, true)
-
- if got := printResult(res, mainPkg.Pkg); got != want {
- t.Errorf("%s: got:\n%s\nwant:\n%s",
- prog.Fset.Position(pos), got, want)
- }
- }
-}
-
-func printResult(res *rta.Result, from *types.Package) string {
- var buf bytes.Buffer
-
- writeSorted := func(ss []string) {
- sort.Strings(ss)
- for _, s := range ss {
- fmt.Fprintf(&buf, " %s\n", s)
- }
- }
-
- buf.WriteString("Dynamic calls\n")
- var edges []string
- callgraph.GraphVisitEdges(res.CallGraph, func(e *callgraph.Edge) error {
- if strings.Contains(e.Description(), "dynamic") {
- edges = append(edges, fmt.Sprintf("%s --> %s",
- e.Caller.Func.RelString(from),
- e.Callee.Func.RelString(from)))
- }
- return nil
- })
- writeSorted(edges)
-
- buf.WriteString("Reachable functions\n")
- var reachable []string
- for f := range res.Reachable {
- reachable = append(reachable, f.RelString(from))
- }
- writeSorted(reachable)
-
- buf.WriteString("Reflect types\n")
- var rtypes []string
- res.RuntimeTypes.Iterate(func(key types.Type, value interface{}) {
- if value == false { // accessible to reflection
- rtypes = append(rtypes, types.TypeString(key, types.RelativeTo(from)))
- }
- })
- writeSorted(rtypes)
-
- return strings.TrimSpace(buf.String())
-}
diff --git a/vendor/golang.org/x/tools/go/callgraph/rta/testdata/func.go b/vendor/golang.org/x/tools/go/callgraph/rta/testdata/func.go
deleted file mode 100644
index 968c73d..0000000
--- a/vendor/golang.org/x/tools/go/callgraph/rta/testdata/func.go
+++ /dev/null
@@ -1,37 +0,0 @@
-//+build ignore
-
-package main
-
-// Test of dynamic function calls.
-// No interfaces, so no runtime/reflect types.
-
-func A1() {
- A2(0)
-}
-
-func A2(int) {} // not address-taken
-
-func B() {} // unreachable
-
-var (
- C = func(int) {}
- D = func(int) {}
-)
-
-func main() {
- A1()
-
- pfn := C
- pfn(0) // calls C and D but not A2 (same sig but not address-taken)
-}
-
-// WANT:
-// Dynamic calls
-// main --> init$1
-// main --> init$2
-// Reachable functions
-// A1
-// A2
-// init$1
-// init$2
-// Reflect types
diff --git a/vendor/golang.org/x/tools/go/callgraph/rta/testdata/iface.go b/vendor/golang.org/x/tools/go/callgraph/rta/testdata/iface.go
deleted file mode 100644
index c3ee570..0000000
--- a/vendor/golang.org/x/tools/go/callgraph/rta/testdata/iface.go
+++ /dev/null
@@ -1,79 +0,0 @@
-//+build ignore
-
-package main
-
-// Test of interface calls.
-
-func use(interface{})
-
-type A byte // instantiated but not a reflect type
-
-func (A) f() {} // called directly
-func (A) F() {} // unreachable
-
-type B int // a reflect type
-
-func (*B) f() {} // reachable via interface invoke
-func (*B) F() {} // reachable: exported method of reflect type
-
-type B2 int // a reflect type, and *B2 also
-
-func (B2) f() {} // reachable via interface invoke
-func (B2) g() {} // reachable: exported method of reflect type
-
-type C string // not instantiated
-
-func (C) f() {} // unreachable
-func (C) F() {} // unreachable
-
-type D uint // instantiated only in dead code
-
-func (D) f() {} // unreachable
-func (D) F() {} // unreachable
-
-func main() {
- A(0).f()
-
- use(new(B))
- use(B2(0))
-
- var i interface {
- f()
- }
- i.f() // calls (*B).f, (*B2).f and (B2.f)
-
- live()
-}
-
-func live() {
- var j interface {
- f()
- g()
- }
- j.f() // calls (B2).f and (*B2).f but not (*B).f (no g method).
-}
-
-func dead() {
- use(D(0))
-}
-
-// WANT:
-// Dynamic calls
-// live --> (*B2).f
-// live --> (B2).f
-// main --> (*B).f
-// main --> (*B2).f
-// main --> (B2).f
-// Reachable functions
-// (*B).F
-// (*B).f
-// (*B2).f
-// (A).f
-// (B2).f
-// live
-// use
-// Reflect types
-// *B
-// *B2
-// B
-// B2
diff --git a/vendor/golang.org/x/tools/go/callgraph/rta/testdata/rtype.go b/vendor/golang.org/x/tools/go/callgraph/rta/testdata/rtype.go
deleted file mode 100644
index 85414e5..0000000
--- a/vendor/golang.org/x/tools/go/callgraph/rta/testdata/rtype.go
+++ /dev/null
@@ -1,35 +0,0 @@
-//+build ignore
-
-package main
-
-// Test of runtime types (types for which descriptors are needed).
-
-func use(interface{})
-
-type A byte // neither A nor byte are runtime types
-
-type B struct{ x uint } // B and uint are runtime types, but not the struct
-
-func main() {
- var x int // not a runtime type
- print(x)
-
- var y string // runtime type due to interface conversion
- use(y)
-
- use(struct{ uint64 }{}) // struct is a runtime type
-
- use(new(B)) // *B is a runtime type
-}
-
-// WANT:
-// Dynamic calls
-// Reachable functions
-// use
-// Reflect types
-// *B
-// B
-// string
-// struct{uint64}
-// uint
-// uint64
diff --git a/vendor/golang.org/x/tools/go/callgraph/static/static.go b/vendor/golang.org/x/tools/go/callgraph/static/static.go
deleted file mode 100644
index 709bb7b..0000000
--- a/vendor/golang.org/x/tools/go/callgraph/static/static.go
+++ /dev/null
@@ -1,35 +0,0 @@
-// Package static computes the call graph of a Go program containing
-// only static call edges.
-package static // import "golang.org/x/tools/go/callgraph/static"
-
-import (
- "golang.org/x/tools/go/callgraph"
- "golang.org/x/tools/go/ssa"
- "golang.org/x/tools/go/ssa/ssautil"
-)
-
-// CallGraph computes the call graph of the specified program
-// considering only static calls.
-//
-func CallGraph(prog *ssa.Program) *callgraph.Graph {
- cg := callgraph.New(nil) // TODO(adonovan) eliminate concept of rooted callgraph
-
- // TODO(adonovan): opt: use only a single pass over the ssa.Program.
- // TODO(adonovan): opt: this is slower than RTA (perhaps because
- // the lower precision means so many edges are allocated)!
- for f := range ssautil.AllFunctions(prog) {
- fnode := cg.CreateNode(f)
- for _, b := range f.Blocks {
- for _, instr := range b.Instrs {
- if site, ok := instr.(ssa.CallInstruction); ok {
- if g := site.Common().StaticCallee(); g != nil {
- gnode := cg.CreateNode(g)
- callgraph.AddEdge(fnode, site, gnode)
- }
- }
- }
- }
- }
-
- return cg
-}
diff --git a/vendor/golang.org/x/tools/go/callgraph/static/static_test.go b/vendor/golang.org/x/tools/go/callgraph/static/static_test.go
deleted file mode 100644
index e1bfcd7..0000000
--- a/vendor/golang.org/x/tools/go/callgraph/static/static_test.go
+++ /dev/null
@@ -1,88 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package static_test
-
-import (
- "fmt"
- "go/parser"
- "reflect"
- "sort"
- "testing"
-
- "golang.org/x/tools/go/callgraph"
- "golang.org/x/tools/go/callgraph/static"
- "golang.org/x/tools/go/loader"
- "golang.org/x/tools/go/ssa/ssautil"
-)
-
-const input = `package P
-
-type C int
-func (C) f()
-
-type I interface{f()}
-
-func f() {
- p := func() {}
- g()
- p() // SSA constant propagation => static
-
- if unknown {
- p = h
- }
- p() // dynamic
-
- C(0).f()
-}
-
-func g() {
- var i I = C(0)
- i.f()
-}
-
-func h()
-
-var unknown bool
-`
-
-func TestStatic(t *testing.T) {
- conf := loader.Config{ParserMode: parser.ParseComments}
- f, err := conf.ParseFile("P.go", input)
- if err != nil {
- t.Fatal(err)
- }
-
- conf.CreateFromFiles("P", f)
- iprog, err := conf.Load()
- if err != nil {
- t.Fatal(err)
- }
-
- P := iprog.Created[0].Pkg
-
- prog := ssautil.CreateProgram(iprog, 0)
- prog.Build()
-
- cg := static.CallGraph(prog)
-
- var edges []string
- callgraph.GraphVisitEdges(cg, func(e *callgraph.Edge) error {
- edges = append(edges, fmt.Sprintf("%s -> %s",
- e.Caller.Func.RelString(P),
- e.Callee.Func.RelString(P)))
- return nil
- })
- sort.Strings(edges)
-
- want := []string{
- "(*C).f -> (C).f",
- "f -> (C).f",
- "f -> f$1",
- "f -> g",
- }
- if !reflect.DeepEqual(edges, want) {
- t.Errorf("Got edges %v, want %v", edges, want)
- }
-}
diff --git a/vendor/golang.org/x/tools/go/callgraph/util.go b/vendor/golang.org/x/tools/go/callgraph/util.go
deleted file mode 100644
index a8f8903..0000000
--- a/vendor/golang.org/x/tools/go/callgraph/util.go
+++ /dev/null
@@ -1,181 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package callgraph
-
-import "golang.org/x/tools/go/ssa"
-
-// This file provides various utilities over call graphs, such as
-// visitation and path search.
-
-// CalleesOf returns a new set containing all direct callees of the
-// caller node.
-//
-func CalleesOf(caller *Node) map[*Node]bool {
- callees := make(map[*Node]bool)
- for _, e := range caller.Out {
- callees[e.Callee] = true
- }
- return callees
-}
-
-// GraphVisitEdges visits all the edges in graph g in depth-first order.
-// The edge function is called for each edge in postorder. If it
-// returns non-nil, visitation stops and GraphVisitEdges returns that
-// value.
-//
-func GraphVisitEdges(g *Graph, edge func(*Edge) error) error {
- seen := make(map[*Node]bool)
- var visit func(n *Node) error
- visit = func(n *Node) error {
- if !seen[n] {
- seen[n] = true
- for _, e := range n.Out {
- if err := visit(e.Callee); err != nil {
- return err
- }
- if err := edge(e); err != nil {
- return err
- }
- }
- }
- return nil
- }
- for _, n := range g.Nodes {
- if err := visit(n); err != nil {
- return err
- }
- }
- return nil
-}
-
-// PathSearch finds an arbitrary path starting at node start and
-// ending at some node for which isEnd() returns true. On success,
-// PathSearch returns the path as an ordered list of edges; on
-// failure, it returns nil.
-//
-func PathSearch(start *Node, isEnd func(*Node) bool) []*Edge {
- stack := make([]*Edge, 0, 32)
- seen := make(map[*Node]bool)
- var search func(n *Node) []*Edge
- search = func(n *Node) []*Edge {
- if !seen[n] {
- seen[n] = true
- if isEnd(n) {
- return stack
- }
- for _, e := range n.Out {
- stack = append(stack, e) // push
- if found := search(e.Callee); found != nil {
- return found
- }
- stack = stack[:len(stack)-1] // pop
- }
- }
- return nil
- }
- return search(start)
-}
-
-// DeleteSyntheticNodes removes from call graph g all nodes for
-// synthetic functions (except g.Root and package initializers),
-// preserving the topology. In effect, calls to synthetic wrappers
-// are "inlined".
-//
-func (g *Graph) DeleteSyntheticNodes() {
- // Measurements on the standard library and go.tools show that
- // resulting graph has ~15% fewer nodes and 4-8% fewer edges
- // than the input.
- //
- // Inlining a wrapper of in-degree m, out-degree n adds m*n
- // and removes m+n edges. Since most wrappers are monomorphic
- // (n=1) this results in a slight reduction. Polymorphic
- // wrappers (n>1), e.g. from embedding an interface value
- // inside a struct to satisfy some interface, cause an
- // increase in the graph, but they seem to be uncommon.
-
- // Hash all existing edges to avoid creating duplicates.
- edges := make(map[Edge]bool)
- for _, cgn := range g.Nodes {
- for _, e := range cgn.Out {
- edges[*e] = true
- }
- }
- for fn, cgn := range g.Nodes {
- if cgn == g.Root || fn.Synthetic == "" || isInit(cgn.Func) {
- continue // keep
- }
- for _, eIn := range cgn.In {
- for _, eOut := range cgn.Out {
- newEdge := Edge{eIn.Caller, eIn.Site, eOut.Callee}
- if edges[newEdge] {
- continue // don't add duplicate
- }
- AddEdge(eIn.Caller, eIn.Site, eOut.Callee)
- edges[newEdge] = true
- }
- }
- g.DeleteNode(cgn)
- }
-}
-
-func isInit(fn *ssa.Function) bool {
- return fn.Pkg != nil && fn.Pkg.Func("init") == fn
-}
-
-// DeleteNode removes node n and its edges from the graph g.
-// (NB: not efficient for batch deletion.)
-func (g *Graph) DeleteNode(n *Node) {
- n.deleteIns()
- n.deleteOuts()
- delete(g.Nodes, n.Func)
-}
-
-// deleteIns deletes all incoming edges to n.
-func (n *Node) deleteIns() {
- for _, e := range n.In {
- removeOutEdge(e)
- }
- n.In = nil
-}
-
-// deleteOuts deletes all outgoing edges from n.
-func (n *Node) deleteOuts() {
- for _, e := range n.Out {
- removeInEdge(e)
- }
- n.Out = nil
-}
-
-// removeOutEdge removes edge.Caller's outgoing edge 'edge'.
-func removeOutEdge(edge *Edge) {
- caller := edge.Caller
- n := len(caller.Out)
- for i, e := range caller.Out {
- if e == edge {
- // Replace it with the final element and shrink the slice.
- caller.Out[i] = caller.Out[n-1]
- caller.Out[n-1] = nil // aid GC
- caller.Out = caller.Out[:n-1]
- return
- }
- }
- panic("edge not found: " + edge.String())
-}
-
-// removeInEdge removes edge.Callee's incoming edge 'edge'.
-func removeInEdge(edge *Edge) {
- caller := edge.Callee
- n := len(caller.In)
- for i, e := range caller.In {
- if e == edge {
- // Replace it with the final element and shrink the slice.
- caller.In[i] = caller.In[n-1]
- caller.In[n-1] = nil // aid GC
- caller.In = caller.In[:n-1]
- return
- }
- }
- panic("edge not found: " + edge.String())
-}
diff --git a/vendor/golang.org/x/tools/go/gccgoexportdata/gccgoexportdata.go b/vendor/golang.org/x/tools/go/gccgoexportdata/gccgoexportdata.go
deleted file mode 100644
index 30ed521..0000000
--- a/vendor/golang.org/x/tools/go/gccgoexportdata/gccgoexportdata.go
+++ /dev/null
@@ -1,129 +0,0 @@
-// Copyright 2016 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Package gccgoexportdata provides functions for reading export data
-// files containing type information produced by the gccgo compiler.
-//
-// This package is a stop-gap until such time as gccgo uses the same
-// export data format as gc; see Go issue 17573. Once that occurs, this
-// package will be deprecated and eventually deleted.
-package gccgoexportdata
-
-// TODO(adonovan): add Find, Write, Importer to the API,
-// for symmetry with gcexportdata.
-
-import (
- "bytes"
- "debug/elf"
- "fmt"
- "go/token"
- "go/types"
- "io"
- "io/ioutil"
- "strconv"
- "strings"
-
- "golang.org/x/tools/go/internal/gccgoimporter"
-)
-
-// CompilerInfo executes the specified gccgo compiler and returns
-// information about it: its version (e.g. "4.8.0"), its target triple
-// (e.g. "x86_64-unknown-linux-gnu"), and the list of directories it
-// searches to find standard packages. The given arguments are passed
-// directly to calls to the specified gccgo compiler.
-func CompilerInfo(gccgo string, args ...string) (version, triple string, dirs []string, err error) {
- var inst gccgoimporter.GccgoInstallation
- err = inst.InitFromDriver(gccgo, args...)
- if err == nil {
- version = inst.GccVersion
- triple = inst.TargetTriple
- dirs = inst.SearchPaths()
- }
- return
-}
-
-// NewReader returns a reader for the export data section of an object
-// (.o) or archive (.a) file read from r.
-func NewReader(r io.Reader) (io.Reader, error) {
- data, err := ioutil.ReadAll(r)
- if err != nil {
- return nil, err
- }
-
- // If the file is an archive, extract the first section.
- const archiveMagic = "!\n"
- if bytes.HasPrefix(data, []byte(archiveMagic)) {
- section, err := firstSection(data[len(archiveMagic):])
- if err != nil {
- return nil, err
- }
- data = section
- }
-
- // Data contains an ELF file with a .go_export section.
- // ELF magic number is "\x7fELF".
- ef, err := elf.NewFile(bytes.NewReader(data))
- if err != nil {
- return nil, err
- }
- sec := ef.Section(".go_export")
- if sec == nil {
- return nil, fmt.Errorf("no .go_export section")
- }
- return sec.Open(), nil
-}
-
-// firstSection returns the contents of the first regular file in an ELF
-// archive (http://www.sco.com/developers/devspecs/gabi41.pdf, §7.2).
-func firstSection(a []byte) ([]byte, error) {
- for len(a) >= 60 {
- var hdr []byte
- hdr, a = a[:60], a[60:]
-
- name := strings.TrimSpace(string(hdr[:16]))
-
- sizeStr := string(hdr[48:58])
- size, err := strconv.Atoi(strings.TrimSpace(sizeStr))
- if err != nil {
- return nil, fmt.Errorf("invalid size: %q", sizeStr)
- }
-
- if len(a) < size {
- return nil, fmt.Errorf("invalid section size: %d", size)
- }
-
- // The payload is padded to an even number of bytes.
- var payload []byte
- payload, a = a[:size], a[size+size&1:]
-
- // Skip special files:
- // "/" archive symbol table
- // "/SYM64/" archive symbol table on e.g. s390x
- // "//" archive string table (if any filename is >15 bytes)
- if name == "/" || name == "/SYM64/" || name == "//" {
- continue
- }
-
- return payload, nil
- }
- return nil, fmt.Errorf("archive has no regular sections")
-}
-
-// Read reads export data from in, decodes it, and returns type
-// information for the package.
-// The package name is specified by path.
-//
-// The FileSet parameter is currently unused but exists for symmetry
-// with gcexportdata.
-//
-// Read may inspect and add to the imports map to ensure that references
-// within the export data to other packages are consistent. The caller
-// must ensure that imports[path] does not exist, or exists but is
-// incomplete (see types.Package.Complete), and Read inserts the
-// resulting package into this map entry.
-//
-// On return, the state of the reader is undefined.
-func Read(in io.Reader, _ *token.FileSet, imports map[string]*types.Package, path string) (*types.Package, error) {
- return gccgoimporter.Parse(in, imports, path)
-}
diff --git a/vendor/golang.org/x/tools/go/gccgoexportdata/gccgoexportdata_test.go b/vendor/golang.org/x/tools/go/gccgoexportdata/gccgoexportdata_test.go
deleted file mode 100644
index 1aa114c..0000000
--- a/vendor/golang.org/x/tools/go/gccgoexportdata/gccgoexportdata_test.go
+++ /dev/null
@@ -1,67 +0,0 @@
-package gccgoexportdata_test
-
-import (
- "go/types"
- "os"
- "testing"
-
- "golang.org/x/tools/go/gccgoexportdata"
-)
-
-// Test ensures this package can read gccgo export data from the
-// .go_export from a standalone ELF file or such a file in an archive
-// library.
-//
-// The testdata/{short,long}.a ELF archive files were produced by:
-//
-// $ echo 'package foo; func F()' > foo.go
-// $ gccgo -c -fgo-pkgpath blah foo.go
-// $ objcopy -j .go_export foo.o foo.gox
-// $ ar q short.a foo.gox
-// $ objcopy -j .go_export foo.o name-longer-than-16-bytes.gox
-// $ ar q long.a name-longer-than-16-bytes.gox
-//
-// The file long.a contains an archive string table.
-//
-// The errors.gox file (an ELF object file) comes from the toolchain's
-// standard library.
-func Test(t *testing.T) {
- for _, test := range []struct {
- filename, path, member, wantType string
- }{
- {"testdata/errors.gox", "errors", "New", "func(text string) error"},
- {"testdata/short.a", "short", "F", "func()"},
- {"testdata/long.a", "long", "F", "func()"},
- } {
- t.Logf("filename = %s", test.filename)
- f, err := os.Open(test.filename)
- if err != nil {
- t.Error(err)
- continue
- }
- defer f.Close()
- r, err := gccgoexportdata.NewReader(f)
- if err != nil {
- t.Error(err)
- continue
- }
-
- imports := make(map[string]*types.Package)
- pkg, err := gccgoexportdata.Read(r, nil, imports, test.path)
- if err != nil {
- t.Error(err)
- continue
- }
-
- // Check type of designated package member.
- obj := pkg.Scope().Lookup(test.member)
- if obj == nil {
- t.Errorf("%s.%s not found", test.path, test.member)
- continue
- }
- if obj.Type().String() != test.wantType {
- t.Errorf("%s.%s.Type = %s, want %s",
- test.path, test.member, obj.Type(), test.wantType)
- }
- }
-}
diff --git a/vendor/golang.org/x/tools/go/gccgoexportdata/testdata/errors.gox b/vendor/golang.org/x/tools/go/gccgoexportdata/testdata/errors.gox
deleted file mode 100644
index c6ff16b..0000000
Binary files a/vendor/golang.org/x/tools/go/gccgoexportdata/testdata/errors.gox and /dev/null differ
diff --git a/vendor/golang.org/x/tools/go/gccgoexportdata/testdata/long.a b/vendor/golang.org/x/tools/go/gccgoexportdata/testdata/long.a
deleted file mode 100644
index c150447..0000000
Binary files a/vendor/golang.org/x/tools/go/gccgoexportdata/testdata/long.a and /dev/null differ
diff --git a/vendor/golang.org/x/tools/go/gccgoexportdata/testdata/short.a b/vendor/golang.org/x/tools/go/gccgoexportdata/testdata/short.a
deleted file mode 100644
index 3cd756e..0000000
Binary files a/vendor/golang.org/x/tools/go/gccgoexportdata/testdata/short.a and /dev/null differ
diff --git a/vendor/golang.org/x/tools/go/gcexportdata/example_test.go b/vendor/golang.org/x/tools/go/gcexportdata/example_test.go
deleted file mode 100644
index 4ad73ab..0000000
--- a/vendor/golang.org/x/tools/go/gcexportdata/example_test.go
+++ /dev/null
@@ -1,121 +0,0 @@
-// Copyright 2016 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build go1.7
-
-package gcexportdata_test
-
-import (
- "fmt"
- "go/ast"
- "go/parser"
- "go/token"
- "go/types"
- "log"
- "os"
- "path/filepath"
-
- "golang.org/x/tools/go/gcexportdata"
-)
-
-// ExampleRead uses gcexportdata.Read to load type information for the
-// "fmt" package from the fmt.a file produced by the gc compiler.
-func ExampleRead() {
- // Find the export data file.
- filename, path := gcexportdata.Find("fmt", "")
- if filename == "" {
- log.Fatalf("can't find export data for fmt")
- }
- fmt.Printf("Package path: %s\n", path)
- fmt.Printf("Export data: %s\n", filepath.Base(filename))
-
- // Open and read the file.
- f, err := os.Open(filename)
- if err != nil {
- log.Fatal(err)
- }
- defer f.Close()
- r, err := gcexportdata.NewReader(f)
- if err != nil {
- log.Fatalf("reading export data %s: %v", filename, err)
- }
-
- // Decode the export data.
- fset := token.NewFileSet()
- imports := make(map[string]*types.Package)
- pkg, err := gcexportdata.Read(r, fset, imports, path)
- if err != nil {
- log.Fatal(err)
- }
-
- // Print package information.
- fmt.Printf("Package members: %s...\n", pkg.Scope().Names()[:5])
- println := pkg.Scope().Lookup("Println")
- posn := fset.Position(println.Pos())
- posn.Line = 123 // make example deterministic
- fmt.Printf("Println type: %s\n", println.Type())
- fmt.Printf("Println location: %s\n", slashify(posn))
-
- // Output:
- //
- // Package path: fmt
- // Export data: fmt.a
- // Package members: [Errorf Formatter Fprint Fprintf Fprintln]...
- // Println type: func(a ...interface{}) (n int, err error)
- // Println location: $GOROOT/src/fmt/print.go:123:1
-}
-
-// ExampleNewImporter demonstrates usage of NewImporter to provide type
-// information for dependencies when type-checking Go source code.
-func ExampleNewImporter() {
- const src = `package myscanner
-
-// choosing a package that is unlikely to change across releases
-import "text/scanner"
-
-const eof = scanner.EOF
-`
- fset := token.NewFileSet()
- f, err := parser.ParseFile(fset, "myscanner.go", src, 0)
- if err != nil {
- log.Fatal(err)
- }
-
- packages := make(map[string]*types.Package)
- imp := gcexportdata.NewImporter(fset, packages)
- conf := types.Config{Importer: imp}
- pkg, err := conf.Check("myscanner", fset, []*ast.File{f}, nil)
- if err != nil {
- log.Fatal(err)
- }
-
- // object from imported package
- pi := packages["text/scanner"].Scope().Lookup("EOF")
- fmt.Printf("const %s.%s %s = %s // %s\n",
- pi.Pkg().Path(),
- pi.Name(),
- pi.Type(),
- pi.(*types.Const).Val(),
- slashify(fset.Position(pi.Pos())),
- )
-
- // object in source package
- twopi := pkg.Scope().Lookup("eof")
- fmt.Printf("const %s %s = %s // %s\n",
- twopi.Name(),
- twopi.Type(),
- twopi.(*types.Const).Val(),
- slashify(fset.Position(twopi.Pos())),
- )
-
- // Output:
- //
- // const text/scanner.EOF untyped int = -1 // $GOROOT/src/text/scanner/scanner.go:75:1
- // const eof untyped int = -1 // myscanner.go:6:7
-}
-
-func slashify(posn token.Position) token.Position {
- posn.Filename = filepath.ToSlash(posn.Filename) // for MS Windows portability
- return posn
-}
diff --git a/vendor/golang.org/x/tools/go/gcexportdata/gcexportdata.go b/vendor/golang.org/x/tools/go/gcexportdata/gcexportdata.go
deleted file mode 100644
index e53270e..0000000
--- a/vendor/golang.org/x/tools/go/gcexportdata/gcexportdata.go
+++ /dev/null
@@ -1,100 +0,0 @@
-// Copyright 2016 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Package gcexportdata provides functions for locating, reading, and
-// writing export data files containing type information produced by the
-// gc compiler. This package supports go1.7 export data format and all
-// later versions.
-//
-// This package replaces the deprecated golang.org/x/tools/go/gcimporter15
-// package, which will be deleted in October 2017.
-//
-// Although it might seem convenient for this package to live alongside
-// go/types in the standard library, this would cause version skew
-// problems for developer tools that use it, since they must be able to
-// consume the outputs of the gc compiler both before and after a Go
-// update such as from Go 1.7 to Go 1.8. Because this package lives in
-// golang.org/x/tools, sites can update their version of this repo some
-// time before the Go 1.8 release and rebuild and redeploy their
-// developer tools, which will then be able to consume both Go 1.7 and
-// Go 1.8 export data files, so they will work before and after the
-// Go update. (See discussion at https://github.com/golang/go/issues/15651.)
-//
-package gcexportdata // import "golang.org/x/tools/go/gcexportdata"
-
-import (
- "bufio"
- "bytes"
- "fmt"
- "go/token"
- "go/types"
- "io"
- "io/ioutil"
-
- gcimporter "golang.org/x/tools/go/gcimporter15"
-)
-
-// Find returns the name of an object (.o) or archive (.a) file
-// containing type information for the specified import path,
-// using the workspace layout conventions of go/build.
-// If no file was found, an empty filename is returned.
-//
-// A relative srcDir is interpreted relative to the current working directory.
-//
-// Find also returns the package's resolved (canonical) import path,
-// reflecting the effects of srcDir and vendoring on importPath.
-func Find(importPath, srcDir string) (filename, path string) {
- return gcimporter.FindPkg(importPath, srcDir)
-}
-
-// NewReader returns a reader for the export data section of an object
-// (.o) or archive (.a) file read from r. The new reader may provide
-// additional trailing data beyond the end of the export data.
-func NewReader(r io.Reader) (io.Reader, error) {
- buf := bufio.NewReader(r)
- _, err := gcimporter.FindExportData(buf)
- // If we ever switch to a zip-like archive format with the ToC
- // at the end, we can return the correct portion of export data,
- // but for now we must return the entire rest of the file.
- return buf, err
-}
-
-// Read reads export data from in, decodes it, and returns type
-// information for the package.
-// The package name is specified by path.
-// File position information is added to fset.
-//
-// Read may inspect and add to the imports map to ensure that references
-// within the export data to other packages are consistent. The caller
-// must ensure that imports[path] does not exist, or exists but is
-// incomplete (see types.Package.Complete), and Read inserts the
-// resulting package into this map entry.
-//
-// On return, the state of the reader is undefined.
-func Read(in io.Reader, fset *token.FileSet, imports map[string]*types.Package, path string) (*types.Package, error) {
- data, err := ioutil.ReadAll(in)
- if err != nil {
- return nil, fmt.Errorf("reading export data for %q: %v", path, err)
- }
-
- if bytes.HasPrefix(data, []byte("!")) {
- return nil, fmt.Errorf("can't read export data for %q directly from an archive file (call gcexportdata.NewReader first to extract export data)", path)
- }
-
- // The App Engine Go runtime v1.6 uses the old export data format.
- // TODO(adonovan): delete once v1.7 has been around for a while.
- if bytes.HasPrefix(data, []byte("package ")) {
- return gcimporter.ImportData(imports, path, path, bytes.NewReader(data))
- }
-
- _, pkg, err := gcimporter.BImportData(fset, imports, data, path)
- return pkg, err
-}
-
-// Write writes encoded type information for the specified package to out.
-// The FileSet provides file position information for named objects.
-func Write(out io.Writer, fset *token.FileSet, pkg *types.Package) error {
- _, err := out.Write(gcimporter.BExportData(fset, pkg))
- return err
-}
diff --git a/vendor/golang.org/x/tools/go/gcexportdata/gcexportdata_test.go b/vendor/golang.org/x/tools/go/gcexportdata/gcexportdata_test.go
deleted file mode 100644
index 69133db..0000000
--- a/vendor/golang.org/x/tools/go/gcexportdata/gcexportdata_test.go
+++ /dev/null
@@ -1,41 +0,0 @@
-package gcexportdata_test
-
-import (
- "go/token"
- "go/types"
- "log"
- "os"
- "testing"
-
- "golang.org/x/tools/go/gcexportdata"
-)
-
-// Test to ensure that gcexportdata can read files produced by App
-// Engine Go runtime v1.6.
-func TestAppEngine16(t *testing.T) {
- // Open and read the file.
- f, err := os.Open("testdata/errors-ae16.a")
- if err != nil {
- t.Fatal(err)
- }
- defer f.Close()
- r, err := gcexportdata.NewReader(f)
- if err != nil {
- log.Fatalf("reading export data: %v", err)
- }
-
- // Decode the export data.
- fset := token.NewFileSet()
- imports := make(map[string]*types.Package)
- pkg, err := gcexportdata.Read(r, fset, imports, "errors")
- if err != nil {
- log.Fatal(err)
- }
-
- // Print package information.
- got := pkg.Scope().Lookup("New").Type().String()
- want := "func(text string) error"
- if got != want {
- t.Errorf("New.Type = %s, want %s", got, want)
- }
-}
diff --git a/vendor/golang.org/x/tools/go/gcexportdata/importer.go b/vendor/golang.org/x/tools/go/gcexportdata/importer.go
deleted file mode 100644
index efe221e..0000000
--- a/vendor/golang.org/x/tools/go/gcexportdata/importer.go
+++ /dev/null
@@ -1,73 +0,0 @@
-// Copyright 2016 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package gcexportdata
-
-import (
- "fmt"
- "go/token"
- "go/types"
- "os"
-)
-
-// NewImporter returns a new instance of the types.Importer interface
-// that reads type information from export data files written by gc.
-// The Importer also satisfies types.ImporterFrom.
-//
-// Export data files are located using "go build" workspace conventions
-// and the build.Default context.
-//
-// Use this importer instead of go/importer.For("gc", ...) to avoid the
-// version-skew problems described in the documentation of this package,
-// or to control the FileSet or access the imports map populated during
-// package loading.
-//
-func NewImporter(fset *token.FileSet, imports map[string]*types.Package) types.ImporterFrom {
- return importer{fset, imports}
-}
-
-type importer struct {
- fset *token.FileSet
- imports map[string]*types.Package
-}
-
-func (imp importer) Import(importPath string) (*types.Package, error) {
- return imp.ImportFrom(importPath, "", 0)
-}
-
-func (imp importer) ImportFrom(importPath, srcDir string, mode types.ImportMode) (_ *types.Package, err error) {
- filename, path := Find(importPath, srcDir)
- if filename == "" {
- if importPath == "unsafe" {
- // Even for unsafe, call Find first in case
- // the package was vendored.
- return types.Unsafe, nil
- }
- return nil, fmt.Errorf("can't find import: %s", importPath)
- }
-
- if pkg, ok := imp.imports[path]; ok && pkg.Complete() {
- return pkg, nil // cache hit
- }
-
- // open file
- f, err := os.Open(filename)
- if err != nil {
- return nil, err
- }
- defer func() {
- f.Close()
- if err != nil {
- // add file name to error
- err = fmt.Errorf("reading export data: %s: %v", filename, err)
- }
- }()
-
- r, err := NewReader(f)
- if err != nil {
- return nil, err
- }
-
- return Read(r, imp.fset, imp.imports, path)
-}
diff --git a/vendor/golang.org/x/tools/go/gcexportdata/main.go b/vendor/golang.org/x/tools/go/gcexportdata/main.go
deleted file mode 100644
index 106046c..0000000
--- a/vendor/golang.org/x/tools/go/gcexportdata/main.go
+++ /dev/null
@@ -1,81 +0,0 @@
-// Copyright 2017 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build ignore
-
-// The gcexportdata command is a diagnostic tool that displays the
-// contents of gc export data files.
-package main
-
-import (
- "flag"
- "fmt"
- "go/token"
- "go/types"
- "log"
- "os"
-
- "golang.org/x/tools/go/gcexportdata"
- "golang.org/x/tools/go/types/typeutil"
-)
-
-func main() {
- log.SetPrefix("gcexportdata: ")
- log.SetFlags(0)
- flag.Usage = func() {
- fmt.Fprintln(os.Stderr, "usage: gcexportdata file.a")
- }
- flag.Parse()
- if flag.NArg() != 1 {
- flag.Usage()
- os.Exit(2)
- }
- filename := flag.Args()[0]
-
- f, err := os.Open(filename)
- if err != nil {
- log.Fatal(err)
- }
-
- r, err := gcexportdata.NewReader(f)
- if err != nil {
- log.Fatalf("%s: %s", filename, err)
- }
-
- // Decode the package.
- imports := make(map[string]*types.Package)
- fset := token.NewFileSet()
- pkg, err := gcexportdata.Read(r, fset, imports, "dummy")
- if err != nil {
- log.Fatal("%s: %s", filename, err)
- }
-
- // Print all package-level declarations, including non-exported ones.
- fmt.Printf("package %s\n", pkg.Name())
- for _, imp := range pkg.Imports() {
- fmt.Printf("import %q\n", imp.Path())
- }
- qual := func(p *types.Package) string {
- if pkg == p {
- return ""
- }
- return p.Name()
- }
- scope := pkg.Scope()
- for _, name := range scope.Names() {
- obj := scope.Lookup(name)
- fmt.Printf("%s: %s\n",
- fset.Position(obj.Pos()),
- types.ObjectString(obj, qual))
-
- // For types, print each method.
- if _, ok := obj.(*types.TypeName); ok {
- for _, method := range typeutil.IntuitiveMethodSet(obj.Type(), nil) {
- fmt.Printf("%s: %s\n",
- fset.Position(method.Obj().Pos()),
- types.SelectionString(method, qual))
- }
- }
- }
-}
diff --git a/vendor/golang.org/x/tools/go/gcexportdata/testdata/errors-ae16.a b/vendor/golang.org/x/tools/go/gcexportdata/testdata/errors-ae16.a
deleted file mode 100644
index 3f1dad5..0000000
Binary files a/vendor/golang.org/x/tools/go/gcexportdata/testdata/errors-ae16.a and /dev/null differ
diff --git a/vendor/golang.org/x/tools/go/gcimporter15/bexport.go b/vendor/golang.org/x/tools/go/gcimporter15/bexport.go
deleted file mode 100644
index cbf8bc0..0000000
--- a/vendor/golang.org/x/tools/go/gcimporter15/bexport.go
+++ /dev/null
@@ -1,828 +0,0 @@
-// Copyright 2016 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Binary package export.
-// This file was derived from $GOROOT/src/cmd/compile/internal/gc/bexport.go;
-// see that file for specification of the format.
-
-package gcimporter
-
-import (
- "bytes"
- "encoding/binary"
- "fmt"
- "go/ast"
- "go/constant"
- "go/token"
- "go/types"
- "log"
- "math"
- "math/big"
- "sort"
- "strings"
-)
-
-// If debugFormat is set, each integer and string value is preceded by a marker
-// and position information in the encoding. This mechanism permits an importer
-// to recognize immediately when it is out of sync. The importer recognizes this
-// mode automatically (i.e., it can import export data produced with debugging
-// support even if debugFormat is not set at the time of import). This mode will
-// lead to massively larger export data (by a factor of 2 to 3) and should only
-// be enabled during development and debugging.
-//
-// NOTE: This flag is the first flag to enable if importing dies because of
-// (suspected) format errors, and whenever a change is made to the format.
-const debugFormat = false // default: false
-
-// If trace is set, debugging output is printed to std out.
-const trace = false // default: false
-
-// Current export format version. Increase with each format change.
-// 4: type name objects support type aliases, uses aliasTag
-// 3: Go1.8 encoding (same as version 2, aliasTag defined but never used)
-// 2: removed unused bool in ODCL export (compiler only)
-// 1: header format change (more regular), export package for _ struct fields
-// 0: Go1.7 encoding
-const exportVersion = 4
-
-// trackAllTypes enables cycle tracking for all types, not just named
-// types. The existing compiler invariants assume that unnamed types
-// that are not completely set up are not used, or else there are spurious
-// errors.
-// If disabled, only named types are tracked, possibly leading to slightly
-// less efficient encoding in rare cases. It also prevents the export of
-// some corner-case type declarations (but those are not handled correctly
-// with with the textual export format either).
-// TODO(gri) enable and remove once issues caused by it are fixed
-const trackAllTypes = false
-
-type exporter struct {
- fset *token.FileSet
- out bytes.Buffer
-
- // object -> index maps, indexed in order of serialization
- strIndex map[string]int
- pkgIndex map[*types.Package]int
- typIndex map[types.Type]int
-
- // position encoding
- posInfoFormat bool
- prevFile string
- prevLine int
-
- // debugging support
- written int // bytes written
- indent int // for trace
-}
-
-// BExportData returns binary export data for pkg.
-// If no file set is provided, position info will be missing.
-func BExportData(fset *token.FileSet, pkg *types.Package) []byte {
- p := exporter{
- fset: fset,
- strIndex: map[string]int{"": 0}, // empty string is mapped to 0
- pkgIndex: make(map[*types.Package]int),
- typIndex: make(map[types.Type]int),
- posInfoFormat: true, // TODO(gri) might become a flag, eventually
- }
-
- // write version info
- // The version string must start with "version %d" where %d is the version
- // number. Additional debugging information may follow after a blank; that
- // text is ignored by the importer.
- p.rawStringln(fmt.Sprintf("version %d", exportVersion))
- var debug string
- if debugFormat {
- debug = "debug"
- }
- p.rawStringln(debug) // cannot use p.bool since it's affected by debugFormat; also want to see this clearly
- p.bool(trackAllTypes)
- p.bool(p.posInfoFormat)
-
- // --- generic export data ---
-
- // populate type map with predeclared "known" types
- for index, typ := range predeclared {
- p.typIndex[typ] = index
- }
- if len(p.typIndex) != len(predeclared) {
- log.Fatalf("gcimporter: duplicate entries in type map?")
- }
-
- // write package data
- p.pkg(pkg, true)
- if trace {
- p.tracef("\n")
- }
-
- // write objects
- objcount := 0
- scope := pkg.Scope()
- for _, name := range scope.Names() {
- if !ast.IsExported(name) {
- continue
- }
- if trace {
- p.tracef("\n")
- }
- p.obj(scope.Lookup(name))
- objcount++
- }
-
- // indicate end of list
- if trace {
- p.tracef("\n")
- }
- p.tag(endTag)
-
- // for self-verification only (redundant)
- p.int(objcount)
-
- if trace {
- p.tracef("\n")
- }
-
- // --- end of export data ---
-
- return p.out.Bytes()
-}
-
-func (p *exporter) pkg(pkg *types.Package, emptypath bool) {
- if pkg == nil {
- log.Fatalf("gcimporter: unexpected nil pkg")
- }
-
- // if we saw the package before, write its index (>= 0)
- if i, ok := p.pkgIndex[pkg]; ok {
- p.index('P', i)
- return
- }
-
- // otherwise, remember the package, write the package tag (< 0) and package data
- if trace {
- p.tracef("P%d = { ", len(p.pkgIndex))
- defer p.tracef("} ")
- }
- p.pkgIndex[pkg] = len(p.pkgIndex)
-
- p.tag(packageTag)
- p.string(pkg.Name())
- if emptypath {
- p.string("")
- } else {
- p.string(pkg.Path())
- }
-}
-
-func (p *exporter) obj(obj types.Object) {
- switch obj := obj.(type) {
- case *types.Const:
- p.tag(constTag)
- p.pos(obj)
- p.qualifiedName(obj)
- p.typ(obj.Type())
- p.value(obj.Val())
-
- case *types.TypeName:
- if isAlias(obj) {
- p.tag(aliasTag)
- p.pos(obj)
- p.qualifiedName(obj)
- } else {
- p.tag(typeTag)
- }
- p.typ(obj.Type())
-
- case *types.Var:
- p.tag(varTag)
- p.pos(obj)
- p.qualifiedName(obj)
- p.typ(obj.Type())
-
- case *types.Func:
- p.tag(funcTag)
- p.pos(obj)
- p.qualifiedName(obj)
- sig := obj.Type().(*types.Signature)
- p.paramList(sig.Params(), sig.Variadic())
- p.paramList(sig.Results(), false)
-
- default:
- log.Fatalf("gcimporter: unexpected object %v (%T)", obj, obj)
- }
-}
-
-func (p *exporter) pos(obj types.Object) {
- if !p.posInfoFormat {
- return
- }
-
- file, line := p.fileLine(obj)
- if file == p.prevFile {
- // common case: write line delta
- // delta == 0 means different file or no line change
- delta := line - p.prevLine
- p.int(delta)
- if delta == 0 {
- p.int(-1) // -1 means no file change
- }
- } else {
- // different file
- p.int(0)
- // Encode filename as length of common prefix with previous
- // filename, followed by (possibly empty) suffix. Filenames
- // frequently share path prefixes, so this can save a lot
- // of space and make export data size less dependent on file
- // path length. The suffix is unlikely to be empty because
- // file names tend to end in ".go".
- n := commonPrefixLen(p.prevFile, file)
- p.int(n) // n >= 0
- p.string(file[n:]) // write suffix only
- p.prevFile = file
- p.int(line)
- }
- p.prevLine = line
-}
-
-func (p *exporter) fileLine(obj types.Object) (file string, line int) {
- if p.fset != nil {
- pos := p.fset.Position(obj.Pos())
- file = pos.Filename
- line = pos.Line
- }
- return
-}
-
-func commonPrefixLen(a, b string) int {
- if len(a) > len(b) {
- a, b = b, a
- }
- // len(a) <= len(b)
- i := 0
- for i < len(a) && a[i] == b[i] {
- i++
- }
- return i
-}
-
-func (p *exporter) qualifiedName(obj types.Object) {
- p.string(obj.Name())
- p.pkg(obj.Pkg(), false)
-}
-
-func (p *exporter) typ(t types.Type) {
- if t == nil {
- log.Fatalf("gcimporter: nil type")
- }
-
- // Possible optimization: Anonymous pointer types *T where
- // T is a named type are common. We could canonicalize all
- // such types *T to a single type PT = *T. This would lead
- // to at most one *T entry in typIndex, and all future *T's
- // would be encoded as the respective index directly. Would
- // save 1 byte (pointerTag) per *T and reduce the typIndex
- // size (at the cost of a canonicalization map). We can do
- // this later, without encoding format change.
-
- // if we saw the type before, write its index (>= 0)
- if i, ok := p.typIndex[t]; ok {
- p.index('T', i)
- return
- }
-
- // otherwise, remember the type, write the type tag (< 0) and type data
- if trackAllTypes {
- if trace {
- p.tracef("T%d = {>\n", len(p.typIndex))
- defer p.tracef("<\n} ")
- }
- p.typIndex[t] = len(p.typIndex)
- }
-
- switch t := t.(type) {
- case *types.Named:
- if !trackAllTypes {
- // if we don't track all types, track named types now
- p.typIndex[t] = len(p.typIndex)
- }
-
- p.tag(namedTag)
- p.pos(t.Obj())
- p.qualifiedName(t.Obj())
- p.typ(t.Underlying())
- if !types.IsInterface(t) {
- p.assocMethods(t)
- }
-
- case *types.Array:
- p.tag(arrayTag)
- p.int64(t.Len())
- p.typ(t.Elem())
-
- case *types.Slice:
- p.tag(sliceTag)
- p.typ(t.Elem())
-
- case *dddSlice:
- p.tag(dddTag)
- p.typ(t.elem)
-
- case *types.Struct:
- p.tag(structTag)
- p.fieldList(t)
-
- case *types.Pointer:
- p.tag(pointerTag)
- p.typ(t.Elem())
-
- case *types.Signature:
- p.tag(signatureTag)
- p.paramList(t.Params(), t.Variadic())
- p.paramList(t.Results(), false)
-
- case *types.Interface:
- p.tag(interfaceTag)
- p.iface(t)
-
- case *types.Map:
- p.tag(mapTag)
- p.typ(t.Key())
- p.typ(t.Elem())
-
- case *types.Chan:
- p.tag(chanTag)
- p.int(int(3 - t.Dir())) // hack
- p.typ(t.Elem())
-
- default:
- log.Fatalf("gcimporter: unexpected type %T: %s", t, t)
- }
-}
-
-func (p *exporter) assocMethods(named *types.Named) {
- // Sort methods (for determinism).
- var methods []*types.Func
- for i := 0; i < named.NumMethods(); i++ {
- methods = append(methods, named.Method(i))
- }
- sort.Sort(methodsByName(methods))
-
- p.int(len(methods))
-
- if trace && methods != nil {
- p.tracef("associated methods {>\n")
- }
-
- for i, m := range methods {
- if trace && i > 0 {
- p.tracef("\n")
- }
-
- p.pos(m)
- name := m.Name()
- p.string(name)
- if !exported(name) {
- p.pkg(m.Pkg(), false)
- }
-
- sig := m.Type().(*types.Signature)
- p.paramList(types.NewTuple(sig.Recv()), false)
- p.paramList(sig.Params(), sig.Variadic())
- p.paramList(sig.Results(), false)
- p.int(0) // dummy value for go:nointerface pragma - ignored by importer
- }
-
- if trace && methods != nil {
- p.tracef("<\n} ")
- }
-}
-
-type methodsByName []*types.Func
-
-func (x methodsByName) Len() int { return len(x) }
-func (x methodsByName) Swap(i, j int) { x[i], x[j] = x[j], x[i] }
-func (x methodsByName) Less(i, j int) bool { return x[i].Name() < x[j].Name() }
-
-func (p *exporter) fieldList(t *types.Struct) {
- if trace && t.NumFields() > 0 {
- p.tracef("fields {>\n")
- defer p.tracef("<\n} ")
- }
-
- p.int(t.NumFields())
- for i := 0; i < t.NumFields(); i++ {
- if trace && i > 0 {
- p.tracef("\n")
- }
- p.field(t.Field(i))
- p.string(t.Tag(i))
- }
-}
-
-func (p *exporter) field(f *types.Var) {
- if !f.IsField() {
- log.Fatalf("gcimporter: field expected")
- }
-
- p.pos(f)
- p.fieldName(f)
- p.typ(f.Type())
-}
-
-func (p *exporter) iface(t *types.Interface) {
- // TODO(gri): enable importer to load embedded interfaces,
- // then emit Embeddeds and ExplicitMethods separately here.
- p.int(0)
-
- n := t.NumMethods()
- if trace && n > 0 {
- p.tracef("methods {>\n")
- defer p.tracef("<\n} ")
- }
- p.int(n)
- for i := 0; i < n; i++ {
- if trace && i > 0 {
- p.tracef("\n")
- }
- p.method(t.Method(i))
- }
-}
-
-func (p *exporter) method(m *types.Func) {
- sig := m.Type().(*types.Signature)
- if sig.Recv() == nil {
- log.Fatalf("gcimporter: method expected")
- }
-
- p.pos(m)
- p.string(m.Name())
- if m.Name() != "_" && !ast.IsExported(m.Name()) {
- p.pkg(m.Pkg(), false)
- }
-
- // interface method; no need to encode receiver.
- p.paramList(sig.Params(), sig.Variadic())
- p.paramList(sig.Results(), false)
-}
-
-func (p *exporter) fieldName(f *types.Var) {
- name := f.Name()
-
- if f.Anonymous() {
- // anonymous field - we distinguish between 3 cases:
- // 1) field name matches base type name and is exported
- // 2) field name matches base type name and is not exported
- // 3) field name doesn't match base type name (alias name)
- bname := basetypeName(f.Type())
- if name == bname {
- if ast.IsExported(name) {
- name = "" // 1) we don't need to know the field name or package
- } else {
- name = "?" // 2) use unexported name "?" to force package export
- }
- } else {
- // 3) indicate alias and export name as is
- // (this requires an extra "@" but this is a rare case)
- p.string("@")
- }
- }
-
- p.string(name)
- if name != "" && !ast.IsExported(name) {
- p.pkg(f.Pkg(), false)
- }
-}
-
-func basetypeName(typ types.Type) string {
- switch typ := deref(typ).(type) {
- case *types.Basic:
- return typ.Name()
- case *types.Named:
- return typ.Obj().Name()
- default:
- return "" // unnamed type
- }
-}
-
-func (p *exporter) paramList(params *types.Tuple, variadic bool) {
- // use negative length to indicate unnamed parameters
- // (look at the first parameter only since either all
- // names are present or all are absent)
- n := params.Len()
- if n > 0 && params.At(0).Name() == "" {
- n = -n
- }
- p.int(n)
- for i := 0; i < params.Len(); i++ {
- q := params.At(i)
- t := q.Type()
- if variadic && i == params.Len()-1 {
- t = &dddSlice{t.(*types.Slice).Elem()}
- }
- p.typ(t)
- if n > 0 {
- name := q.Name()
- p.string(name)
- if name != "_" {
- p.pkg(q.Pkg(), false)
- }
- }
- p.string("") // no compiler-specific info
- }
-}
-
-func (p *exporter) value(x constant.Value) {
- if trace {
- p.tracef("= ")
- }
-
- switch x.Kind() {
- case constant.Bool:
- tag := falseTag
- if constant.BoolVal(x) {
- tag = trueTag
- }
- p.tag(tag)
-
- case constant.Int:
- if v, exact := constant.Int64Val(x); exact {
- // common case: x fits into an int64 - use compact encoding
- p.tag(int64Tag)
- p.int64(v)
- return
- }
- // uncommon case: large x - use float encoding
- // (powers of 2 will be encoded efficiently with exponent)
- p.tag(floatTag)
- p.float(constant.ToFloat(x))
-
- case constant.Float:
- p.tag(floatTag)
- p.float(x)
-
- case constant.Complex:
- p.tag(complexTag)
- p.float(constant.Real(x))
- p.float(constant.Imag(x))
-
- case constant.String:
- p.tag(stringTag)
- p.string(constant.StringVal(x))
-
- case constant.Unknown:
- // package contains type errors
- p.tag(unknownTag)
-
- default:
- log.Fatalf("gcimporter: unexpected value %v (%T)", x, x)
- }
-}
-
-func (p *exporter) float(x constant.Value) {
- if x.Kind() != constant.Float {
- log.Fatalf("gcimporter: unexpected constant %v, want float", x)
- }
- // extract sign (there is no -0)
- sign := constant.Sign(x)
- if sign == 0 {
- // x == 0
- p.int(0)
- return
- }
- // x != 0
-
- var f big.Float
- if v, exact := constant.Float64Val(x); exact {
- // float64
- f.SetFloat64(v)
- } else if num, denom := constant.Num(x), constant.Denom(x); num.Kind() == constant.Int {
- // TODO(gri): add big.Rat accessor to constant.Value.
- r := valueToRat(num)
- f.SetRat(r.Quo(r, valueToRat(denom)))
- } else {
- // Value too large to represent as a fraction => inaccessible.
- // TODO(gri): add big.Float accessor to constant.Value.
- f.SetFloat64(math.MaxFloat64) // FIXME
- }
-
- // extract exponent such that 0.5 <= m < 1.0
- var m big.Float
- exp := f.MantExp(&m)
-
- // extract mantissa as *big.Int
- // - set exponent large enough so mant satisfies mant.IsInt()
- // - get *big.Int from mant
- m.SetMantExp(&m, int(m.MinPrec()))
- mant, acc := m.Int(nil)
- if acc != big.Exact {
- log.Fatalf("gcimporter: internal error")
- }
-
- p.int(sign)
- p.int(exp)
- p.string(string(mant.Bytes()))
-}
-
-func valueToRat(x constant.Value) *big.Rat {
- // Convert little-endian to big-endian.
- // I can't believe this is necessary.
- bytes := constant.Bytes(x)
- for i := 0; i < len(bytes)/2; i++ {
- bytes[i], bytes[len(bytes)-1-i] = bytes[len(bytes)-1-i], bytes[i]
- }
- return new(big.Rat).SetInt(new(big.Int).SetBytes(bytes))
-}
-
-func (p *exporter) bool(b bool) bool {
- if trace {
- p.tracef("[")
- defer p.tracef("= %v] ", b)
- }
-
- x := 0
- if b {
- x = 1
- }
- p.int(x)
- return b
-}
-
-// ----------------------------------------------------------------------------
-// Low-level encoders
-
-func (p *exporter) index(marker byte, index int) {
- if index < 0 {
- log.Fatalf("gcimporter: invalid index < 0")
- }
- if debugFormat {
- p.marker('t')
- }
- if trace {
- p.tracef("%c%d ", marker, index)
- }
- p.rawInt64(int64(index))
-}
-
-func (p *exporter) tag(tag int) {
- if tag >= 0 {
- log.Fatalf("gcimporter: invalid tag >= 0")
- }
- if debugFormat {
- p.marker('t')
- }
- if trace {
- p.tracef("%s ", tagString[-tag])
- }
- p.rawInt64(int64(tag))
-}
-
-func (p *exporter) int(x int) {
- p.int64(int64(x))
-}
-
-func (p *exporter) int64(x int64) {
- if debugFormat {
- p.marker('i')
- }
- if trace {
- p.tracef("%d ", x)
- }
- p.rawInt64(x)
-}
-
-func (p *exporter) string(s string) {
- if debugFormat {
- p.marker('s')
- }
- if trace {
- p.tracef("%q ", s)
- }
- // if we saw the string before, write its index (>= 0)
- // (the empty string is mapped to 0)
- if i, ok := p.strIndex[s]; ok {
- p.rawInt64(int64(i))
- return
- }
- // otherwise, remember string and write its negative length and bytes
- p.strIndex[s] = len(p.strIndex)
- p.rawInt64(-int64(len(s)))
- for i := 0; i < len(s); i++ {
- p.rawByte(s[i])
- }
-}
-
-// marker emits a marker byte and position information which makes
-// it easy for a reader to detect if it is "out of sync". Used for
-// debugFormat format only.
-func (p *exporter) marker(m byte) {
- p.rawByte(m)
- // Enable this for help tracking down the location
- // of an incorrect marker when running in debugFormat.
- if false && trace {
- p.tracef("#%d ", p.written)
- }
- p.rawInt64(int64(p.written))
-}
-
-// rawInt64 should only be used by low-level encoders.
-func (p *exporter) rawInt64(x int64) {
- var tmp [binary.MaxVarintLen64]byte
- n := binary.PutVarint(tmp[:], x)
- for i := 0; i < n; i++ {
- p.rawByte(tmp[i])
- }
-}
-
-// rawStringln should only be used to emit the initial version string.
-func (p *exporter) rawStringln(s string) {
- for i := 0; i < len(s); i++ {
- p.rawByte(s[i])
- }
- p.rawByte('\n')
-}
-
-// rawByte is the bottleneck interface to write to p.out.
-// rawByte escapes b as follows (any encoding does that
-// hides '$'):
-//
-// '$' => '|' 'S'
-// '|' => '|' '|'
-//
-// Necessary so other tools can find the end of the
-// export data by searching for "$$".
-// rawByte should only be used by low-level encoders.
-func (p *exporter) rawByte(b byte) {
- switch b {
- case '$':
- // write '$' as '|' 'S'
- b = 'S'
- fallthrough
- case '|':
- // write '|' as '|' '|'
- p.out.WriteByte('|')
- p.written++
- }
- p.out.WriteByte(b)
- p.written++
-}
-
-// tracef is like fmt.Printf but it rewrites the format string
-// to take care of indentation.
-func (p *exporter) tracef(format string, args ...interface{}) {
- if strings.ContainsAny(format, "<>\n") {
- var buf bytes.Buffer
- for i := 0; i < len(format); i++ {
- // no need to deal with runes
- ch := format[i]
- switch ch {
- case '>':
- p.indent++
- continue
- case '<':
- p.indent--
- continue
- }
- buf.WriteByte(ch)
- if ch == '\n' {
- for j := p.indent; j > 0; j-- {
- buf.WriteString(". ")
- }
- }
- }
- format = buf.String()
- }
- fmt.Printf(format, args...)
-}
-
-// Debugging support.
-// (tagString is only used when tracing is enabled)
-var tagString = [...]string{
- // Packages
- -packageTag: "package",
-
- // Types
- -namedTag: "named type",
- -arrayTag: "array",
- -sliceTag: "slice",
- -dddTag: "ddd",
- -structTag: "struct",
- -pointerTag: "pointer",
- -signatureTag: "signature",
- -interfaceTag: "interface",
- -mapTag: "map",
- -chanTag: "chan",
-
- // Values
- -falseTag: "false",
- -trueTag: "true",
- -int64Tag: "int64",
- -floatTag: "float",
- -fractionTag: "fraction",
- -complexTag: "complex",
- -stringTag: "string",
- -unknownTag: "unknown",
-
- // Type aliases
- -aliasTag: "alias",
-}
diff --git a/vendor/golang.org/x/tools/go/gcimporter15/bexport19_test.go b/vendor/golang.org/x/tools/go/gcimporter15/bexport19_test.go
deleted file mode 100644
index f6e9733..0000000
--- a/vendor/golang.org/x/tools/go/gcimporter15/bexport19_test.go
+++ /dev/null
@@ -1,93 +0,0 @@
-// Copyright 2016 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build go1.9
-
-package gcimporter_test
-
-import (
- "go/ast"
- "go/parser"
- "go/token"
- "go/types"
- "testing"
-
- gcimporter "golang.org/x/tools/go/gcimporter15"
-)
-
-const src = `
-package p
-
-type (
- T0 = int32
- T1 = struct{}
- T2 = struct{ T1 }
- Invalid = foo // foo is undeclared
-)
-`
-
-func checkPkg(t *testing.T, pkg *types.Package, label string) {
- T1 := types.NewStruct(nil, nil)
- T2 := types.NewStruct([]*types.Var{types.NewField(0, pkg, "T1", T1, true)}, nil)
-
- for _, test := range []struct {
- name string
- typ types.Type
- }{
- {"T0", types.Typ[types.Int32]},
- {"T1", T1},
- {"T2", T2},
- {"Invalid", types.Typ[types.Invalid]},
- } {
- obj := pkg.Scope().Lookup(test.name)
- if obj == nil {
- t.Errorf("%s: %s not found", label, test.name)
- continue
- }
- tname, _ := obj.(*types.TypeName)
- if tname == nil {
- t.Errorf("%s: %v not a type name", label, obj)
- continue
- }
- if !tname.IsAlias() {
- t.Errorf("%s: %v: not marked as alias", label, tname)
- continue
- }
- if got := tname.Type(); !types.Identical(got, test.typ) {
- t.Errorf("%s: %v: got %v; want %v", label, tname, got, test.typ)
- }
- }
-}
-
-func TestTypeAliases(t *testing.T) {
- // parse and typecheck
- fset1 := token.NewFileSet()
- f, err := parser.ParseFile(fset1, "p.go", src, 0)
- if err != nil {
- t.Fatal(err)
- }
- var conf types.Config
- pkg1, err := conf.Check("p", fset1, []*ast.File{f}, nil)
- if err == nil {
- // foo in undeclared in src; we should see an error
- t.Fatal("invalid source type-checked without error")
- }
- if pkg1 == nil {
- // despite incorrect src we should see a (partially) type-checked package
- t.Fatal("nil package returned")
- }
- checkPkg(t, pkg1, "export")
-
- // export
- exportdata := gcimporter.BExportData(fset1, pkg1)
-
- // import
- imports := make(map[string]*types.Package)
- fset2 := token.NewFileSet()
- _, pkg2, err := gcimporter.BImportData(fset2, imports, exportdata, pkg1.Path())
- if err != nil {
- t.Fatalf("BImportData(%s): %v", pkg1.Path(), err)
- }
- checkPkg(t, pkg2, "import")
-}
diff --git a/vendor/golang.org/x/tools/go/gcimporter15/bexport_test.go b/vendor/golang.org/x/tools/go/gcimporter15/bexport_test.go
deleted file mode 100644
index 6ab3bcb..0000000
--- a/vendor/golang.org/x/tools/go/gcimporter15/bexport_test.go
+++ /dev/null
@@ -1,326 +0,0 @@
-// Copyright 2016 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package gcimporter_test
-
-import (
- "fmt"
- "go/ast"
- "go/build"
- "go/constant"
- "go/parser"
- "go/token"
- "go/types"
- "reflect"
- "runtime"
- "strings"
- "testing"
-
- "golang.org/x/tools/go/buildutil"
- gcimporter "golang.org/x/tools/go/gcimporter15"
- "golang.org/x/tools/go/loader"
-)
-
-func TestBExportData_stdlib(t *testing.T) {
- if runtime.GOOS == "android" {
- t.Skipf("incomplete std lib on %s", runtime.GOOS)
- }
-
- // Load, parse and type-check the program.
- ctxt := build.Default // copy
- ctxt.GOPATH = "" // disable GOPATH
- conf := loader.Config{
- Build: &ctxt,
- AllowErrors: true,
- }
- for _, path := range buildutil.AllPackages(conf.Build) {
- conf.Import(path)
- }
-
- // Create a package containing type and value errors to ensure
- // they are properly encoded/decoded.
- f, err := conf.ParseFile("haserrors/haserrors.go", `package haserrors
-const UnknownValue = "" + 0
-type UnknownType undefined
-`)
- if err != nil {
- t.Fatal(err)
- }
- conf.CreateFromFiles("haserrors", f)
-
- prog, err := conf.Load()
- if err != nil {
- t.Fatalf("Load failed: %v", err)
- }
-
- numPkgs := len(prog.AllPackages)
- if want := 248; numPkgs < want {
- t.Errorf("Loaded only %d packages, want at least %d", numPkgs, want)
- }
-
- for pkg, info := range prog.AllPackages {
- if info.Files == nil {
- continue // empty directory
- }
- exportdata := gcimporter.BExportData(conf.Fset, pkg)
-
- imports := make(map[string]*types.Package)
- fset2 := token.NewFileSet()
- n, pkg2, err := gcimporter.BImportData(fset2, imports, exportdata, pkg.Path())
- if err != nil {
- t.Errorf("BImportData(%s): %v", pkg.Path(), err)
- continue
- }
- if n != len(exportdata) {
- t.Errorf("BImportData(%s) decoded %d bytes, want %d",
- pkg.Path(), n, len(exportdata))
- }
-
- // Compare the packages' corresponding members.
- for _, name := range pkg.Scope().Names() {
- if !ast.IsExported(name) {
- continue
- }
- obj1 := pkg.Scope().Lookup(name)
- obj2 := pkg2.Scope().Lookup(name)
- if obj2 == nil {
- t.Errorf("%s.%s not found, want %s", pkg.Path(), name, obj1)
- continue
- }
-
- fl1 := fileLine(conf.Fset, obj1)
- fl2 := fileLine(fset2, obj2)
- if fl1 != fl2 {
- t.Errorf("%s.%s: got posn %s, want %s",
- pkg.Path(), name, fl2, fl1)
- }
-
- if err := equalObj(obj1, obj2); err != nil {
- t.Errorf("%s.%s: %s\ngot: %s\nwant: %s",
- pkg.Path(), name, err, obj2, obj1)
- }
- }
- }
-}
-
-func fileLine(fset *token.FileSet, obj types.Object) string {
- posn := fset.Position(obj.Pos())
- return fmt.Sprintf("%s:%d", posn.Filename, posn.Line)
-}
-
-// equalObj reports how x and y differ. They are assumed to belong to
-// different universes so cannot be compared directly.
-func equalObj(x, y types.Object) error {
- if reflect.TypeOf(x) != reflect.TypeOf(y) {
- return fmt.Errorf("%T vs %T", x, y)
- }
- xt := x.Type()
- yt := y.Type()
- switch x.(type) {
- case *types.Var, *types.Func:
- // ok
- case *types.Const:
- xval := x.(*types.Const).Val()
- yval := y.(*types.Const).Val()
- // Use string comparison for floating-point values since rounding is permitted.
- if constant.Compare(xval, token.NEQ, yval) &&
- !(xval.Kind() == constant.Float && xval.String() == yval.String()) {
- return fmt.Errorf("unequal constants %s vs %s", xval, yval)
- }
- case *types.TypeName:
- xt = xt.Underlying()
- yt = yt.Underlying()
- default:
- return fmt.Errorf("unexpected %T", x)
- }
- return equalType(xt, yt)
-}
-
-func equalType(x, y types.Type) error {
- if reflect.TypeOf(x) != reflect.TypeOf(y) {
- return fmt.Errorf("unequal kinds: %T vs %T", x, y)
- }
- switch x := x.(type) {
- case *types.Interface:
- y := y.(*types.Interface)
- // TODO(gri): enable separate emission of Embedded interfaces
- // and ExplicitMethods then use this logic.
- // if x.NumEmbeddeds() != y.NumEmbeddeds() {
- // return fmt.Errorf("unequal number of embedded interfaces: %d vs %d",
- // x.NumEmbeddeds(), y.NumEmbeddeds())
- // }
- // for i := 0; i < x.NumEmbeddeds(); i++ {
- // xi := x.Embedded(i)
- // yi := y.Embedded(i)
- // if xi.String() != yi.String() {
- // return fmt.Errorf("mismatched %th embedded interface: %s vs %s",
- // i, xi, yi)
- // }
- // }
- // if x.NumExplicitMethods() != y.NumExplicitMethods() {
- // return fmt.Errorf("unequal methods: %d vs %d",
- // x.NumExplicitMethods(), y.NumExplicitMethods())
- // }
- // for i := 0; i < x.NumExplicitMethods(); i++ {
- // xm := x.ExplicitMethod(i)
- // ym := y.ExplicitMethod(i)
- // if xm.Name() != ym.Name() {
- // return fmt.Errorf("mismatched %th method: %s vs %s", i, xm, ym)
- // }
- // if err := equalType(xm.Type(), ym.Type()); err != nil {
- // return fmt.Errorf("mismatched %s method: %s", xm.Name(), err)
- // }
- // }
- if x.NumMethods() != y.NumMethods() {
- return fmt.Errorf("unequal methods: %d vs %d",
- x.NumMethods(), y.NumMethods())
- }
- for i := 0; i < x.NumMethods(); i++ {
- xm := x.Method(i)
- ym := y.Method(i)
- if xm.Name() != ym.Name() {
- return fmt.Errorf("mismatched %dth method: %s vs %s", i, xm, ym)
- }
- if err := equalType(xm.Type(), ym.Type()); err != nil {
- return fmt.Errorf("mismatched %s method: %s", xm.Name(), err)
- }
- }
- case *types.Array:
- y := y.(*types.Array)
- if x.Len() != y.Len() {
- return fmt.Errorf("unequal array lengths: %d vs %d", x.Len(), y.Len())
- }
- if err := equalType(x.Elem(), y.Elem()); err != nil {
- return fmt.Errorf("array elements: %s", err)
- }
- case *types.Basic:
- y := y.(*types.Basic)
- if x.Kind() != y.Kind() {
- return fmt.Errorf("unequal basic types: %s vs %s", x, y)
- }
- case *types.Chan:
- y := y.(*types.Chan)
- if x.Dir() != y.Dir() {
- return fmt.Errorf("unequal channel directions: %d vs %d", x.Dir(), y.Dir())
- }
- if err := equalType(x.Elem(), y.Elem()); err != nil {
- return fmt.Errorf("channel elements: %s", err)
- }
- case *types.Map:
- y := y.(*types.Map)
- if err := equalType(x.Key(), y.Key()); err != nil {
- return fmt.Errorf("map keys: %s", err)
- }
- if err := equalType(x.Elem(), y.Elem()); err != nil {
- return fmt.Errorf("map values: %s", err)
- }
- case *types.Named:
- y := y.(*types.Named)
- if x.String() != y.String() {
- return fmt.Errorf("unequal named types: %s vs %s", x, y)
- }
- case *types.Pointer:
- y := y.(*types.Pointer)
- if err := equalType(x.Elem(), y.Elem()); err != nil {
- return fmt.Errorf("pointer elements: %s", err)
- }
- case *types.Signature:
- y := y.(*types.Signature)
- if err := equalType(x.Params(), y.Params()); err != nil {
- return fmt.Errorf("parameters: %s", err)
- }
- if err := equalType(x.Results(), y.Results()); err != nil {
- return fmt.Errorf("results: %s", err)
- }
- if x.Variadic() != y.Variadic() {
- return fmt.Errorf("unequal varidicity: %t vs %t",
- x.Variadic(), y.Variadic())
- }
- if (x.Recv() != nil) != (y.Recv() != nil) {
- return fmt.Errorf("unequal receivers: %s vs %s", x.Recv(), y.Recv())
- }
- if x.Recv() != nil {
- // TODO(adonovan): fix: this assertion fires for interface methods.
- // The type of the receiver of an interface method is a named type
- // if the Package was loaded from export data, or an unnamed (interface)
- // type if the Package was produced by type-checking ASTs.
- // if err := equalType(x.Recv().Type(), y.Recv().Type()); err != nil {
- // return fmt.Errorf("receiver: %s", err)
- // }
- }
- case *types.Slice:
- y := y.(*types.Slice)
- if err := equalType(x.Elem(), y.Elem()); err != nil {
- return fmt.Errorf("slice elements: %s", err)
- }
- case *types.Struct:
- y := y.(*types.Struct)
- if x.NumFields() != y.NumFields() {
- return fmt.Errorf("unequal struct fields: %d vs %d",
- x.NumFields(), y.NumFields())
- }
- for i := 0; i < x.NumFields(); i++ {
- xf := x.Field(i)
- yf := y.Field(i)
- if xf.Name() != yf.Name() {
- return fmt.Errorf("mismatched fields: %s vs %s", xf, yf)
- }
- if err := equalType(xf.Type(), yf.Type()); err != nil {
- return fmt.Errorf("struct field %s: %s", xf.Name(), err)
- }
- if x.Tag(i) != y.Tag(i) {
- return fmt.Errorf("struct field %s has unequal tags: %q vs %q",
- xf.Name(), x.Tag(i), y.Tag(i))
- }
- }
- case *types.Tuple:
- y := y.(*types.Tuple)
- if x.Len() != y.Len() {
- return fmt.Errorf("unequal tuple lengths: %d vs %d", x.Len(), y.Len())
- }
- for i := 0; i < x.Len(); i++ {
- if err := equalType(x.At(i).Type(), y.At(i).Type()); err != nil {
- return fmt.Errorf("tuple element %d: %s", i, err)
- }
- }
- }
- return nil
-}
-
-// TestVeryLongFile tests the position of an import object declared in
-// a very long input file. Line numbers greater than maxlines are
-// reported as line 1, not garbage or token.NoPos.
-func TestVeryLongFile(t *testing.T) {
- // parse and typecheck
- longFile := "package foo" + strings.Repeat("\n", 123456) + "var X int"
- fset1 := token.NewFileSet()
- f, err := parser.ParseFile(fset1, "foo.go", longFile, 0)
- if err != nil {
- t.Fatal(err)
- }
- var conf types.Config
- pkg, err := conf.Check("foo", fset1, []*ast.File{f}, nil)
- if err != nil {
- t.Fatal(err)
- }
-
- // export
- exportdata := gcimporter.BExportData(fset1, pkg)
-
- // import
- imports := make(map[string]*types.Package)
- fset2 := token.NewFileSet()
- _, pkg2, err := gcimporter.BImportData(fset2, imports, exportdata, pkg.Path())
- if err != nil {
- t.Fatalf("BImportData(%s): %v", pkg.Path(), err)
- }
-
- // compare
- posn1 := fset1.Position(pkg.Scope().Lookup("X").Pos())
- posn2 := fset2.Position(pkg2.Scope().Lookup("X").Pos())
- if want := "foo.go:1:1"; posn2.String() != want {
- t.Errorf("X position = %s, want %s (orig was %s)",
- posn2, want, posn1)
- }
-}
diff --git a/vendor/golang.org/x/tools/go/gcimporter15/bimport.go b/vendor/golang.org/x/tools/go/gcimporter15/bimport.go
deleted file mode 100644
index 1936a7f..0000000
--- a/vendor/golang.org/x/tools/go/gcimporter15/bimport.go
+++ /dev/null
@@ -1,993 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// This file is a copy of $GOROOT/src/go/internal/gcimporter/bimport.go.
-
-package gcimporter
-
-import (
- "encoding/binary"
- "fmt"
- "go/constant"
- "go/token"
- "go/types"
- "sort"
- "strconv"
- "strings"
- "sync"
- "unicode"
- "unicode/utf8"
-)
-
-type importer struct {
- imports map[string]*types.Package
- data []byte
- importpath string
- buf []byte // for reading strings
- version int // export format version
-
- // object lists
- strList []string // in order of appearance
- pathList []string // in order of appearance
- pkgList []*types.Package // in order of appearance
- typList []types.Type // in order of appearance
- interfaceList []*types.Interface // for delayed completion only
- trackAllTypes bool
-
- // position encoding
- posInfoFormat bool
- prevFile string
- prevLine int
- fset *token.FileSet
- files map[string]*token.File
-
- // debugging support
- debugFormat bool
- read int // bytes read
-}
-
-// BImportData imports a package from the serialized package data
-// and returns the number of bytes consumed and a reference to the package.
-// If the export data version is not recognized or the format is otherwise
-// compromised, an error is returned.
-func BImportData(fset *token.FileSet, imports map[string]*types.Package, data []byte, path string) (_ int, pkg *types.Package, err error) {
- // catch panics and return them as errors
- defer func() {
- if e := recover(); e != nil {
- // The package (filename) causing the problem is added to this
- // error by a wrapper in the caller (Import in gcimporter.go).
- // Return a (possibly nil or incomplete) package unchanged (see #16088).
- err = fmt.Errorf("cannot import, possibly version skew (%v) - reinstall package", e)
- }
- }()
-
- p := importer{
- imports: imports,
- data: data,
- importpath: path,
- version: -1, // unknown version
- strList: []string{""}, // empty string is mapped to 0
- pathList: []string{""}, // empty string is mapped to 0
- fset: fset,
- files: make(map[string]*token.File),
- }
-
- // read version info
- var versionstr string
- if b := p.rawByte(); b == 'c' || b == 'd' {
- // Go1.7 encoding; first byte encodes low-level
- // encoding format (compact vs debug).
- // For backward-compatibility only (avoid problems with
- // old installed packages). Newly compiled packages use
- // the extensible format string.
- // TODO(gri) Remove this support eventually; after Go1.8.
- if b == 'd' {
- p.debugFormat = true
- }
- p.trackAllTypes = p.rawByte() == 'a'
- p.posInfoFormat = p.int() != 0
- versionstr = p.string()
- if versionstr == "v1" {
- p.version = 0
- }
- } else {
- // Go1.8 extensible encoding
- // read version string and extract version number (ignore anything after the version number)
- versionstr = p.rawStringln(b)
- if s := strings.SplitN(versionstr, " ", 3); len(s) >= 2 && s[0] == "version" {
- if v, err := strconv.Atoi(s[1]); err == nil && v > 0 {
- p.version = v
- }
- }
- }
-
- // read version specific flags - extend as necessary
- switch p.version {
- // case 6:
- // ...
- // fallthrough
- case 5, 4, 3, 2, 1:
- p.debugFormat = p.rawStringln(p.rawByte()) == "debug"
- p.trackAllTypes = p.int() != 0
- p.posInfoFormat = p.int() != 0
- case 0:
- // Go1.7 encoding format - nothing to do here
- default:
- errorf("unknown export format version %d (%q)", p.version, versionstr)
- }
-
- // --- generic export data ---
-
- // populate typList with predeclared "known" types
- p.typList = append(p.typList, predeclared...)
-
- // read package data
- pkg = p.pkg()
-
- // read objects of phase 1 only (see cmd/compiler/internal/gc/bexport.go)
- objcount := 0
- for {
- tag := p.tagOrIndex()
- if tag == endTag {
- break
- }
- p.obj(tag)
- objcount++
- }
-
- // self-verification
- if count := p.int(); count != objcount {
- errorf("got %d objects; want %d", objcount, count)
- }
-
- // ignore compiler-specific import data
-
- // complete interfaces
- // TODO(gri) re-investigate if we still need to do this in a delayed fashion
- for _, typ := range p.interfaceList {
- typ.Complete()
- }
-
- // record all referenced packages as imports
- list := append(([]*types.Package)(nil), p.pkgList[1:]...)
- sort.Sort(byPath(list))
- pkg.SetImports(list)
-
- // package was imported completely and without errors
- pkg.MarkComplete()
-
- return p.read, pkg, nil
-}
-
-func errorf(format string, args ...interface{}) {
- panic(fmt.Sprintf(format, args...))
-}
-
-func (p *importer) pkg() *types.Package {
- // if the package was seen before, i is its index (>= 0)
- i := p.tagOrIndex()
- if i >= 0 {
- return p.pkgList[i]
- }
-
- // otherwise, i is the package tag (< 0)
- if i != packageTag {
- errorf("unexpected package tag %d version %d", i, p.version)
- }
-
- // read package data
- name := p.string()
- var path string
- if p.version >= 5 {
- path = p.path()
- } else {
- path = p.string()
- }
-
- // we should never see an empty package name
- if name == "" {
- errorf("empty package name in import")
- }
-
- // an empty path denotes the package we are currently importing;
- // it must be the first package we see
- if (path == "") != (len(p.pkgList) == 0) {
- errorf("package path %q for pkg index %d", path, len(p.pkgList))
- }
-
- // if the package was imported before, use that one; otherwise create a new one
- if path == "" {
- path = p.importpath
- }
- pkg := p.imports[path]
- if pkg == nil {
- pkg = types.NewPackage(path, name)
- p.imports[path] = pkg
- } else if pkg.Name() != name {
- errorf("conflicting names %s and %s for package %q", pkg.Name(), name, path)
- }
- p.pkgList = append(p.pkgList, pkg)
-
- return pkg
-}
-
-// objTag returns the tag value for each object kind.
-func objTag(obj types.Object) int {
- switch obj.(type) {
- case *types.Const:
- return constTag
- case *types.TypeName:
- return typeTag
- case *types.Var:
- return varTag
- case *types.Func:
- return funcTag
- default:
- errorf("unexpected object: %v (%T)", obj, obj) // panics
- panic("unreachable")
- }
-}
-
-func sameObj(a, b types.Object) bool {
- // Because unnamed types are not canonicalized, we cannot simply compare types for
- // (pointer) identity.
- // Ideally we'd check equality of constant values as well, but this is good enough.
- return objTag(a) == objTag(b) && types.Identical(a.Type(), b.Type())
-}
-
-func (p *importer) declare(obj types.Object) {
- pkg := obj.Pkg()
- if alt := pkg.Scope().Insert(obj); alt != nil {
- // This can only trigger if we import a (non-type) object a second time.
- // Excluding type aliases, this cannot happen because 1) we only import a package
- // once; and b) we ignore compiler-specific export data which may contain
- // functions whose inlined function bodies refer to other functions that
- // were already imported.
- // However, type aliases require reexporting the original type, so we need
- // to allow it (see also the comment in cmd/compile/internal/gc/bimport.go,
- // method importer.obj, switch case importing functions).
- // TODO(gri) review/update this comment once the gc compiler handles type aliases.
- if !sameObj(obj, alt) {
- errorf("inconsistent import:\n\t%v\npreviously imported as:\n\t%v\n", obj, alt)
- }
- }
-}
-
-func (p *importer) obj(tag int) {
- switch tag {
- case constTag:
- pos := p.pos()
- pkg, name := p.qualifiedName()
- typ := p.typ(nil)
- val := p.value()
- p.declare(types.NewConst(pos, pkg, name, typ, val))
-
- case aliasTag:
- // TODO(gri) verify type alias hookup is correct
- pos := p.pos()
- pkg, name := p.qualifiedName()
- typ := p.typ(nil)
- p.declare(types.NewTypeName(pos, pkg, name, typ))
-
- case typeTag:
- p.typ(nil)
-
- case varTag:
- pos := p.pos()
- pkg, name := p.qualifiedName()
- typ := p.typ(nil)
- p.declare(types.NewVar(pos, pkg, name, typ))
-
- case funcTag:
- pos := p.pos()
- pkg, name := p.qualifiedName()
- params, isddd := p.paramList()
- result, _ := p.paramList()
- sig := types.NewSignature(nil, params, result, isddd)
- p.declare(types.NewFunc(pos, pkg, name, sig))
-
- default:
- errorf("unexpected object tag %d", tag)
- }
-}
-
-const deltaNewFile = -64 // see cmd/compile/internal/gc/bexport.go
-
-func (p *importer) pos() token.Pos {
- if !p.posInfoFormat {
- return token.NoPos
- }
-
- file := p.prevFile
- line := p.prevLine
- delta := p.int()
- line += delta
- if p.version >= 5 {
- if delta == deltaNewFile {
- if n := p.int(); n >= 0 {
- // file changed
- file = p.path()
- line = n
- }
- }
- } else {
- if delta == 0 {
- if n := p.int(); n >= 0 {
- // file changed
- file = p.prevFile[:n] + p.string()
- line = p.int()
- }
- }
- }
- p.prevFile = file
- p.prevLine = line
-
- // Synthesize a token.Pos
-
- // Since we don't know the set of needed file positions, we
- // reserve maxlines positions per file.
- const maxlines = 64 * 1024
- f := p.files[file]
- if f == nil {
- f = p.fset.AddFile(file, -1, maxlines)
- p.files[file] = f
- // Allocate the fake linebreak indices on first use.
- // TODO(adonovan): opt: save ~512KB using a more complex scheme?
- fakeLinesOnce.Do(func() {
- fakeLines = make([]int, maxlines)
- for i := range fakeLines {
- fakeLines[i] = i
- }
- })
- f.SetLines(fakeLines)
- }
-
- if line > maxlines {
- line = 1
- }
-
- // Treat the file as if it contained only newlines
- // and column=1: use the line number as the offset.
- return f.Pos(line - 1)
-}
-
-var (
- fakeLines []int
- fakeLinesOnce sync.Once
-)
-
-func (p *importer) qualifiedName() (pkg *types.Package, name string) {
- name = p.string()
- pkg = p.pkg()
- return
-}
-
-func (p *importer) record(t types.Type) {
- p.typList = append(p.typList, t)
-}
-
-// A dddSlice is a types.Type representing ...T parameters.
-// It only appears for parameter types and does not escape
-// the importer.
-type dddSlice struct {
- elem types.Type
-}
-
-func (t *dddSlice) Underlying() types.Type { return t }
-func (t *dddSlice) String() string { return "..." + t.elem.String() }
-
-// parent is the package which declared the type; parent == nil means
-// the package currently imported. The parent package is needed for
-// exported struct fields and interface methods which don't contain
-// explicit package information in the export data.
-func (p *importer) typ(parent *types.Package) types.Type {
- // if the type was seen before, i is its index (>= 0)
- i := p.tagOrIndex()
- if i >= 0 {
- return p.typList[i]
- }
-
- // otherwise, i is the type tag (< 0)
- switch i {
- case namedTag:
- // read type object
- pos := p.pos()
- parent, name := p.qualifiedName()
- scope := parent.Scope()
- obj := scope.Lookup(name)
-
- // if the object doesn't exist yet, create and insert it
- if obj == nil {
- obj = types.NewTypeName(pos, parent, name, nil)
- scope.Insert(obj)
- }
-
- if _, ok := obj.(*types.TypeName); !ok {
- errorf("pkg = %s, name = %s => %s", parent, name, obj)
- }
-
- // associate new named type with obj if it doesn't exist yet
- t0 := types.NewNamed(obj.(*types.TypeName), nil, nil)
-
- // but record the existing type, if any
- t := obj.Type().(*types.Named)
- p.record(t)
-
- // read underlying type
- t0.SetUnderlying(p.typ(parent))
-
- // interfaces don't have associated methods
- if types.IsInterface(t0) {
- return t
- }
-
- // read associated methods
- for i := p.int(); i > 0; i-- {
- // TODO(gri) replace this with something closer to fieldName
- pos := p.pos()
- name := p.string()
- if !exported(name) {
- p.pkg()
- }
-
- recv, _ := p.paramList() // TODO(gri) do we need a full param list for the receiver?
- params, isddd := p.paramList()
- result, _ := p.paramList()
- p.int() // go:nointerface pragma - discarded
-
- sig := types.NewSignature(recv.At(0), params, result, isddd)
- t0.AddMethod(types.NewFunc(pos, parent, name, sig))
- }
-
- return t
-
- case arrayTag:
- t := new(types.Array)
- if p.trackAllTypes {
- p.record(t)
- }
-
- n := p.int64()
- *t = *types.NewArray(p.typ(parent), n)
- return t
-
- case sliceTag:
- t := new(types.Slice)
- if p.trackAllTypes {
- p.record(t)
- }
-
- *t = *types.NewSlice(p.typ(parent))
- return t
-
- case dddTag:
- t := new(dddSlice)
- if p.trackAllTypes {
- p.record(t)
- }
-
- t.elem = p.typ(parent)
- return t
-
- case structTag:
- t := new(types.Struct)
- if p.trackAllTypes {
- p.record(t)
- }
-
- *t = *types.NewStruct(p.fieldList(parent))
- return t
-
- case pointerTag:
- t := new(types.Pointer)
- if p.trackAllTypes {
- p.record(t)
- }
-
- *t = *types.NewPointer(p.typ(parent))
- return t
-
- case signatureTag:
- t := new(types.Signature)
- if p.trackAllTypes {
- p.record(t)
- }
-
- params, isddd := p.paramList()
- result, _ := p.paramList()
- *t = *types.NewSignature(nil, params, result, isddd)
- return t
-
- case interfaceTag:
- // Create a dummy entry in the type list. This is safe because we
- // cannot expect the interface type to appear in a cycle, as any
- // such cycle must contain a named type which would have been
- // first defined earlier.
- n := len(p.typList)
- if p.trackAllTypes {
- p.record(nil)
- }
-
- var embeddeds []*types.Named
- for n := p.int(); n > 0; n-- {
- p.pos()
- embeddeds = append(embeddeds, p.typ(parent).(*types.Named))
- }
-
- t := types.NewInterface(p.methodList(parent), embeddeds)
- p.interfaceList = append(p.interfaceList, t)
- if p.trackAllTypes {
- p.typList[n] = t
- }
- return t
-
- case mapTag:
- t := new(types.Map)
- if p.trackAllTypes {
- p.record(t)
- }
-
- key := p.typ(parent)
- val := p.typ(parent)
- *t = *types.NewMap(key, val)
- return t
-
- case chanTag:
- t := new(types.Chan)
- if p.trackAllTypes {
- p.record(t)
- }
-
- var dir types.ChanDir
- // tag values must match the constants in cmd/compile/internal/gc/go.go
- switch d := p.int(); d {
- case 1 /* Crecv */ :
- dir = types.RecvOnly
- case 2 /* Csend */ :
- dir = types.SendOnly
- case 3 /* Cboth */ :
- dir = types.SendRecv
- default:
- errorf("unexpected channel dir %d", d)
- }
- val := p.typ(parent)
- *t = *types.NewChan(dir, val)
- return t
-
- default:
- errorf("unexpected type tag %d", i) // panics
- panic("unreachable")
- }
-}
-
-func (p *importer) fieldList(parent *types.Package) (fields []*types.Var, tags []string) {
- if n := p.int(); n > 0 {
- fields = make([]*types.Var, n)
- tags = make([]string, n)
- for i := range fields {
- fields[i], tags[i] = p.field(parent)
- }
- }
- return
-}
-
-func (p *importer) field(parent *types.Package) (*types.Var, string) {
- pos := p.pos()
- pkg, name, alias := p.fieldName(parent)
- typ := p.typ(parent)
- tag := p.string()
-
- anonymous := false
- if name == "" {
- // anonymous field - typ must be T or *T and T must be a type name
- switch typ := deref(typ).(type) {
- case *types.Basic: // basic types are named types
- pkg = nil // // objects defined in Universe scope have no package
- name = typ.Name()
- case *types.Named:
- name = typ.Obj().Name()
- default:
- errorf("named base type expected")
- }
- anonymous = true
- } else if alias {
- // anonymous field: we have an explicit name because it's an alias
- anonymous = true
- }
-
- return types.NewField(pos, pkg, name, typ, anonymous), tag
-}
-
-func (p *importer) methodList(parent *types.Package) (methods []*types.Func) {
- if n := p.int(); n > 0 {
- methods = make([]*types.Func, n)
- for i := range methods {
- methods[i] = p.method(parent)
- }
- }
- return
-}
-
-func (p *importer) method(parent *types.Package) *types.Func {
- pos := p.pos()
- pkg, name, _ := p.fieldName(parent)
- params, isddd := p.paramList()
- result, _ := p.paramList()
- sig := types.NewSignature(nil, params, result, isddd)
- return types.NewFunc(pos, pkg, name, sig)
-}
-
-func (p *importer) fieldName(parent *types.Package) (pkg *types.Package, name string, alias bool) {
- name = p.string()
- pkg = parent
- if pkg == nil {
- // use the imported package instead
- pkg = p.pkgList[0]
- }
- if p.version == 0 && name == "_" {
- // version 0 didn't export a package for _ fields
- return
- }
- switch name {
- case "":
- // 1) field name matches base type name and is exported: nothing to do
- case "?":
- // 2) field name matches base type name and is not exported: need package
- name = ""
- pkg = p.pkg()
- case "@":
- // 3) field name doesn't match type name (alias)
- name = p.string()
- alias = true
- fallthrough
- default:
- if !exported(name) {
- pkg = p.pkg()
- }
- }
- return
-}
-
-func (p *importer) paramList() (*types.Tuple, bool) {
- n := p.int()
- if n == 0 {
- return nil, false
- }
- // negative length indicates unnamed parameters
- named := true
- if n < 0 {
- n = -n
- named = false
- }
- // n > 0
- params := make([]*types.Var, n)
- isddd := false
- for i := range params {
- params[i], isddd = p.param(named)
- }
- return types.NewTuple(params...), isddd
-}
-
-func (p *importer) param(named bool) (*types.Var, bool) {
- t := p.typ(nil)
- td, isddd := t.(*dddSlice)
- if isddd {
- t = types.NewSlice(td.elem)
- }
-
- var pkg *types.Package
- var name string
- if named {
- name = p.string()
- if name == "" {
- errorf("expected named parameter")
- }
- if name != "_" {
- pkg = p.pkg()
- }
- if i := strings.Index(name, "·"); i > 0 {
- name = name[:i] // cut off gc-specific parameter numbering
- }
- }
-
- // read and discard compiler-specific info
- p.string()
-
- return types.NewVar(token.NoPos, pkg, name, t), isddd
-}
-
-func exported(name string) bool {
- ch, _ := utf8.DecodeRuneInString(name)
- return unicode.IsUpper(ch)
-}
-
-func (p *importer) value() constant.Value {
- switch tag := p.tagOrIndex(); tag {
- case falseTag:
- return constant.MakeBool(false)
- case trueTag:
- return constant.MakeBool(true)
- case int64Tag:
- return constant.MakeInt64(p.int64())
- case floatTag:
- return p.float()
- case complexTag:
- re := p.float()
- im := p.float()
- return constant.BinaryOp(re, token.ADD, constant.MakeImag(im))
- case stringTag:
- return constant.MakeString(p.string())
- case unknownTag:
- return constant.MakeUnknown()
- default:
- errorf("unexpected value tag %d", tag) // panics
- panic("unreachable")
- }
-}
-
-func (p *importer) float() constant.Value {
- sign := p.int()
- if sign == 0 {
- return constant.MakeInt64(0)
- }
-
- exp := p.int()
- mant := []byte(p.string()) // big endian
-
- // remove leading 0's if any
- for len(mant) > 0 && mant[0] == 0 {
- mant = mant[1:]
- }
-
- // convert to little endian
- // TODO(gri) go/constant should have a more direct conversion function
- // (e.g., once it supports a big.Float based implementation)
- for i, j := 0, len(mant)-1; i < j; i, j = i+1, j-1 {
- mant[i], mant[j] = mant[j], mant[i]
- }
-
- // adjust exponent (constant.MakeFromBytes creates an integer value,
- // but mant represents the mantissa bits such that 0.5 <= mant < 1.0)
- exp -= len(mant) << 3
- if len(mant) > 0 {
- for msd := mant[len(mant)-1]; msd&0x80 == 0; msd <<= 1 {
- exp++
- }
- }
-
- x := constant.MakeFromBytes(mant)
- switch {
- case exp < 0:
- d := constant.Shift(constant.MakeInt64(1), token.SHL, uint(-exp))
- x = constant.BinaryOp(x, token.QUO, d)
- case exp > 0:
- x = constant.Shift(x, token.SHL, uint(exp))
- }
-
- if sign < 0 {
- x = constant.UnaryOp(token.SUB, x, 0)
- }
- return x
-}
-
-// ----------------------------------------------------------------------------
-// Low-level decoders
-
-func (p *importer) tagOrIndex() int {
- if p.debugFormat {
- p.marker('t')
- }
-
- return int(p.rawInt64())
-}
-
-func (p *importer) int() int {
- x := p.int64()
- if int64(int(x)) != x {
- errorf("exported integer too large")
- }
- return int(x)
-}
-
-func (p *importer) int64() int64 {
- if p.debugFormat {
- p.marker('i')
- }
-
- return p.rawInt64()
-}
-
-func (p *importer) path() string {
- if p.debugFormat {
- p.marker('p')
- }
- // if the path was seen before, i is its index (>= 0)
- // (the empty string is at index 0)
- i := p.rawInt64()
- if i >= 0 {
- return p.pathList[i]
- }
- // otherwise, i is the negative path length (< 0)
- a := make([]string, -i)
- for n := range a {
- a[n] = p.string()
- }
- s := strings.Join(a, "/")
- p.pathList = append(p.pathList, s)
- return s
-}
-
-func (p *importer) string() string {
- if p.debugFormat {
- p.marker('s')
- }
- // if the string was seen before, i is its index (>= 0)
- // (the empty string is at index 0)
- i := p.rawInt64()
- if i >= 0 {
- return p.strList[i]
- }
- // otherwise, i is the negative string length (< 0)
- if n := int(-i); n <= cap(p.buf) {
- p.buf = p.buf[:n]
- } else {
- p.buf = make([]byte, n)
- }
- for i := range p.buf {
- p.buf[i] = p.rawByte()
- }
- s := string(p.buf)
- p.strList = append(p.strList, s)
- return s
-}
-
-func (p *importer) marker(want byte) {
- if got := p.rawByte(); got != want {
- errorf("incorrect marker: got %c; want %c (pos = %d)", got, want, p.read)
- }
-
- pos := p.read
- if n := int(p.rawInt64()); n != pos {
- errorf("incorrect position: got %d; want %d", n, pos)
- }
-}
-
-// rawInt64 should only be used by low-level decoders.
-func (p *importer) rawInt64() int64 {
- i, err := binary.ReadVarint(p)
- if err != nil {
- errorf("read error: %v", err)
- }
- return i
-}
-
-// rawStringln should only be used to read the initial version string.
-func (p *importer) rawStringln(b byte) string {
- p.buf = p.buf[:0]
- for b != '\n' {
- p.buf = append(p.buf, b)
- b = p.rawByte()
- }
- return string(p.buf)
-}
-
-// needed for binary.ReadVarint in rawInt64
-func (p *importer) ReadByte() (byte, error) {
- return p.rawByte(), nil
-}
-
-// byte is the bottleneck interface for reading p.data.
-// It unescapes '|' 'S' to '$' and '|' '|' to '|'.
-// rawByte should only be used by low-level decoders.
-func (p *importer) rawByte() byte {
- b := p.data[0]
- r := 1
- if b == '|' {
- b = p.data[1]
- r = 2
- switch b {
- case 'S':
- b = '$'
- case '|':
- // nothing to do
- default:
- errorf("unexpected escape sequence in export data")
- }
- }
- p.data = p.data[r:]
- p.read += r
- return b
-
-}
-
-// ----------------------------------------------------------------------------
-// Export format
-
-// Tags. Must be < 0.
-const (
- // Objects
- packageTag = -(iota + 1)
- constTag
- typeTag
- varTag
- funcTag
- endTag
-
- // Types
- namedTag
- arrayTag
- sliceTag
- dddTag
- structTag
- pointerTag
- signatureTag
- interfaceTag
- mapTag
- chanTag
-
- // Values
- falseTag
- trueTag
- int64Tag
- floatTag
- fractionTag // not used by gc
- complexTag
- stringTag
- nilTag // only used by gc (appears in exported inlined function bodies)
- unknownTag // not used by gc (only appears in packages with errors)
-
- // Type aliases
- aliasTag
-)
-
-var predeclared = []types.Type{
- // basic types
- types.Typ[types.Bool],
- types.Typ[types.Int],
- types.Typ[types.Int8],
- types.Typ[types.Int16],
- types.Typ[types.Int32],
- types.Typ[types.Int64],
- types.Typ[types.Uint],
- types.Typ[types.Uint8],
- types.Typ[types.Uint16],
- types.Typ[types.Uint32],
- types.Typ[types.Uint64],
- types.Typ[types.Uintptr],
- types.Typ[types.Float32],
- types.Typ[types.Float64],
- types.Typ[types.Complex64],
- types.Typ[types.Complex128],
- types.Typ[types.String],
-
- // basic type aliases
- types.Universe.Lookup("byte").Type(),
- types.Universe.Lookup("rune").Type(),
-
- // error
- types.Universe.Lookup("error").Type(),
-
- // untyped types
- types.Typ[types.UntypedBool],
- types.Typ[types.UntypedInt],
- types.Typ[types.UntypedRune],
- types.Typ[types.UntypedFloat],
- types.Typ[types.UntypedComplex],
- types.Typ[types.UntypedString],
- types.Typ[types.UntypedNil],
-
- // package unsafe
- types.Typ[types.UnsafePointer],
-
- // invalid type
- types.Typ[types.Invalid], // only appears in packages with errors
-
- // used internally by gc; never used by this package or in .a files
- anyType{},
-}
-
-type anyType struct{}
-
-func (t anyType) Underlying() types.Type { return t }
-func (t anyType) String() string { return "any" }
diff --git a/vendor/golang.org/x/tools/go/gcimporter15/exportdata.go b/vendor/golang.org/x/tools/go/gcimporter15/exportdata.go
deleted file mode 100644
index f33dc56..0000000
--- a/vendor/golang.org/x/tools/go/gcimporter15/exportdata.go
+++ /dev/null
@@ -1,93 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// This file is a copy of $GOROOT/src/go/internal/gcimporter/exportdata.go.
-
-// This file implements FindExportData.
-
-package gcimporter
-
-import (
- "bufio"
- "fmt"
- "io"
- "strconv"
- "strings"
-)
-
-func readGopackHeader(r *bufio.Reader) (name string, size int, err error) {
- // See $GOROOT/include/ar.h.
- hdr := make([]byte, 16+12+6+6+8+10+2)
- _, err = io.ReadFull(r, hdr)
- if err != nil {
- return
- }
- // leave for debugging
- if false {
- fmt.Printf("header: %s", hdr)
- }
- s := strings.TrimSpace(string(hdr[16+12+6+6+8:][:10]))
- size, err = strconv.Atoi(s)
- if err != nil || hdr[len(hdr)-2] != '`' || hdr[len(hdr)-1] != '\n' {
- err = fmt.Errorf("invalid archive header")
- return
- }
- name = strings.TrimSpace(string(hdr[:16]))
- return
-}
-
-// FindExportData positions the reader r at the beginning of the
-// export data section of an underlying GC-created object/archive
-// file by reading from it. The reader must be positioned at the
-// start of the file before calling this function. The hdr result
-// is the string before the export data, either "$$" or "$$B".
-//
-func FindExportData(r *bufio.Reader) (hdr string, err error) {
- // Read first line to make sure this is an object file.
- line, err := r.ReadSlice('\n')
- if err != nil {
- err = fmt.Errorf("can't find export data (%v)", err)
- return
- }
-
- if string(line) == "!\n" {
- // Archive file. Scan to __.PKGDEF.
- var name string
- if name, _, err = readGopackHeader(r); err != nil {
- return
- }
-
- // First entry should be __.PKGDEF.
- if name != "__.PKGDEF" {
- err = fmt.Errorf("go archive is missing __.PKGDEF")
- return
- }
-
- // Read first line of __.PKGDEF data, so that line
- // is once again the first line of the input.
- if line, err = r.ReadSlice('\n'); err != nil {
- err = fmt.Errorf("can't find export data (%v)", err)
- return
- }
- }
-
- // Now at __.PKGDEF in archive or still at beginning of file.
- // Either way, line should begin with "go object ".
- if !strings.HasPrefix(string(line), "go object ") {
- err = fmt.Errorf("not a Go object file")
- return
- }
-
- // Skip over object header to export data.
- // Begins after first line starting with $$.
- for line[0] != '$' {
- if line, err = r.ReadSlice('\n'); err != nil {
- err = fmt.Errorf("can't find export data (%v)", err)
- return
- }
- }
- hdr = string(line)
-
- return
-}
diff --git a/vendor/golang.org/x/tools/go/gcimporter15/gcimporter.go b/vendor/golang.org/x/tools/go/gcimporter15/gcimporter.go
deleted file mode 100644
index 6fbc9d7..0000000
--- a/vendor/golang.org/x/tools/go/gcimporter15/gcimporter.go
+++ /dev/null
@@ -1,1041 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// This file is a copy of $GOROOT/src/go/internal/gcimporter/gcimporter.go,
-// but it also contains the original source-based importer code for Go1.6.
-// Once we stop supporting 1.6, we can remove that code.
-
-// Package gcimporter15 provides various functions for reading
-// gc-generated object files that can be used to implement the
-// Importer interface defined by the Go 1.5 standard library package.
-//
-// Deprecated: this package will be deleted in October 2017.
-// New code should use golang.org/x/tools/go/gcexportdata.
-//
-package gcimporter // import "golang.org/x/tools/go/gcimporter15"
-
-import (
- "bufio"
- "errors"
- "fmt"
- "go/build"
- exact "go/constant"
- "go/token"
- "go/types"
- "io"
- "io/ioutil"
- "os"
- "path/filepath"
- "sort"
- "strconv"
- "strings"
- "text/scanner"
-)
-
-// debugging/development support
-const debug = false
-
-var pkgExts = [...]string{".a", ".o"}
-
-// FindPkg returns the filename and unique package id for an import
-// path based on package information provided by build.Import (using
-// the build.Default build.Context). A relative srcDir is interpreted
-// relative to the current working directory.
-// If no file was found, an empty filename is returned.
-//
-func FindPkg(path, srcDir string) (filename, id string) {
- if path == "" {
- return
- }
-
- var noext string
- switch {
- default:
- // "x" -> "$GOPATH/pkg/$GOOS_$GOARCH/x.ext", "x"
- // Don't require the source files to be present.
- if abs, err := filepath.Abs(srcDir); err == nil { // see issue 14282
- srcDir = abs
- }
- bp, _ := build.Import(path, srcDir, build.FindOnly|build.AllowBinary)
- if bp.PkgObj == "" {
- return
- }
- noext = strings.TrimSuffix(bp.PkgObj, ".a")
- id = bp.ImportPath
-
- case build.IsLocalImport(path):
- // "./x" -> "/this/directory/x.ext", "/this/directory/x"
- noext = filepath.Join(srcDir, path)
- id = noext
-
- case filepath.IsAbs(path):
- // for completeness only - go/build.Import
- // does not support absolute imports
- // "/x" -> "/x.ext", "/x"
- noext = path
- id = path
- }
-
- if false { // for debugging
- if path != id {
- fmt.Printf("%s -> %s\n", path, id)
- }
- }
-
- // try extensions
- for _, ext := range pkgExts {
- filename = noext + ext
- if f, err := os.Stat(filename); err == nil && !f.IsDir() {
- return
- }
- }
-
- filename = "" // not found
- return
-}
-
-// ImportData imports a package by reading the gc-generated export data,
-// adds the corresponding package object to the packages map indexed by id,
-// and returns the object.
-//
-// The packages map must contains all packages already imported. The data
-// reader position must be the beginning of the export data section. The
-// filename is only used in error messages.
-//
-// If packages[id] contains the completely imported package, that package
-// can be used directly, and there is no need to call this function (but
-// there is also no harm but for extra time used).
-//
-func ImportData(packages map[string]*types.Package, filename, id string, data io.Reader) (pkg *types.Package, err error) {
- // support for parser error handling
- defer func() {
- switch r := recover().(type) {
- case nil:
- // nothing to do
- case importError:
- err = r
- default:
- panic(r) // internal error
- }
- }()
-
- var p parser
- p.init(filename, id, data, packages)
- pkg = p.parseExport()
-
- return
-}
-
-// Import imports a gc-generated package given its import path and srcDir, adds
-// the corresponding package object to the packages map, and returns the object.
-// The packages map must contain all packages already imported.
-//
-func Import(packages map[string]*types.Package, path, srcDir string) (pkg *types.Package, err error) {
- filename, id := FindPkg(path, srcDir)
- if filename == "" {
- if path == "unsafe" {
- return types.Unsafe, nil
- }
- err = fmt.Errorf("can't find import: %s", id)
- return
- }
-
- // no need to re-import if the package was imported completely before
- if pkg = packages[id]; pkg != nil && pkg.Complete() {
- return
- }
-
- // open file
- f, err := os.Open(filename)
- if err != nil {
- return
- }
- defer func() {
- f.Close()
- if err != nil {
- // add file name to error
- err = fmt.Errorf("reading export data: %s: %v", filename, err)
- }
- }()
-
- var hdr string
- buf := bufio.NewReader(f)
- if hdr, err = FindExportData(buf); err != nil {
- return
- }
-
- switch hdr {
- case "$$\n":
- return ImportData(packages, filename, id, buf)
- case "$$B\n":
- var data []byte
- data, err = ioutil.ReadAll(buf)
- if err == nil {
- fset := token.NewFileSet()
- _, pkg, err = BImportData(fset, packages, data, id)
- return
- }
- default:
- err = fmt.Errorf("unknown export data header: %q", hdr)
- }
-
- return
-}
-
-// ----------------------------------------------------------------------------
-// Parser
-
-// TODO(gri) Imported objects don't have position information.
-// Ideally use the debug table line info; alternatively
-// create some fake position (or the position of the
-// import). That way error messages referring to imported
-// objects can print meaningful information.
-
-// parser parses the exports inside a gc compiler-produced
-// object/archive file and populates its scope with the results.
-type parser struct {
- scanner scanner.Scanner
- tok rune // current token
- lit string // literal string; only valid for Ident, Int, String tokens
- id string // package id of imported package
- sharedPkgs map[string]*types.Package // package id -> package object (across importer)
- localPkgs map[string]*types.Package // package id -> package object (just this package)
-}
-
-func (p *parser) init(filename, id string, src io.Reader, packages map[string]*types.Package) {
- p.scanner.Init(src)
- p.scanner.Error = func(_ *scanner.Scanner, msg string) { p.error(msg) }
- p.scanner.Mode = scanner.ScanIdents | scanner.ScanInts | scanner.ScanChars | scanner.ScanStrings | scanner.ScanComments | scanner.SkipComments
- p.scanner.Whitespace = 1<<'\t' | 1<<' '
- p.scanner.Filename = filename // for good error messages
- p.next()
- p.id = id
- p.sharedPkgs = packages
- if debug {
- // check consistency of packages map
- for _, pkg := range packages {
- if pkg.Name() == "" {
- fmt.Printf("no package name for %s\n", pkg.Path())
- }
- }
- }
-}
-
-func (p *parser) next() {
- p.tok = p.scanner.Scan()
- switch p.tok {
- case scanner.Ident, scanner.Int, scanner.Char, scanner.String, '·':
- p.lit = p.scanner.TokenText()
- default:
- p.lit = ""
- }
- if debug {
- fmt.Printf("%s: %q -> %q\n", scanner.TokenString(p.tok), p.scanner.TokenText(), p.lit)
- }
-}
-
-func declTypeName(pkg *types.Package, name string) *types.TypeName {
- scope := pkg.Scope()
- if obj := scope.Lookup(name); obj != nil {
- return obj.(*types.TypeName)
- }
- obj := types.NewTypeName(token.NoPos, pkg, name, nil)
- // a named type may be referred to before the underlying type
- // is known - set it up
- types.NewNamed(obj, nil, nil)
- scope.Insert(obj)
- return obj
-}
-
-// ----------------------------------------------------------------------------
-// Error handling
-
-// Internal errors are boxed as importErrors.
-type importError struct {
- pos scanner.Position
- err error
-}
-
-func (e importError) Error() string {
- return fmt.Sprintf("import error %s (byte offset = %d): %s", e.pos, e.pos.Offset, e.err)
-}
-
-func (p *parser) error(err interface{}) {
- if s, ok := err.(string); ok {
- err = errors.New(s)
- }
- // panic with a runtime.Error if err is not an error
- panic(importError{p.scanner.Pos(), err.(error)})
-}
-
-func (p *parser) errorf(format string, args ...interface{}) {
- p.error(fmt.Sprintf(format, args...))
-}
-
-func (p *parser) expect(tok rune) string {
- lit := p.lit
- if p.tok != tok {
- p.errorf("expected %s, got %s (%s)", scanner.TokenString(tok), scanner.TokenString(p.tok), lit)
- }
- p.next()
- return lit
-}
-
-func (p *parser) expectSpecial(tok string) {
- sep := 'x' // not white space
- i := 0
- for i < len(tok) && p.tok == rune(tok[i]) && sep > ' ' {
- sep = p.scanner.Peek() // if sep <= ' ', there is white space before the next token
- p.next()
- i++
- }
- if i < len(tok) {
- p.errorf("expected %q, got %q", tok, tok[0:i])
- }
-}
-
-func (p *parser) expectKeyword(keyword string) {
- lit := p.expect(scanner.Ident)
- if lit != keyword {
- p.errorf("expected keyword %s, got %q", keyword, lit)
- }
-}
-
-// ----------------------------------------------------------------------------
-// Qualified and unqualified names
-
-// PackageId = string_lit .
-//
-func (p *parser) parsePackageId() string {
- id, err := strconv.Unquote(p.expect(scanner.String))
- if err != nil {
- p.error(err)
- }
- // id == "" stands for the imported package id
- // (only known at time of package installation)
- if id == "" {
- id = p.id
- }
- return id
-}
-
-// PackageName = ident .
-//
-func (p *parser) parsePackageName() string {
- return p.expect(scanner.Ident)
-}
-
-// dotIdentifier = ( ident | '·' ) { ident | int | '·' } .
-func (p *parser) parseDotIdent() string {
- ident := ""
- if p.tok != scanner.Int {
- sep := 'x' // not white space
- for (p.tok == scanner.Ident || p.tok == scanner.Int || p.tok == '·') && sep > ' ' {
- ident += p.lit
- sep = p.scanner.Peek() // if sep <= ' ', there is white space before the next token
- p.next()
- }
- }
- if ident == "" {
- p.expect(scanner.Ident) // use expect() for error handling
- }
- return ident
-}
-
-// QualifiedName = "@" PackageId "." ( "?" | dotIdentifier ) .
-//
-func (p *parser) parseQualifiedName() (id, name string) {
- p.expect('@')
- id = p.parsePackageId()
- p.expect('.')
- // Per rev f280b8a485fd (10/2/2013), qualified names may be used for anonymous fields.
- if p.tok == '?' {
- p.next()
- } else {
- name = p.parseDotIdent()
- }
- return
-}
-
-// getPkg returns the package for a given id. If the package is
-// not found, create the package and add it to the p.localPkgs
-// and p.sharedPkgs maps. name is the (expected) name of the
-// package. If name == "", the package name is expected to be
-// set later via an import clause in the export data.
-//
-// id identifies a package, usually by a canonical package path like
-// "encoding/json" but possibly by a non-canonical import path like
-// "./json".
-//
-func (p *parser) getPkg(id, name string) *types.Package {
- // package unsafe is not in the packages maps - handle explicitly
- if id == "unsafe" {
- return types.Unsafe
- }
-
- pkg := p.localPkgs[id]
- if pkg == nil {
- // first import of id from this package
- pkg = p.sharedPkgs[id]
- if pkg == nil {
- // first import of id by this importer;
- // add (possibly unnamed) pkg to shared packages
- pkg = types.NewPackage(id, name)
- p.sharedPkgs[id] = pkg
- }
- // add (possibly unnamed) pkg to local packages
- if p.localPkgs == nil {
- p.localPkgs = make(map[string]*types.Package)
- }
- p.localPkgs[id] = pkg
- } else if name != "" {
- // package exists already and we have an expected package name;
- // make sure names match or set package name if necessary
- if pname := pkg.Name(); pname == "" {
- pkg.SetName(name)
- } else if pname != name {
- p.errorf("%s package name mismatch: %s (given) vs %s (expected)", id, pname, name)
- }
- }
- return pkg
-}
-
-// parseExportedName is like parseQualifiedName, but
-// the package id is resolved to an imported *types.Package.
-//
-func (p *parser) parseExportedName() (pkg *types.Package, name string) {
- id, name := p.parseQualifiedName()
- pkg = p.getPkg(id, "")
- return
-}
-
-// ----------------------------------------------------------------------------
-// Types
-
-// BasicType = identifier .
-//
-func (p *parser) parseBasicType() types.Type {
- id := p.expect(scanner.Ident)
- obj := types.Universe.Lookup(id)
- if obj, ok := obj.(*types.TypeName); ok {
- return obj.Type()
- }
- p.errorf("not a basic type: %s", id)
- return nil
-}
-
-// ArrayType = "[" int_lit "]" Type .
-//
-func (p *parser) parseArrayType(parent *types.Package) types.Type {
- // "[" already consumed and lookahead known not to be "]"
- lit := p.expect(scanner.Int)
- p.expect(']')
- elem := p.parseType(parent)
- n, err := strconv.ParseInt(lit, 10, 64)
- if err != nil {
- p.error(err)
- }
- return types.NewArray(elem, n)
-}
-
-// MapType = "map" "[" Type "]" Type .
-//
-func (p *parser) parseMapType(parent *types.Package) types.Type {
- p.expectKeyword("map")
- p.expect('[')
- key := p.parseType(parent)
- p.expect(']')
- elem := p.parseType(parent)
- return types.NewMap(key, elem)
-}
-
-// Name = identifier | "?" | QualifiedName .
-//
-// For unqualified and anonymous names, the returned package is the parent
-// package unless parent == nil, in which case the returned package is the
-// package being imported. (The parent package is not nil if the the name
-// is an unqualified struct field or interface method name belonging to a
-// type declared in another package.)
-//
-// For qualified names, the returned package is nil (and not created if
-// it doesn't exist yet) unless materializePkg is set (which creates an
-// unnamed package with valid package path). In the latter case, a
-// subsequent import clause is expected to provide a name for the package.
-//
-func (p *parser) parseName(parent *types.Package, materializePkg bool) (pkg *types.Package, name string) {
- pkg = parent
- if pkg == nil {
- pkg = p.sharedPkgs[p.id]
- }
- switch p.tok {
- case scanner.Ident:
- name = p.lit
- p.next()
- case '?':
- // anonymous
- p.next()
- case '@':
- // exported name prefixed with package path
- pkg = nil
- var id string
- id, name = p.parseQualifiedName()
- if materializePkg {
- pkg = p.getPkg(id, "")
- }
- default:
- p.error("name expected")
- }
- return
-}
-
-func deref(typ types.Type) types.Type {
- if p, _ := typ.(*types.Pointer); p != nil {
- return p.Elem()
- }
- return typ
-}
-
-// Field = Name Type [ string_lit ] .
-//
-func (p *parser) parseField(parent *types.Package) (*types.Var, string) {
- pkg, name := p.parseName(parent, true)
-
- if name == "_" {
- // Blank fields should be package-qualified because they
- // are unexported identifiers, but gc does not qualify them.
- // Assuming that the ident belongs to the current package
- // causes types to change during re-exporting, leading
- // to spurious "can't assign A to B" errors from go/types.
- // As a workaround, pretend all blank fields belong
- // to the same unique dummy package.
- const blankpkg = "<_>"
- pkg = p.getPkg(blankpkg, blankpkg)
- }
-
- typ := p.parseType(parent)
- anonymous := false
- if name == "" {
- // anonymous field - typ must be T or *T and T must be a type name
- switch typ := deref(typ).(type) {
- case *types.Basic: // basic types are named types
- pkg = nil // objects defined in Universe scope have no package
- name = typ.Name()
- case *types.Named:
- name = typ.Obj().Name()
- default:
- p.errorf("anonymous field expected")
- }
- anonymous = true
- }
- tag := ""
- if p.tok == scanner.String {
- s := p.expect(scanner.String)
- var err error
- tag, err = strconv.Unquote(s)
- if err != nil {
- p.errorf("invalid struct tag %s: %s", s, err)
- }
- }
- return types.NewField(token.NoPos, pkg, name, typ, anonymous), tag
-}
-
-// StructType = "struct" "{" [ FieldList ] "}" .
-// FieldList = Field { ";" Field } .
-//
-func (p *parser) parseStructType(parent *types.Package) types.Type {
- var fields []*types.Var
- var tags []string
-
- p.expectKeyword("struct")
- p.expect('{')
- for i := 0; p.tok != '}' && p.tok != scanner.EOF; i++ {
- if i > 0 {
- p.expect(';')
- }
- fld, tag := p.parseField(parent)
- if tag != "" && tags == nil {
- tags = make([]string, i)
- }
- if tags != nil {
- tags = append(tags, tag)
- }
- fields = append(fields, fld)
- }
- p.expect('}')
-
- return types.NewStruct(fields, tags)
-}
-
-// Parameter = ( identifier | "?" ) [ "..." ] Type [ string_lit ] .
-//
-func (p *parser) parseParameter() (par *types.Var, isVariadic bool) {
- _, name := p.parseName(nil, false)
- // remove gc-specific parameter numbering
- if i := strings.Index(name, "·"); i >= 0 {
- name = name[:i]
- }
- if p.tok == '.' {
- p.expectSpecial("...")
- isVariadic = true
- }
- typ := p.parseType(nil)
- if isVariadic {
- typ = types.NewSlice(typ)
- }
- // ignore argument tag (e.g. "noescape")
- if p.tok == scanner.String {
- p.next()
- }
- // TODO(gri) should we provide a package?
- par = types.NewVar(token.NoPos, nil, name, typ)
- return
-}
-
-// Parameters = "(" [ ParameterList ] ")" .
-// ParameterList = { Parameter "," } Parameter .
-//
-func (p *parser) parseParameters() (list []*types.Var, isVariadic bool) {
- p.expect('(')
- for p.tok != ')' && p.tok != scanner.EOF {
- if len(list) > 0 {
- p.expect(',')
- }
- par, variadic := p.parseParameter()
- list = append(list, par)
- if variadic {
- if isVariadic {
- p.error("... not on final argument")
- }
- isVariadic = true
- }
- }
- p.expect(')')
-
- return
-}
-
-// Signature = Parameters [ Result ] .
-// Result = Type | Parameters .
-//
-func (p *parser) parseSignature(recv *types.Var) *types.Signature {
- params, isVariadic := p.parseParameters()
-
- // optional result type
- var results []*types.Var
- if p.tok == '(' {
- var variadic bool
- results, variadic = p.parseParameters()
- if variadic {
- p.error("... not permitted on result type")
- }
- }
-
- return types.NewSignature(recv, types.NewTuple(params...), types.NewTuple(results...), isVariadic)
-}
-
-// InterfaceType = "interface" "{" [ MethodList ] "}" .
-// MethodList = Method { ";" Method } .
-// Method = Name Signature .
-//
-// The methods of embedded interfaces are always "inlined"
-// by the compiler and thus embedded interfaces are never
-// visible in the export data.
-//
-func (p *parser) parseInterfaceType(parent *types.Package) types.Type {
- var methods []*types.Func
-
- p.expectKeyword("interface")
- p.expect('{')
- for i := 0; p.tok != '}' && p.tok != scanner.EOF; i++ {
- if i > 0 {
- p.expect(';')
- }
- pkg, name := p.parseName(parent, true)
- sig := p.parseSignature(nil)
- methods = append(methods, types.NewFunc(token.NoPos, pkg, name, sig))
- }
- p.expect('}')
-
- // Complete requires the type's embedded interfaces to be fully defined,
- // but we do not define any
- return types.NewInterface(methods, nil).Complete()
-}
-
-// ChanType = ( "chan" [ "<-" ] | "<-" "chan" ) Type .
-//
-func (p *parser) parseChanType(parent *types.Package) types.Type {
- dir := types.SendRecv
- if p.tok == scanner.Ident {
- p.expectKeyword("chan")
- if p.tok == '<' {
- p.expectSpecial("<-")
- dir = types.SendOnly
- }
- } else {
- p.expectSpecial("<-")
- p.expectKeyword("chan")
- dir = types.RecvOnly
- }
- elem := p.parseType(parent)
- return types.NewChan(dir, elem)
-}
-
-// Type =
-// BasicType | TypeName | ArrayType | SliceType | StructType |
-// PointerType | FuncType | InterfaceType | MapType | ChanType |
-// "(" Type ")" .
-//
-// BasicType = ident .
-// TypeName = ExportedName .
-// SliceType = "[" "]" Type .
-// PointerType = "*" Type .
-// FuncType = "func" Signature .
-//
-func (p *parser) parseType(parent *types.Package) types.Type {
- switch p.tok {
- case scanner.Ident:
- switch p.lit {
- default:
- return p.parseBasicType()
- case "struct":
- return p.parseStructType(parent)
- case "func":
- // FuncType
- p.next()
- return p.parseSignature(nil)
- case "interface":
- return p.parseInterfaceType(parent)
- case "map":
- return p.parseMapType(parent)
- case "chan":
- return p.parseChanType(parent)
- }
- case '@':
- // TypeName
- pkg, name := p.parseExportedName()
- return declTypeName(pkg, name).Type()
- case '[':
- p.next() // look ahead
- if p.tok == ']' {
- // SliceType
- p.next()
- return types.NewSlice(p.parseType(parent))
- }
- return p.parseArrayType(parent)
- case '*':
- // PointerType
- p.next()
- return types.NewPointer(p.parseType(parent))
- case '<':
- return p.parseChanType(parent)
- case '(':
- // "(" Type ")"
- p.next()
- typ := p.parseType(parent)
- p.expect(')')
- return typ
- }
- p.errorf("expected type, got %s (%q)", scanner.TokenString(p.tok), p.lit)
- return nil
-}
-
-// ----------------------------------------------------------------------------
-// Declarations
-
-// ImportDecl = "import" PackageName PackageId .
-//
-func (p *parser) parseImportDecl() {
- p.expectKeyword("import")
- name := p.parsePackageName()
- p.getPkg(p.parsePackageId(), name)
-}
-
-// int_lit = [ "+" | "-" ] { "0" ... "9" } .
-//
-func (p *parser) parseInt() string {
- s := ""
- switch p.tok {
- case '-':
- s = "-"
- p.next()
- case '+':
- p.next()
- }
- return s + p.expect(scanner.Int)
-}
-
-// number = int_lit [ "p" int_lit ] .
-//
-func (p *parser) parseNumber() (typ *types.Basic, val exact.Value) {
- // mantissa
- mant := exact.MakeFromLiteral(p.parseInt(), token.INT, 0)
- if mant == nil {
- panic("invalid mantissa")
- }
-
- if p.lit == "p" {
- // exponent (base 2)
- p.next()
- exp, err := strconv.ParseInt(p.parseInt(), 10, 0)
- if err != nil {
- p.error(err)
- }
- if exp < 0 {
- denom := exact.MakeInt64(1)
- denom = exact.Shift(denom, token.SHL, uint(-exp))
- typ = types.Typ[types.UntypedFloat]
- val = exact.BinaryOp(mant, token.QUO, denom)
- return
- }
- if exp > 0 {
- mant = exact.Shift(mant, token.SHL, uint(exp))
- }
- typ = types.Typ[types.UntypedFloat]
- val = mant
- return
- }
-
- typ = types.Typ[types.UntypedInt]
- val = mant
- return
-}
-
-// ConstDecl = "const" ExportedName [ Type ] "=" Literal .
-// Literal = bool_lit | int_lit | float_lit | complex_lit | rune_lit | string_lit .
-// bool_lit = "true" | "false" .
-// complex_lit = "(" float_lit "+" float_lit "i" ")" .
-// rune_lit = "(" int_lit "+" int_lit ")" .
-// string_lit = `"` { unicode_char } `"` .
-//
-func (p *parser) parseConstDecl() {
- p.expectKeyword("const")
- pkg, name := p.parseExportedName()
-
- var typ0 types.Type
- if p.tok != '=' {
- // constant types are never structured - no need for parent type
- typ0 = p.parseType(nil)
- }
-
- p.expect('=')
- var typ types.Type
- var val exact.Value
- switch p.tok {
- case scanner.Ident:
- // bool_lit
- if p.lit != "true" && p.lit != "false" {
- p.error("expected true or false")
- }
- typ = types.Typ[types.UntypedBool]
- val = exact.MakeBool(p.lit == "true")
- p.next()
-
- case '-', scanner.Int:
- // int_lit
- typ, val = p.parseNumber()
-
- case '(':
- // complex_lit or rune_lit
- p.next()
- if p.tok == scanner.Char {
- p.next()
- p.expect('+')
- typ = types.Typ[types.UntypedRune]
- _, val = p.parseNumber()
- p.expect(')')
- break
- }
- _, re := p.parseNumber()
- p.expect('+')
- _, im := p.parseNumber()
- p.expectKeyword("i")
- p.expect(')')
- typ = types.Typ[types.UntypedComplex]
- val = exact.BinaryOp(re, token.ADD, exact.MakeImag(im))
-
- case scanner.Char:
- // rune_lit
- typ = types.Typ[types.UntypedRune]
- val = exact.MakeFromLiteral(p.lit, token.CHAR, 0)
- p.next()
-
- case scanner.String:
- // string_lit
- typ = types.Typ[types.UntypedString]
- val = exact.MakeFromLiteral(p.lit, token.STRING, 0)
- p.next()
-
- default:
- p.errorf("expected literal got %s", scanner.TokenString(p.tok))
- }
-
- if typ0 == nil {
- typ0 = typ
- }
-
- pkg.Scope().Insert(types.NewConst(token.NoPos, pkg, name, typ0, val))
-}
-
-// TypeDecl = "type" ExportedName Type .
-//
-func (p *parser) parseTypeDecl() {
- p.expectKeyword("type")
- pkg, name := p.parseExportedName()
- obj := declTypeName(pkg, name)
-
- // The type object may have been imported before and thus already
- // have a type associated with it. We still need to parse the type
- // structure, but throw it away if the object already has a type.
- // This ensures that all imports refer to the same type object for
- // a given type declaration.
- typ := p.parseType(pkg)
-
- if name := obj.Type().(*types.Named); name.Underlying() == nil {
- name.SetUnderlying(typ)
- }
-}
-
-// VarDecl = "var" ExportedName Type .
-//
-func (p *parser) parseVarDecl() {
- p.expectKeyword("var")
- pkg, name := p.parseExportedName()
- typ := p.parseType(pkg)
- pkg.Scope().Insert(types.NewVar(token.NoPos, pkg, name, typ))
-}
-
-// Func = Signature [ Body ] .
-// Body = "{" ... "}" .
-//
-func (p *parser) parseFunc(recv *types.Var) *types.Signature {
- sig := p.parseSignature(recv)
- if p.tok == '{' {
- p.next()
- for i := 1; i > 0; p.next() {
- switch p.tok {
- case '{':
- i++
- case '}':
- i--
- }
- }
- }
- return sig
-}
-
-// MethodDecl = "func" Receiver Name Func .
-// Receiver = "(" ( identifier | "?" ) [ "*" ] ExportedName ")" .
-//
-func (p *parser) parseMethodDecl() {
- // "func" already consumed
- p.expect('(')
- recv, _ := p.parseParameter() // receiver
- p.expect(')')
-
- // determine receiver base type object
- base := deref(recv.Type()).(*types.Named)
-
- // parse method name, signature, and possibly inlined body
- _, name := p.parseName(nil, false)
- sig := p.parseFunc(recv)
-
- // methods always belong to the same package as the base type object
- pkg := base.Obj().Pkg()
-
- // add method to type unless type was imported before
- // and method exists already
- // TODO(gri) This leads to a quadratic algorithm - ok for now because method counts are small.
- base.AddMethod(types.NewFunc(token.NoPos, pkg, name, sig))
-}
-
-// FuncDecl = "func" ExportedName Func .
-//
-func (p *parser) parseFuncDecl() {
- // "func" already consumed
- pkg, name := p.parseExportedName()
- typ := p.parseFunc(nil)
- pkg.Scope().Insert(types.NewFunc(token.NoPos, pkg, name, typ))
-}
-
-// Decl = [ ImportDecl | ConstDecl | TypeDecl | VarDecl | FuncDecl | MethodDecl ] "\n" .
-//
-func (p *parser) parseDecl() {
- if p.tok == scanner.Ident {
- switch p.lit {
- case "import":
- p.parseImportDecl()
- case "const":
- p.parseConstDecl()
- case "type":
- p.parseTypeDecl()
- case "var":
- p.parseVarDecl()
- case "func":
- p.next() // look ahead
- if p.tok == '(' {
- p.parseMethodDecl()
- } else {
- p.parseFuncDecl()
- }
- }
- }
- p.expect('\n')
-}
-
-// ----------------------------------------------------------------------------
-// Export
-
-// Export = "PackageClause { Decl } "$$" .
-// PackageClause = "package" PackageName [ "safe" ] "\n" .
-//
-func (p *parser) parseExport() *types.Package {
- p.expectKeyword("package")
- name := p.parsePackageName()
- if p.tok == scanner.Ident && p.lit == "safe" {
- // package was compiled with -u option - ignore
- p.next()
- }
- p.expect('\n')
-
- pkg := p.getPkg(p.id, name)
-
- for p.tok != '$' && p.tok != scanner.EOF {
- p.parseDecl()
- }
-
- if ch := p.scanner.Peek(); p.tok != '$' || ch != '$' {
- // don't call next()/expect() since reading past the
- // export data may cause scanner errors (e.g. NUL chars)
- p.errorf("expected '$$', got %s %c", scanner.TokenString(p.tok), ch)
- }
-
- if n := p.scanner.ErrorCount; n != 0 {
- p.errorf("expected no scanner errors, got %d", n)
- }
-
- // Record all locally referenced packages as imports.
- var imports []*types.Package
- for id, pkg2 := range p.localPkgs {
- if pkg2.Name() == "" {
- p.errorf("%s package has no name", id)
- }
- if id == p.id {
- continue // avoid self-edge
- }
- imports = append(imports, pkg2)
- }
- sort.Sort(byPath(imports))
- pkg.SetImports(imports)
-
- // package was imported completely and without errors
- pkg.MarkComplete()
-
- return pkg
-}
-
-type byPath []*types.Package
-
-func (a byPath) Len() int { return len(a) }
-func (a byPath) Swap(i, j int) { a[i], a[j] = a[j], a[i] }
-func (a byPath) Less(i, j int) bool { return a[i].Path() < a[j].Path() }
diff --git a/vendor/golang.org/x/tools/go/gcimporter15/gcimporter_test.go b/vendor/golang.org/x/tools/go/gcimporter15/gcimporter_test.go
deleted file mode 100644
index 56cdfc0..0000000
--- a/vendor/golang.org/x/tools/go/gcimporter15/gcimporter_test.go
+++ /dev/null
@@ -1,521 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// This file is a copy of $GOROOT/src/go/internal/gcimporter/gcimporter_test.go,
-// adjusted to make it build with code from (std lib) internal/testenv copied.
-
-package gcimporter
-
-import (
- "bytes"
- "fmt"
- "go/types"
- "io/ioutil"
- "os"
- "os/exec"
- "path/filepath"
- "runtime"
- "strings"
- "testing"
- "time"
-)
-
-// ----------------------------------------------------------------------------
-// The following three functions (Builder, HasGoBuild, MustHaveGoBuild) were
-// copied from $GOROOT/src/internal/testenv since that package is not available
-// in x/tools.
-
-// Builder reports the name of the builder running this test
-// (for example, "linux-amd64" or "windows-386-gce").
-// If the test is not running on the build infrastructure,
-// Builder returns the empty string.
-func Builder() string {
- return os.Getenv("GO_BUILDER_NAME")
-}
-
-// HasGoBuild reports whether the current system can build programs with ``go build''
-// and then run them with os.StartProcess or exec.Command.
-func HasGoBuild() bool {
- switch runtime.GOOS {
- case "android", "nacl":
- return false
- case "darwin":
- if strings.HasPrefix(runtime.GOARCH, "arm") {
- return false
- }
- }
- return true
-}
-
-// MustHaveGoBuild checks that the current system can build programs with ``go build''
-// and then run them with os.StartProcess or exec.Command.
-// If not, MustHaveGoBuild calls t.Skip with an explanation.
-func MustHaveGoBuild(t *testing.T) {
- if !HasGoBuild() {
- t.Skipf("skipping test: 'go build' not available on %s/%s", runtime.GOOS, runtime.GOARCH)
- }
-}
-
-// ----------------------------------------------------------------------------
-
-// skipSpecialPlatforms causes the test to be skipped for platforms where
-// builders (build.golang.org) don't have access to compiled packages for
-// import.
-func skipSpecialPlatforms(t *testing.T) {
- switch platform := runtime.GOOS + "-" + runtime.GOARCH; platform {
- case "nacl-amd64p32",
- "nacl-386",
- "nacl-arm",
- "darwin-arm",
- "darwin-arm64":
- t.Skipf("no compiled packages available for import on %s", platform)
- }
-}
-
-func compile(t *testing.T, dirname, filename string) string {
- /* testenv. */ MustHaveGoBuild(t)
- cmd := exec.Command("go", "tool", "compile", filename)
- cmd.Dir = dirname
- out, err := cmd.CombinedOutput()
- if err != nil {
- t.Logf("%s", out)
- t.Fatalf("go tool compile %s failed: %s", filename, err)
- }
- // filename should end with ".go"
- return filepath.Join(dirname, filename[:len(filename)-2]+"o")
-}
-
-func testPath(t *testing.T, path, srcDir string) *types.Package {
- t0 := time.Now()
- pkg, err := Import(make(map[string]*types.Package), path, srcDir)
- if err != nil {
- t.Errorf("testPath(%s): %s", path, err)
- return nil
- }
- t.Logf("testPath(%s): %v", path, time.Since(t0))
- return pkg
-}
-
-const maxTime = 30 * time.Second
-
-func testDir(t *testing.T, dir string, endTime time.Time) (nimports int) {
- dirname := filepath.Join(runtime.GOROOT(), "pkg", runtime.GOOS+"_"+runtime.GOARCH, dir)
- list, err := ioutil.ReadDir(dirname)
- if err != nil {
- t.Fatalf("testDir(%s): %s", dirname, err)
- }
- for _, f := range list {
- if time.Now().After(endTime) {
- t.Log("testing time used up")
- return
- }
- switch {
- case !f.IsDir():
- // try extensions
- for _, ext := range pkgExts {
- if strings.HasSuffix(f.Name(), ext) {
- name := f.Name()[0 : len(f.Name())-len(ext)] // remove extension
- if testPath(t, filepath.Join(dir, name), dir) != nil {
- nimports++
- }
- }
- }
- case f.IsDir():
- nimports += testDir(t, filepath.Join(dir, f.Name()), endTime)
- }
- }
- return
-}
-
-const testfile = "exports.go"
-
-func TestImportTestdata(t *testing.T) {
- // This package only handles gc export data.
- if runtime.Compiler != "gc" {
- t.Skipf("gc-built packages not available (compiler = %s)", runtime.Compiler)
- }
-
- if outFn := compile(t, "testdata", testfile); outFn != "" {
- defer os.Remove(outFn)
- }
-
- // filename should end with ".go"
- filename := testfile[:len(testfile)-3]
- if pkg := testPath(t, "./testdata/"+filename, "."); pkg != nil {
- // The package's Imports list must include all packages
- // explicitly imported by testfile, plus all packages
- // referenced indirectly via exported objects in testfile.
- // With the textual export format (when run against Go1.6),
- // the list may also include additional packages that are
- // not strictly required for import processing alone (they
- // are exported to err "on the safe side").
- // For now, we just test the presence of a few packages
- // that we know are there for sure.
- got := fmt.Sprint(pkg.Imports())
- for _, want := range []string{"go/ast", "go/token"} {
- if !strings.Contains(got, want) {
- t.Errorf(`Package("exports").Imports() = %s, does not contain %s`, got, want)
- }
- }
- }
-}
-
-func TestVersionHandling(t *testing.T) {
- skipSpecialPlatforms(t) // we really only need to exclude nacl platforms, but this is fine
-
- // This package only handles gc export data.
- if runtime.Compiler != "gc" {
- t.Skipf("gc-built packages not available (compiler = %s)", runtime.Compiler)
- }
-
- const dir = "./testdata/versions"
- list, err := ioutil.ReadDir(dir)
- if err != nil {
- t.Fatal(err)
- }
-
- for _, f := range list {
- name := f.Name()
- if !strings.HasSuffix(name, ".a") {
- continue // not a package file
- }
- if strings.Contains(name, "corrupted") {
- continue // don't process a leftover corrupted file
- }
- pkgpath := "./" + name[:len(name)-2]
-
- // test that export data can be imported
- _, err := Import(make(map[string]*types.Package), pkgpath, dir)
- if err != nil {
- t.Errorf("import %q failed: %v", pkgpath, err)
- continue
- }
-
- // create file with corrupted export data
- // 1) read file
- data, err := ioutil.ReadFile(filepath.Join(dir, name))
- if err != nil {
- t.Fatal(err)
- }
- // 2) find export data
- i := bytes.Index(data, []byte("\n$$B\n")) + 5
- j := bytes.Index(data[i:], []byte("\n$$\n")) + i
- if i < 0 || j < 0 || i > j {
- t.Fatalf("export data section not found (i = %d, j = %d)", i, j)
- }
- // 3) corrupt the data (increment every 7th byte)
- for k := j - 13; k >= i; k -= 7 {
- data[k]++
- }
- // 4) write the file
- pkgpath += "_corrupted"
- filename := filepath.Join(dir, pkgpath) + ".a"
- ioutil.WriteFile(filename, data, 0666)
- defer os.Remove(filename)
-
- // test that importing the corrupted file results in an error
- _, err = Import(make(map[string]*types.Package), pkgpath, dir)
- if err == nil {
- t.Errorf("import corrupted %q succeeded", pkgpath)
- } else if msg := err.Error(); !strings.Contains(msg, "version skew") {
- t.Errorf("import %q error incorrect (%s)", pkgpath, msg)
- }
- }
-}
-
-func TestImportStdLib(t *testing.T) {
- skipSpecialPlatforms(t)
-
- // This package only handles gc export data.
- if runtime.Compiler != "gc" {
- t.Skipf("gc-built packages not available (compiler = %s)", runtime.Compiler)
- }
-
- dt := maxTime
- if testing.Short() && /* testenv. */ Builder() == "" {
- dt = 10 * time.Millisecond
- }
- nimports := testDir(t, "", time.Now().Add(dt)) // installed packages
- t.Logf("tested %d imports", nimports)
-}
-
-var importedObjectTests = []struct {
- name string
- want string
-}{
- {"math.Pi", "const Pi untyped float"},
- {"io.Reader", "type Reader interface{Read(p []byte) (n int, err error)}"},
- // Go 1.7 and 1.8 don't know about embedded interfaces. Leave this
- // test out for now - the code is tested in the std library anyway.
- // TODO(gri) enable again once we're off 1.7 and 1.8.
- // {"io.ReadWriter", "type ReadWriter interface{Reader; Writer}"},
- {"math.Sin", "func Sin(x float64) float64"},
- // TODO(gri) add more tests
-}
-
-func TestImportedTypes(t *testing.T) {
- skipSpecialPlatforms(t)
-
- // This package only handles gc export data.
- if runtime.Compiler != "gc" {
- t.Skipf("gc-built packages not available (compiler = %s)", runtime.Compiler)
- }
-
- for _, test := range importedObjectTests {
- s := strings.Split(test.name, ".")
- if len(s) != 2 {
- t.Fatal("inconsistent test data")
- }
- importPath := s[0]
- objName := s[1]
-
- pkg, err := Import(make(map[string]*types.Package), importPath, ".")
- if err != nil {
- t.Error(err)
- continue
- }
-
- obj := pkg.Scope().Lookup(objName)
- if obj == nil {
- t.Errorf("%s: object not found", test.name)
- continue
- }
-
- got := types.ObjectString(obj, types.RelativeTo(pkg))
- if got != test.want {
- t.Errorf("%s: got %q; want %q", test.name, got, test.want)
- }
- }
-}
-
-func TestIssue5815(t *testing.T) {
- skipSpecialPlatforms(t)
-
- // This package only handles gc export data.
- if runtime.Compiler != "gc" {
- t.Skipf("gc-built packages not available (compiler = %s)", runtime.Compiler)
- }
-
- pkg := importPkg(t, "strings")
-
- scope := pkg.Scope()
- for _, name := range scope.Names() {
- obj := scope.Lookup(name)
- if obj.Pkg() == nil {
- t.Errorf("no pkg for %s", obj)
- }
- if tname, _ := obj.(*types.TypeName); tname != nil {
- named := tname.Type().(*types.Named)
- for i := 0; i < named.NumMethods(); i++ {
- m := named.Method(i)
- if m.Pkg() == nil {
- t.Errorf("no pkg for %s", m)
- }
- }
- }
- }
-}
-
-// Smoke test to ensure that imported methods get the correct package.
-func TestCorrectMethodPackage(t *testing.T) {
- skipSpecialPlatforms(t)
-
- // This package only handles gc export data.
- if runtime.Compiler != "gc" {
- t.Skipf("gc-built packages not available (compiler = %s)", runtime.Compiler)
- }
-
- imports := make(map[string]*types.Package)
- _, err := Import(imports, "net/http", ".")
- if err != nil {
- t.Fatal(err)
- }
-
- mutex := imports["sync"].Scope().Lookup("Mutex").(*types.TypeName).Type()
- mset := types.NewMethodSet(types.NewPointer(mutex)) // methods of *sync.Mutex
- sel := mset.Lookup(nil, "Lock")
- lock := sel.Obj().(*types.Func)
- if got, want := lock.Pkg().Path(), "sync"; got != want {
- t.Errorf("got package path %q; want %q", got, want)
- }
-}
-
-func TestIssue13566(t *testing.T) {
- skipSpecialPlatforms(t)
-
- // This package only handles gc export data.
- if runtime.Compiler != "gc" {
- t.Skipf("gc-built packages not available (compiler = %s)", runtime.Compiler)
- }
-
- // On windows, we have to set the -D option for the compiler to avoid having a drive
- // letter and an illegal ':' in the import path - just skip it (see also issue #3483).
- if runtime.GOOS == "windows" {
- t.Skip("avoid dealing with relative paths/drive letters on windows")
- }
-
- if f := compile(t, "testdata", "a.go"); f != "" {
- defer os.Remove(f)
- }
- if f := compile(t, "testdata", "b.go"); f != "" {
- defer os.Remove(f)
- }
-
- // import must succeed (test for issue at hand)
- pkg := importPkg(t, "./testdata/b")
-
- // make sure all indirectly imported packages have names
- for _, imp := range pkg.Imports() {
- if imp.Name() == "" {
- t.Errorf("no name for %s package", imp.Path())
- }
- }
-}
-
-func TestIssue13898(t *testing.T) {
- skipSpecialPlatforms(t)
-
- // This package only handles gc export data.
- if runtime.Compiler != "gc" {
- t.Skipf("gc-built packages not available (compiler = %s)", runtime.Compiler)
- }
-
- // import go/internal/gcimporter which imports go/types partially
- imports := make(map[string]*types.Package)
- _, err := Import(imports, "go/internal/gcimporter", ".")
- if err != nil {
- t.Fatal(err)
- }
-
- // look for go/types package
- var goTypesPkg *types.Package
- for path, pkg := range imports {
- if path == "go/types" {
- goTypesPkg = pkg
- break
- }
- }
- if goTypesPkg == nil {
- t.Fatal("go/types not found")
- }
-
- // look for go/types.Object type
- obj := lookupObj(t, goTypesPkg.Scope(), "Object")
- typ, ok := obj.Type().(*types.Named)
- if !ok {
- t.Fatalf("go/types.Object type is %v; wanted named type", typ)
- }
-
- // lookup go/types.Object.Pkg method
- m, index, indirect := types.LookupFieldOrMethod(typ, false, nil, "Pkg")
- if m == nil {
- t.Fatalf("go/types.Object.Pkg not found (index = %v, indirect = %v)", index, indirect)
- }
-
- // the method must belong to go/types
- if m.Pkg().Path() != "go/types" {
- t.Fatalf("found %v; want go/types", m.Pkg())
- }
-}
-
-func TestIssue15517(t *testing.T) {
- skipSpecialPlatforms(t)
-
- // This package only handles gc export data.
- if runtime.Compiler != "gc" {
- t.Skipf("gc-built packages not available (compiler = %s)", runtime.Compiler)
- }
-
- // On windows, we have to set the -D option for the compiler to avoid having a drive
- // letter and an illegal ':' in the import path - just skip it (see also issue #3483).
- if runtime.GOOS == "windows" {
- t.Skip("avoid dealing with relative paths/drive letters on windows")
- }
-
- if f := compile(t, "testdata", "p.go"); f != "" {
- defer os.Remove(f)
- }
-
- // Multiple imports of p must succeed without redeclaration errors.
- // We use an import path that's not cleaned up so that the eventual
- // file path for the package is different from the package path; this
- // will expose the error if it is present.
- //
- // (Issue: Both the textual and the binary importer used the file path
- // of the package to be imported as key into the shared packages map.
- // However, the binary importer then used the package path to identify
- // the imported package to mark it as complete; effectively marking the
- // wrong package as complete. By using an "unclean" package path, the
- // file and package path are different, exposing the problem if present.
- // The same issue occurs with vendoring.)
- imports := make(map[string]*types.Package)
- for i := 0; i < 3; i++ {
- if _, err := Import(imports, "./././testdata/p", "."); err != nil {
- t.Fatal(err)
- }
- }
-}
-
-func TestIssue15920(t *testing.T) {
- skipSpecialPlatforms(t)
-
- // This package only handles gc export data.
- if runtime.Compiler != "gc" {
- t.Skipf("gc-built packages not available (compiler = %s)", runtime.Compiler)
- }
-
- // On windows, we have to set the -D option for the compiler to avoid having a drive
- // letter and an illegal ':' in the import path - just skip it (see also issue #3483).
- if runtime.GOOS == "windows" {
- t.Skip("avoid dealing with relative paths/drive letters on windows")
- }
-
- if f := compile(t, "testdata", "issue15920.go"); f != "" {
- defer os.Remove(f)
- }
-
- importPkg(t, "./testdata/issue15920")
-}
-
-func TestIssue20046(t *testing.T) {
- skipSpecialPlatforms(t)
-
- // This package only handles gc export data.
- if runtime.Compiler != "gc" {
- t.Skipf("gc-built packages not available (compiler = %s)", runtime.Compiler)
- }
-
- // On windows, we have to set the -D option for the compiler to avoid having a drive
- // letter and an illegal ':' in the import path - just skip it (see also issue #3483).
- if runtime.GOOS == "windows" {
- t.Skip("avoid dealing with relative paths/drive letters on windows")
- }
-
- if f := compile(t, "testdata", "issue20046.go"); f != "" {
- defer os.Remove(f)
- }
-
- // "./issue20046".V.M must exist
- pkg := importPkg(t, "./testdata/issue20046")
- obj := lookupObj(t, pkg.Scope(), "V")
- if m, index, indirect := types.LookupFieldOrMethod(obj.Type(), false, nil, "M"); m == nil {
- t.Fatalf("V.M not found (index = %v, indirect = %v)", index, indirect)
- }
-}
-
-func importPkg(t *testing.T, path string) *types.Package {
- pkg, err := Import(make(map[string]*types.Package), path, ".")
- if err != nil {
- t.Fatal(err)
- }
- return pkg
-}
-
-func lookupObj(t *testing.T, scope *types.Scope, name string) types.Object {
- if obj := scope.Lookup(name); obj != nil {
- return obj
- }
- t.Fatalf("%s not found", name)
- return nil
-}
diff --git a/vendor/golang.org/x/tools/go/gcimporter15/isAlias18.go b/vendor/golang.org/x/tools/go/gcimporter15/isAlias18.go
deleted file mode 100644
index 225ffee..0000000
--- a/vendor/golang.org/x/tools/go/gcimporter15/isAlias18.go
+++ /dev/null
@@ -1,13 +0,0 @@
-// Copyright 2017 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build !go1.9
-
-package gcimporter
-
-import "go/types"
-
-func isAlias(obj *types.TypeName) bool {
- return false // there are no type aliases before Go 1.9
-}
diff --git a/vendor/golang.org/x/tools/go/gcimporter15/isAlias19.go b/vendor/golang.org/x/tools/go/gcimporter15/isAlias19.go
deleted file mode 100644
index c2025d8..0000000
--- a/vendor/golang.org/x/tools/go/gcimporter15/isAlias19.go
+++ /dev/null
@@ -1,13 +0,0 @@
-// Copyright 2017 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build go1.9
-
-package gcimporter
-
-import "go/types"
-
-func isAlias(obj *types.TypeName) bool {
- return obj.IsAlias()
-}
diff --git a/vendor/golang.org/x/tools/go/gcimporter15/testdata/a.go b/vendor/golang.org/x/tools/go/gcimporter15/testdata/a.go
deleted file mode 100644
index 56e4292..0000000
--- a/vendor/golang.org/x/tools/go/gcimporter15/testdata/a.go
+++ /dev/null
@@ -1,14 +0,0 @@
-// Copyright 2016 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Input for TestIssue13566
-
-package a
-
-import "encoding/json"
-
-type A struct {
- a *A
- json json.RawMessage
-}
diff --git a/vendor/golang.org/x/tools/go/gcimporter15/testdata/b.go b/vendor/golang.org/x/tools/go/gcimporter15/testdata/b.go
deleted file mode 100644
index 4196678..0000000
--- a/vendor/golang.org/x/tools/go/gcimporter15/testdata/b.go
+++ /dev/null
@@ -1,11 +0,0 @@
-// Copyright 2016 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Input for TestIssue13566
-
-package b
-
-import "./a"
-
-type A a.A
diff --git a/vendor/golang.org/x/tools/go/gcimporter15/testdata/exports.go b/vendor/golang.org/x/tools/go/gcimporter15/testdata/exports.go
deleted file mode 100644
index 8ee28b0..0000000
--- a/vendor/golang.org/x/tools/go/gcimporter15/testdata/exports.go
+++ /dev/null
@@ -1,89 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// This file is used to generate an object file which
-// serves as test file for gcimporter_test.go.
-
-package exports
-
-import (
- "go/ast"
-)
-
-// Issue 3682: Correctly read dotted identifiers from export data.
-const init1 = 0
-
-func init() {}
-
-const (
- C0 int = 0
- C1 = 3.14159265
- C2 = 2.718281828i
- C3 = -123.456e-789
- C4 = +123.456E+789
- C5 = 1234i
- C6 = "foo\n"
- C7 = `bar\n`
-)
-
-type (
- T1 int
- T2 [10]int
- T3 []int
- T4 *int
- T5 chan int
- T6a chan<- int
- T6b chan (<-chan int)
- T6c chan<- (chan int)
- T7 <-chan *ast.File
- T8 struct{}
- T9 struct {
- a int
- b, c float32
- d []string `go:"tag"`
- }
- T10 struct {
- T8
- T9
- _ *T10
- }
- T11 map[int]string
- T12 interface{}
- T13 interface {
- m1()
- m2(int) float32
- }
- T14 interface {
- T12
- T13
- m3(x ...struct{}) []T9
- }
- T15 func()
- T16 func(int)
- T17 func(x int)
- T18 func() float32
- T19 func() (x float32)
- T20 func(...interface{})
- T21 struct{ next *T21 }
- T22 struct{ link *T23 }
- T23 struct{ link *T22 }
- T24 *T24
- T25 *T26
- T26 *T27
- T27 *T25
- T28 func(T28) T28
-)
-
-var (
- V0 int
- V1 = -991.0
-)
-
-func F1() {}
-func F2(x int) {}
-func F3() int { return 0 }
-func F4() float32 { return 0 }
-func F5(a, b, c int, u, v, w struct{ x, y T1 }, more ...interface{}) (p, q, r chan<- T10)
-
-func (p *T1) M1()
diff --git a/vendor/golang.org/x/tools/go/gcimporter15/testdata/issue15920.go b/vendor/golang.org/x/tools/go/gcimporter15/testdata/issue15920.go
deleted file mode 100644
index c70f7d8..0000000
--- a/vendor/golang.org/x/tools/go/gcimporter15/testdata/issue15920.go
+++ /dev/null
@@ -1,11 +0,0 @@
-// Copyright 2016 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package p
-
-// The underlying type of Error is the underlying type of error.
-// Make sure we can import this again without problems.
-type Error error
-
-func F() Error { return nil }
diff --git a/vendor/golang.org/x/tools/go/gcimporter15/testdata/issue20046.go b/vendor/golang.org/x/tools/go/gcimporter15/testdata/issue20046.go
deleted file mode 100644
index c63ee82..0000000
--- a/vendor/golang.org/x/tools/go/gcimporter15/testdata/issue20046.go
+++ /dev/null
@@ -1,9 +0,0 @@
-// Copyright 2017 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package p
-
-var V interface {
- M()
-}
diff --git a/vendor/golang.org/x/tools/go/gcimporter15/testdata/p.go b/vendor/golang.org/x/tools/go/gcimporter15/testdata/p.go
deleted file mode 100644
index 9e2e705..0000000
--- a/vendor/golang.org/x/tools/go/gcimporter15/testdata/p.go
+++ /dev/null
@@ -1,13 +0,0 @@
-// Copyright 2016 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Input for TestIssue15517
-
-package p
-
-const C = 0
-
-var V int
-
-func F() {}
diff --git a/vendor/golang.org/x/tools/go/gcimporter15/testdata/versions/test.go b/vendor/golang.org/x/tools/go/gcimporter15/testdata/versions/test.go
deleted file mode 100644
index ac9c968..0000000
--- a/vendor/golang.org/x/tools/go/gcimporter15/testdata/versions/test.go
+++ /dev/null
@@ -1,25 +0,0 @@
-// Copyright 2016 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// To create a test case for a new export format version,
-// build this package with the latest compiler and store
-// the resulting .a file appropriately named in the versions
-// directory. The VersionHandling test will pick it up.
-//
-// In the testdata/versions:
-//
-// go build -o test_go1.$X_$Y.a test.go
-//
-// with $X = Go version and $Y = export format version.
-//
-// Make sure this source is extended such that it exercises
-// whatever export format change has taken place.
-
-package test
-
-// Any release before and including Go 1.7 didn't encode
-// the package for a blank struct field.
-type BlankField struct {
- _ int
-}
diff --git a/vendor/golang.org/x/tools/go/gcimporter15/testdata/versions/test_go1.7_0.a b/vendor/golang.org/x/tools/go/gcimporter15/testdata/versions/test_go1.7_0.a
deleted file mode 100644
index edb6c3f..0000000
Binary files a/vendor/golang.org/x/tools/go/gcimporter15/testdata/versions/test_go1.7_0.a and /dev/null differ
diff --git a/vendor/golang.org/x/tools/go/gcimporter15/testdata/versions/test_go1.7_1.a b/vendor/golang.org/x/tools/go/gcimporter15/testdata/versions/test_go1.7_1.a
deleted file mode 100644
index 554d04a..0000000
Binary files a/vendor/golang.org/x/tools/go/gcimporter15/testdata/versions/test_go1.7_1.a and /dev/null differ
diff --git a/vendor/golang.org/x/tools/go/internal/gccgoimporter/backdoor.go b/vendor/golang.org/x/tools/go/internal/gccgoimporter/backdoor.go
deleted file mode 100644
index 4feb0dc..0000000
--- a/vendor/golang.org/x/tools/go/internal/gccgoimporter/backdoor.go
+++ /dev/null
@@ -1,28 +0,0 @@
-package gccgoimporter
-
-// This file opens a back door to the parser for golang.org/x/tools/go/gccgoexportdata.
-
-import (
- "go/types"
- "io"
-)
-
-// Parse reads and parses gccgo export data from in and constructs a
-// Package, inserting it into the imports map.
-func Parse(in io.Reader, imports map[string]*types.Package, path string) (_ *types.Package, err error) {
- var p parser
- p.init(path, in, imports)
- defer func() {
- switch x := recover().(type) {
- case nil:
- // success
- case importError:
- err = x
- default:
- panic(x) // resume unexpected panic
- }
- }()
- pkg := p.parsePackage()
- imports[path] = pkg
- return pkg, err
-}
diff --git a/vendor/golang.org/x/tools/go/internal/gccgoimporter/gccgoinstallation.go b/vendor/golang.org/x/tools/go/internal/gccgoimporter/gccgoinstallation.go
deleted file mode 100644
index cebfc57..0000000
--- a/vendor/golang.org/x/tools/go/internal/gccgoimporter/gccgoinstallation.go
+++ /dev/null
@@ -1,99 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package gccgoimporter
-
-// This is a verbatim copy of $GOROOT/src/go/internal/gccgoimporter/gccgoinstallation.go.
-
-import (
- "bufio"
- "go/types"
- "os"
- "os/exec"
- "path/filepath"
- "strings"
-)
-
-// Information about a specific installation of gccgo.
-type GccgoInstallation struct {
- // Version of gcc (e.g. 4.8.0).
- GccVersion string
-
- // Target triple (e.g. x86_64-unknown-linux-gnu).
- TargetTriple string
-
- // Built-in library paths used by this installation.
- LibPaths []string
-}
-
-// Ask the driver at the given path for information for this GccgoInstallation.
-// The given arguments are passed directly to the call to the driver.
-func (inst *GccgoInstallation) InitFromDriver(gccgoPath string, args ...string) (err error) {
- argv := append([]string{"-###", "-S", "-x", "go", "-"}, args...)
- cmd := exec.Command(gccgoPath, argv...)
- stderr, err := cmd.StderrPipe()
- if err != nil {
- return
- }
-
- err = cmd.Start()
- if err != nil {
- return
- }
-
- scanner := bufio.NewScanner(stderr)
- for scanner.Scan() {
- line := scanner.Text()
- switch {
- case strings.HasPrefix(line, "Target: "):
- inst.TargetTriple = line[8:]
-
- case line[0] == ' ':
- args := strings.Fields(line)
- for _, arg := range args[1:] {
- if strings.HasPrefix(arg, "-L") {
- inst.LibPaths = append(inst.LibPaths, arg[2:])
- }
- }
- }
- }
-
- argv = append([]string{"-dumpversion"}, args...)
- stdout, err := exec.Command(gccgoPath, argv...).Output()
- if err != nil {
- return
- }
- inst.GccVersion = strings.TrimSpace(string(stdout))
-
- return
-}
-
-// Return the list of export search paths for this GccgoInstallation.
-func (inst *GccgoInstallation) SearchPaths() (paths []string) {
- for _, lpath := range inst.LibPaths {
- spath := filepath.Join(lpath, "go", inst.GccVersion)
- fi, err := os.Stat(spath)
- if err != nil || !fi.IsDir() {
- continue
- }
- paths = append(paths, spath)
-
- spath = filepath.Join(spath, inst.TargetTriple)
- fi, err = os.Stat(spath)
- if err != nil || !fi.IsDir() {
- continue
- }
- paths = append(paths, spath)
- }
-
- paths = append(paths, inst.LibPaths...)
-
- return
-}
-
-// Return an importer that searches incpaths followed by the gcc installation's
-// built-in search paths and the current directory.
-func (inst *GccgoInstallation) GetImporter(incpaths []string, initmap map[*types.Package]InitData) Importer {
- return GetImporter(append(append(incpaths, inst.SearchPaths()...), "."), initmap)
-}
diff --git a/vendor/golang.org/x/tools/go/internal/gccgoimporter/gccgoinstallation_test.go b/vendor/golang.org/x/tools/go/internal/gccgoimporter/gccgoinstallation_test.go
deleted file mode 100644
index fb1fa6d..0000000
--- a/vendor/golang.org/x/tools/go/internal/gccgoimporter/gccgoinstallation_test.go
+++ /dev/null
@@ -1,195 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package gccgoimporter
-
-// This is a verbatim copy of $GOROOT/src/go/internal/gccgoimporter/gccgoinstallation_test.go.
-
-import (
- "go/types"
- "runtime"
- "testing"
-)
-
-var importablePackages = [...]string{
- "archive/tar",
- "archive/zip",
- "bufio",
- "bytes",
- "compress/bzip2",
- "compress/flate",
- "compress/gzip",
- "compress/lzw",
- "compress/zlib",
- "container/heap",
- "container/list",
- "container/ring",
- "crypto/aes",
- "crypto/cipher",
- "crypto/des",
- "crypto/dsa",
- "crypto/ecdsa",
- "crypto/elliptic",
- "crypto",
- "crypto/hmac",
- "crypto/md5",
- "crypto/rand",
- "crypto/rc4",
- "crypto/rsa",
- "crypto/sha1",
- "crypto/sha256",
- "crypto/sha512",
- "crypto/subtle",
- "crypto/tls",
- "crypto/x509",
- "crypto/x509/pkix",
- "database/sql/driver",
- "database/sql",
- "debug/dwarf",
- "debug/elf",
- "debug/gosym",
- "debug/macho",
- "debug/pe",
- "encoding/ascii85",
- "encoding/asn1",
- "encoding/base32",
- "encoding/base64",
- "encoding/binary",
- "encoding/csv",
- "encoding/gob",
- "encoding",
- "encoding/hex",
- "encoding/json",
- "encoding/pem",
- "encoding/xml",
- "errors",
- "exp/proxy",
- "exp/terminal",
- "expvar",
- "flag",
- "fmt",
- "go/ast",
- "go/build",
- "go/doc",
- "go/format",
- "go/parser",
- "go/printer",
- "go/scanner",
- "go/token",
- "hash/adler32",
- "hash/crc32",
- "hash/crc64",
- "hash/fnv",
- "hash",
- "html",
- "html/template",
- "image/color",
- "image/color/palette",
- "image/draw",
- "image/gif",
- "image",
- "image/jpeg",
- "image/png",
- "index/suffixarray",
- "io",
- "io/ioutil",
- "log",
- "log/syslog",
- "math/big",
- "math/cmplx",
- "math",
- "math/rand",
- "mime",
- "mime/multipart",
- "net",
- "net/http/cgi",
- "net/http/cookiejar",
- "net/http/fcgi",
- "net/http",
- "net/http/httptest",
- "net/http/httputil",
- "net/http/pprof",
- "net/mail",
- "net/rpc",
- "net/rpc/jsonrpc",
- "net/smtp",
- "net/textproto",
- "net/url",
- "old/regexp",
- "old/template",
- "os/exec",
- "os",
- "os/signal",
- "os/user",
- "path/filepath",
- "path",
- "reflect",
- "regexp",
- "regexp/syntax",
- "runtime/debug",
- "runtime",
- "runtime/pprof",
- "sort",
- "strconv",
- "strings",
- "sync/atomic",
- "sync",
- "syscall",
- "testing",
- "testing/iotest",
- "testing/quick",
- "text/scanner",
- "text/tabwriter",
- "text/template",
- "text/template/parse",
- "time",
- "unicode",
- "unicode/utf16",
- "unicode/utf8",
-}
-
-func TestInstallationImporter(t *testing.T) {
- // This test relies on gccgo being around, which it most likely will be if we
- // were compiled with gccgo.
- if runtime.Compiler != "gccgo" {
- t.Skip("This test needs gccgo")
- return
- }
-
- var inst GccgoInstallation
- err := inst.InitFromDriver("gccgo")
- if err != nil {
- t.Fatal(err)
- }
- imp := inst.GetImporter(nil, nil)
-
- // Ensure we don't regress the number of packages we can parse. First import
- // all packages into the same map and then each individually.
- pkgMap := make(map[string]*types.Package)
- for _, pkg := range importablePackages {
- _, err = imp(pkgMap, pkg)
- if err != nil {
- t.Error(err)
- }
- }
-
- for _, pkg := range importablePackages {
- _, err = imp(make(map[string]*types.Package), pkg)
- if err != nil {
- t.Error(err)
- }
- }
-
- // Test for certain specific entities in the imported data.
- for _, test := range [...]importerTest{
- {pkgpath: "io", name: "Reader", want: "type Reader interface{Read(p []uint8) (n int, err error)}"},
- {pkgpath: "io", name: "ReadWriter", want: "type ReadWriter interface{Reader; Writer}"},
- {pkgpath: "math", name: "Pi", want: "const Pi untyped float"},
- {pkgpath: "math", name: "Sin", want: "func Sin(x float64) float64"},
- {pkgpath: "sort", name: "Ints", want: "func Ints(a []int)"},
- {pkgpath: "unsafe", name: "Pointer", want: "type Pointer unsafe.Pointer"},
- } {
- runImporterTest(t, imp, nil, &test)
- }
-}
diff --git a/vendor/golang.org/x/tools/go/internal/gccgoimporter/importer.go b/vendor/golang.org/x/tools/go/internal/gccgoimporter/importer.go
deleted file mode 100644
index a3fae9a..0000000
--- a/vendor/golang.org/x/tools/go/internal/gccgoimporter/importer.go
+++ /dev/null
@@ -1,209 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Package gccgoimporter implements Import for gccgo-generated object files.
-package gccgoimporter // import "golang.org/x/tools/go/internal/gccgoimporter"
-
-// This is a verbatim copy of $GOROOT/src/go/internal/gccgoimporter/importer.go.
-
-import (
- "bytes"
- "debug/elf"
- "fmt"
- "go/types"
- "io"
- "os"
- "os/exec"
- "path/filepath"
- "strings"
-)
-
-// A PackageInit describes an imported package that needs initialization.
-type PackageInit struct {
- Name string // short package name
- InitFunc string // name of init function
- Priority int // priority of init function, see InitData.Priority
-}
-
-// The gccgo-specific init data for a package.
-type InitData struct {
- // Initialization priority of this package relative to other packages.
- // This is based on the maximum depth of the package's dependency graph;
- // it is guaranteed to be greater than that of its dependencies.
- Priority int
-
- // The list of packages which this package depends on to be initialized,
- // including itself if needed. This is the subset of the transitive closure of
- // the package's dependencies that need initialization.
- Inits []PackageInit
-}
-
-// Locate the file from which to read export data.
-// This is intended to replicate the logic in gofrontend.
-func findExportFile(searchpaths []string, pkgpath string) (string, error) {
- for _, spath := range searchpaths {
- pkgfullpath := filepath.Join(spath, pkgpath)
- pkgdir, name := filepath.Split(pkgfullpath)
-
- for _, filepath := range [...]string{
- pkgfullpath,
- pkgfullpath + ".gox",
- pkgdir + "lib" + name + ".so",
- pkgdir + "lib" + name + ".a",
- pkgfullpath + ".o",
- } {
- fi, err := os.Stat(filepath)
- if err == nil && !fi.IsDir() {
- return filepath, nil
- }
- }
- }
-
- return "", fmt.Errorf("%s: could not find export data (tried %s)", pkgpath, strings.Join(searchpaths, ":"))
-}
-
-const (
- gccgov1Magic = "v1;\n"
- gccgov2Magic = "v2;\n"
- goimporterMagic = "\n$$ "
- archiveMagic = "! 0 {
- initdata := initmap[pkg]
- found := false
- // Check that the package's own init function has the package's priority
- for _, pkginit := range initdata.Inits {
- if pkginit.InitFunc == test.wantinits[0] {
- if initdata.Priority != pkginit.Priority {
- t.Errorf("%s: got self priority %d; want %d", test.pkgpath, pkginit.Priority, initdata.Priority)
- }
- found = true
- break
- }
- }
-
- if !found {
- t.Errorf("%s: could not find expected function %q", test.pkgpath, test.wantinits[0])
- }
-
- // Each init function in the list other than the first one is a
- // dependency of the function immediately before it. Check that
- // the init functions appear in descending priority order.
- priority := initdata.Priority
- for _, wantdepinit := range test.wantinits[1:] {
- found = false
- for _, pkginit := range initdata.Inits {
- if pkginit.InitFunc == wantdepinit {
- if priority <= pkginit.Priority {
- t.Errorf("%s: got dep priority %d; want less than %d", test.pkgpath, pkginit.Priority, priority)
- }
- found = true
- priority = pkginit.Priority
- break
- }
- }
-
- if !found {
- t.Errorf("%s: could not find expected function %q", test.pkgpath, wantdepinit)
- }
- }
- }
-}
-
-var importerTests = []importerTest{
- {pkgpath: "pointer", name: "Int8Ptr", want: "type Int8Ptr *int8"},
- {pkgpath: "complexnums", name: "NN", want: "const NN untyped complex", wantval: "(-1 + -1i)"},
- {pkgpath: "complexnums", name: "NP", want: "const NP untyped complex", wantval: "(-1 + 1i)"},
- {pkgpath: "complexnums", name: "PN", want: "const PN untyped complex", wantval: "(1 + -1i)"},
- {pkgpath: "complexnums", name: "PP", want: "const PP untyped complex", wantval: "(1 + 1i)"},
- {pkgpath: "conversions", name: "Bits", want: "const Bits Units", wantval: `"bits"`},
- {pkgpath: "time", name: "Duration", want: "type Duration int64"},
- {pkgpath: "time", name: "Nanosecond", want: "const Nanosecond Duration", wantval: "1"},
- {pkgpath: "unicode", name: "IsUpper", want: "func IsUpper(r rune) bool"},
- {pkgpath: "unicode", name: "MaxRune", want: "const MaxRune untyped rune", wantval: "1114111"},
- {pkgpath: "imports", wantinits: []string{"imports..import", "fmt..import", "math..import"}},
- {pkgpath: "escapeinfo", name: "NewT", want: "func NewT(data []byte) *T"},
-}
-
-func TestGoxImporter(t *testing.T) {
- testenv.MustHaveGoBuild(t)
-
- initmap := make(map[*types.Package]InitData)
- imp := GetImporter([]string{"testdata"}, initmap)
-
- for _, test := range importerTests {
- runImporterTest(t, imp, initmap, &test)
- }
-}
-
-func TestObjImporter(t *testing.T) {
- testenv.MustHaveGoBuild(t)
-
- // This test relies on gccgo being around, which it most likely will be if we
- // were compiled with gccgo.
- if runtime.Compiler != "gccgo" {
- t.Skip("This test needs gccgo")
- return
- }
-
- tmpdir, err := ioutil.TempDir("", "")
- if err != nil {
- t.Fatal(err)
- }
- initmap := make(map[*types.Package]InitData)
- imp := GetImporter([]string{tmpdir}, initmap)
-
- artmpdir, err := ioutil.TempDir("", "")
- if err != nil {
- t.Fatal(err)
- }
- arinitmap := make(map[*types.Package]InitData)
- arimp := GetImporter([]string{artmpdir}, arinitmap)
-
- for _, test := range importerTests {
- gofile := filepath.Join("testdata", test.pkgpath+".go")
- ofile := filepath.Join(tmpdir, test.pkgpath+".o")
- afile := filepath.Join(artmpdir, "lib"+test.pkgpath+".a")
-
- cmd := exec.Command("gccgo", "-fgo-pkgpath="+test.pkgpath, "-c", "-o", ofile, gofile)
- out, err := cmd.CombinedOutput()
- if err != nil {
- t.Logf("%s", out)
- t.Fatalf("gccgo %s failed: %s", gofile, err)
- }
-
- runImporterTest(t, imp, initmap, &test)
-
- cmd = exec.Command("ar", "cr", afile, ofile)
- out, err = cmd.CombinedOutput()
- if err != nil {
- t.Logf("%s", out)
- t.Fatalf("ar cr %s %s failed: %s", afile, ofile, err)
- }
-
- runImporterTest(t, arimp, arinitmap, &test)
-
- if err = os.Remove(ofile); err != nil {
- t.Fatal(err)
- }
- if err = os.Remove(afile); err != nil {
- t.Fatal(err)
- }
- }
-
- if err = os.Remove(tmpdir); err != nil {
- t.Fatal(err)
- }
-}
diff --git a/vendor/golang.org/x/tools/go/internal/gccgoimporter/parser.go b/vendor/golang.org/x/tools/go/internal/gccgoimporter/parser.go
deleted file mode 100644
index 9e20df0..0000000
--- a/vendor/golang.org/x/tools/go/internal/gccgoimporter/parser.go
+++ /dev/null
@@ -1,910 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package gccgoimporter
-
-// This is a verbatim copy of $GOROOT/src/go/internal/gccgoimporter/parser.go.
-
-import (
- "bytes"
- "errors"
- "fmt"
- "go/constant"
- "go/token"
- "go/types"
- "io"
- "strconv"
- "strings"
- "text/scanner"
-)
-
-type parser struct {
- scanner scanner.Scanner
- version string // format version
- tok rune // current token
- lit string // literal string; only valid for Ident, Int, String tokens
- pkgpath string // package path of imported package
- pkgname string // name of imported package
- pkg *types.Package // reference to imported package
- imports map[string]*types.Package // package path -> package object
- typeMap map[int]types.Type // type number -> type
- initdata InitData // package init priority data
-}
-
-func (p *parser) init(filename string, src io.Reader, imports map[string]*types.Package) {
- p.scanner.Init(src)
- p.scanner.Error = func(_ *scanner.Scanner, msg string) { p.error(msg) }
- p.scanner.Mode = scanner.ScanIdents | scanner.ScanInts | scanner.ScanFloats | scanner.ScanStrings | scanner.ScanComments | scanner.SkipComments
- p.scanner.Whitespace = 1<<'\t' | 1<<'\n' | 1<<' '
- p.scanner.Filename = filename // for good error messages
- p.next()
- p.imports = imports
- p.typeMap = make(map[int]types.Type)
-}
-
-type importError struct {
- pos scanner.Position
- err error
-}
-
-func (e importError) Error() string {
- return fmt.Sprintf("import error %s (byte offset = %d): %s", e.pos, e.pos.Offset, e.err)
-}
-
-func (p *parser) error(err interface{}) {
- if s, ok := err.(string); ok {
- err = errors.New(s)
- }
- // panic with a runtime.Error if err is not an error
- panic(importError{p.scanner.Pos(), err.(error)})
-}
-
-func (p *parser) errorf(format string, args ...interface{}) {
- p.error(fmt.Errorf(format, args...))
-}
-
-func (p *parser) expect(tok rune) string {
- lit := p.lit
- if p.tok != tok {
- p.errorf("expected %s, got %s (%s)", scanner.TokenString(tok), scanner.TokenString(p.tok), lit)
- }
- p.next()
- return lit
-}
-
-func (p *parser) expectKeyword(keyword string) {
- lit := p.expect(scanner.Ident)
- if lit != keyword {
- p.errorf("expected keyword %s, got %q", keyword, lit)
- }
-}
-
-func (p *parser) parseString() string {
- str, err := strconv.Unquote(p.expect(scanner.String))
- if err != nil {
- p.error(err)
- }
- return str
-}
-
-// unquotedString = { unquotedStringChar } .
-// unquotedStringChar = .
-func (p *parser) parseUnquotedString() string {
- if p.tok == scanner.EOF {
- p.error("unexpected EOF")
- }
- var buf bytes.Buffer
- buf.WriteString(p.scanner.TokenText())
- // This loop needs to examine each character before deciding whether to consume it. If we see a semicolon,
- // we need to let it be consumed by p.next().
- for ch := p.scanner.Peek(); ch != ';' && ch != scanner.EOF && p.scanner.Whitespace&(1<" . (optional and ignored)
- p.next()
- p.expectKeyword("esc")
- p.expect(':')
- p.expect(scanner.Int)
- p.expect('>')
- }
- if p.tok == '.' {
- p.next()
- p.expect('.')
- p.expect('.')
- isVariadic = true
- }
- typ := p.parseType(pkg)
- if isVariadic {
- typ = types.NewSlice(typ)
- }
- param = types.NewParam(token.NoPos, pkg, name, typ)
- return
-}
-
-// Var = Name Type .
-func (p *parser) parseVar(pkg *types.Package) *types.Var {
- name := p.parseName()
- return types.NewVar(token.NoPos, pkg, name, p.parseType(pkg))
-}
-
-// Conversion = "convert" "(" Type "," ConstValue ")" .
-func (p *parser) parseConversion(pkg *types.Package) (val constant.Value, typ types.Type) {
- p.expectKeyword("convert")
- p.expect('(')
- typ = p.parseType(pkg)
- p.expect(',')
- val, _ = p.parseConstValue(pkg)
- p.expect(')')
- return
-}
-
-// ConstValue = string | "false" | "true" | ["-"] (int ["'"] | FloatOrComplex) | Conversion .
-// FloatOrComplex = float ["i" | ("+"|"-") float "i"] .
-func (p *parser) parseConstValue(pkg *types.Package) (val constant.Value, typ types.Type) {
- switch p.tok {
- case scanner.String:
- str := p.parseString()
- val = constant.MakeString(str)
- typ = types.Typ[types.UntypedString]
- return
-
- case scanner.Ident:
- b := false
- switch p.lit {
- case "false":
- case "true":
- b = true
-
- case "convert":
- return p.parseConversion(pkg)
-
- default:
- p.errorf("expected const value, got %s (%q)", scanner.TokenString(p.tok), p.lit)
- }
-
- p.next()
- val = constant.MakeBool(b)
- typ = types.Typ[types.UntypedBool]
- return
- }
-
- sign := ""
- if p.tok == '-' {
- p.next()
- sign = "-"
- }
-
- switch p.tok {
- case scanner.Int:
- val = constant.MakeFromLiteral(sign+p.lit, token.INT, 0)
- if val == nil {
- p.error("could not parse integer literal")
- }
-
- p.next()
- if p.tok == '\'' {
- p.next()
- typ = types.Typ[types.UntypedRune]
- } else {
- typ = types.Typ[types.UntypedInt]
- }
-
- case scanner.Float:
- re := sign + p.lit
- p.next()
-
- var im string
- switch p.tok {
- case '+':
- p.next()
- im = p.expect(scanner.Float)
-
- case '-':
- p.next()
- im = "-" + p.expect(scanner.Float)
-
- case scanner.Ident:
- // re is in fact the imaginary component. Expect "i" below.
- im = re
- re = "0"
-
- default:
- val = constant.MakeFromLiteral(re, token.FLOAT, 0)
- if val == nil {
- p.error("could not parse float literal")
- }
- typ = types.Typ[types.UntypedFloat]
- return
- }
-
- p.expectKeyword("i")
- reval := constant.MakeFromLiteral(re, token.FLOAT, 0)
- if reval == nil {
- p.error("could not parse real component of complex literal")
- }
- imval := constant.MakeFromLiteral(im+"i", token.IMAG, 0)
- if imval == nil {
- p.error("could not parse imag component of complex literal")
- }
- val = constant.BinaryOp(reval, token.ADD, imval)
- typ = types.Typ[types.UntypedComplex]
-
- default:
- p.errorf("expected const value, got %s (%q)", scanner.TokenString(p.tok), p.lit)
- }
-
- return
-}
-
-// Const = Name [Type] "=" ConstValue .
-func (p *parser) parseConst(pkg *types.Package) *types.Const {
- name := p.parseName()
- var typ types.Type
- if p.tok == '<' {
- typ = p.parseType(pkg)
- }
- p.expect('=')
- val, vtyp := p.parseConstValue(pkg)
- if typ == nil {
- typ = vtyp
- }
- return types.NewConst(token.NoPos, pkg, name, typ, val)
-}
-
-// NamedType = TypeName [ "=" ] Type { Method } .
-// TypeName = ExportedName .
-// Method = "func" "(" Param ")" Name ParamList ResultList ";" .
-func (p *parser) parseNamedType(n int) types.Type {
- pkg, name := p.parseExportedName()
- scope := pkg.Scope()
-
- if p.tok == '=' {
- // type alias
- p.next()
- typ := p.parseType(pkg)
- if obj := scope.Lookup(name); obj != nil {
- typ = obj.Type() // use previously imported type
- if typ == nil {
- p.errorf("%v (type alias) used in cycle", obj)
- }
- } else {
- obj = types.NewTypeName(token.NoPos, pkg, name, typ)
- scope.Insert(obj)
- }
- p.typeMap[n] = typ
- return typ
- }
-
- // named type
- obj := scope.Lookup(name)
- if obj == nil {
- // a named type may be referred to before the underlying type
- // is known - set it up
- tname := types.NewTypeName(token.NoPos, pkg, name, nil)
- types.NewNamed(tname, nil, nil)
- scope.Insert(tname)
- obj = tname
- }
-
- typ := obj.Type()
- p.typeMap[n] = typ
-
- nt, ok := typ.(*types.Named)
- if !ok {
- // This can happen for unsafe.Pointer, which is a TypeName holding a Basic type.
- pt := p.parseType(pkg)
- if pt != typ {
- p.error("unexpected underlying type for non-named TypeName")
- }
- return typ
- }
-
- underlying := p.parseType(pkg)
- if nt.Underlying() == nil {
- nt.SetUnderlying(underlying.Underlying())
- }
-
- // collect associated methods
- for p.tok == scanner.Ident {
- p.expectKeyword("func")
- p.expect('(')
- receiver, _ := p.parseParam(pkg)
- p.expect(')')
- name := p.parseName()
- params, isVariadic := p.parseParamList(pkg)
- results := p.parseResultList(pkg)
- p.expect(';')
-
- sig := types.NewSignature(receiver, params, results, isVariadic)
- nt.AddMethod(types.NewFunc(token.NoPos, pkg, name, sig))
- }
-
- return nt
-}
-
-func (p *parser) parseInt() int64 {
- lit := p.expect(scanner.Int)
- n, err := strconv.ParseInt(lit, 10, 0)
- if err != nil {
- p.error(err)
- }
- return n
-}
-
-// ArrayOrSliceType = "[" [ int ] "]" Type .
-func (p *parser) parseArrayOrSliceType(pkg *types.Package) types.Type {
- p.expect('[')
- if p.tok == ']' {
- p.next()
- return types.NewSlice(p.parseType(pkg))
- }
-
- n := p.parseInt()
- p.expect(']')
- return types.NewArray(p.parseType(pkg), n)
-}
-
-// MapType = "map" "[" Type "]" Type .
-func (p *parser) parseMapType(pkg *types.Package) types.Type {
- p.expectKeyword("map")
- p.expect('[')
- key := p.parseType(pkg)
- p.expect(']')
- elem := p.parseType(pkg)
- return types.NewMap(key, elem)
-}
-
-// ChanType = "chan" ["<-" | "-<"] Type .
-func (p *parser) parseChanType(pkg *types.Package) types.Type {
- p.expectKeyword("chan")
- dir := types.SendRecv
- switch p.tok {
- case '-':
- p.next()
- p.expect('<')
- dir = types.SendOnly
-
- case '<':
- // don't consume '<' if it belongs to Type
- if p.scanner.Peek() == '-' {
- p.next()
- p.expect('-')
- dir = types.RecvOnly
- }
- }
-
- return types.NewChan(dir, p.parseType(pkg))
-}
-
-// StructType = "struct" "{" { Field } "}" .
-func (p *parser) parseStructType(pkg *types.Package) types.Type {
- p.expectKeyword("struct")
-
- var fields []*types.Var
- var tags []string
-
- p.expect('{')
- for p.tok != '}' && p.tok != scanner.EOF {
- field, tag := p.parseField(pkg)
- p.expect(';')
- fields = append(fields, field)
- tags = append(tags, tag)
- }
- p.expect('}')
-
- return types.NewStruct(fields, tags)
-}
-
-// ParamList = "(" [ { Parameter "," } Parameter ] ")" .
-func (p *parser) parseParamList(pkg *types.Package) (*types.Tuple, bool) {
- var list []*types.Var
- isVariadic := false
-
- p.expect('(')
- for p.tok != ')' && p.tok != scanner.EOF {
- if len(list) > 0 {
- p.expect(',')
- }
- par, variadic := p.parseParam(pkg)
- list = append(list, par)
- if variadic {
- if isVariadic {
- p.error("... not on final argument")
- }
- isVariadic = true
- }
- }
- p.expect(')')
-
- return types.NewTuple(list...), isVariadic
-}
-
-// ResultList = Type | ParamList .
-func (p *parser) parseResultList(pkg *types.Package) *types.Tuple {
- switch p.tok {
- case '<':
- return types.NewTuple(types.NewParam(token.NoPos, pkg, "", p.parseType(pkg)))
-
- case '(':
- params, _ := p.parseParamList(pkg)
- return params
-
- default:
- return nil
- }
-}
-
-// FunctionType = ParamList ResultList .
-func (p *parser) parseFunctionType(pkg *types.Package) *types.Signature {
- params, isVariadic := p.parseParamList(pkg)
- results := p.parseResultList(pkg)
- return types.NewSignature(nil, params, results, isVariadic)
-}
-
-// Func = Name FunctionType .
-func (p *parser) parseFunc(pkg *types.Package) *types.Func {
- name := p.parseName()
- if strings.ContainsRune(name, '$') {
- // This is a Type$equal or Type$hash function, which we don't want to parse,
- // except for the types.
- p.discardDirectiveWhileParsingTypes(pkg)
- return nil
- }
- return types.NewFunc(token.NoPos, pkg, name, p.parseFunctionType(pkg))
-}
-
-// InterfaceType = "interface" "{" { ("?" Type | Func) ";" } "}" .
-func (p *parser) parseInterfaceType(pkg *types.Package) types.Type {
- p.expectKeyword("interface")
-
- var methods []*types.Func
- var typs []*types.Named
-
- p.expect('{')
- for p.tok != '}' && p.tok != scanner.EOF {
- if p.tok == '?' {
- p.next()
- typs = append(typs, p.parseType(pkg).(*types.Named))
- } else {
- method := p.parseFunc(pkg)
- methods = append(methods, method)
- }
- p.expect(';')
- }
- p.expect('}')
-
- return types.NewInterface(methods, typs)
-}
-
-// PointerType = "*" ("any" | Type) .
-func (p *parser) parsePointerType(pkg *types.Package) types.Type {
- p.expect('*')
- if p.tok == scanner.Ident {
- p.expectKeyword("any")
- return types.Typ[types.UnsafePointer]
- }
- return types.NewPointer(p.parseType(pkg))
-}
-
-// TypeDefinition = NamedType | MapType | ChanType | StructType | InterfaceType | PointerType | ArrayOrSliceType | FunctionType .
-func (p *parser) parseTypeDefinition(pkg *types.Package, n int) types.Type {
- var t types.Type
- switch p.tok {
- case scanner.String:
- t = p.parseNamedType(n)
-
- case scanner.Ident:
- switch p.lit {
- case "map":
- t = p.parseMapType(pkg)
-
- case "chan":
- t = p.parseChanType(pkg)
-
- case "struct":
- t = p.parseStructType(pkg)
-
- case "interface":
- t = p.parseInterfaceType(pkg)
- }
-
- case '*':
- t = p.parsePointerType(pkg)
-
- case '[':
- t = p.parseArrayOrSliceType(pkg)
-
- case '(':
- t = p.parseFunctionType(pkg)
- }
-
- p.typeMap[n] = t
- return t
-}
-
-const (
- // From gofrontend/go/export.h
- // Note that these values are negative in the gofrontend and have been made positive
- // in the gccgoimporter.
- gccgoBuiltinINT8 = 1
- gccgoBuiltinINT16 = 2
- gccgoBuiltinINT32 = 3
- gccgoBuiltinINT64 = 4
- gccgoBuiltinUINT8 = 5
- gccgoBuiltinUINT16 = 6
- gccgoBuiltinUINT32 = 7
- gccgoBuiltinUINT64 = 8
- gccgoBuiltinFLOAT32 = 9
- gccgoBuiltinFLOAT64 = 10
- gccgoBuiltinINT = 11
- gccgoBuiltinUINT = 12
- gccgoBuiltinUINTPTR = 13
- gccgoBuiltinBOOL = 15
- gccgoBuiltinSTRING = 16
- gccgoBuiltinCOMPLEX64 = 17
- gccgoBuiltinCOMPLEX128 = 18
- gccgoBuiltinERROR = 19
- gccgoBuiltinBYTE = 20
- gccgoBuiltinRUNE = 21
-)
-
-func lookupBuiltinType(typ int) types.Type {
- return [...]types.Type{
- gccgoBuiltinINT8: types.Typ[types.Int8],
- gccgoBuiltinINT16: types.Typ[types.Int16],
- gccgoBuiltinINT32: types.Typ[types.Int32],
- gccgoBuiltinINT64: types.Typ[types.Int64],
- gccgoBuiltinUINT8: types.Typ[types.Uint8],
- gccgoBuiltinUINT16: types.Typ[types.Uint16],
- gccgoBuiltinUINT32: types.Typ[types.Uint32],
- gccgoBuiltinUINT64: types.Typ[types.Uint64],
- gccgoBuiltinFLOAT32: types.Typ[types.Float32],
- gccgoBuiltinFLOAT64: types.Typ[types.Float64],
- gccgoBuiltinINT: types.Typ[types.Int],
- gccgoBuiltinUINT: types.Typ[types.Uint],
- gccgoBuiltinUINTPTR: types.Typ[types.Uintptr],
- gccgoBuiltinBOOL: types.Typ[types.Bool],
- gccgoBuiltinSTRING: types.Typ[types.String],
- gccgoBuiltinCOMPLEX64: types.Typ[types.Complex64],
- gccgoBuiltinCOMPLEX128: types.Typ[types.Complex128],
- gccgoBuiltinERROR: types.Universe.Lookup("error").Type(),
- gccgoBuiltinBYTE: types.Universe.Lookup("byte").Type(),
- gccgoBuiltinRUNE: types.Universe.Lookup("rune").Type(),
- }[typ]
-}
-
-// Type = "<" "type" ( "-" int | int [ TypeDefinition ] ) ">" .
-func (p *parser) parseType(pkg *types.Package) (t types.Type) {
- p.expect('<')
- p.expectKeyword("type")
-
- switch p.tok {
- case scanner.Int:
- n := p.parseInt()
-
- if p.tok == '>' {
- t = p.typeMap[int(n)]
- } else {
- t = p.parseTypeDefinition(pkg, int(n))
- }
-
- case '-':
- p.next()
- n := p.parseInt()
- t = lookupBuiltinType(int(n))
-
- default:
- p.errorf("expected type number, got %s (%q)", scanner.TokenString(p.tok), p.lit)
- return nil
- }
-
- p.expect('>')
- return
-}
-
-// PackageInit = unquotedString unquotedString int .
-func (p *parser) parsePackageInit() PackageInit {
- name := p.parseUnquotedString()
- initfunc := p.parseUnquotedString()
- priority := -1
- if p.version == "v1" {
- priority = int(p.parseInt())
- }
- return PackageInit{Name: name, InitFunc: initfunc, Priority: priority}
-}
-
-// Throw away tokens until we see a ';'. If we see a '<', attempt to parse as a type.
-func (p *parser) discardDirectiveWhileParsingTypes(pkg *types.Package) {
- for {
- switch p.tok {
- case ';':
- return
- case '<':
- p.parseType(pkg)
- case scanner.EOF:
- p.error("unexpected EOF")
- default:
- p.next()
- }
- }
-}
-
-// Create the package if we have parsed both the package path and package name.
-func (p *parser) maybeCreatePackage() {
- if p.pkgname != "" && p.pkgpath != "" {
- p.pkg = p.getPkg(p.pkgpath, p.pkgname)
- }
-}
-
-// InitDataDirective = ( "v1" | "v2" ) ";" |
-// "priority" int ";" |
-// "init" { PackageInit } ";" |
-// "checksum" unquotedString ";" .
-func (p *parser) parseInitDataDirective() {
- if p.tok != scanner.Ident {
- // unexpected token kind; panic
- p.expect(scanner.Ident)
- }
-
- switch p.lit {
- case "v1", "v2":
- p.version = p.lit
- p.next()
- p.expect(';')
-
- case "priority":
- p.next()
- p.initdata.Priority = int(p.parseInt())
- p.expect(';')
-
- case "init":
- p.next()
- for p.tok != ';' && p.tok != scanner.EOF {
- p.initdata.Inits = append(p.initdata.Inits, p.parsePackageInit())
- }
- p.expect(';')
-
- case "init_graph":
- p.next()
- // The graph data is thrown away for now.
- for p.tok != ';' && p.tok != scanner.EOF {
- p.parseInt()
- p.parseInt()
- }
- p.expect(';')
-
- case "checksum":
- // Don't let the scanner try to parse the checksum as a number.
- defer func(mode uint) {
- p.scanner.Mode = mode
- }(p.scanner.Mode)
- p.scanner.Mode &^= scanner.ScanInts | scanner.ScanFloats
- p.next()
- p.parseUnquotedString()
- p.expect(';')
-
- default:
- p.errorf("unexpected identifier: %q", p.lit)
- }
-}
-
-// Directive = InitDataDirective |
-// "package" unquotedString [ unquotedString ] [ unquotedString ] ";" |
-// "pkgpath" unquotedString ";" |
-// "prefix" unquotedString ";" |
-// "import" unquotedString unquotedString string ";" |
-// "func" Func ";" |
-// "type" Type ";" |
-// "var" Var ";" |
-// "const" Const ";" .
-func (p *parser) parseDirective() {
- if p.tok != scanner.Ident {
- // unexpected token kind; panic
- p.expect(scanner.Ident)
- }
-
- switch p.lit {
- case "v1", "v2", "priority", "init", "init_graph", "checksum":
- p.parseInitDataDirective()
-
- case "package":
- p.next()
- p.pkgname = p.parseUnquotedString()
- p.maybeCreatePackage()
- if p.version == "v2" && p.tok != ';' {
- p.parseUnquotedString()
- p.parseUnquotedString()
- }
- p.expect(';')
-
- case "pkgpath":
- p.next()
- p.pkgpath = p.parseUnquotedString()
- p.maybeCreatePackage()
- p.expect(';')
-
- case "prefix":
- p.next()
- p.pkgpath = p.parseUnquotedString()
- p.expect(';')
-
- case "import":
- p.next()
- pkgname := p.parseUnquotedString()
- pkgpath := p.parseUnquotedString()
- p.getPkg(pkgpath, pkgname)
- p.parseString()
- p.expect(';')
-
- case "func":
- p.next()
- fun := p.parseFunc(p.pkg)
- if fun != nil {
- p.pkg.Scope().Insert(fun)
- }
- p.expect(';')
-
- case "type":
- p.next()
- p.parseType(p.pkg)
- p.expect(';')
-
- case "var":
- p.next()
- v := p.parseVar(p.pkg)
- p.pkg.Scope().Insert(v)
- p.expect(';')
-
- case "const":
- p.next()
- c := p.parseConst(p.pkg)
- p.pkg.Scope().Insert(c)
- p.expect(';')
-
- default:
- p.errorf("unexpected identifier: %q", p.lit)
- }
-}
-
-// Package = { Directive } .
-func (p *parser) parsePackage() *types.Package {
- for p.tok != scanner.EOF {
- p.parseDirective()
- }
- for _, typ := range p.typeMap {
- if it, ok := typ.(*types.Interface); ok {
- it.Complete()
- }
- }
- p.pkg.MarkComplete()
- return p.pkg
-}
diff --git a/vendor/golang.org/x/tools/go/internal/gccgoimporter/parser_test.go b/vendor/golang.org/x/tools/go/internal/gccgoimporter/parser_test.go
deleted file mode 100644
index a6f5eda..0000000
--- a/vendor/golang.org/x/tools/go/internal/gccgoimporter/parser_test.go
+++ /dev/null
@@ -1,79 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package gccgoimporter
-
-// This is a verbatim copy of $GOROOT/src/go/internal/gccgoimporter/parser_test.go.
-
-import (
- "bytes"
- "go/types"
- "strings"
- "testing"
- "text/scanner"
-)
-
-var typeParserTests = []struct {
- id, typ, want, underlying, methods string
-}{
- {id: "foo", typ: "", want: "int8"},
- {id: "foo", typ: ">", want: "*error"},
- {id: "foo", typ: "", want: "unsafe.Pointer"},
- {id: "foo", typ: ">>", want: "foo.Bar", underlying: "*foo.Bar"},
- {id: "foo", typ: " func (? ) M (); >", want: "bar.Foo", underlying: "int8", methods: "func (bar.Foo).M()"},
- {id: "foo", typ: ">", want: "bar.foo", underlying: "int8"},
- {id: "foo", typ: ">", want: "[]int8"},
- {id: "foo", typ: ">", want: "[42]int8"},
- {id: "foo", typ: "] >", want: "map[int8]int16"},
- {id: "foo", typ: ">", want: "chan int8"},
- {id: "foo", typ: ">", want: "<-chan int8"},
- {id: "foo", typ: ">", want: "chan<- int8"},
- {id: "foo", typ: "; I16 \"i16\"; }>", want: "struct{I8 int8; I16 int16 \"i16\"}"},
- {id: "foo", typ: ", b ) ; Bar (? , ? ...) (? , ? ); Baz (); }>", want: "interface{Bar(int16, ...int8) (int16, int8); Baz(); Foo(a int8, b int16) int8}"},
- {id: "foo", typ: ") >", want: "func(int8) int16"},
-}
-
-func TestTypeParser(t *testing.T) {
- for _, test := range typeParserTests {
- var p parser
- p.init("test.gox", strings.NewReader(test.typ), make(map[string]*types.Package))
- p.pkgname = test.id
- p.pkgpath = test.id
- p.maybeCreatePackage()
- typ := p.parseType(p.pkg)
-
- if p.tok != scanner.EOF {
- t.Errorf("expected full parse, stopped at %q", p.lit)
- }
-
- // interfaces must be explicitly completed
- if ityp, _ := typ.(*types.Interface); ityp != nil {
- ityp.Complete()
- }
-
- got := typ.String()
- if got != test.want {
- t.Errorf("got type %q, expected %q", got, test.want)
- }
-
- if test.underlying != "" {
- underlying := typ.Underlying().String()
- if underlying != test.underlying {
- t.Errorf("got underlying type %q, expected %q", underlying, test.underlying)
- }
- }
-
- if test.methods != "" {
- nt := typ.(*types.Named)
- var buf bytes.Buffer
- for i := 0; i != nt.NumMethods(); i++ {
- buf.WriteString(nt.Method(i).String())
- }
- methods := buf.String()
- if methods != test.methods {
- t.Errorf("got methods %q, expected %q", methods, test.methods)
- }
- }
- }
-}
diff --git a/vendor/golang.org/x/tools/go/internal/gccgoimporter/testdata/alias.gox b/vendor/golang.org/x/tools/go/internal/gccgoimporter/testdata/alias.gox
deleted file mode 100644
index ced7d84..0000000
--- a/vendor/golang.org/x/tools/go/internal/gccgoimporter/testdata/alias.gox
+++ /dev/null
@@ -1,4 +0,0 @@
-v1;
-package alias;
-pkgpath alias;
-type >>>) < type 114>; M2 () ; }>>;
diff --git a/vendor/golang.org/x/tools/go/internal/gccgoimporter/testdata/complexnums.go b/vendor/golang.org/x/tools/go/internal/gccgoimporter/testdata/complexnums.go
deleted file mode 100644
index a51b6b0..0000000
--- a/vendor/golang.org/x/tools/go/internal/gccgoimporter/testdata/complexnums.go
+++ /dev/null
@@ -1,6 +0,0 @@
-package complexnums
-
-const NN = -1 - 1i
-const NP = -1 + 1i
-const PN = 1 - 1i
-const PP = 1 + 1i
diff --git a/vendor/golang.org/x/tools/go/internal/gccgoimporter/testdata/complexnums.gox b/vendor/golang.org/x/tools/go/internal/gccgoimporter/testdata/complexnums.gox
deleted file mode 100644
index b66524f..0000000
--- a/vendor/golang.org/x/tools/go/internal/gccgoimporter/testdata/complexnums.gox
+++ /dev/null
@@ -1,8 +0,0 @@
-v1;
-package complexnums;
-pkgpath complexnums;
-priority 1;
-const NN = -0.1E1-0.1E1i ;
-const NP = -0.1E1+0.1E1i ;
-const PN = 0.1E1-0.1E1i ;
-const PP = 0.1E1+0.1E1i ;
diff --git a/vendor/golang.org/x/tools/go/internal/gccgoimporter/testdata/conversions.go b/vendor/golang.org/x/tools/go/internal/gccgoimporter/testdata/conversions.go
deleted file mode 100644
index 653927a..0000000
--- a/vendor/golang.org/x/tools/go/internal/gccgoimporter/testdata/conversions.go
+++ /dev/null
@@ -1,5 +0,0 @@
-package conversions
-
-type Units string
-
-const Bits = Units("bits")
diff --git a/vendor/golang.org/x/tools/go/internal/gccgoimporter/testdata/conversions.gox b/vendor/golang.org/x/tools/go/internal/gccgoimporter/testdata/conversions.gox
deleted file mode 100644
index 7de6cda..0000000
--- a/vendor/golang.org/x/tools/go/internal/gccgoimporter/testdata/conversions.gox
+++ /dev/null
@@ -1,6 +0,0 @@
-v2;
-package conversions;
-prefix go;
-package conversions go.conversions go.conversions;
-const Bits > = convert(, "bits");
-type ;
diff --git a/vendor/golang.org/x/tools/go/internal/gccgoimporter/testdata/escapeinfo.go b/vendor/golang.org/x/tools/go/internal/gccgoimporter/testdata/escapeinfo.go
deleted file mode 100644
index 103ad95..0000000
--- a/vendor/golang.org/x/tools/go/internal/gccgoimporter/testdata/escapeinfo.go
+++ /dev/null
@@ -1,13 +0,0 @@
-// Test case for escape info in export data. To compile and extract .gox file:
-// gccgo -fgo-optimize-allocs -c escapeinfo.go
-// objcopy -j .go_export escapeinfo.o escapeinfo.gox
-
-package escapeinfo
-
-type T struct{ data []byte }
-
-func NewT(data []byte) *T {
- return &T{data}
-}
-
-func (*T) Read(p []byte) {}
diff --git a/vendor/golang.org/x/tools/go/internal/gccgoimporter/testdata/escapeinfo.gox b/vendor/golang.org/x/tools/go/internal/gccgoimporter/testdata/escapeinfo.gox
deleted file mode 100644
index 1db8156..0000000
Binary files a/vendor/golang.org/x/tools/go/internal/gccgoimporter/testdata/escapeinfo.gox and /dev/null differ
diff --git a/vendor/golang.org/x/tools/go/internal/gccgoimporter/testdata/imports.go b/vendor/golang.org/x/tools/go/internal/gccgoimporter/testdata/imports.go
deleted file mode 100644
index 7907316..0000000
--- a/vendor/golang.org/x/tools/go/internal/gccgoimporter/testdata/imports.go
+++ /dev/null
@@ -1,5 +0,0 @@
-package imports
-
-import "fmt"
-
-var Hello = fmt.Sprintf("Hello, world")
diff --git a/vendor/golang.org/x/tools/go/internal/gccgoimporter/testdata/imports.gox b/vendor/golang.org/x/tools/go/internal/gccgoimporter/testdata/imports.gox
deleted file mode 100644
index 958a4f5..0000000
--- a/vendor/golang.org/x/tools/go/internal/gccgoimporter/testdata/imports.gox
+++ /dev/null
@@ -1,7 +0,0 @@
-v1;
-package imports;
-pkgpath imports;
-priority 7;
-import fmt fmt "fmt";
-init imports imports..import 7 math math..import 1 runtime runtime..import 1 strconv strconv..import 2 io io..import 3 reflect reflect..import 3 syscall syscall..import 3 time time..import 4 os os..import 5 fmt fmt..import 6;
-var Hello ;
diff --git a/vendor/golang.org/x/tools/go/internal/gccgoimporter/testdata/pointer.go b/vendor/golang.org/x/tools/go/internal/gccgoimporter/testdata/pointer.go
deleted file mode 100644
index 4ebc671..0000000
--- a/vendor/golang.org/x/tools/go/internal/gccgoimporter/testdata/pointer.go
+++ /dev/null
@@ -1,3 +0,0 @@
-package pointer
-
-type Int8Ptr *int8
diff --git a/vendor/golang.org/x/tools/go/internal/gccgoimporter/testdata/pointer.gox b/vendor/golang.org/x/tools/go/internal/gccgoimporter/testdata/pointer.gox
deleted file mode 100644
index d96ebbd..0000000
--- a/vendor/golang.org/x/tools/go/internal/gccgoimporter/testdata/pointer.gox
+++ /dev/null
@@ -1,4 +0,0 @@
-v1;
-package pointer;
-pkgpath pointer;
-type >>;
diff --git a/vendor/golang.org/x/tools/go/internal/gccgoimporter/testdata/time.gox b/vendor/golang.org/x/tools/go/internal/gccgoimporter/testdata/time.gox
deleted file mode 100644
index 80c2dbc..0000000
Binary files a/vendor/golang.org/x/tools/go/internal/gccgoimporter/testdata/time.gox and /dev/null differ
diff --git a/vendor/golang.org/x/tools/go/internal/gccgoimporter/testdata/unicode.gox b/vendor/golang.org/x/tools/go/internal/gccgoimporter/testdata/unicode.gox
deleted file mode 100644
index e70e539..0000000
Binary files a/vendor/golang.org/x/tools/go/internal/gccgoimporter/testdata/unicode.gox and /dev/null differ
diff --git a/vendor/golang.org/x/tools/go/internal/gccgoimporter/testenv_test.go b/vendor/golang.org/x/tools/go/internal/gccgoimporter/testenv_test.go
deleted file mode 100644
index 10c11fd..0000000
--- a/vendor/golang.org/x/tools/go/internal/gccgoimporter/testenv_test.go
+++ /dev/null
@@ -1,40 +0,0 @@
-package gccgoimporter
-
-// This file contains testing utilities copied from $GOROOT/src/internal/testenv/testenv.go.
-
-import (
- "runtime"
- "strings"
- "testing"
-)
-
-// HasGoBuild reports whether the current system can build programs with ``go build''
-// and then run them with os.StartProcess or exec.Command.
-func HasGoBuild() bool {
- switch runtime.GOOS {
- case "android", "nacl":
- return false
- case "darwin":
- if strings.HasPrefix(runtime.GOARCH, "arm") {
- return false
- }
- }
- return true
-}
-
-// MustHaveGoBuild checks that the current system can build programs with ``go build''
-// and then run them with os.StartProcess or exec.Command.
-// If not, MustHaveGoBuild calls t.Skip with an explanation.
-func MustHaveGoBuild(t *testing.T) {
- if !HasGoBuild() {
- t.Skipf("skipping test: 'go build' not available on %s/%s", runtime.GOOS, runtime.GOARCH)
- }
-}
-
-var testenv = struct {
- HasGoBuild func() bool
- MustHaveGoBuild func(*testing.T)
-}{
- HasGoBuild: HasGoBuild,
- MustHaveGoBuild: MustHaveGoBuild,
-}
diff --git a/vendor/golang.org/x/tools/go/loader/cgo.go b/vendor/golang.org/x/tools/go/loader/cgo.go
deleted file mode 100644
index 72c6f50..0000000
--- a/vendor/golang.org/x/tools/go/loader/cgo.go
+++ /dev/null
@@ -1,207 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package loader
-
-// This file handles cgo preprocessing of files containing `import "C"`.
-//
-// DESIGN
-//
-// The approach taken is to run the cgo processor on the package's
-// CgoFiles and parse the output, faking the filenames of the
-// resulting ASTs so that the synthetic file containing the C types is
-// called "C" (e.g. "~/go/src/net/C") and the preprocessed files
-// have their original names (e.g. "~/go/src/net/cgo_unix.go"),
-// not the names of the actual temporary files.
-//
-// The advantage of this approach is its fidelity to 'go build'. The
-// downside is that the token.Position.Offset for each AST node is
-// incorrect, being an offset within the temporary file. Line numbers
-// should still be correct because of the //line comments.
-//
-// The logic of this file is mostly plundered from the 'go build'
-// tool, which also invokes the cgo preprocessor.
-//
-//
-// REJECTED ALTERNATIVE
-//
-// An alternative approach that we explored is to extend go/types'
-// Importer mechanism to provide the identity of the importing package
-// so that each time `import "C"` appears it resolves to a different
-// synthetic package containing just the objects needed in that case.
-// The loader would invoke cgo but parse only the cgo_types.go file
-// defining the package-level objects, discarding the other files
-// resulting from preprocessing.
-//
-// The benefit of this approach would have been that source-level
-// syntax information would correspond exactly to the original cgo
-// file, with no preprocessing involved, making source tools like
-// godoc, guru, and eg happy. However, the approach was rejected
-// due to the additional complexity it would impose on go/types. (It
-// made for a beautiful demo, though.)
-//
-// cgo files, despite their *.go extension, are not legal Go source
-// files per the specification since they may refer to unexported
-// members of package "C" such as C.int. Also, a function such as
-// C.getpwent has in effect two types, one matching its C type and one
-// which additionally returns (errno C.int). The cgo preprocessor
-// uses name mangling to distinguish these two functions in the
-// processed code, but go/types would need to duplicate this logic in
-// its handling of function calls, analogous to the treatment of map
-// lookups in which y=m[k] and y,ok=m[k] are both legal.
-
-import (
- "fmt"
- "go/ast"
- "go/build"
- "go/parser"
- "go/token"
- "io/ioutil"
- "log"
- "os"
- "os/exec"
- "path/filepath"
- "regexp"
- "strings"
-)
-
-// processCgoFiles invokes the cgo preprocessor on bp.CgoFiles, parses
-// the output and returns the resulting ASTs.
-//
-func processCgoFiles(bp *build.Package, fset *token.FileSet, DisplayPath func(path string) string, mode parser.Mode) ([]*ast.File, error) {
- tmpdir, err := ioutil.TempDir("", strings.Replace(bp.ImportPath, "/", "_", -1)+"_C")
- if err != nil {
- return nil, err
- }
- defer os.RemoveAll(tmpdir)
-
- pkgdir := bp.Dir
- if DisplayPath != nil {
- pkgdir = DisplayPath(pkgdir)
- }
-
- cgoFiles, cgoDisplayFiles, err := runCgo(bp, pkgdir, tmpdir)
- if err != nil {
- return nil, err
- }
- var files []*ast.File
- for i := range cgoFiles {
- rd, err := os.Open(cgoFiles[i])
- if err != nil {
- return nil, err
- }
- display := filepath.Join(bp.Dir, cgoDisplayFiles[i])
- f, err := parser.ParseFile(fset, display, rd, mode)
- rd.Close()
- if err != nil {
- return nil, err
- }
- files = append(files, f)
- }
- return files, nil
-}
-
-var cgoRe = regexp.MustCompile(`[/\\:]`)
-
-// runCgo invokes the cgo preprocessor on bp.CgoFiles and returns two
-// lists of files: the resulting processed files (in temporary
-// directory tmpdir) and the corresponding names of the unprocessed files.
-//
-// runCgo is adapted from (*builder).cgo in
-// $GOROOT/src/cmd/go/build.go, but these features are unsupported:
-// Objective C, CGOPKGPATH, CGO_FLAGS.
-//
-func runCgo(bp *build.Package, pkgdir, tmpdir string) (files, displayFiles []string, err error) {
- cgoCPPFLAGS, _, _, _ := cflags(bp, true)
- _, cgoexeCFLAGS, _, _ := cflags(bp, false)
-
- if len(bp.CgoPkgConfig) > 0 {
- pcCFLAGS, err := pkgConfigFlags(bp)
- if err != nil {
- return nil, nil, err
- }
- cgoCPPFLAGS = append(cgoCPPFLAGS, pcCFLAGS...)
- }
-
- // Allows including _cgo_export.h from .[ch] files in the package.
- cgoCPPFLAGS = append(cgoCPPFLAGS, "-I", tmpdir)
-
- // _cgo_gotypes.go (displayed "C") contains the type definitions.
- files = append(files, filepath.Join(tmpdir, "_cgo_gotypes.go"))
- displayFiles = append(displayFiles, "C")
- for _, fn := range bp.CgoFiles {
- // "foo.cgo1.go" (displayed "foo.go") is the processed Go source.
- f := cgoRe.ReplaceAllString(fn[:len(fn)-len("go")], "_")
- files = append(files, filepath.Join(tmpdir, f+"cgo1.go"))
- displayFiles = append(displayFiles, fn)
- }
-
- var cgoflags []string
- if bp.Goroot && bp.ImportPath == "runtime/cgo" {
- cgoflags = append(cgoflags, "-import_runtime_cgo=false")
- }
- if bp.Goroot && bp.ImportPath == "runtime/race" || bp.ImportPath == "runtime/cgo" {
- cgoflags = append(cgoflags, "-import_syscall=false")
- }
-
- args := stringList(
- "go", "tool", "cgo", "-objdir", tmpdir, cgoflags, "--",
- cgoCPPFLAGS, cgoexeCFLAGS, bp.CgoFiles,
- )
- if false {
- log.Printf("Running cgo for package %q: %s (dir=%s)", bp.ImportPath, args, pkgdir)
- }
- cmd := exec.Command(args[0], args[1:]...)
- cmd.Dir = pkgdir
- cmd.Stdout = os.Stderr
- cmd.Stderr = os.Stderr
- if err := cmd.Run(); err != nil {
- return nil, nil, fmt.Errorf("cgo failed: %s: %s", args, err)
- }
-
- return files, displayFiles, nil
-}
-
-// -- unmodified from 'go build' ---------------------------------------
-
-// Return the flags to use when invoking the C or C++ compilers, or cgo.
-func cflags(p *build.Package, def bool) (cppflags, cflags, cxxflags, ldflags []string) {
- var defaults string
- if def {
- defaults = "-g -O2"
- }
-
- cppflags = stringList(envList("CGO_CPPFLAGS", ""), p.CgoCPPFLAGS)
- cflags = stringList(envList("CGO_CFLAGS", defaults), p.CgoCFLAGS)
- cxxflags = stringList(envList("CGO_CXXFLAGS", defaults), p.CgoCXXFLAGS)
- ldflags = stringList(envList("CGO_LDFLAGS", defaults), p.CgoLDFLAGS)
- return
-}
-
-// envList returns the value of the given environment variable broken
-// into fields, using the default value when the variable is empty.
-func envList(key, def string) []string {
- v := os.Getenv(key)
- if v == "" {
- v = def
- }
- return strings.Fields(v)
-}
-
-// stringList's arguments should be a sequence of string or []string values.
-// stringList flattens them into a single []string.
-func stringList(args ...interface{}) []string {
- var x []string
- for _, arg := range args {
- switch arg := arg.(type) {
- case []string:
- x = append(x, arg...)
- case string:
- x = append(x, arg)
- default:
- panic("stringList: invalid argument")
- }
- }
- return x
-}
diff --git a/vendor/golang.org/x/tools/go/loader/cgo_pkgconfig.go b/vendor/golang.org/x/tools/go/loader/cgo_pkgconfig.go
deleted file mode 100644
index de57422..0000000
--- a/vendor/golang.org/x/tools/go/loader/cgo_pkgconfig.go
+++ /dev/null
@@ -1,39 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package loader
-
-import (
- "errors"
- "fmt"
- "go/build"
- "os/exec"
- "strings"
-)
-
-// pkgConfig runs pkg-config with the specified arguments and returns the flags it prints.
-func pkgConfig(mode string, pkgs []string) (flags []string, err error) {
- cmd := exec.Command("pkg-config", append([]string{mode}, pkgs...)...)
- out, err := cmd.CombinedOutput()
- if err != nil {
- s := fmt.Sprintf("%s failed: %v", strings.Join(cmd.Args, " "), err)
- if len(out) > 0 {
- s = fmt.Sprintf("%s: %s", s, out)
- }
- return nil, errors.New(s)
- }
- if len(out) > 0 {
- flags = strings.Fields(string(out))
- }
- return
-}
-
-// pkgConfigFlags calls pkg-config if needed and returns the cflags
-// needed to build the package.
-func pkgConfigFlags(p *build.Package) (cflags []string, err error) {
- if len(p.CgoPkgConfig) == 0 {
- return nil, nil
- }
- return pkgConfig("--cflags", p.CgoPkgConfig)
-}
diff --git a/vendor/golang.org/x/tools/go/loader/doc.go b/vendor/golang.org/x/tools/go/loader/doc.go
deleted file mode 100644
index 9b51c9e..0000000
--- a/vendor/golang.org/x/tools/go/loader/doc.go
+++ /dev/null
@@ -1,205 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Package loader loads a complete Go program from source code, parsing
-// and type-checking the initial packages plus their transitive closure
-// of dependencies. The ASTs and the derived facts are retained for
-// later use.
-//
-// THIS INTERFACE IS EXPERIMENTAL AND IS LIKELY TO CHANGE.
-//
-// The package defines two primary types: Config, which specifies a
-// set of initial packages to load and various other options; and
-// Program, which is the result of successfully loading the packages
-// specified by a configuration.
-//
-// The configuration can be set directly, but *Config provides various
-// convenience methods to simplify the common cases, each of which can
-// be called any number of times. Finally, these are followed by a
-// call to Load() to actually load and type-check the program.
-//
-// var conf loader.Config
-//
-// // Use the command-line arguments to specify
-// // a set of initial packages to load from source.
-// // See FromArgsUsage for help.
-// rest, err := conf.FromArgs(os.Args[1:], wantTests)
-//
-// // Parse the specified files and create an ad hoc package with path "foo".
-// // All files must have the same 'package' declaration.
-// conf.CreateFromFilenames("foo", "foo.go", "bar.go")
-//
-// // Create an ad hoc package with path "foo" from
-// // the specified already-parsed files.
-// // All ASTs must have the same 'package' declaration.
-// conf.CreateFromFiles("foo", parsedFiles)
-//
-// // Add "runtime" to the set of packages to be loaded.
-// conf.Import("runtime")
-//
-// // Adds "fmt" and "fmt_test" to the set of packages
-// // to be loaded. "fmt" will include *_test.go files.
-// conf.ImportWithTests("fmt")
-//
-// // Finally, load all the packages specified by the configuration.
-// prog, err := conf.Load()
-//
-// See examples_test.go for examples of API usage.
-//
-//
-// CONCEPTS AND TERMINOLOGY
-//
-// The WORKSPACE is the set of packages accessible to the loader. The
-// workspace is defined by Config.Build, a *build.Context. The
-// default context treats subdirectories of $GOROOT and $GOPATH as
-// packages, but this behavior may be overridden.
-//
-// An AD HOC package is one specified as a set of source files on the
-// command line. In the simplest case, it may consist of a single file
-// such as $GOROOT/src/net/http/triv.go.
-//
-// EXTERNAL TEST packages are those comprised of a set of *_test.go
-// files all with the same 'package foo_test' declaration, all in the
-// same directory. (go/build.Package calls these files XTestFiles.)
-//
-// An IMPORTABLE package is one that can be referred to by some import
-// spec. Every importable package is uniquely identified by its
-// PACKAGE PATH or just PATH, a string such as "fmt", "encoding/json",
-// or "cmd/vendor/golang.org/x/arch/x86/x86asm". A package path
-// typically denotes a subdirectory of the workspace.
-//
-// An import declaration uses an IMPORT PATH to refer to a package.
-// Most import declarations use the package path as the import path.
-//
-// Due to VENDORING (https://golang.org/s/go15vendor), the
-// interpretation of an import path may depend on the directory in which
-// it appears. To resolve an import path to a package path, go/build
-// must search the enclosing directories for a subdirectory named
-// "vendor".
-//
-// ad hoc packages and external test packages are NON-IMPORTABLE. The
-// path of an ad hoc package is inferred from the package
-// declarations of its files and is therefore not a unique package key.
-// For example, Config.CreatePkgs may specify two initial ad hoc
-// packages, both with path "main".
-//
-// An AUGMENTED package is an importable package P plus all the
-// *_test.go files with same 'package foo' declaration as P.
-// (go/build.Package calls these files TestFiles.)
-//
-// The INITIAL packages are those specified in the configuration. A
-// DEPENDENCY is a package loaded to satisfy an import in an initial
-// package or another dependency.
-//
-package loader
-
-// IMPLEMENTATION NOTES
-//
-// 'go test', in-package test files, and import cycles
-// ---------------------------------------------------
-//
-// An external test package may depend upon members of the augmented
-// package that are not in the unaugmented package, such as functions
-// that expose internals. (See bufio/export_test.go for an example.)
-// So, the loader must ensure that for each external test package
-// it loads, it also augments the corresponding non-test package.
-//
-// The import graph over n unaugmented packages must be acyclic; the
-// import graph over n-1 unaugmented packages plus one augmented
-// package must also be acyclic. ('go test' relies on this.) But the
-// import graph over n augmented packages may contain cycles.
-//
-// First, all the (unaugmented) non-test packages and their
-// dependencies are imported in the usual way; the loader reports an
-// error if it detects an import cycle.
-//
-// Then, each package P for which testing is desired is augmented by
-// the list P' of its in-package test files, by calling
-// (*types.Checker).Files. This arrangement ensures that P' may
-// reference definitions within P, but P may not reference definitions
-// within P'. Furthermore, P' may import any other package, including
-// ones that depend upon P, without an import cycle error.
-//
-// Consider two packages A and B, both of which have lists of
-// in-package test files we'll call A' and B', and which have the
-// following import graph edges:
-// B imports A
-// B' imports A
-// A' imports B
-// This last edge would be expected to create an error were it not
-// for the special type-checking discipline above.
-// Cycles of size greater than two are possible. For example:
-// compress/bzip2/bzip2_test.go (package bzip2) imports "io/ioutil"
-// io/ioutil/tempfile_test.go (package ioutil) imports "regexp"
-// regexp/exec_test.go (package regexp) imports "compress/bzip2"
-//
-//
-// Concurrency
-// -----------
-//
-// Let us define the import dependency graph as follows. Each node is a
-// list of files passed to (Checker).Files at once. Many of these lists
-// are the production code of an importable Go package, so those nodes
-// are labelled by the package's path. The remaining nodes are
-// ad hoc packages and lists of in-package *_test.go files that augment
-// an importable package; those nodes have no label.
-//
-// The edges of the graph represent import statements appearing within a
-// file. An edge connects a node (a list of files) to the node it
-// imports, which is importable and thus always labelled.
-//
-// Loading is controlled by this dependency graph.
-//
-// To reduce I/O latency, we start loading a package's dependencies
-// asynchronously as soon as we've parsed its files and enumerated its
-// imports (scanImports). This performs a preorder traversal of the
-// import dependency graph.
-//
-// To exploit hardware parallelism, we type-check unrelated packages in
-// parallel, where "unrelated" means not ordered by the partial order of
-// the import dependency graph.
-//
-// We use a concurrency-safe non-blocking cache (importer.imported) to
-// record the results of type-checking, whether success or failure. An
-// entry is created in this cache by startLoad the first time the
-// package is imported. The first goroutine to request an entry becomes
-// responsible for completing the task and broadcasting completion to
-// subsequent requestors, which block until then.
-//
-// Type checking occurs in (parallel) postorder: we cannot type-check a
-// set of files until we have loaded and type-checked all of their
-// immediate dependencies (and thus all of their transitive
-// dependencies). If the input were guaranteed free of import cycles,
-// this would be trivial: we could simply wait for completion of the
-// dependencies and then invoke the typechecker.
-//
-// But as we saw in the 'go test' section above, some cycles in the
-// import graph over packages are actually legal, so long as the
-// cycle-forming edge originates in the in-package test files that
-// augment the package. This explains why the nodes of the import
-// dependency graph are not packages, but lists of files: the unlabelled
-// nodes avoid the cycles. Consider packages A and B where B imports A
-// and A's in-package tests AT import B. The naively constructed import
-// graph over packages would contain a cycle (A+AT) --> B --> (A+AT) but
-// the graph over lists of files is AT --> B --> A, where AT is an
-// unlabelled node.
-//
-// Awaiting completion of the dependencies in a cyclic graph would
-// deadlock, so we must materialize the import dependency graph (as
-// importer.graph) and check whether each import edge forms a cycle. If
-// x imports y, and the graph already contains a path from y to x, then
-// there is an import cycle, in which case the processing of x must not
-// wait for the completion of processing of y.
-//
-// When the type-checker makes a callback (doImport) to the loader for a
-// given import edge, there are two possible cases. In the normal case,
-// the dependency has already been completely type-checked; doImport
-// does a cache lookup and returns it. In the cyclic case, the entry in
-// the cache is still necessarily incomplete, indicating a cycle. We
-// perform the cycle check again to obtain the error message, and return
-// the error.
-//
-// The result of using concurrency is about a 2.5x speedup for stdlib_test.
-
-// TODO(adonovan): overhaul the package documentation.
diff --git a/vendor/golang.org/x/tools/go/loader/example_test.go b/vendor/golang.org/x/tools/go/loader/example_test.go
deleted file mode 100644
index 88adde3..0000000
--- a/vendor/golang.org/x/tools/go/loader/example_test.go
+++ /dev/null
@@ -1,179 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build go1.8,!go1.9 // TODO(adonovan) determine which versions we need to test here
-// +build !windows
-
-package loader_test
-
-import (
- "fmt"
- "go/token"
- "log"
- "path/filepath"
- "runtime"
- "sort"
- "strings"
-
- "golang.org/x/tools/go/loader"
-)
-
-func printProgram(prog *loader.Program) {
- // Created packages are the initial packages specified by a call
- // to CreateFromFilenames or CreateFromFiles.
- var names []string
- for _, info := range prog.Created {
- names = append(names, info.Pkg.Path())
- }
- fmt.Printf("created: %s\n", names)
-
- // Imported packages are the initial packages specified by a
- // call to Import or ImportWithTests.
- names = nil
- for _, info := range prog.Imported {
- if strings.Contains(info.Pkg.Path(), "internal") {
- continue // skip, to reduce fragility
- }
- names = append(names, info.Pkg.Path())
- }
- sort.Strings(names)
- fmt.Printf("imported: %s\n", names)
-
- // InitialPackages contains the union of created and imported.
- names = nil
- for _, info := range prog.InitialPackages() {
- names = append(names, info.Pkg.Path())
- }
- sort.Strings(names)
- fmt.Printf("initial: %s\n", names)
-
- // AllPackages contains all initial packages and their dependencies.
- names = nil
- for pkg := range prog.AllPackages {
- names = append(names, pkg.Path())
- }
- sort.Strings(names)
- fmt.Printf("all: %s\n", names)
-}
-
-func printFilenames(fset *token.FileSet, info *loader.PackageInfo) {
- var names []string
- for _, f := range info.Files {
- names = append(names, filepath.Base(fset.File(f.Pos()).Name()))
- }
- fmt.Printf("%s.Files: %s\n", info.Pkg.Path(), names)
-}
-
-// This example loads a set of packages and all of their dependencies
-// from a typical command-line. FromArgs parses a command line and
-// makes calls to the other methods of Config shown in the examples that
-// follow.
-func ExampleConfig_FromArgs() {
- args := []string{"mytool", "unicode/utf8", "errors", "runtime", "--", "foo", "bar"}
- const wantTests = false
-
- var conf loader.Config
- rest, err := conf.FromArgs(args[1:], wantTests)
- prog, err := conf.Load()
- if err != nil {
- log.Fatal(err)
- }
-
- fmt.Printf("rest: %s\n", rest)
- printProgram(prog)
- // Output:
- // rest: [foo bar]
- // created: []
- // imported: [errors runtime unicode/utf8]
- // initial: [errors runtime unicode/utf8]
- // all: [errors runtime runtime/internal/atomic runtime/internal/sys unicode/utf8 unsafe]
-}
-
-// This example creates and type-checks a single package (without tests)
-// from a list of filenames, and loads all of its dependencies.
-// (The input files are actually only a small part of the math/cmplx package.)
-func ExampleConfig_CreateFromFilenames() {
- var conf loader.Config
- conf.CreateFromFilenames("math/cmplx",
- filepath.Join(runtime.GOROOT(), "src/math/cmplx/abs.go"),
- filepath.Join(runtime.GOROOT(), "src/math/cmplx/sin.go"))
- prog, err := conf.Load()
- if err != nil {
- log.Fatal(err)
- }
-
- printProgram(prog)
- // Output:
- // created: [math/cmplx]
- // imported: []
- // initial: [math/cmplx]
- // all: [math math/cmplx unsafe]
-}
-
-// In the examples below, for stability, the chosen packages are
-// relatively small, platform-independent, and low-level (and thus
-// infrequently changing).
-// The strconv package has internal and external tests.
-
-const hello = `package main
-
-import "fmt"
-
-func main() {
- fmt.Println("Hello, world.")
-}
-`
-
-// This example creates and type-checks a package from a list of
-// already-parsed files, and loads all its dependencies.
-func ExampleConfig_CreateFromFiles() {
- var conf loader.Config
- f, err := conf.ParseFile("hello.go", hello)
- if err != nil {
- log.Fatal(err)
- }
- conf.CreateFromFiles("hello", f)
- prog, err := conf.Load()
- if err != nil {
- log.Fatal(err)
- }
-
- printProgram(prog)
- printFilenames(prog.Fset, prog.Package("strconv"))
- // Output:
- // created: [hello]
- // imported: []
- // initial: [hello]
- // all: [errors fmt hello internal/race io math os reflect runtime runtime/internal/atomic runtime/internal/sys strconv sync sync/atomic syscall time unicode/utf8 unsafe]
- // strconv.Files: [atob.go atof.go atoi.go decimal.go doc.go extfloat.go ftoa.go isprint.go itoa.go quote.go]
-}
-
-// This example imports three packages, including the tests for one of
-// them, and loads all their dependencies.
-func ExampleConfig_Import() {
- // ImportWithTest("strconv") causes strconv to include
- // internal_test.go, and creates an external test package,
- // strconv_test.
- // (Compare with the example of CreateFromFiles.)
-
- var conf loader.Config
- conf.Import("unicode/utf8")
- conf.Import("errors")
- conf.ImportWithTests("strconv")
- prog, err := conf.Load()
- if err != nil {
- log.Fatal(err)
- }
-
- printProgram(prog)
- printFilenames(prog.Fset, prog.Package("strconv"))
- printFilenames(prog.Fset, prog.Package("strconv_test"))
- // Output:
- // created: [strconv_test]
- // imported: [errors strconv unicode/utf8]
- // initial: [errors strconv strconv_test unicode/utf8]
- // all: [bufio bytes errors flag fmt internal/race io log math math/rand os reflect runtime runtime/debug runtime/internal/atomic runtime/internal/sys runtime/trace sort strconv strconv_test strings sync sync/atomic syscall testing time unicode unicode/utf8 unsafe]
- // strconv.Files: [atob.go atof.go atoi.go decimal.go doc.go extfloat.go ftoa.go isprint.go itoa.go quote.go internal_test.go]
- // strconv_test.Files: [atob_test.go atof_test.go atoi_test.go decimal_test.go example_test.go fp_test.go ftoa_test.go itoa_test.go quote_test.go strconv_test.go]
-}
diff --git a/vendor/golang.org/x/tools/go/loader/loader.go b/vendor/golang.org/x/tools/go/loader/loader.go
deleted file mode 100644
index de756f7..0000000
--- a/vendor/golang.org/x/tools/go/loader/loader.go
+++ /dev/null
@@ -1,1077 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package loader
-
-// See doc.go for package documentation and implementation notes.
-
-import (
- "errors"
- "fmt"
- "go/ast"
- "go/build"
- "go/parser"
- "go/token"
- "go/types"
- "os"
- "path/filepath"
- "sort"
- "strings"
- "sync"
- "time"
-
- "golang.org/x/tools/go/ast/astutil"
-)
-
-var ignoreVendor build.ImportMode
-
-const trace = false // show timing info for type-checking
-
-// Config specifies the configuration for loading a whole program from
-// Go source code.
-// The zero value for Config is a ready-to-use default configuration.
-type Config struct {
- // Fset is the file set for the parser to use when loading the
- // program. If nil, it may be lazily initialized by any
- // method of Config.
- Fset *token.FileSet
-
- // ParserMode specifies the mode to be used by the parser when
- // loading source packages.
- ParserMode parser.Mode
-
- // TypeChecker contains options relating to the type checker.
- //
- // The supplied IgnoreFuncBodies is not used; the effective
- // value comes from the TypeCheckFuncBodies func below.
- // The supplied Import function is not used either.
- TypeChecker types.Config
-
- // TypeCheckFuncBodies is a predicate over package paths.
- // A package for which the predicate is false will
- // have its package-level declarations type checked, but not
- // its function bodies; this can be used to quickly load
- // dependencies from source. If nil, all func bodies are type
- // checked.
- TypeCheckFuncBodies func(path string) bool
-
- // If Build is non-nil, it is used to locate source packages.
- // Otherwise &build.Default is used.
- //
- // By default, cgo is invoked to preprocess Go files that
- // import the fake package "C". This behaviour can be
- // disabled by setting CGO_ENABLED=0 in the environment prior
- // to startup, or by setting Build.CgoEnabled=false.
- Build *build.Context
-
- // The current directory, used for resolving relative package
- // references such as "./go/loader". If empty, os.Getwd will be
- // used instead.
- Cwd string
-
- // If DisplayPath is non-nil, it is used to transform each
- // file name obtained from Build.Import(). This can be used
- // to prevent a virtualized build.Config's file names from
- // leaking into the user interface.
- DisplayPath func(path string) string
-
- // If AllowErrors is true, Load will return a Program even
- // if some of the its packages contained I/O, parser or type
- // errors; such errors are accessible via PackageInfo.Errors. If
- // false, Load will fail if any package had an error.
- AllowErrors bool
-
- // CreatePkgs specifies a list of non-importable initial
- // packages to create. The resulting packages will appear in
- // the corresponding elements of the Program.Created slice.
- CreatePkgs []PkgSpec
-
- // ImportPkgs specifies a set of initial packages to load.
- // The map keys are package paths.
- //
- // The map value indicates whether to load tests. If true, Load
- // will add and type-check two lists of files to the package:
- // non-test files followed by in-package *_test.go files. In
- // addition, it will append the external test package (if any)
- // to Program.Created.
- ImportPkgs map[string]bool
-
- // FindPackage is called during Load to create the build.Package
- // for a given import path from a given directory.
- // If FindPackage is nil, (*build.Context).Import is used.
- // A client may use this hook to adapt to a proprietary build
- // system that does not follow the "go build" layout
- // conventions, for example.
- //
- // It must be safe to call concurrently from multiple goroutines.
- FindPackage func(ctxt *build.Context, importPath, fromDir string, mode build.ImportMode) (*build.Package, error)
-
- // AfterTypeCheck is called immediately after a list of files
- // has been type-checked and appended to info.Files.
- //
- // This optional hook function is the earliest opportunity for
- // the client to observe the output of the type checker,
- // which may be useful to reduce analysis latency when loading
- // a large program.
- //
- // The function is permitted to modify info.Info, for instance
- // to clear data structures that are no longer needed, which can
- // dramatically reduce peak memory consumption.
- //
- // The function may be called twice for the same PackageInfo:
- // once for the files of the package and again for the
- // in-package test files.
- //
- // It must be safe to call concurrently from multiple goroutines.
- AfterTypeCheck func(info *PackageInfo, files []*ast.File)
-}
-
-// A PkgSpec specifies a non-importable package to be created by Load.
-// Files are processed first, but typically only one of Files and
-// Filenames is provided. The path needn't be globally unique.
-//
-// For vendoring purposes, the package's directory is the one that
-// contains the first file.
-type PkgSpec struct {
- Path string // package path ("" => use package declaration)
- Files []*ast.File // ASTs of already-parsed files
- Filenames []string // names of files to be parsed
-}
-
-// A Program is a Go program loaded from source as specified by a Config.
-type Program struct {
- Fset *token.FileSet // the file set for this program
-
- // Created[i] contains the initial package whose ASTs or
- // filenames were supplied by Config.CreatePkgs[i], followed by
- // the external test package, if any, of each package in
- // Config.ImportPkgs ordered by ImportPath.
- //
- // NOTE: these files must not import "C". Cgo preprocessing is
- // only performed on imported packages, not ad hoc packages.
- //
- // TODO(adonovan): we need to copy and adapt the logic of
- // goFilesPackage (from $GOROOT/src/cmd/go/build.go) and make
- // Config.Import and Config.Create methods return the same kind
- // of entity, essentially a build.Package.
- // Perhaps we can even reuse that type directly.
- Created []*PackageInfo
-
- // Imported contains the initially imported packages,
- // as specified by Config.ImportPkgs.
- Imported map[string]*PackageInfo
-
- // AllPackages contains the PackageInfo of every package
- // encountered by Load: all initial packages and all
- // dependencies, including incomplete ones.
- AllPackages map[*types.Package]*PackageInfo
-
- // importMap is the canonical mapping of package paths to
- // packages. It contains all Imported initial packages, but not
- // Created ones, and all imported dependencies.
- importMap map[string]*types.Package
-}
-
-// PackageInfo holds the ASTs and facts derived by the type-checker
-// for a single package.
-//
-// Not mutated once exposed via the API.
-//
-type PackageInfo struct {
- Pkg *types.Package
- Importable bool // true if 'import "Pkg.Path()"' would resolve to this
- TransitivelyErrorFree bool // true if Pkg and all its dependencies are free of errors
- Files []*ast.File // syntax trees for the package's files
- Errors []error // non-nil if the package had errors
- types.Info // type-checker deductions.
- dir string // package directory
-
- checker *types.Checker // transient type-checker state
- errorFunc func(error)
-}
-
-func (info *PackageInfo) String() string { return info.Pkg.Path() }
-
-func (info *PackageInfo) appendError(err error) {
- if info.errorFunc != nil {
- info.errorFunc(err)
- } else {
- fmt.Fprintln(os.Stderr, err)
- }
- info.Errors = append(info.Errors, err)
-}
-
-func (conf *Config) fset() *token.FileSet {
- if conf.Fset == nil {
- conf.Fset = token.NewFileSet()
- }
- return conf.Fset
-}
-
-// ParseFile is a convenience function (intended for testing) that invokes
-// the parser using the Config's FileSet, which is initialized if nil.
-//
-// src specifies the parser input as a string, []byte, or io.Reader, and
-// filename is its apparent name. If src is nil, the contents of
-// filename are read from the file system.
-//
-func (conf *Config) ParseFile(filename string, src interface{}) (*ast.File, error) {
- // TODO(adonovan): use conf.build() etc like parseFiles does.
- return parser.ParseFile(conf.fset(), filename, src, conf.ParserMode)
-}
-
-// FromArgsUsage is a partial usage message that applications calling
-// FromArgs may wish to include in their -help output.
-const FromArgsUsage = `
- is a list of arguments denoting a set of initial packages.
-It may take one of two forms:
-
-1. A list of *.go source files.
-
- All of the specified files are loaded, parsed and type-checked
- as a single package. All the files must belong to the same directory.
-
-2. A list of import paths, each denoting a package.
-
- The package's directory is found relative to the $GOROOT and
- $GOPATH using similar logic to 'go build', and the *.go files in
- that directory are loaded, parsed and type-checked as a single
- package.
-
- In addition, all *_test.go files in the directory are then loaded
- and parsed. Those files whose package declaration equals that of
- the non-*_test.go files are included in the primary package. Test
- files whose package declaration ends with "_test" are type-checked
- as another package, the 'external' test package, so that a single
- import path may denote two packages. (Whether this behaviour is
- enabled is tool-specific, and may depend on additional flags.)
-
-A '--' argument terminates the list of packages.
-`
-
-// FromArgs interprets args as a set of initial packages to load from
-// source and updates the configuration. It returns the list of
-// unconsumed arguments.
-//
-// It is intended for use in command-line interfaces that require a
-// set of initial packages to be specified; see FromArgsUsage message
-// for details.
-//
-// Only superficial errors are reported at this stage; errors dependent
-// on I/O are detected during Load.
-//
-func (conf *Config) FromArgs(args []string, xtest bool) ([]string, error) {
- var rest []string
- for i, arg := range args {
- if arg == "--" {
- rest = args[i+1:]
- args = args[:i]
- break // consume "--" and return the remaining args
- }
- }
-
- if len(args) > 0 && strings.HasSuffix(args[0], ".go") {
- // Assume args is a list of a *.go files
- // denoting a single ad hoc package.
- for _, arg := range args {
- if !strings.HasSuffix(arg, ".go") {
- return nil, fmt.Errorf("named files must be .go files: %s", arg)
- }
- }
- conf.CreateFromFilenames("", args...)
- } else {
- // Assume args are directories each denoting a
- // package and (perhaps) an external test, iff xtest.
- for _, arg := range args {
- if xtest {
- conf.ImportWithTests(arg)
- } else {
- conf.Import(arg)
- }
- }
- }
-
- return rest, nil
-}
-
-// CreateFromFilenames is a convenience function that adds
-// a conf.CreatePkgs entry to create a package of the specified *.go
-// files.
-//
-func (conf *Config) CreateFromFilenames(path string, filenames ...string) {
- conf.CreatePkgs = append(conf.CreatePkgs, PkgSpec{Path: path, Filenames: filenames})
-}
-
-// CreateFromFiles is a convenience function that adds a conf.CreatePkgs
-// entry to create package of the specified path and parsed files.
-//
-func (conf *Config) CreateFromFiles(path string, files ...*ast.File) {
- conf.CreatePkgs = append(conf.CreatePkgs, PkgSpec{Path: path, Files: files})
-}
-
-// ImportWithTests is a convenience function that adds path to
-// ImportPkgs, the set of initial source packages located relative to
-// $GOPATH. The package will be augmented by any *_test.go files in
-// its directory that contain a "package x" (not "package x_test")
-// declaration.
-//
-// In addition, if any *_test.go files contain a "package x_test"
-// declaration, an additional package comprising just those files will
-// be added to CreatePkgs.
-//
-func (conf *Config) ImportWithTests(path string) { conf.addImport(path, true) }
-
-// Import is a convenience function that adds path to ImportPkgs, the
-// set of initial packages that will be imported from source.
-//
-func (conf *Config) Import(path string) { conf.addImport(path, false) }
-
-func (conf *Config) addImport(path string, tests bool) {
- if path == "C" {
- return // ignore; not a real package
- }
- if conf.ImportPkgs == nil {
- conf.ImportPkgs = make(map[string]bool)
- }
- conf.ImportPkgs[path] = conf.ImportPkgs[path] || tests
-}
-
-// PathEnclosingInterval returns the PackageInfo and ast.Node that
-// contain source interval [start, end), and all the node's ancestors
-// up to the AST root. It searches all ast.Files of all packages in prog.
-// exact is defined as for astutil.PathEnclosingInterval.
-//
-// The zero value is returned if not found.
-//
-func (prog *Program) PathEnclosingInterval(start, end token.Pos) (pkg *PackageInfo, path []ast.Node, exact bool) {
- for _, info := range prog.AllPackages {
- for _, f := range info.Files {
- if f.Pos() == token.NoPos {
- // This can happen if the parser saw
- // too many errors and bailed out.
- // (Use parser.AllErrors to prevent that.)
- continue
- }
- if !tokenFileContainsPos(prog.Fset.File(f.Pos()), start) {
- continue
- }
- if path, exact := astutil.PathEnclosingInterval(f, start, end); path != nil {
- return info, path, exact
- }
- }
- }
- return nil, nil, false
-}
-
-// InitialPackages returns a new slice containing the set of initial
-// packages (Created + Imported) in unspecified order.
-//
-func (prog *Program) InitialPackages() []*PackageInfo {
- infos := make([]*PackageInfo, 0, len(prog.Created)+len(prog.Imported))
- infos = append(infos, prog.Created...)
- for _, info := range prog.Imported {
- infos = append(infos, info)
- }
- return infos
-}
-
-// Package returns the ASTs and results of type checking for the
-// specified package.
-func (prog *Program) Package(path string) *PackageInfo {
- if info, ok := prog.AllPackages[prog.importMap[path]]; ok {
- return info
- }
- for _, info := range prog.Created {
- if path == info.Pkg.Path() {
- return info
- }
- }
- return nil
-}
-
-// ---------- Implementation ----------
-
-// importer holds the working state of the algorithm.
-type importer struct {
- conf *Config // the client configuration
- start time.Time // for logging
-
- progMu sync.Mutex // guards prog
- prog *Program // the resulting program
-
- // findpkg is a memoization of FindPackage.
- findpkgMu sync.Mutex // guards findpkg
- findpkg map[findpkgKey]*findpkgValue
-
- importedMu sync.Mutex // guards imported
- imported map[string]*importInfo // all imported packages (incl. failures) by import path
-
- // import dependency graph: graph[x][y] => x imports y
- //
- // Since non-importable packages cannot be cyclic, we ignore
- // their imports, thus we only need the subgraph over importable
- // packages. Nodes are identified by their import paths.
- graphMu sync.Mutex
- graph map[string]map[string]bool
-}
-
-type findpkgKey struct {
- importPath string
- fromDir string
- mode build.ImportMode
-}
-
-type findpkgValue struct {
- ready chan struct{} // closed to broadcast readiness
- bp *build.Package
- err error
-}
-
-// importInfo tracks the success or failure of a single import.
-//
-// Upon completion, exactly one of info and err is non-nil:
-// info on successful creation of a package, err otherwise.
-// A successful package may still contain type errors.
-//
-type importInfo struct {
- path string // import path
- info *PackageInfo // results of typechecking (including errors)
- complete chan struct{} // closed to broadcast that info is set.
-}
-
-// awaitCompletion blocks until ii is complete,
-// i.e. the info field is safe to inspect.
-func (ii *importInfo) awaitCompletion() {
- <-ii.complete // wait for close
-}
-
-// Complete marks ii as complete.
-// Its info and err fields will not be subsequently updated.
-func (ii *importInfo) Complete(info *PackageInfo) {
- if info == nil {
- panic("info == nil")
- }
- ii.info = info
- close(ii.complete)
-}
-
-type importError struct {
- path string // import path
- err error // reason for failure to create a package
-}
-
-// Load creates the initial packages specified by conf.{Create,Import}Pkgs,
-// loading their dependencies packages as needed.
-//
-// On success, Load returns a Program containing a PackageInfo for
-// each package. On failure, it returns an error.
-//
-// If AllowErrors is true, Load will return a Program even if some
-// packages contained I/O, parser or type errors, or if dependencies
-// were missing. (Such errors are accessible via PackageInfo.Errors. If
-// false, Load will fail if any package had an error.
-//
-// It is an error if no packages were loaded.
-//
-func (conf *Config) Load() (*Program, error) {
- // Create a simple default error handler for parse/type errors.
- if conf.TypeChecker.Error == nil {
- conf.TypeChecker.Error = func(e error) { fmt.Fprintln(os.Stderr, e) }
- }
-
- // Set default working directory for relative package references.
- if conf.Cwd == "" {
- var err error
- conf.Cwd, err = os.Getwd()
- if err != nil {
- return nil, err
- }
- }
-
- // Install default FindPackage hook using go/build logic.
- if conf.FindPackage == nil {
- conf.FindPackage = (*build.Context).Import
- }
-
- prog := &Program{
- Fset: conf.fset(),
- Imported: make(map[string]*PackageInfo),
- importMap: make(map[string]*types.Package),
- AllPackages: make(map[*types.Package]*PackageInfo),
- }
-
- imp := importer{
- conf: conf,
- prog: prog,
- findpkg: make(map[findpkgKey]*findpkgValue),
- imported: make(map[string]*importInfo),
- start: time.Now(),
- graph: make(map[string]map[string]bool),
- }
-
- // -- loading proper (concurrent phase) --------------------------------
-
- var errpkgs []string // packages that contained errors
-
- // Load the initially imported packages and their dependencies,
- // in parallel.
- // No vendor check on packages imported from the command line.
- infos, importErrors := imp.importAll("", conf.Cwd, conf.ImportPkgs, ignoreVendor)
- for _, ie := range importErrors {
- conf.TypeChecker.Error(ie.err) // failed to create package
- errpkgs = append(errpkgs, ie.path)
- }
- for _, info := range infos {
- prog.Imported[info.Pkg.Path()] = info
- }
-
- // Augment the designated initial packages by their tests.
- // Dependencies are loaded in parallel.
- var xtestPkgs []*build.Package
- for importPath, augment := range conf.ImportPkgs {
- if !augment {
- continue
- }
-
- // No vendor check on packages imported from command line.
- bp, err := imp.findPackage(importPath, conf.Cwd, ignoreVendor)
- if err != nil {
- // Package not found, or can't even parse package declaration.
- // Already reported by previous loop; ignore it.
- continue
- }
-
- // Needs external test package?
- if len(bp.XTestGoFiles) > 0 {
- xtestPkgs = append(xtestPkgs, bp)
- }
-
- // Consult the cache using the canonical package path.
- path := bp.ImportPath
- imp.importedMu.Lock() // (unnecessary, we're sequential here)
- ii, ok := imp.imported[path]
- // Paranoid checks added due to issue #11012.
- if !ok {
- // Unreachable.
- // The previous loop called importAll and thus
- // startLoad for each path in ImportPkgs, which
- // populates imp.imported[path] with a non-zero value.
- panic(fmt.Sprintf("imported[%q] not found", path))
- }
- if ii == nil {
- // Unreachable.
- // The ii values in this loop are the same as in
- // the previous loop, which enforced the invariant
- // that at least one of ii.err and ii.info is non-nil.
- panic(fmt.Sprintf("imported[%q] == nil", path))
- }
- if ii.info == nil {
- // Unreachable.
- // awaitCompletion has the postcondition
- // ii.info != nil.
- panic(fmt.Sprintf("imported[%q].info = nil", path))
- }
- info := ii.info
- imp.importedMu.Unlock()
-
- // Parse the in-package test files.
- files, errs := imp.conf.parsePackageFiles(bp, 't')
- for _, err := range errs {
- info.appendError(err)
- }
-
- // The test files augmenting package P cannot be imported,
- // but may import packages that import P,
- // so we must disable the cycle check.
- imp.addFiles(info, files, false)
- }
-
- createPkg := func(path, dir string, files []*ast.File, errs []error) {
- info := imp.newPackageInfo(path, dir)
- for _, err := range errs {
- info.appendError(err)
- }
-
- // Ad hoc packages are non-importable,
- // so no cycle check is needed.
- // addFiles loads dependencies in parallel.
- imp.addFiles(info, files, false)
- prog.Created = append(prog.Created, info)
- }
-
- // Create packages specified by conf.CreatePkgs.
- for _, cp := range conf.CreatePkgs {
- files, errs := parseFiles(conf.fset(), conf.build(), nil, conf.Cwd, cp.Filenames, conf.ParserMode)
- files = append(files, cp.Files...)
-
- path := cp.Path
- if path == "" {
- if len(files) > 0 {
- path = files[0].Name.Name
- } else {
- path = "(unnamed)"
- }
- }
-
- dir := conf.Cwd
- if len(files) > 0 && files[0].Pos().IsValid() {
- dir = filepath.Dir(conf.fset().File(files[0].Pos()).Name())
- }
- createPkg(path, dir, files, errs)
- }
-
- // Create external test packages.
- sort.Sort(byImportPath(xtestPkgs))
- for _, bp := range xtestPkgs {
- files, errs := imp.conf.parsePackageFiles(bp, 'x')
- createPkg(bp.ImportPath+"_test", bp.Dir, files, errs)
- }
-
- // -- finishing up (sequential) ----------------------------------------
-
- if len(prog.Imported)+len(prog.Created) == 0 {
- return nil, errors.New("no initial packages were loaded")
- }
-
- // Create infos for indirectly imported packages.
- // e.g. incomplete packages without syntax, loaded from export data.
- for _, obj := range prog.importMap {
- info := prog.AllPackages[obj]
- if info == nil {
- prog.AllPackages[obj] = &PackageInfo{Pkg: obj, Importable: true}
- } else {
- // finished
- info.checker = nil
- info.errorFunc = nil
- }
- }
-
- if !conf.AllowErrors {
- // Report errors in indirectly imported packages.
- for _, info := range prog.AllPackages {
- if len(info.Errors) > 0 {
- errpkgs = append(errpkgs, info.Pkg.Path())
- }
- }
- if errpkgs != nil {
- var more string
- if len(errpkgs) > 3 {
- more = fmt.Sprintf(" and %d more", len(errpkgs)-3)
- errpkgs = errpkgs[:3]
- }
- return nil, fmt.Errorf("couldn't load packages due to errors: %s%s",
- strings.Join(errpkgs, ", "), more)
- }
- }
-
- markErrorFreePackages(prog.AllPackages)
-
- return prog, nil
-}
-
-type byImportPath []*build.Package
-
-func (b byImportPath) Len() int { return len(b) }
-func (b byImportPath) Less(i, j int) bool { return b[i].ImportPath < b[j].ImportPath }
-func (b byImportPath) Swap(i, j int) { b[i], b[j] = b[j], b[i] }
-
-// markErrorFreePackages sets the TransitivelyErrorFree flag on all
-// applicable packages.
-func markErrorFreePackages(allPackages map[*types.Package]*PackageInfo) {
- // Build the transpose of the import graph.
- importedBy := make(map[*types.Package]map[*types.Package]bool)
- for P := range allPackages {
- for _, Q := range P.Imports() {
- clients, ok := importedBy[Q]
- if !ok {
- clients = make(map[*types.Package]bool)
- importedBy[Q] = clients
- }
- clients[P] = true
- }
- }
-
- // Find all packages reachable from some error package.
- reachable := make(map[*types.Package]bool)
- var visit func(*types.Package)
- visit = func(p *types.Package) {
- if !reachable[p] {
- reachable[p] = true
- for q := range importedBy[p] {
- visit(q)
- }
- }
- }
- for _, info := range allPackages {
- if len(info.Errors) > 0 {
- visit(info.Pkg)
- }
- }
-
- // Mark the others as "transitively error-free".
- for _, info := range allPackages {
- if !reachable[info.Pkg] {
- info.TransitivelyErrorFree = true
- }
- }
-}
-
-// build returns the effective build context.
-func (conf *Config) build() *build.Context {
- if conf.Build != nil {
- return conf.Build
- }
- return &build.Default
-}
-
-// parsePackageFiles enumerates the files belonging to package path,
-// then loads, parses and returns them, plus a list of I/O or parse
-// errors that were encountered.
-//
-// 'which' indicates which files to include:
-// 'g': include non-test *.go source files (GoFiles + processed CgoFiles)
-// 't': include in-package *_test.go source files (TestGoFiles)
-// 'x': include external *_test.go source files. (XTestGoFiles)
-//
-func (conf *Config) parsePackageFiles(bp *build.Package, which rune) ([]*ast.File, []error) {
- if bp.ImportPath == "unsafe" {
- return nil, nil
- }
- var filenames []string
- switch which {
- case 'g':
- filenames = bp.GoFiles
- case 't':
- filenames = bp.TestGoFiles
- case 'x':
- filenames = bp.XTestGoFiles
- default:
- panic(which)
- }
-
- files, errs := parseFiles(conf.fset(), conf.build(), conf.DisplayPath, bp.Dir, filenames, conf.ParserMode)
-
- // Preprocess CgoFiles and parse the outputs (sequentially).
- if which == 'g' && bp.CgoFiles != nil {
- cgofiles, err := processCgoFiles(bp, conf.fset(), conf.DisplayPath, conf.ParserMode)
- if err != nil {
- errs = append(errs, err)
- } else {
- files = append(files, cgofiles...)
- }
- }
-
- return files, errs
-}
-
-// doImport imports the package denoted by path.
-// It implements the types.Importer signature.
-//
-// It returns an error if a package could not be created
-// (e.g. go/build or parse error), but type errors are reported via
-// the types.Config.Error callback (the first of which is also saved
-// in the package's PackageInfo).
-//
-// Idempotent.
-//
-func (imp *importer) doImport(from *PackageInfo, to string) (*types.Package, error) {
- if to == "C" {
- // This should be unreachable, but ad hoc packages are
- // not currently subject to cgo preprocessing.
- // See https://github.com/golang/go/issues/11627.
- return nil, fmt.Errorf(`the loader doesn't cgo-process ad hoc packages like %q; see Go issue 11627`,
- from.Pkg.Path())
- }
-
- bp, err := imp.findPackage(to, from.dir, 0)
- if err != nil {
- return nil, err
- }
-
- // The standard unsafe package is handled specially,
- // and has no PackageInfo.
- if bp.ImportPath == "unsafe" {
- return types.Unsafe, nil
- }
-
- // Look for the package in the cache using its canonical path.
- path := bp.ImportPath
- imp.importedMu.Lock()
- ii := imp.imported[path]
- imp.importedMu.Unlock()
- if ii == nil {
- panic("internal error: unexpected import: " + path)
- }
- if ii.info != nil {
- return ii.info.Pkg, nil
- }
-
- // Import of incomplete package: this indicates a cycle.
- fromPath := from.Pkg.Path()
- if cycle := imp.findPath(path, fromPath); cycle != nil {
- cycle = append([]string{fromPath}, cycle...)
- return nil, fmt.Errorf("import cycle: %s", strings.Join(cycle, " -> "))
- }
-
- panic("internal error: import of incomplete (yet acyclic) package: " + fromPath)
-}
-
-// findPackage locates the package denoted by the importPath in the
-// specified directory.
-func (imp *importer) findPackage(importPath, fromDir string, mode build.ImportMode) (*build.Package, error) {
- // We use a non-blocking duplicate-suppressing cache (gopl.io §9.7)
- // to avoid holding the lock around FindPackage.
- key := findpkgKey{importPath, fromDir, mode}
- imp.findpkgMu.Lock()
- v, ok := imp.findpkg[key]
- if ok {
- // cache hit
- imp.findpkgMu.Unlock()
-
- <-v.ready // wait for entry to become ready
- } else {
- // Cache miss: this goroutine becomes responsible for
- // populating the map entry and broadcasting its readiness.
- v = &findpkgValue{ready: make(chan struct{})}
- imp.findpkg[key] = v
- imp.findpkgMu.Unlock()
-
- ioLimit <- true
- v.bp, v.err = imp.conf.FindPackage(imp.conf.build(), importPath, fromDir, mode)
- <-ioLimit
-
- if _, ok := v.err.(*build.NoGoError); ok {
- v.err = nil // empty directory is not an error
- }
-
- close(v.ready) // broadcast ready condition
- }
- return v.bp, v.err
-}
-
-// importAll loads, parses, and type-checks the specified packages in
-// parallel and returns their completed importInfos in unspecified order.
-//
-// fromPath is the package path of the importing package, if it is
-// importable, "" otherwise. It is used for cycle detection.
-//
-// fromDir is the directory containing the import declaration that
-// caused these imports.
-//
-func (imp *importer) importAll(fromPath, fromDir string, imports map[string]bool, mode build.ImportMode) (infos []*PackageInfo, errors []importError) {
- // TODO(adonovan): opt: do the loop in parallel once
- // findPackage is non-blocking.
- var pending []*importInfo
- for importPath := range imports {
- bp, err := imp.findPackage(importPath, fromDir, mode)
- if err != nil {
- errors = append(errors, importError{
- path: importPath,
- err: err,
- })
- continue
- }
- pending = append(pending, imp.startLoad(bp))
- }
-
- if fromPath != "" {
- // We're loading a set of imports.
- //
- // We must record graph edges from the importing package
- // to its dependencies, and check for cycles.
- imp.graphMu.Lock()
- deps, ok := imp.graph[fromPath]
- if !ok {
- deps = make(map[string]bool)
- imp.graph[fromPath] = deps
- }
- for _, ii := range pending {
- deps[ii.path] = true
- }
- imp.graphMu.Unlock()
- }
-
- for _, ii := range pending {
- if fromPath != "" {
- if cycle := imp.findPath(ii.path, fromPath); cycle != nil {
- // Cycle-forming import: we must not await its
- // completion since it would deadlock.
- //
- // We don't record the error in ii since
- // the error is really associated with the
- // cycle-forming edge, not the package itself.
- // (Also it would complicate the
- // invariants of importPath completion.)
- if trace {
- fmt.Fprintf(os.Stderr, "import cycle: %q\n", cycle)
- }
- continue
- }
- }
- ii.awaitCompletion()
- infos = append(infos, ii.info)
- }
-
- return infos, errors
-}
-
-// findPath returns an arbitrary path from 'from' to 'to' in the import
-// graph, or nil if there was none.
-func (imp *importer) findPath(from, to string) []string {
- imp.graphMu.Lock()
- defer imp.graphMu.Unlock()
-
- seen := make(map[string]bool)
- var search func(stack []string, importPath string) []string
- search = func(stack []string, importPath string) []string {
- if !seen[importPath] {
- seen[importPath] = true
- stack = append(stack, importPath)
- if importPath == to {
- return stack
- }
- for x := range imp.graph[importPath] {
- if p := search(stack, x); p != nil {
- return p
- }
- }
- }
- return nil
- }
- return search(make([]string, 0, 20), from)
-}
-
-// startLoad initiates the loading, parsing and type-checking of the
-// specified package and its dependencies, if it has not already begun.
-//
-// It returns an importInfo, not necessarily in a completed state. The
-// caller must call awaitCompletion() before accessing its info field.
-//
-// startLoad is concurrency-safe and idempotent.
-//
-func (imp *importer) startLoad(bp *build.Package) *importInfo {
- path := bp.ImportPath
- imp.importedMu.Lock()
- ii, ok := imp.imported[path]
- if !ok {
- ii = &importInfo{path: path, complete: make(chan struct{})}
- imp.imported[path] = ii
- go func() {
- info := imp.load(bp)
- ii.Complete(info)
- }()
- }
- imp.importedMu.Unlock()
-
- return ii
-}
-
-// load implements package loading by parsing Go source files
-// located by go/build.
-func (imp *importer) load(bp *build.Package) *PackageInfo {
- info := imp.newPackageInfo(bp.ImportPath, bp.Dir)
- info.Importable = true
- files, errs := imp.conf.parsePackageFiles(bp, 'g')
- for _, err := range errs {
- info.appendError(err)
- }
-
- imp.addFiles(info, files, true)
-
- imp.progMu.Lock()
- imp.prog.importMap[bp.ImportPath] = info.Pkg
- imp.progMu.Unlock()
-
- return info
-}
-
-// addFiles adds and type-checks the specified files to info, loading
-// their dependencies if needed. The order of files determines the
-// package initialization order. It may be called multiple times on the
-// same package. Errors are appended to the info.Errors field.
-//
-// cycleCheck determines whether the imports within files create
-// dependency edges that should be checked for potential cycles.
-//
-func (imp *importer) addFiles(info *PackageInfo, files []*ast.File, cycleCheck bool) {
- // Ensure the dependencies are loaded, in parallel.
- var fromPath string
- if cycleCheck {
- fromPath = info.Pkg.Path()
- }
- // TODO(adonovan): opt: make the caller do scanImports.
- // Callers with a build.Package can skip it.
- imp.importAll(fromPath, info.dir, scanImports(files), 0)
-
- if trace {
- fmt.Fprintf(os.Stderr, "%s: start %q (%d)\n",
- time.Since(imp.start), info.Pkg.Path(), len(files))
- }
-
- // Don't call checker.Files on Unsafe, even with zero files,
- // because it would mutate the package, which is a global.
- if info.Pkg == types.Unsafe {
- if len(files) > 0 {
- panic(`"unsafe" package contains unexpected files`)
- }
- } else {
- // Ignore the returned (first) error since we
- // already collect them all in the PackageInfo.
- info.checker.Files(files)
- info.Files = append(info.Files, files...)
- }
-
- if imp.conf.AfterTypeCheck != nil {
- imp.conf.AfterTypeCheck(info, files)
- }
-
- if trace {
- fmt.Fprintf(os.Stderr, "%s: stop %q\n",
- time.Since(imp.start), info.Pkg.Path())
- }
-}
-
-func (imp *importer) newPackageInfo(path, dir string) *PackageInfo {
- var pkg *types.Package
- if path == "unsafe" {
- pkg = types.Unsafe
- } else {
- pkg = types.NewPackage(path, "")
- }
- info := &PackageInfo{
- Pkg: pkg,
- Info: types.Info{
- Types: make(map[ast.Expr]types.TypeAndValue),
- Defs: make(map[*ast.Ident]types.Object),
- Uses: make(map[*ast.Ident]types.Object),
- Implicits: make(map[ast.Node]types.Object),
- Scopes: make(map[ast.Node]*types.Scope),
- Selections: make(map[*ast.SelectorExpr]*types.Selection),
- },
- errorFunc: imp.conf.TypeChecker.Error,
- dir: dir,
- }
-
- // Copy the types.Config so we can vary it across PackageInfos.
- tc := imp.conf.TypeChecker
- tc.IgnoreFuncBodies = false
- if f := imp.conf.TypeCheckFuncBodies; f != nil {
- tc.IgnoreFuncBodies = !f(path)
- }
- tc.Importer = closure{imp, info}
- tc.Error = info.appendError // appendError wraps the user's Error function
-
- info.checker = types.NewChecker(&tc, imp.conf.fset(), pkg, &info.Info)
- imp.progMu.Lock()
- imp.prog.AllPackages[pkg] = info
- imp.progMu.Unlock()
- return info
-}
-
-type closure struct {
- imp *importer
- info *PackageInfo
-}
-
-func (c closure) Import(to string) (*types.Package, error) { return c.imp.doImport(c.info, to) }
diff --git a/vendor/golang.org/x/tools/go/loader/loader_test.go b/vendor/golang.org/x/tools/go/loader/loader_test.go
deleted file mode 100644
index 02630eb..0000000
--- a/vendor/golang.org/x/tools/go/loader/loader_test.go
+++ /dev/null
@@ -1,816 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// No testdata on Android.
-
-// +build !android
-
-package loader_test
-
-import (
- "fmt"
- "go/build"
- "go/constant"
- "go/types"
- "path/filepath"
- "reflect"
- "sort"
- "strings"
- "sync"
- "testing"
-
- "golang.org/x/tools/go/buildutil"
- "golang.org/x/tools/go/loader"
-)
-
-// TestFromArgs checks that conf.FromArgs populates conf correctly.
-// It does no I/O.
-func TestFromArgs(t *testing.T) {
- type result struct {
- Err string
- Rest []string
- ImportPkgs map[string]bool
- CreatePkgs []loader.PkgSpec
- }
- for _, test := range []struct {
- args []string
- tests bool
- want result
- }{
- // Mix of existing and non-existent packages.
- {
- args: []string{"nosuchpkg", "errors"},
- want: result{
- ImportPkgs: map[string]bool{"errors": false, "nosuchpkg": false},
- },
- },
- // Same, with -test flag.
- {
- args: []string{"nosuchpkg", "errors"},
- tests: true,
- want: result{
- ImportPkgs: map[string]bool{"errors": true, "nosuchpkg": true},
- },
- },
- // Surplus arguments.
- {
- args: []string{"fmt", "errors", "--", "surplus"},
- want: result{
- Rest: []string{"surplus"},
- ImportPkgs: map[string]bool{"errors": false, "fmt": false},
- },
- },
- // Ad hoc package specified as *.go files.
- {
- args: []string{"foo.go", "bar.go"},
- want: result{CreatePkgs: []loader.PkgSpec{{
- Filenames: []string{"foo.go", "bar.go"},
- }}},
- },
- // Mixture of *.go and import paths.
- {
- args: []string{"foo.go", "fmt"},
- want: result{
- Err: "named files must be .go files: fmt",
- },
- },
- } {
- var conf loader.Config
- rest, err := conf.FromArgs(test.args, test.tests)
- got := result{
- Rest: rest,
- ImportPkgs: conf.ImportPkgs,
- CreatePkgs: conf.CreatePkgs,
- }
- if err != nil {
- got.Err = err.Error()
- }
- if !reflect.DeepEqual(got, test.want) {
- t.Errorf("FromArgs(%q) = %+v, want %+v", test.args, got, test.want)
- }
- }
-}
-
-func TestLoad_NoInitialPackages(t *testing.T) {
- var conf loader.Config
-
- const wantErr = "no initial packages were loaded"
-
- prog, err := conf.Load()
- if err == nil {
- t.Errorf("Load succeeded unexpectedly, want %q", wantErr)
- } else if err.Error() != wantErr {
- t.Errorf("Load failed with wrong error %q, want %q", err, wantErr)
- }
- if prog != nil {
- t.Errorf("Load unexpectedly returned a Program")
- }
-}
-
-func TestLoad_MissingInitialPackage(t *testing.T) {
- var conf loader.Config
- conf.Import("nosuchpkg")
- conf.Import("errors")
-
- const wantErr = "couldn't load packages due to errors: nosuchpkg"
-
- prog, err := conf.Load()
- if err == nil {
- t.Errorf("Load succeeded unexpectedly, want %q", wantErr)
- } else if err.Error() != wantErr {
- t.Errorf("Load failed with wrong error %q, want %q", err, wantErr)
- }
- if prog != nil {
- t.Errorf("Load unexpectedly returned a Program")
- }
-}
-
-func TestLoad_MissingInitialPackage_AllowErrors(t *testing.T) {
- var conf loader.Config
- conf.AllowErrors = true
- conf.Import("nosuchpkg")
- conf.ImportWithTests("errors")
-
- prog, err := conf.Load()
- if err != nil {
- t.Errorf("Load failed unexpectedly: %v", err)
- }
- if prog == nil {
- t.Fatalf("Load returned a nil Program")
- }
- if got, want := created(prog), "errors_test"; got != want {
- t.Errorf("Created = %s, want %s", got, want)
- }
- if got, want := imported(prog), "errors"; got != want {
- t.Errorf("Imported = %s, want %s", got, want)
- }
-}
-
-func TestCreateUnnamedPackage(t *testing.T) {
- var conf loader.Config
- conf.CreateFromFilenames("")
- prog, err := conf.Load()
- if err != nil {
- t.Fatalf("Load failed: %v", err)
- }
- if got, want := fmt.Sprint(prog.InitialPackages()), "[(unnamed)]"; got != want {
- t.Errorf("InitialPackages = %s, want %s", got, want)
- }
-}
-
-func TestLoad_MissingFileInCreatedPackage(t *testing.T) {
- var conf loader.Config
- conf.CreateFromFilenames("", "missing.go")
-
- const wantErr = "couldn't load packages due to errors: (unnamed)"
-
- prog, err := conf.Load()
- if prog != nil {
- t.Errorf("Load unexpectedly returned a Program")
- }
- if err == nil {
- t.Fatalf("Load succeeded unexpectedly, want %q", wantErr)
- }
- if err.Error() != wantErr {
- t.Fatalf("Load failed with wrong error %q, want %q", err, wantErr)
- }
-}
-
-func TestLoad_MissingFileInCreatedPackage_AllowErrors(t *testing.T) {
- conf := loader.Config{AllowErrors: true}
- conf.CreateFromFilenames("", "missing.go")
-
- prog, err := conf.Load()
- if err != nil {
- t.Errorf("Load failed: %v", err)
- }
- if got, want := fmt.Sprint(prog.InitialPackages()), "[(unnamed)]"; got != want {
- t.Fatalf("InitialPackages = %s, want %s", got, want)
- }
-}
-
-func TestLoad_ParseError(t *testing.T) {
- var conf loader.Config
- conf.CreateFromFilenames("badpkg", "testdata/badpkgdecl.go")
-
- const wantErr = "couldn't load packages due to errors: badpkg"
-
- prog, err := conf.Load()
- if prog != nil {
- t.Errorf("Load unexpectedly returned a Program")
- }
- if err == nil {
- t.Fatalf("Load succeeded unexpectedly, want %q", wantErr)
- }
- if err.Error() != wantErr {
- t.Fatalf("Load failed with wrong error %q, want %q", err, wantErr)
- }
-}
-
-func TestLoad_ParseError_AllowErrors(t *testing.T) {
- var conf loader.Config
- conf.AllowErrors = true
- conf.CreateFromFilenames("badpkg", "testdata/badpkgdecl.go")
-
- prog, err := conf.Load()
- if err != nil {
- t.Errorf("Load failed unexpectedly: %v", err)
- }
- if prog == nil {
- t.Fatalf("Load returned a nil Program")
- }
- if got, want := created(prog), "badpkg"; got != want {
- t.Errorf("Created = %s, want %s", got, want)
- }
-
- badpkg := prog.Created[0]
- if len(badpkg.Files) != 1 {
- t.Errorf("badpkg has %d files, want 1", len(badpkg.Files))
- }
- wantErr := filepath.Join("testdata", "badpkgdecl.go") + ":1:34: expected 'package', found 'EOF'"
- if !hasError(badpkg.Errors, wantErr) {
- t.Errorf("badpkg.Errors = %v, want %s", badpkg.Errors, wantErr)
- }
-}
-
-func TestLoad_FromSource_Success(t *testing.T) {
- var conf loader.Config
- conf.CreateFromFilenames("P", "testdata/a.go", "testdata/b.go")
-
- prog, err := conf.Load()
- if err != nil {
- t.Errorf("Load failed unexpectedly: %v", err)
- }
- if prog == nil {
- t.Fatalf("Load returned a nil Program")
- }
- if got, want := created(prog), "P"; got != want {
- t.Errorf("Created = %s, want %s", got, want)
- }
-}
-
-func TestLoad_FromImports_Success(t *testing.T) {
- var conf loader.Config
- conf.ImportWithTests("fmt")
- conf.ImportWithTests("errors")
-
- prog, err := conf.Load()
- if err != nil {
- t.Errorf("Load failed unexpectedly: %v", err)
- }
- if prog == nil {
- t.Fatalf("Load returned a nil Program")
- }
- if got, want := created(prog), "errors_test fmt_test"; got != want {
- t.Errorf("Created = %q, want %s", got, want)
- }
- if got, want := imported(prog), "errors fmt"; got != want {
- t.Errorf("Imported = %s, want %s", got, want)
- }
- // Check set of transitive packages.
- // There are >30 and the set may grow over time, so only check a few.
- want := map[string]bool{
- "strings": true,
- "time": true,
- "runtime": true,
- "testing": true,
- "unicode": true,
- }
- for _, path := range all(prog) {
- delete(want, path)
- }
- if len(want) > 0 {
- t.Errorf("AllPackages is missing these keys: %q", keys(want))
- }
-}
-
-func TestLoad_MissingIndirectImport(t *testing.T) {
- pkgs := map[string]string{
- "a": `package a; import _ "b"`,
- "b": `package b; import _ "c"`,
- }
- conf := loader.Config{Build: fakeContext(pkgs)}
- conf.Import("a")
-
- const wantErr = "couldn't load packages due to errors: b"
-
- prog, err := conf.Load()
- if err == nil {
- t.Errorf("Load succeeded unexpectedly, want %q", wantErr)
- } else if err.Error() != wantErr {
- t.Errorf("Load failed with wrong error %q, want %q", err, wantErr)
- }
- if prog != nil {
- t.Errorf("Load unexpectedly returned a Program")
- }
-}
-
-func TestLoad_BadDependency_AllowErrors(t *testing.T) {
- for _, test := range []struct {
- descr string
- pkgs map[string]string
- wantPkgs string
- }{
-
- {
- descr: "missing dependency",
- pkgs: map[string]string{
- "a": `package a; import _ "b"`,
- "b": `package b; import _ "c"`,
- },
- wantPkgs: "a b",
- },
- {
- descr: "bad package decl in dependency",
- pkgs: map[string]string{
- "a": `package a; import _ "b"`,
- "b": `package b; import _ "c"`,
- "c": `package`,
- },
- wantPkgs: "a b",
- },
- {
- descr: "parse error in dependency",
- pkgs: map[string]string{
- "a": `package a; import _ "b"`,
- "b": `package b; import _ "c"`,
- "c": `package c; var x = `,
- },
- wantPkgs: "a b c",
- },
- } {
- conf := loader.Config{
- AllowErrors: true,
- Build: fakeContext(test.pkgs),
- }
- conf.Import("a")
-
- prog, err := conf.Load()
- if err != nil {
- t.Errorf("%s: Load failed unexpectedly: %v", test.descr, err)
- }
- if prog == nil {
- t.Fatalf("%s: Load returned a nil Program", test.descr)
- }
-
- if got, want := imported(prog), "a"; got != want {
- t.Errorf("%s: Imported = %s, want %s", test.descr, got, want)
- }
- if got := all(prog); strings.Join(got, " ") != test.wantPkgs {
- t.Errorf("%s: AllPackages = %s, want %s", test.descr, got, test.wantPkgs)
- }
- }
-}
-
-func TestCwd(t *testing.T) {
- ctxt := fakeContext(map[string]string{"one/two/three": `package three`})
- for _, test := range []struct {
- cwd, arg, want string
- }{
- {cwd: "/go/src/one", arg: "./two/three", want: "one/two/three"},
- {cwd: "/go/src/one", arg: "../one/two/three", want: "one/two/three"},
- {cwd: "/go/src/one", arg: "one/two/three", want: "one/two/three"},
- {cwd: "/go/src/one/two/three", arg: ".", want: "one/two/three"},
- {cwd: "/go/src/one", arg: "two/three", want: ""},
- } {
- conf := loader.Config{
- Cwd: test.cwd,
- Build: ctxt,
- }
- conf.Import(test.arg)
-
- var got string
- prog, err := conf.Load()
- if prog != nil {
- got = imported(prog)
- }
- if got != test.want {
- t.Errorf("Load(%s) from %s: Imported = %s, want %s",
- test.arg, test.cwd, got, test.want)
- if err != nil {
- t.Errorf("Load failed: %v", err)
- }
- }
- }
-}
-
-func TestLoad_vendor(t *testing.T) {
- pkgs := map[string]string{
- "a": `package a; import _ "x"`,
- "a/vendor": ``, // mkdir a/vendor
- "a/vendor/x": `package xa`,
- "b": `package b; import _ "x"`,
- "b/vendor": ``, // mkdir b/vendor
- "b/vendor/x": `package xb`,
- "c": `package c; import _ "x"`,
- "x": `package xc`,
- }
- conf := loader.Config{Build: fakeContext(pkgs)}
- conf.Import("a")
- conf.Import("b")
- conf.Import("c")
-
- prog, err := conf.Load()
- if err != nil {
- t.Fatal(err)
- }
-
- // Check that a, b, and c see different versions of x.
- for _, r := range "abc" {
- name := string(r)
- got := prog.Package(name).Pkg.Imports()[0]
- want := "x" + name
- if got.Name() != want {
- t.Errorf("package %s import %q = %s, want %s",
- name, "x", got.Name(), want)
- }
- }
-}
-
-func TestVendorCwd(t *testing.T) {
- // Test the interaction of cwd and vendor directories.
- ctxt := fakeContext(map[string]string{
- "net": ``, // mkdir net
- "net/http": `package http; import _ "hpack"`,
- "vendor": ``, // mkdir vendor
- "vendor/hpack": `package vendorhpack`,
- "hpack": `package hpack`,
- })
- for i, test := range []struct {
- cwd, arg, want string
- }{
- {cwd: "/go/src/net", arg: "http"}, // not found
- {cwd: "/go/src/net", arg: "./http", want: "net/http vendor/hpack"},
- {cwd: "/go/src/net", arg: "hpack", want: "vendor/hpack"},
- {cwd: "/go/src/vendor", arg: "hpack", want: "vendor/hpack"},
- {cwd: "/go/src/vendor", arg: "./hpack", want: "vendor/hpack"},
- } {
- conf := loader.Config{
- Cwd: test.cwd,
- Build: ctxt,
- }
- conf.Import(test.arg)
-
- var got string
- prog, err := conf.Load()
- if prog != nil {
- got = strings.Join(all(prog), " ")
- }
- if got != test.want {
- t.Errorf("#%d: Load(%s) from %s: got %s, want %s",
- i, test.arg, test.cwd, got, test.want)
- if err != nil {
- t.Errorf("Load failed: %v", err)
- }
- }
- }
-}
-
-func TestVendorCwdIssue16580(t *testing.T) {
- // Regression test for Go issue 16580.
- // Import decls in "created" packages were vendor-resolved
- // w.r.t. cwd, not the parent directory of the package's files.
- ctxt := fakeContext(map[string]string{
- "a": ``, // mkdir a
- "a/vendor": ``, // mkdir a/vendor
- "a/vendor/b": `package b; const X = true`,
- "b": `package b; const X = false`,
- })
- for _, test := range []struct {
- filename, cwd string
- want bool // expected value of b.X; depends on filename, not on cwd
- }{
- {filename: "c.go", cwd: "/go/src", want: false},
- {filename: "c.go", cwd: "/go/src/a", want: false},
- {filename: "c.go", cwd: "/go/src/a/b", want: false},
- {filename: "c.go", cwd: "/go/src/a/vendor/b", want: false},
-
- {filename: "/go/src/a/c.go", cwd: "/go/src", want: true},
- {filename: "/go/src/a/c.go", cwd: "/go/src/a", want: true},
- {filename: "/go/src/a/c.go", cwd: "/go/src/a/b", want: true},
- {filename: "/go/src/a/c.go", cwd: "/go/src/a/vendor/b", want: true},
-
- {filename: "/go/src/c/c.go", cwd: "/go/src", want: false},
- {filename: "/go/src/c/c.go", cwd: "/go/src/a", want: false},
- {filename: "/go/src/c/c.go", cwd: "/go/src/a/b", want: false},
- {filename: "/go/src/c/c.go", cwd: "/go/src/a/vendor/b", want: false},
- } {
- conf := loader.Config{
- Cwd: test.cwd,
- Build: ctxt,
- }
- f, err := conf.ParseFile(test.filename, `package dummy; import "b"; const X = b.X`)
- if err != nil {
- t.Fatal(f)
- }
- conf.CreateFromFiles("dummy", f)
-
- prog, err := conf.Load()
- if err != nil {
- t.Errorf("%+v: Load failed: %v", test, err)
- continue
- }
-
- x := constant.BoolVal(prog.Created[0].Pkg.Scope().Lookup("X").(*types.Const).Val())
- if x != test.want {
- t.Errorf("%+v: b.X = %t", test, x)
- }
- }
-
- // TODO(adonovan): also test imports within XTestGoFiles.
-}
-
-// TODO(adonovan): more Load tests:
-//
-// failures:
-// - to parse package decl of *_test.go files
-// - to parse package decl of external *_test.go files
-// - to parse whole of *_test.go files
-// - to parse whole of external *_test.go files
-// - to open a *.go file during import scanning
-// - to import from binary
-
-// features:
-// - InitialPackages
-// - PackageCreated hook
-// - TypeCheckFuncBodies hook
-
-func TestTransitivelyErrorFreeFlag(t *testing.T) {
- // Create an minimal custom build.Context
- // that fakes the following packages:
- //
- // a --> b --> c! c has an error
- // \ d and e are transitively error-free.
- // e --> d
- //
- // Each package [a-e] consists of one file, x.go.
- pkgs := map[string]string{
- "a": `package a; import (_ "b"; _ "e")`,
- "b": `package b; import _ "c"`,
- "c": `package c; func f() { _ = int(false) }`, // type error within function body
- "d": `package d;`,
- "e": `package e; import _ "d"`,
- }
- conf := loader.Config{
- AllowErrors: true,
- Build: fakeContext(pkgs),
- }
- conf.Import("a")
-
- prog, err := conf.Load()
- if err != nil {
- t.Errorf("Load failed: %s", err)
- }
- if prog == nil {
- t.Fatalf("Load returned nil *Program")
- }
-
- for pkg, info := range prog.AllPackages {
- var wantErr, wantTEF bool
- switch pkg.Path() {
- case "a", "b":
- case "c":
- wantErr = true
- case "d", "e":
- wantTEF = true
- default:
- t.Errorf("unexpected package: %q", pkg.Path())
- continue
- }
-
- if (info.Errors != nil) != wantErr {
- if wantErr {
- t.Errorf("Package %q.Error = nil, want error", pkg.Path())
- } else {
- t.Errorf("Package %q has unexpected Errors: %v",
- pkg.Path(), info.Errors)
- }
- }
-
- if info.TransitivelyErrorFree != wantTEF {
- t.Errorf("Package %q.TransitivelyErrorFree=%t, want %t",
- pkg.Path(), info.TransitivelyErrorFree, wantTEF)
- }
- }
-}
-
-// Test that syntax (scan/parse), type, and loader errors are recorded
-// (in PackageInfo.Errors) and reported (via Config.TypeChecker.Error).
-func TestErrorReporting(t *testing.T) {
- pkgs := map[string]string{
- "a": `package a; import (_ "b"; _ "c"); var x int = false`,
- "b": `package b; 'syntax error!`,
- }
- conf := loader.Config{
- AllowErrors: true,
- Build: fakeContext(pkgs),
- }
- var mu sync.Mutex
- var allErrors []error
- conf.TypeChecker.Error = func(err error) {
- mu.Lock()
- allErrors = append(allErrors, err)
- mu.Unlock()
- }
- conf.Import("a")
-
- prog, err := conf.Load()
- if err != nil {
- t.Errorf("Load failed: %s", err)
- }
- if prog == nil {
- t.Fatalf("Load returned nil *Program")
- }
-
- // TODO(adonovan): test keys of ImportMap.
-
- // Check errors recorded in each PackageInfo.
- for pkg, info := range prog.AllPackages {
- switch pkg.Path() {
- case "a":
- if !hasError(info.Errors, "cannot convert false") {
- t.Errorf("a.Errors = %v, want bool conversion (type) error", info.Errors)
- }
- if !hasError(info.Errors, "could not import c") {
- t.Errorf("a.Errors = %v, want import (loader) error", info.Errors)
- }
- case "b":
- if !hasError(info.Errors, "rune literal not terminated") {
- t.Errorf("b.Errors = %v, want unterminated literal (syntax) error", info.Errors)
- }
- }
- }
-
- // Check errors reported via error handler.
- if !hasError(allErrors, "cannot convert false") ||
- !hasError(allErrors, "rune literal not terminated") ||
- !hasError(allErrors, "could not import c") {
- t.Errorf("allErrors = %v, want syntax, type and loader errors", allErrors)
- }
-}
-
-func TestCycles(t *testing.T) {
- for _, test := range []struct {
- descr string
- ctxt *build.Context
- wantErr string
- }{
- {
- "self-cycle",
- fakeContext(map[string]string{
- "main": `package main; import _ "selfcycle"`,
- "selfcycle": `package selfcycle; import _ "selfcycle"`,
- }),
- `import cycle: selfcycle -> selfcycle`,
- },
- {
- "three-package cycle",
- fakeContext(map[string]string{
- "main": `package main; import _ "a"`,
- "a": `package a; import _ "b"`,
- "b": `package b; import _ "c"`,
- "c": `package c; import _ "a"`,
- }),
- `import cycle: c -> a -> b -> c`,
- },
- {
- "self-cycle in dependency of test file",
- buildutil.FakeContext(map[string]map[string]string{
- "main": {
- "main.go": `package main`,
- "main_test.go": `package main; import _ "a"`,
- },
- "a": {
- "a.go": `package a; import _ "a"`,
- },
- }),
- `import cycle: a -> a`,
- },
- // TODO(adonovan): fix: these fail
- // {
- // "two-package cycle in dependency of test file",
- // buildutil.FakeContext(map[string]map[string]string{
- // "main": {
- // "main.go": `package main`,
- // "main_test.go": `package main; import _ "a"`,
- // },
- // "a": {
- // "a.go": `package a; import _ "main"`,
- // },
- // }),
- // `import cycle: main -> a -> main`,
- // },
- // {
- // "self-cycle in augmented package",
- // buildutil.FakeContext(map[string]map[string]string{
- // "main": {
- // "main.go": `package main`,
- // "main_test.go": `package main; import _ "main"`,
- // },
- // }),
- // `import cycle: main -> main`,
- // },
- } {
- conf := loader.Config{
- AllowErrors: true,
- Build: test.ctxt,
- }
- var mu sync.Mutex
- var allErrors []error
- conf.TypeChecker.Error = func(err error) {
- mu.Lock()
- allErrors = append(allErrors, err)
- mu.Unlock()
- }
- conf.ImportWithTests("main")
-
- prog, err := conf.Load()
- if err != nil {
- t.Errorf("%s: Load failed: %s", test.descr, err)
- }
- if prog == nil {
- t.Fatalf("%s: Load returned nil *Program", test.descr)
- }
-
- if !hasError(allErrors, test.wantErr) {
- t.Errorf("%s: Load() errors = %q, want %q",
- test.descr, allErrors, test.wantErr)
- }
- }
-
- // TODO(adonovan):
- // - Test that in a legal test cycle, none of the symbols
- // defined by augmentation are visible via import.
-}
-
-// ---- utilities ----
-
-// Simplifying wrapper around buildutil.FakeContext for single-file packages.
-func fakeContext(pkgs map[string]string) *build.Context {
- pkgs2 := make(map[string]map[string]string)
- for path, content := range pkgs {
- pkgs2[path] = map[string]string{"x.go": content}
- }
- return buildutil.FakeContext(pkgs2)
-}
-
-func hasError(errors []error, substr string) bool {
- for _, err := range errors {
- if strings.Contains(err.Error(), substr) {
- return true
- }
- }
- return false
-}
-
-func keys(m map[string]bool) (keys []string) {
- for key := range m {
- keys = append(keys, key)
- }
- sort.Strings(keys)
- return
-}
-
-// Returns all loaded packages.
-func all(prog *loader.Program) []string {
- var pkgs []string
- for _, info := range prog.AllPackages {
- pkgs = append(pkgs, info.Pkg.Path())
- }
- sort.Strings(pkgs)
- return pkgs
-}
-
-// Returns initially imported packages, as a string.
-func imported(prog *loader.Program) string {
- var pkgs []string
- for _, info := range prog.Imported {
- pkgs = append(pkgs, info.Pkg.Path())
- }
- sort.Strings(pkgs)
- return strings.Join(pkgs, " ")
-}
-
-// Returns initially created packages, as a string.
-func created(prog *loader.Program) string {
- var pkgs []string
- for _, info := range prog.Created {
- pkgs = append(pkgs, info.Pkg.Path())
- }
- return strings.Join(pkgs, " ")
-}
-
-// Load package "io" twice in parallel.
-// When run with -race, this is a regression test for Go issue 20718, in
-// which the global "unsafe" package was modified concurrently.
-func TestLoad1(t *testing.T) { loadIO(t) }
-func TestLoad2(t *testing.T) { loadIO(t) }
-
-func loadIO(t *testing.T) {
- t.Parallel()
- conf := &loader.Config{ImportPkgs: map[string]bool{"io": false}}
- if _, err := conf.Load(); err != nil {
- t.Fatal(err)
- }
-}
diff --git a/vendor/golang.org/x/tools/go/loader/stdlib_test.go b/vendor/golang.org/x/tools/go/loader/stdlib_test.go
deleted file mode 100644
index 2cd066f..0000000
--- a/vendor/golang.org/x/tools/go/loader/stdlib_test.go
+++ /dev/null
@@ -1,201 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package loader_test
-
-// This file enumerates all packages beneath $GOROOT, loads them, plus
-// their external tests if any, runs the type checker on them, and
-// prints some summary information.
-
-import (
- "bytes"
- "fmt"
- "go/ast"
- "go/build"
- "go/token"
- "go/types"
- "io/ioutil"
- "path/filepath"
- "runtime"
- "strings"
- "testing"
- "time"
-
- "golang.org/x/tools/go/buildutil"
- "golang.org/x/tools/go/loader"
-)
-
-func TestStdlib(t *testing.T) {
- if runtime.GOOS == "android" {
- t.Skipf("incomplete std lib on %s", runtime.GOOS)
- }
- if testing.Short() {
- t.Skip("skipping in short mode; uses tons of memory (golang.org/issue/14113)")
- }
-
- runtime.GC()
- t0 := time.Now()
- var memstats runtime.MemStats
- runtime.ReadMemStats(&memstats)
- alloc := memstats.Alloc
-
- // Load, parse and type-check the program.
- ctxt := build.Default // copy
- ctxt.GOPATH = "" // disable GOPATH
- conf := loader.Config{Build: &ctxt}
- for _, path := range buildutil.AllPackages(conf.Build) {
- conf.ImportWithTests(path)
- }
-
- prog, err := conf.Load()
- if err != nil {
- t.Fatalf("Load failed: %v", err)
- }
-
- t1 := time.Now()
- runtime.GC()
- runtime.ReadMemStats(&memstats)
-
- numPkgs := len(prog.AllPackages)
- if want := 205; numPkgs < want {
- t.Errorf("Loaded only %d packages, want at least %d", numPkgs, want)
- }
-
- // Dump package members.
- if false {
- for pkg := range prog.AllPackages {
- fmt.Printf("Package %s:\n", pkg.Path())
- scope := pkg.Scope()
- qualifier := types.RelativeTo(pkg)
- for _, name := range scope.Names() {
- if ast.IsExported(name) {
- fmt.Printf("\t%s\n", types.ObjectString(scope.Lookup(name), qualifier))
- }
- }
- fmt.Println()
- }
- }
-
- // Check that Test functions for io/ioutil, regexp and
- // compress/bzip2 are all simultaneously present.
- // (The apparent cycle formed when augmenting all three of
- // these packages by their tests was the original motivation
- // for reporting b/7114.)
- //
- // compress/bzip2.TestBitReader in bzip2_test.go imports io/ioutil
- // io/ioutil.TestTempFile in tempfile_test.go imports regexp
- // regexp.TestRE2Search in exec_test.go imports compress/bzip2
- for _, test := range []struct{ pkg, fn string }{
- {"io/ioutil", "TestTempFile"},
- {"regexp", "TestRE2Search"},
- {"compress/bzip2", "TestBitReader"},
- } {
- info := prog.Imported[test.pkg]
- if info == nil {
- t.Errorf("failed to load package %q", test.pkg)
- continue
- }
- obj, _ := info.Pkg.Scope().Lookup(test.fn).(*types.Func)
- if obj == nil {
- t.Errorf("package %q has no func %q", test.pkg, test.fn)
- continue
- }
- }
-
- // Dump some statistics.
-
- // determine line count
- var lineCount int
- prog.Fset.Iterate(func(f *token.File) bool {
- lineCount += f.LineCount()
- return true
- })
-
- t.Log("GOMAXPROCS: ", runtime.GOMAXPROCS(0))
- t.Log("#Source lines: ", lineCount)
- t.Log("Load/parse/typecheck: ", t1.Sub(t0))
- t.Log("#MB: ", int64(memstats.Alloc-alloc)/1000000)
-}
-
-func TestCgoOption(t *testing.T) {
- if testing.Short() {
- t.Skip("skipping in short mode; uses tons of memory (golang.org/issue/14113)")
- }
- switch runtime.GOOS {
- // On these systems, the net and os/user packages don't use cgo
- // or the std library is incomplete (Android).
- case "android", "plan9", "solaris", "windows":
- t.Skipf("no cgo or incomplete std lib on %s", runtime.GOOS)
- }
- // In nocgo builds (e.g. linux-amd64-nocgo),
- // there is no "runtime/cgo" package,
- // so cgo-generated Go files will have a failing import.
- if !build.Default.CgoEnabled {
- return
- }
- // Test that we can load cgo-using packages with
- // CGO_ENABLED=[01], which causes go/build to select pure
- // Go/native implementations, respectively, based on build
- // tags.
- //
- // Each entry specifies a package-level object and the generic
- // file expected to define it when cgo is disabled.
- // When cgo is enabled, the exact file is not specified (since
- // it varies by platform), but must differ from the generic one.
- //
- // The test also loads the actual file to verify that the
- // object is indeed defined at that location.
- for _, test := range []struct {
- pkg, name, genericFile string
- }{
- {"net", "cgoLookupHost", "cgo_stub.go"},
- {"os/user", "current", "lookup_stubs.go"},
- } {
- ctxt := build.Default
- for _, ctxt.CgoEnabled = range []bool{false, true} {
- conf := loader.Config{Build: &ctxt}
- conf.Import(test.pkg)
- prog, err := conf.Load()
- if err != nil {
- t.Errorf("Load failed: %v", err)
- continue
- }
- info := prog.Imported[test.pkg]
- if info == nil {
- t.Errorf("package %s not found", test.pkg)
- continue
- }
- obj := info.Pkg.Scope().Lookup(test.name)
- if obj == nil {
- t.Errorf("no object %s.%s", test.pkg, test.name)
- continue
- }
- posn := prog.Fset.Position(obj.Pos())
- t.Logf("%s: %s (CgoEnabled=%t)", posn, obj, ctxt.CgoEnabled)
-
- gotFile := filepath.Base(posn.Filename)
- filesMatch := gotFile == test.genericFile
-
- if ctxt.CgoEnabled && filesMatch {
- t.Errorf("CGO_ENABLED=1: %s found in %s, want native file",
- obj, gotFile)
- } else if !ctxt.CgoEnabled && !filesMatch {
- t.Errorf("CGO_ENABLED=0: %s found in %s, want %s",
- obj, gotFile, test.genericFile)
- }
-
- // Load the file and check the object is declared at the right place.
- b, err := ioutil.ReadFile(posn.Filename)
- if err != nil {
- t.Errorf("can't read %s: %s", posn.Filename, err)
- continue
- }
- line := string(bytes.Split(b, []byte("\n"))[posn.Line-1])
- ident := line[posn.Column-1:]
- if !strings.HasPrefix(ident, test.name) {
- t.Errorf("%s: %s not declared here (looking at %q)", posn, obj, ident)
- }
- }
- }
-}
diff --git a/vendor/golang.org/x/tools/go/loader/testdata/a.go b/vendor/golang.org/x/tools/go/loader/testdata/a.go
deleted file mode 100644
index bae3955..0000000
--- a/vendor/golang.org/x/tools/go/loader/testdata/a.go
+++ /dev/null
@@ -1 +0,0 @@
-package P
diff --git a/vendor/golang.org/x/tools/go/loader/testdata/b.go b/vendor/golang.org/x/tools/go/loader/testdata/b.go
deleted file mode 100644
index bae3955..0000000
--- a/vendor/golang.org/x/tools/go/loader/testdata/b.go
+++ /dev/null
@@ -1 +0,0 @@
-package P
diff --git a/vendor/golang.org/x/tools/go/loader/testdata/badpkgdecl.go b/vendor/golang.org/x/tools/go/loader/testdata/badpkgdecl.go
deleted file mode 100644
index 1e39359..0000000
--- a/vendor/golang.org/x/tools/go/loader/testdata/badpkgdecl.go
+++ /dev/null
@@ -1 +0,0 @@
-// this file has no package decl
diff --git a/vendor/golang.org/x/tools/go/loader/util.go b/vendor/golang.org/x/tools/go/loader/util.go
deleted file mode 100644
index 7f38dd7..0000000
--- a/vendor/golang.org/x/tools/go/loader/util.go
+++ /dev/null
@@ -1,124 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package loader
-
-import (
- "go/ast"
- "go/build"
- "go/parser"
- "go/token"
- "io"
- "os"
- "strconv"
- "sync"
-
- "golang.org/x/tools/go/buildutil"
-)
-
-// We use a counting semaphore to limit
-// the number of parallel I/O calls per process.
-var ioLimit = make(chan bool, 10)
-
-// parseFiles parses the Go source files within directory dir and
-// returns the ASTs of the ones that could be at least partially parsed,
-// along with a list of I/O and parse errors encountered.
-//
-// I/O is done via ctxt, which may specify a virtual file system.
-// displayPath is used to transform the filenames attached to the ASTs.
-//
-func parseFiles(fset *token.FileSet, ctxt *build.Context, displayPath func(string) string, dir string, files []string, mode parser.Mode) ([]*ast.File, []error) {
- if displayPath == nil {
- displayPath = func(path string) string { return path }
- }
- var wg sync.WaitGroup
- n := len(files)
- parsed := make([]*ast.File, n)
- errors := make([]error, n)
- for i, file := range files {
- if !buildutil.IsAbsPath(ctxt, file) {
- file = buildutil.JoinPath(ctxt, dir, file)
- }
- wg.Add(1)
- go func(i int, file string) {
- ioLimit <- true // wait
- defer func() {
- wg.Done()
- <-ioLimit // signal
- }()
- var rd io.ReadCloser
- var err error
- if ctxt.OpenFile != nil {
- rd, err = ctxt.OpenFile(file)
- } else {
- rd, err = os.Open(file)
- }
- if err != nil {
- errors[i] = err // open failed
- return
- }
-
- // ParseFile may return both an AST and an error.
- parsed[i], errors[i] = parser.ParseFile(fset, displayPath(file), rd, mode)
- rd.Close()
- }(i, file)
- }
- wg.Wait()
-
- // Eliminate nils, preserving order.
- var o int
- for _, f := range parsed {
- if f != nil {
- parsed[o] = f
- o++
- }
- }
- parsed = parsed[:o]
-
- o = 0
- for _, err := range errors {
- if err != nil {
- errors[o] = err
- o++
- }
- }
- errors = errors[:o]
-
- return parsed, errors
-}
-
-// scanImports returns the set of all import paths from all
-// import specs in the specified files.
-func scanImports(files []*ast.File) map[string]bool {
- imports := make(map[string]bool)
- for _, f := range files {
- for _, decl := range f.Decls {
- if decl, ok := decl.(*ast.GenDecl); ok && decl.Tok == token.IMPORT {
- for _, spec := range decl.Specs {
- spec := spec.(*ast.ImportSpec)
-
- // NB: do not assume the program is well-formed!
- path, err := strconv.Unquote(spec.Path.Value)
- if err != nil {
- continue // quietly ignore the error
- }
- if path == "C" {
- continue // skip pseudopackage
- }
- imports[path] = true
- }
- }
- }
- }
- return imports
-}
-
-// ---------- Internal helpers ----------
-
-// TODO(adonovan): make this a method: func (*token.File) Contains(token.Pos)
-func tokenFileContainsPos(f *token.File, pos token.Pos) bool {
- p := int(pos)
- base := f.Base()
- return base <= p && p < base+f.Size()
-}
diff --git a/vendor/golang.org/x/tools/go/pointer/TODO b/vendor/golang.org/x/tools/go/pointer/TODO
deleted file mode 100644
index f95e706..0000000
--- a/vendor/golang.org/x/tools/go/pointer/TODO
+++ /dev/null
@@ -1,33 +0,0 @@
--*- text -*-
-
-Pointer analysis to-do list
-===========================
-
-CONSTRAINT GENERATION:
-- support reflection:
- - a couple of operators are missing
- - reflect.Values may contain lvalues (CanAddr)
-- implement native intrinsics. These vary by platform.
-- add to pts(a.panic) a label representing all runtime panics, e.g.
- runtime.{TypeAssertionError,errorString,errorCString}.
-
-OPTIMISATIONS
-- pre-solver:
- pointer equivalence: extend HVN to HRU
- location equivalence
-- solver: HCD, LCD.
-- experiment with map+slice worklist in lieu of bitset.
- It may have faster insert.
-
-MISC:
-- Test on all platforms.
- Currently we assume these go/build tags: linux, amd64, !cgo.
-
-MAINTAINABILITY
-- Think about ways to make debugging this code easier. PTA logs
- routinely exceed a million lines and require training to read.
-
-BUGS:
-- There's a crash bug in stdlib_test + reflection, rVCallConstraint.
-
-
diff --git a/vendor/golang.org/x/tools/go/pointer/analysis.go b/vendor/golang.org/x/tools/go/pointer/analysis.go
deleted file mode 100644
index 0abb04d..0000000
--- a/vendor/golang.org/x/tools/go/pointer/analysis.go
+++ /dev/null
@@ -1,452 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package pointer
-
-// This file defines the main datatypes and Analyze function of the pointer analysis.
-
-import (
- "fmt"
- "go/token"
- "go/types"
- "io"
- "os"
- "reflect"
- "runtime"
- "runtime/debug"
- "sort"
-
- "golang.org/x/tools/go/callgraph"
- "golang.org/x/tools/go/ssa"
- "golang.org/x/tools/go/types/typeutil"
-)
-
-const (
- // optimization options; enable all when committing
- optRenumber = true // enable renumbering optimization (makes logs hard to read)
- optHVN = true // enable pointer equivalence via Hash-Value Numbering
-
- // debugging options; disable all when committing
- debugHVN = false // enable assertions in HVN
- debugHVNVerbose = false // enable extra HVN logging
- debugHVNCrossCheck = false // run solver with/without HVN and compare (caveats below)
- debugTimers = false // show running time of each phase
-)
-
-// object.flags bitmask values.
-const (
- otTagged = 1 << iota // type-tagged object
- otIndirect // type-tagged object with indirect payload
- otFunction // function object
-)
-
-// An object represents a contiguous block of memory to which some
-// (generalized) pointer may point.
-//
-// (Note: most variables called 'obj' are not *objects but nodeids
-// such that a.nodes[obj].obj != nil.)
-//
-type object struct {
- // flags is a bitset of the node type (ot*) flags defined above.
- flags uint32
-
- // Number of following nodes belonging to the same "object"
- // allocation. Zero for all other nodes.
- size uint32
-
- // data describes this object; it has one of these types:
- //
- // ssa.Value for an object allocated by an SSA operation.
- // types.Type for an rtype instance object or *rtype-tagged object.
- // string for an instrinsic object, e.g. the array behind os.Args.
- // nil for an object allocated by an instrinsic.
- // (cgn provides the identity of the intrinsic.)
- data interface{}
-
- // The call-graph node (=context) in which this object was allocated.
- // May be nil for global objects: Global, Const, some Functions.
- cgn *cgnode
-}
-
-// nodeid denotes a node.
-// It is an index within analysis.nodes.
-// We use small integers, not *node pointers, for many reasons:
-// - they are smaller on 64-bit systems.
-// - sets of them can be represented compactly in bitvectors or BDDs.
-// - order matters; a field offset can be computed by simple addition.
-type nodeid uint32
-
-// A node is an equivalence class of memory locations.
-// Nodes may be pointers, pointed-to locations, neither, or both.
-//
-// Nodes that are pointed-to locations ("labels") have an enclosing
-// object (see analysis.enclosingObject).
-//
-type node struct {
- // If non-nil, this node is the start of an object
- // (addressable memory location).
- // The following obj.size nodes implicitly belong to the object;
- // they locate their object by scanning back.
- obj *object
-
- // The type of the field denoted by this node. Non-aggregate,
- // unless this is an tagged.T node (i.e. the thing
- // pointed to by an interface) in which case typ is that type.
- typ types.Type
-
- // subelement indicates which directly embedded subelement of
- // an object of aggregate type (struct, tuple, array) this is.
- subelement *fieldInfo // e.g. ".a.b[*].c"
-
- // Solver state for the canonical node of this pointer-
- // equivalence class. Each node is created with its own state
- // but they become shared after HVN.
- solve *solverState
-}
-
-// An analysis instance holds the state of a single pointer analysis problem.
-type analysis struct {
- config *Config // the client's control/observer interface
- prog *ssa.Program // the program being analyzed
- log io.Writer // log stream; nil to disable
- panicNode nodeid // sink for panic, source for recover
- nodes []*node // indexed by nodeid
- flattenMemo map[types.Type][]*fieldInfo // memoization of flatten()
- trackTypes map[types.Type]bool // memoization of shouldTrack()
- constraints []constraint // set of constraints
- cgnodes []*cgnode // all cgnodes
- genq []*cgnode // queue of functions to generate constraints for
- intrinsics map[*ssa.Function]intrinsic // non-nil values are summaries for intrinsic fns
- globalval map[ssa.Value]nodeid // node for each global ssa.Value
- globalobj map[ssa.Value]nodeid // maps v to sole member of pts(v), if singleton
- localval map[ssa.Value]nodeid // node for each local ssa.Value
- localobj map[ssa.Value]nodeid // maps v to sole member of pts(v), if singleton
- atFuncs map[*ssa.Function]bool // address-taken functions (for presolver)
- mapValues []nodeid // values of makemap objects (indirect in HVN)
- work nodeset // solver's worklist
- result *Result // results of the analysis
- track track // pointerlike types whose aliasing we track
- deltaSpace []int // working space for iterating over PTS deltas
-
- // Reflection & intrinsics:
- hasher typeutil.Hasher // cache of type hashes
- reflectValueObj types.Object // type symbol for reflect.Value (if present)
- reflectValueCall *ssa.Function // (reflect.Value).Call
- reflectRtypeObj types.Object // *types.TypeName for reflect.rtype (if present)
- reflectRtypePtr *types.Pointer // *reflect.rtype
- reflectType *types.Named // reflect.Type
- rtypes typeutil.Map // nodeid of canonical *rtype-tagged object for type T
- reflectZeros typeutil.Map // nodeid of canonical T-tagged object for zero value
- runtimeSetFinalizer *ssa.Function // runtime.SetFinalizer
-}
-
-// enclosingObj returns the first node of the addressable memory
-// object that encloses node id. Panic ensues if that node does not
-// belong to any object.
-func (a *analysis) enclosingObj(id nodeid) nodeid {
- // Find previous node with obj != nil.
- for i := id; i >= 0; i-- {
- n := a.nodes[i]
- if obj := n.obj; obj != nil {
- if i+nodeid(obj.size) <= id {
- break // out of bounds
- }
- return i
- }
- }
- panic("node has no enclosing object")
-}
-
-// labelFor returns the Label for node id.
-// Panic ensues if that node is not addressable.
-func (a *analysis) labelFor(id nodeid) *Label {
- return &Label{
- obj: a.nodes[a.enclosingObj(id)].obj,
- subelement: a.nodes[id].subelement,
- }
-}
-
-func (a *analysis) warnf(pos token.Pos, format string, args ...interface{}) {
- msg := fmt.Sprintf(format, args...)
- if a.log != nil {
- fmt.Fprintf(a.log, "%s: warning: %s\n", a.prog.Fset.Position(pos), msg)
- }
- a.result.Warnings = append(a.result.Warnings, Warning{pos, msg})
-}
-
-// computeTrackBits sets a.track to the necessary 'track' bits for the pointer queries.
-func (a *analysis) computeTrackBits() {
- if len(a.config.extendedQueries) != 0 {
- // TODO(dh): only track the types necessary for the query.
- a.track = trackAll
- return
- }
- var queryTypes []types.Type
- for v := range a.config.Queries {
- queryTypes = append(queryTypes, v.Type())
- }
- for v := range a.config.IndirectQueries {
- queryTypes = append(queryTypes, mustDeref(v.Type()))
- }
- for _, t := range queryTypes {
- switch t.Underlying().(type) {
- case *types.Chan:
- a.track |= trackChan
- case *types.Map:
- a.track |= trackMap
- case *types.Pointer:
- a.track |= trackPtr
- case *types.Slice:
- a.track |= trackSlice
- case *types.Interface:
- a.track = trackAll
- return
- }
- if rVObj := a.reflectValueObj; rVObj != nil && types.Identical(t, rVObj.Type()) {
- a.track = trackAll
- return
- }
- }
-}
-
-// Analyze runs the pointer analysis with the scope and options
-// specified by config, and returns the (synthetic) root of the callgraph.
-//
-// Pointer analysis of a transitively closed well-typed program should
-// always succeed. An error can occur only due to an internal bug.
-//
-func Analyze(config *Config) (result *Result, err error) {
- if config.Mains == nil {
- return nil, fmt.Errorf("no main/test packages to analyze (check $GOROOT/$GOPATH)")
- }
- defer func() {
- if p := recover(); p != nil {
- err = fmt.Errorf("internal error in pointer analysis: %v (please report this bug)", p)
- fmt.Fprintln(os.Stderr, "Internal panic in pointer analysis:")
- debug.PrintStack()
- }
- }()
-
- a := &analysis{
- config: config,
- log: config.Log,
- prog: config.prog(),
- globalval: make(map[ssa.Value]nodeid),
- globalobj: make(map[ssa.Value]nodeid),
- flattenMemo: make(map[types.Type][]*fieldInfo),
- trackTypes: make(map[types.Type]bool),
- atFuncs: make(map[*ssa.Function]bool),
- hasher: typeutil.MakeHasher(),
- intrinsics: make(map[*ssa.Function]intrinsic),
- result: &Result{
- Queries: make(map[ssa.Value]Pointer),
- IndirectQueries: make(map[ssa.Value]Pointer),
- },
- deltaSpace: make([]int, 0, 100),
- }
-
- if false {
- a.log = os.Stderr // for debugging crashes; extremely verbose
- }
-
- if a.log != nil {
- fmt.Fprintln(a.log, "==== Starting analysis")
- }
-
- // Pointer analysis requires a complete program for soundness.
- // Check to prevent accidental misconfiguration.
- for _, pkg := range a.prog.AllPackages() {
- // (This only checks that the package scope is complete,
- // not that func bodies exist, but it's a good signal.)
- if !pkg.Pkg.Complete() {
- return nil, fmt.Errorf(`pointer analysis requires a complete program yet package %q was incomplete`, pkg.Pkg.Path())
- }
- }
-
- if reflect := a.prog.ImportedPackage("reflect"); reflect != nil {
- rV := reflect.Pkg.Scope().Lookup("Value")
- a.reflectValueObj = rV
- a.reflectValueCall = a.prog.LookupMethod(rV.Type(), nil, "Call")
- a.reflectType = reflect.Pkg.Scope().Lookup("Type").Type().(*types.Named)
- a.reflectRtypeObj = reflect.Pkg.Scope().Lookup("rtype")
- a.reflectRtypePtr = types.NewPointer(a.reflectRtypeObj.Type())
-
- // Override flattening of reflect.Value, treating it like a basic type.
- tReflectValue := a.reflectValueObj.Type()
- a.flattenMemo[tReflectValue] = []*fieldInfo{{typ: tReflectValue}}
-
- // Override shouldTrack of reflect.Value and *reflect.rtype.
- // Always track pointers of these types.
- a.trackTypes[tReflectValue] = true
- a.trackTypes[a.reflectRtypePtr] = true
-
- a.rtypes.SetHasher(a.hasher)
- a.reflectZeros.SetHasher(a.hasher)
- }
- if runtime := a.prog.ImportedPackage("runtime"); runtime != nil {
- a.runtimeSetFinalizer = runtime.Func("SetFinalizer")
- }
- a.computeTrackBits()
-
- a.generate()
- a.showCounts()
-
- if optRenumber {
- a.renumber()
- }
-
- N := len(a.nodes) // excludes solver-created nodes
-
- if optHVN {
- if debugHVNCrossCheck {
- // Cross-check: run the solver once without
- // optimization, once with, and compare the
- // solutions.
- savedConstraints := a.constraints
-
- a.solve()
- a.dumpSolution("A.pts", N)
-
- // Restore.
- a.constraints = savedConstraints
- for _, n := range a.nodes {
- n.solve = new(solverState)
- }
- a.nodes = a.nodes[:N]
-
- // rtypes is effectively part of the solver state.
- a.rtypes = typeutil.Map{}
- a.rtypes.SetHasher(a.hasher)
- }
-
- a.hvn()
- }
-
- if debugHVNCrossCheck {
- runtime.GC()
- runtime.GC()
- }
-
- a.solve()
-
- // Compare solutions.
- if optHVN && debugHVNCrossCheck {
- a.dumpSolution("B.pts", N)
-
- if !diff("A.pts", "B.pts") {
- return nil, fmt.Errorf("internal error: optimization changed solution")
- }
- }
-
- // Create callgraph.Nodes in deterministic order.
- if cg := a.result.CallGraph; cg != nil {
- for _, caller := range a.cgnodes {
- cg.CreateNode(caller.fn)
- }
- }
-
- // Add dynamic edges to call graph.
- var space [100]int
- for _, caller := range a.cgnodes {
- for _, site := range caller.sites {
- for _, callee := range a.nodes[site.targets].solve.pts.AppendTo(space[:0]) {
- a.callEdge(caller, site, nodeid(callee))
- }
- }
- }
-
- return a.result, nil
-}
-
-// callEdge is called for each edge in the callgraph.
-// calleeid is the callee's object node (has otFunction flag).
-//
-func (a *analysis) callEdge(caller *cgnode, site *callsite, calleeid nodeid) {
- obj := a.nodes[calleeid].obj
- if obj.flags&otFunction == 0 {
- panic(fmt.Sprintf("callEdge %s -> n%d: not a function object", site, calleeid))
- }
- callee := obj.cgn
-
- if cg := a.result.CallGraph; cg != nil {
- // TODO(adonovan): opt: I would expect duplicate edges
- // (to wrappers) to arise due to the elimination of
- // context information, but I haven't observed any.
- // Understand this better.
- callgraph.AddEdge(cg.CreateNode(caller.fn), site.instr, cg.CreateNode(callee.fn))
- }
-
- if a.log != nil {
- fmt.Fprintf(a.log, "\tcall edge %s -> %s\n", site, callee)
- }
-
- // Warn about calls to non-intrinsic external functions.
- // TODO(adonovan): de-dup these messages.
- if fn := callee.fn; fn.Blocks == nil && a.findIntrinsic(fn) == nil {
- a.warnf(site.pos(), "unsound call to unknown intrinsic: %s", fn)
- a.warnf(fn.Pos(), " (declared here)")
- }
-}
-
-// dumpSolution writes the PTS solution to the specified file.
-//
-// It only dumps the nodes that existed before solving. The order in
-// which solver-created nodes are created depends on pre-solver
-// optimization, so we can't include them in the cross-check.
-//
-func (a *analysis) dumpSolution(filename string, N int) {
- f, err := os.Create(filename)
- if err != nil {
- panic(err)
- }
- for id, n := range a.nodes[:N] {
- if _, err := fmt.Fprintf(f, "pts(n%d) = {", id); err != nil {
- panic(err)
- }
- var sep string
- for _, l := range n.solve.pts.AppendTo(a.deltaSpace) {
- if l >= N {
- break
- }
- fmt.Fprintf(f, "%s%d", sep, l)
- sep = " "
- }
- fmt.Fprintf(f, "} : %s\n", n.typ)
- }
- if err := f.Close(); err != nil {
- panic(err)
- }
-}
-
-// showCounts logs the size of the constraint system. A typical
-// optimized distribution is 65% copy, 13% load, 11% addr, 5%
-// offsetAddr, 4% store, 2% others.
-//
-func (a *analysis) showCounts() {
- if a.log != nil {
- counts := make(map[reflect.Type]int)
- for _, c := range a.constraints {
- counts[reflect.TypeOf(c)]++
- }
- fmt.Fprintf(a.log, "# constraints:\t%d\n", len(a.constraints))
- var lines []string
- for t, n := range counts {
- line := fmt.Sprintf("%7d (%2d%%)\t%s", n, 100*n/len(a.constraints), t)
- lines = append(lines, line)
- }
- sort.Sort(sort.Reverse(sort.StringSlice(lines)))
- for _, line := range lines {
- fmt.Fprintf(a.log, "\t%s\n", line)
- }
-
- fmt.Fprintf(a.log, "# nodes:\t%d\n", len(a.nodes))
-
- // Show number of pointer equivalence classes.
- m := make(map[*solverState]bool)
- for _, n := range a.nodes {
- m[n.solve] = true
- }
- fmt.Fprintf(a.log, "# ptsets:\t%d\n", len(m))
- }
-}
diff --git a/vendor/golang.org/x/tools/go/pointer/api.go b/vendor/golang.org/x/tools/go/pointer/api.go
deleted file mode 100644
index 2b7e79e..0000000
--- a/vendor/golang.org/x/tools/go/pointer/api.go
+++ /dev/null
@@ -1,285 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package pointer
-
-import (
- "bytes"
- "fmt"
- "go/token"
- "io"
-
- "golang.org/x/tools/container/intsets"
- "golang.org/x/tools/go/callgraph"
- "golang.org/x/tools/go/ssa"
- "golang.org/x/tools/go/types/typeutil"
-)
-
-// A Config formulates a pointer analysis problem for Analyze. It is
-// only usable for a single invocation of Analyze and must not be
-// reused.
-type Config struct {
- // Mains contains the set of 'main' packages to analyze
- // Clients must provide the analysis with at least one
- // package defining a main() function.
- //
- // Non-main packages in the ssa.Program that are not
- // dependencies of any main package may still affect the
- // analysis result, because they contribute runtime types and
- // thus methods.
- // TODO(adonovan): investigate whether this is desirable.
- Mains []*ssa.Package
-
- // Reflection determines whether to handle reflection
- // operators soundly, which is currently rather slow since it
- // causes constraint to be generated during solving
- // proportional to the number of constraint variables, which
- // has not yet been reduced by presolver optimisation.
- Reflection bool
-
- // BuildCallGraph determines whether to construct a callgraph.
- // If enabled, the graph will be available in Result.CallGraph.
- BuildCallGraph bool
-
- // The client populates Queries[v] or IndirectQueries[v]
- // for each ssa.Value v of interest, to request that the
- // points-to sets pts(v) or pts(*v) be computed. If the
- // client needs both points-to sets, v may appear in both
- // maps.
- //
- // (IndirectQueries is typically used for Values corresponding
- // to source-level lvalues, e.g. an *ssa.Global.)
- //
- // The analysis populates the corresponding
- // Result.{Indirect,}Queries map when it creates the pointer
- // variable for v or *v. Upon completion the client can
- // inspect that map for the results.
- //
- // TODO(adonovan): this API doesn't scale well for batch tools
- // that want to dump the entire solution. Perhaps optionally
- // populate a map[*ssa.DebugRef]Pointer in the Result, one
- // entry per source expression.
- //
- Queries map[ssa.Value]struct{}
- IndirectQueries map[ssa.Value]struct{}
- extendedQueries map[ssa.Value][]*extendedQuery
-
- // If Log is non-nil, log messages are written to it.
- // Logging is extremely verbose.
- Log io.Writer
-}
-
-type track uint32
-
-const (
- trackChan track = 1 << iota // track 'chan' references
- trackMap // track 'map' references
- trackPtr // track regular pointers
- trackSlice // track slice references
-
- trackAll = ^track(0)
-)
-
-// AddQuery adds v to Config.Queries.
-// Precondition: CanPoint(v.Type()).
-func (c *Config) AddQuery(v ssa.Value) {
- if !CanPoint(v.Type()) {
- panic(fmt.Sprintf("%s is not a pointer-like value: %s", v, v.Type()))
- }
- if c.Queries == nil {
- c.Queries = make(map[ssa.Value]struct{})
- }
- c.Queries[v] = struct{}{}
-}
-
-// AddQuery adds v to Config.IndirectQueries.
-// Precondition: CanPoint(v.Type().Underlying().(*types.Pointer).Elem()).
-func (c *Config) AddIndirectQuery(v ssa.Value) {
- if c.IndirectQueries == nil {
- c.IndirectQueries = make(map[ssa.Value]struct{})
- }
- if !CanPoint(mustDeref(v.Type())) {
- panic(fmt.Sprintf("%s is not the address of a pointer-like value: %s", v, v.Type()))
- }
- c.IndirectQueries[v] = struct{}{}
-}
-
-// AddExtendedQuery adds an extended, AST-based query on v to the
-// analysis. The query, which must be a single Go expression, allows
-// destructuring the value.
-//
-// The query must operate on a variable named 'x', which represents
-// the value, and result in a pointer-like object. Only a subset of
-// Go expressions are permitted in queries, namely channel receives,
-// pointer dereferences, field selectors, array/slice/map/tuple
-// indexing and grouping with parentheses. The specific indices when
-// indexing arrays, slices and maps have no significance. Indices used
-// on tuples must be numeric and within bounds.
-//
-// All field selectors must be explicit, even ones usually elided
-// due to promotion of embedded fields.
-//
-// The query 'x' is identical to using AddQuery. The query '*x' is
-// identical to using AddIndirectQuery.
-//
-// On success, AddExtendedQuery returns a Pointer to the queried
-// value. This Pointer will be initialized during analysis. Using it
-// before analysis has finished has undefined behavior.
-//
-// Example:
-// // given v, which represents a function call to 'fn() (int, []*T)', and
-// // 'type T struct { F *int }', the following query will access the field F.
-// c.AddExtendedQuery(v, "x[1][0].F")
-func (c *Config) AddExtendedQuery(v ssa.Value, query string) (*Pointer, error) {
- ops, _, err := parseExtendedQuery(v.Type().Underlying(), query)
- if err != nil {
- return nil, fmt.Errorf("invalid query %q: %s", query, err)
- }
- if c.extendedQueries == nil {
- c.extendedQueries = make(map[ssa.Value][]*extendedQuery)
- }
-
- ptr := &Pointer{}
- c.extendedQueries[v] = append(c.extendedQueries[v], &extendedQuery{ops: ops, ptr: ptr})
- return ptr, nil
-}
-
-func (c *Config) prog() *ssa.Program {
- for _, main := range c.Mains {
- return main.Prog
- }
- panic("empty scope")
-}
-
-type Warning struct {
- Pos token.Pos
- Message string
-}
-
-// A Result contains the results of a pointer analysis.
-//
-// See Config for how to request the various Result components.
-//
-type Result struct {
- CallGraph *callgraph.Graph // discovered call graph
- Queries map[ssa.Value]Pointer // pts(v) for each v in Config.Queries.
- IndirectQueries map[ssa.Value]Pointer // pts(*v) for each v in Config.IndirectQueries.
- Warnings []Warning // warnings of unsoundness
-}
-
-// A Pointer is an equivalence class of pointer-like values.
-//
-// A Pointer doesn't have a unique type because pointers of distinct
-// types may alias the same object.
-//
-type Pointer struct {
- a *analysis
- n nodeid
-}
-
-// A PointsToSet is a set of labels (locations or allocations).
-type PointsToSet struct {
- a *analysis // may be nil if pts is nil
- pts *nodeset
-}
-
-func (s PointsToSet) String() string {
- var buf bytes.Buffer
- buf.WriteByte('[')
- if s.pts != nil {
- var space [50]int
- for i, l := range s.pts.AppendTo(space[:0]) {
- if i > 0 {
- buf.WriteString(", ")
- }
- buf.WriteString(s.a.labelFor(nodeid(l)).String())
- }
- }
- buf.WriteByte(']')
- return buf.String()
-}
-
-// PointsTo returns the set of labels that this points-to set
-// contains.
-func (s PointsToSet) Labels() []*Label {
- var labels []*Label
- if s.pts != nil {
- var space [50]int
- for _, l := range s.pts.AppendTo(space[:0]) {
- labels = append(labels, s.a.labelFor(nodeid(l)))
- }
- }
- return labels
-}
-
-// If this PointsToSet came from a Pointer of interface kind
-// or a reflect.Value, DynamicTypes returns the set of dynamic
-// types that it may contain. (For an interface, they will
-// always be concrete types.)
-//
-// The result is a mapping whose keys are the dynamic types to which
-// it may point. For each pointer-like key type, the corresponding
-// map value is the PointsToSet for pointers of that type.
-//
-// The result is empty unless CanHaveDynamicTypes(T).
-//
-func (s PointsToSet) DynamicTypes() *typeutil.Map {
- var tmap typeutil.Map
- tmap.SetHasher(s.a.hasher)
- if s.pts != nil {
- var space [50]int
- for _, x := range s.pts.AppendTo(space[:0]) {
- ifaceObjId := nodeid(x)
- if !s.a.isTaggedObject(ifaceObjId) {
- continue // !CanHaveDynamicTypes(tDyn)
- }
- tDyn, v, indirect := s.a.taggedValue(ifaceObjId)
- if indirect {
- panic("indirect tagged object") // implement later
- }
- pts, ok := tmap.At(tDyn).(PointsToSet)
- if !ok {
- pts = PointsToSet{s.a, new(nodeset)}
- tmap.Set(tDyn, pts)
- }
- pts.pts.addAll(&s.a.nodes[v].solve.pts)
- }
- }
- return &tmap
-}
-
-// Intersects reports whether this points-to set and the
-// argument points-to set contain common members.
-func (x PointsToSet) Intersects(y PointsToSet) bool {
- if x.pts == nil || y.pts == nil {
- return false
- }
- // This takes Θ(|x|+|y|) time.
- var z intsets.Sparse
- z.Intersection(&x.pts.Sparse, &y.pts.Sparse)
- return !z.IsEmpty()
-}
-
-func (p Pointer) String() string {
- return fmt.Sprintf("n%d", p.n)
-}
-
-// PointsTo returns the points-to set of this pointer.
-func (p Pointer) PointsTo() PointsToSet {
- if p.n == 0 {
- return PointsToSet{}
- }
- return PointsToSet{p.a, &p.a.nodes[p.n].solve.pts}
-}
-
-// MayAlias reports whether the receiver pointer may alias
-// the argument pointer.
-func (p Pointer) MayAlias(q Pointer) bool {
- return p.PointsTo().Intersects(q.PointsTo())
-}
-
-// DynamicTypes returns p.PointsTo().DynamicTypes().
-func (p Pointer) DynamicTypes() *typeutil.Map {
- return p.PointsTo().DynamicTypes()
-}
diff --git a/vendor/golang.org/x/tools/go/pointer/callgraph.go b/vendor/golang.org/x/tools/go/pointer/callgraph.go
deleted file mode 100644
index 48e152e..0000000
--- a/vendor/golang.org/x/tools/go/pointer/callgraph.go
+++ /dev/null
@@ -1,61 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package pointer
-
-// This file defines the internal (context-sensitive) call graph.
-
-import (
- "fmt"
- "go/token"
-
- "golang.org/x/tools/go/ssa"
-)
-
-type cgnode struct {
- fn *ssa.Function
- obj nodeid // start of this contour's object block
- sites []*callsite // ordered list of callsites within this function
- callersite *callsite // where called from, if known; nil for shared contours
-}
-
-// contour returns a description of this node's contour.
-func (n *cgnode) contour() string {
- if n.callersite == nil {
- return "shared contour"
- }
- if n.callersite.instr != nil {
- return fmt.Sprintf("as called from %s", n.callersite.instr.Parent())
- }
- return fmt.Sprintf("as called from intrinsic (targets=n%d)", n.callersite.targets)
-}
-
-func (n *cgnode) String() string {
- return fmt.Sprintf("cg%d:%s", n.obj, n.fn)
-}
-
-// A callsite represents a single call site within a cgnode;
-// it is implicitly context-sensitive.
-// callsites never represent calls to built-ins;
-// they are handled as intrinsics.
-//
-type callsite struct {
- targets nodeid // pts(·) contains objects for dynamically called functions
- instr ssa.CallInstruction // the call instruction; nil for synthetic/intrinsic
-}
-
-func (c *callsite) String() string {
- if c.instr != nil {
- return c.instr.Common().Description()
- }
- return "synthetic function call"
-}
-
-// pos returns the source position of this callsite, or token.NoPos if implicit.
-func (c *callsite) pos() token.Pos {
- if c.instr != nil {
- return c.instr.Pos()
- }
- return token.NoPos
-}
diff --git a/vendor/golang.org/x/tools/go/pointer/constraint.go b/vendor/golang.org/x/tools/go/pointer/constraint.go
deleted file mode 100644
index 54b5428..0000000
--- a/vendor/golang.org/x/tools/go/pointer/constraint.go
+++ /dev/null
@@ -1,149 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package pointer
-
-import "go/types"
-
-type constraint interface {
- // For a complex constraint, returns the nodeid of the pointer
- // to which it is attached. For addr and copy, returns dst.
- ptr() nodeid
-
- // renumber replaces each nodeid n in the constraint by mapping[n].
- renumber(mapping []nodeid)
-
- // presolve is a hook for constraint-specific behaviour during
- // pre-solver optimization. Typical implementations mark as
- // indirect the set of nodes to which the solver will add copy
- // edges or PTS labels.
- presolve(h *hvn)
-
- // solve is called for complex constraints when the pts for
- // the node to which they are attached has changed.
- solve(a *analysis, delta *nodeset)
-
- String() string
-}
-
-// dst = &src
-// pts(dst) ⊇ {src}
-// A base constraint used to initialize the solver's pt sets
-type addrConstraint struct {
- dst nodeid // (ptr)
- src nodeid
-}
-
-func (c *addrConstraint) ptr() nodeid { return c.dst }
-func (c *addrConstraint) renumber(mapping []nodeid) {
- c.dst = mapping[c.dst]
- c.src = mapping[c.src]
-}
-
-// dst = src
-// A simple constraint represented directly as a copyTo graph edge.
-type copyConstraint struct {
- dst nodeid // (ptr)
- src nodeid
-}
-
-func (c *copyConstraint) ptr() nodeid { return c.dst }
-func (c *copyConstraint) renumber(mapping []nodeid) {
- c.dst = mapping[c.dst]
- c.src = mapping[c.src]
-}
-
-// dst = src[offset]
-// A complex constraint attached to src (the pointer)
-type loadConstraint struct {
- offset uint32
- dst nodeid
- src nodeid // (ptr)
-}
-
-func (c *loadConstraint) ptr() nodeid { return c.src }
-func (c *loadConstraint) renumber(mapping []nodeid) {
- c.dst = mapping[c.dst]
- c.src = mapping[c.src]
-}
-
-// dst[offset] = src
-// A complex constraint attached to dst (the pointer)
-type storeConstraint struct {
- offset uint32
- dst nodeid // (ptr)
- src nodeid
-}
-
-func (c *storeConstraint) ptr() nodeid { return c.dst }
-func (c *storeConstraint) renumber(mapping []nodeid) {
- c.dst = mapping[c.dst]
- c.src = mapping[c.src]
-}
-
-// dst = &src.f or dst = &src[0]
-// A complex constraint attached to dst (the pointer)
-type offsetAddrConstraint struct {
- offset uint32
- dst nodeid
- src nodeid // (ptr)
-}
-
-func (c *offsetAddrConstraint) ptr() nodeid { return c.src }
-func (c *offsetAddrConstraint) renumber(mapping []nodeid) {
- c.dst = mapping[c.dst]
- c.src = mapping[c.src]
-}
-
-// dst = src.(typ) where typ is an interface
-// A complex constraint attached to src (the interface).
-// No representation change: pts(dst) and pts(src) contains tagged objects.
-type typeFilterConstraint struct {
- typ types.Type // an interface type
- dst nodeid
- src nodeid // (ptr)
-}
-
-func (c *typeFilterConstraint) ptr() nodeid { return c.src }
-func (c *typeFilterConstraint) renumber(mapping []nodeid) {
- c.dst = mapping[c.dst]
- c.src = mapping[c.src]
-}
-
-// dst = src.(typ) where typ is a concrete type
-// A complex constraint attached to src (the interface).
-//
-// If exact, only tagged objects identical to typ are untagged.
-// If !exact, tagged objects assignable to typ are untagged too.
-// The latter is needed for various reflect operators, e.g. Send.
-//
-// This entails a representation change:
-// pts(src) contains tagged objects,
-// pts(dst) contains their payloads.
-type untagConstraint struct {
- typ types.Type // a concrete type
- dst nodeid
- src nodeid // (ptr)
- exact bool
-}
-
-func (c *untagConstraint) ptr() nodeid { return c.src }
-func (c *untagConstraint) renumber(mapping []nodeid) {
- c.dst = mapping[c.dst]
- c.src = mapping[c.src]
-}
-
-// src.method(params...)
-// A complex constraint attached to iface.
-type invokeConstraint struct {
- method *types.Func // the abstract method
- iface nodeid // (ptr) the interface
- params nodeid // the start of the identity/params/results block
-}
-
-func (c *invokeConstraint) ptr() nodeid { return c.iface }
-func (c *invokeConstraint) renumber(mapping []nodeid) {
- c.iface = mapping[c.iface]
- c.params = mapping[c.params]
-}
diff --git a/vendor/golang.org/x/tools/go/pointer/doc.go b/vendor/golang.org/x/tools/go/pointer/doc.go
deleted file mode 100644
index e317cf5..0000000
--- a/vendor/golang.org/x/tools/go/pointer/doc.go
+++ /dev/null
@@ -1,610 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-/*
-
-Package pointer implements Andersen's analysis, an inclusion-based
-pointer analysis algorithm first described in (Andersen, 1994).
-
-A pointer analysis relates every pointer expression in a whole program
-to the set of memory locations to which it might point. This
-information can be used to construct a call graph of the program that
-precisely represents the destinations of dynamic function and method
-calls. It can also be used to determine, for example, which pairs of
-channel operations operate on the same channel.
-
-The package allows the client to request a set of expressions of
-interest for which the points-to information will be returned once the
-analysis is complete. In addition, the client may request that a
-callgraph is constructed. The example program in example_test.go
-demonstrates both of these features. Clients should not request more
-information than they need since it may increase the cost of the
-analysis significantly.
-
-
-CLASSIFICATION
-
-Our algorithm is INCLUSION-BASED: the points-to sets for x and y will
-be related by pts(y) ⊇ pts(x) if the program contains the statement
-y = x.
-
-It is FLOW-INSENSITIVE: it ignores all control flow constructs and the
-order of statements in a program. It is therefore a "MAY ALIAS"
-analysis: its facts are of the form "P may/may not point to L",
-not "P must point to L".
-
-It is FIELD-SENSITIVE: it builds separate points-to sets for distinct
-fields, such as x and y in struct { x, y *int }.
-
-It is mostly CONTEXT-INSENSITIVE: most functions are analyzed once,
-so values can flow in at one call to the function and return out at
-another. Only some smaller functions are analyzed with consideration
-of their calling context.
-
-It has a CONTEXT-SENSITIVE HEAP: objects are named by both allocation
-site and context, so the objects returned by two distinct calls to f:
- func f() *T { return new(T) }
-are distinguished up to the limits of the calling context.
-
-It is a WHOLE PROGRAM analysis: it requires SSA-form IR for the
-complete Go program and summaries for native code.
-
-See the (Hind, PASTE'01) survey paper for an explanation of these terms.
-
-
-SOUNDNESS
-
-The analysis is fully sound when invoked on pure Go programs that do not
-use reflection or unsafe.Pointer conversions. In other words, if there
-is any possible execution of the program in which pointer P may point to
-object O, the analysis will report that fact.
-
-
-REFLECTION
-
-By default, the "reflect" library is ignored by the analysis, as if all
-its functions were no-ops, but if the client enables the Reflection flag,
-the analysis will make a reasonable attempt to model the effects of
-calls into this library. However, this comes at a significant
-performance cost, and not all features of that library are yet
-implemented. In addition, some simplifying approximations must be made
-to ensure that the analysis terminates; for example, reflection can be
-used to construct an infinite set of types and values of those types,
-but the analysis arbitrarily bounds the depth of such types.
-
-Most but not all reflection operations are supported.
-In particular, addressable reflect.Values are not yet implemented, so
-operations such as (reflect.Value).Set have no analytic effect.
-
-
-UNSAFE POINTER CONVERSIONS
-
-The pointer analysis makes no attempt to understand aliasing between the
-operand x and result y of an unsafe.Pointer conversion:
- y = (*T)(unsafe.Pointer(x))
-It is as if the conversion allocated an entirely new object:
- y = new(T)
-
-
-NATIVE CODE
-
-The analysis cannot model the aliasing effects of functions written in
-languages other than Go, such as runtime intrinsics in C or assembly, or
-code accessed via cgo. The result is as if such functions are no-ops.
-However, various important intrinsics are understood by the analysis,
-along with built-ins such as append.
-
-The analysis currently provides no way for users to specify the aliasing
-effects of native code.
-
-------------------------------------------------------------------------
-
-IMPLEMENTATION
-
-The remaining documentation is intended for package maintainers and
-pointer analysis specialists. Maintainers should have a solid
-understanding of the referenced papers (especially those by H&L and PKH)
-before making making significant changes.
-
-The implementation is similar to that described in (Pearce et al,
-PASTE'04). Unlike many algorithms which interleave constraint
-generation and solving, constructing the callgraph as they go, this
-implementation for the most part observes a phase ordering (generation
-before solving), with only simple (copy) constraints being generated
-during solving. (The exception is reflection, which creates various
-constraints during solving as new types flow to reflect.Value
-operations.) This improves the traction of presolver optimisations,
-but imposes certain restrictions, e.g. potential context sensitivity
-is limited since all variants must be created a priori.
-
-
-TERMINOLOGY
-
-A type is said to be "pointer-like" if it is a reference to an object.
-Pointer-like types include pointers and also interfaces, maps, channels,
-functions and slices.
-
-We occasionally use C's x->f notation to distinguish the case where x
-is a struct pointer from x.f where is a struct value.
-
-Pointer analysis literature (and our comments) often uses the notation
-dst=*src+offset to mean something different than what it means in Go.
-It means: for each node index p in pts(src), the node index p+offset is
-in pts(dst). Similarly *dst+offset=src is used for store constraints
-and dst=src+offset for offset-address constraints.
-
-
-NODES
-
-Nodes are the key datastructure of the analysis, and have a dual role:
-they represent both constraint variables (equivalence classes of
-pointers) and members of points-to sets (things that can be pointed
-at, i.e. "labels").
-
-Nodes are naturally numbered. The numbering enables compact
-representations of sets of nodes such as bitvectors (or BDDs); and the
-ordering enables a very cheap way to group related nodes together. For
-example, passing n parameters consists of generating n parallel
-constraints from caller+i to callee+i for 0<=i y is added.
-
- ChangeInterface is a simple copy because the representation of
- tagged objects is independent of the interface type (in contrast
- to the "method tables" approach used by the gc runtime).
-
- y := Invoke x.m(...) is implemented by allocating contiguous P/R
- blocks for the callsite and adding a dynamic rule triggered by each
- tagged object added to pts(x). The rule adds param/results copy
- edges to/from each discovered concrete method.
-
- (Q. Why do we model an interface as a pointer to a pair of type and
- value, rather than as a pair of a pointer to type and a pointer to
- value?
- A. Control-flow joins would merge interfaces ({T1}, {V1}) and ({T2},
- {V2}) to make ({T1,T2}, {V1,V2}), leading to the infeasible and
- type-unsafe combination (T1,V2). Treating the value and its concrete
- type as inseparable makes the analysis type-safe.)
-
-reflect.Value
- A reflect.Value is modelled very similar to an interface{}, i.e. as
- a pointer exclusively to tagged objects, but with two generalizations.
-
- 1) a reflect.Value that represents an lvalue points to an indirect
- (obj.flags ⊇ {otIndirect}) tagged object, which has a similar
- layout to an tagged object except that the value is a pointer to
- the dynamic type. Indirect tagged objects preserve the correct
- aliasing so that mutations made by (reflect.Value).Set can be
- observed.
-
- Indirect objects only arise when an lvalue is derived from an
- rvalue by indirection, e.g. the following code:
-
- type S struct { X T }
- var s S
- var i interface{} = &s // i points to a *S-tagged object (from MakeInterface)
- v1 := reflect.ValueOf(i) // v1 points to same *S-tagged object as i
- v2 := v1.Elem() // v2 points to an indirect S-tagged object, pointing to s
- v3 := v2.FieldByName("X") // v3 points to an indirect int-tagged object, pointing to s.X
- v3.Set(y) // pts(s.X) ⊇ pts(y)
-
- Whether indirect or not, the concrete type of the tagged object
- corresponds to the user-visible dynamic type, and the existence
- of a pointer is an implementation detail.
-
- (NB: indirect tagged objects are not yet implemented)
-
- 2) The dynamic type tag of a tagged object pointed to by a
- reflect.Value may be an interface type; it need not be concrete.
-
- This arises in code such as this:
- tEface := reflect.TypeOf(new(interface{}).Elem() // interface{}
- eface := reflect.Zero(tEface)
- pts(eface) is a singleton containing an interface{}-tagged
- object. That tagged object's payload is an interface{} value,
- i.e. the pts of the payload contains only concrete-tagged
- objects, although in this example it's the zero interface{} value,
- so its pts is empty.
-
-reflect.Type
- Just as in the real "reflect" library, we represent a reflect.Type
- as an interface whose sole implementation is the concrete type,
- *reflect.rtype. (This choice is forced on us by go/types: clients
- cannot fabricate types with arbitrary method sets.)
-
- rtype instances are canonical: there is at most one per dynamic
- type. (rtypes are in fact large structs but since identity is all
- that matters, we represent them by a single node.)
-
- The payload of each *rtype-tagged object is an *rtype pointer that
- points to exactly one such canonical rtype object. We exploit this
- by setting the node.typ of the payload to the dynamic type, not
- '*rtype'. This saves us an indirection in each resolution rule. As
- an optimisation, *rtype-tagged objects are canonicalized too.
-
-
-Aggregate types:
-
-Aggregate types are treated as if all directly contained
-aggregates are recursively flattened out.
-
-Structs
- *ssa.Field y = x.f creates a simple edge to y from x's node at f's offset.
-
- *ssa.FieldAddr y = &x->f requires a dynamic closure rule to create
- simple edges for each struct discovered in pts(x).
-
- The nodes of a struct consist of a special 'identity' node (whose
- type is that of the struct itself), followed by the nodes for all
- the struct's fields, recursively flattened out. A pointer to the
- struct is a pointer to its identity node. That node allows us to
- distinguish a pointer to a struct from a pointer to its first field.
-
- Field offsets are logical field offsets (plus one for the identity
- node), so the sizes of the fields can be ignored by the analysis.
-
- (The identity node is non-traditional but enables the distinction
- described above, which is valuable for code comprehension tools.
- Typical pointer analyses for C, whose purpose is compiler
- optimization, must soundly model unsafe.Pointer (void*) conversions,
- and this requires fidelity to the actual memory layout using physical
- field offsets.)
-
- *ssa.Field y = x.f creates a simple edge to y from x's node at f's offset.
-
- *ssa.FieldAddr y = &x->f requires a dynamic closure rule to create
- simple edges for each struct discovered in pts(x).
-
-Arrays
- We model an array by an identity node (whose type is that of the
- array itself) followed by a node representing all the elements of
- the array; the analysis does not distinguish elements with different
- indices. Effectively, an array is treated like struct{elem T}, a
- load y=x[i] like y=x.elem, and a store x[i]=y like x.elem=y; the
- index i is ignored.
-
- A pointer to an array is pointer to its identity node. (A slice is
- also a pointer to an array's identity node.) The identity node
- allows us to distinguish a pointer to an array from a pointer to one
- of its elements, but it is rather costly because it introduces more
- offset constraints into the system. Furthermore, sound treatment of
- unsafe.Pointer would require us to dispense with this node.
-
- Arrays may be allocated by Alloc, by make([]T), by calls to append,
- and via reflection.
-
-Tuples (T, ...)
- Tuples are treated like structs with naturally numbered fields.
- *ssa.Extract is analogous to *ssa.Field.
-
- However, tuples have no identity field since by construction, they
- cannot be address-taken.
-
-
-FUNCTION CALLS
-
- There are three kinds of function call:
- (1) static "call"-mode calls of functions.
- (2) dynamic "call"-mode calls of functions.
- (3) dynamic "invoke"-mode calls of interface methods.
- Cases 1 and 2 apply equally to methods and standalone functions.
-
- Static calls.
- A static call consists three steps:
- - finding the function object of the callee;
- - creating copy edges from the actual parameter value nodes to the
- P-block in the function object (this includes the receiver if
- the callee is a method);
- - creating copy edges from the R-block in the function object to
- the value nodes for the result of the call.
-
- A static function call is little more than two struct value copies
- between the P/R blocks of caller and callee:
-
- callee.P = caller.P
- caller.R = callee.R
-
- Context sensitivity
-
- Static calls (alone) may be treated context sensitively,
- i.e. each callsite may cause a distinct re-analysis of the
- callee, improving precision. Our current context-sensitivity
- policy treats all intrinsics and getter/setter methods in this
- manner since such functions are small and seem like an obvious
- source of spurious confluences, though this has not yet been
- evaluated.
-
- Dynamic function calls
-
- Dynamic calls work in a similar manner except that the creation of
- copy edges occurs dynamically, in a similar fashion to a pair of
- struct copies in which the callee is indirect:
-
- callee->P = caller.P
- caller.R = callee->R
-
- (Recall that the function object's P- and R-blocks are contiguous.)
-
- Interface method invocation
-
- For invoke-mode calls, we create a params/results block for the
- callsite and attach a dynamic closure rule to the interface. For
- each new tagged object that flows to the interface, we look up
- the concrete method, find its function object, and connect its P/R
- blocks to the callsite's P/R blocks, adding copy edges to the graph
- during solving.
-
- Recording call targets
-
- The analysis notifies its clients of each callsite it encounters,
- passing a CallSite interface. Among other things, the CallSite
- contains a synthetic constraint variable ("targets") whose
- points-to solution includes the set of all function objects to
- which the call may dispatch.
-
- It is via this mechanism that the callgraph is made available.
- Clients may also elect to be notified of callgraph edges directly;
- internally this just iterates all "targets" variables' pts(·)s.
-
-
-PRESOLVER
-
-We implement Hash-Value Numbering (HVN), a pre-solver constraint
-optimization described in Hardekopf & Lin, SAS'07. This is documented
-in more detail in hvn.go. We intend to add its cousins HR and HU in
-future.
-
-
-SOLVER
-
-The solver is currently a naive Andersen-style implementation; it does
-not perform online cycle detection, though we plan to add solver
-optimisations such as Hybrid- and Lazy- Cycle Detection from (Hardekopf
-& Lin, PLDI'07).
-
-It uses difference propagation (Pearce et al, SQC'04) to avoid
-redundant re-triggering of closure rules for values already seen.
-
-Points-to sets are represented using sparse bit vectors (similar to
-those used in LLVM and gcc), which are more space- and time-efficient
-than sets based on Go's built-in map type or dense bit vectors.
-
-Nodes are permuted prior to solving so that object nodes (which may
-appear in points-to sets) are lower numbered than non-object (var)
-nodes. This improves the density of the set over which the PTSs
-range, and thus the efficiency of the representation.
-
-Partly thanks to avoiding map iteration, the execution of the solver is
-100% deterministic, a great help during debugging.
-
-
-FURTHER READING
-
-Andersen, L. O. 1994. Program analysis and specialization for the C
-programming language. Ph.D. dissertation. DIKU, University of
-Copenhagen.
-
-David J. Pearce, Paul H. J. Kelly, and Chris Hankin. 2004. Efficient
-field-sensitive pointer analysis for C. In Proceedings of the 5th ACM
-SIGPLAN-SIGSOFT workshop on Program analysis for software tools and
-engineering (PASTE '04). ACM, New York, NY, USA, 37-42.
-http://doi.acm.org/10.1145/996821.996835
-
-David J. Pearce, Paul H. J. Kelly, and Chris Hankin. 2004. Online
-Cycle Detection and Difference Propagation: Applications to Pointer
-Analysis. Software Quality Control 12, 4 (December 2004), 311-337.
-http://dx.doi.org/10.1023/B:SQJO.0000039791.93071.a2
-
-David Grove and Craig Chambers. 2001. A framework for call graph
-construction algorithms. ACM Trans. Program. Lang. Syst. 23, 6
-(November 2001), 685-746.
-http://doi.acm.org/10.1145/506315.506316
-
-Ben Hardekopf and Calvin Lin. 2007. The ant and the grasshopper: fast
-and accurate pointer analysis for millions of lines of code. In
-Proceedings of the 2007 ACM SIGPLAN conference on Programming language
-design and implementation (PLDI '07). ACM, New York, NY, USA, 290-299.
-http://doi.acm.org/10.1145/1250734.1250767
-
-Ben Hardekopf and Calvin Lin. 2007. Exploiting pointer and location
-equivalence to optimize pointer analysis. In Proceedings of the 14th
-international conference on Static Analysis (SAS'07), Hanne Riis
-Nielson and Gilberto Filé (Eds.). Springer-Verlag, Berlin, Heidelberg,
-265-280.
-
-Atanas Rountev and Satish Chandra. 2000. Off-line variable substitution
-for scaling points-to analysis. In Proceedings of the ACM SIGPLAN 2000
-conference on Programming language design and implementation (PLDI '00).
-ACM, New York, NY, USA, 47-56. DOI=10.1145/349299.349310
-http://doi.acm.org/10.1145/349299.349310
-
-*/
-package pointer // import "golang.org/x/tools/go/pointer"
diff --git a/vendor/golang.org/x/tools/go/pointer/example_test.go b/vendor/golang.org/x/tools/go/pointer/example_test.go
deleted file mode 100644
index 673de7a..0000000
--- a/vendor/golang.org/x/tools/go/pointer/example_test.go
+++ /dev/null
@@ -1,126 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package pointer_test
-
-import (
- "fmt"
- "sort"
-
- "golang.org/x/tools/go/callgraph"
- "golang.org/x/tools/go/loader"
- "golang.org/x/tools/go/pointer"
- "golang.org/x/tools/go/ssa"
- "golang.org/x/tools/go/ssa/ssautil"
-)
-
-// This program demonstrates how to use the pointer analysis to
-// obtain a conservative call-graph of a Go program.
-// It also shows how to compute the points-to set of a variable,
-// in this case, (C).f's ch parameter.
-//
-func Example() {
- const myprog = `
-package main
-
-import "fmt"
-
-type I interface {
- f(map[string]int)
-}
-
-type C struct{}
-
-func (C) f(m map[string]int) {
- fmt.Println("C.f()")
-}
-
-func main() {
- var i I = C{}
- x := map[string]int{"one":1}
- i.f(x) // dynamic method call
-}
-`
- var conf loader.Config
-
- // Parse the input file, a string.
- // (Command-line tools should use conf.FromArgs.)
- file, err := conf.ParseFile("myprog.go", myprog)
- if err != nil {
- fmt.Print(err) // parse error
- return
- }
-
- // Create single-file main package and import its dependencies.
- conf.CreateFromFiles("main", file)
-
- iprog, err := conf.Load()
- if err != nil {
- fmt.Print(err) // type error in some package
- return
- }
-
- // Create SSA-form program representation.
- prog := ssautil.CreateProgram(iprog, 0)
- mainPkg := prog.Package(iprog.Created[0].Pkg)
-
- // Build SSA code for bodies of all functions in the whole program.
- prog.Build()
-
- // Configure the pointer analysis to build a call-graph.
- config := &pointer.Config{
- Mains: []*ssa.Package{mainPkg},
- BuildCallGraph: true,
- }
-
- // Query points-to set of (C).f's parameter m, a map.
- C := mainPkg.Type("C").Type()
- Cfm := prog.LookupMethod(C, mainPkg.Pkg, "f").Params[1]
- config.AddQuery(Cfm)
-
- // Run the pointer analysis.
- result, err := pointer.Analyze(config)
- if err != nil {
- panic(err) // internal error in pointer analysis
- }
-
- // Find edges originating from the main package.
- // By converting to strings, we de-duplicate nodes
- // representing the same function due to context sensitivity.
- var edges []string
- callgraph.GraphVisitEdges(result.CallGraph, func(edge *callgraph.Edge) error {
- caller := edge.Caller.Func
- if caller.Pkg == mainPkg {
- edges = append(edges, fmt.Sprint(caller, " --> ", edge.Callee.Func))
- }
- return nil
- })
-
- // Print the edges in sorted order.
- sort.Strings(edges)
- for _, edge := range edges {
- fmt.Println(edge)
- }
- fmt.Println()
-
- // Print the labels of (C).f(m)'s points-to set.
- fmt.Println("m may point to:")
- var labels []string
- for _, l := range result.Queries[Cfm].PointsTo().Labels() {
- label := fmt.Sprintf(" %s: %s", prog.Fset.Position(l.Pos()), l)
- labels = append(labels, label)
- }
- sort.Strings(labels)
- for _, label := range labels {
- fmt.Println(label)
- }
-
- // Output:
- // (main.C).f --> fmt.Println
- // main.init --> fmt.init
- // main.main --> (main.C).f
- //
- // m may point to:
- // myprog.go:18:21: makemap
-}
diff --git a/vendor/golang.org/x/tools/go/pointer/gen.go b/vendor/golang.org/x/tools/go/pointer/gen.go
deleted file mode 100644
index a111175..0000000
--- a/vendor/golang.org/x/tools/go/pointer/gen.go
+++ /dev/null
@@ -1,1325 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package pointer
-
-// This file defines the constraint generation phase.
-
-// TODO(adonovan): move the constraint definitions and the store() etc
-// functions which add them (and are also used by the solver) into a
-// new file, constraints.go.
-
-import (
- "fmt"
- "go/token"
- "go/types"
-
- "golang.org/x/tools/go/callgraph"
- "golang.org/x/tools/go/ssa"
-)
-
-var (
- tEface = types.NewInterface(nil, nil).Complete()
- tInvalid = types.Typ[types.Invalid]
- tUnsafePtr = types.Typ[types.UnsafePointer]
-)
-
-// ---------- Node creation ----------
-
-// nextNode returns the index of the next unused node.
-func (a *analysis) nextNode() nodeid {
- return nodeid(len(a.nodes))
-}
-
-// addNodes creates nodes for all scalar elements in type typ, and
-// returns the id of the first one, or zero if the type was
-// analytically uninteresting.
-//
-// comment explains the origin of the nodes, as a debugging aid.
-//
-func (a *analysis) addNodes(typ types.Type, comment string) nodeid {
- id := a.nextNode()
- for _, fi := range a.flatten(typ) {
- a.addOneNode(fi.typ, comment, fi)
- }
- if id == a.nextNode() {
- return 0 // type contained no pointers
- }
- return id
-}
-
-// addOneNode creates a single node with type typ, and returns its id.
-//
-// typ should generally be scalar (except for tagged.T nodes
-// and struct/array identity nodes). Use addNodes for non-scalar types.
-//
-// comment explains the origin of the nodes, as a debugging aid.
-// subelement indicates the subelement, e.g. ".a.b[*].c".
-//
-func (a *analysis) addOneNode(typ types.Type, comment string, subelement *fieldInfo) nodeid {
- id := a.nextNode()
- a.nodes = append(a.nodes, &node{typ: typ, subelement: subelement, solve: new(solverState)})
- if a.log != nil {
- fmt.Fprintf(a.log, "\tcreate n%d %s for %s%s\n",
- id, typ, comment, subelement.path())
- }
- return id
-}
-
-// setValueNode associates node id with the value v.
-// cgn identifies the context iff v is a local variable.
-//
-func (a *analysis) setValueNode(v ssa.Value, id nodeid, cgn *cgnode) {
- if cgn != nil {
- a.localval[v] = id
- } else {
- a.globalval[v] = id
- }
- if a.log != nil {
- fmt.Fprintf(a.log, "\tval[%s] = n%d (%T)\n", v.Name(), id, v)
- }
-
- // Due to context-sensitivity, we may encounter the same Value
- // in many contexts. We merge them to a canonical node, since
- // that's what all clients want.
-
- // Record the (v, id) relation if the client has queried pts(v).
- if _, ok := a.config.Queries[v]; ok {
- t := v.Type()
- ptr, ok := a.result.Queries[v]
- if !ok {
- // First time? Create the canonical query node.
- ptr = Pointer{a, a.addNodes(t, "query")}
- a.result.Queries[v] = ptr
- }
- a.result.Queries[v] = ptr
- a.copy(ptr.n, id, a.sizeof(t))
- }
-
- // Record the (*v, id) relation if the client has queried pts(*v).
- if _, ok := a.config.IndirectQueries[v]; ok {
- t := v.Type()
- ptr, ok := a.result.IndirectQueries[v]
- if !ok {
- // First time? Create the canonical indirect query node.
- ptr = Pointer{a, a.addNodes(v.Type(), "query.indirect")}
- a.result.IndirectQueries[v] = ptr
- }
- a.genLoad(cgn, ptr.n, v, 0, a.sizeof(t))
- }
-
- for _, query := range a.config.extendedQueries[v] {
- t, nid := a.evalExtendedQuery(v.Type().Underlying(), id, query.ops)
-
- if query.ptr.a == nil {
- query.ptr.a = a
- query.ptr.n = a.addNodes(t, "query.extended")
- }
- a.copy(query.ptr.n, nid, a.sizeof(t))
- }
-}
-
-// endObject marks the end of a sequence of calls to addNodes denoting
-// a single object allocation.
-//
-// obj is the start node of the object, from a prior call to nextNode.
-// Its size, flags and optional data will be updated.
-//
-func (a *analysis) endObject(obj nodeid, cgn *cgnode, data interface{}) *object {
- // Ensure object is non-empty by padding;
- // the pad will be the object node.
- size := uint32(a.nextNode() - obj)
- if size == 0 {
- a.addOneNode(tInvalid, "padding", nil)
- }
- objNode := a.nodes[obj]
- o := &object{
- size: size, // excludes padding
- cgn: cgn,
- data: data,
- }
- objNode.obj = o
-
- return o
-}
-
-// makeFunctionObject creates and returns a new function object
-// (contour) for fn, and returns the id of its first node. It also
-// enqueues fn for subsequent constraint generation.
-//
-// For a context-sensitive contour, callersite identifies the sole
-// callsite; for shared contours, caller is nil.
-//
-func (a *analysis) makeFunctionObject(fn *ssa.Function, callersite *callsite) nodeid {
- if a.log != nil {
- fmt.Fprintf(a.log, "\t---- makeFunctionObject %s\n", fn)
- }
-
- // obj is the function object (identity, params, results).
- obj := a.nextNode()
- cgn := a.makeCGNode(fn, obj, callersite)
- sig := fn.Signature
- a.addOneNode(sig, "func.cgnode", nil) // (scalar with Signature type)
- if recv := sig.Recv(); recv != nil {
- a.addNodes(recv.Type(), "func.recv")
- }
- a.addNodes(sig.Params(), "func.params")
- a.addNodes(sig.Results(), "func.results")
- a.endObject(obj, cgn, fn).flags |= otFunction
-
- if a.log != nil {
- fmt.Fprintf(a.log, "\t----\n")
- }
-
- // Queue it up for constraint processing.
- a.genq = append(a.genq, cgn)
-
- return obj
-}
-
-// makeTagged creates a tagged object of type typ.
-func (a *analysis) makeTagged(typ types.Type, cgn *cgnode, data interface{}) nodeid {
- obj := a.addOneNode(typ, "tagged.T", nil) // NB: type may be non-scalar!
- a.addNodes(typ, "tagged.v")
- a.endObject(obj, cgn, data).flags |= otTagged
- return obj
-}
-
-// makeRtype returns the canonical tagged object of type *rtype whose
-// payload points to the sole rtype object for T.
-//
-// TODO(adonovan): move to reflect.go; it's part of the solver really.
-//
-func (a *analysis) makeRtype(T types.Type) nodeid {
- if v := a.rtypes.At(T); v != nil {
- return v.(nodeid)
- }
-
- // Create the object for the reflect.rtype itself, which is
- // ordinarily a large struct but here a single node will do.
- obj := a.nextNode()
- a.addOneNode(T, "reflect.rtype", nil)
- a.endObject(obj, nil, T)
-
- id := a.makeTagged(a.reflectRtypePtr, nil, T)
- a.nodes[id+1].typ = T // trick (each *rtype tagged object is a singleton)
- a.addressOf(a.reflectRtypePtr, id+1, obj)
-
- a.rtypes.Set(T, id)
- return id
-}
-
-// rtypeValue returns the type of the *reflect.rtype-tagged object obj.
-func (a *analysis) rtypeTaggedValue(obj nodeid) types.Type {
- tDyn, t, _ := a.taggedValue(obj)
- if tDyn != a.reflectRtypePtr {
- panic(fmt.Sprintf("not a *reflect.rtype-tagged object: obj=n%d tag=%v payload=n%d", obj, tDyn, t))
- }
- return a.nodes[t].typ
-}
-
-// valueNode returns the id of the value node for v, creating it (and
-// the association) as needed. It may return zero for uninteresting
-// values containing no pointers.
-//
-func (a *analysis) valueNode(v ssa.Value) nodeid {
- // Value nodes for locals are created en masse by genFunc.
- if id, ok := a.localval[v]; ok {
- return id
- }
-
- // Value nodes for globals are created on demand.
- id, ok := a.globalval[v]
- if !ok {
- var comment string
- if a.log != nil {
- comment = v.String()
- }
- id = a.addNodes(v.Type(), comment)
- if obj := a.objectNode(nil, v); obj != 0 {
- a.addressOf(v.Type(), id, obj)
- }
- a.setValueNode(v, id, nil)
- }
- return id
-}
-
-// valueOffsetNode ascertains the node for tuple/struct value v,
-// then returns the node for its subfield #index.
-//
-func (a *analysis) valueOffsetNode(v ssa.Value, index int) nodeid {
- id := a.valueNode(v)
- if id == 0 {
- panic(fmt.Sprintf("cannot offset within n0: %s = %s", v.Name(), v))
- }
- return id + nodeid(a.offsetOf(v.Type(), index))
-}
-
-// isTaggedObject reports whether object obj is a tagged object.
-func (a *analysis) isTaggedObject(obj nodeid) bool {
- return a.nodes[obj].obj.flags&otTagged != 0
-}
-
-// taggedValue returns the dynamic type tag, the (first node of the)
-// payload, and the indirect flag of the tagged object starting at id.
-// Panic ensues if !isTaggedObject(id).
-//
-func (a *analysis) taggedValue(obj nodeid) (tDyn types.Type, v nodeid, indirect bool) {
- n := a.nodes[obj]
- flags := n.obj.flags
- if flags&otTagged == 0 {
- panic(fmt.Sprintf("not a tagged object: n%d", obj))
- }
- return n.typ, obj + 1, flags&otIndirect != 0
-}
-
-// funcParams returns the first node of the params (P) block of the
-// function whose object node (obj.flags&otFunction) is id.
-//
-func (a *analysis) funcParams(id nodeid) nodeid {
- n := a.nodes[id]
- if n.obj == nil || n.obj.flags&otFunction == 0 {
- panic(fmt.Sprintf("funcParams(n%d): not a function object block", id))
- }
- return id + 1
-}
-
-// funcResults returns the first node of the results (R) block of the
-// function whose object node (obj.flags&otFunction) is id.
-//
-func (a *analysis) funcResults(id nodeid) nodeid {
- n := a.nodes[id]
- if n.obj == nil || n.obj.flags&otFunction == 0 {
- panic(fmt.Sprintf("funcResults(n%d): not a function object block", id))
- }
- sig := n.typ.(*types.Signature)
- id += 1 + nodeid(a.sizeof(sig.Params()))
- if sig.Recv() != nil {
- id += nodeid(a.sizeof(sig.Recv().Type()))
- }
- return id
-}
-
-// ---------- Constraint creation ----------
-
-// copy creates a constraint of the form dst = src.
-// sizeof is the width (in logical fields) of the copied type.
-//
-func (a *analysis) copy(dst, src nodeid, sizeof uint32) {
- if src == dst || sizeof == 0 {
- return // trivial
- }
- if src == 0 || dst == 0 {
- panic(fmt.Sprintf("ill-typed copy dst=n%d src=n%d", dst, src))
- }
- for i := uint32(0); i < sizeof; i++ {
- a.addConstraint(©Constraint{dst, src})
- src++
- dst++
- }
-}
-
-// addressOf creates a constraint of the form id = &obj.
-// T is the type of the address.
-func (a *analysis) addressOf(T types.Type, id, obj nodeid) {
- if id == 0 {
- panic("addressOf: zero id")
- }
- if obj == 0 {
- panic("addressOf: zero obj")
- }
- if a.shouldTrack(T) {
- a.addConstraint(&addrConstraint{id, obj})
- }
-}
-
-// load creates a load constraint of the form dst = src[offset].
-// offset is the pointer offset in logical fields.
-// sizeof is the width (in logical fields) of the loaded type.
-//
-func (a *analysis) load(dst, src nodeid, offset, sizeof uint32) {
- if dst == 0 {
- return // load of non-pointerlike value
- }
- if src == 0 && dst == 0 {
- return // non-pointerlike operation
- }
- if src == 0 || dst == 0 {
- panic(fmt.Sprintf("ill-typed load dst=n%d src=n%d", dst, src))
- }
- for i := uint32(0); i < sizeof; i++ {
- a.addConstraint(&loadConstraint{offset, dst, src})
- offset++
- dst++
- }
-}
-
-// store creates a store constraint of the form dst[offset] = src.
-// offset is the pointer offset in logical fields.
-// sizeof is the width (in logical fields) of the stored type.
-//
-func (a *analysis) store(dst, src nodeid, offset uint32, sizeof uint32) {
- if src == 0 {
- return // store of non-pointerlike value
- }
- if src == 0 && dst == 0 {
- return // non-pointerlike operation
- }
- if src == 0 || dst == 0 {
- panic(fmt.Sprintf("ill-typed store dst=n%d src=n%d", dst, src))
- }
- for i := uint32(0); i < sizeof; i++ {
- a.addConstraint(&storeConstraint{offset, dst, src})
- offset++
- src++
- }
-}
-
-// offsetAddr creates an offsetAddr constraint of the form dst = &src.#offset.
-// offset is the field offset in logical fields.
-// T is the type of the address.
-//
-func (a *analysis) offsetAddr(T types.Type, dst, src nodeid, offset uint32) {
- if !a.shouldTrack(T) {
- return
- }
- if offset == 0 {
- // Simplify dst = &src->f0
- // to dst = src
- // (NB: this optimisation is defeated by the identity
- // field prepended to struct and array objects.)
- a.copy(dst, src, 1)
- } else {
- a.addConstraint(&offsetAddrConstraint{offset, dst, src})
- }
-}
-
-// typeAssert creates a typeFilter or untag constraint of the form dst = src.(T):
-// typeFilter for an interface, untag for a concrete type.
-// The exact flag is specified as for untagConstraint.
-//
-func (a *analysis) typeAssert(T types.Type, dst, src nodeid, exact bool) {
- if isInterface(T) {
- a.addConstraint(&typeFilterConstraint{T, dst, src})
- } else {
- a.addConstraint(&untagConstraint{T, dst, src, exact})
- }
-}
-
-// addConstraint adds c to the constraint set.
-func (a *analysis) addConstraint(c constraint) {
- a.constraints = append(a.constraints, c)
- if a.log != nil {
- fmt.Fprintf(a.log, "\t%s\n", c)
- }
-}
-
-// copyElems generates load/store constraints for *dst = *src,
-// where src and dst are slices or *arrays.
-//
-func (a *analysis) copyElems(cgn *cgnode, typ types.Type, dst, src ssa.Value) {
- tmp := a.addNodes(typ, "copy")
- sz := a.sizeof(typ)
- a.genLoad(cgn, tmp, src, 1, sz)
- a.genStore(cgn, dst, tmp, 1, sz)
-}
-
-// ---------- Constraint generation ----------
-
-// genConv generates constraints for the conversion operation conv.
-func (a *analysis) genConv(conv *ssa.Convert, cgn *cgnode) {
- res := a.valueNode(conv)
- if res == 0 {
- return // result is non-pointerlike
- }
-
- tSrc := conv.X.Type()
- tDst := conv.Type()
-
- switch utSrc := tSrc.Underlying().(type) {
- case *types.Slice:
- // []byte/[]rune -> string?
- return
-
- case *types.Pointer:
- // *T -> unsafe.Pointer?
- if tDst.Underlying() == tUnsafePtr {
- return // we don't model unsafe aliasing (unsound)
- }
-
- case *types.Basic:
- switch tDst.Underlying().(type) {
- case *types.Pointer:
- // Treat unsafe.Pointer->*T conversions like
- // new(T) and create an unaliased object.
- if utSrc == tUnsafePtr {
- obj := a.addNodes(mustDeref(tDst), "unsafe.Pointer conversion")
- a.endObject(obj, cgn, conv)
- a.addressOf(tDst, res, obj)
- return
- }
-
- case *types.Slice:
- // string -> []byte/[]rune (or named aliases)?
- if utSrc.Info()&types.IsString != 0 {
- obj := a.addNodes(sliceToArray(tDst), "convert")
- a.endObject(obj, cgn, conv)
- a.addressOf(tDst, res, obj)
- return
- }
-
- case *types.Basic:
- // All basic-to-basic type conversions are no-ops.
- // This includes uintptr<->unsafe.Pointer conversions,
- // which we (unsoundly) ignore.
- return
- }
- }
-
- panic(fmt.Sprintf("illegal *ssa.Convert %s -> %s: %s", tSrc, tDst, conv.Parent()))
-}
-
-// genAppend generates constraints for a call to append.
-func (a *analysis) genAppend(instr *ssa.Call, cgn *cgnode) {
- // Consider z = append(x, y). y is optional.
- // This may allocate a new [1]T array; call its object w.
- // We get the following constraints:
- // z = x
- // z = &w
- // *z = *y
-
- x := instr.Call.Args[0]
-
- z := instr
- a.copy(a.valueNode(z), a.valueNode(x), 1) // z = x
-
- if len(instr.Call.Args) == 1 {
- return // no allocation for z = append(x) or _ = append(x).
- }
-
- // TODO(adonovan): test append([]byte, ...string) []byte.
-
- y := instr.Call.Args[1]
- tArray := sliceToArray(instr.Call.Args[0].Type())
-
- var w nodeid
- w = a.nextNode()
- a.addNodes(tArray, "append")
- a.endObject(w, cgn, instr)
-
- a.copyElems(cgn, tArray.Elem(), z, y) // *z = *y
- a.addressOf(instr.Type(), a.valueNode(z), w) // z = &w
-}
-
-// genBuiltinCall generates contraints for a call to a built-in.
-func (a *analysis) genBuiltinCall(instr ssa.CallInstruction, cgn *cgnode) {
- call := instr.Common()
- switch call.Value.(*ssa.Builtin).Name() {
- case "append":
- // Safe cast: append cannot appear in a go or defer statement.
- a.genAppend(instr.(*ssa.Call), cgn)
-
- case "copy":
- tElem := call.Args[0].Type().Underlying().(*types.Slice).Elem()
- a.copyElems(cgn, tElem, call.Args[0], call.Args[1])
-
- case "panic":
- a.copy(a.panicNode, a.valueNode(call.Args[0]), 1)
-
- case "recover":
- if v := instr.Value(); v != nil {
- a.copy(a.valueNode(v), a.panicNode, 1)
- }
-
- case "print":
- // In the tests, the probe might be the sole reference
- // to its arg, so make sure we create nodes for it.
- if len(call.Args) > 0 {
- a.valueNode(call.Args[0])
- }
-
- case "ssa:wrapnilchk":
- a.copy(a.valueNode(instr.Value()), a.valueNode(call.Args[0]), 1)
-
- default:
- // No-ops: close len cap real imag complex print println delete.
- }
-}
-
-// shouldUseContext defines the context-sensitivity policy. It
-// returns true if we should analyse all static calls to fn anew.
-//
-// Obviously this interface rather limits how much freedom we have to
-// choose a policy. The current policy, rather arbitrarily, is true
-// for intrinsics and accessor methods (actually: short, single-block,
-// call-free functions). This is just a starting point.
-//
-func (a *analysis) shouldUseContext(fn *ssa.Function) bool {
- if a.findIntrinsic(fn) != nil {
- return true // treat intrinsics context-sensitively
- }
- if len(fn.Blocks) != 1 {
- return false // too expensive
- }
- blk := fn.Blocks[0]
- if len(blk.Instrs) > 10 {
- return false // too expensive
- }
- if fn.Synthetic != "" && (fn.Pkg == nil || fn != fn.Pkg.Func("init")) {
- return true // treat synthetic wrappers context-sensitively
- }
- for _, instr := range blk.Instrs {
- switch instr := instr.(type) {
- case ssa.CallInstruction:
- // Disallow function calls (except to built-ins)
- // because of the danger of unbounded recursion.
- if _, ok := instr.Common().Value.(*ssa.Builtin); !ok {
- return false
- }
- }
- }
- return true
-}
-
-// genStaticCall generates constraints for a statically dispatched function call.
-func (a *analysis) genStaticCall(caller *cgnode, site *callsite, call *ssa.CallCommon, result nodeid) {
- fn := call.StaticCallee()
-
- // Special cases for inlined intrinsics.
- switch fn {
- case a.runtimeSetFinalizer:
- // Inline SetFinalizer so the call appears direct.
- site.targets = a.addOneNode(tInvalid, "SetFinalizer.targets", nil)
- a.addConstraint(&runtimeSetFinalizerConstraint{
- targets: site.targets,
- x: a.valueNode(call.Args[0]),
- f: a.valueNode(call.Args[1]),
- })
- return
-
- case a.reflectValueCall:
- // Inline (reflect.Value).Call so the call appears direct.
- dotdotdot := false
- ret := reflectCallImpl(a, caller, site, a.valueNode(call.Args[0]), a.valueNode(call.Args[1]), dotdotdot)
- if result != 0 {
- a.addressOf(fn.Signature.Results().At(0).Type(), result, ret)
- }
- return
- }
-
- // Ascertain the context (contour/cgnode) for a particular call.
- var obj nodeid
- if a.shouldUseContext(fn) {
- obj = a.makeFunctionObject(fn, site) // new contour
- } else {
- obj = a.objectNode(nil, fn) // shared contour
- }
- a.callEdge(caller, site, obj)
-
- sig := call.Signature()
-
- // Copy receiver, if any.
- params := a.funcParams(obj)
- args := call.Args
- if sig.Recv() != nil {
- sz := a.sizeof(sig.Recv().Type())
- a.copy(params, a.valueNode(args[0]), sz)
- params += nodeid(sz)
- args = args[1:]
- }
-
- // Copy actual parameters into formal params block.
- // Must loop, since the actuals aren't contiguous.
- for i, arg := range args {
- sz := a.sizeof(sig.Params().At(i).Type())
- a.copy(params, a.valueNode(arg), sz)
- params += nodeid(sz)
- }
-
- // Copy formal results block to actual result.
- if result != 0 {
- a.copy(result, a.funcResults(obj), a.sizeof(sig.Results()))
- }
-}
-
-// genDynamicCall generates constraints for a dynamic function call.
-func (a *analysis) genDynamicCall(caller *cgnode, site *callsite, call *ssa.CallCommon, result nodeid) {
- // pts(targets) will be the set of possible call targets.
- site.targets = a.valueNode(call.Value)
-
- // We add dynamic closure rules that store the arguments into
- // the P-block and load the results from the R-block of each
- // function discovered in pts(targets).
-
- sig := call.Signature()
- var offset uint32 = 1 // P/R block starts at offset 1
- for i, arg := range call.Args {
- sz := a.sizeof(sig.Params().At(i).Type())
- a.genStore(caller, call.Value, a.valueNode(arg), offset, sz)
- offset += sz
- }
- if result != 0 {
- a.genLoad(caller, result, call.Value, offset, a.sizeof(sig.Results()))
- }
-}
-
-// genInvoke generates constraints for a dynamic method invocation.
-func (a *analysis) genInvoke(caller *cgnode, site *callsite, call *ssa.CallCommon, result nodeid) {
- if call.Value.Type() == a.reflectType {
- a.genInvokeReflectType(caller, site, call, result)
- return
- }
-
- sig := call.Signature()
-
- // Allocate a contiguous targets/params/results block for this call.
- block := a.nextNode()
- // pts(targets) will be the set of possible call targets
- site.targets = a.addOneNode(sig, "invoke.targets", nil)
- p := a.addNodes(sig.Params(), "invoke.params")
- r := a.addNodes(sig.Results(), "invoke.results")
-
- // Copy the actual parameters into the call's params block.
- for i, n := 0, sig.Params().Len(); i < n; i++ {
- sz := a.sizeof(sig.Params().At(i).Type())
- a.copy(p, a.valueNode(call.Args[i]), sz)
- p += nodeid(sz)
- }
- // Copy the call's results block to the actual results.
- if result != 0 {
- a.copy(result, r, a.sizeof(sig.Results()))
- }
-
- // We add a dynamic invoke constraint that will connect the
- // caller's and the callee's P/R blocks for each discovered
- // call target.
- a.addConstraint(&invokeConstraint{call.Method, a.valueNode(call.Value), block})
-}
-
-// genInvokeReflectType is a specialization of genInvoke where the
-// receiver type is a reflect.Type, under the assumption that there
-// can be at most one implementation of this interface, *reflect.rtype.
-//
-// (Though this may appear to be an instance of a pattern---method
-// calls on interfaces known to have exactly one implementation---in
-// practice it occurs rarely, so we special case for reflect.Type.)
-//
-// In effect we treat this:
-// var rt reflect.Type = ...
-// rt.F()
-// as this:
-// rt.(*reflect.rtype).F()
-//
-func (a *analysis) genInvokeReflectType(caller *cgnode, site *callsite, call *ssa.CallCommon, result nodeid) {
- // Unpack receiver into rtype
- rtype := a.addOneNode(a.reflectRtypePtr, "rtype.recv", nil)
- recv := a.valueNode(call.Value)
- a.typeAssert(a.reflectRtypePtr, rtype, recv, true)
-
- // Look up the concrete method.
- fn := a.prog.LookupMethod(a.reflectRtypePtr, call.Method.Pkg(), call.Method.Name())
-
- obj := a.makeFunctionObject(fn, site) // new contour for this call
- a.callEdge(caller, site, obj)
-
- // From now on, it's essentially a static call, but little is
- // gained by factoring together the code for both cases.
-
- sig := fn.Signature // concrete method
- targets := a.addOneNode(sig, "call.targets", nil)
- a.addressOf(sig, targets, obj) // (a singleton)
-
- // Copy receiver.
- params := a.funcParams(obj)
- a.copy(params, rtype, 1)
- params++
-
- // Copy actual parameters into formal P-block.
- // Must loop, since the actuals aren't contiguous.
- for i, arg := range call.Args {
- sz := a.sizeof(sig.Params().At(i).Type())
- a.copy(params, a.valueNode(arg), sz)
- params += nodeid(sz)
- }
-
- // Copy formal R-block to actual R-block.
- if result != 0 {
- a.copy(result, a.funcResults(obj), a.sizeof(sig.Results()))
- }
-}
-
-// genCall generates constraints for call instruction instr.
-func (a *analysis) genCall(caller *cgnode, instr ssa.CallInstruction) {
- call := instr.Common()
-
- // Intrinsic implementations of built-in functions.
- if _, ok := call.Value.(*ssa.Builtin); ok {
- a.genBuiltinCall(instr, caller)
- return
- }
-
- var result nodeid
- if v := instr.Value(); v != nil {
- result = a.valueNode(v)
- }
-
- site := &callsite{instr: instr}
- if call.StaticCallee() != nil {
- a.genStaticCall(caller, site, call, result)
- } else if call.IsInvoke() {
- a.genInvoke(caller, site, call, result)
- } else {
- a.genDynamicCall(caller, site, call, result)
- }
-
- caller.sites = append(caller.sites, site)
-
- if a.log != nil {
- // TODO(adonovan): debug: improve log message.
- fmt.Fprintf(a.log, "\t%s to targets %s from %s\n", site, site.targets, caller)
- }
-}
-
-// objectNode returns the object to which v points, if known.
-// In other words, if the points-to set of v is a singleton, it
-// returns the sole label, zero otherwise.
-//
-// We exploit this information to make the generated constraints less
-// dynamic. For example, a complex load constraint can be replaced by
-// a simple copy constraint when the sole destination is known a priori.
-//
-// Some SSA instructions always have singletons points-to sets:
-// Alloc, Function, Global, MakeChan, MakeClosure, MakeInterface, MakeMap, MakeSlice.
-// Others may be singletons depending on their operands:
-// FreeVar, Const, Convert, FieldAddr, IndexAddr, Slice.
-//
-// Idempotent. Objects are created as needed, possibly via recursion
-// down the SSA value graph, e.g IndexAddr(FieldAddr(Alloc))).
-//
-func (a *analysis) objectNode(cgn *cgnode, v ssa.Value) nodeid {
- switch v.(type) {
- case *ssa.Global, *ssa.Function, *ssa.Const, *ssa.FreeVar:
- // Global object.
- obj, ok := a.globalobj[v]
- if !ok {
- switch v := v.(type) {
- case *ssa.Global:
- obj = a.nextNode()
- a.addNodes(mustDeref(v.Type()), "global")
- a.endObject(obj, nil, v)
-
- case *ssa.Function:
- obj = a.makeFunctionObject(v, nil)
-
- case *ssa.Const:
- // not addressable
-
- case *ssa.FreeVar:
- // not addressable
- }
-
- if a.log != nil {
- fmt.Fprintf(a.log, "\tglobalobj[%s] = n%d\n", v, obj)
- }
- a.globalobj[v] = obj
- }
- return obj
- }
-
- // Local object.
- obj, ok := a.localobj[v]
- if !ok {
- switch v := v.(type) {
- case *ssa.Alloc:
- obj = a.nextNode()
- a.addNodes(mustDeref(v.Type()), "alloc")
- a.endObject(obj, cgn, v)
-
- case *ssa.MakeSlice:
- obj = a.nextNode()
- a.addNodes(sliceToArray(v.Type()), "makeslice")
- a.endObject(obj, cgn, v)
-
- case *ssa.MakeChan:
- obj = a.nextNode()
- a.addNodes(v.Type().Underlying().(*types.Chan).Elem(), "makechan")
- a.endObject(obj, cgn, v)
-
- case *ssa.MakeMap:
- obj = a.nextNode()
- tmap := v.Type().Underlying().(*types.Map)
- a.addNodes(tmap.Key(), "makemap.key")
- elem := a.addNodes(tmap.Elem(), "makemap.value")
-
- // To update the value field, MapUpdate
- // generates store-with-offset constraints which
- // the presolver can't model, so we must mark
- // those nodes indirect.
- for id, end := elem, elem+nodeid(a.sizeof(tmap.Elem())); id < end; id++ {
- a.mapValues = append(a.mapValues, id)
- }
- a.endObject(obj, cgn, v)
-
- case *ssa.MakeInterface:
- tConc := v.X.Type()
- obj = a.makeTagged(tConc, cgn, v)
-
- // Copy the value into it, if nontrivial.
- if x := a.valueNode(v.X); x != 0 {
- a.copy(obj+1, x, a.sizeof(tConc))
- }
-
- case *ssa.FieldAddr:
- if xobj := a.objectNode(cgn, v.X); xobj != 0 {
- obj = xobj + nodeid(a.offsetOf(mustDeref(v.X.Type()), v.Field))
- }
-
- case *ssa.IndexAddr:
- if xobj := a.objectNode(cgn, v.X); xobj != 0 {
- obj = xobj + 1
- }
-
- case *ssa.Slice:
- obj = a.objectNode(cgn, v.X)
-
- case *ssa.Convert:
- // TODO(adonovan): opt: handle these cases too:
- // - unsafe.Pointer->*T conversion acts like Alloc
- // - string->[]byte/[]rune conversion acts like MakeSlice
- }
-
- if a.log != nil {
- fmt.Fprintf(a.log, "\tlocalobj[%s] = n%d\n", v.Name(), obj)
- }
- a.localobj[v] = obj
- }
- return obj
-}
-
-// genLoad generates constraints for result = *(ptr + val).
-func (a *analysis) genLoad(cgn *cgnode, result nodeid, ptr ssa.Value, offset, sizeof uint32) {
- if obj := a.objectNode(cgn, ptr); obj != 0 {
- // Pre-apply loadConstraint.solve().
- a.copy(result, obj+nodeid(offset), sizeof)
- } else {
- a.load(result, a.valueNode(ptr), offset, sizeof)
- }
-}
-
-// genOffsetAddr generates constraints for a 'v=ptr.field' (FieldAddr)
-// or 'v=ptr[*]' (IndexAddr) instruction v.
-func (a *analysis) genOffsetAddr(cgn *cgnode, v ssa.Value, ptr nodeid, offset uint32) {
- dst := a.valueNode(v)
- if obj := a.objectNode(cgn, v); obj != 0 {
- // Pre-apply offsetAddrConstraint.solve().
- a.addressOf(v.Type(), dst, obj)
- } else {
- a.offsetAddr(v.Type(), dst, ptr, offset)
- }
-}
-
-// genStore generates constraints for *(ptr + offset) = val.
-func (a *analysis) genStore(cgn *cgnode, ptr ssa.Value, val nodeid, offset, sizeof uint32) {
- if obj := a.objectNode(cgn, ptr); obj != 0 {
- // Pre-apply storeConstraint.solve().
- a.copy(obj+nodeid(offset), val, sizeof)
- } else {
- a.store(a.valueNode(ptr), val, offset, sizeof)
- }
-}
-
-// genInstr generates constraints for instruction instr in context cgn.
-func (a *analysis) genInstr(cgn *cgnode, instr ssa.Instruction) {
- if a.log != nil {
- var prefix string
- if val, ok := instr.(ssa.Value); ok {
- prefix = val.Name() + " = "
- }
- fmt.Fprintf(a.log, "; %s%s\n", prefix, instr)
- }
-
- switch instr := instr.(type) {
- case *ssa.DebugRef:
- // no-op.
-
- case *ssa.UnOp:
- switch instr.Op {
- case token.ARROW: // <-x
- // We can ignore instr.CommaOk because the node we're
- // altering is always at zero offset relative to instr
- tElem := instr.X.Type().Underlying().(*types.Chan).Elem()
- a.genLoad(cgn, a.valueNode(instr), instr.X, 0, a.sizeof(tElem))
-
- case token.MUL: // *x
- a.genLoad(cgn, a.valueNode(instr), instr.X, 0, a.sizeof(instr.Type()))
-
- default:
- // NOT, SUB, XOR: no-op.
- }
-
- case *ssa.BinOp:
- // All no-ops.
-
- case ssa.CallInstruction: // *ssa.Call, *ssa.Go, *ssa.Defer
- a.genCall(cgn, instr)
-
- case *ssa.ChangeType:
- a.copy(a.valueNode(instr), a.valueNode(instr.X), 1)
-
- case *ssa.Convert:
- a.genConv(instr, cgn)
-
- case *ssa.Extract:
- a.copy(a.valueNode(instr),
- a.valueOffsetNode(instr.Tuple, instr.Index),
- a.sizeof(instr.Type()))
-
- case *ssa.FieldAddr:
- a.genOffsetAddr(cgn, instr, a.valueNode(instr.X),
- a.offsetOf(mustDeref(instr.X.Type()), instr.Field))
-
- case *ssa.IndexAddr:
- a.genOffsetAddr(cgn, instr, a.valueNode(instr.X), 1)
-
- case *ssa.Field:
- a.copy(a.valueNode(instr),
- a.valueOffsetNode(instr.X, instr.Field),
- a.sizeof(instr.Type()))
-
- case *ssa.Index:
- a.copy(a.valueNode(instr), 1+a.valueNode(instr.X), a.sizeof(instr.Type()))
-
- case *ssa.Select:
- recv := a.valueOffsetNode(instr, 2) // instr : (index, recvOk, recv0, ... recv_n-1)
- for _, st := range instr.States {
- elemSize := a.sizeof(st.Chan.Type().Underlying().(*types.Chan).Elem())
- switch st.Dir {
- case types.RecvOnly:
- a.genLoad(cgn, recv, st.Chan, 0, elemSize)
- recv += nodeid(elemSize)
-
- case types.SendOnly:
- a.genStore(cgn, st.Chan, a.valueNode(st.Send), 0, elemSize)
- }
- }
-
- case *ssa.Return:
- results := a.funcResults(cgn.obj)
- for _, r := range instr.Results {
- sz := a.sizeof(r.Type())
- a.copy(results, a.valueNode(r), sz)
- results += nodeid(sz)
- }
-
- case *ssa.Send:
- a.genStore(cgn, instr.Chan, a.valueNode(instr.X), 0, a.sizeof(instr.X.Type()))
-
- case *ssa.Store:
- a.genStore(cgn, instr.Addr, a.valueNode(instr.Val), 0, a.sizeof(instr.Val.Type()))
-
- case *ssa.Alloc, *ssa.MakeSlice, *ssa.MakeChan, *ssa.MakeMap, *ssa.MakeInterface:
- v := instr.(ssa.Value)
- a.addressOf(v.Type(), a.valueNode(v), a.objectNode(cgn, v))
-
- case *ssa.ChangeInterface:
- a.copy(a.valueNode(instr), a.valueNode(instr.X), 1)
-
- case *ssa.TypeAssert:
- a.typeAssert(instr.AssertedType, a.valueNode(instr), a.valueNode(instr.X), true)
-
- case *ssa.Slice:
- a.copy(a.valueNode(instr), a.valueNode(instr.X), 1)
-
- case *ssa.If, *ssa.Jump:
- // no-op.
-
- case *ssa.Phi:
- sz := a.sizeof(instr.Type())
- for _, e := range instr.Edges {
- a.copy(a.valueNode(instr), a.valueNode(e), sz)
- }
-
- case *ssa.MakeClosure:
- fn := instr.Fn.(*ssa.Function)
- a.copy(a.valueNode(instr), a.valueNode(fn), 1)
- // Free variables are treated like global variables.
- for i, b := range instr.Bindings {
- a.copy(a.valueNode(fn.FreeVars[i]), a.valueNode(b), a.sizeof(b.Type()))
- }
-
- case *ssa.RunDefers:
- // The analysis is flow insensitive, so we just "call"
- // defers as we encounter them.
-
- case *ssa.Range:
- // Do nothing. Next{Iter: *ssa.Range} handles this case.
-
- case *ssa.Next:
- if !instr.IsString { // map
- // Assumes that Next is always directly applied to a Range result.
- theMap := instr.Iter.(*ssa.Range).X
- tMap := theMap.Type().Underlying().(*types.Map)
-
- ksize := a.sizeof(tMap.Key())
- vsize := a.sizeof(tMap.Elem())
-
- // The k/v components of the Next tuple may each be invalid.
- tTuple := instr.Type().(*types.Tuple)
-
- // Load from the map's (k,v) into the tuple's (ok, k, v).
- osrc := uint32(0) // offset within map object
- odst := uint32(1) // offset within tuple (initially just after 'ok bool')
- sz := uint32(0) // amount to copy
-
- // Is key valid?
- if tTuple.At(1).Type() != tInvalid {
- sz += ksize
- } else {
- odst += ksize
- osrc += ksize
- }
-
- // Is value valid?
- if tTuple.At(2).Type() != tInvalid {
- sz += vsize
- }
-
- a.genLoad(cgn, a.valueNode(instr)+nodeid(odst), theMap, osrc, sz)
- }
-
- case *ssa.Lookup:
- if tMap, ok := instr.X.Type().Underlying().(*types.Map); ok {
- // CommaOk can be ignored: field 0 is a no-op.
- ksize := a.sizeof(tMap.Key())
- vsize := a.sizeof(tMap.Elem())
- a.genLoad(cgn, a.valueNode(instr), instr.X, ksize, vsize)
- }
-
- case *ssa.MapUpdate:
- tmap := instr.Map.Type().Underlying().(*types.Map)
- ksize := a.sizeof(tmap.Key())
- vsize := a.sizeof(tmap.Elem())
- a.genStore(cgn, instr.Map, a.valueNode(instr.Key), 0, ksize)
- a.genStore(cgn, instr.Map, a.valueNode(instr.Value), ksize, vsize)
-
- case *ssa.Panic:
- a.copy(a.panicNode, a.valueNode(instr.X), 1)
-
- default:
- panic(fmt.Sprintf("unimplemented: %T", instr))
- }
-}
-
-func (a *analysis) makeCGNode(fn *ssa.Function, obj nodeid, callersite *callsite) *cgnode {
- cgn := &cgnode{fn: fn, obj: obj, callersite: callersite}
- a.cgnodes = append(a.cgnodes, cgn)
- return cgn
-}
-
-// genRootCalls generates the synthetic root of the callgraph and the
-// initial calls from it to the analysis scope, such as main, a test
-// or a library.
-//
-func (a *analysis) genRootCalls() *cgnode {
- r := a.prog.NewFunction("", new(types.Signature), "root of callgraph")
- root := a.makeCGNode(r, 0, nil)
-
- // TODO(adonovan): make an ssa utility to construct an actual
- // root function so we don't need to special-case site-less
- // call edges.
-
- // For each main package, call main.init(), main.main().
- for _, mainPkg := range a.config.Mains {
- main := mainPkg.Func("main")
- if main == nil {
- panic(fmt.Sprintf("%s has no main function", mainPkg))
- }
-
- targets := a.addOneNode(main.Signature, "root.targets", nil)
- site := &callsite{targets: targets}
- root.sites = append(root.sites, site)
- for _, fn := range [2]*ssa.Function{mainPkg.Func("init"), main} {
- if a.log != nil {
- fmt.Fprintf(a.log, "\troot call to %s:\n", fn)
- }
- a.copy(targets, a.valueNode(fn), 1)
- }
- }
-
- return root
-}
-
-// genFunc generates constraints for function fn.
-func (a *analysis) genFunc(cgn *cgnode) {
- fn := cgn.fn
-
- impl := a.findIntrinsic(fn)
-
- if a.log != nil {
- fmt.Fprintf(a.log, "\n\n==== Generating constraints for %s, %s\n", cgn, cgn.contour())
-
- // Hack: don't display body if intrinsic.
- if impl != nil {
- fn2 := *cgn.fn // copy
- fn2.Locals = nil
- fn2.Blocks = nil
- fn2.WriteTo(a.log)
- } else {
- cgn.fn.WriteTo(a.log)
- }
- }
-
- if impl != nil {
- impl(a, cgn)
- return
- }
-
- if fn.Blocks == nil {
- // External function with no intrinsic treatment.
- // We'll warn about calls to such functions at the end.
- return
- }
-
- if a.log != nil {
- fmt.Fprintln(a.log, "; Creating nodes for local values")
- }
-
- a.localval = make(map[ssa.Value]nodeid)
- a.localobj = make(map[ssa.Value]nodeid)
-
- // The value nodes for the params are in the func object block.
- params := a.funcParams(cgn.obj)
- for _, p := range fn.Params {
- a.setValueNode(p, params, cgn)
- params += nodeid(a.sizeof(p.Type()))
- }
-
- // Free variables have global cardinality:
- // the outer function sets them with MakeClosure;
- // the inner function accesses them with FreeVar.
- //
- // TODO(adonovan): treat free vars context-sensitively.
-
- // Create value nodes for all value instructions
- // since SSA may contain forward references.
- var space [10]*ssa.Value
- for _, b := range fn.Blocks {
- for _, instr := range b.Instrs {
- switch instr := instr.(type) {
- case *ssa.Range:
- // do nothing: it has a funky type,
- // and *ssa.Next does all the work.
-
- case ssa.Value:
- var comment string
- if a.log != nil {
- comment = instr.Name()
- }
- id := a.addNodes(instr.Type(), comment)
- a.setValueNode(instr, id, cgn)
- }
-
- // Record all address-taken functions (for presolver).
- rands := instr.Operands(space[:0])
- if call, ok := instr.(ssa.CallInstruction); ok && !call.Common().IsInvoke() {
- // Skip CallCommon.Value in "call" mode.
- // TODO(adonovan): fix: relies on unspecified ordering. Specify it.
- rands = rands[1:]
- }
- for _, rand := range rands {
- if atf, ok := (*rand).(*ssa.Function); ok {
- a.atFuncs[atf] = true
- }
- }
- }
- }
-
- // Generate constraints for instructions.
- for _, b := range fn.Blocks {
- for _, instr := range b.Instrs {
- a.genInstr(cgn, instr)
- }
- }
-
- a.localval = nil
- a.localobj = nil
-}
-
-// genMethodsOf generates nodes and constraints for all methods of type T.
-func (a *analysis) genMethodsOf(T types.Type) {
- itf := isInterface(T)
-
- // TODO(adonovan): can we skip this entirely if itf is true?
- // I think so, but the answer may depend on reflection.
- mset := a.prog.MethodSets.MethodSet(T)
- for i, n := 0, mset.Len(); i < n; i++ {
- m := a.prog.MethodValue(mset.At(i))
- a.valueNode(m)
-
- if !itf {
- // Methods of concrete types are address-taken functions.
- a.atFuncs[m] = true
- }
- }
-}
-
-// generate generates offline constraints for the entire program.
-func (a *analysis) generate() {
- start("Constraint generation")
- if a.log != nil {
- fmt.Fprintln(a.log, "==== Generating constraints")
- }
-
- // Create a dummy node since we use the nodeid 0 for
- // non-pointerlike variables.
- a.addNodes(tInvalid, "(zero)")
-
- // Create the global node for panic values.
- a.panicNode = a.addNodes(tEface, "panic")
-
- // Create nodes and constraints for all methods of reflect.rtype.
- // (Shared contours are used by dynamic calls to reflect.Type
- // methods---typically just String().)
- if rtype := a.reflectRtypePtr; rtype != nil {
- a.genMethodsOf(rtype)
- }
-
- root := a.genRootCalls()
-
- if a.config.BuildCallGraph {
- a.result.CallGraph = callgraph.New(root.fn)
- }
-
- // Create nodes and constraints for all methods of all types
- // that are dynamically accessible via reflection or interfaces.
- for _, T := range a.prog.RuntimeTypes() {
- a.genMethodsOf(T)
- }
-
- // Generate constraints for functions as they become reachable
- // from the roots. (No constraints are generated for functions
- // that are dead in this analysis scope.)
- for len(a.genq) > 0 {
- cgn := a.genq[0]
- a.genq = a.genq[1:]
- a.genFunc(cgn)
- }
-
- // The runtime magically allocates os.Args; so should we.
- if os := a.prog.ImportedPackage("os"); os != nil {
- // In effect: os.Args = new([1]string)[:]
- T := types.NewSlice(types.Typ[types.String])
- obj := a.addNodes(sliceToArray(T), "")
- a.endObject(obj, nil, "")
- a.addressOf(T, a.objectNode(nil, os.Var("Args")), obj)
- }
-
- // Discard generation state, to avoid confusion after node renumbering.
- a.panicNode = 0
- a.globalval = nil
- a.localval = nil
- a.localobj = nil
-
- stop("Constraint generation")
-}
diff --git a/vendor/golang.org/x/tools/go/pointer/hvn.go b/vendor/golang.org/x/tools/go/pointer/hvn.go
deleted file mode 100644
index 48051ae..0000000
--- a/vendor/golang.org/x/tools/go/pointer/hvn.go
+++ /dev/null
@@ -1,973 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package pointer
-
-// This file implements Hash-Value Numbering (HVN), a pre-solver
-// constraint optimization described in Hardekopf & Lin, SAS'07 (see
-// doc.go) that analyses the graph topology to determine which sets of
-// variables are "pointer equivalent" (PE), i.e. must have identical
-// points-to sets in the solution.
-//
-// A separate ("offline") graph is constructed. Its nodes are those of
-// the main-graph, plus an additional node *X for each pointer node X.
-// With this graph we can reason about the unknown points-to set of
-// dereferenced pointers. (We do not generalize this to represent
-// unknown fields x->f, perhaps because such fields would be numerous,
-// though it might be worth an experiment.)
-//
-// Nodes whose points-to relations are not entirely captured by the
-// graph are marked as "indirect": the *X nodes, the parameters of
-// address-taken functions (which includes all functions in method
-// sets), or nodes updated by the solver rules for reflection, etc.
-//
-// All addr (y=&x) nodes are initially assigned a pointer-equivalence
-// (PE) label equal to x's nodeid in the main graph. (These are the
-// only PE labels that are less than len(a.nodes).)
-//
-// All offsetAddr (y=&x.f) constraints are initially assigned a PE
-// label; such labels are memoized, keyed by (x, f), so that equivalent
-// nodes y as assigned the same label.
-//
-// Then we process each strongly connected component (SCC) of the graph
-// in topological order, assigning it a PE label based on the set P of
-// PE labels that flow to it from its immediate dependencies.
-//
-// If any node in P is "indirect", the entire SCC is assigned a fresh PE
-// label. Otherwise:
-//
-// |P|=0 if P is empty, all nodes in the SCC are non-pointers (e.g.
-// uninitialized variables, or formal params of dead functions)
-// and the SCC is assigned the PE label of zero.
-//
-// |P|=1 if P is a singleton, the SCC is assigned the same label as the
-// sole element of P.
-//
-// |P|>1 if P contains multiple labels, a unique label representing P is
-// invented and recorded in an hash table, so that other
-// equivalent SCCs may also be assigned this label, akin to
-// conventional hash-value numbering in a compiler.
-//
-// Finally, a renumbering is computed such that each node is replaced by
-// the lowest-numbered node with the same PE label. All constraints are
-// renumbered, and any resulting duplicates are eliminated.
-//
-// The only nodes that are not renumbered are the objects x in addr
-// (y=&x) constraints, since the ids of these nodes (and fields derived
-// from them via offsetAddr rules) are the elements of all points-to
-// sets, so they must remain as they are if we want the same solution.
-//
-// The solverStates (node.solve) for nodes in the same equivalence class
-// are linked together so that all nodes in the class have the same
-// solution. This avoids the need to renumber nodeids buried in
-// Queries, cgnodes, etc (like (*analysis).renumber() does) since only
-// the solution is needed.
-//
-// The result of HVN is that the number of distinct nodes and
-// constraints is reduced, but the solution is identical (almost---see
-// CROSS-CHECK below). In particular, both linear and cyclic chains of
-// copies are each replaced by a single node.
-//
-// Nodes and constraints created "online" (e.g. while solving reflection
-// constraints) are not subject to this optimization.
-//
-// PERFORMANCE
-//
-// In two benchmarks (guru and godoc), HVN eliminates about two thirds
-// of nodes, the majority accounted for by non-pointers: nodes of
-// non-pointer type, pointers that remain nil, formal parameters of dead
-// functions, nodes of untracked types, etc. It also reduces the number
-// of constraints, also by about two thirds, and the solving time by
-// 30--42%, although we must pay about 15% for the running time of HVN
-// itself. The benefit is greater for larger applications.
-//
-// There are many possible optimizations to improve the performance:
-// * Use fewer than 1:1 onodes to main graph nodes: many of the onodes
-// we create are not needed.
-// * HU (HVN with Union---see paper): coalesce "union" peLabels when
-// their expanded-out sets are equal.
-// * HR (HVN with deReference---see paper): this will require that we
-// apply HVN until fixed point, which may need more bookkeeping of the
-// correspondance of main nodes to onodes.
-// * Location Equivalence (see paper): have points-to sets contain not
-// locations but location-equivalence class labels, each representing
-// a set of locations.
-// * HVN with field-sensitive ref: model each of the fields of a
-// pointer-to-struct.
-//
-// CROSS-CHECK
-//
-// To verify the soundness of the optimization, when the
-// debugHVNCrossCheck option is enabled, we run the solver twice, once
-// before and once after running HVN, dumping the solution to disk, and
-// then we compare the results. If they are not identical, the analysis
-// panics.
-//
-// The solution dumped to disk includes only the N*N submatrix of the
-// complete solution where N is the number of nodes after generation.
-// In other words, we ignore pointer variables and objects created by
-// the solver itself, since their numbering depends on the solver order,
-// which is affected by the optimization. In any case, that's the only
-// part the client cares about.
-//
-// The cross-check is too strict and may fail spuriously. Although the
-// H&L paper describing HVN states that the solutions obtained should be
-// identical, this is not the case in practice because HVN can collapse
-// cycles involving *p even when pts(p)={}. Consider this example
-// distilled from testdata/hello.go:
-//
-// var x T
-// func f(p **T) {
-// t0 = *p
-// ...
-// t1 = φ(t0, &x)
-// *p = t1
-// }
-//
-// If f is dead code, we get:
-// unoptimized: pts(p)={} pts(t0)={} pts(t1)={&x}
-// optimized: pts(p)={} pts(t0)=pts(t1)=pts(*p)={&x}
-//
-// It's hard to argue that this is a bug: the result is sound and the
-// loss of precision is inconsequential---f is dead code, after all.
-// But unfortunately it limits the usefulness of the cross-check since
-// failures must be carefully analyzed. Ben Hardekopf suggests (in
-// personal correspondence) some approaches to mitigating it:
-//
-// If there is a node with an HVN points-to set that is a superset
-// of the NORM points-to set, then either it's a bug or it's a
-// result of this issue. If it's a result of this issue, then in
-// the offline constraint graph there should be a REF node inside
-// some cycle that reaches this node, and in the NORM solution the
-// pointer being dereferenced by that REF node should be the empty
-// set. If that isn't true then this is a bug. If it is true, then
-// you can further check that in the NORM solution the "extra"
-// points-to info in the HVN solution does in fact come from that
-// purported cycle (if it doesn't, then this is still a bug). If
-// you're doing the further check then you'll need to do it for
-// each "extra" points-to element in the HVN points-to set.
-//
-// There are probably ways to optimize these checks by taking
-// advantage of graph properties. For example, extraneous points-to
-// info will flow through the graph and end up in many
-// nodes. Rather than checking every node with extra info, you
-// could probably work out the "origin point" of the extra info and
-// just check there. Note that the check in the first bullet is
-// looking for soundness bugs, while the check in the second bullet
-// is looking for precision bugs; depending on your needs, you may
-// care more about one than the other.
-//
-// which we should evaluate. The cross-check is nonetheless invaluable
-// for all but one of the programs in the pointer_test suite.
-
-import (
- "fmt"
- "go/types"
- "io"
- "reflect"
-
- "golang.org/x/tools/container/intsets"
-)
-
-// A peLabel is a pointer-equivalence label: two nodes with the same
-// peLabel have identical points-to solutions.
-//
-// The numbers are allocated consecutively like so:
-// 0 not a pointer
-// 1..N-1 addrConstraints (equals the constraint's .src field, hence sparse)
-// ... offsetAddr constraints
-// ... SCCs (with indirect nodes or multiple inputs)
-//
-// Each PE label denotes a set of pointers containing a single addr, a
-// single offsetAddr, or some set of other PE labels.
-//
-type peLabel int
-
-type hvn struct {
- a *analysis
- N int // len(a.nodes) immediately after constraint generation
- log io.Writer // (optional) log of HVN lemmas
- onodes []*onode // nodes of the offline graph
- label peLabel // the next available PE label
- hvnLabel map[string]peLabel // hash-value numbering (PE label) for each set of onodeids
- stack []onodeid // DFS stack
- index int32 // next onode.index, from Tarjan's SCC algorithm
-
- // For each distinct offsetAddrConstraint (src, offset) pair,
- // offsetAddrLabels records a unique PE label >= N.
- offsetAddrLabels map[offsetAddr]peLabel
-}
-
-// The index of an node in the offline graph.
-// (Currently the first N align with the main nodes,
-// but this may change with HRU.)
-type onodeid uint32
-
-// An onode is a node in the offline constraint graph.
-// (Where ambiguous, members of analysis.nodes are referred to as
-// "main graph" nodes.)
-//
-// Edges in the offline constraint graph (edges and implicit) point to
-// the source, i.e. against the flow of values: they are dependencies.
-// Implicit edges are used for SCC computation, but not for gathering
-// incoming labels.
-//
-type onode struct {
- rep onodeid // index of representative of SCC in offline constraint graph
-
- edges intsets.Sparse // constraint edges X-->Y (this onode is X)
- implicit intsets.Sparse // implicit edges *X-->*Y (this onode is X)
- peLabels intsets.Sparse // set of peLabels are pointer-equivalent to this one
- indirect bool // node has points-to relations not represented in graph
-
- // Tarjan's SCC algorithm
- index, lowlink int32 // Tarjan numbering
- scc int32 // -ve => on stack; 0 => unvisited; +ve => node is root of a found SCC
-}
-
-type offsetAddr struct {
- ptr nodeid
- offset uint32
-}
-
-// nextLabel issues the next unused pointer-equivalence label.
-func (h *hvn) nextLabel() peLabel {
- h.label++
- return h.label
-}
-
-// ref(X) returns the index of the onode for *X.
-func (h *hvn) ref(id onodeid) onodeid {
- return id + onodeid(len(h.a.nodes))
-}
-
-// hvn computes pointer-equivalence labels (peLabels) using the Hash-based
-// Value Numbering (HVN) algorithm described in Hardekopf & Lin, SAS'07.
-//
-func (a *analysis) hvn() {
- start("HVN")
-
- if a.log != nil {
- fmt.Fprintf(a.log, "\n\n==== Pointer equivalence optimization\n\n")
- }
-
- h := hvn{
- a: a,
- N: len(a.nodes),
- log: a.log,
- hvnLabel: make(map[string]peLabel),
- offsetAddrLabels: make(map[offsetAddr]peLabel),
- }
-
- if h.log != nil {
- fmt.Fprintf(h.log, "\nCreating offline graph nodes...\n")
- }
-
- // Create offline nodes. The first N nodes correspond to main
- // graph nodes; the next N are their corresponding ref() nodes.
- h.onodes = make([]*onode, 2*h.N)
- for id := range a.nodes {
- id := onodeid(id)
- h.onodes[id] = &onode{}
- h.onodes[h.ref(id)] = &onode{indirect: true}
- }
-
- // Each node initially represents just itself.
- for id, o := range h.onodes {
- o.rep = onodeid(id)
- }
-
- h.markIndirectNodes()
-
- // Reserve the first N PE labels for addrConstraints.
- h.label = peLabel(h.N)
-
- // Add offline constraint edges.
- if h.log != nil {
- fmt.Fprintf(h.log, "\nAdding offline graph edges...\n")
- }
- for _, c := range a.constraints {
- if debugHVNVerbose && h.log != nil {
- fmt.Fprintf(h.log, "; %s\n", c)
- }
- c.presolve(&h)
- }
-
- // Find and collapse SCCs.
- if h.log != nil {
- fmt.Fprintf(h.log, "\nFinding SCCs...\n")
- }
- h.index = 1
- for id, o := range h.onodes {
- if id > 0 && o.index == 0 {
- // Start depth-first search at each unvisited node.
- h.visit(onodeid(id))
- }
- }
-
- // Dump the solution
- // (NB: somewhat redundant with logging from simplify().)
- if debugHVNVerbose && h.log != nil {
- fmt.Fprintf(h.log, "\nPointer equivalences:\n")
- for id, o := range h.onodes {
- if id == 0 {
- continue
- }
- if id == int(h.N) {
- fmt.Fprintf(h.log, "---\n")
- }
- fmt.Fprintf(h.log, "o%d\t", id)
- if o.rep != onodeid(id) {
- fmt.Fprintf(h.log, "rep=o%d", o.rep)
- } else {
- fmt.Fprintf(h.log, "p%d", o.peLabels.Min())
- if o.indirect {
- fmt.Fprint(h.log, " indirect")
- }
- }
- fmt.Fprintln(h.log)
- }
- }
-
- // Simplify the main constraint graph
- h.simplify()
-
- a.showCounts()
-
- stop("HVN")
-}
-
-// ---- constraint-specific rules ----
-
-// dst := &src
-func (c *addrConstraint) presolve(h *hvn) {
- // Each object (src) is an initial PE label.
- label := peLabel(c.src) // label < N
- if debugHVNVerbose && h.log != nil {
- // duplicate log messages are possible
- fmt.Fprintf(h.log, "\tcreate p%d: {&n%d}\n", label, c.src)
- }
- odst := onodeid(c.dst)
- osrc := onodeid(c.src)
-
- // Assign dst this label.
- h.onodes[odst].peLabels.Insert(int(label))
- if debugHVNVerbose && h.log != nil {
- fmt.Fprintf(h.log, "\to%d has p%d\n", odst, label)
- }
-
- h.addImplicitEdge(h.ref(odst), osrc) // *dst ~~> src.
-}
-
-// dst = src
-func (c *copyConstraint) presolve(h *hvn) {
- odst := onodeid(c.dst)
- osrc := onodeid(c.src)
- h.addEdge(odst, osrc) // dst --> src
- h.addImplicitEdge(h.ref(odst), h.ref(osrc)) // *dst ~~> *src
-}
-
-// dst = *src + offset
-func (c *loadConstraint) presolve(h *hvn) {
- odst := onodeid(c.dst)
- osrc := onodeid(c.src)
- if c.offset == 0 {
- h.addEdge(odst, h.ref(osrc)) // dst --> *src
- } else {
- // We don't interpret load-with-offset, e.g. results
- // of map value lookup, R-block of dynamic call, slice
- // copy/append, reflection.
- h.markIndirect(odst, "load with offset")
- }
-}
-
-// *dst + offset = src
-func (c *storeConstraint) presolve(h *hvn) {
- odst := onodeid(c.dst)
- osrc := onodeid(c.src)
- if c.offset == 0 {
- h.onodes[h.ref(odst)].edges.Insert(int(osrc)) // *dst --> src
- if debugHVNVerbose && h.log != nil {
- fmt.Fprintf(h.log, "\to%d --> o%d\n", h.ref(odst), osrc)
- }
- } else {
- // We don't interpret store-with-offset.
- // See discussion of soundness at markIndirectNodes.
- }
-}
-
-// dst = &src.offset
-func (c *offsetAddrConstraint) presolve(h *hvn) {
- // Give each distinct (addr, offset) pair a fresh PE label.
- // The cache performs CSE, effectively.
- key := offsetAddr{c.src, c.offset}
- label, ok := h.offsetAddrLabels[key]
- if !ok {
- label = h.nextLabel()
- h.offsetAddrLabels[key] = label
- if debugHVNVerbose && h.log != nil {
- fmt.Fprintf(h.log, "\tcreate p%d: {&n%d.#%d}\n",
- label, c.src, c.offset)
- }
- }
-
- // Assign dst this label.
- h.onodes[c.dst].peLabels.Insert(int(label))
- if debugHVNVerbose && h.log != nil {
- fmt.Fprintf(h.log, "\to%d has p%d\n", c.dst, label)
- }
-}
-
-// dst = src.(typ) where typ is an interface
-func (c *typeFilterConstraint) presolve(h *hvn) {
- h.markIndirect(onodeid(c.dst), "typeFilter result")
-}
-
-// dst = src.(typ) where typ is concrete
-func (c *untagConstraint) presolve(h *hvn) {
- odst := onodeid(c.dst)
- for end := odst + onodeid(h.a.sizeof(c.typ)); odst < end; odst++ {
- h.markIndirect(odst, "untag result")
- }
-}
-
-// dst = src.method(c.params...)
-func (c *invokeConstraint) presolve(h *hvn) {
- // All methods are address-taken functions, so
- // their formal P-blocks were already marked indirect.
-
- // Mark the caller's targets node as indirect.
- sig := c.method.Type().(*types.Signature)
- id := c.params
- h.markIndirect(onodeid(c.params), "invoke targets node")
- id++
-
- id += nodeid(h.a.sizeof(sig.Params()))
-
- // Mark the caller's R-block as indirect.
- end := id + nodeid(h.a.sizeof(sig.Results()))
- for id < end {
- h.markIndirect(onodeid(id), "invoke R-block")
- id++
- }
-}
-
-// markIndirectNodes marks as indirect nodes whose points-to relations
-// are not entirely captured by the offline graph, including:
-//
-// (a) All address-taken nodes (including the following nodes within
-// the same object). This is described in the paper.
-//
-// The most subtle cause of indirect nodes is the generation of
-// store-with-offset constraints since the offline graph doesn't
-// represent them. A global audit of constraint generation reveals the
-// following uses of store-with-offset:
-//
-// (b) genDynamicCall, for P-blocks of dynamically called functions,
-// to which dynamic copy edges will be added to them during
-// solving: from storeConstraint for standalone functions,
-// and from invokeConstraint for methods.
-// All such P-blocks must be marked indirect.
-// (c) MakeUpdate, to update the value part of a map object.
-// All MakeMap objects's value parts must be marked indirect.
-// (d) copyElems, to update the destination array.
-// All array elements must be marked indirect.
-//
-// Not all indirect marking happens here. ref() nodes are marked
-// indirect at construction, and each constraint's presolve() method may
-// mark additional nodes.
-//
-func (h *hvn) markIndirectNodes() {
- // (a) all address-taken nodes, plus all nodes following them
- // within the same object, since these may be indirectly
- // stored or address-taken.
- for _, c := range h.a.constraints {
- if c, ok := c.(*addrConstraint); ok {
- start := h.a.enclosingObj(c.src)
- end := start + nodeid(h.a.nodes[start].obj.size)
- for id := c.src; id < end; id++ {
- h.markIndirect(onodeid(id), "A-T object")
- }
- }
- }
-
- // (b) P-blocks of all address-taken functions.
- for id := 0; id < h.N; id++ {
- obj := h.a.nodes[id].obj
-
- // TODO(adonovan): opt: if obj.cgn.fn is a method and
- // obj.cgn is not its shared contour, this is an
- // "inlined" static method call. We needn't consider it
- // address-taken since no invokeConstraint will affect it.
-
- if obj != nil && obj.flags&otFunction != 0 && h.a.atFuncs[obj.cgn.fn] {
- // address-taken function
- if debugHVNVerbose && h.log != nil {
- fmt.Fprintf(h.log, "n%d is address-taken: %s\n", id, obj.cgn.fn)
- }
- h.markIndirect(onodeid(id), "A-T func identity")
- id++
- sig := obj.cgn.fn.Signature
- psize := h.a.sizeof(sig.Params())
- if sig.Recv() != nil {
- psize += h.a.sizeof(sig.Recv().Type())
- }
- for end := id + int(psize); id < end; id++ {
- h.markIndirect(onodeid(id), "A-T func P-block")
- }
- id--
- continue
- }
- }
-
- // (c) all map objects' value fields.
- for _, id := range h.a.mapValues {
- h.markIndirect(onodeid(id), "makemap.value")
- }
-
- // (d) all array element objects.
- // TODO(adonovan): opt: can we do better?
- for id := 0; id < h.N; id++ {
- // Identity node for an object of array type?
- if tArray, ok := h.a.nodes[id].typ.(*types.Array); ok {
- // Mark the array element nodes indirect.
- // (Skip past the identity field.)
- for range h.a.flatten(tArray.Elem()) {
- id++
- h.markIndirect(onodeid(id), "array elem")
- }
- }
- }
-}
-
-func (h *hvn) markIndirect(oid onodeid, comment string) {
- h.onodes[oid].indirect = true
- if debugHVNVerbose && h.log != nil {
- fmt.Fprintf(h.log, "\to%d is indirect: %s\n", oid, comment)
- }
-}
-
-// Adds an edge dst-->src.
-// Note the unusual convention: edges are dependency (contraflow) edges.
-func (h *hvn) addEdge(odst, osrc onodeid) {
- h.onodes[odst].edges.Insert(int(osrc))
- if debugHVNVerbose && h.log != nil {
- fmt.Fprintf(h.log, "\to%d --> o%d\n", odst, osrc)
- }
-}
-
-func (h *hvn) addImplicitEdge(odst, osrc onodeid) {
- h.onodes[odst].implicit.Insert(int(osrc))
- if debugHVNVerbose && h.log != nil {
- fmt.Fprintf(h.log, "\to%d ~~> o%d\n", odst, osrc)
- }
-}
-
-// visit implements the depth-first search of Tarjan's SCC algorithm.
-// Precondition: x is canonical.
-func (h *hvn) visit(x onodeid) {
- h.checkCanonical(x)
- xo := h.onodes[x]
- xo.index = h.index
- xo.lowlink = h.index
- h.index++
-
- h.stack = append(h.stack, x) // push
- assert(xo.scc == 0, "node revisited")
- xo.scc = -1
-
- var deps []int
- deps = xo.edges.AppendTo(deps)
- deps = xo.implicit.AppendTo(deps)
-
- for _, y := range deps {
- // Loop invariant: x is canonical.
-
- y := h.find(onodeid(y))
-
- if x == y {
- continue // nodes already coalesced
- }
-
- xo := h.onodes[x]
- yo := h.onodes[y]
-
- switch {
- case yo.scc > 0:
- // y is already a collapsed SCC
-
- case yo.scc < 0:
- // y is on the stack, and thus in the current SCC.
- if yo.index < xo.lowlink {
- xo.lowlink = yo.index
- }
-
- default:
- // y is unvisited; visit it now.
- h.visit(y)
- // Note: x and y are now non-canonical.
-
- x = h.find(onodeid(x))
-
- if yo.lowlink < xo.lowlink {
- xo.lowlink = yo.lowlink
- }
- }
- }
- h.checkCanonical(x)
-
- // Is x the root of an SCC?
- if xo.lowlink == xo.index {
- // Coalesce all nodes in the SCC.
- if debugHVNVerbose && h.log != nil {
- fmt.Fprintf(h.log, "scc o%d\n", x)
- }
- for {
- // Pop y from stack.
- i := len(h.stack) - 1
- y := h.stack[i]
- h.stack = h.stack[:i]
-
- h.checkCanonical(x)
- xo := h.onodes[x]
- h.checkCanonical(y)
- yo := h.onodes[y]
-
- if xo == yo {
- // SCC is complete.
- xo.scc = 1
- h.labelSCC(x)
- break
- }
- h.coalesce(x, y)
- }
- }
-}
-
-// Precondition: x is canonical.
-func (h *hvn) labelSCC(x onodeid) {
- h.checkCanonical(x)
- xo := h.onodes[x]
- xpe := &xo.peLabels
-
- // All indirect nodes get new labels.
- if xo.indirect {
- label := h.nextLabel()
- if debugHVNVerbose && h.log != nil {
- fmt.Fprintf(h.log, "\tcreate p%d: indirect SCC\n", label)
- fmt.Fprintf(h.log, "\to%d has p%d\n", x, label)
- }
-
- // Remove pre-labeling, in case a direct pre-labeled node was
- // merged with an indirect one.
- xpe.Clear()
- xpe.Insert(int(label))
-
- return
- }
-
- // Invariant: all peLabels sets are non-empty.
- // Those that are logically empty contain zero as their sole element.
- // No other sets contains zero.
-
- // Find all labels coming in to the coalesced SCC node.
- for _, y := range xo.edges.AppendTo(nil) {
- y := h.find(onodeid(y))
- if y == x {
- continue // already coalesced
- }
- ype := &h.onodes[y].peLabels
- if debugHVNVerbose && h.log != nil {
- fmt.Fprintf(h.log, "\tedge from o%d = %s\n", y, ype)
- }
-
- if ype.IsEmpty() {
- if debugHVNVerbose && h.log != nil {
- fmt.Fprintf(h.log, "\tnode has no PE label\n")
- }
- }
- assert(!ype.IsEmpty(), "incoming node has no PE label")
-
- if ype.Has(0) {
- // {0} represents a non-pointer.
- assert(ype.Len() == 1, "PE set contains {0, ...}")
- } else {
- xpe.UnionWith(ype)
- }
- }
-
- switch xpe.Len() {
- case 0:
- // SCC has no incoming non-zero PE labels: it is a non-pointer.
- xpe.Insert(0)
-
- case 1:
- // already a singleton
-
- default:
- // SCC has multiple incoming non-zero PE labels.
- // Find the canonical label representing this set.
- // We use String() as a fingerprint consistent with Equals().
- key := xpe.String()
- label, ok := h.hvnLabel[key]
- if !ok {
- label = h.nextLabel()
- if debugHVNVerbose && h.log != nil {
- fmt.Fprintf(h.log, "\tcreate p%d: union %s\n", label, xpe.String())
- }
- h.hvnLabel[key] = label
- }
- xpe.Clear()
- xpe.Insert(int(label))
- }
-
- if debugHVNVerbose && h.log != nil {
- fmt.Fprintf(h.log, "\to%d has p%d\n", x, xpe.Min())
- }
-}
-
-// coalesce combines two nodes in the offline constraint graph.
-// Precondition: x and y are canonical.
-func (h *hvn) coalesce(x, y onodeid) {
- xo := h.onodes[x]
- yo := h.onodes[y]
-
- // x becomes y's canonical representative.
- yo.rep = x
-
- if debugHVNVerbose && h.log != nil {
- fmt.Fprintf(h.log, "\tcoalesce o%d into o%d\n", y, x)
- }
-
- // x accumulates y's edges.
- xo.edges.UnionWith(&yo.edges)
- yo.edges.Clear()
-
- // x accumulates y's implicit edges.
- xo.implicit.UnionWith(&yo.implicit)
- yo.implicit.Clear()
-
- // x accumulates y's pointer-equivalence labels.
- xo.peLabels.UnionWith(&yo.peLabels)
- yo.peLabels.Clear()
-
- // x accumulates y's indirect flag.
- if yo.indirect {
- xo.indirect = true
- }
-}
-
-// simplify computes a degenerate renumbering of nodeids from the PE
-// labels assigned by the hvn, and uses it to simplify the main
-// constraint graph, eliminating non-pointer nodes and duplicate
-// constraints.
-//
-func (h *hvn) simplify() {
- // canon maps each peLabel to its canonical main node.
- canon := make([]nodeid, h.label)
- for i := range canon {
- canon[i] = nodeid(h.N) // indicates "unset"
- }
-
- // mapping maps each main node index to the index of the canonical node.
- mapping := make([]nodeid, len(h.a.nodes))
-
- for id := range h.a.nodes {
- id := nodeid(id)
- if id == 0 {
- canon[0] = 0
- mapping[0] = 0
- continue
- }
- oid := h.find(onodeid(id))
- peLabels := &h.onodes[oid].peLabels
- assert(peLabels.Len() == 1, "PE class is not a singleton")
- label := peLabel(peLabels.Min())
-
- canonId := canon[label]
- if canonId == nodeid(h.N) {
- // id becomes the representative of the PE label.
- canonId = id
- canon[label] = canonId
-
- if h.a.log != nil {
- fmt.Fprintf(h.a.log, "\tpts(n%d) is canonical : \t(%s)\n",
- id, h.a.nodes[id].typ)
- }
-
- } else {
- // Link the solver states for the two nodes.
- assert(h.a.nodes[canonId].solve != nil, "missing solver state")
- h.a.nodes[id].solve = h.a.nodes[canonId].solve
-
- if h.a.log != nil {
- // TODO(adonovan): debug: reorganize the log so it prints
- // one line:
- // pe y = x1, ..., xn
- // for each canonical y. Requires allocation.
- fmt.Fprintf(h.a.log, "\tpts(n%d) = pts(n%d) : %s\n",
- id, canonId, h.a.nodes[id].typ)
- }
- }
-
- mapping[id] = canonId
- }
-
- // Renumber the constraints, eliminate duplicates, and eliminate
- // any containing non-pointers (n0).
- addrs := make(map[addrConstraint]bool)
- copys := make(map[copyConstraint]bool)
- loads := make(map[loadConstraint]bool)
- stores := make(map[storeConstraint]bool)
- offsetAddrs := make(map[offsetAddrConstraint]bool)
- untags := make(map[untagConstraint]bool)
- typeFilters := make(map[typeFilterConstraint]bool)
- invokes := make(map[invokeConstraint]bool)
-
- nbefore := len(h.a.constraints)
- cc := h.a.constraints[:0] // in-situ compaction
- for _, c := range h.a.constraints {
- // Renumber.
- switch c := c.(type) {
- case *addrConstraint:
- // Don't renumber c.src since it is the label of
- // an addressable object and will appear in PT sets.
- c.dst = mapping[c.dst]
- default:
- c.renumber(mapping)
- }
-
- if c.ptr() == 0 {
- continue // skip: constraint attached to non-pointer
- }
-
- var dup bool
- switch c := c.(type) {
- case *addrConstraint:
- _, dup = addrs[*c]
- addrs[*c] = true
-
- case *copyConstraint:
- if c.src == c.dst {
- continue // skip degenerate copies
- }
- if c.src == 0 {
- continue // skip copy from non-pointer
- }
- _, dup = copys[*c]
- copys[*c] = true
-
- case *loadConstraint:
- if c.src == 0 {
- continue // skip load from non-pointer
- }
- _, dup = loads[*c]
- loads[*c] = true
-
- case *storeConstraint:
- if c.src == 0 {
- continue // skip store from non-pointer
- }
- _, dup = stores[*c]
- stores[*c] = true
-
- case *offsetAddrConstraint:
- if c.src == 0 {
- continue // skip offset from non-pointer
- }
- _, dup = offsetAddrs[*c]
- offsetAddrs[*c] = true
-
- case *untagConstraint:
- if c.src == 0 {
- continue // skip untag of non-pointer
- }
- _, dup = untags[*c]
- untags[*c] = true
-
- case *typeFilterConstraint:
- if c.src == 0 {
- continue // skip filter of non-pointer
- }
- _, dup = typeFilters[*c]
- typeFilters[*c] = true
-
- case *invokeConstraint:
- if c.params == 0 {
- panic("non-pointer invoke.params")
- }
- if c.iface == 0 {
- continue // skip invoke on non-pointer
- }
- _, dup = invokes[*c]
- invokes[*c] = true
-
- default:
- // We don't bother de-duping advanced constraints
- // (e.g. reflection) since they are uncommon.
-
- // Eliminate constraints containing non-pointer nodeids.
- //
- // We use reflection to find the fields to avoid
- // adding yet another method to constraint.
- //
- // TODO(adonovan): experiment with a constraint
- // method that returns a slice of pointers to
- // nodeids fields to enable uniform iteration;
- // the renumber() method could be removed and
- // implemented using the new one.
- //
- // TODO(adonovan): opt: this is unsound since
- // some constraints still have an effect if one
- // of the operands is zero: rVCall, rVMapIndex,
- // rvSetMapIndex. Handle them specially.
- rtNodeid := reflect.TypeOf(nodeid(0))
- x := reflect.ValueOf(c).Elem()
- for i, nf := 0, x.NumField(); i < nf; i++ {
- f := x.Field(i)
- if f.Type() == rtNodeid {
- if f.Uint() == 0 {
- dup = true // skip it
- break
- }
- }
- }
- }
- if dup {
- continue // skip duplicates
- }
-
- cc = append(cc, c)
- }
- h.a.constraints = cc
-
- if h.log != nil {
- fmt.Fprintf(h.log, "#constraints: was %d, now %d\n", nbefore, len(h.a.constraints))
- }
-}
-
-// find returns the canonical onodeid for x.
-// (The onodes form a disjoint set forest.)
-func (h *hvn) find(x onodeid) onodeid {
- // TODO(adonovan): opt: this is a CPU hotspot. Try "union by rank".
- xo := h.onodes[x]
- rep := xo.rep
- if rep != x {
- rep = h.find(rep) // simple path compression
- xo.rep = rep
- }
- return rep
-}
-
-func (h *hvn) checkCanonical(x onodeid) {
- if debugHVN {
- assert(x == h.find(x), "not canonical")
- }
-}
-
-func assert(p bool, msg string) {
- if debugHVN && !p {
- panic("assertion failed: " + msg)
- }
-}
diff --git a/vendor/golang.org/x/tools/go/pointer/intrinsics.go b/vendor/golang.org/x/tools/go/pointer/intrinsics.go
deleted file mode 100644
index b7e2b14..0000000
--- a/vendor/golang.org/x/tools/go/pointer/intrinsics.go
+++ /dev/null
@@ -1,361 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package pointer
-
-// This package defines the treatment of intrinsics, i.e. library
-// functions requiring special analytical treatment.
-//
-// Most of these are C or assembly functions, but even some Go
-// functions require may special treatment if the analysis completely
-// replaces the implementation of an API such as reflection.
-
-// TODO(adonovan): support a means of writing analytic summaries in
-// the target code, so that users can summarise the effects of their
-// own C functions using a snippet of Go.
-
-import (
- "fmt"
- "go/types"
-
- "golang.org/x/tools/go/ssa"
-)
-
-// Instances of 'intrinsic' generate analysis constraints for calls to
-// intrinsic functions.
-// Implementations may exploit information from the calling site
-// via cgn.callersite; for shared contours this is nil.
-type intrinsic func(a *analysis, cgn *cgnode)
-
-// Initialized in explicit init() to defeat (spurious) initialization
-// cycle error.
-var intrinsicsByName = make(map[string]intrinsic)
-
-func init() {
- // Key strings are from Function.String().
- // That little dot ۰ is an Arabic zero numeral (U+06F0),
- // categories [Nd].
- for name, fn := range map[string]intrinsic{
- // Other packages.
- "bytes.Equal": ext۰NoEffect,
- "bytes.IndexByte": ext۰NoEffect,
- "crypto/aes.decryptBlockAsm": ext۰NoEffect,
- "crypto/aes.encryptBlockAsm": ext۰NoEffect,
- "crypto/aes.expandKeyAsm": ext۰NoEffect,
- "crypto/aes.hasAsm": ext۰NoEffect,
- "crypto/md5.block": ext۰NoEffect,
- "crypto/rc4.xorKeyStream": ext۰NoEffect,
- "crypto/sha1.block": ext۰NoEffect,
- "crypto/sha256.block": ext۰NoEffect,
- "hash/crc32.castagnoliSSE42": ext۰NoEffect,
- "hash/crc32.haveSSE42": ext۰NoEffect,
- "math.Abs": ext۰NoEffect,
- "math.Acos": ext۰NoEffect,
- "math.Asin": ext۰NoEffect,
- "math.Atan": ext۰NoEffect,
- "math.Atan2": ext۰NoEffect,
- "math.Ceil": ext۰NoEffect,
- "math.Cos": ext۰NoEffect,
- "math.Dim": ext۰NoEffect,
- "math.Exp": ext۰NoEffect,
- "math.Exp2": ext۰NoEffect,
- "math.Expm1": ext۰NoEffect,
- "math.Float32bits": ext۰NoEffect,
- "math.Float32frombits": ext۰NoEffect,
- "math.Float64bits": ext۰NoEffect,
- "math.Float64frombits": ext۰NoEffect,
- "math.Floor": ext۰NoEffect,
- "math.Frexp": ext۰NoEffect,
- "math.Hypot": ext۰NoEffect,
- "math.Ldexp": ext۰NoEffect,
- "math.Log": ext۰NoEffect,
- "math.Log10": ext۰NoEffect,
- "math.Log1p": ext۰NoEffect,
- "math.Log2": ext۰NoEffect,
- "math.Max": ext۰NoEffect,
- "math.Min": ext۰NoEffect,
- "math.Mod": ext۰NoEffect,
- "math.Modf": ext۰NoEffect,
- "math.Remainder": ext۰NoEffect,
- "math.Sin": ext۰NoEffect,
- "math.Sincos": ext۰NoEffect,
- "math.Sqrt": ext۰NoEffect,
- "math.Tan": ext۰NoEffect,
- "math.Trunc": ext۰NoEffect,
- "math/big.addMulVVW": ext۰NoEffect,
- "math/big.addVV": ext۰NoEffect,
- "math/big.addVW": ext۰NoEffect,
- "math/big.bitLen": ext۰NoEffect,
- "math/big.divWVW": ext۰NoEffect,
- "math/big.divWW": ext۰NoEffect,
- "math/big.mulAddVWW": ext۰NoEffect,
- "math/big.mulWW": ext۰NoEffect,
- "math/big.shlVU": ext۰NoEffect,
- "math/big.shrVU": ext۰NoEffect,
- "math/big.subVV": ext۰NoEffect,
- "math/big.subVW": ext۰NoEffect,
- "net.runtime_Semacquire": ext۰NoEffect,
- "net.runtime_Semrelease": ext۰NoEffect,
- "net.runtime_pollClose": ext۰NoEffect,
- "net.runtime_pollOpen": ext۰NoEffect,
- "net.runtime_pollReset": ext۰NoEffect,
- "net.runtime_pollServerInit": ext۰NoEffect,
- "net.runtime_pollSetDeadline": ext۰NoEffect,
- "net.runtime_pollUnblock": ext۰NoEffect,
- "net.runtime_pollWait": ext۰NoEffect,
- "net.runtime_pollWaitCanceled": ext۰NoEffect,
- "os.epipecheck": ext۰NoEffect,
- // All other runtime functions are treated as NoEffect.
- "runtime.SetFinalizer": ext۰runtime۰SetFinalizer,
- "strings.IndexByte": ext۰NoEffect,
- "sync.runtime_Semacquire": ext۰NoEffect,
- "sync.runtime_Semrelease": ext۰NoEffect,
- "sync.runtime_Syncsemacquire": ext۰NoEffect,
- "sync.runtime_Syncsemcheck": ext۰NoEffect,
- "sync.runtime_Syncsemrelease": ext۰NoEffect,
- "sync.runtime_procPin": ext۰NoEffect,
- "sync.runtime_procUnpin": ext۰NoEffect,
- "sync.runtime_registerPool": ext۰NoEffect,
- "sync/atomic.AddInt32": ext۰NoEffect,
- "sync/atomic.AddInt64": ext۰NoEffect,
- "sync/atomic.AddUint32": ext۰NoEffect,
- "sync/atomic.AddUint64": ext۰NoEffect,
- "sync/atomic.AddUintptr": ext۰NoEffect,
- "sync/atomic.CompareAndSwapInt32": ext۰NoEffect,
- "sync/atomic.CompareAndSwapUint32": ext۰NoEffect,
- "sync/atomic.CompareAndSwapUint64": ext۰NoEffect,
- "sync/atomic.CompareAndSwapUintptr": ext۰NoEffect,
- "sync/atomic.LoadInt32": ext۰NoEffect,
- "sync/atomic.LoadInt64": ext۰NoEffect,
- "sync/atomic.LoadPointer": ext۰NoEffect, // ignore unsafe.Pointers
- "sync/atomic.LoadUint32": ext۰NoEffect,
- "sync/atomic.LoadUint64": ext۰NoEffect,
- "sync/atomic.LoadUintptr": ext۰NoEffect,
- "sync/atomic.StoreInt32": ext۰NoEffect,
- "sync/atomic.StorePointer": ext۰NoEffect, // ignore unsafe.Pointers
- "sync/atomic.StoreUint32": ext۰NoEffect,
- "sync/atomic.StoreUintptr": ext۰NoEffect,
- "syscall.Close": ext۰NoEffect,
- "syscall.Exit": ext۰NoEffect,
- "syscall.Getpid": ext۰NoEffect,
- "syscall.Getwd": ext۰NoEffect,
- "syscall.Kill": ext۰NoEffect,
- "syscall.RawSyscall": ext۰NoEffect,
- "syscall.RawSyscall6": ext۰NoEffect,
- "syscall.Syscall": ext۰NoEffect,
- "syscall.Syscall6": ext۰NoEffect,
- "syscall.runtime_AfterFork": ext۰NoEffect,
- "syscall.runtime_BeforeFork": ext۰NoEffect,
- "syscall.setenv_c": ext۰NoEffect,
- "time.Sleep": ext۰NoEffect,
- "time.now": ext۰NoEffect,
- "time.startTimer": ext۰time۰startTimer,
- "time.stopTimer": ext۰NoEffect,
- } {
- intrinsicsByName[name] = fn
- }
-}
-
-// findIntrinsic returns the constraint generation function for an
-// intrinsic function fn, or nil if the function should be handled normally.
-//
-func (a *analysis) findIntrinsic(fn *ssa.Function) intrinsic {
- // Consult the *Function-keyed cache.
- // A cached nil indicates a normal non-intrinsic function.
- impl, ok := a.intrinsics[fn]
- if !ok {
- impl = intrinsicsByName[fn.String()] // may be nil
-
- if a.isReflect(fn) {
- if !a.config.Reflection {
- impl = ext۰NoEffect // reflection disabled
- } else if impl == nil {
- // Ensure all "reflect" code is treated intrinsically.
- impl = ext۰NotYetImplemented
- }
- } else if impl == nil && fn.Pkg != nil && fn.Pkg.Pkg.Path() == "runtime" {
- // Ignore "runtime" (except SetFinalizer):
- // it has few interesting effects on aliasing
- // and is full of unsafe code we can't analyze.
- impl = ext۰NoEffect
- }
-
- a.intrinsics[fn] = impl
- }
- return impl
-}
-
-// isReflect reports whether fn belongs to the "reflect" package.
-func (a *analysis) isReflect(fn *ssa.Function) bool {
- if a.reflectValueObj == nil {
- return false // "reflect" package not loaded
- }
- reflectPackage := a.reflectValueObj.Pkg()
- if fn.Pkg != nil && fn.Pkg.Pkg == reflectPackage {
- return true
- }
- // Synthetic wrappers have a nil Pkg, so they slip through the
- // previous check. Check the receiver package.
- // TODO(adonovan): should synthetic wrappers have a non-nil Pkg?
- if recv := fn.Signature.Recv(); recv != nil {
- if named, ok := deref(recv.Type()).(*types.Named); ok {
- if named.Obj().Pkg() == reflectPackage {
- return true // e.g. wrapper of (reflect.Value).f
- }
- }
- }
- return false
-}
-
-// A trivial intrinsic suitable for any function that does not:
-// 1) induce aliases between its arguments or any global variables;
-// 2) call any functions; or
-// 3) create any labels.
-//
-// Many intrinsics (such as CompareAndSwapInt32) have a fourth kind of
-// effect: loading or storing through a pointer. Though these could
-// be significant, we deliberately ignore them because they are
-// generally not worth the effort.
-//
-// We sometimes violate condition #3 if the function creates only
-// non-function labels, as the control-flow graph is still sound.
-//
-func ext۰NoEffect(a *analysis, cgn *cgnode) {}
-
-func ext۰NotYetImplemented(a *analysis, cgn *cgnode) {
- fn := cgn.fn
- a.warnf(fn.Pos(), "unsound: intrinsic treatment of %s not yet implemented", fn)
-}
-
-// ---------- func runtime.SetFinalizer(x, f interface{}) ----------
-
-// runtime.SetFinalizer(x, f)
-type runtimeSetFinalizerConstraint struct {
- targets nodeid // (indirect)
- f nodeid // (ptr)
- x nodeid
-}
-
-func (c *runtimeSetFinalizerConstraint) ptr() nodeid { return c.f }
-func (c *runtimeSetFinalizerConstraint) presolve(h *hvn) {
- h.markIndirect(onodeid(c.targets), "SetFinalizer.targets")
-}
-func (c *runtimeSetFinalizerConstraint) renumber(mapping []nodeid) {
- c.targets = mapping[c.targets]
- c.f = mapping[c.f]
- c.x = mapping[c.x]
-}
-
-func (c *runtimeSetFinalizerConstraint) String() string {
- return fmt.Sprintf("runtime.SetFinalizer(n%d, n%d)", c.x, c.f)
-}
-
-func (c *runtimeSetFinalizerConstraint) solve(a *analysis, delta *nodeset) {
- for _, fObj := range delta.AppendTo(a.deltaSpace) {
- tDyn, f, indirect := a.taggedValue(nodeid(fObj))
- if indirect {
- // TODO(adonovan): we'll need to implement this
- // when we start creating indirect tagged objects.
- panic("indirect tagged object")
- }
-
- tSig, ok := tDyn.Underlying().(*types.Signature)
- if !ok {
- continue // not a function
- }
- if tSig.Recv() != nil {
- panic(tSig)
- }
- if tSig.Params().Len() != 1 {
- continue // not a unary function
- }
-
- // Extract x to tmp.
- tx := tSig.Params().At(0).Type()
- tmp := a.addNodes(tx, "SetFinalizer.tmp")
- a.typeAssert(tx, tmp, c.x, false)
-
- // Call f(tmp).
- a.store(f, tmp, 1, a.sizeof(tx))
-
- // Add dynamic call target.
- if a.onlineCopy(c.targets, f) {
- a.addWork(c.targets)
- }
- }
-}
-
-func ext۰runtime۰SetFinalizer(a *analysis, cgn *cgnode) {
- // This is the shared contour, used for dynamic calls.
- targets := a.addOneNode(tInvalid, "SetFinalizer.targets", nil)
- cgn.sites = append(cgn.sites, &callsite{targets: targets})
- params := a.funcParams(cgn.obj)
- a.addConstraint(&runtimeSetFinalizerConstraint{
- targets: targets,
- x: params,
- f: params + 1,
- })
-}
-
-// ---------- func time.startTimer(t *runtimeTimer) ----------
-
-// time.StartTimer(t)
-type timeStartTimerConstraint struct {
- targets nodeid // (indirect)
- t nodeid // (ptr)
-}
-
-func (c *timeStartTimerConstraint) ptr() nodeid { return c.t }
-func (c *timeStartTimerConstraint) presolve(h *hvn) {
- h.markIndirect(onodeid(c.targets), "StartTimer.targets")
-}
-func (c *timeStartTimerConstraint) renumber(mapping []nodeid) {
- c.targets = mapping[c.targets]
- c.t = mapping[c.t]
-}
-
-func (c *timeStartTimerConstraint) String() string {
- return fmt.Sprintf("time.startTimer(n%d)", c.t)
-}
-
-func (c *timeStartTimerConstraint) solve(a *analysis, delta *nodeset) {
- for _, tObj := range delta.AppendTo(a.deltaSpace) {
- t := nodeid(tObj)
-
- // We model startTimer as if it was defined thus:
- // func startTimer(t *runtimeTimer) { t.f(t.arg) }
-
- // We hard-code the field offsets of time.runtimeTimer:
- // type runtimeTimer struct {
- // 0 __identity__
- // 1 i int32
- // 2 when int64
- // 3 period int64
- // 4 f func(int64, interface{})
- // 5 arg interface{}
- // }
- f := t + 4
- arg := t + 5
-
- // store t.arg to t.f.params[0]
- // (offset 1 => skip identity)
- a.store(f, arg, 1, 1)
-
- // Add dynamic call target.
- if a.onlineCopy(c.targets, f) {
- a.addWork(c.targets)
- }
- }
-}
-
-func ext۰time۰startTimer(a *analysis, cgn *cgnode) {
- // This is the shared contour, used for dynamic calls.
- targets := a.addOneNode(tInvalid, "startTimer.targets", nil)
- cgn.sites = append(cgn.sites, &callsite{targets: targets})
- params := a.funcParams(cgn.obj)
- a.addConstraint(&timeStartTimerConstraint{
- targets: targets,
- t: params,
- })
-}
diff --git a/vendor/golang.org/x/tools/go/pointer/labels.go b/vendor/golang.org/x/tools/go/pointer/labels.go
deleted file mode 100644
index 7d64ef6..0000000
--- a/vendor/golang.org/x/tools/go/pointer/labels.go
+++ /dev/null
@@ -1,152 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package pointer
-
-import (
- "fmt"
- "go/token"
- "go/types"
- "strings"
-
- "golang.org/x/tools/go/ssa"
-)
-
-// A Label is an entity that may be pointed to by a pointer, map,
-// channel, 'func', slice or interface.
-//
-// Labels include:
-// - functions
-// - globals
-// - tagged objects, representing interfaces and reflect.Values
-// - arrays created by conversions (e.g. []byte("foo"), []byte(s))
-// - stack- and heap-allocated variables (including composite literals)
-// - channels, maps and arrays created by make()
-// - intrinsic or reflective operations that allocate (e.g. append, reflect.New)
-// - intrinsic objects, e.g. the initial array behind os.Args.
-// - and their subelements, e.g. "alloc.y[*].z"
-//
-// Labels are so varied that they defy good generalizations;
-// some have no value, no callgraph node, or no position.
-// Many objects have types that are inexpressible in Go:
-// maps, channels, functions, tagged objects.
-//
-// At most one of Value() or ReflectType() may return non-nil.
-//
-type Label struct {
- obj *object // the addressable memory location containing this label
- subelement *fieldInfo // subelement path within obj, e.g. ".a.b[*].c"
-}
-
-// Value returns the ssa.Value that allocated this label's object, if any.
-func (l Label) Value() ssa.Value {
- val, _ := l.obj.data.(ssa.Value)
- return val
-}
-
-// ReflectType returns the type represented by this label if it is an
-// reflect.rtype instance object or *reflect.rtype-tagged object.
-//
-func (l Label) ReflectType() types.Type {
- rtype, _ := l.obj.data.(types.Type)
- return rtype
-}
-
-// Path returns the path to the subelement of the object containing
-// this label. For example, ".x[*].y".
-//
-func (l Label) Path() string {
- return l.subelement.path()
-}
-
-// Pos returns the position of this label, if known, zero otherwise.
-func (l Label) Pos() token.Pos {
- switch data := l.obj.data.(type) {
- case ssa.Value:
- return data.Pos()
- case types.Type:
- if nt, ok := deref(data).(*types.Named); ok {
- return nt.Obj().Pos()
- }
- }
- if cgn := l.obj.cgn; cgn != nil {
- return cgn.fn.Pos()
- }
- return token.NoPos
-}
-
-// String returns the printed form of this label.
-//
-// Examples: Object type:
-// x (a variable)
-// (sync.Mutex).Lock (a function)
-// convert (array created by conversion)
-// makemap (map allocated via make)
-// makechan (channel allocated via make)
-// makeinterface (tagged object allocated by makeinterface)
-// (allocation in instrinsic)
-// sync.Mutex (a reflect.rtype instance)
-// (an intrinsic object)
-//
-// Labels within compound objects have subelement paths:
-// x.y[*].z (a struct variable, x)
-// append.y[*].z (array allocated by append)
-// makeslice.y[*].z (array allocated via make)
-//
-// TODO(adonovan): expose func LabelString(*types.Package, Label).
-//
-func (l Label) String() string {
- var s string
- switch v := l.obj.data.(type) {
- case types.Type:
- return v.String()
-
- case string:
- s = v // an intrinsic object (e.g. os.Args[*])
-
- case nil:
- if l.obj.cgn != nil {
- // allocation by intrinsic or reflective operation
- s = fmt.Sprintf("", l.obj.cgn.fn)
- } else {
- s = "" // should be unreachable
- }
-
- case *ssa.Function:
- s = v.String()
-
- case *ssa.Global:
- s = v.String()
-
- case *ssa.Const:
- s = v.Name()
-
- case *ssa.Alloc:
- s = v.Comment
- if s == "" {
- s = "alloc"
- }
-
- case *ssa.Call:
- // Currently only calls to append can allocate objects.
- if v.Call.Value.(*ssa.Builtin).Object().Name() != "append" {
- panic("unhandled *ssa.Call label: " + v.Name())
- }
- s = "append"
-
- case *ssa.MakeMap, *ssa.MakeChan, *ssa.MakeSlice, *ssa.Convert:
- s = strings.ToLower(strings.TrimPrefix(fmt.Sprintf("%T", v), "*ssa."))
-
- case *ssa.MakeInterface:
- // MakeInterface is usually implicit in Go source (so
- // Pos()==0), and tagged objects may be allocated
- // synthetically (so no *MakeInterface data).
- s = "makeinterface:" + v.X.Type().String()
-
- default:
- panic(fmt.Sprintf("unhandled object data type: %T", v))
- }
-
- return s + l.subelement.path()
-}
diff --git a/vendor/golang.org/x/tools/go/pointer/opt.go b/vendor/golang.org/x/tools/go/pointer/opt.go
deleted file mode 100644
index 81f80aa..0000000
--- a/vendor/golang.org/x/tools/go/pointer/opt.go
+++ /dev/null
@@ -1,132 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package pointer
-
-// This file implements renumbering, a pre-solver optimization to
-// improve the efficiency of the solver's points-to set representation.
-//
-// TODO(adonovan): rename file "renumber.go"
-
-import "fmt"
-
-// renumber permutes a.nodes so that all nodes within an addressable
-// object appear before all non-addressable nodes, maintaining the
-// order of nodes within the same object (as required by offsetAddr).
-//
-// renumber must update every nodeid in the analysis (constraints,
-// Pointers, callgraph, etc) to reflect the new ordering.
-//
-// This is an optimisation to increase the locality and efficiency of
-// sparse representations of points-to sets. (Typically only about
-// 20% of nodes are within an object.)
-//
-// NB: nodes added during solving (e.g. for reflection, SetFinalizer)
-// will be appended to the end.
-//
-// Renumbering makes the PTA log inscrutable. To aid debugging, later
-// phases (e.g. HVN) must not rely on it having occurred.
-//
-func (a *analysis) renumber() {
- if a.log != nil {
- fmt.Fprintf(a.log, "\n\n==== Renumbering\n\n")
- }
-
- N := nodeid(len(a.nodes))
- newNodes := make([]*node, N, N)
- renumbering := make([]nodeid, N, N) // maps old to new
-
- var i, j nodeid
-
- // The zero node is special.
- newNodes[j] = a.nodes[i]
- renumbering[i] = j
- i++
- j++
-
- // Pass 1: object nodes.
- for i < N {
- obj := a.nodes[i].obj
- if obj == nil {
- i++
- continue
- }
-
- end := i + nodeid(obj.size)
- for i < end {
- newNodes[j] = a.nodes[i]
- renumbering[i] = j
- i++
- j++
- }
- }
- nobj := j
-
- // Pass 2: non-object nodes.
- for i = 1; i < N; {
- obj := a.nodes[i].obj
- if obj != nil {
- i += nodeid(obj.size)
- continue
- }
-
- newNodes[j] = a.nodes[i]
- renumbering[i] = j
- i++
- j++
- }
-
- if j != N {
- panic(fmt.Sprintf("internal error: j=%d, N=%d", j, N))
- }
-
- // Log the remapping table.
- if a.log != nil {
- fmt.Fprintf(a.log, "Renumbering nodes to improve density:\n")
- fmt.Fprintf(a.log, "(%d object nodes of %d total)\n", nobj, N)
- for old, new := range renumbering {
- fmt.Fprintf(a.log, "\tn%d -> n%d\n", old, new)
- }
- }
-
- // Now renumber all existing nodeids to use the new node permutation.
- // It is critical that all reachable nodeids are accounted for!
-
- // Renumber nodeids in queried Pointers.
- for v, ptr := range a.result.Queries {
- ptr.n = renumbering[ptr.n]
- a.result.Queries[v] = ptr
- }
- for v, ptr := range a.result.IndirectQueries {
- ptr.n = renumbering[ptr.n]
- a.result.IndirectQueries[v] = ptr
- }
- for _, queries := range a.config.extendedQueries {
- for _, query := range queries {
- if query.ptr != nil {
- query.ptr.n = renumbering[query.ptr.n]
- }
- }
- }
-
- // Renumber nodeids in global objects.
- for v, id := range a.globalobj {
- a.globalobj[v] = renumbering[id]
- }
-
- // Renumber nodeids in constraints.
- for _, c := range a.constraints {
- c.renumber(renumbering)
- }
-
- // Renumber nodeids in the call graph.
- for _, cgn := range a.cgnodes {
- cgn.obj = renumbering[cgn.obj]
- for _, site := range cgn.sites {
- site.targets = renumbering[site.targets]
- }
- }
-
- a.nodes = newNodes
-}
diff --git a/vendor/golang.org/x/tools/go/pointer/pointer_test.go b/vendor/golang.org/x/tools/go/pointer/pointer_test.go
deleted file mode 100644
index a06f304..0000000
--- a/vendor/golang.org/x/tools/go/pointer/pointer_test.go
+++ /dev/null
@@ -1,601 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// No testdata on Android.
-
-// +build !android
-
-package pointer_test
-
-// This test uses 'expectation' comments embedded within testdata/*.go
-// files to specify the expected pointer analysis behaviour.
-// See below for grammar.
-
-import (
- "bytes"
- "errors"
- "fmt"
- "go/token"
- "go/types"
- "io/ioutil"
- "os"
- "regexp"
- "strconv"
- "strings"
- "testing"
-
- "golang.org/x/tools/go/callgraph"
- "golang.org/x/tools/go/loader"
- "golang.org/x/tools/go/pointer"
- "golang.org/x/tools/go/ssa"
- "golang.org/x/tools/go/ssa/ssautil"
- "golang.org/x/tools/go/types/typeutil"
-)
-
-var inputs = []string{
- "testdata/a_test.go",
- "testdata/another.go",
- "testdata/arrayreflect.go",
- "testdata/arrays.go",
- "testdata/channels.go",
- "testdata/chanreflect.go",
- "testdata/context.go",
- "testdata/conv.go",
- "testdata/extended.go",
- "testdata/finalizer.go",
- "testdata/flow.go",
- "testdata/fmtexcerpt.go",
- "testdata/func.go",
- "testdata/funcreflect.go",
- "testdata/hello.go", // NB: causes spurious failure of HVN cross-check
- "testdata/interfaces.go",
- "testdata/issue9002.go",
- "testdata/mapreflect.go",
- "testdata/maps.go",
- "testdata/panic.go",
- "testdata/recur.go",
- "testdata/reflect.go",
- "testdata/rtti.go",
- "testdata/structreflect.go",
- "testdata/structs.go",
- // "testdata/timer.go", // TODO(adonovan): fix broken assumptions about runtime timers
-}
-
-// Expectation grammar:
-//
-// @calls f -> g
-//
-// A 'calls' expectation asserts that edge (f, g) appears in the
-// callgraph. f and g are notated as per Function.String(), which
-// may contain spaces (e.g. promoted method in anon struct).
-//
-// @pointsto a | b | c
-//
-// A 'pointsto' expectation asserts that the points-to set of its
-// operand contains exactly the set of labels {a,b,c} notated as per
-// labelString.
-//
-// A 'pointsto' expectation must appear on the same line as a
-// print(x) statement; the expectation's operand is x.
-//
-// If one of the strings is "...", the expectation asserts that the
-// points-to set at least the other labels.
-//
-// We use '|' because label names may contain spaces, e.g. methods
-// of anonymous structs.
-//
-// From a theoretical perspective, concrete types in interfaces are
-// labels too, but they are represented differently and so have a
-// different expectation, @types, below.
-//
-// @types t | u | v
-//
-// A 'types' expectation asserts that the set of possible dynamic
-// types of its interface operand is exactly {t,u,v}, notated per
-// go/types.Type.String(). In other words, it asserts that the type
-// component of the interface may point to that set of concrete type
-// literals. It also works for reflect.Value, though the types
-// needn't be concrete in that case.
-//
-// A 'types' expectation must appear on the same line as a
-// print(x) statement; the expectation's operand is x.
-//
-// If one of the strings is "...", the expectation asserts that the
-// interface's type may point to at least the other types.
-//
-// We use '|' because type names may contain spaces.
-//
-// @warning "regexp"
-//
-// A 'warning' expectation asserts that the analysis issues a
-// warning that matches the regular expression within the string
-// literal.
-//
-// @line id
-//
-// A line directive associates the name "id" with the current
-// file:line. The string form of labels will use this id instead of
-// a file:line, making @pointsto expectations more robust against
-// perturbations in the source file.
-// (NB, anon functions still include line numbers.)
-//
-type expectation struct {
- kind string // "pointsto" | "pointstoquery" | "types" | "calls" | "warning"
- filename string
- linenum int // source line number, 1-based
- args []string
- query string // extended query
- extended *pointer.Pointer // extended query pointer
- types []types.Type // for types
-}
-
-func (e *expectation) String() string {
- return fmt.Sprintf("@%s[%s]", e.kind, strings.Join(e.args, " | "))
-}
-
-func (e *expectation) errorf(format string, args ...interface{}) {
- fmt.Printf("%s:%d: ", e.filename, e.linenum)
- fmt.Printf(format, args...)
- fmt.Println()
-}
-
-func (e *expectation) needsProbe() bool {
- return e.kind == "pointsto" || e.kind == "pointstoquery" || e.kind == "types"
-}
-
-// Find probe (call to print(x)) of same source file/line as expectation.
-func findProbe(prog *ssa.Program, probes map[*ssa.CallCommon]bool, queries map[ssa.Value]pointer.Pointer, e *expectation) (site *ssa.CallCommon, pts pointer.PointsToSet) {
- for call := range probes {
- pos := prog.Fset.Position(call.Pos())
- if pos.Line == e.linenum && pos.Filename == e.filename {
- // TODO(adonovan): send this to test log (display only on failure).
- // fmt.Printf("%s:%d: info: found probe for %s: %s\n",
- // e.filename, e.linenum, e, p.arg0) // debugging
- return call, queries[call.Args[0]].PointsTo()
- }
- }
- return // e.g. analysis didn't reach this call
-}
-
-func doOneInput(input, filename string) bool {
- var conf loader.Config
-
- // Parsing.
- f, err := conf.ParseFile(filename, input)
- if err != nil {
- fmt.Println(err)
- return false
- }
-
- // Create single-file main package and import its dependencies.
- conf.CreateFromFiles("main", f)
- iprog, err := conf.Load()
- if err != nil {
- fmt.Println(err)
- return false
- }
- mainPkgInfo := iprog.Created[0].Pkg
-
- // SSA creation + building.
- prog := ssautil.CreateProgram(iprog, ssa.SanityCheckFunctions)
- prog.Build()
-
- mainpkg := prog.Package(mainPkgInfo)
- ptrmain := mainpkg // main package for the pointer analysis
- if mainpkg.Func("main") == nil {
- // No main function; assume it's a test.
- ptrmain = prog.CreateTestMainPackage(mainpkg)
- }
-
- // Find all calls to the built-in print(x). Analytically,
- // print is a no-op, but it's a convenient hook for testing
- // the PTS of an expression, so our tests use it.
- probes := make(map[*ssa.CallCommon]bool)
- for fn := range ssautil.AllFunctions(prog) {
- if fn.Pkg == mainpkg {
- for _, b := range fn.Blocks {
- for _, instr := range b.Instrs {
- if instr, ok := instr.(ssa.CallInstruction); ok {
- call := instr.Common()
- if b, ok := call.Value.(*ssa.Builtin); ok && b.Name() == "print" && len(call.Args) == 1 {
- probes[instr.Common()] = true
- }
- }
- }
- }
- }
- }
-
- ok := true
-
- lineMapping := make(map[string]string) // maps "file:line" to @line tag
-
- // Parse expectations in this input.
- var exps []*expectation
- re := regexp.MustCompile("// *@([a-z]*) *(.*)$")
- lines := strings.Split(input, "\n")
- for linenum, line := range lines {
- linenum++ // make it 1-based
- if matches := re.FindAllStringSubmatch(line, -1); matches != nil {
- match := matches[0]
- kind, rest := match[1], match[2]
- e := &expectation{kind: kind, filename: filename, linenum: linenum}
-
- if kind == "line" {
- if rest == "" {
- ok = false
- e.errorf("@%s expectation requires identifier", kind)
- } else {
- lineMapping[fmt.Sprintf("%s:%d", filename, linenum)] = rest
- }
- continue
- }
-
- if e.needsProbe() && !strings.Contains(line, "print(") {
- ok = false
- e.errorf("@%s expectation must follow call to print(x)", kind)
- continue
- }
-
- switch kind {
- case "pointsto":
- e.args = split(rest, "|")
-
- case "pointstoquery":
- args := strings.SplitN(rest, " ", 2)
- e.query = args[0]
- e.args = split(args[1], "|")
- case "types":
- for _, typstr := range split(rest, "|") {
- var t types.Type = types.Typ[types.Invalid] // means "..."
- if typstr != "..." {
- tv, err := types.Eval(prog.Fset, mainpkg.Pkg, f.Pos(), typstr)
- if err != nil {
- ok = false
- // Don't print err since its location is bad.
- e.errorf("'%s' is not a valid type: %s", typstr, err)
- continue
- }
- t = tv.Type
- }
- e.types = append(e.types, t)
- }
-
- case "calls":
- e.args = split(rest, "->")
- // TODO(adonovan): eagerly reject the
- // expectation if fn doesn't denote
- // existing function, rather than fail
- // the expectation after analysis.
- if len(e.args) != 2 {
- ok = false
- e.errorf("@calls expectation wants 'caller -> callee' arguments")
- continue
- }
-
- case "warning":
- lit, err := strconv.Unquote(strings.TrimSpace(rest))
- if err != nil {
- ok = false
- e.errorf("couldn't parse @warning operand: %s", err.Error())
- continue
- }
- e.args = append(e.args, lit)
-
- default:
- ok = false
- e.errorf("unknown expectation kind: %s", e)
- continue
- }
- exps = append(exps, e)
- }
- }
-
- var log bytes.Buffer
- fmt.Fprintf(&log, "Input: %s\n", filename)
-
- // Run the analysis.
- config := &pointer.Config{
- Reflection: true,
- BuildCallGraph: true,
- Mains: []*ssa.Package{ptrmain},
- Log: &log,
- }
-probeLoop:
- for probe := range probes {
- v := probe.Args[0]
- pos := prog.Fset.Position(probe.Pos())
- for _, e := range exps {
- if e.linenum == pos.Line && e.filename == pos.Filename && e.kind == "pointstoquery" {
- var err error
- e.extended, err = config.AddExtendedQuery(v, e.query)
- if err != nil {
- panic(err)
- }
- continue probeLoop
- }
- }
- if pointer.CanPoint(v.Type()) {
- config.AddQuery(v)
- }
- }
-
- // Print the log is there was an error or a panic.
- complete := false
- defer func() {
- if !complete || !ok {
- log.WriteTo(os.Stderr)
- }
- }()
-
- result, err := pointer.Analyze(config)
- if err != nil {
- panic(err) // internal error in pointer analysis
- }
-
- // Check the expectations.
- for _, e := range exps {
- var call *ssa.CallCommon
- var pts pointer.PointsToSet
- var tProbe types.Type
- if e.needsProbe() {
- if call, pts = findProbe(prog, probes, result.Queries, e); call == nil {
- ok = false
- e.errorf("unreachable print() statement has expectation %s", e)
- continue
- }
- if e.extended != nil {
- pts = e.extended.PointsTo()
- }
- tProbe = call.Args[0].Type()
- if !pointer.CanPoint(tProbe) {
- ok = false
- e.errorf("expectation on non-pointerlike operand: %s", tProbe)
- continue
- }
- }
-
- switch e.kind {
- case "pointsto", "pointstoquery":
- if !checkPointsToExpectation(e, pts, lineMapping, prog) {
- ok = false
- }
-
- case "types":
- if !checkTypesExpectation(e, pts, tProbe) {
- ok = false
- }
-
- case "calls":
- if !checkCallsExpectation(prog, e, result.CallGraph) {
- ok = false
- }
-
- case "warning":
- if !checkWarningExpectation(prog, e, result.Warnings) {
- ok = false
- }
- }
- }
-
- complete = true
-
- // ok = false // debugging: uncomment to always see log
-
- return ok
-}
-
-func labelString(l *pointer.Label, lineMapping map[string]string, prog *ssa.Program) string {
- // Functions and Globals need no pos suffix,
- // nor do allocations in intrinsic operations
- // (for which we'll print the function name).
- switch l.Value().(type) {
- case nil, *ssa.Function, *ssa.Global:
- return l.String()
- }
-
- str := l.String()
- if pos := l.Pos(); pos != token.NoPos {
- // Append the position, using a @line tag instead of a line number, if defined.
- posn := prog.Fset.Position(pos)
- s := fmt.Sprintf("%s:%d", posn.Filename, posn.Line)
- if tag, ok := lineMapping[s]; ok {
- return fmt.Sprintf("%s@%s:%d", str, tag, posn.Column)
- }
- str = fmt.Sprintf("%s@%s", str, posn)
- }
- return str
-}
-
-func checkPointsToExpectation(e *expectation, pts pointer.PointsToSet, lineMapping map[string]string, prog *ssa.Program) bool {
- expected := make(map[string]int)
- surplus := make(map[string]int)
- exact := true
- for _, g := range e.args {
- if g == "..." {
- exact = false
- continue
- }
- expected[g]++
- }
- // Find the set of labels that the probe's
- // argument (x in print(x)) may point to.
- for _, label := range pts.Labels() {
- name := labelString(label, lineMapping, prog)
- if expected[name] > 0 {
- expected[name]--
- } else if exact {
- surplus[name]++
- }
- }
- // Report multiset difference:
- ok := true
- for _, count := range expected {
- if count > 0 {
- ok = false
- e.errorf("value does not alias these expected labels: %s", join(expected))
- break
- }
- }
- for _, count := range surplus {
- if count > 0 {
- ok = false
- e.errorf("value may additionally alias these labels: %s", join(surplus))
- break
- }
- }
- return ok
-}
-
-func checkTypesExpectation(e *expectation, pts pointer.PointsToSet, typ types.Type) bool {
- var expected typeutil.Map
- var surplus typeutil.Map
- exact := true
- for _, g := range e.types {
- if g == types.Typ[types.Invalid] {
- exact = false
- continue
- }
- expected.Set(g, struct{}{})
- }
-
- if !pointer.CanHaveDynamicTypes(typ) {
- e.errorf("@types expectation requires an interface- or reflect.Value-typed operand, got %s", typ)
- return false
- }
-
- // Find the set of types that the probe's
- // argument (x in print(x)) may contain.
- for _, T := range pts.DynamicTypes().Keys() {
- if expected.At(T) != nil {
- expected.Delete(T)
- } else if exact {
- surplus.Set(T, struct{}{})
- }
- }
- // Report set difference:
- ok := true
- if expected.Len() > 0 {
- ok = false
- e.errorf("interface cannot contain these types: %s", expected.KeysString())
- }
- if surplus.Len() > 0 {
- ok = false
- e.errorf("interface may additionally contain these types: %s", surplus.KeysString())
- }
- return ok
-}
-
-var errOK = errors.New("OK")
-
-func checkCallsExpectation(prog *ssa.Program, e *expectation, cg *callgraph.Graph) bool {
- found := make(map[string]int)
- err := callgraph.GraphVisitEdges(cg, func(edge *callgraph.Edge) error {
- // Name-based matching is inefficient but it allows us to
- // match functions whose names that would not appear in an
- // index ("") or which are not unique ("func@1.2").
- if edge.Caller.Func.String() == e.args[0] {
- calleeStr := edge.Callee.Func.String()
- if calleeStr == e.args[1] {
- return errOK // expectation satisfied; stop the search
- }
- found[calleeStr]++
- }
- return nil
- })
- if err == errOK {
- return true
- }
- if len(found) == 0 {
- e.errorf("didn't find any calls from %s", e.args[0])
- }
- e.errorf("found no call from %s to %s, but only to %s",
- e.args[0], e.args[1], join(found))
- return false
-}
-
-func checkWarningExpectation(prog *ssa.Program, e *expectation, warnings []pointer.Warning) bool {
- // TODO(adonovan): check the position part of the warning too?
- re, err := regexp.Compile(e.args[0])
- if err != nil {
- e.errorf("invalid regular expression in @warning expectation: %s", err.Error())
- return false
- }
-
- if len(warnings) == 0 {
- e.errorf("@warning %q expectation, but no warnings", e.args[0])
- return false
- }
-
- for _, w := range warnings {
- if re.MatchString(w.Message) {
- return true
- }
- }
-
- e.errorf("@warning %q expectation not satisfied; found these warnings though:", e.args[0])
- for _, w := range warnings {
- fmt.Printf("%s: warning: %s\n", prog.Fset.Position(w.Pos), w.Message)
- }
- return false
-}
-
-func TestInput(t *testing.T) {
- if testing.Short() {
- t.Skip("skipping in short mode; this test requires tons of memory; golang.org/issue/14113")
- }
- ok := true
-
- wd, err := os.Getwd()
- if err != nil {
- t.Errorf("os.Getwd: %s", err)
- return
- }
-
- // 'go test' does a chdir so that relative paths in
- // diagnostics no longer make sense relative to the invoking
- // shell's cwd. We print a special marker so that Emacs can
- // make sense of them.
- fmt.Fprintf(os.Stderr, "Entering directory `%s'\n", wd)
-
- for _, filename := range inputs {
- content, err := ioutil.ReadFile(filename)
- if err != nil {
- t.Errorf("couldn't read file '%s': %s", filename, err)
- continue
- }
-
- if !doOneInput(string(content), filename) {
- ok = false
- }
- }
- if !ok {
- t.Fail()
- }
-}
-
-// join joins the elements of multiset with " | "s.
-func join(set map[string]int) string {
- var buf bytes.Buffer
- sep := ""
- for name, count := range set {
- for i := 0; i < count; i++ {
- buf.WriteString(sep)
- sep = " | "
- buf.WriteString(name)
- }
- }
- return buf.String()
-}
-
-// split returns the list of sep-delimited non-empty strings in s.
-func split(s, sep string) (r []string) {
- for _, elem := range strings.Split(s, sep) {
- elem = strings.TrimSpace(elem)
- if elem != "" {
- r = append(r, elem)
- }
- }
- return
-}
diff --git a/vendor/golang.org/x/tools/go/pointer/print.go b/vendor/golang.org/x/tools/go/pointer/print.go
deleted file mode 100644
index 4f2f4c7..0000000
--- a/vendor/golang.org/x/tools/go/pointer/print.go
+++ /dev/null
@@ -1,43 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package pointer
-
-import "fmt"
-
-func (c *addrConstraint) String() string {
- return fmt.Sprintf("addr n%d <- {&n%d}", c.dst, c.src)
-}
-
-func (c *copyConstraint) String() string {
- return fmt.Sprintf("copy n%d <- n%d", c.dst, c.src)
-}
-
-func (c *loadConstraint) String() string {
- return fmt.Sprintf("load n%d <- n%d[%d]", c.dst, c.src, c.offset)
-}
-
-func (c *storeConstraint) String() string {
- return fmt.Sprintf("store n%d[%d] <- n%d", c.dst, c.offset, c.src)
-}
-
-func (c *offsetAddrConstraint) String() string {
- return fmt.Sprintf("offsetAddr n%d <- n%d.#%d", c.dst, c.src, c.offset)
-}
-
-func (c *typeFilterConstraint) String() string {
- return fmt.Sprintf("typeFilter n%d <- n%d.(%s)", c.dst, c.src, c.typ)
-}
-
-func (c *untagConstraint) String() string {
- return fmt.Sprintf("untag n%d <- n%d.(%s)", c.dst, c.src, c.typ)
-}
-
-func (c *invokeConstraint) String() string {
- return fmt.Sprintf("invoke n%d.%s(n%d ...)", c.iface, c.method.Name(), c.params)
-}
-
-func (n nodeid) String() string {
- return fmt.Sprintf("n%d", n)
-}
diff --git a/vendor/golang.org/x/tools/go/pointer/query.go b/vendor/golang.org/x/tools/go/pointer/query.go
deleted file mode 100644
index 1263d31..0000000
--- a/vendor/golang.org/x/tools/go/pointer/query.go
+++ /dev/null
@@ -1,221 +0,0 @@
-package pointer
-
-import (
- "errors"
- "fmt"
- "go/ast"
- "go/parser"
- "go/token"
- "go/types"
- "strconv"
-)
-
-// An extendedQuery represents a sequence of destructuring operations
-// applied to an ssa.Value (denoted by "x").
-type extendedQuery struct {
- ops []interface{}
- ptr *Pointer
-}
-
-// indexValue returns the value of an integer literal used as an
-// index.
-func indexValue(expr ast.Expr) (int, error) {
- lit, ok := expr.(*ast.BasicLit)
- if !ok {
- return 0, fmt.Errorf("non-integer index (%T)", expr)
- }
- if lit.Kind != token.INT {
- return 0, fmt.Errorf("non-integer index %s", lit.Value)
- }
- return strconv.Atoi(lit.Value)
-}
-
-// parseExtendedQuery parses and validates a destructuring Go
-// expression and returns the sequence of destructuring operations.
-// See parseDestructuringExpr for details.
-func parseExtendedQuery(typ types.Type, query string) ([]interface{}, types.Type, error) {
- expr, err := parser.ParseExpr(query)
- if err != nil {
- return nil, nil, err
- }
- ops, typ, err := destructuringOps(typ, expr)
- if err != nil {
- return nil, nil, err
- }
- if len(ops) == 0 {
- return nil, nil, errors.New("invalid query: must not be empty")
- }
- if ops[0] != "x" {
- return nil, nil, fmt.Errorf("invalid query: query operand must be named x")
- }
- if !CanPoint(typ) {
- return nil, nil, fmt.Errorf("query does not describe a pointer-like value: %s", typ)
- }
- return ops, typ, nil
-}
-
-// destructuringOps parses a Go expression consisting only of an
-// identifier "x", field selections, indexing, channel receives, load
-// operations and parens---for example: "<-(*x[i])[key]"--- and
-// returns the sequence of destructuring operations on x.
-func destructuringOps(typ types.Type, expr ast.Expr) ([]interface{}, types.Type, error) {
- switch expr := expr.(type) {
- case *ast.SelectorExpr:
- out, typ, err := destructuringOps(typ, expr.X)
- if err != nil {
- return nil, nil, err
- }
-
- var structT *types.Struct
- switch typ := typ.(type) {
- case *types.Pointer:
- var ok bool
- structT, ok = typ.Elem().Underlying().(*types.Struct)
- if !ok {
- return nil, nil, fmt.Errorf("cannot access field %s of pointer to type %s", expr.Sel.Name, typ.Elem())
- }
-
- out = append(out, "load")
- case *types.Struct:
- structT = typ
- default:
- return nil, nil, fmt.Errorf("cannot access field %s of type %s", expr.Sel.Name, typ)
- }
-
- for i := 0; i < structT.NumFields(); i++ {
- field := structT.Field(i)
- if field.Name() == expr.Sel.Name {
- out = append(out, "field", i)
- return out, field.Type().Underlying(), nil
- }
- }
- // TODO(dh): supporting embedding would need something like
- // types.LookupFieldOrMethod, but without taking package
- // boundaries into account, because we may want to access
- // unexported fields. If we were only interested in one level
- // of unexported name, we could determine the appropriate
- // package and run LookupFieldOrMethod with that. However, a
- // single query may want to cross multiple package boundaries,
- // and at this point it's not really worth the complexity.
- return nil, nil, fmt.Errorf("no field %s in %s (embedded fields must be resolved manually)", expr.Sel.Name, structT)
- case *ast.Ident:
- return []interface{}{expr.Name}, typ, nil
- case *ast.BasicLit:
- return []interface{}{expr.Value}, nil, nil
- case *ast.IndexExpr:
- out, typ, err := destructuringOps(typ, expr.X)
- if err != nil {
- return nil, nil, err
- }
- switch typ := typ.(type) {
- case *types.Array:
- out = append(out, "arrayelem")
- return out, typ.Elem().Underlying(), nil
- case *types.Slice:
- out = append(out, "sliceelem")
- return out, typ.Elem().Underlying(), nil
- case *types.Map:
- out = append(out, "mapelem")
- return out, typ.Elem().Underlying(), nil
- case *types.Tuple:
- out = append(out, "index")
- idx, err := indexValue(expr.Index)
- if err != nil {
- return nil, nil, err
- }
- out = append(out, idx)
- if idx >= typ.Len() || idx < 0 {
- return nil, nil, fmt.Errorf("tuple index %d out of bounds", idx)
- }
- return out, typ.At(idx).Type().Underlying(), nil
- default:
- return nil, nil, fmt.Errorf("cannot index type %s", typ)
- }
-
- case *ast.UnaryExpr:
- if expr.Op != token.ARROW {
- return nil, nil, fmt.Errorf("unsupported unary operator %s", expr.Op)
- }
- out, typ, err := destructuringOps(typ, expr.X)
- if err != nil {
- return nil, nil, err
- }
- ch, ok := typ.(*types.Chan)
- if !ok {
- return nil, nil, fmt.Errorf("cannot receive from value of type %s", typ)
- }
- out = append(out, "recv")
- return out, ch.Elem().Underlying(), err
- case *ast.ParenExpr:
- return destructuringOps(typ, expr.X)
- case *ast.StarExpr:
- out, typ, err := destructuringOps(typ, expr.X)
- if err != nil {
- return nil, nil, err
- }
- ptr, ok := typ.(*types.Pointer)
- if !ok {
- return nil, nil, fmt.Errorf("cannot dereference type %s", typ)
- }
- out = append(out, "load")
- return out, ptr.Elem().Underlying(), err
- default:
- return nil, nil, fmt.Errorf("unsupported expression %T", expr)
- }
-}
-
-func (a *analysis) evalExtendedQuery(t types.Type, id nodeid, ops []interface{}) (types.Type, nodeid) {
- pid := id
- // TODO(dh): we're allocating intermediary nodes each time
- // evalExtendedQuery is called. We should probably only generate
- // them once per (v, ops) pair.
- for i := 1; i < len(ops); i++ {
- var nid nodeid
- switch ops[i] {
- case "recv":
- t = t.(*types.Chan).Elem().Underlying()
- nid = a.addNodes(t, "query.extended")
- a.load(nid, pid, 0, a.sizeof(t))
- case "field":
- i++ // fetch field index
- tt := t.(*types.Struct)
- idx := ops[i].(int)
- offset := a.offsetOf(t, idx)
- t = tt.Field(idx).Type().Underlying()
- nid = a.addNodes(t, "query.extended")
- a.copy(nid, pid+nodeid(offset), a.sizeof(t))
- case "arrayelem":
- t = t.(*types.Array).Elem().Underlying()
- nid = a.addNodes(t, "query.extended")
- a.copy(nid, 1+pid, a.sizeof(t))
- case "sliceelem":
- t = t.(*types.Slice).Elem().Underlying()
- nid = a.addNodes(t, "query.extended")
- a.load(nid, pid, 1, a.sizeof(t))
- case "mapelem":
- tt := t.(*types.Map)
- t = tt.Elem()
- ksize := a.sizeof(tt.Key())
- vsize := a.sizeof(tt.Elem())
- nid = a.addNodes(t, "query.extended")
- a.load(nid, pid, ksize, vsize)
- case "index":
- i++ // fetch index
- tt := t.(*types.Tuple)
- idx := ops[i].(int)
- t = tt.At(idx).Type().Underlying()
- nid = a.addNodes(t, "query.extended")
- a.copy(nid, pid+nodeid(idx), a.sizeof(t))
- case "load":
- t = t.(*types.Pointer).Elem().Underlying()
- nid = a.addNodes(t, "query.extended")
- a.load(nid, pid, 0, a.sizeof(t))
- default:
- // shouldn't happen
- panic(fmt.Sprintf("unknown op %q", ops[i]))
- }
- pid = nid
- }
-
- return t, pid
-}
diff --git a/vendor/golang.org/x/tools/go/pointer/query_test.go b/vendor/golang.org/x/tools/go/pointer/query_test.go
deleted file mode 100644
index 099cc54..0000000
--- a/vendor/golang.org/x/tools/go/pointer/query_test.go
+++ /dev/null
@@ -1,68 +0,0 @@
-package pointer
-
-import (
- "go/ast"
- "go/parser"
- "go/token"
- "go/types"
- "reflect"
- "testing"
-)
-
-func TestParseExtendedQuery(t *testing.T) {
- const myprog = `
-package pkg
-var V1 *int
-var V2 **int
-var V3 []*int
-var V4 chan []*int
-var V5 struct {F1, F2 chan *int}
-var V6 [1]chan *int
-var V7 int
-`
- tests := []struct {
- in string
- out []interface{}
- v string
- valid bool
- }{
- {`x`, []interface{}{"x"}, "V1", true},
- {`*x`, []interface{}{"x", "load"}, "V2", true},
- {`x[0]`, []interface{}{"x", "sliceelem"}, "V3", true},
- {`<-x`, []interface{}{"x", "recv"}, "V4", true},
- {`(<-x)[0]`, []interface{}{"x", "recv", "sliceelem"}, "V4", true},
- {`<-x.F2`, []interface{}{"x", "field", 1, "recv"}, "V5", true},
- {`<-x[0]`, []interface{}{"x", "arrayelem", "recv"}, "V6", true},
- {`x`, nil, "V7", false},
- {`y`, nil, "V1", false},
- {`x; x`, nil, "V1", false},
- {`x()`, nil, "V1", false},
- {`close(x)`, nil, "V1", false},
- }
-
- fset := token.NewFileSet()
- f, err := parser.ParseFile(fset, "file.go", myprog, 0)
- if err != nil {
- t.Fatal(err)
- }
- cfg := &types.Config{}
- pkg, err := cfg.Check("main", fset, []*ast.File{f}, nil)
- if err != nil {
- t.Fatal(err)
- }
-
- for _, test := range tests {
- typ := pkg.Scope().Lookup(test.v).Type().Underlying()
- ops, _, err := parseExtendedQuery(typ, test.in)
- if test.valid && err != nil {
- t.Errorf("parseExtendedQuery(%q) = %s, expected no error", test.in, err)
- }
- if !test.valid && err == nil {
- t.Errorf("parseExtendedQuery(%q) succeeded, expected error", test.in)
- }
-
- if !reflect.DeepEqual(ops, test.out) {
- t.Errorf("parseExtendedQuery(%q) = %#v, want %#v", test.in, ops, test.out)
- }
- }
-}
diff --git a/vendor/golang.org/x/tools/go/pointer/reflect.go b/vendor/golang.org/x/tools/go/pointer/reflect.go
deleted file mode 100644
index 3439a89..0000000
--- a/vendor/golang.org/x/tools/go/pointer/reflect.go
+++ /dev/null
@@ -1,1975 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package pointer
-
-// This file implements the generation and resolution rules for
-// constraints arising from the use of reflection in the target
-// program. See doc.go for explanation of the representation.
-//
-// For consistency, the names of all parameters match those of the
-// actual functions in the "reflect" package.
-//
-// To avoid proliferation of equivalent labels, intrinsics should
-// memoize as much as possible, like TypeOf and Zero do for their
-// tagged objects.
-//
-// TODO(adonovan): this file is rather subtle. Explain how we derive
-// the implementation of each reflect operator from its spec,
-// including the subtleties of reflect.flag{Addr,RO,Indir}.
-// [Hint: our implementation is as if reflect.flagIndir was always
-// true, i.e. reflect.Values are pointers to tagged objects, there is
-// no inline allocation optimization; and indirect tagged objects (not
-// yet implemented) correspond to reflect.Values with
-// reflect.flagAddr.]
-// A picture would help too.
-//
-// TODO(adonovan): try factoring up the common parts of the majority of
-// these constraints that are single input, single output.
-
-import (
- "fmt"
- exact "go/constant"
- "go/types"
- "reflect"
-
- "golang.org/x/tools/go/ssa"
-)
-
-func init() {
- for name, fn := range map[string]intrinsic{
- // reflect.Value methods.
- "(reflect.Value).Addr": ext۰reflect۰Value۰Addr,
- "(reflect.Value).Bool": ext۰NoEffect,
- "(reflect.Value).Bytes": ext۰reflect۰Value۰Bytes,
- "(reflect.Value).Call": ext۰reflect۰Value۰Call,
- "(reflect.Value).CallSlice": ext۰reflect۰Value۰CallSlice,
- "(reflect.Value).CanAddr": ext۰NoEffect,
- "(reflect.Value).CanInterface": ext۰NoEffect,
- "(reflect.Value).CanSet": ext۰NoEffect,
- "(reflect.Value).Cap": ext۰NoEffect,
- "(reflect.Value).Close": ext۰NoEffect,
- "(reflect.Value).Complex": ext۰NoEffect,
- "(reflect.Value).Convert": ext۰reflect۰Value۰Convert,
- "(reflect.Value).Elem": ext۰reflect۰Value۰Elem,
- "(reflect.Value).Field": ext۰reflect۰Value۰Field,
- "(reflect.Value).FieldByIndex": ext۰reflect۰Value۰FieldByIndex,
- "(reflect.Value).FieldByName": ext۰reflect۰Value۰FieldByName,
- "(reflect.Value).FieldByNameFunc": ext۰reflect۰Value۰FieldByNameFunc,
- "(reflect.Value).Float": ext۰NoEffect,
- "(reflect.Value).Index": ext۰reflect۰Value۰Index,
- "(reflect.Value).Int": ext۰NoEffect,
- "(reflect.Value).Interface": ext۰reflect۰Value۰Interface,
- "(reflect.Value).InterfaceData": ext۰NoEffect,
- "(reflect.Value).IsNil": ext۰NoEffect,
- "(reflect.Value).IsValid": ext۰NoEffect,
- "(reflect.Value).Kind": ext۰NoEffect,
- "(reflect.Value).Len": ext۰NoEffect,
- "(reflect.Value).MapIndex": ext۰reflect۰Value۰MapIndex,
- "(reflect.Value).MapKeys": ext۰reflect۰Value۰MapKeys,
- "(reflect.Value).Method": ext۰reflect۰Value۰Method,
- "(reflect.Value).MethodByName": ext۰reflect۰Value۰MethodByName,
- "(reflect.Value).NumField": ext۰NoEffect,
- "(reflect.Value).NumMethod": ext۰NoEffect,
- "(reflect.Value).OverflowComplex": ext۰NoEffect,
- "(reflect.Value).OverflowFloat": ext۰NoEffect,
- "(reflect.Value).OverflowInt": ext۰NoEffect,
- "(reflect.Value).OverflowUint": ext۰NoEffect,
- "(reflect.Value).Pointer": ext۰NoEffect,
- "(reflect.Value).Recv": ext۰reflect۰Value۰Recv,
- "(reflect.Value).Send": ext۰reflect۰Value۰Send,
- "(reflect.Value).Set": ext۰reflect۰Value۰Set,
- "(reflect.Value).SetBool": ext۰NoEffect,
- "(reflect.Value).SetBytes": ext۰reflect۰Value۰SetBytes,
- "(reflect.Value).SetComplex": ext۰NoEffect,
- "(reflect.Value).SetFloat": ext۰NoEffect,
- "(reflect.Value).SetInt": ext۰NoEffect,
- "(reflect.Value).SetLen": ext۰NoEffect,
- "(reflect.Value).SetMapIndex": ext۰reflect۰Value۰SetMapIndex,
- "(reflect.Value).SetPointer": ext۰reflect۰Value۰SetPointer,
- "(reflect.Value).SetString": ext۰NoEffect,
- "(reflect.Value).SetUint": ext۰NoEffect,
- "(reflect.Value).Slice": ext۰reflect۰Value۰Slice,
- "(reflect.Value).String": ext۰NoEffect,
- "(reflect.Value).TryRecv": ext۰reflect۰Value۰Recv,
- "(reflect.Value).TrySend": ext۰reflect۰Value۰Send,
- "(reflect.Value).Type": ext۰NoEffect,
- "(reflect.Value).Uint": ext۰NoEffect,
- "(reflect.Value).UnsafeAddr": ext۰NoEffect,
-
- // Standalone reflect.* functions.
- "reflect.Append": ext۰reflect۰Append,
- "reflect.AppendSlice": ext۰reflect۰AppendSlice,
- "reflect.Copy": ext۰reflect۰Copy,
- "reflect.ChanOf": ext۰reflect۰ChanOf,
- "reflect.DeepEqual": ext۰NoEffect,
- "reflect.Indirect": ext۰reflect۰Indirect,
- "reflect.MakeChan": ext۰reflect۰MakeChan,
- "reflect.MakeFunc": ext۰reflect۰MakeFunc,
- "reflect.MakeMap": ext۰reflect۰MakeMap,
- "reflect.MakeSlice": ext۰reflect۰MakeSlice,
- "reflect.MapOf": ext۰reflect۰MapOf,
- "reflect.New": ext۰reflect۰New,
- "reflect.NewAt": ext۰reflect۰NewAt,
- "reflect.PtrTo": ext۰reflect۰PtrTo,
- "reflect.Select": ext۰reflect۰Select,
- "reflect.SliceOf": ext۰reflect۰SliceOf,
- "reflect.TypeOf": ext۰reflect۰TypeOf,
- "reflect.ValueOf": ext۰reflect۰ValueOf,
- "reflect.Zero": ext۰reflect۰Zero,
- "reflect.init": ext۰NoEffect,
-
- // *reflect.rtype methods
- "(*reflect.rtype).Align": ext۰NoEffect,
- "(*reflect.rtype).AssignableTo": ext۰NoEffect,
- "(*reflect.rtype).Bits": ext۰NoEffect,
- "(*reflect.rtype).ChanDir": ext۰NoEffect,
- "(*reflect.rtype).ConvertibleTo": ext۰NoEffect,
- "(*reflect.rtype).Elem": ext۰reflect۰rtype۰Elem,
- "(*reflect.rtype).Field": ext۰reflect۰rtype۰Field,
- "(*reflect.rtype).FieldAlign": ext۰NoEffect,
- "(*reflect.rtype).FieldByIndex": ext۰reflect۰rtype۰FieldByIndex,
- "(*reflect.rtype).FieldByName": ext۰reflect۰rtype۰FieldByName,
- "(*reflect.rtype).FieldByNameFunc": ext۰reflect۰rtype۰FieldByNameFunc,
- "(*reflect.rtype).Implements": ext۰NoEffect,
- "(*reflect.rtype).In": ext۰reflect۰rtype۰In,
- "(*reflect.rtype).IsVariadic": ext۰NoEffect,
- "(*reflect.rtype).Key": ext۰reflect۰rtype۰Key,
- "(*reflect.rtype).Kind": ext۰NoEffect,
- "(*reflect.rtype).Len": ext۰NoEffect,
- "(*reflect.rtype).Method": ext۰reflect۰rtype۰Method,
- "(*reflect.rtype).MethodByName": ext۰reflect۰rtype۰MethodByName,
- "(*reflect.rtype).Name": ext۰NoEffect,
- "(*reflect.rtype).NumField": ext۰NoEffect,
- "(*reflect.rtype).NumIn": ext۰NoEffect,
- "(*reflect.rtype).NumMethod": ext۰NoEffect,
- "(*reflect.rtype).NumOut": ext۰NoEffect,
- "(*reflect.rtype).Out": ext۰reflect۰rtype۰Out,
- "(*reflect.rtype).PkgPath": ext۰NoEffect,
- "(*reflect.rtype).Size": ext۰NoEffect,
- "(*reflect.rtype).String": ext۰NoEffect,
- } {
- intrinsicsByName[name] = fn
- }
-}
-
-// -------------------- (reflect.Value) --------------------
-
-func ext۰reflect۰Value۰Addr(a *analysis, cgn *cgnode) {} // TODO(adonovan)
-
-// ---------- func (Value).Bytes() Value ----------
-
-// result = v.Bytes()
-type rVBytesConstraint struct {
- v nodeid // (ptr)
- result nodeid // (indirect)
-}
-
-func (c *rVBytesConstraint) ptr() nodeid { return c.v }
-func (c *rVBytesConstraint) presolve(h *hvn) {
- h.markIndirect(onodeid(c.result), "rVBytes.result")
-}
-func (c *rVBytesConstraint) renumber(mapping []nodeid) {
- c.v = mapping[c.v]
- c.result = mapping[c.result]
-}
-
-func (c *rVBytesConstraint) String() string {
- return fmt.Sprintf("n%d = reflect n%d.Bytes()", c.result, c.v)
-}
-
-func (c *rVBytesConstraint) solve(a *analysis, delta *nodeset) {
- changed := false
- for _, x := range delta.AppendTo(a.deltaSpace) {
- vObj := nodeid(x)
- tDyn, slice, indirect := a.taggedValue(vObj)
- if indirect {
- // TODO(adonovan): we'll need to implement this
- // when we start creating indirect tagged objects.
- panic("indirect tagged object")
- }
-
- tSlice, ok := tDyn.Underlying().(*types.Slice)
- if ok && types.Identical(tSlice.Elem(), types.Typ[types.Uint8]) {
- if a.onlineCopy(c.result, slice) {
- changed = true
- }
- }
- }
- if changed {
- a.addWork(c.result)
- }
-}
-
-func ext۰reflect۰Value۰Bytes(a *analysis, cgn *cgnode) {
- a.addConstraint(&rVBytesConstraint{
- v: a.funcParams(cgn.obj),
- result: a.funcResults(cgn.obj),
- })
-}
-
-// ---------- func (Value).Call(in []Value) []Value ----------
-
-// result = v.Call(in)
-type rVCallConstraint struct {
- cgn *cgnode
- targets nodeid // (indirect)
- v nodeid // (ptr)
- arg nodeid // = in[*]
- result nodeid // (indirect)
- dotdotdot bool // interpret last arg as a "..." slice
-}
-
-func (c *rVCallConstraint) ptr() nodeid { return c.v }
-func (c *rVCallConstraint) presolve(h *hvn) {
- h.markIndirect(onodeid(c.targets), "rVCall.targets")
- h.markIndirect(onodeid(c.result), "rVCall.result")
-}
-func (c *rVCallConstraint) renumber(mapping []nodeid) {
- c.targets = mapping[c.targets]
- c.v = mapping[c.v]
- c.arg = mapping[c.arg]
- c.result = mapping[c.result]
-}
-
-func (c *rVCallConstraint) String() string {
- return fmt.Sprintf("n%d = reflect n%d.Call(n%d)", c.result, c.v, c.arg)
-}
-
-func (c *rVCallConstraint) solve(a *analysis, delta *nodeset) {
- if c.targets == 0 {
- panic("no targets")
- }
-
- changed := false
- for _, x := range delta.AppendTo(a.deltaSpace) {
- vObj := nodeid(x)
- tDyn, fn, indirect := a.taggedValue(vObj)
- if indirect {
- // TODO(adonovan): we'll need to implement this
- // when we start creating indirect tagged objects.
- panic("indirect tagged object")
- }
-
- tSig, ok := tDyn.Underlying().(*types.Signature)
- if !ok {
- continue // not a function
- }
- if tSig.Recv() != nil {
- panic(tSig) // TODO(adonovan): rethink when we implement Method()
- }
-
- // Add dynamic call target.
- if a.onlineCopy(c.targets, fn) {
- a.addWork(c.targets)
- // TODO(adonovan): is 'else continue' a sound optimisation here?
- }
-
- // Allocate a P/R block.
- tParams := tSig.Params()
- tResults := tSig.Results()
- params := a.addNodes(tParams, "rVCall.params")
- results := a.addNodes(tResults, "rVCall.results")
-
- // Make a dynamic call to 'fn'.
- a.store(fn, params, 1, a.sizeof(tParams))
- a.load(results, fn, 1+a.sizeof(tParams), a.sizeof(tResults))
-
- // Populate P by type-asserting each actual arg (all merged in c.arg).
- for i, n := 0, tParams.Len(); i < n; i++ {
- T := tParams.At(i).Type()
- a.typeAssert(T, params, c.arg, false)
- params += nodeid(a.sizeof(T))
- }
-
- // Use R by tagging and copying each actual result to c.result.
- for i, n := 0, tResults.Len(); i < n; i++ {
- T := tResults.At(i).Type()
- // Convert from an arbitrary type to a reflect.Value
- // (like MakeInterface followed by reflect.ValueOf).
- if isInterface(T) {
- // (don't tag)
- if a.onlineCopy(c.result, results) {
- changed = true
- }
- } else {
- obj := a.makeTagged(T, c.cgn, nil)
- a.onlineCopyN(obj+1, results, a.sizeof(T))
- if a.addLabel(c.result, obj) { // (true)
- changed = true
- }
- }
- results += nodeid(a.sizeof(T))
- }
- }
- if changed {
- a.addWork(c.result)
- }
-}
-
-// Common code for direct (inlined) and indirect calls to (reflect.Value).Call.
-func reflectCallImpl(a *analysis, cgn *cgnode, site *callsite, recv, arg nodeid, dotdotdot bool) nodeid {
- // Allocate []reflect.Value array for the result.
- ret := a.nextNode()
- a.addNodes(types.NewArray(a.reflectValueObj.Type(), 1), "rVCall.ret")
- a.endObject(ret, cgn, nil)
-
- // pts(targets) will be the set of possible call targets.
- site.targets = a.addOneNode(tInvalid, "rvCall.targets", nil)
-
- // All arguments are merged since they arrive in a slice.
- argelts := a.addOneNode(a.reflectValueObj.Type(), "rVCall.args", nil)
- a.load(argelts, arg, 1, 1) // slice elements
-
- a.addConstraint(&rVCallConstraint{
- cgn: cgn,
- targets: site.targets,
- v: recv,
- arg: argelts,
- result: ret + 1, // results go into elements of ret
- dotdotdot: dotdotdot,
- })
- return ret
-}
-
-func reflectCall(a *analysis, cgn *cgnode, dotdotdot bool) {
- // This is the shared contour implementation of (reflect.Value).Call
- // and CallSlice, as used by indirect calls (rare).
- // Direct calls are inlined in gen.go, eliding the
- // intermediate cgnode for Call.
- site := new(callsite)
- cgn.sites = append(cgn.sites, site)
- recv := a.funcParams(cgn.obj)
- arg := recv + 1
- ret := reflectCallImpl(a, cgn, site, recv, arg, dotdotdot)
- a.addressOf(cgn.fn.Signature.Results().At(0).Type(), a.funcResults(cgn.obj), ret)
-}
-
-func ext۰reflect۰Value۰Call(a *analysis, cgn *cgnode) {
- reflectCall(a, cgn, false)
-}
-
-func ext۰reflect۰Value۰CallSlice(a *analysis, cgn *cgnode) {
- // TODO(adonovan): implement. Also, inline direct calls in gen.go too.
- if false {
- reflectCall(a, cgn, true)
- }
-}
-
-func ext۰reflect۰Value۰Convert(a *analysis, cgn *cgnode) {} // TODO(adonovan)
-
-// ---------- func (Value).Elem() Value ----------
-
-// result = v.Elem()
-type rVElemConstraint struct {
- cgn *cgnode
- v nodeid // (ptr)
- result nodeid // (indirect)
-}
-
-func (c *rVElemConstraint) ptr() nodeid { return c.v }
-func (c *rVElemConstraint) presolve(h *hvn) {
- h.markIndirect(onodeid(c.result), "rVElem.result")
-}
-func (c *rVElemConstraint) renumber(mapping []nodeid) {
- c.v = mapping[c.v]
- c.result = mapping[c.result]
-}
-
-func (c *rVElemConstraint) String() string {
- return fmt.Sprintf("n%d = reflect n%d.Elem()", c.result, c.v)
-}
-
-func (c *rVElemConstraint) solve(a *analysis, delta *nodeset) {
- changed := false
- for _, x := range delta.AppendTo(a.deltaSpace) {
- vObj := nodeid(x)
- tDyn, payload, indirect := a.taggedValue(vObj)
- if indirect {
- // TODO(adonovan): we'll need to implement this
- // when we start creating indirect tagged objects.
- panic("indirect tagged object")
- }
-
- switch t := tDyn.Underlying().(type) {
- case *types.Interface:
- if a.onlineCopy(c.result, payload) {
- changed = true
- }
-
- case *types.Pointer:
- obj := a.makeTagged(t.Elem(), c.cgn, nil)
- a.load(obj+1, payload, 0, a.sizeof(t.Elem()))
- if a.addLabel(c.result, obj) {
- changed = true
- }
- }
- }
- if changed {
- a.addWork(c.result)
- }
-}
-
-func ext۰reflect۰Value۰Elem(a *analysis, cgn *cgnode) {
- a.addConstraint(&rVElemConstraint{
- cgn: cgn,
- v: a.funcParams(cgn.obj),
- result: a.funcResults(cgn.obj),
- })
-}
-
-func ext۰reflect۰Value۰Field(a *analysis, cgn *cgnode) {} // TODO(adonovan)
-func ext۰reflect۰Value۰FieldByIndex(a *analysis, cgn *cgnode) {} // TODO(adonovan)
-func ext۰reflect۰Value۰FieldByName(a *analysis, cgn *cgnode) {} // TODO(adonovan)
-func ext۰reflect۰Value۰FieldByNameFunc(a *analysis, cgn *cgnode) {} // TODO(adonovan)
-
-// ---------- func (Value).Index() Value ----------
-
-// result = v.Index()
-type rVIndexConstraint struct {
- cgn *cgnode
- v nodeid // (ptr)
- result nodeid // (indirect)
-}
-
-func (c *rVIndexConstraint) ptr() nodeid { return c.v }
-func (c *rVIndexConstraint) presolve(h *hvn) {
- h.markIndirect(onodeid(c.result), "rVIndex.result")
-}
-func (c *rVIndexConstraint) renumber(mapping []nodeid) {
- c.v = mapping[c.v]
- c.result = mapping[c.result]
-}
-
-func (c *rVIndexConstraint) String() string {
- return fmt.Sprintf("n%d = reflect n%d.Index()", c.result, c.v)
-}
-
-func (c *rVIndexConstraint) solve(a *analysis, delta *nodeset) {
- changed := false
- for _, x := range delta.AppendTo(a.deltaSpace) {
- vObj := nodeid(x)
- tDyn, payload, indirect := a.taggedValue(vObj)
- if indirect {
- // TODO(adonovan): we'll need to implement this
- // when we start creating indirect tagged objects.
- panic("indirect tagged object")
- }
-
- var res nodeid
- switch t := tDyn.Underlying().(type) {
- case *types.Array:
- res = a.makeTagged(t.Elem(), c.cgn, nil)
- a.onlineCopyN(res+1, payload+1, a.sizeof(t.Elem()))
-
- case *types.Slice:
- res = a.makeTagged(t.Elem(), c.cgn, nil)
- a.load(res+1, payload, 1, a.sizeof(t.Elem()))
-
- case *types.Basic:
- if t.Kind() == types.String {
- res = a.makeTagged(types.Typ[types.Rune], c.cgn, nil)
- }
- }
- if res != 0 && a.addLabel(c.result, res) {
- changed = true
- }
- }
- if changed {
- a.addWork(c.result)
- }
-}
-
-func ext۰reflect۰Value۰Index(a *analysis, cgn *cgnode) {
- a.addConstraint(&rVIndexConstraint{
- cgn: cgn,
- v: a.funcParams(cgn.obj),
- result: a.funcResults(cgn.obj),
- })
-}
-
-// ---------- func (Value).Interface() Value ----------
-
-// result = v.Interface()
-type rVInterfaceConstraint struct {
- v nodeid // (ptr)
- result nodeid // (indirect)
-}
-
-func (c *rVInterfaceConstraint) ptr() nodeid { return c.v }
-func (c *rVInterfaceConstraint) presolve(h *hvn) {
- h.markIndirect(onodeid(c.result), "rVInterface.result")
-}
-func (c *rVInterfaceConstraint) renumber(mapping []nodeid) {
- c.v = mapping[c.v]
- c.result = mapping[c.result]
-}
-
-func (c *rVInterfaceConstraint) String() string {
- return fmt.Sprintf("n%d = reflect n%d.Interface()", c.result, c.v)
-}
-
-func (c *rVInterfaceConstraint) solve(a *analysis, delta *nodeset) {
- changed := false
- for _, x := range delta.AppendTo(a.deltaSpace) {
- vObj := nodeid(x)
- tDyn, payload, indirect := a.taggedValue(vObj)
- if indirect {
- // TODO(adonovan): we'll need to implement this
- // when we start creating indirect tagged objects.
- panic("indirect tagged object")
- }
-
- if isInterface(tDyn) {
- if a.onlineCopy(c.result, payload) {
- a.addWork(c.result)
- }
- } else {
- if a.addLabel(c.result, vObj) {
- changed = true
- }
- }
- }
- if changed {
- a.addWork(c.result)
- }
-}
-
-func ext۰reflect۰Value۰Interface(a *analysis, cgn *cgnode) {
- a.addConstraint(&rVInterfaceConstraint{
- v: a.funcParams(cgn.obj),
- result: a.funcResults(cgn.obj),
- })
-}
-
-// ---------- func (Value).MapIndex(Value) Value ----------
-
-// result = v.MapIndex(_)
-type rVMapIndexConstraint struct {
- cgn *cgnode
- v nodeid // (ptr)
- result nodeid // (indirect)
-}
-
-func (c *rVMapIndexConstraint) ptr() nodeid { return c.v }
-func (c *rVMapIndexConstraint) presolve(h *hvn) {
- h.markIndirect(onodeid(c.result), "rVMapIndex.result")
-}
-func (c *rVMapIndexConstraint) renumber(mapping []nodeid) {
- c.v = mapping[c.v]
- c.result = mapping[c.result]
-}
-
-func (c *rVMapIndexConstraint) String() string {
- return fmt.Sprintf("n%d = reflect n%d.MapIndex(_)", c.result, c.v)
-}
-
-func (c *rVMapIndexConstraint) solve(a *analysis, delta *nodeset) {
- changed := false
- for _, x := range delta.AppendTo(a.deltaSpace) {
- vObj := nodeid(x)
- tDyn, m, indirect := a.taggedValue(vObj)
- tMap, _ := tDyn.Underlying().(*types.Map)
- if tMap == nil {
- continue // not a map
- }
- if indirect {
- // TODO(adonovan): we'll need to implement this
- // when we start creating indirect tagged objects.
- panic("indirect tagged object")
- }
-
- obj := a.makeTagged(tMap.Elem(), c.cgn, nil)
- a.load(obj+1, m, a.sizeof(tMap.Key()), a.sizeof(tMap.Elem()))
- if a.addLabel(c.result, obj) {
- changed = true
- }
- }
- if changed {
- a.addWork(c.result)
- }
-}
-
-func ext۰reflect۰Value۰MapIndex(a *analysis, cgn *cgnode) {
- a.addConstraint(&rVMapIndexConstraint{
- cgn: cgn,
- v: a.funcParams(cgn.obj),
- result: a.funcResults(cgn.obj),
- })
-}
-
-// ---------- func (Value).MapKeys() []Value ----------
-
-// result = v.MapKeys()
-type rVMapKeysConstraint struct {
- cgn *cgnode
- v nodeid // (ptr)
- result nodeid // (indirect)
-}
-
-func (c *rVMapKeysConstraint) ptr() nodeid { return c.v }
-func (c *rVMapKeysConstraint) presolve(h *hvn) {
- h.markIndirect(onodeid(c.result), "rVMapKeys.result")
-}
-func (c *rVMapKeysConstraint) renumber(mapping []nodeid) {
- c.v = mapping[c.v]
- c.result = mapping[c.result]
-}
-
-func (c *rVMapKeysConstraint) String() string {
- return fmt.Sprintf("n%d = reflect n%d.MapKeys()", c.result, c.v)
-}
-
-func (c *rVMapKeysConstraint) solve(a *analysis, delta *nodeset) {
- changed := false
- for _, x := range delta.AppendTo(a.deltaSpace) {
- vObj := nodeid(x)
- tDyn, m, indirect := a.taggedValue(vObj)
- tMap, _ := tDyn.Underlying().(*types.Map)
- if tMap == nil {
- continue // not a map
- }
- if indirect {
- // TODO(adonovan): we'll need to implement this
- // when we start creating indirect tagged objects.
- panic("indirect tagged object")
- }
-
- kObj := a.makeTagged(tMap.Key(), c.cgn, nil)
- a.load(kObj+1, m, 0, a.sizeof(tMap.Key()))
- if a.addLabel(c.result, kObj) {
- changed = true
- }
- }
- if changed {
- a.addWork(c.result)
- }
-}
-
-func ext۰reflect۰Value۰MapKeys(a *analysis, cgn *cgnode) {
- // Allocate an array for the result.
- obj := a.nextNode()
- T := types.NewSlice(a.reflectValueObj.Type())
- a.addNodes(sliceToArray(T), "reflect.MapKeys result")
- a.endObject(obj, cgn, nil)
- a.addressOf(T, a.funcResults(cgn.obj), obj)
-
- a.addConstraint(&rVMapKeysConstraint{
- cgn: cgn,
- v: a.funcParams(cgn.obj),
- result: obj + 1, // result is stored in array elems
- })
-}
-
-func ext۰reflect۰Value۰Method(a *analysis, cgn *cgnode) {} // TODO(adonovan)
-func ext۰reflect۰Value۰MethodByName(a *analysis, cgn *cgnode) {} // TODO(adonovan)
-
-// ---------- func (Value).Recv(Value) Value ----------
-
-// result, _ = v.Recv()
-type rVRecvConstraint struct {
- cgn *cgnode
- v nodeid // (ptr)
- result nodeid // (indirect)
-}
-
-func (c *rVRecvConstraint) ptr() nodeid { return c.v }
-func (c *rVRecvConstraint) presolve(h *hvn) {
- h.markIndirect(onodeid(c.result), "rVRecv.result")
-}
-func (c *rVRecvConstraint) renumber(mapping []nodeid) {
- c.v = mapping[c.v]
- c.result = mapping[c.result]
-}
-
-func (c *rVRecvConstraint) String() string {
- return fmt.Sprintf("n%d = reflect n%d.Recv()", c.result, c.v)
-}
-
-func (c *rVRecvConstraint) solve(a *analysis, delta *nodeset) {
- changed := false
- for _, x := range delta.AppendTo(a.deltaSpace) {
- vObj := nodeid(x)
- tDyn, ch, indirect := a.taggedValue(vObj)
- tChan, _ := tDyn.Underlying().(*types.Chan)
- if tChan == nil {
- continue // not a channel
- }
- if indirect {
- // TODO(adonovan): we'll need to implement this
- // when we start creating indirect tagged objects.
- panic("indirect tagged object")
- }
-
- tElem := tChan.Elem()
- elemObj := a.makeTagged(tElem, c.cgn, nil)
- a.load(elemObj+1, ch, 0, a.sizeof(tElem))
- if a.addLabel(c.result, elemObj) {
- changed = true
- }
- }
- if changed {
- a.addWork(c.result)
- }
-}
-
-func ext۰reflect۰Value۰Recv(a *analysis, cgn *cgnode) {
- a.addConstraint(&rVRecvConstraint{
- cgn: cgn,
- v: a.funcParams(cgn.obj),
- result: a.funcResults(cgn.obj),
- })
-}
-
-// ---------- func (Value).Send(Value) ----------
-
-// v.Send(x)
-type rVSendConstraint struct {
- cgn *cgnode
- v nodeid // (ptr)
- x nodeid
-}
-
-func (c *rVSendConstraint) ptr() nodeid { return c.v }
-func (c *rVSendConstraint) presolve(*hvn) {}
-func (c *rVSendConstraint) renumber(mapping []nodeid) {
- c.v = mapping[c.v]
- c.x = mapping[c.x]
-}
-
-func (c *rVSendConstraint) String() string {
- return fmt.Sprintf("reflect n%d.Send(n%d)", c.v, c.x)
-}
-
-func (c *rVSendConstraint) solve(a *analysis, delta *nodeset) {
- for _, x := range delta.AppendTo(a.deltaSpace) {
- vObj := nodeid(x)
- tDyn, ch, indirect := a.taggedValue(vObj)
- tChan, _ := tDyn.Underlying().(*types.Chan)
- if tChan == nil {
- continue // not a channel
- }
- if indirect {
- // TODO(adonovan): we'll need to implement this
- // when we start creating indirect tagged objects.
- panic("indirect tagged object")
- }
-
- // Extract x's payload to xtmp, then store to channel.
- tElem := tChan.Elem()
- xtmp := a.addNodes(tElem, "Send.xtmp")
- a.typeAssert(tElem, xtmp, c.x, false)
- a.store(ch, xtmp, 0, a.sizeof(tElem))
- }
-}
-
-func ext۰reflect۰Value۰Send(a *analysis, cgn *cgnode) {
- params := a.funcParams(cgn.obj)
- a.addConstraint(&rVSendConstraint{
- cgn: cgn,
- v: params,
- x: params + 1,
- })
-}
-
-func ext۰reflect۰Value۰Set(a *analysis, cgn *cgnode) {} // TODO(adonovan)
-
-// ---------- func (Value).SetBytes(x []byte) ----------
-
-// v.SetBytes(x)
-type rVSetBytesConstraint struct {
- cgn *cgnode
- v nodeid // (ptr)
- x nodeid
-}
-
-func (c *rVSetBytesConstraint) ptr() nodeid { return c.v }
-func (c *rVSetBytesConstraint) presolve(*hvn) {}
-func (c *rVSetBytesConstraint) renumber(mapping []nodeid) {
- c.v = mapping[c.v]
- c.x = mapping[c.x]
-}
-
-func (c *rVSetBytesConstraint) String() string {
- return fmt.Sprintf("reflect n%d.SetBytes(n%d)", c.v, c.x)
-}
-
-func (c *rVSetBytesConstraint) solve(a *analysis, delta *nodeset) {
- for _, x := range delta.AppendTo(a.deltaSpace) {
- vObj := nodeid(x)
- tDyn, slice, indirect := a.taggedValue(vObj)
- if indirect {
- // TODO(adonovan): we'll need to implement this
- // when we start creating indirect tagged objects.
- panic("indirect tagged object")
- }
-
- tSlice, ok := tDyn.Underlying().(*types.Slice)
- if ok && types.Identical(tSlice.Elem(), types.Typ[types.Uint8]) {
- if a.onlineCopy(slice, c.x) {
- a.addWork(slice)
- }
- }
- }
-}
-
-func ext۰reflect۰Value۰SetBytes(a *analysis, cgn *cgnode) {
- params := a.funcParams(cgn.obj)
- a.addConstraint(&rVSetBytesConstraint{
- cgn: cgn,
- v: params,
- x: params + 1,
- })
-}
-
-// ---------- func (Value).SetMapIndex(k Value, v Value) ----------
-
-// v.SetMapIndex(key, val)
-type rVSetMapIndexConstraint struct {
- cgn *cgnode
- v nodeid // (ptr)
- key nodeid
- val nodeid
-}
-
-func (c *rVSetMapIndexConstraint) ptr() nodeid { return c.v }
-func (c *rVSetMapIndexConstraint) presolve(*hvn) {}
-func (c *rVSetMapIndexConstraint) renumber(mapping []nodeid) {
- c.v = mapping[c.v]
- c.key = mapping[c.key]
- c.val = mapping[c.val]
-}
-
-func (c *rVSetMapIndexConstraint) String() string {
- return fmt.Sprintf("reflect n%d.SetMapIndex(n%d, n%d)", c.v, c.key, c.val)
-}
-
-func (c *rVSetMapIndexConstraint) solve(a *analysis, delta *nodeset) {
- for _, x := range delta.AppendTo(a.deltaSpace) {
- vObj := nodeid(x)
- tDyn, m, indirect := a.taggedValue(vObj)
- tMap, _ := tDyn.Underlying().(*types.Map)
- if tMap == nil {
- continue // not a map
- }
- if indirect {
- // TODO(adonovan): we'll need to implement this
- // when we start creating indirect tagged objects.
- panic("indirect tagged object")
- }
-
- keysize := a.sizeof(tMap.Key())
-
- // Extract key's payload to keytmp, then store to map key.
- keytmp := a.addNodes(tMap.Key(), "SetMapIndex.keytmp")
- a.typeAssert(tMap.Key(), keytmp, c.key, false)
- a.store(m, keytmp, 0, keysize)
-
- // Extract val's payload to vtmp, then store to map value.
- valtmp := a.addNodes(tMap.Elem(), "SetMapIndex.valtmp")
- a.typeAssert(tMap.Elem(), valtmp, c.val, false)
- a.store(m, valtmp, keysize, a.sizeof(tMap.Elem()))
- }
-}
-
-func ext۰reflect۰Value۰SetMapIndex(a *analysis, cgn *cgnode) {
- params := a.funcParams(cgn.obj)
- a.addConstraint(&rVSetMapIndexConstraint{
- cgn: cgn,
- v: params,
- key: params + 1,
- val: params + 2,
- })
-}
-
-func ext۰reflect۰Value۰SetPointer(a *analysis, cgn *cgnode) {} // TODO(adonovan)
-
-// ---------- func (Value).Slice(v Value, i, j int) Value ----------
-
-// result = v.Slice(_, _)
-type rVSliceConstraint struct {
- cgn *cgnode
- v nodeid // (ptr)
- result nodeid // (indirect)
-}
-
-func (c *rVSliceConstraint) ptr() nodeid { return c.v }
-func (c *rVSliceConstraint) presolve(h *hvn) {
- h.markIndirect(onodeid(c.result), "rVSlice.result")
-}
-func (c *rVSliceConstraint) renumber(mapping []nodeid) {
- c.v = mapping[c.v]
- c.result = mapping[c.result]
-}
-
-func (c *rVSliceConstraint) String() string {
- return fmt.Sprintf("n%d = reflect n%d.Slice(_, _)", c.result, c.v)
-}
-
-func (c *rVSliceConstraint) solve(a *analysis, delta *nodeset) {
- changed := false
- for _, x := range delta.AppendTo(a.deltaSpace) {
- vObj := nodeid(x)
- tDyn, payload, indirect := a.taggedValue(vObj)
- if indirect {
- // TODO(adonovan): we'll need to implement this
- // when we start creating indirect tagged objects.
- panic("indirect tagged object")
- }
-
- var res nodeid
- switch t := tDyn.Underlying().(type) {
- case *types.Pointer:
- if tArr, ok := t.Elem().Underlying().(*types.Array); ok {
- // pointer to array
- res = a.makeTagged(types.NewSlice(tArr.Elem()), c.cgn, nil)
- if a.onlineCopy(res+1, payload) {
- a.addWork(res + 1)
- }
- }
-
- case *types.Array:
- // TODO(adonovan): implement addressable
- // arrays when we do indirect tagged objects.
-
- case *types.Slice:
- res = vObj
-
- case *types.Basic:
- if t == types.Typ[types.String] {
- res = vObj
- }
- }
-
- if res != 0 && a.addLabel(c.result, res) {
- changed = true
- }
- }
- if changed {
- a.addWork(c.result)
- }
-}
-
-func ext۰reflect۰Value۰Slice(a *analysis, cgn *cgnode) {
- a.addConstraint(&rVSliceConstraint{
- cgn: cgn,
- v: a.funcParams(cgn.obj),
- result: a.funcResults(cgn.obj),
- })
-}
-
-// -------------------- Standalone reflect functions --------------------
-
-func ext۰reflect۰Append(a *analysis, cgn *cgnode) {} // TODO(adonovan)
-func ext۰reflect۰AppendSlice(a *analysis, cgn *cgnode) {} // TODO(adonovan)
-func ext۰reflect۰Copy(a *analysis, cgn *cgnode) {} // TODO(adonovan)
-
-// ---------- func ChanOf(ChanDir, Type) Type ----------
-
-// result = ChanOf(dir, t)
-type reflectChanOfConstraint struct {
- cgn *cgnode
- t nodeid // (ptr)
- result nodeid // (indirect)
- dirs []types.ChanDir
-}
-
-func (c *reflectChanOfConstraint) ptr() nodeid { return c.t }
-func (c *reflectChanOfConstraint) presolve(h *hvn) {
- h.markIndirect(onodeid(c.result), "reflectChanOf.result")
-}
-func (c *reflectChanOfConstraint) renumber(mapping []nodeid) {
- c.t = mapping[c.t]
- c.result = mapping[c.result]
-}
-
-func (c *reflectChanOfConstraint) String() string {
- return fmt.Sprintf("n%d = reflect.ChanOf(n%d)", c.result, c.t)
-}
-
-func (c *reflectChanOfConstraint) solve(a *analysis, delta *nodeset) {
- changed := false
- for _, x := range delta.AppendTo(a.deltaSpace) {
- tObj := nodeid(x)
- T := a.rtypeTaggedValue(tObj)
-
- if typeTooHigh(T) {
- continue
- }
-
- for _, dir := range c.dirs {
- if a.addLabel(c.result, a.makeRtype(types.NewChan(dir, T))) {
- changed = true
- }
- }
- }
- if changed {
- a.addWork(c.result)
- }
-}
-
-// dirMap maps reflect.ChanDir to the set of channel types generated by ChanOf.
-var dirMap = [...][]types.ChanDir{
- 0: {types.SendOnly, types.RecvOnly, types.SendRecv}, // unknown
- reflect.RecvDir: {types.RecvOnly},
- reflect.SendDir: {types.SendOnly},
- reflect.BothDir: {types.SendRecv},
-}
-
-func ext۰reflect۰ChanOf(a *analysis, cgn *cgnode) {
- // If we have access to the callsite,
- // and the channel argument is a constant (as is usual),
- // only generate the requested direction.
- var dir reflect.ChanDir // unknown
- if site := cgn.callersite; site != nil {
- if c, ok := site.instr.Common().Args[0].(*ssa.Const); ok {
- v, _ := exact.Int64Val(c.Value)
- if 0 <= v && v <= int64(reflect.BothDir) {
- dir = reflect.ChanDir(v)
- }
- }
- }
-
- params := a.funcParams(cgn.obj)
- a.addConstraint(&reflectChanOfConstraint{
- cgn: cgn,
- t: params + 1,
- result: a.funcResults(cgn.obj),
- dirs: dirMap[dir],
- })
-}
-
-// ---------- func Indirect(v Value) Value ----------
-
-// result = Indirect(v)
-type reflectIndirectConstraint struct {
- cgn *cgnode
- v nodeid // (ptr)
- result nodeid // (indirect)
-}
-
-func (c *reflectIndirectConstraint) ptr() nodeid { return c.v }
-func (c *reflectIndirectConstraint) presolve(h *hvn) {
- h.markIndirect(onodeid(c.result), "reflectIndirect.result")
-}
-func (c *reflectIndirectConstraint) renumber(mapping []nodeid) {
- c.v = mapping[c.v]
- c.result = mapping[c.result]
-}
-
-func (c *reflectIndirectConstraint) String() string {
- return fmt.Sprintf("n%d = reflect.Indirect(n%d)", c.result, c.v)
-}
-
-func (c *reflectIndirectConstraint) solve(a *analysis, delta *nodeset) {
- changed := false
- for _, x := range delta.AppendTo(a.deltaSpace) {
- vObj := nodeid(x)
- tDyn, _, _ := a.taggedValue(vObj)
- var res nodeid
- if tPtr, ok := tDyn.Underlying().(*types.Pointer); ok {
- // load the payload of the pointer's tagged object
- // into a new tagged object
- res = a.makeTagged(tPtr.Elem(), c.cgn, nil)
- a.load(res+1, vObj+1, 0, a.sizeof(tPtr.Elem()))
- } else {
- res = vObj
- }
-
- if a.addLabel(c.result, res) {
- changed = true
- }
- }
- if changed {
- a.addWork(c.result)
- }
-}
-
-func ext۰reflect۰Indirect(a *analysis, cgn *cgnode) {
- a.addConstraint(&reflectIndirectConstraint{
- cgn: cgn,
- v: a.funcParams(cgn.obj),
- result: a.funcResults(cgn.obj),
- })
-}
-
-// ---------- func MakeChan(Type) Value ----------
-
-// result = MakeChan(typ)
-type reflectMakeChanConstraint struct {
- cgn *cgnode
- typ nodeid // (ptr)
- result nodeid // (indirect)
-}
-
-func (c *reflectMakeChanConstraint) ptr() nodeid { return c.typ }
-func (c *reflectMakeChanConstraint) presolve(h *hvn) {
- h.markIndirect(onodeid(c.result), "reflectMakeChan.result")
-}
-func (c *reflectMakeChanConstraint) renumber(mapping []nodeid) {
- c.typ = mapping[c.typ]
- c.result = mapping[c.result]
-}
-
-func (c *reflectMakeChanConstraint) String() string {
- return fmt.Sprintf("n%d = reflect.MakeChan(n%d)", c.result, c.typ)
-}
-
-func (c *reflectMakeChanConstraint) solve(a *analysis, delta *nodeset) {
- changed := false
- for _, x := range delta.AppendTo(a.deltaSpace) {
- typObj := nodeid(x)
- T := a.rtypeTaggedValue(typObj)
- tChan, ok := T.Underlying().(*types.Chan)
- if !ok || tChan.Dir() != types.SendRecv {
- continue // not a bidirectional channel type
- }
-
- obj := a.nextNode()
- a.addNodes(tChan.Elem(), "reflect.MakeChan.value")
- a.endObject(obj, c.cgn, nil)
-
- // put its address in a new T-tagged object
- id := a.makeTagged(T, c.cgn, nil)
- a.addLabel(id+1, obj)
-
- // flow the T-tagged object to the result
- if a.addLabel(c.result, id) {
- changed = true
- }
- }
- if changed {
- a.addWork(c.result)
- }
-}
-
-func ext۰reflect۰MakeChan(a *analysis, cgn *cgnode) {
- a.addConstraint(&reflectMakeChanConstraint{
- cgn: cgn,
- typ: a.funcParams(cgn.obj),
- result: a.funcResults(cgn.obj),
- })
-}
-
-func ext۰reflect۰MakeFunc(a *analysis, cgn *cgnode) {} // TODO(adonovan)
-
-// ---------- func MakeMap(Type) Value ----------
-
-// result = MakeMap(typ)
-type reflectMakeMapConstraint struct {
- cgn *cgnode
- typ nodeid // (ptr)
- result nodeid // (indirect)
-}
-
-func (c *reflectMakeMapConstraint) ptr() nodeid { return c.typ }
-func (c *reflectMakeMapConstraint) presolve(h *hvn) {
- h.markIndirect(onodeid(c.result), "reflectMakeMap.result")
-}
-func (c *reflectMakeMapConstraint) renumber(mapping []nodeid) {
- c.typ = mapping[c.typ]
- c.result = mapping[c.result]
-}
-
-func (c *reflectMakeMapConstraint) String() string {
- return fmt.Sprintf("n%d = reflect.MakeMap(n%d)", c.result, c.typ)
-}
-
-func (c *reflectMakeMapConstraint) solve(a *analysis, delta *nodeset) {
- changed := false
- for _, x := range delta.AppendTo(a.deltaSpace) {
- typObj := nodeid(x)
- T := a.rtypeTaggedValue(typObj)
- tMap, ok := T.Underlying().(*types.Map)
- if !ok {
- continue // not a map type
- }
-
- mapObj := a.nextNode()
- a.addNodes(tMap.Key(), "reflect.MakeMap.key")
- a.addNodes(tMap.Elem(), "reflect.MakeMap.value")
- a.endObject(mapObj, c.cgn, nil)
-
- // put its address in a new T-tagged object
- id := a.makeTagged(T, c.cgn, nil)
- a.addLabel(id+1, mapObj)
-
- // flow the T-tagged object to the result
- if a.addLabel(c.result, id) {
- changed = true
- }
- }
- if changed {
- a.addWork(c.result)
- }
-}
-
-func ext۰reflect۰MakeMap(a *analysis, cgn *cgnode) {
- a.addConstraint(&reflectMakeMapConstraint{
- cgn: cgn,
- typ: a.funcParams(cgn.obj),
- result: a.funcResults(cgn.obj),
- })
-}
-
-// ---------- func MakeSlice(Type) Value ----------
-
-// result = MakeSlice(typ)
-type reflectMakeSliceConstraint struct {
- cgn *cgnode
- typ nodeid // (ptr)
- result nodeid // (indirect)
-}
-
-func (c *reflectMakeSliceConstraint) ptr() nodeid { return c.typ }
-func (c *reflectMakeSliceConstraint) presolve(h *hvn) {
- h.markIndirect(onodeid(c.result), "reflectMakeSlice.result")
-}
-func (c *reflectMakeSliceConstraint) renumber(mapping []nodeid) {
- c.typ = mapping[c.typ]
- c.result = mapping[c.result]
-}
-
-func (c *reflectMakeSliceConstraint) String() string {
- return fmt.Sprintf("n%d = reflect.MakeSlice(n%d)", c.result, c.typ)
-}
-
-func (c *reflectMakeSliceConstraint) solve(a *analysis, delta *nodeset) {
- changed := false
- for _, x := range delta.AppendTo(a.deltaSpace) {
- typObj := nodeid(x)
- T := a.rtypeTaggedValue(typObj)
- if _, ok := T.Underlying().(*types.Slice); !ok {
- continue // not a slice type
- }
-
- obj := a.nextNode()
- a.addNodes(sliceToArray(T), "reflect.MakeSlice")
- a.endObject(obj, c.cgn, nil)
-
- // put its address in a new T-tagged object
- id := a.makeTagged(T, c.cgn, nil)
- a.addLabel(id+1, obj)
-
- // flow the T-tagged object to the result
- if a.addLabel(c.result, id) {
- changed = true
- }
- }
- if changed {
- a.addWork(c.result)
- }
-}
-
-func ext۰reflect۰MakeSlice(a *analysis, cgn *cgnode) {
- a.addConstraint(&reflectMakeSliceConstraint{
- cgn: cgn,
- typ: a.funcParams(cgn.obj),
- result: a.funcResults(cgn.obj),
- })
-}
-
-func ext۰reflect۰MapOf(a *analysis, cgn *cgnode) {} // TODO(adonovan)
-
-// ---------- func New(Type) Value ----------
-
-// result = New(typ)
-type reflectNewConstraint struct {
- cgn *cgnode
- typ nodeid // (ptr)
- result nodeid // (indirect)
-}
-
-func (c *reflectNewConstraint) ptr() nodeid { return c.typ }
-func (c *reflectNewConstraint) presolve(h *hvn) {
- h.markIndirect(onodeid(c.result), "reflectNew.result")
-}
-func (c *reflectNewConstraint) renumber(mapping []nodeid) {
- c.typ = mapping[c.typ]
- c.result = mapping[c.result]
-}
-
-func (c *reflectNewConstraint) String() string {
- return fmt.Sprintf("n%d = reflect.New(n%d)", c.result, c.typ)
-}
-
-func (c *reflectNewConstraint) solve(a *analysis, delta *nodeset) {
- changed := false
- for _, x := range delta.AppendTo(a.deltaSpace) {
- typObj := nodeid(x)
- T := a.rtypeTaggedValue(typObj)
-
- // allocate new T object
- newObj := a.nextNode()
- a.addNodes(T, "reflect.New")
- a.endObject(newObj, c.cgn, nil)
-
- // put its address in a new *T-tagged object
- id := a.makeTagged(types.NewPointer(T), c.cgn, nil)
- a.addLabel(id+1, newObj)
-
- // flow the pointer to the result
- if a.addLabel(c.result, id) {
- changed = true
- }
- }
- if changed {
- a.addWork(c.result)
- }
-}
-
-func ext۰reflect۰New(a *analysis, cgn *cgnode) {
- a.addConstraint(&reflectNewConstraint{
- cgn: cgn,
- typ: a.funcParams(cgn.obj),
- result: a.funcResults(cgn.obj),
- })
-}
-
-func ext۰reflect۰NewAt(a *analysis, cgn *cgnode) {
- ext۰reflect۰New(a, cgn)
-
- // TODO(adonovan): also report dynamic calls to unsound intrinsics.
- if site := cgn.callersite; site != nil {
- a.warnf(site.pos(), "unsound: %s contains a reflect.NewAt() call", site.instr.Parent())
- }
-}
-
-// ---------- func PtrTo(Type) Type ----------
-
-// result = PtrTo(t)
-type reflectPtrToConstraint struct {
- cgn *cgnode
- t nodeid // (ptr)
- result nodeid // (indirect)
-}
-
-func (c *reflectPtrToConstraint) ptr() nodeid { return c.t }
-func (c *reflectPtrToConstraint) presolve(h *hvn) {
- h.markIndirect(onodeid(c.result), "reflectPtrTo.result")
-}
-func (c *reflectPtrToConstraint) renumber(mapping []nodeid) {
- c.t = mapping[c.t]
- c.result = mapping[c.result]
-}
-
-func (c *reflectPtrToConstraint) String() string {
- return fmt.Sprintf("n%d = reflect.PtrTo(n%d)", c.result, c.t)
-}
-
-func (c *reflectPtrToConstraint) solve(a *analysis, delta *nodeset) {
- changed := false
- for _, x := range delta.AppendTo(a.deltaSpace) {
- tObj := nodeid(x)
- T := a.rtypeTaggedValue(tObj)
-
- if typeTooHigh(T) {
- continue
- }
-
- if a.addLabel(c.result, a.makeRtype(types.NewPointer(T))) {
- changed = true
- }
- }
- if changed {
- a.addWork(c.result)
- }
-}
-
-func ext۰reflect۰PtrTo(a *analysis, cgn *cgnode) {
- a.addConstraint(&reflectPtrToConstraint{
- cgn: cgn,
- t: a.funcParams(cgn.obj),
- result: a.funcResults(cgn.obj),
- })
-}
-
-func ext۰reflect۰Select(a *analysis, cgn *cgnode) {} // TODO(adonovan)
-
-// ---------- func SliceOf(Type) Type ----------
-
-// result = SliceOf(t)
-type reflectSliceOfConstraint struct {
- cgn *cgnode
- t nodeid // (ptr)
- result nodeid // (indirect)
-}
-
-func (c *reflectSliceOfConstraint) ptr() nodeid { return c.t }
-func (c *reflectSliceOfConstraint) presolve(h *hvn) {
- h.markIndirect(onodeid(c.result), "reflectSliceOf.result")
-}
-func (c *reflectSliceOfConstraint) renumber(mapping []nodeid) {
- c.t = mapping[c.t]
- c.result = mapping[c.result]
-}
-
-func (c *reflectSliceOfConstraint) String() string {
- return fmt.Sprintf("n%d = reflect.SliceOf(n%d)", c.result, c.t)
-}
-
-func (c *reflectSliceOfConstraint) solve(a *analysis, delta *nodeset) {
- changed := false
- for _, x := range delta.AppendTo(a.deltaSpace) {
- tObj := nodeid(x)
- T := a.rtypeTaggedValue(tObj)
-
- if typeTooHigh(T) {
- continue
- }
-
- if a.addLabel(c.result, a.makeRtype(types.NewSlice(T))) {
- changed = true
- }
- }
- if changed {
- a.addWork(c.result)
- }
-}
-
-func ext۰reflect۰SliceOf(a *analysis, cgn *cgnode) {
- a.addConstraint(&reflectSliceOfConstraint{
- cgn: cgn,
- t: a.funcParams(cgn.obj),
- result: a.funcResults(cgn.obj),
- })
-}
-
-// ---------- func TypeOf(v Value) Type ----------
-
-// result = TypeOf(i)
-type reflectTypeOfConstraint struct {
- cgn *cgnode
- i nodeid // (ptr)
- result nodeid // (indirect)
-}
-
-func (c *reflectTypeOfConstraint) ptr() nodeid { return c.i }
-func (c *reflectTypeOfConstraint) presolve(h *hvn) {
- h.markIndirect(onodeid(c.result), "reflectTypeOf.result")
-}
-func (c *reflectTypeOfConstraint) renumber(mapping []nodeid) {
- c.i = mapping[c.i]
- c.result = mapping[c.result]
-}
-
-func (c *reflectTypeOfConstraint) String() string {
- return fmt.Sprintf("n%d = reflect.TypeOf(n%d)", c.result, c.i)
-}
-
-func (c *reflectTypeOfConstraint) solve(a *analysis, delta *nodeset) {
- changed := false
- for _, x := range delta.AppendTo(a.deltaSpace) {
- iObj := nodeid(x)
- tDyn, _, _ := a.taggedValue(iObj)
- if a.addLabel(c.result, a.makeRtype(tDyn)) {
- changed = true
- }
- }
- if changed {
- a.addWork(c.result)
- }
-}
-
-func ext۰reflect۰TypeOf(a *analysis, cgn *cgnode) {
- a.addConstraint(&reflectTypeOfConstraint{
- cgn: cgn,
- i: a.funcParams(cgn.obj),
- result: a.funcResults(cgn.obj),
- })
-}
-
-// ---------- func ValueOf(interface{}) Value ----------
-
-func ext۰reflect۰ValueOf(a *analysis, cgn *cgnode) {
- // TODO(adonovan): when we start creating indirect tagged
- // objects, we'll need to handle them specially here since
- // they must never appear in the PTS of an interface{}.
- a.copy(a.funcResults(cgn.obj), a.funcParams(cgn.obj), 1)
-}
-
-// ---------- func Zero(Type) Value ----------
-
-// result = Zero(typ)
-type reflectZeroConstraint struct {
- cgn *cgnode
- typ nodeid // (ptr)
- result nodeid // (indirect)
-}
-
-func (c *reflectZeroConstraint) ptr() nodeid { return c.typ }
-func (c *reflectZeroConstraint) presolve(h *hvn) {
- h.markIndirect(onodeid(c.result), "reflectZero.result")
-}
-func (c *reflectZeroConstraint) renumber(mapping []nodeid) {
- c.typ = mapping[c.typ]
- c.result = mapping[c.result]
-}
-
-func (c *reflectZeroConstraint) String() string {
- return fmt.Sprintf("n%d = reflect.Zero(n%d)", c.result, c.typ)
-}
-
-func (c *reflectZeroConstraint) solve(a *analysis, delta *nodeset) {
- changed := false
- for _, x := range delta.AppendTo(a.deltaSpace) {
- typObj := nodeid(x)
- T := a.rtypeTaggedValue(typObj)
-
- // TODO(adonovan): if T is an interface type, we need
- // to create an indirect tagged object containing
- // new(T). To avoid updates of such shared values,
- // we'll need another flag on indirect tagged objects
- // that marks whether they are addressable or
- // readonly, just like the reflect package does.
-
- // memoize using a.reflectZeros[T]
- var id nodeid
- if z := a.reflectZeros.At(T); false && z != nil {
- id = z.(nodeid)
- } else {
- id = a.makeTagged(T, c.cgn, nil)
- a.reflectZeros.Set(T, id)
- }
- if a.addLabel(c.result, id) {
- changed = true
- }
- }
- if changed {
- a.addWork(c.result)
- }
-}
-
-func ext۰reflect۰Zero(a *analysis, cgn *cgnode) {
- a.addConstraint(&reflectZeroConstraint{
- cgn: cgn,
- typ: a.funcParams(cgn.obj),
- result: a.funcResults(cgn.obj),
- })
-}
-
-// -------------------- (*reflect.rtype) methods --------------------
-
-// ---------- func (*rtype) Elem() Type ----------
-
-// result = Elem(t)
-type rtypeElemConstraint struct {
- cgn *cgnode
- t nodeid // (ptr)
- result nodeid // (indirect)
-}
-
-func (c *rtypeElemConstraint) ptr() nodeid { return c.t }
-func (c *rtypeElemConstraint) presolve(h *hvn) {
- h.markIndirect(onodeid(c.result), "rtypeElem.result")
-}
-func (c *rtypeElemConstraint) renumber(mapping []nodeid) {
- c.t = mapping[c.t]
- c.result = mapping[c.result]
-}
-
-func (c *rtypeElemConstraint) String() string {
- return fmt.Sprintf("n%d = (*reflect.rtype).Elem(n%d)", c.result, c.t)
-}
-
-func (c *rtypeElemConstraint) solve(a *analysis, delta *nodeset) {
- // Implemented by *types.{Map,Chan,Array,Slice,Pointer}.
- type hasElem interface {
- Elem() types.Type
- }
- changed := false
- for _, x := range delta.AppendTo(a.deltaSpace) {
- tObj := nodeid(x)
- T := a.nodes[tObj].obj.data.(types.Type)
- if tHasElem, ok := T.Underlying().(hasElem); ok {
- if a.addLabel(c.result, a.makeRtype(tHasElem.Elem())) {
- changed = true
- }
- }
- }
- if changed {
- a.addWork(c.result)
- }
-}
-
-func ext۰reflect۰rtype۰Elem(a *analysis, cgn *cgnode) {
- a.addConstraint(&rtypeElemConstraint{
- cgn: cgn,
- t: a.funcParams(cgn.obj),
- result: a.funcResults(cgn.obj),
- })
-}
-
-// ---------- func (*rtype) Field(int) StructField ----------
-// ---------- func (*rtype) FieldByName(string) (StructField, bool) ----------
-
-// result = FieldByName(t, name)
-// result = Field(t, _)
-type rtypeFieldByNameConstraint struct {
- cgn *cgnode
- name string // name of field; "" for unknown
- t nodeid // (ptr)
- result nodeid // (indirect)
-}
-
-func (c *rtypeFieldByNameConstraint) ptr() nodeid { return c.t }
-func (c *rtypeFieldByNameConstraint) presolve(h *hvn) {
- h.markIndirect(onodeid(c.result+3), "rtypeFieldByName.result.Type")
-}
-func (c *rtypeFieldByNameConstraint) renumber(mapping []nodeid) {
- c.t = mapping[c.t]
- c.result = mapping[c.result]
-}
-
-func (c *rtypeFieldByNameConstraint) String() string {
- return fmt.Sprintf("n%d = (*reflect.rtype).FieldByName(n%d, %q)", c.result, c.t, c.name)
-}
-
-func (c *rtypeFieldByNameConstraint) solve(a *analysis, delta *nodeset) {
- // type StructField struct {
- // 0 __identity__
- // 1 Name string
- // 2 PkgPath string
- // 3 Type Type
- // 4 Tag StructTag
- // 5 Offset uintptr
- // 6 Index []int
- // 7 Anonymous bool
- // }
-
- for _, x := range delta.AppendTo(a.deltaSpace) {
- tObj := nodeid(x)
- T := a.nodes[tObj].obj.data.(types.Type)
- tStruct, ok := T.Underlying().(*types.Struct)
- if !ok {
- continue // not a struct type
- }
-
- n := tStruct.NumFields()
- for i := 0; i < n; i++ {
- f := tStruct.Field(i)
- if c.name == "" || c.name == f.Name() {
-
- // a.offsetOf(Type) is 3.
- if id := c.result + 3; a.addLabel(id, a.makeRtype(f.Type())) {
- a.addWork(id)
- }
- // TODO(adonovan): StructField.Index should be non-nil.
- }
- }
- }
-}
-
-func ext۰reflect۰rtype۰FieldByName(a *analysis, cgn *cgnode) {
- // If we have access to the callsite,
- // and the argument is a string constant,
- // return only that field.
- var name string
- if site := cgn.callersite; site != nil {
- if c, ok := site.instr.Common().Args[0].(*ssa.Const); ok {
- name = exact.StringVal(c.Value)
- }
- }
-
- a.addConstraint(&rtypeFieldByNameConstraint{
- cgn: cgn,
- name: name,
- t: a.funcParams(cgn.obj),
- result: a.funcResults(cgn.obj),
- })
-}
-
-func ext۰reflect۰rtype۰Field(a *analysis, cgn *cgnode) {
- // No-one ever calls Field with a constant argument,
- // so we don't specialize that case.
- a.addConstraint(&rtypeFieldByNameConstraint{
- cgn: cgn,
- t: a.funcParams(cgn.obj),
- result: a.funcResults(cgn.obj),
- })
-}
-
-func ext۰reflect۰rtype۰FieldByIndex(a *analysis, cgn *cgnode) {} // TODO(adonovan)
-func ext۰reflect۰rtype۰FieldByNameFunc(a *analysis, cgn *cgnode) {} // TODO(adonovan)
-
-// ---------- func (*rtype) In/Out(i int) Type ----------
-
-// result = In/Out(t, i)
-type rtypeInOutConstraint struct {
- cgn *cgnode
- t nodeid // (ptr)
- result nodeid // (indirect)
- out bool
- i int // -ve if not a constant
-}
-
-func (c *rtypeInOutConstraint) ptr() nodeid { return c.t }
-func (c *rtypeInOutConstraint) presolve(h *hvn) {
- h.markIndirect(onodeid(c.result), "rtypeInOut.result")
-}
-func (c *rtypeInOutConstraint) renumber(mapping []nodeid) {
- c.t = mapping[c.t]
- c.result = mapping[c.result]
-}
-
-func (c *rtypeInOutConstraint) String() string {
- return fmt.Sprintf("n%d = (*reflect.rtype).InOut(n%d, %d)", c.result, c.t, c.i)
-}
-
-func (c *rtypeInOutConstraint) solve(a *analysis, delta *nodeset) {
- changed := false
- for _, x := range delta.AppendTo(a.deltaSpace) {
- tObj := nodeid(x)
- T := a.nodes[tObj].obj.data.(types.Type)
- sig, ok := T.Underlying().(*types.Signature)
- if !ok {
- continue // not a func type
- }
-
- tuple := sig.Params()
- if c.out {
- tuple = sig.Results()
- }
- for i, n := 0, tuple.Len(); i < n; i++ {
- if c.i < 0 || c.i == i {
- if a.addLabel(c.result, a.makeRtype(tuple.At(i).Type())) {
- changed = true
- }
- }
- }
- }
- if changed {
- a.addWork(c.result)
- }
-}
-
-func ext۰reflect۰rtype۰InOut(a *analysis, cgn *cgnode, out bool) {
- // If we have access to the callsite,
- // and the argument is an int constant,
- // return only that parameter.
- index := -1
- if site := cgn.callersite; site != nil {
- if c, ok := site.instr.Common().Args[0].(*ssa.Const); ok {
- v, _ := exact.Int64Val(c.Value)
- index = int(v)
- }
- }
- a.addConstraint(&rtypeInOutConstraint{
- cgn: cgn,
- t: a.funcParams(cgn.obj),
- result: a.funcResults(cgn.obj),
- out: out,
- i: index,
- })
-}
-
-func ext۰reflect۰rtype۰In(a *analysis, cgn *cgnode) {
- ext۰reflect۰rtype۰InOut(a, cgn, false)
-}
-
-func ext۰reflect۰rtype۰Out(a *analysis, cgn *cgnode) {
- ext۰reflect۰rtype۰InOut(a, cgn, true)
-}
-
-// ---------- func (*rtype) Key() Type ----------
-
-// result = Key(t)
-type rtypeKeyConstraint struct {
- cgn *cgnode
- t nodeid // (ptr)
- result nodeid // (indirect)
-}
-
-func (c *rtypeKeyConstraint) ptr() nodeid { return c.t }
-func (c *rtypeKeyConstraint) presolve(h *hvn) {
- h.markIndirect(onodeid(c.result), "rtypeKey.result")
-}
-func (c *rtypeKeyConstraint) renumber(mapping []nodeid) {
- c.t = mapping[c.t]
- c.result = mapping[c.result]
-}
-
-func (c *rtypeKeyConstraint) String() string {
- return fmt.Sprintf("n%d = (*reflect.rtype).Key(n%d)", c.result, c.t)
-}
-
-func (c *rtypeKeyConstraint) solve(a *analysis, delta *nodeset) {
- changed := false
- for _, x := range delta.AppendTo(a.deltaSpace) {
- tObj := nodeid(x)
- T := a.nodes[tObj].obj.data.(types.Type)
- if tMap, ok := T.Underlying().(*types.Map); ok {
- if a.addLabel(c.result, a.makeRtype(tMap.Key())) {
- changed = true
- }
- }
- }
- if changed {
- a.addWork(c.result)
- }
-}
-
-func ext۰reflect۰rtype۰Key(a *analysis, cgn *cgnode) {
- a.addConstraint(&rtypeKeyConstraint{
- cgn: cgn,
- t: a.funcParams(cgn.obj),
- result: a.funcResults(cgn.obj),
- })
-}
-
-// ---------- func (*rtype) Method(int) (Method, bool) ----------
-// ---------- func (*rtype) MethodByName(string) (Method, bool) ----------
-
-// result = MethodByName(t, name)
-// result = Method(t, _)
-type rtypeMethodByNameConstraint struct {
- cgn *cgnode
- name string // name of method; "" for unknown
- t nodeid // (ptr)
- result nodeid // (indirect)
-}
-
-func (c *rtypeMethodByNameConstraint) ptr() nodeid { return c.t }
-func (c *rtypeMethodByNameConstraint) presolve(h *hvn) {
- h.markIndirect(onodeid(c.result+3), "rtypeMethodByName.result.Type")
- h.markIndirect(onodeid(c.result+4), "rtypeMethodByName.result.Func")
-}
-func (c *rtypeMethodByNameConstraint) renumber(mapping []nodeid) {
- c.t = mapping[c.t]
- c.result = mapping[c.result]
-}
-
-func (c *rtypeMethodByNameConstraint) String() string {
- return fmt.Sprintf("n%d = (*reflect.rtype).MethodByName(n%d, %q)", c.result, c.t, c.name)
-}
-
-// changeRecv returns sig with Recv prepended to Params().
-func changeRecv(sig *types.Signature) *types.Signature {
- params := sig.Params()
- n := params.Len()
- p2 := make([]*types.Var, n+1)
- p2[0] = sig.Recv()
- for i := 0; i < n; i++ {
- p2[i+1] = params.At(i)
- }
- return types.NewSignature(nil, types.NewTuple(p2...), sig.Results(), sig.Variadic())
-}
-
-func (c *rtypeMethodByNameConstraint) solve(a *analysis, delta *nodeset) {
- for _, x := range delta.AppendTo(a.deltaSpace) {
- tObj := nodeid(x)
- T := a.nodes[tObj].obj.data.(types.Type)
-
- isIface := isInterface(T)
-
- // We don't use Lookup(c.name) when c.name != "" to avoid
- // ambiguity: >1 unexported methods could match.
- mset := a.prog.MethodSets.MethodSet(T)
- for i, n := 0, mset.Len(); i < n; i++ {
- sel := mset.At(i)
- if c.name == "" || c.name == sel.Obj().Name() {
- // type Method struct {
- // 0 __identity__
- // 1 Name string
- // 2 PkgPath string
- // 3 Type Type
- // 4 Func Value
- // 5 Index int
- // }
-
- var sig *types.Signature
- var fn *ssa.Function
- if isIface {
- sig = sel.Type().(*types.Signature)
- } else {
- fn = a.prog.MethodValue(sel)
- // move receiver to params[0]
- sig = changeRecv(fn.Signature)
- }
-
- // a.offsetOf(Type) is 3.
- if id := c.result + 3; a.addLabel(id, a.makeRtype(sig)) {
- a.addWork(id)
- }
- if fn != nil {
- // a.offsetOf(Func) is 4.
- if id := c.result + 4; a.addLabel(id, a.objectNode(nil, fn)) {
- a.addWork(id)
- }
- }
- }
- }
- }
-}
-
-func ext۰reflect۰rtype۰MethodByName(a *analysis, cgn *cgnode) {
- // If we have access to the callsite,
- // and the argument is a string constant,
- // return only that method.
- var name string
- if site := cgn.callersite; site != nil {
- if c, ok := site.instr.Common().Args[0].(*ssa.Const); ok {
- name = exact.StringVal(c.Value)
- }
- }
-
- a.addConstraint(&rtypeMethodByNameConstraint{
- cgn: cgn,
- name: name,
- t: a.funcParams(cgn.obj),
- result: a.funcResults(cgn.obj),
- })
-}
-
-func ext۰reflect۰rtype۰Method(a *analysis, cgn *cgnode) {
- // No-one ever calls Method with a constant argument,
- // so we don't specialize that case.
- a.addConstraint(&rtypeMethodByNameConstraint{
- cgn: cgn,
- t: a.funcParams(cgn.obj),
- result: a.funcResults(cgn.obj),
- })
-}
-
-// typeHeight returns the "height" of the type, which is roughly
-// speaking the number of chan, map, pointer and slice type constructors
-// at the root of T; these are the four type kinds that can be created
-// via reflection. Chan and map constructors are counted as double the
-// height of slice and pointer constructors since they are less often
-// deeply nested.
-//
-// The solver rules for type constructors must somehow bound the set of
-// types they create to ensure termination of the algorithm in cases
-// where the output of a type constructor flows to its input, e.g.
-//
-// func f(t reflect.Type) {
-// f(reflect.PtrTo(t))
-// }
-//
-// It does this by limiting the type height to k, but this still leaves
-// a potentially exponential (4^k) number of of types that may be
-// enumerated in pathological cases.
-//
-func typeHeight(T types.Type) int {
- switch T := T.(type) {
- case *types.Chan:
- return 2 + typeHeight(T.Elem())
- case *types.Map:
- k := typeHeight(T.Key())
- v := typeHeight(T.Elem())
- if v > k {
- k = v // max(k, v)
- }
- return 2 + k
- case *types.Slice:
- return 1 + typeHeight(T.Elem())
- case *types.Pointer:
- return 1 + typeHeight(T.Elem())
- }
- return 0
-}
-
-func typeTooHigh(T types.Type) bool {
- return typeHeight(T) > 3
-}
diff --git a/vendor/golang.org/x/tools/go/pointer/solve.go b/vendor/golang.org/x/tools/go/pointer/solve.go
deleted file mode 100644
index 0fdd098..0000000
--- a/vendor/golang.org/x/tools/go/pointer/solve.go
+++ /dev/null
@@ -1,370 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package pointer
-
-// This file defines a naive Andersen-style solver for the inclusion
-// constraint system.
-
-import (
- "fmt"
- "go/types"
-)
-
-type solverState struct {
- complex []constraint // complex constraints attached to this node
- copyTo nodeset // simple copy constraint edges
- pts nodeset // points-to set of this node
- prevPTS nodeset // pts(n) in previous iteration (for difference propagation)
-}
-
-func (a *analysis) solve() {
- start("Solving")
- if a.log != nil {
- fmt.Fprintf(a.log, "\n\n==== Solving constraints\n\n")
- }
-
- // Solver main loop.
- var delta nodeset
- for {
- // Add new constraints to the graph:
- // static constraints from SSA on round 1,
- // dynamic constraints from reflection thereafter.
- a.processNewConstraints()
-
- var x int
- if !a.work.TakeMin(&x) {
- break // empty
- }
- id := nodeid(x)
- if a.log != nil {
- fmt.Fprintf(a.log, "\tnode n%d\n", id)
- }
-
- n := a.nodes[id]
-
- // Difference propagation.
- delta.Difference(&n.solve.pts.Sparse, &n.solve.prevPTS.Sparse)
- if delta.IsEmpty() {
- continue
- }
- if a.log != nil {
- fmt.Fprintf(a.log, "\t\tpts(n%d : %s) = %s + %s\n",
- id, n.typ, &delta, &n.solve.prevPTS)
- }
- n.solve.prevPTS.Copy(&n.solve.pts.Sparse)
-
- // Apply all resolution rules attached to n.
- a.solveConstraints(n, &delta)
-
- if a.log != nil {
- fmt.Fprintf(a.log, "\t\tpts(n%d) = %s\n", id, &n.solve.pts)
- }
- }
-
- if !a.nodes[0].solve.pts.IsEmpty() {
- panic(fmt.Sprintf("pts(0) is nonempty: %s", &a.nodes[0].solve.pts))
- }
-
- // Release working state (but keep final PTS).
- for _, n := range a.nodes {
- n.solve.complex = nil
- n.solve.copyTo.Clear()
- n.solve.prevPTS.Clear()
- }
-
- if a.log != nil {
- fmt.Fprintf(a.log, "Solver done\n")
-
- // Dump solution.
- for i, n := range a.nodes {
- if !n.solve.pts.IsEmpty() {
- fmt.Fprintf(a.log, "pts(n%d) = %s : %s\n", i, &n.solve.pts, n.typ)
- }
- }
- }
- stop("Solving")
-}
-
-// processNewConstraints takes the new constraints from a.constraints
-// and adds them to the graph, ensuring
-// that new constraints are applied to pre-existing labels and
-// that pre-existing constraints are applied to new labels.
-//
-func (a *analysis) processNewConstraints() {
- // Take the slice of new constraints.
- // (May grow during call to solveConstraints.)
- constraints := a.constraints
- a.constraints = nil
-
- // Initialize points-to sets from addr-of (base) constraints.
- for _, c := range constraints {
- if c, ok := c.(*addrConstraint); ok {
- dst := a.nodes[c.dst]
- dst.solve.pts.add(c.src)
-
- // Populate the worklist with nodes that point to
- // something initially (due to addrConstraints) and
- // have other constraints attached.
- // (A no-op in round 1.)
- if !dst.solve.copyTo.IsEmpty() || len(dst.solve.complex) > 0 {
- a.addWork(c.dst)
- }
- }
- }
-
- // Attach simple (copy) and complex constraints to nodes.
- var stale nodeset
- for _, c := range constraints {
- var id nodeid
- switch c := c.(type) {
- case *addrConstraint:
- // base constraints handled in previous loop
- continue
- case *copyConstraint:
- // simple (copy) constraint
- id = c.src
- a.nodes[id].solve.copyTo.add(c.dst)
- default:
- // complex constraint
- id = c.ptr()
- solve := a.nodes[id].solve
- solve.complex = append(solve.complex, c)
- }
-
- if n := a.nodes[id]; !n.solve.pts.IsEmpty() {
- if !n.solve.prevPTS.IsEmpty() {
- stale.add(id)
- }
- a.addWork(id)
- }
- }
- // Apply new constraints to pre-existing PTS labels.
- var space [50]int
- for _, id := range stale.AppendTo(space[:0]) {
- n := a.nodes[nodeid(id)]
- a.solveConstraints(n, &n.solve.prevPTS)
- }
-}
-
-// solveConstraints applies each resolution rule attached to node n to
-// the set of labels delta. It may generate new constraints in
-// a.constraints.
-//
-func (a *analysis) solveConstraints(n *node, delta *nodeset) {
- if delta.IsEmpty() {
- return
- }
-
- // Process complex constraints dependent on n.
- for _, c := range n.solve.complex {
- if a.log != nil {
- fmt.Fprintf(a.log, "\t\tconstraint %s\n", c)
- }
- c.solve(a, delta)
- }
-
- // Process copy constraints.
- var copySeen nodeset
- for _, x := range n.solve.copyTo.AppendTo(a.deltaSpace) {
- mid := nodeid(x)
- if copySeen.add(mid) {
- if a.nodes[mid].solve.pts.addAll(delta) {
- a.addWork(mid)
- }
- }
- }
-}
-
-// addLabel adds label to the points-to set of ptr and reports whether the set grew.
-func (a *analysis) addLabel(ptr, label nodeid) bool {
- b := a.nodes[ptr].solve.pts.add(label)
- if b && a.log != nil {
- fmt.Fprintf(a.log, "\t\tpts(n%d) += n%d\n", ptr, label)
- }
- return b
-}
-
-func (a *analysis) addWork(id nodeid) {
- a.work.Insert(int(id))
- if a.log != nil {
- fmt.Fprintf(a.log, "\t\twork: n%d\n", id)
- }
-}
-
-// onlineCopy adds a copy edge. It is called online, i.e. during
-// solving, so it adds edges and pts members directly rather than by
-// instantiating a 'constraint'.
-//
-// The size of the copy is implicitly 1.
-// It returns true if pts(dst) changed.
-//
-func (a *analysis) onlineCopy(dst, src nodeid) bool {
- if dst != src {
- if nsrc := a.nodes[src]; nsrc.solve.copyTo.add(dst) {
- if a.log != nil {
- fmt.Fprintf(a.log, "\t\t\tdynamic copy n%d <- n%d\n", dst, src)
- }
- // TODO(adonovan): most calls to onlineCopy
- // are followed by addWork, possibly batched
- // via a 'changed' flag; see if there's a
- // noticeable penalty to calling addWork here.
- return a.nodes[dst].solve.pts.addAll(&nsrc.solve.pts)
- }
- }
- return false
-}
-
-// Returns sizeof.
-// Implicitly adds nodes to worklist.
-//
-// TODO(adonovan): now that we support a.copy() during solving, we
-// could eliminate onlineCopyN, but it's much slower. Investigate.
-//
-func (a *analysis) onlineCopyN(dst, src nodeid, sizeof uint32) uint32 {
- for i := uint32(0); i < sizeof; i++ {
- if a.onlineCopy(dst, src) {
- a.addWork(dst)
- }
- src++
- dst++
- }
- return sizeof
-}
-
-func (c *loadConstraint) solve(a *analysis, delta *nodeset) {
- var changed bool
- for _, x := range delta.AppendTo(a.deltaSpace) {
- k := nodeid(x)
- koff := k + nodeid(c.offset)
- if a.onlineCopy(c.dst, koff) {
- changed = true
- }
- }
- if changed {
- a.addWork(c.dst)
- }
-}
-
-func (c *storeConstraint) solve(a *analysis, delta *nodeset) {
- for _, x := range delta.AppendTo(a.deltaSpace) {
- k := nodeid(x)
- koff := k + nodeid(c.offset)
- if a.onlineCopy(koff, c.src) {
- a.addWork(koff)
- }
- }
-}
-
-func (c *offsetAddrConstraint) solve(a *analysis, delta *nodeset) {
- dst := a.nodes[c.dst]
- for _, x := range delta.AppendTo(a.deltaSpace) {
- k := nodeid(x)
- if dst.solve.pts.add(k + nodeid(c.offset)) {
- a.addWork(c.dst)
- }
- }
-}
-
-func (c *typeFilterConstraint) solve(a *analysis, delta *nodeset) {
- for _, x := range delta.AppendTo(a.deltaSpace) {
- ifaceObj := nodeid(x)
- tDyn, _, indirect := a.taggedValue(ifaceObj)
- if indirect {
- // TODO(adonovan): we'll need to implement this
- // when we start creating indirect tagged objects.
- panic("indirect tagged object")
- }
-
- if types.AssignableTo(tDyn, c.typ) {
- if a.addLabel(c.dst, ifaceObj) {
- a.addWork(c.dst)
- }
- }
- }
-}
-
-func (c *untagConstraint) solve(a *analysis, delta *nodeset) {
- predicate := types.AssignableTo
- if c.exact {
- predicate = types.Identical
- }
- for _, x := range delta.AppendTo(a.deltaSpace) {
- ifaceObj := nodeid(x)
- tDyn, v, indirect := a.taggedValue(ifaceObj)
- if indirect {
- // TODO(adonovan): we'll need to implement this
- // when we start creating indirect tagged objects.
- panic("indirect tagged object")
- }
-
- if predicate(tDyn, c.typ) {
- // Copy payload sans tag to dst.
- //
- // TODO(adonovan): opt: if tDyn is
- // nonpointerlike we can skip this entire
- // constraint, perhaps. We only care about
- // pointers among the fields.
- a.onlineCopyN(c.dst, v, a.sizeof(tDyn))
- }
- }
-}
-
-func (c *invokeConstraint) solve(a *analysis, delta *nodeset) {
- for _, x := range delta.AppendTo(a.deltaSpace) {
- ifaceObj := nodeid(x)
- tDyn, v, indirect := a.taggedValue(ifaceObj)
- if indirect {
- // TODO(adonovan): we may need to implement this if
- // we ever apply invokeConstraints to reflect.Value PTSs,
- // e.g. for (reflect.Value).Call.
- panic("indirect tagged object")
- }
-
- // Look up the concrete method.
- fn := a.prog.LookupMethod(tDyn, c.method.Pkg(), c.method.Name())
- if fn == nil {
- panic(fmt.Sprintf("n%d: no ssa.Function for %s", c.iface, c.method))
- }
- sig := fn.Signature
-
- fnObj := a.globalobj[fn] // dynamic calls use shared contour
- if fnObj == 0 {
- // a.objectNode(fn) was not called during gen phase.
- panic(fmt.Sprintf("a.globalobj[%s]==nil", fn))
- }
-
- // Make callsite's fn variable point to identity of
- // concrete method. (There's no need to add it to
- // worklist since it never has attached constraints.)
- a.addLabel(c.params, fnObj)
-
- // Extract value and connect to method's receiver.
- // Copy payload to method's receiver param (arg0).
- arg0 := a.funcParams(fnObj)
- recvSize := a.sizeof(sig.Recv().Type())
- a.onlineCopyN(arg0, v, recvSize)
-
- src := c.params + 1 // skip past identity
- dst := arg0 + nodeid(recvSize)
-
- // Copy caller's argument block to method formal parameters.
- paramsSize := a.sizeof(sig.Params())
- a.onlineCopyN(dst, src, paramsSize)
- src += nodeid(paramsSize)
- dst += nodeid(paramsSize)
-
- // Copy method results to caller's result block.
- resultsSize := a.sizeof(sig.Results())
- a.onlineCopyN(src, dst, resultsSize)
- }
-}
-
-func (c *addrConstraint) solve(a *analysis, delta *nodeset) {
- panic("addr is not a complex constraint")
-}
-
-func (c *copyConstraint) solve(a *analysis, delta *nodeset) {
- panic("copy is not a complex constraint")
-}
diff --git a/vendor/golang.org/x/tools/go/pointer/stdlib_test.go b/vendor/golang.org/x/tools/go/pointer/stdlib_test.go
deleted file mode 100644
index d3ba721..0000000
--- a/vendor/golang.org/x/tools/go/pointer/stdlib_test.go
+++ /dev/null
@@ -1,111 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Incomplete source tree on Android.
-
-// +build !android
-
-package pointer
-
-// This file runs the pointer analysis on all packages and tests beneath
-// $GOROOT. It provides a "smoke test" that the analysis doesn't crash
-// on a large input, and a benchmark for performance measurement.
-//
-// Because it is relatively slow, the --stdlib flag must be enabled for
-// this test to run:
-// % go test -v golang.org/x/tools/go/pointer --stdlib
-
-import (
- "flag"
- "go/build"
- "go/token"
- "testing"
- "time"
-
- "golang.org/x/tools/go/buildutil"
- "golang.org/x/tools/go/loader"
- "golang.org/x/tools/go/ssa"
- "golang.org/x/tools/go/ssa/ssautil"
-)
-
-var runStdlibTest = flag.Bool("stdlib", false, "Run the (slow) stdlib test")
-
-func TestStdlib(t *testing.T) {
- if !*runStdlibTest {
- t.Skip("skipping (slow) stdlib test (use --stdlib)")
- }
-
- // Load, parse and type-check the program.
- ctxt := build.Default // copy
- ctxt.GOPATH = "" // disable GOPATH
- conf := loader.Config{Build: &ctxt}
- if _, err := conf.FromArgs(buildutil.AllPackages(conf.Build), true); err != nil {
- t.Errorf("FromArgs failed: %v", err)
- return
- }
-
- iprog, err := conf.Load()
- if err != nil {
- t.Fatalf("Load failed: %v", err)
- }
-
- // Create SSA packages.
- prog := ssautil.CreateProgram(iprog, 0)
- prog.Build()
-
- numPkgs := len(prog.AllPackages())
- if want := 240; numPkgs < want {
- t.Errorf("Loaded only %d packages, want at least %d", numPkgs, want)
- }
-
- // Determine the set of packages/tests to analyze.
- var mains []*ssa.Package
- for _, info := range iprog.InitialPackages() {
- ssapkg := prog.Package(info.Pkg)
- if main := prog.CreateTestMainPackage(ssapkg); main != nil {
- mains = append(mains, main)
- }
- }
- if mains == nil {
- t.Fatal("no tests found in analysis scope")
- }
-
- // Run the analysis.
- config := &Config{
- Reflection: false, // TODO(adonovan): fix remaining bug in rVCallConstraint, then enable.
- BuildCallGraph: true,
- Mains: mains,
- }
- // TODO(adonovan): add some query values (affects track bits).
-
- t0 := time.Now()
-
- result, err := Analyze(config)
- if err != nil {
- t.Fatal(err) // internal error in pointer analysis
- }
- _ = result // TODO(adonovan): measure something
-
- t1 := time.Now()
-
- // Dump some statistics.
- allFuncs := ssautil.AllFunctions(prog)
- var numInstrs int
- for fn := range allFuncs {
- for _, b := range fn.Blocks {
- numInstrs += len(b.Instrs)
- }
- }
-
- // determine line count
- var lineCount int
- prog.Fset.Iterate(func(f *token.File) bool {
- lineCount += f.LineCount()
- return true
- })
-
- t.Log("#Source lines: ", lineCount)
- t.Log("#Instructions: ", numInstrs)
- t.Log("Pointer analysis: ", t1.Sub(t0))
-}
diff --git a/vendor/golang.org/x/tools/go/pointer/testdata/a_test.go b/vendor/golang.org/x/tools/go/pointer/testdata/a_test.go
deleted file mode 100644
index 3baa9ac..0000000
--- a/vendor/golang.org/x/tools/go/pointer/testdata/a_test.go
+++ /dev/null
@@ -1,42 +0,0 @@
-// +build ignore
-
-package a
-
-// This test exercises the synthesis of testmain packages for tests.
-// The test framework doesn't directly let us perform negative
-// assertions (i.e. that TestingQuux isn't called, or that its
-// parameter's PTS is empty) so this test is rather roundabout.
-
-import "testing"
-
-func log(f func(*testing.T)) {
- // The PTS of f is the set of called tests. TestingQuux is not present.
- print(f) // @pointsto main.Test | main.TestFoo
-}
-
-func Test(t *testing.T) {
- // Don't assert @pointsto(t) since its label contains a fragile line number.
- log(Test)
-}
-
-func TestFoo(t *testing.T) {
- // Don't assert @pointsto(t) since its label contains a fragile line number.
- log(TestFoo)
-}
-
-func TestingQuux(t *testing.T) {
- // We can't assert @pointsto(t) since this is dead code.
- log(TestingQuux)
-}
-
-func BenchmarkFoo(b *testing.B) {
-}
-
-func ExampleBar() {
-}
-
-// Excludes TestingQuux.
-// @calls testing.tRunner -> main.Test
-// @calls testing.tRunner -> main.TestFoo
-// @calls testing.runExample -> main.ExampleBar
-// @calls (*testing.B).runN -> main.BenchmarkFoo
diff --git a/vendor/golang.org/x/tools/go/pointer/testdata/another.go b/vendor/golang.org/x/tools/go/pointer/testdata/another.go
deleted file mode 100644
index 12ed690..0000000
--- a/vendor/golang.org/x/tools/go/pointer/testdata/another.go
+++ /dev/null
@@ -1,36 +0,0 @@
-// +build ignore
-
-package main
-
-var unknown bool
-
-type S string
-
-func incr(x int) int { return x + 1 }
-
-func main() {
- var i interface{}
- i = 1
- if unknown {
- i = S("foo")
- }
- if unknown {
- i = (func(int, int))(nil) // NB type compares equal to that below.
- }
- // Look, the test harness can handle equal-but-not-String-equal
- // types because we parse types and using a typemap.
- if unknown {
- i = (func(x int, y int))(nil)
- }
- if unknown {
- i = incr
- }
- print(i) // @types int | S | func(int, int) | func(int) int
-
- // NB, an interface may never directly alias any global
- // labels, even though it may contain pointers that do.
- print(i) // @pointsto makeinterface:func(x int) int | makeinterface:func(x int, y int) | makeinterface:func(int, int) | makeinterface:int | makeinterface:main.S
- print(i.(func(int) int)) // @pointsto main.incr
-
- print() // regression test for crash
-}
diff --git a/vendor/golang.org/x/tools/go/pointer/testdata/arrayreflect.go b/vendor/golang.org/x/tools/go/pointer/testdata/arrayreflect.go
deleted file mode 100644
index 2b23674..0000000
--- a/vendor/golang.org/x/tools/go/pointer/testdata/arrayreflect.go
+++ /dev/null
@@ -1,191 +0,0 @@
-// +build ignore
-
-package main
-
-// Test of arrays & slices with reflection.
-
-import "reflect"
-
-var a, b int
-
-type S string
-
-func reflectValueSlice() {
- // reflect.Value contains a slice.
- slice := make([]*int, 10) // @line slice
- slice[0] = &a
- rvsl := reflect.ValueOf(slice).Slice(0, 0)
- print(rvsl.Interface()) // @types []*int
- print(rvsl.Interface().([]*int)) // @pointsto makeslice@slice:15
- print(rvsl.Interface().([]*int)[42]) // @pointsto main.a
-
- // reflect.Value contains an array (non-addressable).
- array := [10]*int{&a} // @line array
- rvarray := reflect.ValueOf(array).Slice(0, 0)
- print(rvarray.Interface()) // @types
- print(rvarray.Interface().([]*int)) // @pointsto
- print(rvarray.Interface().([]*int)[42]) // @pointsto
-
- // reflect.Value contains a pointer-to-array
- rvparray := reflect.ValueOf(&array).Slice(0, 0)
- print(rvparray.Interface()) // @types []*int
- print(rvparray.Interface().([]*int)) // @pointsto array@array:2
- print(rvparray.Interface().([]*int)[42]) // @pointsto main.a
-
- // reflect.Value contains a string.
- rvstring := reflect.ValueOf("hi").Slice(0, 0)
- print(rvstring.Interface()) // @types string
-
- // reflect.Value contains a (named) string type.
- rvS := reflect.ValueOf(S("hi")).Slice(0, 0)
- print(rvS.Interface()) // @types S
-
- // reflect.Value contains a non-array pointer.
- rvptr := reflect.ValueOf(new(int)).Slice(0, 0)
- print(rvptr.Interface()) // @types
-
- // reflect.Value contains a non-string basic type.
- rvint := reflect.ValueOf(3).Slice(0, 0)
- print(rvint.Interface()) // @types
-}
-
-func reflectValueBytes() {
- sl1 := make([]byte, 0) // @line ar5sl1
- sl2 := make([]byte, 0) // @line ar5sl2
-
- rvsl1 := reflect.ValueOf(sl1)
- print(rvsl1.Interface()) // @types []byte
- print(rvsl1.Interface().([]byte)) // @pointsto makeslice@ar5sl1:13
- print(rvsl1.Bytes()) // @pointsto makeslice@ar5sl1:13
-
- rvsl2 := reflect.ValueOf(123)
- rvsl2.SetBytes(sl2)
- print(rvsl2.Interface()) // @types int
- print(rvsl2.Interface().([]byte)) // @pointsto
- print(rvsl2.Bytes()) // @pointsto
-
- rvsl3 := reflect.ValueOf([]byte(nil))
- rvsl3.SetBytes(sl2)
- print(rvsl3.Interface()) // @types []byte
- print(rvsl3.Interface().([]byte)) // @pointsto makeslice@ar5sl2:13
- print(rvsl3.Bytes()) // @pointsto makeslice@ar5sl2:13
-}
-
-func reflectValueIndex() {
- slice := []*int{&a} // @line ar6slice
- rv1 := reflect.ValueOf(slice)
- print(rv1.Index(42).Interface()) // @types *int
- print(rv1.Index(42).Interface().(*int)) // @pointsto main.a
-
- array := [10]*int{&a}
- rv2 := reflect.ValueOf(array)
- print(rv2.Index(42).Interface()) // @types *int
- print(rv2.Index(42).Interface().(*int)) // @pointsto main.a
-
- rv3 := reflect.ValueOf("string")
- print(rv3.Index(42).Interface()) // @types rune
-
- rv4 := reflect.ValueOf(&array)
- print(rv4.Index(42).Interface()) // @types
-
- rv5 := reflect.ValueOf(3)
- print(rv5.Index(42).Interface()) // @types
-}
-
-func reflectValueElem() {
- // Interface.
- var iface interface{} = &a
- rv1 := reflect.ValueOf(&iface).Elem()
- print(rv1.Interface()) // @types *int
- print(rv1.Interface().(*int)) // @pointsto main.a
- print(rv1.Elem().Interface()) // @types *int
- print(rv1.Elem().Interface().(*int)) // @pointsto main.a
-
- print(reflect.ValueOf(new(interface{})).Elem().Elem()) // @types
-
- // Pointer.
- ptr := &a
- rv2 := reflect.ValueOf(&ptr)
- print(rv2.Elem().Interface()) // @types *int
- print(rv2.Elem().Interface().(*int)) // @pointsto main.a
-
- // No other type works with (rV).Elem, not even those that
- // work with (rT).Elem: slice, array, map, chan.
-
- rv3 := reflect.ValueOf([]*int{&a})
- print(rv3.Elem().Interface()) // @types
-
- rv4 := reflect.ValueOf([10]*int{&a})
- print(rv4.Elem().Interface()) // @types
-
- rv5 := reflect.ValueOf(map[*int]*int{&a: &b})
- print(rv5.Elem().Interface()) // @types
-
- ch := make(chan *int)
- ch <- &a
- rv6 := reflect.ValueOf(ch)
- print(rv6.Elem().Interface()) // @types
-
- rv7 := reflect.ValueOf(3)
- print(rv7.Elem().Interface()) // @types
-}
-
-func reflectTypeElem() {
- rt1 := reflect.TypeOf(make([]*int, 0))
- print(reflect.Zero(rt1.Elem())) // @types *int
-
- rt2 := reflect.TypeOf([10]*int{})
- print(reflect.Zero(rt2.Elem())) // @types *int
-
- rt3 := reflect.TypeOf(map[*int]*int{})
- print(reflect.Zero(rt3.Elem())) // @types *int
-
- rt4 := reflect.TypeOf(make(chan *int))
- print(reflect.Zero(rt4.Elem())) // @types *int
-
- ptr := &a
- rt5 := reflect.TypeOf(&ptr)
- print(reflect.Zero(rt5.Elem())) // @types *int
-
- rt6 := reflect.TypeOf(3)
- print(reflect.Zero(rt6.Elem())) // @types
-}
-
-func reflectPtrTo() {
- tInt := reflect.TypeOf(3)
- tPtrInt := reflect.PtrTo(tInt)
- print(reflect.Zero(tPtrInt)) // @types *int
- tPtrPtrInt := reflect.PtrTo(tPtrInt)
- print(reflect.Zero(tPtrPtrInt)) // @types **int
-}
-
-func reflectSliceOf() {
- tInt := reflect.TypeOf(3)
- tSliceInt := reflect.SliceOf(tInt)
- print(reflect.Zero(tSliceInt)) // @types []int
-}
-
-type T struct{ x int }
-
-func reflectMakeSlice() {
- rt := []reflect.Type{
- reflect.TypeOf(3),
- reflect.TypeOf([]int{}),
- reflect.TypeOf([]T{}),
- }[0]
- sl := reflect.MakeSlice(rt, 0, 0)
- print(sl) // @types []int | []T
- print(sl) // @pointsto |
- print(&sl.Interface().([]T)[0].x) // @pointsto [*].x
-}
-
-func main() {
- reflectValueSlice()
- reflectValueBytes()
- reflectValueIndex()
- reflectValueElem()
- reflectTypeElem()
- reflectPtrTo()
- reflectSliceOf()
- reflectMakeSlice()
-}
diff --git a/vendor/golang.org/x/tools/go/pointer/testdata/arrays.go b/vendor/golang.org/x/tools/go/pointer/testdata/arrays.go
deleted file mode 100644
index e57a15b..0000000
--- a/vendor/golang.org/x/tools/go/pointer/testdata/arrays.go
+++ /dev/null
@@ -1,97 +0,0 @@
-// +build ignore
-
-package main
-
-var unknown bool // defeat dead-code elimination
-
-var a, b int
-
-func array1() {
- sliceA := make([]*int, 10) // @line a1make
- sliceA[0] = &a
-
- var sliceB []*int
- sliceB = append(sliceB, &b) // @line a1append
-
- print(sliceA) // @pointsto makeslice@a1make:16
- print(sliceA[0]) // @pointsto main.a
-
- print(sliceB) // @pointsto append@a1append:17
- print(sliceB[100]) // @pointsto main.b
-}
-
-func array2() {
- sliceA := make([]*int, 10) // @line a2make
- sliceA[0] = &a
-
- sliceB := sliceA[:]
-
- print(sliceA) // @pointsto makeslice@a2make:16
- print(sliceA[0]) // @pointsto main.a
-
- print(sliceB) // @pointsto makeslice@a2make:16
- print(sliceB[0]) // @pointsto main.a
-}
-
-func array3() {
- a := []interface{}{"", 1}
- b := []interface{}{true, func() {}}
- print(a[0]) // @types string | int
- print(b[0]) // @types bool | func()
-}
-
-// Test of append, copy, slice.
-func array4() {
- var s2 struct { // @line a4L0
- a [3]int
- b struct{ c, d int }
- }
- var sl1 = make([]*int, 10) // @line a4make
- var someint int // @line a4L1
- sl1[1] = &someint
- sl2 := append(sl1, &s2.a[1]) // @line a4append1
- print(sl1) // @pointsto makeslice@a4make:16
- print(sl2) // @pointsto append@a4append1:15 | makeslice@a4make:16
- print(sl1[0]) // @pointsto someint@a4L1:6 | s2.a[*]@a4L0:6
- print(sl2[0]) // @pointsto someint@a4L1:6 | s2.a[*]@a4L0:6
-
- // In z=append(x,y) we should observe flow from y[*] to x[*].
- var sl3 = make([]*int, 10) // @line a4L2
- _ = append(sl3, &s2.a[1])
- print(sl3) // @pointsto makeslice@a4L2:16
- print(sl3[0]) // @pointsto s2.a[*]@a4L0:6
-
- var sl4 = []*int{&a} // @line a4L3
- sl4a := append(sl4) // @line a4L4
- print(sl4a) // @pointsto slicelit@a4L3:18 | append@a4L4:16
- print(&sl4a[0]) // @pointsto slicelit[*]@a4L3:18 | append[*]@a4L4:16
- print(sl4a[0]) // @pointsto main.a
-
- var sl5 = []*int{&b} // @line a4L5
- copy(sl5, sl4)
- print(sl5) // @pointsto slicelit@a4L5:18
- print(&sl5[0]) // @pointsto slicelit[*]@a4L5:18
- print(sl5[0]) // @pointsto main.b | main.a
-
- var sl6 = sl5[:0]
- print(sl6) // @pointsto slicelit@a4L5:18
- print(&sl6[0]) // @pointsto slicelit[*]@a4L5:18
- print(sl6[0]) // @pointsto main.b | main.a
-}
-
-func array5() {
- var arr [2]*int
- arr[0] = &a
- arr[1] = &b
-
- var n int
- print(arr[n]) // @pointsto main.a | main.b
-}
-
-func main() {
- array1()
- array2()
- array3()
- array4()
- array5()
-}
diff --git a/vendor/golang.org/x/tools/go/pointer/testdata/channels.go b/vendor/golang.org/x/tools/go/pointer/testdata/channels.go
deleted file mode 100644
index 377b68a..0000000
--- a/vendor/golang.org/x/tools/go/pointer/testdata/channels.go
+++ /dev/null
@@ -1,118 +0,0 @@
-// +build ignore
-
-package main
-
-func incr(x int) int { return x + 1 }
-
-func decr(x int) int { return x - 1 }
-
-var unknown bool // defeat dead-code elimination
-
-func chan1() {
- chA := make(chan func(int) int, 0) // @line c1makeA
- chB := make(chan func(int) int, 0) // @line c1makeB
- chA <- incr
- chB <- decr
- chB <- func(int) int { return 1 }
-
- print(chA) // @pointsto makechan@c1makeA:13
- print(<-chA) // @pointsto main.incr
-
- print(chB) // @pointsto makechan@c1makeB:13
- print(<-chB) // @pointsto main.decr | main.chan1$1
-}
-
-func chan2() {
- chA := make(chan func(int) int, 0) // @line c2makeA
- chB := make(chan func(int) int, 0) // @line c2makeB
- chA <- incr
- chB <- decr
- chB <- func(int) int { return 1 }
-
- // Channels flow together.
- // Labelsets remain distinct but elements are merged.
- chAB := chA
- if unknown {
- chAB = chB
- }
-
- print(chA) // @pointsto makechan@c2makeA:13
- print(<-chA) // @pointsto main.incr
-
- print(chB) // @pointsto makechan@c2makeB:13
- print(<-chB) // @pointsto main.decr | main.chan2$1
-
- print(chAB) // @pointsto makechan@c2makeA:13 | makechan@c2makeB:13
- print(<-chAB) // @pointsto main.incr | main.decr | main.chan2$1
-
- (<-chA)(3)
-}
-
-// @calls main.chan2 -> main.incr
-
-func chan3() {
- chA := make(chan func(int) int, 0) // @line c3makeA
- chB := make(chan func(int) int, 0) // @line c3makeB
- chA <- incr
- chB <- decr
- chB <- func(int) int { return 1 }
- print(chA) // @pointsto makechan@c3makeA:13
- print(<-chA) // @pointsto main.incr
- print(chB) // @pointsto makechan@c3makeB:13
- print(<-chB) // @pointsto main.decr | main.chan3$1
-
- (<-chA)(3)
-}
-
-// @calls main.chan3 -> main.incr
-
-func chan4() {
- chA := make(chan func(int) int, 0) // @line c4makeA
- chB := make(chan func(int) int, 0) // @line c4makeB
-
- select {
- case chA <- incr:
- case chB <- decr:
- case a := <-chA:
- print(a) // @pointsto main.incr
- case b := <-chB:
- print(b) // @pointsto main.decr
- default:
- print(chA) // @pointsto makechan@c4makeA:13
- print(chB) // @pointsto makechan@c4makeB:13
- }
-
- for k := range chA {
- print(k) // @pointsto main.incr
- }
- // Exercise constraint generation (regtest for a crash).
- for range chA {
- }
-}
-
-// Multi-word channel value in select with multiple receive cases.
-// (Regtest for a crash.)
-func chan5() {
- type T struct {
- x *int
- y interface{}
- }
- ch := make(chan T)
- ch <- T{new(int), incr} // @line ch5new
- select {
- case a := <-ch:
- print(a.x) // @pointsto new@ch5new:13
- print(a.y) // @types func(x int) int
- case b := <-ch:
- print(b.x) // @pointsto new@ch5new:13
- print(b.y) // @types func(x int) int
- }
-}
-
-func main() {
- chan1()
- chan2()
- chan3()
- chan4()
- chan5()
-}
diff --git a/vendor/golang.org/x/tools/go/pointer/testdata/chanreflect.go b/vendor/golang.org/x/tools/go/pointer/testdata/chanreflect.go
deleted file mode 100644
index 7d22efe..0000000
--- a/vendor/golang.org/x/tools/go/pointer/testdata/chanreflect.go
+++ /dev/null
@@ -1,85 +0,0 @@
-// +build ignore
-
-package main
-
-import "reflect"
-
-// Test of channels with reflection.
-
-var a, b int
-
-func chanreflect1() {
- ch := make(chan *int, 0) // @line cr1make
- crv := reflect.ValueOf(ch)
- crv.Send(reflect.ValueOf(&a))
- print(crv.Interface()) // @types chan *int
- print(crv.Interface().(chan *int)) // @pointsto makechan@cr1make:12
- print(<-ch) // @pointsto main.a
-}
-
-func chanreflect1i() {
- // Exercises reflect.Value conversions to/from interfaces:
- // a different code path than for concrete types.
- ch := make(chan interface{}, 0)
- reflect.ValueOf(ch).Send(reflect.ValueOf(&a))
- v := <-ch
- print(v) // @types *int
- print(v.(*int)) // @pointsto main.a
-}
-
-func chanreflect2() {
- ch := make(chan *int, 0)
- ch <- &b
- crv := reflect.ValueOf(ch)
- r, _ := crv.Recv()
- print(r.Interface()) // @types *int
- print(r.Interface().(*int)) // @pointsto main.b
-}
-
-func chanOfRecv() {
- // MakeChan(<-chan) is a no-op.
- t := reflect.ChanOf(reflect.RecvDir, reflect.TypeOf(&a))
- print(reflect.Zero(t).Interface()) // @types <-chan *int
- print(reflect.MakeChan(t, 0).Interface().(<-chan *int)) // @pointsto
- print(reflect.MakeChan(t, 0).Interface().(chan *int)) // @pointsto
-}
-
-func chanOfSend() {
- // MakeChan(chan<-) is a no-op.
- t := reflect.ChanOf(reflect.SendDir, reflect.TypeOf(&a))
- print(reflect.Zero(t).Interface()) // @types chan<- *int
- print(reflect.MakeChan(t, 0).Interface().(chan<- *int)) // @pointsto
- print(reflect.MakeChan(t, 0).Interface().(chan *int)) // @pointsto
-}
-
-func chanOfBoth() {
- t := reflect.ChanOf(reflect.BothDir, reflect.TypeOf(&a))
- print(reflect.Zero(t).Interface()) // @types chan *int
- ch := reflect.MakeChan(t, 0)
- print(ch.Interface().(chan *int)) // @pointsto
- ch.Send(reflect.ValueOf(&b))
- ch.Interface().(chan *int) <- &a
- r, _ := ch.Recv()
- print(r.Interface().(*int)) // @pointsto main.a | main.b
- print(<-ch.Interface().(chan *int)) // @pointsto main.a | main.b
-}
-
-var unknownDir reflect.ChanDir // not a constant
-
-func chanOfUnknown() {
- // Unknown channel direction: assume all three.
- // MakeChan only works on the bi-di channel type.
- t := reflect.ChanOf(unknownDir, reflect.TypeOf(&a))
- print(reflect.Zero(t).Interface()) // @types <-chan *int | chan<- *int | chan *int
- print(reflect.MakeChan(t, 0).Interface()) // @types chan *int
-}
-
-func main() {
- chanreflect1()
- chanreflect1i()
- chanreflect2()
- chanOfRecv()
- chanOfSend()
- chanOfBoth()
- chanOfUnknown()
-}
diff --git a/vendor/golang.org/x/tools/go/pointer/testdata/chanreflect1.go b/vendor/golang.org/x/tools/go/pointer/testdata/chanreflect1.go
deleted file mode 100644
index c5e2587..0000000
--- a/vendor/golang.org/x/tools/go/pointer/testdata/chanreflect1.go
+++ /dev/null
@@ -1,35 +0,0 @@
-// +build ignore
-
-package main
-
-import "reflect"
-
-//
-// This test is very sensitive to line-number perturbations!
-
-// Test of channels with reflection.
-
-var a, b int
-
-func chanreflect1() {
- ch := make(chan *int, 0)
- crv := reflect.ValueOf(ch)
- crv.Send(reflect.ValueOf(&a))
- print(crv.Interface()) // @types chan *int
- print(crv.Interface().(chan *int)) // @pointsto makechan@testdata/chanreflect.go:15:12
- print(<-ch) // @pointsto main.a
-}
-
-func chanreflect2() {
- ch := make(chan *int, 0)
- ch <- &b
- crv := reflect.ValueOf(ch)
- r, _ := crv.Recv()
- print(r.Interface()) // @types *int
- print(r.Interface().(*int)) // @pointsto main.b
-}
-
-func main() {
- chanreflect1()
- chanreflect2()
-}
diff --git a/vendor/golang.org/x/tools/go/pointer/testdata/context.go b/vendor/golang.org/x/tools/go/pointer/testdata/context.go
deleted file mode 100644
index ed616e7..0000000
--- a/vendor/golang.org/x/tools/go/pointer/testdata/context.go
+++ /dev/null
@@ -1,48 +0,0 @@
-// +build ignore
-
-package main
-
-// Test of context-sensitive treatment of certain function calls,
-// e.g. static calls to simple accessor methods.
-
-var a, b int
-
-type T struct{ x *int }
-
-func (t *T) SetX(x *int) { t.x = x }
-func (t *T) GetX() *int { return t.x }
-
-func context1() {
- var t1, t2 T
- t1.SetX(&a)
- t2.SetX(&b)
- print(t1.GetX()) // @pointsto main.a
- print(t2.GetX()) // @pointsto main.b
-}
-
-func context2() {
- id := func(x *int) *int {
- print(x) // @pointsto main.a | main.b
- return x
- }
- print(id(&a)) // @pointsto main.a
- print(id(&b)) // @pointsto main.b
-
- // Same again, but anon func has free vars.
- var c int // @line context2c
- id2 := func(x *int) (*int, *int) {
- print(x) // @pointsto main.a | main.b
- return x, &c
- }
- p, q := id2(&a)
- print(p) // @pointsto main.a
- print(q) // @pointsto c@context2c:6
- r, s := id2(&b)
- print(r) // @pointsto main.b
- print(s) // @pointsto c@context2c:6
-}
-
-func main() {
- context1()
- context2()
-}
diff --git a/vendor/golang.org/x/tools/go/pointer/testdata/conv.go b/vendor/golang.org/x/tools/go/pointer/testdata/conv.go
deleted file mode 100644
index 692f0ce..0000000
--- a/vendor/golang.org/x/tools/go/pointer/testdata/conv.go
+++ /dev/null
@@ -1,63 +0,0 @@
-// +build ignore
-
-package main
-
-import "unsafe"
-
-var a int
-
-func conv1() {
- // Conversions of channel direction.
- ch := make(chan int) // @line c1make
- print((<-chan int)(ch)) // @pointsto makechan@c1make:12
- print((chan<- int)(ch)) // @pointsto makechan@c1make:12
-}
-
-func conv2() {
- // string -> []byte/[]rune conversion
- s := "foo"
- ba := []byte(s) // @line c2ba
- ra := []rune(s) // @line c2ra
- print(ba) // @pointsto convert@c2ba:14
- print(ra) // @pointsto convert@c2ra:14
-}
-
-func conv3() {
- // Conversion of same underlying types.
- type PI *int
- pi := PI(&a)
- print(pi) // @pointsto main.a
-
- pint := (*int)(pi)
- print(pint) // @pointsto main.a
-
- // Conversions between pointers to identical base types.
- var y *PI = &pi
- var x **int = (**int)(y)
- print(*x) // @pointsto main.a
- print(*y) // @pointsto main.a
- y = (*PI)(x)
- print(*y) // @pointsto main.a
-}
-
-func conv4() {
- // Handling of unsafe.Pointer conversion is unsound:
- // we lose the alias to main.a and get something like new(int) instead.
- p := (*int)(unsafe.Pointer(&a)) // @line c2p
- print(p) // @pointsto convert@c2p:13
-}
-
-// Regression test for b/8231.
-func conv5() {
- type P unsafe.Pointer
- var i *struct{}
- _ = P(i)
-}
-
-func main() {
- conv1()
- conv2()
- conv3()
- conv4()
- conv5()
-}
diff --git a/vendor/golang.org/x/tools/go/pointer/testdata/extended.go b/vendor/golang.org/x/tools/go/pointer/testdata/extended.go
deleted file mode 100644
index b3dd203..0000000
--- a/vendor/golang.org/x/tools/go/pointer/testdata/extended.go
+++ /dev/null
@@ -1,21 +0,0 @@
-// +build ignore
-
-package main
-
-var a int
-
-type t struct {
- a *map[string]chan *int
-}
-
-func fn() []t {
- m := make(map[string]chan *int)
- m[""] = make(chan *int, 1)
- m[""] <- &a
- return []t{t{a: &m}}
-}
-
-func main() {
- x := fn()
- print(x) // @pointstoquery <-(*x[i].a)[key] main.a
-}
diff --git a/vendor/golang.org/x/tools/go/pointer/testdata/finalizer.go b/vendor/golang.org/x/tools/go/pointer/testdata/finalizer.go
deleted file mode 100644
index 97f25c9..0000000
--- a/vendor/golang.org/x/tools/go/pointer/testdata/finalizer.go
+++ /dev/null
@@ -1,89 +0,0 @@
-package main
-
-import "runtime"
-
-func final1a(x *int) int {
- print(x) // @pointsto new@newint:10
- return *x
-}
-
-func final1b(x *bool) {
- print(x) // @pointsto
-}
-
-func runtimeSetFinalizer1() {
- x := new(int) // @line newint
- runtime.SetFinalizer(x, final1a) // ok: final1a's result is ignored
- runtime.SetFinalizer(x, final1b) // param type mismatch: no effect
-}
-
-// @calls main.runtimeSetFinalizer1 -> main.final1a
-// @calls main.runtimeSetFinalizer1 -> main.final1b
-
-func final2a(x *bool) {
- print(x) // @pointsto new@newbool1:10 | new@newbool2:10
-}
-
-func final2b(x *bool) {
- print(x) // @pointsto new@newbool1:10 | new@newbool2:10
-}
-
-func runtimeSetFinalizer2() {
- x := new(bool) // @line newbool1
- f := final2a
- if unknown {
- x = new(bool) // @line newbool2
- f = final2b
- }
- runtime.SetFinalizer(x, f)
-}
-
-// @calls main.runtimeSetFinalizer2 -> main.final2a
-// @calls main.runtimeSetFinalizer2 -> main.final2b
-
-type T int
-
-func (t *T) finalize() {
- print(t) // @pointsto new@final3:10
-}
-
-func runtimeSetFinalizer3() {
- x := new(T) // @line final3
- runtime.SetFinalizer(x, (*T).finalize)
-}
-
-// @calls main.runtimeSetFinalizer3 -> (*main.T).finalize$thunk
-
-// I hope I never live to see this code in the wild.
-var setFinalizer = runtime.SetFinalizer
-
-func final4(x *int) {
- print(x) // @pointsto new@finalIndirect:10
-}
-
-func runtimeSetFinalizerIndirect() {
- // In an indirect call, the shared contour for SetFinalizer is
- // used, i.e. the call is not inlined and appears in the call graph.
- x := new(int) // @line finalIndirect
- setFinalizer(x, final4)
-}
-
-// Exercise the elimination of SetFinalizer
-// constraints with non-pointer operands.
-func runtimeSetFinalizerNonpointer() {
- runtime.SetFinalizer(nil, (*T).finalize) // x is a non-pointer
- runtime.SetFinalizer((*T).finalize, nil) // f is a non-pointer
-}
-
-// @calls main.runtimeSetFinalizerIndirect -> runtime.SetFinalizer
-// @calls runtime.SetFinalizer -> main.final4
-
-func main() {
- runtimeSetFinalizer1()
- runtimeSetFinalizer2()
- runtimeSetFinalizer3()
- runtimeSetFinalizerIndirect()
- runtimeSetFinalizerNonpointer()
-}
-
-var unknown bool // defeat dead-code elimination
diff --git a/vendor/golang.org/x/tools/go/pointer/testdata/flow.go b/vendor/golang.org/x/tools/go/pointer/testdata/flow.go
deleted file mode 100644
index 6fb599e..0000000
--- a/vendor/golang.org/x/tools/go/pointer/testdata/flow.go
+++ /dev/null
@@ -1,63 +0,0 @@
-// +build ignore
-
-package main
-
-// Demonstration of directionality of flow edges.
-
-func f1() {}
-func f2() {}
-
-var somepred bool
-
-// Tracking functions.
-func flow1() {
- s := f1
- p := f2
- q := p
- r := q
- if somepred {
- r = s
- }
- print(s) // @pointsto main.f1
- print(p) // @pointsto main.f2
- print(q) // @pointsto main.f2
- print(r) // @pointsto main.f1 | main.f2
-}
-
-// Tracking concrete types in interfaces.
-func flow2() {
- var s interface{} = 1
- var p interface{} = "foo"
- q := p
- r := q
- if somepred {
- r = s
- }
- print(s) // @types int
- print(p) // @types string
- print(q) // @types string
- print(r) // @types int | string
-}
-
-var g1, g2 int
-
-// Tracking addresses of globals.
-func flow3() {
- s := &g1
- p := &g2
- q := p
- r := q
- if somepred {
- r = s
- }
- print(s) // @pointsto main.g1
- print(p) // @pointsto main.g2
- print(q) // @pointsto main.g2
- print(r) // @pointsto main.g2 | main.g1
-}
-
-func main() {
- flow1()
- flow2()
- flow3()
-}
diff --git a/vendor/golang.org/x/tools/go/pointer/testdata/fmtexcerpt.go b/vendor/golang.org/x/tools/go/pointer/testdata/fmtexcerpt.go
deleted file mode 100644
index ee2a0e7..0000000
--- a/vendor/golang.org/x/tools/go/pointer/testdata/fmtexcerpt.go
+++ /dev/null
@@ -1,42 +0,0 @@
-// +build ignore
-
-// This is a slice of the fmt package.
-
-package main
-
-type pp struct {
- field interface{}
-}
-
-func newPrinter() *pp {
- return new(pp)
-}
-
-func Fprintln(a ...interface{}) {
- p := newPrinter()
- p.doPrint(a, true, true)
-}
-
-func Println(a ...interface{}) {
- Fprintln(a...)
-}
-
-func (p *pp) doPrint(a []interface{}, addspace, addnewline bool) {
- print(a[0]) // @types S | string
- stringer := a[0].(interface {
- String() string
- })
-
- stringer.String()
- print(stringer) // @types S
-}
-
-type S int
-
-func (S) String() string { return "" }
-
-func main() {
- Println("Hello, World!", S(0))
-}
-
-// @calls (*main.pp).doPrint -> (main.S).String
diff --git a/vendor/golang.org/x/tools/go/pointer/testdata/func.go b/vendor/golang.org/x/tools/go/pointer/testdata/func.go
deleted file mode 100644
index 2155f8e..0000000
--- a/vendor/golang.org/x/tools/go/pointer/testdata/func.go
+++ /dev/null
@@ -1,205 +0,0 @@
-// +build ignore
-
-package main
-
-var a, b, c int
-
-var unknown bool // defeat dead-code elimination
-
-func func1() {
- var h int // @line f1h
- f := func(x *int) *int {
- if unknown {
- return &b
- }
- return x
- }
-
- // FV(g) = {f, h}
- g := func(x *int) *int {
- if unknown {
- return &h
- }
- return f(x)
- }
-
- print(g(&a)) // @pointsto main.a | main.b | h@f1h:6
- print(f(&a)) // @pointsto main.a | main.b
- print(&a) // @pointsto main.a
-}
-
-// @calls main.func1 -> main.func1$2
-// @calls main.func1 -> main.func1$1
-// @calls main.func1$2 -> main.func1$1
-
-func func2() {
- var x, y *int
- defer func() {
- x = &a
- }()
- go func() {
- y = &b
- }()
- print(x) // @pointsto main.a
- print(y) // @pointsto main.b
-}
-
-func func3() {
- x, y := func() (x, y *int) {
- x = &a
- y = &b
- if unknown {
- return nil, &c
- }
- return
- }()
- print(x) // @pointsto main.a
- print(y) // @pointsto main.b | main.c
-}
-
-func swap(x, y *int) (*int, *int) { // @line swap
- print(&x) // @pointsto x@swap:11
- print(x) // @pointsto makeslice[*]@func4make:11
- print(&y) // @pointsto y@swap:14
- print(y) // @pointsto j@f4j:5
- return y, x
-}
-
-func func4() {
- a := make([]int, 10) // @line func4make
- i, j := 123, 456 // @line f4j
- _ = i
- p, q := swap(&a[3], &j)
- print(p) // @pointsto j@f4j:5
- print(q) // @pointsto makeslice[*]@func4make:11
-
- f := &b
- print(f) // @pointsto main.b
-}
-
-type T int
-
-func (t *T) f(x *int) *int {
- print(t) // @pointsto main.a
- print(x) // @pointsto main.c
- return &b
-}
-
-func (t *T) g(x *int) *int {
- print(t) // @pointsto main.a
- print(x) // @pointsto main.b
- return &c
-}
-
-func (t *T) h(x *int) *int {
- print(t) // @pointsto main.a
- print(x) // @pointsto main.b
- return &c
-}
-
-var h func(*T, *int) *int
-
-func func5() {
- // Static call of method.
- t := (*T)(&a)
- print(t.f(&c)) // @pointsto main.b
-
- // Static call of method as function
- print((*T).g(t, &b)) // @pointsto main.c
-
- // Dynamic call (not invoke) of method.
- h = (*T).h
- print(h(t, &b)) // @pointsto main.c
-}
-
-// @calls main.func5 -> (*main.T).f
-// @calls main.func5 -> (*main.T).g$thunk
-// @calls main.func5 -> (*main.T).h$thunk
-
-func func6() {
- A := &a
- f := func() *int {
- return A // (free variable)
- }
- print(f()) // @pointsto main.a
-}
-
-// @calls main.func6 -> main.func6$1
-
-type I interface {
- f()
-}
-
-type D struct{}
-
-func (D) f() {}
-
-func func7() {
- var i I = D{}
- imethodClosure := i.f
- imethodClosure()
- // @calls main.func7 -> (main.I).f$bound
- // @calls (main.I).f$bound -> (main.D).f
-
- var d D
- cmethodClosure := d.f
- cmethodClosure()
- // @calls main.func7 -> (main.D).f$bound
- // @calls (main.D).f$bound ->(main.D).f
-
- methodExpr := D.f
- methodExpr(d)
- // @calls main.func7 -> (main.D).f$thunk
-}
-
-func func8(x ...int) {
- print(&x[0]) // @pointsto varargs[*]@varargs:15
-}
-
-type E struct {
- x1, x2, x3, x4, x5 *int
-}
-
-func (e E) f() {}
-
-func func9() {
- // Regression test for bug reported by Jon Valdes on golang-dev, Jun 19 2014.
- // The receiver of a bound method closure may be of a multi-node type, E.
- // valueNode was reserving only a single node for it, so the
- // nodes used by the immediately following constraints
- // (e.g. param 'i') would get clobbered.
-
- var e E
- e.x1 = &a
- e.x2 = &a
- e.x3 = &a
- e.x4 = &a
- e.x5 = &a
-
- _ = e.f // form a closure---must reserve sizeof(E) nodes
-
- func(i I) {
- i.f() // must not crash the solver
- }(new(D))
-
- print(e.x1) // @pointsto main.a
- print(e.x2) // @pointsto main.a
- print(e.x3) // @pointsto main.a
- print(e.x4) // @pointsto main.a
- print(e.x5) // @pointsto main.a
-}
-
-func main() {
- func1()
- func2()
- func3()
- func4()
- func5()
- func6()
- func7()
- func8(1, 2, 3) // @line varargs
- func9()
-}
-
-// @calls -> main.main
-// @calls -> main.init
diff --git a/vendor/golang.org/x/tools/go/pointer/testdata/funcreflect.go b/vendor/golang.org/x/tools/go/pointer/testdata/funcreflect.go
deleted file mode 100644
index a0a9a5f..0000000
--- a/vendor/golang.org/x/tools/go/pointer/testdata/funcreflect.go
+++ /dev/null
@@ -1,130 +0,0 @@
-// +build ignore
-
-package main
-
-import "reflect"
-
-var zero, a, b int
-var false2 bool
-
-func f(p *int, q hasF) *int {
- print(p) // @pointsto main.a
- print(q) // @types *T
- print(q.(*T)) // @pointsto new@newT1:22
- return &b
-}
-
-func g(p *bool) (*int, *bool, hasF) {
- return &b, p, new(T) // @line newT2
-}
-
-func reflectValueCall() {
- rvf := reflect.ValueOf(f)
- res := rvf.Call([]reflect.Value{
- // argument order is not significant:
- reflect.ValueOf(new(T)), // @line newT1
- reflect.ValueOf(&a),
- })
- print(res[0].Interface()) // @types *int
- print(res[0].Interface().(*int)) // @pointsto main.b
-}
-
-// @calls main.reflectValueCall -> main.f
-
-func reflectValueCallIndirect() {
- rvf := reflect.ValueOf(g)
- call := rvf.Call // kids, don't try this at home
-
- // Indirect call uses shared contour.
- //
- // Also notice that argument position doesn't matter, and args
- // of inappropriate type (e.g. 'a') are ignored.
- res := call([]reflect.Value{
- reflect.ValueOf(&a),
- reflect.ValueOf(&false2),
- })
- res0 := res[0].Interface()
- print(res0) // @types *int | *bool | *T
- print(res0.(*int)) // @pointsto main.b
- print(res0.(*bool)) // @pointsto main.false2
- print(res0.(hasF)) // @types *T
- print(res0.(*T)) // @pointsto new@newT2:19
-}
-
-// @calls main.reflectValueCallIndirect -> (reflect.Value).Call$bound
-// @calls (reflect.Value).Call$bound -> main.g
-
-func reflectTypeInOut() {
- var f func(float64, bool) (string, int)
- print(reflect.Zero(reflect.TypeOf(f).In(0)).Interface()) // @types float64
- print(reflect.Zero(reflect.TypeOf(f).In(1)).Interface()) // @types bool
- print(reflect.Zero(reflect.TypeOf(f).In(-1)).Interface()) // @types float64 | bool
- print(reflect.Zero(reflect.TypeOf(f).In(zero)).Interface()) // @types float64 | bool
-
- print(reflect.Zero(reflect.TypeOf(f).Out(0)).Interface()) // @types string
- print(reflect.Zero(reflect.TypeOf(f).Out(1)).Interface()) // @types int
- print(reflect.Zero(reflect.TypeOf(f).Out(2)).Interface()) // @types
-
- print(reflect.Zero(reflect.TypeOf(3).Out(0)).Interface()) // @types
-}
-
-type hasF interface {
- F()
-}
-
-type T struct{}
-
-func (T) F() {}
-func (T) g(int) {}
-
-type U struct{}
-
-func (U) F(int) {}
-func (U) g(string) {}
-
-type I interface {
- f()
-}
-
-var nonconst string
-
-func reflectTypeMethodByName() {
- TU := reflect.TypeOf([]interface{}{T{}, U{}}[0])
- print(reflect.Zero(TU)) // @types T | U
-
- F, _ := TU.MethodByName("F")
- print(reflect.Zero(F.Type)) // @types func(T) | func(U, int)
- print(F.Func) // @pointsto (main.T).F | (main.U).F
-
- g, _ := TU.MethodByName("g")
- print(reflect.Zero(g.Type)) // @types func(T, int) | func(U, string)
- print(g.Func) // @pointsto (main.T).g | (main.U).g
-
- // Non-literal method names are treated less precisely.
- U := reflect.TypeOf(U{})
- X, _ := U.MethodByName(nonconst)
- print(reflect.Zero(X.Type)) // @types func(U, int) | func(U, string)
- print(X.Func) // @pointsto (main.U).F | (main.U).g
-
- // Interface methods.
- rThasF := reflect.TypeOf(new(hasF)).Elem()
- print(reflect.Zero(rThasF)) // @types hasF
- F2, _ := rThasF.MethodByName("F")
- print(reflect.Zero(F2.Type)) // @types func()
- print(F2.Func) // @pointsto
-
-}
-
-func reflectTypeMethod() {
- m := reflect.TypeOf(T{}).Method(0)
- print(reflect.Zero(m.Type)) // @types func(T) | func(T, int)
- print(m.Func) // @pointsto (main.T).F | (main.T).g
-}
-
-func main() {
- reflectValueCall()
- reflectValueCallIndirect()
- reflectTypeInOut()
- reflectTypeMethodByName()
- reflectTypeMethod()
-}
diff --git a/vendor/golang.org/x/tools/go/pointer/testdata/hello.go b/vendor/golang.org/x/tools/go/pointer/testdata/hello.go
deleted file mode 100644
index b81784b..0000000
--- a/vendor/golang.org/x/tools/go/pointer/testdata/hello.go
+++ /dev/null
@@ -1,27 +0,0 @@
-// +build ignore
-
-package main
-
-import (
- "fmt"
- "os"
-)
-
-type S int
-
-var theS S
-
-func (s *S) String() string {
- print(s) // @pointsto main.theS
- return ""
-}
-
-func main() {
- // os.Args is considered intrinsically allocated,
- // but may also be set explicitly (e.g. on Windows), hence '...'.
- print(os.Args) // @pointsto | ...
- fmt.Println("Hello, World!", &theS)
-}
-
-// @calls main.main -> fmt.Println
-// @calls (*fmt.pp).handleMethods -> (*main.S).String
diff --git a/vendor/golang.org/x/tools/go/pointer/testdata/interfaces.go b/vendor/golang.org/x/tools/go/pointer/testdata/interfaces.go
deleted file mode 100644
index 91c0fa9..0000000
--- a/vendor/golang.org/x/tools/go/pointer/testdata/interfaces.go
+++ /dev/null
@@ -1,152 +0,0 @@
-// +build ignore
-
-package main
-
-type I interface {
- f()
-}
-
-type C int
-
-func (*C) f() {}
-
-type D struct{ ptr *int }
-
-func (D) f() {}
-
-type E struct{}
-
-func (*E) f() {}
-
-var a, b int
-
-var unknown bool // defeat dead-code elimination
-
-func interface1() {
- var i interface{} = &a
- var j interface{} = D{&b}
- k := j
- if unknown {
- k = i
- }
-
- print(i) // @types *int
- print(j) // @types D
- print(k) // @types *int | D
-
- print(i.(*int)) // @pointsto main.a
- print(j.(*int)) // @pointsto
- print(k.(*int)) // @pointsto main.a
-
- print(i.(D).ptr) // @pointsto
- print(j.(D).ptr) // @pointsto main.b
- print(k.(D).ptr) // @pointsto main.b
-}
-
-func interface2() {
- var i I = (*C)(&a)
- var j I = D{&a}
- k := j
- if unknown {
- k = i
- }
-
- print(i) // @types *C
- print(j) // @types D
- print(k) // @types *C | D
- print(k) // @pointsto makeinterface:main.D | makeinterface:*main.C
-
- k.f()
- // @calls main.interface2 -> (*main.C).f
- // @calls main.interface2 -> (main.D).f
-
- print(i.(*C)) // @pointsto main.a
- print(j.(D).ptr) // @pointsto main.a
- print(k.(*C)) // @pointsto main.a
-
- switch x := k.(type) {
- case *C:
- print(x) // @pointsto main.a
- case D:
- print(x.ptr) // @pointsto main.a
- case *E:
- print(x) // @pointsto
- }
-}
-
-func interface3() {
- // There should be no backflow of concrete types from the type-switch to x.
- var x interface{} = 0
- print(x) // @types int
- switch x.(type) {
- case int:
- case string:
- }
-}
-
-func interface4() {
- var i interface{} = D{&a}
- if unknown {
- i = 123
- }
-
- print(i) // @types int | D
-
- j := i.(I) // interface narrowing type-assertion
- print(j) // @types D
- print(j.(D).ptr) // @pointsto main.a
-
- var l interface{} = j // interface widening assignment.
- print(l) // @types D
- print(l.(D).ptr) // @pointsto main.a
-
- m := j.(interface{}) // interface widening type-assertion.
- print(m) // @types D
- print(m.(D).ptr) // @pointsto main.a
-}
-
-// Interface method calls and value flow:
-
-type J interface {
- f(*int) *int
-}
-
-type P struct {
- x int
-}
-
-func (p *P) f(pi *int) *int {
- print(p) // @pointsto p@i5p:6
- print(pi) // @pointsto i@i5i:6
- return &p.x
-}
-
-func interface5() {
- var p P // @line i5p
- var j J = &p
- var i int // @line i5i
- print(j.f(&i)) // @pointsto p.x@i5p:6
- print(&i) // @pointsto i@i5i:6
-
- print(j) // @pointsto makeinterface:*main.P
-}
-
-// @calls main.interface5 -> (*main.P).f
-
-func interface6() {
- f := I.f
- print(f) // @pointsto (main.I).f$thunk
- f(new(struct{ D }))
-}
-
-// @calls main.interface6 -> (main.I).f$thunk
-// @calls (main.I).f$thunk -> (*struct{main.D}).f
-
-func main() {
- interface1()
- interface2()
- interface3()
- interface4()
- interface5()
- interface6()
-}
diff --git a/vendor/golang.org/x/tools/go/pointer/testdata/issue9002.go b/vendor/golang.org/x/tools/go/pointer/testdata/issue9002.go
deleted file mode 100644
index b7c2c61..0000000
--- a/vendor/golang.org/x/tools/go/pointer/testdata/issue9002.go
+++ /dev/null
@@ -1,17 +0,0 @@
-package main
-
-func main() {
- // Regression test for golang issue 9002.
- //
- // The two-result "value,ok" receive operation generated a
- // too-wide constraint loading (value int, ok bool), not bool,
- // from the channel.
- //
- // This bug manifested itself in an out-of-bounds array access
- // when the makechan object was the highest-numbered node, as in
- // this program.
- //
- // In more realistic programs it silently resulted in bogus
- // constraints.
- _, _ = <-make(chan int)
-}
diff --git a/vendor/golang.org/x/tools/go/pointer/testdata/mapreflect.go b/vendor/golang.org/x/tools/go/pointer/testdata/mapreflect.go
deleted file mode 100644
index bc5e7e6..0000000
--- a/vendor/golang.org/x/tools/go/pointer/testdata/mapreflect.go
+++ /dev/null
@@ -1,117 +0,0 @@
-// +build ignore
-
-package main
-
-// Test of maps with reflection.
-
-import "reflect"
-
-var a int
-var b bool
-
-func reflectMapKeysIndex() {
- m := make(map[*int]*bool) // @line mr1make
- m[&a] = &b
-
- mrv := reflect.ValueOf(m)
- print(mrv.Interface()) // @types map[*int]*bool
- print(mrv.Interface().(map[*int]*bool)) // @pointsto makemap@mr1make:11
- print(mrv) // @pointsto makeinterface:map[*int]*bool
- print(mrv) // @types map[*int]*bool
-
- keys := mrv.MapKeys()
- print(keys) // @pointsto
- for _, k := range keys {
- print(k) // @pointsto
- print(k) // @types *int
- print(k.Interface()) // @types *int
- print(k.Interface().(*int)) // @pointsto main.a
-
- v := mrv.MapIndex(k)
- print(v.Interface()) // @types *bool
- print(v.Interface().(*bool)) // @pointsto main.b
- }
-}
-
-func reflectSetMapIndex() {
- m := make(map[*int]*bool)
- mrv := reflect.ValueOf(m)
- mrv.SetMapIndex(reflect.ValueOf(&a), reflect.ValueOf(&b))
-
- print(m[nil]) // @pointsto main.b
-
- for _, k := range mrv.MapKeys() {
- print(k.Interface()) // @types *int
- print(k.Interface().(*int)) // @pointsto main.a
- }
-
- tmap := reflect.TypeOf(m)
- // types.EvalNode won't let us refer to non-exported types:
- // print(tmap) // #@types *reflect.rtype
- print(tmap) // @pointsto map[*int]*bool
-
- zmap := reflect.Zero(tmap)
- print(zmap) // @pointsto
- print(zmap.Interface()) // @pointsto
-
- print(tmap.Key()) // @pointsto *int
- print(tmap.Elem()) // @pointsto *bool
- print(reflect.Zero(tmap.Key())) // @pointsto
- print(reflect.Zero(tmap.Key()).Interface()) // @pointsto
- print(reflect.Zero(tmap.Key()).Interface()) // @types *int
- print(reflect.Zero(tmap.Elem())) // @pointsto
- print(reflect.Zero(tmap.Elem()).Interface()) // @pointsto
- print(reflect.Zero(tmap.Elem()).Interface()) // @types *bool
-}
-
-func reflectSetMapIndexInterface() {
- // Exercises reflect.Value conversions to/from interfaces:
- // a different code path than for concrete types.
- m := make(map[interface{}]interface{})
- reflect.ValueOf(m).SetMapIndex(reflect.ValueOf(&a), reflect.ValueOf(&b))
- for k, v := range m {
- print(k) // @types *int
- print(k.(*int)) // @pointsto main.a
- print(v) // @types *bool
- print(v.(*bool)) // @pointsto main.b
- }
-}
-
-func reflectSetMapIndexAssignable() {
- // SetMapIndex performs implicit assignability conversions.
- type I *int
- type J *int
-
- str := reflect.ValueOf("")
-
- // *int is assignable to I.
- m1 := make(map[string]I)
- reflect.ValueOf(m1).SetMapIndex(str, reflect.ValueOf(new(int))) // @line int
- print(m1[""]) // @pointsto new@int:58
-
- // I is assignable to I.
- m2 := make(map[string]I)
- reflect.ValueOf(m2).SetMapIndex(str, reflect.ValueOf(I(new(int)))) // @line I
- print(m2[""]) // @pointsto new@I:60
-
- // J is not assignable to I.
- m3 := make(map[string]I)
- reflect.ValueOf(m3).SetMapIndex(str, reflect.ValueOf(J(new(int))))
- print(m3[""]) // @pointsto
-}
-
-func reflectMakeMap() {
- t := reflect.TypeOf(map[*int]*bool(nil))
- v := reflect.MakeMap(t)
- print(v) // @types map[*int]*bool
- print(v) // @pointsto
-}
-
-func main() {
- reflectMapKeysIndex()
- reflectSetMapIndex()
- reflectSetMapIndexInterface()
- reflectSetMapIndexAssignable()
- reflectMakeMap()
- // TODO(adonovan): reflect.MapOf(Type)
-}
diff --git a/vendor/golang.org/x/tools/go/pointer/testdata/maps.go b/vendor/golang.org/x/tools/go/pointer/testdata/maps.go
deleted file mode 100644
index 6729304..0000000
--- a/vendor/golang.org/x/tools/go/pointer/testdata/maps.go
+++ /dev/null
@@ -1,74 +0,0 @@
-// +build ignore
-
-package main
-
-// Test of maps.
-
-var a, b, c int
-
-func maps1() {
- m1 := map[*int]*int{&a: &b} // @line m1m1
- m2 := make(map[*int]*int) // @line m1m2
- m2[&b] = &a
-
- print(m1[nil]) // @pointsto main.b | main.c
- print(m2[nil]) // @pointsto main.a
-
- print(m1) // @pointsto makemap@m1m1:21
- print(m2) // @pointsto makemap@m1m2:12
-
- m1[&b] = &c
-
- for k, v := range m1 {
- print(k) // @pointsto main.a | main.b
- print(v) // @pointsto main.b | main.c
- }
-
- for k, v := range m2 {
- print(k) // @pointsto main.b
- print(v) // @pointsto main.a
- }
-
- // Lookup doesn't create any aliases.
- print(m2[&c]) // @pointsto main.a
- if _, ok := m2[&a]; ok {
- print(m2[&c]) // @pointsto main.a
- }
-}
-
-func maps2() {
- m1 := map[*int]*int{&a: &b}
- m2 := map[*int]*int{&b: &c}
- _ = []map[*int]*int{m1, m2} // (no spurious merging of m1, m2)
-
- print(m1[nil]) // @pointsto main.b
- print(m2[nil]) // @pointsto main.c
-}
-
-var g int
-
-func maps3() {
- // Regression test for a constraint generation bug for map range
- // loops in which the key is unused: the (ok, k, v) tuple
- // returned by ssa.Next may have type 'invalid' for the k and/or
- // v components, so copying the map key or value may cause
- // miswiring if the key has >1 components. In the worst case,
- // this causes a crash. The test below used to report that
- // pts(v) includes not just main.g but new(float64) too, which
- // is ill-typed.
-
- // sizeof(K) > 1, abstractly
- type K struct{ a, b *float64 }
- k := K{new(float64), nil}
- m := map[K]*int{k: &g}
-
- for _, v := range m {
- print(v) // @pointsto main.g
- }
-}
-
-func main() {
- maps1()
- maps2()
- maps3()
-}
diff --git a/vendor/golang.org/x/tools/go/pointer/testdata/panic.go b/vendor/golang.org/x/tools/go/pointer/testdata/panic.go
deleted file mode 100644
index ee8a766..0000000
--- a/vendor/golang.org/x/tools/go/pointer/testdata/panic.go
+++ /dev/null
@@ -1,36 +0,0 @@
-// +build ignore
-
-package main
-
-// Test of value flow from panic() to recover().
-// We model them as stores/loads of a global location.
-// We ignore concrete panic types originating from the runtime.
-
-var someval int
-
-type myPanic struct{}
-
-func f(int) {}
-
-func g() string { return "" }
-
-func deadcode() {
- panic(123) // not reached
-}
-
-func main() {
- switch someval {
- case 0:
- panic("oops")
- case 1:
- panic(myPanic{})
- case 2:
- panic(f)
- case 3:
- panic(g)
- }
- ex := recover()
- print(ex) // @types myPanic | string | func(int) | func() string
- print(ex.(func(int))) // @pointsto main.f
- print(ex.(func() string)) // @pointsto main.g
-}
diff --git a/vendor/golang.org/x/tools/go/pointer/testdata/recur.go b/vendor/golang.org/x/tools/go/pointer/testdata/recur.go
deleted file mode 100644
index 4c7229d..0000000
--- a/vendor/golang.org/x/tools/go/pointer/testdata/recur.go
+++ /dev/null
@@ -1,11 +0,0 @@
-// +build ignore
-
-package main
-
-// Analysis abstraction of recursive calls is finite.
-
-func main() {
- main()
-}
-
-// @calls main.main -> main.main
diff --git a/vendor/golang.org/x/tools/go/pointer/testdata/reflect.go b/vendor/golang.org/x/tools/go/pointer/testdata/reflect.go
deleted file mode 100644
index 6b8d0f2..0000000
--- a/vendor/golang.org/x/tools/go/pointer/testdata/reflect.go
+++ /dev/null
@@ -1,115 +0,0 @@
-// +build ignore
-
-package main
-
-import "reflect"
-import "unsafe"
-
-var a, b int
-var unknown bool
-
-func reflectIndirect() {
- ptr := &a
- // Pointer:
- print(reflect.Indirect(reflect.ValueOf(&ptr)).Interface().(*int)) // @pointsto main.a
- // Non-pointer:
- print(reflect.Indirect(reflect.ValueOf([]*int{ptr})).Interface().([]*int)[0]) // @pointsto main.a
-}
-
-func reflectNewAt() {
- var x [8]byte
- print(reflect.NewAt(reflect.TypeOf(3), unsafe.Pointer(&x)).Interface()) // @types *int
-}
-
-// @warning "unsound: main.reflectNewAt contains a reflect.NewAt.. call"
-
-func reflectTypeOf() {
- t := reflect.TypeOf(3)
- if unknown {
- t = reflect.TypeOf("foo")
- }
- // TODO(adonovan): make types.Eval let us refer to unexported types.
- print(t) // #@types *reflect.rtype
- print(reflect.Zero(t).Interface()) // @types int | string
- newint := reflect.New(t).Interface() // @line rtonew
- print(newint) // @types *int | *string
- print(newint.(*int)) // @pointsto
- print(newint.(*string)) // @pointsto
-}
-
-func reflectTypeElem() {
- print(reflect.Zero(reflect.TypeOf(&a).Elem()).Interface()) // @types int
- print(reflect.Zero(reflect.TypeOf([]string{}).Elem()).Interface()) // @types string
- print(reflect.Zero(reflect.TypeOf(make(chan bool)).Elem()).Interface()) // @types bool
- print(reflect.Zero(reflect.TypeOf(make(map[string]float64)).Elem()).Interface()) // @types float64
- print(reflect.Zero(reflect.TypeOf([3]complex64{}).Elem()).Interface()) // @types complex64
- print(reflect.Zero(reflect.TypeOf(3).Elem()).Interface()) // @types
- print(reflect.Zero(reflect.TypeOf(new(interface{})).Elem())) // @types interface{}
- print(reflect.Zero(reflect.TypeOf(new(interface{})).Elem()).Interface()) // @types
-}
-
-// reflect.Values within reflect.Values.
-func metareflection() {
- // "box" a *int twice, unbox it twice.
- v0 := reflect.ValueOf(&a)
- print(v0) // @types *int
- v1 := reflect.ValueOf(v0) // box
- print(v1) // @types reflect.Value
- v2 := reflect.ValueOf(v1) // box
- print(v2) // @types reflect.Value
- v1a := v2.Interface().(reflect.Value) // unbox
- print(v1a) // @types reflect.Value
- v0a := v1a.Interface().(reflect.Value) // unbox
- print(v0a) // @types *int
- print(v0a.Interface().(*int)) // @pointsto main.a
-
- // "box" an interface{} lvalue twice, unbox it twice.
- var iface interface{} = 3
- x0 := reflect.ValueOf(&iface).Elem()
- print(x0) // @types interface{}
- x1 := reflect.ValueOf(x0) // box
- print(x1) // @types reflect.Value
- x2 := reflect.ValueOf(x1) // box
- print(x2) // @types reflect.Value
- x1a := x2.Interface().(reflect.Value) // unbox
- print(x1a) // @types reflect.Value
- x0a := x1a.Interface().(reflect.Value) // unbox
- print(x0a) // @types interface{}
- print(x0a.Interface()) // @types int
-}
-
-type T struct{}
-
-// When the output of a type constructor flows to its input, we must
-// bound the set of types created to ensure termination of the algorithm.
-func typeCycle() {
- t := reflect.TypeOf(0)
- u := reflect.TypeOf("")
- v := reflect.TypeOf(T{})
- for unknown {
- t = reflect.PtrTo(t)
- t = reflect.SliceOf(t)
-
- u = reflect.SliceOf(u)
-
- if unknown {
- v = reflect.ChanOf(reflect.BothDir, v)
- } else {
- v = reflect.PtrTo(v)
- }
- }
-
- // Type height is bounded to about 4 map/slice/chan/pointer constructors.
- print(reflect.Zero(t).Interface()) // @types int | []*int | []*[]*int
- print(reflect.Zero(u).Interface()) // @types string | []string | [][]string | [][][]string | [][][][]string
- print(reflect.Zero(v).Interface()) // @types T | *T | **T | ***T | ****T | chan T | *chan T | **chan T | chan *T | *chan *T | chan **T | chan ***T | chan chan T | chan *chan T | chan chan *T
-}
-
-func main() {
- reflectIndirect()
- reflectNewAt()
- reflectTypeOf()
- reflectTypeElem()
- metareflection()
- typeCycle()
-}
diff --git a/vendor/golang.org/x/tools/go/pointer/testdata/rtti.go b/vendor/golang.org/x/tools/go/pointer/testdata/rtti.go
deleted file mode 100644
index 88e1798..0000000
--- a/vendor/golang.org/x/tools/go/pointer/testdata/rtti.go
+++ /dev/null
@@ -1,29 +0,0 @@
-package main
-
-// Regression test for guru crash
-// https://code.google.com/p/go/issues/detail?id=6605
-//
-// Using reflection, methods may be called on types that are not the
-// operand of any ssa.MakeInterface instruction. In this example,
-// (Y).F is called by deriving the type Y from *Y. Prior to the fix,
-// no RTTI (or method set) for type Y was included in the program, so
-// the F() call would crash.
-
-import "reflect"
-
-var a int
-
-type X struct{}
-
-func (X) F() *int {
- return &a
-}
-
-type I interface {
- F() *int
-}
-
-func main() {
- type Y struct{ X }
- print(reflect.Indirect(reflect.ValueOf(new(Y))).Interface().(I).F()) // @pointsto main.a
-}
diff --git a/vendor/golang.org/x/tools/go/pointer/testdata/structreflect.go b/vendor/golang.org/x/tools/go/pointer/testdata/structreflect.go
deleted file mode 100644
index 9fb49f5..0000000
--- a/vendor/golang.org/x/tools/go/pointer/testdata/structreflect.go
+++ /dev/null
@@ -1,45 +0,0 @@
-// +build ignore
-
-package main
-
-import "reflect"
-
-type A struct {
- f *int
- g interface{}
- h bool
-}
-
-var dyn string
-
-func reflectTypeFieldByName() {
- f, _ := reflect.TypeOf(A{}).FieldByName("f")
- print(f.Type) // @pointsto *int
-
- g, _ := reflect.TypeOf(A{}).FieldByName("g")
- print(g.Type) // @pointsto interface{}
- print(reflect.Zero(g.Type)) // @pointsto
- print(reflect.Zero(g.Type)) // @types interface{}
-
- print(reflect.Zero(g.Type).Interface()) // @pointsto
- print(reflect.Zero(g.Type).Interface()) // @types
-
- h, _ := reflect.TypeOf(A{}).FieldByName("h")
- print(h.Type) // @pointsto bool
-
- missing, _ := reflect.TypeOf(A{}).FieldByName("missing")
- print(missing.Type) // @pointsto
-
- dyn, _ := reflect.TypeOf(A{}).FieldByName(dyn)
- print(dyn.Type) // @pointsto *int | bool | interface{}
-}
-
-func reflectTypeField() {
- fld := reflect.TypeOf(A{}).Field(0)
- print(fld.Type) // @pointsto *int | bool | interface{}
-}
-
-func main() {
- reflectTypeFieldByName()
- reflectTypeField()
-}
diff --git a/vendor/golang.org/x/tools/go/pointer/testdata/structs.go b/vendor/golang.org/x/tools/go/pointer/testdata/structs.go
deleted file mode 100644
index 9036d60..0000000
--- a/vendor/golang.org/x/tools/go/pointer/testdata/structs.go
+++ /dev/null
@@ -1,100 +0,0 @@
-// +build ignore
-
-package main
-
-var unknown bool // defeat dead-code elimination
-
-var p, q int
-
-type A struct {
- f *int
- g interface{}
-}
-
-func (a A) m1() {
- print(a.f) // @pointsto main.p
-}
-
-func (a *A) m2() {
- print(a) // @pointsto complit.A@struct1s:9
- print(a.f) // @pointsto main.p
-}
-
-type B struct {
- h *int
- A
-}
-
-func structs1() {
- b := &B{ // @line struct1s
- h: &q,
- }
- b.f = &p
- b.g = b
-
- print(b.h) // @pointsto main.q
- print(b.f) // @pointsto main.p
- print(b.g) // @types *B
-
- ptr := &b.f
- print(*ptr) // @pointsto main.p
-
- b.m1()
- b.m2()
-}
-
-// @calls main.structs1 -> (main.A).m1
-// @calls main.structs1 -> (*main.A).m2
-// @calls (*main.B).m1 -> (main.A).m1
-// @calls (*main.B).m2 -> (*main.A).m2
-
-type T struct {
- x int
- y int
-}
-
-type S struct {
- a [3]T
- b *[3]T
- c [3]*T
-}
-
-func structs2() {
- var s S // @line s2s
- print(&s) // @pointsto s@s2s:6
- print(&s.a) // @pointsto s.a@s2s:6
- print(&s.a[0]) // @pointsto s.a[*]@s2s:6
- print(&s.a[0].x) // @pointsto s.a[*].x@s2s:6
- print(&s.a[0].y) // @pointsto s.a[*].y@s2s:6
- print(&s.b) // @pointsto s.b@s2s:6
- print(&s.b[0]) // @pointsto
- print(&s.b[0].x) // @pointsto
- print(&s.b[0].y) // @pointsto
- print(&s.c) // @pointsto s.c@s2s:6
- print(&s.c[0]) // @pointsto s.c[*]@s2s:6
- print(&s.c[0].x) // @pointsto
- print(&s.c[0].y) // @pointsto
-
- var s2 S // @line s2s2
- s2.b = new([3]T) // @line s2s2b
- print(s2.b) // @pointsto new@s2s2b:12
- print(&s2.b) // @pointsto s2.b@s2s2:6
- print(&s2.b[0]) // @pointsto new[*]@s2s2b:12
- print(&s2.b[0].x) // @pointsto new[*].x@s2s2b:12
- print(&s2.b[0].y) // @pointsto new[*].y@s2s2b:12
- print(&s2.c[0].x) // @pointsto
- print(&s2.c[0].y) // @pointsto
-
- var s3 S // @line s2s3
- s3.c[2] = new(T) // @line s2s3c
- print(&s3.c) // @pointsto s3.c@s2s3:6
- print(s3.c[1]) // @pointsto new@s2s3c:15
- print(&s3.c[1]) // @pointsto s3.c[*]@s2s3:6
- print(&s3.c[1].x) // @pointsto new.x@s2s3c:15
- print(&s3.c[1].y) // @pointsto new.y@s2s3c:15
-}
-
-func main() {
- structs1()
- structs2()
-}
diff --git a/vendor/golang.org/x/tools/go/pointer/testdata/timer.go b/vendor/golang.org/x/tools/go/pointer/testdata/timer.go
deleted file mode 100644
index 465d081..0000000
--- a/vendor/golang.org/x/tools/go/pointer/testdata/timer.go
+++ /dev/null
@@ -1,24 +0,0 @@
-// +build ignore
-
-package main
-
-import "time"
-
-func after() {}
-
-func main() {
- // @calls time.startTimer -> time.sendTime
- ticker := time.NewTicker(1)
- <-ticker.C
-
- // @calls time.startTimer -> time.sendTime
- timer := time.NewTimer(time.Second)
- <-timer.C
-
- // @calls time.startTimer -> time.goFunc
- // @calls time.goFunc -> main.after
- timer = time.AfterFunc(time.Second, after)
- <-timer.C
-}
-
-// @calls time.sendTime -> time.Now
diff --git a/vendor/golang.org/x/tools/go/pointer/util.go b/vendor/golang.org/x/tools/go/pointer/util.go
deleted file mode 100644
index 683fddd..0000000
--- a/vendor/golang.org/x/tools/go/pointer/util.go
+++ /dev/null
@@ -1,313 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package pointer
-
-import (
- "bytes"
- "fmt"
- "go/types"
- "log"
- "os"
- "os/exec"
- "runtime"
- "time"
-
- "golang.org/x/tools/container/intsets"
-)
-
-// CanPoint reports whether the type T is pointerlike,
-// for the purposes of this analysis.
-func CanPoint(T types.Type) bool {
- switch T := T.(type) {
- case *types.Named:
- if obj := T.Obj(); obj.Name() == "Value" && obj.Pkg().Path() == "reflect" {
- return true // treat reflect.Value like interface{}
- }
- return CanPoint(T.Underlying())
- case *types.Pointer, *types.Interface, *types.Map, *types.Chan, *types.Signature, *types.Slice:
- return true
- }
-
- return false // array struct tuple builtin basic
-}
-
-// CanHaveDynamicTypes reports whether the type T can "hold" dynamic types,
-// i.e. is an interface (incl. reflect.Type) or a reflect.Value.
-//
-func CanHaveDynamicTypes(T types.Type) bool {
- switch T := T.(type) {
- case *types.Named:
- if obj := T.Obj(); obj.Name() == "Value" && obj.Pkg().Path() == "reflect" {
- return true // reflect.Value
- }
- return CanHaveDynamicTypes(T.Underlying())
- case *types.Interface:
- return true
- }
- return false
-}
-
-func isInterface(T types.Type) bool { return types.IsInterface(T) }
-
-// mustDeref returns the element type of its argument, which must be a
-// pointer; panic ensues otherwise.
-func mustDeref(typ types.Type) types.Type {
- return typ.Underlying().(*types.Pointer).Elem()
-}
-
-// deref returns a pointer's element type; otherwise it returns typ.
-func deref(typ types.Type) types.Type {
- if p, ok := typ.Underlying().(*types.Pointer); ok {
- return p.Elem()
- }
- return typ
-}
-
-// A fieldInfo describes one subelement (node) of the flattening-out
-// of a type T: the subelement's type and its path from the root of T.
-//
-// For example, for this type:
-// type line struct{ points []struct{x, y int} }
-// flatten() of the inner struct yields the following []fieldInfo:
-// struct{ x, y int } ""
-// int ".x"
-// int ".y"
-// and flatten(line) yields:
-// struct{ points []struct{x, y int} } ""
-// struct{ x, y int } ".points[*]"
-// int ".points[*].x
-// int ".points[*].y"
-//
-type fieldInfo struct {
- typ types.Type
-
- // op and tail describe the path to the element (e.g. ".a#2.b[*].c").
- op interface{} // *Array: true; *Tuple: int; *Struct: *types.Var; *Named: nil
- tail *fieldInfo
-}
-
-// path returns a user-friendly string describing the subelement path.
-//
-func (fi *fieldInfo) path() string {
- var buf bytes.Buffer
- for p := fi; p != nil; p = p.tail {
- switch op := p.op.(type) {
- case bool:
- fmt.Fprintf(&buf, "[*]")
- case int:
- fmt.Fprintf(&buf, "#%d", op)
- case *types.Var:
- fmt.Fprintf(&buf, ".%s", op.Name())
- }
- }
- return buf.String()
-}
-
-// flatten returns a list of directly contained fields in the preorder
-// traversal of the type tree of t. The resulting elements are all
-// scalars (basic types or pointerlike types), except for struct/array
-// "identity" nodes, whose type is that of the aggregate.
-//
-// reflect.Value is considered pointerlike, similar to interface{}.
-//
-// Callers must not mutate the result.
-//
-func (a *analysis) flatten(t types.Type) []*fieldInfo {
- fl, ok := a.flattenMemo[t]
- if !ok {
- switch t := t.(type) {
- case *types.Named:
- u := t.Underlying()
- if isInterface(u) {
- // Debuggability hack: don't remove
- // the named type from interfaces as
- // they're very verbose.
- fl = append(fl, &fieldInfo{typ: t})
- } else {
- fl = a.flatten(u)
- }
-
- case *types.Basic,
- *types.Signature,
- *types.Chan,
- *types.Map,
- *types.Interface,
- *types.Slice,
- *types.Pointer:
- fl = append(fl, &fieldInfo{typ: t})
-
- case *types.Array:
- fl = append(fl, &fieldInfo{typ: t}) // identity node
- for _, fi := range a.flatten(t.Elem()) {
- fl = append(fl, &fieldInfo{typ: fi.typ, op: true, tail: fi})
- }
-
- case *types.Struct:
- fl = append(fl, &fieldInfo{typ: t}) // identity node
- for i, n := 0, t.NumFields(); i < n; i++ {
- f := t.Field(i)
- for _, fi := range a.flatten(f.Type()) {
- fl = append(fl, &fieldInfo{typ: fi.typ, op: f, tail: fi})
- }
- }
-
- case *types.Tuple:
- // No identity node: tuples are never address-taken.
- n := t.Len()
- if n == 1 {
- // Don't add a fieldInfo link for singletons,
- // e.g. in params/results.
- fl = append(fl, a.flatten(t.At(0).Type())...)
- } else {
- for i := 0; i < n; i++ {
- f := t.At(i)
- for _, fi := range a.flatten(f.Type()) {
- fl = append(fl, &fieldInfo{typ: fi.typ, op: i, tail: fi})
- }
- }
- }
-
- default:
- panic(fmt.Sprintf("cannot flatten unsupported type %T", t))
- }
-
- a.flattenMemo[t] = fl
- }
-
- return fl
-}
-
-// sizeof returns the number of pointerlike abstractions (nodes) in the type t.
-func (a *analysis) sizeof(t types.Type) uint32 {
- return uint32(len(a.flatten(t)))
-}
-
-// shouldTrack reports whether object type T contains (recursively)
-// any fields whose addresses should be tracked.
-func (a *analysis) shouldTrack(T types.Type) bool {
- if a.track == trackAll {
- return true // fast path
- }
- track, ok := a.trackTypes[T]
- if !ok {
- a.trackTypes[T] = true // break cycles conservatively
- // NB: reflect.Value, reflect.Type are pre-populated to true.
- for _, fi := range a.flatten(T) {
- switch ft := fi.typ.Underlying().(type) {
- case *types.Interface, *types.Signature:
- track = true // needed for callgraph
- case *types.Basic:
- // no-op
- case *types.Chan:
- track = a.track&trackChan != 0 || a.shouldTrack(ft.Elem())
- case *types.Map:
- track = a.track&trackMap != 0 || a.shouldTrack(ft.Key()) || a.shouldTrack(ft.Elem())
- case *types.Slice:
- track = a.track&trackSlice != 0 || a.shouldTrack(ft.Elem())
- case *types.Pointer:
- track = a.track&trackPtr != 0 || a.shouldTrack(ft.Elem())
- case *types.Array, *types.Struct:
- // No need to look at field types since they will follow (flattened).
- default:
- // Includes *types.Tuple, which are never address-taken.
- panic(ft)
- }
- if track {
- break
- }
- }
- a.trackTypes[T] = track
- if !track && a.log != nil {
- fmt.Fprintf(a.log, "\ttype not tracked: %s\n", T)
- }
- }
- return track
-}
-
-// offsetOf returns the (abstract) offset of field index within struct
-// or tuple typ.
-func (a *analysis) offsetOf(typ types.Type, index int) uint32 {
- var offset uint32
- switch t := typ.Underlying().(type) {
- case *types.Tuple:
- for i := 0; i < index; i++ {
- offset += a.sizeof(t.At(i).Type())
- }
- case *types.Struct:
- offset++ // the node for the struct itself
- for i := 0; i < index; i++ {
- offset += a.sizeof(t.Field(i).Type())
- }
- default:
- panic(fmt.Sprintf("offsetOf(%s : %T)", typ, typ))
- }
- return offset
-}
-
-// sliceToArray returns the type representing the arrays to which
-// slice type slice points.
-func sliceToArray(slice types.Type) *types.Array {
- return types.NewArray(slice.Underlying().(*types.Slice).Elem(), 1)
-}
-
-// Node set -------------------------------------------------------------------
-
-type nodeset struct {
- intsets.Sparse
-}
-
-func (ns *nodeset) String() string {
- var buf bytes.Buffer
- buf.WriteRune('{')
- var space [50]int
- for i, n := range ns.AppendTo(space[:0]) {
- if i > 0 {
- buf.WriteString(", ")
- }
- buf.WriteRune('n')
- fmt.Fprintf(&buf, "%d", n)
- }
- buf.WriteRune('}')
- return buf.String()
-}
-
-func (ns *nodeset) add(n nodeid) bool {
- return ns.Sparse.Insert(int(n))
-}
-
-func (x *nodeset) addAll(y *nodeset) bool {
- return x.UnionWith(&y.Sparse)
-}
-
-// Profiling & debugging -------------------------------------------------------
-
-var timers = make(map[string]time.Time)
-
-func start(name string) {
- if debugTimers {
- timers[name] = time.Now()
- log.Printf("%s...\n", name)
- }
-}
-
-func stop(name string) {
- if debugTimers {
- log.Printf("%s took %s\n", name, time.Since(timers[name]))
- }
-}
-
-// diff runs the command "diff a b" and reports its success.
-func diff(a, b string) bool {
- var cmd *exec.Cmd
- switch runtime.GOOS {
- case "plan9":
- cmd = exec.Command("/bin/diff", "-c", a, b)
- default:
- cmd = exec.Command("/usr/bin/diff", "-u", a, b)
- }
- cmd.Stdout = os.Stderr
- cmd.Stderr = os.Stderr
- return cmd.Run() == nil
-}
diff --git a/vendor/golang.org/x/tools/go/ssa/blockopt.go b/vendor/golang.org/x/tools/go/ssa/blockopt.go
deleted file mode 100644
index e79260a..0000000
--- a/vendor/golang.org/x/tools/go/ssa/blockopt.go
+++ /dev/null
@@ -1,187 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package ssa
-
-// Simple block optimizations to simplify the control flow graph.
-
-// TODO(adonovan): opt: instead of creating several "unreachable" blocks
-// per function in the Builder, reuse a single one (e.g. at Blocks[1])
-// to reduce garbage.
-
-import (
- "fmt"
- "os"
-)
-
-// If true, perform sanity checking and show progress at each
-// successive iteration of optimizeBlocks. Very verbose.
-const debugBlockOpt = false
-
-// markReachable sets Index=-1 for all blocks reachable from b.
-func markReachable(b *BasicBlock) {
- b.Index = -1
- for _, succ := range b.Succs {
- if succ.Index == 0 {
- markReachable(succ)
- }
- }
-}
-
-// deleteUnreachableBlocks marks all reachable blocks of f and
-// eliminates (nils) all others, including possibly cyclic subgraphs.
-//
-func deleteUnreachableBlocks(f *Function) {
- const white, black = 0, -1
- // We borrow b.Index temporarily as the mark bit.
- for _, b := range f.Blocks {
- b.Index = white
- }
- markReachable(f.Blocks[0])
- if f.Recover != nil {
- markReachable(f.Recover)
- }
- for i, b := range f.Blocks {
- if b.Index == white {
- for _, c := range b.Succs {
- if c.Index == black {
- c.removePred(b) // delete white->black edge
- }
- }
- if debugBlockOpt {
- fmt.Fprintln(os.Stderr, "unreachable", b)
- }
- f.Blocks[i] = nil // delete b
- }
- }
- f.removeNilBlocks()
-}
-
-// jumpThreading attempts to apply simple jump-threading to block b,
-// in which a->b->c become a->c if b is just a Jump.
-// The result is true if the optimization was applied.
-//
-func jumpThreading(f *Function, b *BasicBlock) bool {
- if b.Index == 0 {
- return false // don't apply to entry block
- }
- if b.Instrs == nil {
- return false
- }
- if _, ok := b.Instrs[0].(*Jump); !ok {
- return false // not just a jump
- }
- c := b.Succs[0]
- if c == b {
- return false // don't apply to degenerate jump-to-self.
- }
- if c.hasPhi() {
- return false // not sound without more effort
- }
- for j, a := range b.Preds {
- a.replaceSucc(b, c)
-
- // If a now has two edges to c, replace its degenerate If by Jump.
- if len(a.Succs) == 2 && a.Succs[0] == c && a.Succs[1] == c {
- jump := new(Jump)
- jump.setBlock(a)
- a.Instrs[len(a.Instrs)-1] = jump
- a.Succs = a.Succs[:1]
- c.removePred(b)
- } else {
- if j == 0 {
- c.replacePred(b, a)
- } else {
- c.Preds = append(c.Preds, a)
- }
- }
-
- if debugBlockOpt {
- fmt.Fprintln(os.Stderr, "jumpThreading", a, b, c)
- }
- }
- f.Blocks[b.Index] = nil // delete b
- return true
-}
-
-// fuseBlocks attempts to apply the block fusion optimization to block
-// a, in which a->b becomes ab if len(a.Succs)==len(b.Preds)==1.
-// The result is true if the optimization was applied.
-//
-func fuseBlocks(f *Function, a *BasicBlock) bool {
- if len(a.Succs) != 1 {
- return false
- }
- b := a.Succs[0]
- if len(b.Preds) != 1 {
- return false
- }
-
- // Degenerate &&/|| ops may result in a straight-line CFG
- // containing φ-nodes. (Ideally we'd replace such them with
- // their sole operand but that requires Referrers, built later.)
- if b.hasPhi() {
- return false // not sound without further effort
- }
-
- // Eliminate jump at end of A, then copy all of B across.
- a.Instrs = append(a.Instrs[:len(a.Instrs)-1], b.Instrs...)
- for _, instr := range b.Instrs {
- instr.setBlock(a)
- }
-
- // A inherits B's successors
- a.Succs = append(a.succs2[:0], b.Succs...)
-
- // Fix up Preds links of all successors of B.
- for _, c := range b.Succs {
- c.replacePred(b, a)
- }
-
- if debugBlockOpt {
- fmt.Fprintln(os.Stderr, "fuseBlocks", a, b)
- }
-
- f.Blocks[b.Index] = nil // delete b
- return true
-}
-
-// optimizeBlocks() performs some simple block optimizations on a
-// completed function: dead block elimination, block fusion, jump
-// threading.
-//
-func optimizeBlocks(f *Function) {
- deleteUnreachableBlocks(f)
-
- // Loop until no further progress.
- changed := true
- for changed {
- changed = false
-
- if debugBlockOpt {
- f.WriteTo(os.Stderr)
- mustSanityCheck(f, nil)
- }
-
- for _, b := range f.Blocks {
- // f.Blocks will temporarily contain nils to indicate
- // deleted blocks; we remove them at the end.
- if b == nil {
- continue
- }
-
- // Fuse blocks. b->c becomes bc.
- if fuseBlocks(f, b) {
- changed = true
- }
-
- // a->b->c becomes a->c if b contains only a Jump.
- if jumpThreading(f, b) {
- changed = true
- continue // (b was disconnected)
- }
- }
- }
- f.removeNilBlocks()
-}
diff --git a/vendor/golang.org/x/tools/go/ssa/builder.go b/vendor/golang.org/x/tools/go/ssa/builder.go
deleted file mode 100644
index 44abc5b..0000000
--- a/vendor/golang.org/x/tools/go/ssa/builder.go
+++ /dev/null
@@ -1,2379 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package ssa
-
-// This file implements the BUILD phase of SSA construction.
-//
-// SSA construction has two phases, CREATE and BUILD. In the CREATE phase
-// (create.go), all packages are constructed and type-checked and
-// definitions of all package members are created, method-sets are
-// computed, and wrapper methods are synthesized.
-// ssa.Packages are created in arbitrary order.
-//
-// In the BUILD phase (builder.go), the builder traverses the AST of
-// each Go source function and generates SSA instructions for the
-// function body. Initializer expressions for package-level variables
-// are emitted to the package's init() function in the order specified
-// by go/types.Info.InitOrder, then code for each function in the
-// package is generated in lexical order.
-// The BUILD phases for distinct packages are independent and are
-// executed in parallel.
-//
-// TODO(adonovan): indeed, building functions is now embarrassingly parallel.
-// Audit for concurrency then benchmark using more goroutines.
-//
-// The builder's and Program's indices (maps) are populated and
-// mutated during the CREATE phase, but during the BUILD phase they
-// remain constant. The sole exception is Prog.methodSets and its
-// related maps, which are protected by a dedicated mutex.
-
-import (
- "fmt"
- "go/ast"
- exact "go/constant"
- "go/token"
- "go/types"
- "os"
- "sync"
-)
-
-type opaqueType struct {
- types.Type
- name string
-}
-
-func (t *opaqueType) String() string { return t.name }
-
-var (
- varOk = newVar("ok", tBool)
- varIndex = newVar("index", tInt)
-
- // Type constants.
- tBool = types.Typ[types.Bool]
- tByte = types.Typ[types.Byte]
- tInt = types.Typ[types.Int]
- tInvalid = types.Typ[types.Invalid]
- tString = types.Typ[types.String]
- tUntypedNil = types.Typ[types.UntypedNil]
- tRangeIter = &opaqueType{nil, "iter"} // the type of all "range" iterators
- tEface = types.NewInterface(nil, nil).Complete()
-
- // SSA Value constants.
- vZero = intConst(0)
- vOne = intConst(1)
- vTrue = NewConst(exact.MakeBool(true), tBool)
-)
-
-// builder holds state associated with the package currently being built.
-// Its methods contain all the logic for AST-to-SSA conversion.
-type builder struct{}
-
-// cond emits to fn code to evaluate boolean condition e and jump
-// to t or f depending on its value, performing various simplifications.
-//
-// Postcondition: fn.currentBlock is nil.
-//
-func (b *builder) cond(fn *Function, e ast.Expr, t, f *BasicBlock) {
- switch e := e.(type) {
- case *ast.ParenExpr:
- b.cond(fn, e.X, t, f)
- return
-
- case *ast.BinaryExpr:
- switch e.Op {
- case token.LAND:
- ltrue := fn.newBasicBlock("cond.true")
- b.cond(fn, e.X, ltrue, f)
- fn.currentBlock = ltrue
- b.cond(fn, e.Y, t, f)
- return
-
- case token.LOR:
- lfalse := fn.newBasicBlock("cond.false")
- b.cond(fn, e.X, t, lfalse)
- fn.currentBlock = lfalse
- b.cond(fn, e.Y, t, f)
- return
- }
-
- case *ast.UnaryExpr:
- if e.Op == token.NOT {
- b.cond(fn, e.X, f, t)
- return
- }
- }
-
- // A traditional compiler would simplify "if false" (etc) here
- // but we do not, for better fidelity to the source code.
- //
- // The value of a constant condition may be platform-specific,
- // and may cause blocks that are reachable in some configuration
- // to be hidden from subsequent analyses such as bug-finding tools.
- emitIf(fn, b.expr(fn, e), t, f)
-}
-
-// logicalBinop emits code to fn to evaluate e, a &&- or
-// ||-expression whose reified boolean value is wanted.
-// The value is returned.
-//
-func (b *builder) logicalBinop(fn *Function, e *ast.BinaryExpr) Value {
- rhs := fn.newBasicBlock("binop.rhs")
- done := fn.newBasicBlock("binop.done")
-
- // T(e) = T(e.X) = T(e.Y) after untyped constants have been
- // eliminated.
- // TODO(adonovan): not true; MyBool==MyBool yields UntypedBool.
- t := fn.Pkg.typeOf(e)
-
- var short Value // value of the short-circuit path
- switch e.Op {
- case token.LAND:
- b.cond(fn, e.X, rhs, done)
- short = NewConst(exact.MakeBool(false), t)
-
- case token.LOR:
- b.cond(fn, e.X, done, rhs)
- short = NewConst(exact.MakeBool(true), t)
- }
-
- // Is rhs unreachable?
- if rhs.Preds == nil {
- // Simplify false&&y to false, true||y to true.
- fn.currentBlock = done
- return short
- }
-
- // Is done unreachable?
- if done.Preds == nil {
- // Simplify true&&y (or false||y) to y.
- fn.currentBlock = rhs
- return b.expr(fn, e.Y)
- }
-
- // All edges from e.X to done carry the short-circuit value.
- var edges []Value
- for range done.Preds {
- edges = append(edges, short)
- }
-
- // The edge from e.Y to done carries the value of e.Y.
- fn.currentBlock = rhs
- edges = append(edges, b.expr(fn, e.Y))
- emitJump(fn, done)
- fn.currentBlock = done
-
- phi := &Phi{Edges: edges, Comment: e.Op.String()}
- phi.pos = e.OpPos
- phi.typ = t
- return done.emit(phi)
-}
-
-// exprN lowers a multi-result expression e to SSA form, emitting code
-// to fn and returning a single Value whose type is a *types.Tuple.
-// The caller must access the components via Extract.
-//
-// Multi-result expressions include CallExprs in a multi-value
-// assignment or return statement, and "value,ok" uses of
-// TypeAssertExpr, IndexExpr (when X is a map), and UnaryExpr (when Op
-// is token.ARROW).
-//
-func (b *builder) exprN(fn *Function, e ast.Expr) Value {
- typ := fn.Pkg.typeOf(e).(*types.Tuple)
- switch e := e.(type) {
- case *ast.ParenExpr:
- return b.exprN(fn, e.X)
-
- case *ast.CallExpr:
- // Currently, no built-in function nor type conversion
- // has multiple results, so we can avoid some of the
- // cases for single-valued CallExpr.
- var c Call
- b.setCall(fn, e, &c.Call)
- c.typ = typ
- return fn.emit(&c)
-
- case *ast.IndexExpr:
- mapt := fn.Pkg.typeOf(e.X).Underlying().(*types.Map)
- lookup := &Lookup{
- X: b.expr(fn, e.X),
- Index: emitConv(fn, b.expr(fn, e.Index), mapt.Key()),
- CommaOk: true,
- }
- lookup.setType(typ)
- lookup.setPos(e.Lbrack)
- return fn.emit(lookup)
-
- case *ast.TypeAssertExpr:
- return emitTypeTest(fn, b.expr(fn, e.X), typ.At(0).Type(), e.Lparen)
-
- case *ast.UnaryExpr: // must be receive <-
- unop := &UnOp{
- Op: token.ARROW,
- X: b.expr(fn, e.X),
- CommaOk: true,
- }
- unop.setType(typ)
- unop.setPos(e.OpPos)
- return fn.emit(unop)
- }
- panic(fmt.Sprintf("exprN(%T) in %s", e, fn))
-}
-
-// builtin emits to fn SSA instructions to implement a call to the
-// built-in function obj with the specified arguments
-// and return type. It returns the value defined by the result.
-//
-// The result is nil if no special handling was required; in this case
-// the caller should treat this like an ordinary library function
-// call.
-//
-func (b *builder) builtin(fn *Function, obj *types.Builtin, args []ast.Expr, typ types.Type, pos token.Pos) Value {
- switch obj.Name() {
- case "make":
- switch typ.Underlying().(type) {
- case *types.Slice:
- n := b.expr(fn, args[1])
- m := n
- if len(args) == 3 {
- m = b.expr(fn, args[2])
- }
- if m, ok := m.(*Const); ok {
- // treat make([]T, n, m) as new([m]T)[:n]
- cap := m.Int64()
- at := types.NewArray(typ.Underlying().(*types.Slice).Elem(), cap)
- alloc := emitNew(fn, at, pos)
- alloc.Comment = "makeslice"
- v := &Slice{
- X: alloc,
- High: n,
- }
- v.setPos(pos)
- v.setType(typ)
- return fn.emit(v)
- }
- v := &MakeSlice{
- Len: n,
- Cap: m,
- }
- v.setPos(pos)
- v.setType(typ)
- return fn.emit(v)
-
- case *types.Map:
- var res Value
- if len(args) == 2 {
- res = b.expr(fn, args[1])
- }
- v := &MakeMap{Reserve: res}
- v.setPos(pos)
- v.setType(typ)
- return fn.emit(v)
-
- case *types.Chan:
- var sz Value = vZero
- if len(args) == 2 {
- sz = b.expr(fn, args[1])
- }
- v := &MakeChan{Size: sz}
- v.setPos(pos)
- v.setType(typ)
- return fn.emit(v)
- }
-
- case "new":
- alloc := emitNew(fn, deref(typ), pos)
- alloc.Comment = "new"
- return alloc
-
- case "len", "cap":
- // Special case: len or cap of an array or *array is
- // based on the type, not the value which may be nil.
- // We must still evaluate the value, though. (If it
- // was side-effect free, the whole call would have
- // been constant-folded.)
- t := deref(fn.Pkg.typeOf(args[0])).Underlying()
- if at, ok := t.(*types.Array); ok {
- b.expr(fn, args[0]) // for effects only
- return intConst(at.Len())
- }
- // Otherwise treat as normal.
-
- case "panic":
- fn.emit(&Panic{
- X: emitConv(fn, b.expr(fn, args[0]), tEface),
- pos: pos,
- })
- fn.currentBlock = fn.newBasicBlock("unreachable")
- return vTrue // any non-nil Value will do
- }
- return nil // treat all others as a regular function call
-}
-
-// addr lowers a single-result addressable expression e to SSA form,
-// emitting code to fn and returning the location (an lvalue) defined
-// by the expression.
-//
-// If escaping is true, addr marks the base variable of the
-// addressable expression e as being a potentially escaping pointer
-// value. For example, in this code:
-//
-// a := A{
-// b: [1]B{B{c: 1}}
-// }
-// return &a.b[0].c
-//
-// the application of & causes a.b[0].c to have its address taken,
-// which means that ultimately the local variable a must be
-// heap-allocated. This is a simple but very conservative escape
-// analysis.
-//
-// Operations forming potentially escaping pointers include:
-// - &x, including when implicit in method call or composite literals.
-// - a[:] iff a is an array (not *array)
-// - references to variables in lexically enclosing functions.
-//
-func (b *builder) addr(fn *Function, e ast.Expr, escaping bool) lvalue {
- switch e := e.(type) {
- case *ast.Ident:
- if isBlankIdent(e) {
- return blank{}
- }
- obj := fn.Pkg.objectOf(e)
- v := fn.Prog.packageLevelValue(obj) // var (address)
- if v == nil {
- v = fn.lookup(obj, escaping)
- }
- return &address{addr: v, pos: e.Pos(), expr: e}
-
- case *ast.CompositeLit:
- t := deref(fn.Pkg.typeOf(e))
- var v *Alloc
- if escaping {
- v = emitNew(fn, t, e.Lbrace)
- } else {
- v = fn.addLocal(t, e.Lbrace)
- }
- v.Comment = "complit"
- var sb storebuf
- b.compLit(fn, v, e, true, &sb)
- sb.emit(fn)
- return &address{addr: v, pos: e.Lbrace, expr: e}
-
- case *ast.ParenExpr:
- return b.addr(fn, e.X, escaping)
-
- case *ast.SelectorExpr:
- sel, ok := fn.Pkg.info.Selections[e]
- if !ok {
- // qualified identifier
- return b.addr(fn, e.Sel, escaping)
- }
- if sel.Kind() != types.FieldVal {
- panic(sel)
- }
- wantAddr := true
- v := b.receiver(fn, e.X, wantAddr, escaping, sel)
- last := len(sel.Index()) - 1
- return &address{
- addr: emitFieldSelection(fn, v, sel.Index()[last], true, e.Sel),
- pos: e.Sel.Pos(),
- expr: e.Sel,
- }
-
- case *ast.IndexExpr:
- var x Value
- var et types.Type
- switch t := fn.Pkg.typeOf(e.X).Underlying().(type) {
- case *types.Array:
- x = b.addr(fn, e.X, escaping).address(fn)
- et = types.NewPointer(t.Elem())
- case *types.Pointer: // *array
- x = b.expr(fn, e.X)
- et = types.NewPointer(t.Elem().Underlying().(*types.Array).Elem())
- case *types.Slice:
- x = b.expr(fn, e.X)
- et = types.NewPointer(t.Elem())
- case *types.Map:
- return &element{
- m: b.expr(fn, e.X),
- k: emitConv(fn, b.expr(fn, e.Index), t.Key()),
- t: t.Elem(),
- pos: e.Lbrack,
- }
- default:
- panic("unexpected container type in IndexExpr: " + t.String())
- }
- v := &IndexAddr{
- X: x,
- Index: emitConv(fn, b.expr(fn, e.Index), tInt),
- }
- v.setPos(e.Lbrack)
- v.setType(et)
- return &address{addr: fn.emit(v), pos: e.Lbrack, expr: e}
-
- case *ast.StarExpr:
- return &address{addr: b.expr(fn, e.X), pos: e.Star, expr: e}
- }
-
- panic(fmt.Sprintf("unexpected address expression: %T", e))
-}
-
-type store struct {
- lhs lvalue
- rhs Value
-}
-
-type storebuf struct{ stores []store }
-
-func (sb *storebuf) store(lhs lvalue, rhs Value) {
- sb.stores = append(sb.stores, store{lhs, rhs})
-}
-
-func (sb *storebuf) emit(fn *Function) {
- for _, s := range sb.stores {
- s.lhs.store(fn, s.rhs)
- }
-}
-
-// assign emits to fn code to initialize the lvalue loc with the value
-// of expression e. If isZero is true, assign assumes that loc holds
-// the zero value for its type.
-//
-// This is equivalent to loc.store(fn, b.expr(fn, e)), but may generate
-// better code in some cases, e.g., for composite literals in an
-// addressable location.
-//
-// If sb is not nil, assign generates code to evaluate expression e, but
-// not to update loc. Instead, the necessary stores are appended to the
-// storebuf sb so that they can be executed later. This allows correct
-// in-place update of existing variables when the RHS is a composite
-// literal that may reference parts of the LHS.
-//
-func (b *builder) assign(fn *Function, loc lvalue, e ast.Expr, isZero bool, sb *storebuf) {
- // Can we initialize it in place?
- if e, ok := unparen(e).(*ast.CompositeLit); ok {
- // A CompositeLit never evaluates to a pointer,
- // so if the type of the location is a pointer,
- // an &-operation is implied.
- if _, ok := loc.(blank); !ok { // avoid calling blank.typ()
- if isPointer(loc.typ()) {
- ptr := b.addr(fn, e, true).address(fn)
- // copy address
- if sb != nil {
- sb.store(loc, ptr)
- } else {
- loc.store(fn, ptr)
- }
- return
- }
- }
-
- if _, ok := loc.(*address); ok {
- if isInterface(loc.typ()) {
- // e.g. var x interface{} = T{...}
- // Can't in-place initialize an interface value.
- // Fall back to copying.
- } else {
- // x = T{...} or x := T{...}
- addr := loc.address(fn)
- if sb != nil {
- b.compLit(fn, addr, e, isZero, sb)
- } else {
- var sb storebuf
- b.compLit(fn, addr, e, isZero, &sb)
- sb.emit(fn)
- }
-
- // Subtle: emit debug ref for aggregate types only;
- // slice and map are handled by store ops in compLit.
- switch loc.typ().Underlying().(type) {
- case *types.Struct, *types.Array:
- emitDebugRef(fn, e, addr, true)
- }
-
- return
- }
- }
- }
-
- // simple case: just copy
- rhs := b.expr(fn, e)
- if sb != nil {
- sb.store(loc, rhs)
- } else {
- loc.store(fn, rhs)
- }
-}
-
-// expr lowers a single-result expression e to SSA form, emitting code
-// to fn and returning the Value defined by the expression.
-//
-func (b *builder) expr(fn *Function, e ast.Expr) Value {
- e = unparen(e)
-
- tv := fn.Pkg.info.Types[e]
-
- // Is expression a constant?
- if tv.Value != nil {
- return NewConst(tv.Value, tv.Type)
- }
-
- var v Value
- if tv.Addressable() {
- // Prefer pointer arithmetic ({Index,Field}Addr) followed
- // by Load over subelement extraction (e.g. Index, Field),
- // to avoid large copies.
- v = b.addr(fn, e, false).load(fn)
- } else {
- v = b.expr0(fn, e, tv)
- }
- if fn.debugInfo() {
- emitDebugRef(fn, e, v, false)
- }
- return v
-}
-
-func (b *builder) expr0(fn *Function, e ast.Expr, tv types.TypeAndValue) Value {
- switch e := e.(type) {
- case *ast.BasicLit:
- panic("non-constant BasicLit") // unreachable
-
- case *ast.FuncLit:
- fn2 := &Function{
- name: fmt.Sprintf("%s$%d", fn.Name(), 1+len(fn.AnonFuncs)),
- Signature: fn.Pkg.typeOf(e.Type).Underlying().(*types.Signature),
- pos: e.Type.Func,
- parent: fn,
- Pkg: fn.Pkg,
- Prog: fn.Prog,
- syntax: e,
- }
- fn.AnonFuncs = append(fn.AnonFuncs, fn2)
- b.buildFunction(fn2)
- if fn2.FreeVars == nil {
- return fn2
- }
- v := &MakeClosure{Fn: fn2}
- v.setType(tv.Type)
- for _, fv := range fn2.FreeVars {
- v.Bindings = append(v.Bindings, fv.outer)
- fv.outer = nil
- }
- return fn.emit(v)
-
- case *ast.TypeAssertExpr: // single-result form only
- return emitTypeAssert(fn, b.expr(fn, e.X), tv.Type, e.Lparen)
-
- case *ast.CallExpr:
- if fn.Pkg.info.Types[e.Fun].IsType() {
- // Explicit type conversion, e.g. string(x) or big.Int(x)
- x := b.expr(fn, e.Args[0])
- y := emitConv(fn, x, tv.Type)
- if y != x {
- switch y := y.(type) {
- case *Convert:
- y.pos = e.Lparen
- case *ChangeType:
- y.pos = e.Lparen
- case *MakeInterface:
- y.pos = e.Lparen
- }
- }
- return y
- }
- // Call to "intrinsic" built-ins, e.g. new, make, panic.
- if id, ok := unparen(e.Fun).(*ast.Ident); ok {
- if obj, ok := fn.Pkg.info.Uses[id].(*types.Builtin); ok {
- if v := b.builtin(fn, obj, e.Args, tv.Type, e.Lparen); v != nil {
- return v
- }
- }
- }
- // Regular function call.
- var v Call
- b.setCall(fn, e, &v.Call)
- v.setType(tv.Type)
- return fn.emit(&v)
-
- case *ast.UnaryExpr:
- switch e.Op {
- case token.AND: // &X --- potentially escaping.
- addr := b.addr(fn, e.X, true)
- if _, ok := unparen(e.X).(*ast.StarExpr); ok {
- // &*p must panic if p is nil (http://golang.org/s/go12nil).
- // For simplicity, we'll just (suboptimally) rely
- // on the side effects of a load.
- // TODO(adonovan): emit dedicated nilcheck.
- addr.load(fn)
- }
- return addr.address(fn)
- case token.ADD:
- return b.expr(fn, e.X)
- case token.NOT, token.ARROW, token.SUB, token.XOR: // ! <- - ^
- v := &UnOp{
- Op: e.Op,
- X: b.expr(fn, e.X),
- }
- v.setPos(e.OpPos)
- v.setType(tv.Type)
- return fn.emit(v)
- default:
- panic(e.Op)
- }
-
- case *ast.BinaryExpr:
- switch e.Op {
- case token.LAND, token.LOR:
- return b.logicalBinop(fn, e)
- case token.SHL, token.SHR:
- fallthrough
- case token.ADD, token.SUB, token.MUL, token.QUO, token.REM, token.AND, token.OR, token.XOR, token.AND_NOT:
- return emitArith(fn, e.Op, b.expr(fn, e.X), b.expr(fn, e.Y), tv.Type, e.OpPos)
-
- case token.EQL, token.NEQ, token.GTR, token.LSS, token.LEQ, token.GEQ:
- cmp := emitCompare(fn, e.Op, b.expr(fn, e.X), b.expr(fn, e.Y), e.OpPos)
- // The type of x==y may be UntypedBool.
- return emitConv(fn, cmp, DefaultType(tv.Type))
- default:
- panic("illegal op in BinaryExpr: " + e.Op.String())
- }
-
- case *ast.SliceExpr:
- var low, high, max Value
- var x Value
- switch fn.Pkg.typeOf(e.X).Underlying().(type) {
- case *types.Array:
- // Potentially escaping.
- x = b.addr(fn, e.X, true).address(fn)
- case *types.Basic, *types.Slice, *types.Pointer: // *array
- x = b.expr(fn, e.X)
- default:
- panic("unreachable")
- }
- if e.High != nil {
- high = b.expr(fn, e.High)
- }
- if e.Low != nil {
- low = b.expr(fn, e.Low)
- }
- if e.Slice3 {
- max = b.expr(fn, e.Max)
- }
- v := &Slice{
- X: x,
- Low: low,
- High: high,
- Max: max,
- }
- v.setPos(e.Lbrack)
- v.setType(tv.Type)
- return fn.emit(v)
-
- case *ast.Ident:
- obj := fn.Pkg.info.Uses[e]
- // Universal built-in or nil?
- switch obj := obj.(type) {
- case *types.Builtin:
- return &Builtin{name: obj.Name(), sig: tv.Type.(*types.Signature)}
- case *types.Nil:
- return nilConst(tv.Type)
- }
- // Package-level func or var?
- if v := fn.Prog.packageLevelValue(obj); v != nil {
- if _, ok := obj.(*types.Var); ok {
- return emitLoad(fn, v) // var (address)
- }
- return v // (func)
- }
- // Local var.
- return emitLoad(fn, fn.lookup(obj, false)) // var (address)
-
- case *ast.SelectorExpr:
- sel, ok := fn.Pkg.info.Selections[e]
- if !ok {
- // qualified identifier
- return b.expr(fn, e.Sel)
- }
- switch sel.Kind() {
- case types.MethodExpr:
- // (*T).f or T.f, the method f from the method-set of type T.
- // The result is a "thunk".
- return emitConv(fn, makeThunk(fn.Prog, sel), tv.Type)
-
- case types.MethodVal:
- // e.f where e is an expression and f is a method.
- // The result is a "bound".
- obj := sel.Obj().(*types.Func)
- rt := recvType(obj)
- wantAddr := isPointer(rt)
- escaping := true
- v := b.receiver(fn, e.X, wantAddr, escaping, sel)
- if isInterface(rt) {
- // If v has interface type I,
- // we must emit a check that v is non-nil.
- // We use: typeassert v.(I).
- emitTypeAssert(fn, v, rt, token.NoPos)
- }
- c := &MakeClosure{
- Fn: makeBound(fn.Prog, obj),
- Bindings: []Value{v},
- }
- c.setPos(e.Sel.Pos())
- c.setType(tv.Type)
- return fn.emit(c)
-
- case types.FieldVal:
- indices := sel.Index()
- last := len(indices) - 1
- v := b.expr(fn, e.X)
- v = emitImplicitSelections(fn, v, indices[:last])
- v = emitFieldSelection(fn, v, indices[last], false, e.Sel)
- return v
- }
-
- panic("unexpected expression-relative selector")
-
- case *ast.IndexExpr:
- switch t := fn.Pkg.typeOf(e.X).Underlying().(type) {
- case *types.Array:
- // Non-addressable array (in a register).
- v := &Index{
- X: b.expr(fn, e.X),
- Index: emitConv(fn, b.expr(fn, e.Index), tInt),
- }
- v.setPos(e.Lbrack)
- v.setType(t.Elem())
- return fn.emit(v)
-
- case *types.Map:
- // Maps are not addressable.
- mapt := fn.Pkg.typeOf(e.X).Underlying().(*types.Map)
- v := &Lookup{
- X: b.expr(fn, e.X),
- Index: emitConv(fn, b.expr(fn, e.Index), mapt.Key()),
- }
- v.setPos(e.Lbrack)
- v.setType(mapt.Elem())
- return fn.emit(v)
-
- case *types.Basic: // => string
- // Strings are not addressable.
- v := &Lookup{
- X: b.expr(fn, e.X),
- Index: b.expr(fn, e.Index),
- }
- v.setPos(e.Lbrack)
- v.setType(tByte)
- return fn.emit(v)
-
- case *types.Slice, *types.Pointer: // *array
- // Addressable slice/array; use IndexAddr and Load.
- return b.addr(fn, e, false).load(fn)
-
- default:
- panic("unexpected container type in IndexExpr: " + t.String())
- }
-
- case *ast.CompositeLit, *ast.StarExpr:
- // Addressable types (lvalues)
- return b.addr(fn, e, false).load(fn)
- }
-
- panic(fmt.Sprintf("unexpected expr: %T", e))
-}
-
-// stmtList emits to fn code for all statements in list.
-func (b *builder) stmtList(fn *Function, list []ast.Stmt) {
- for _, s := range list {
- b.stmt(fn, s)
- }
-}
-
-// receiver emits to fn code for expression e in the "receiver"
-// position of selection e.f (where f may be a field or a method) and
-// returns the effective receiver after applying the implicit field
-// selections of sel.
-//
-// wantAddr requests that the result is an an address. If
-// !sel.Indirect(), this may require that e be built in addr() mode; it
-// must thus be addressable.
-//
-// escaping is defined as per builder.addr().
-//
-func (b *builder) receiver(fn *Function, e ast.Expr, wantAddr, escaping bool, sel *types.Selection) Value {
- var v Value
- if wantAddr && !sel.Indirect() && !isPointer(fn.Pkg.typeOf(e)) {
- v = b.addr(fn, e, escaping).address(fn)
- } else {
- v = b.expr(fn, e)
- }
-
- last := len(sel.Index()) - 1
- v = emitImplicitSelections(fn, v, sel.Index()[:last])
- if !wantAddr && isPointer(v.Type()) {
- v = emitLoad(fn, v)
- }
- return v
-}
-
-// setCallFunc populates the function parts of a CallCommon structure
-// (Func, Method, Recv, Args[0]) based on the kind of invocation
-// occurring in e.
-//
-func (b *builder) setCallFunc(fn *Function, e *ast.CallExpr, c *CallCommon) {
- c.pos = e.Lparen
-
- // Is this a method call?
- if selector, ok := unparen(e.Fun).(*ast.SelectorExpr); ok {
- sel, ok := fn.Pkg.info.Selections[selector]
- if ok && sel.Kind() == types.MethodVal {
- obj := sel.Obj().(*types.Func)
- recv := recvType(obj)
- wantAddr := isPointer(recv)
- escaping := true
- v := b.receiver(fn, selector.X, wantAddr, escaping, sel)
- if isInterface(recv) {
- // Invoke-mode call.
- c.Value = v
- c.Method = obj
- } else {
- // "Call"-mode call.
- c.Value = fn.Prog.declaredFunc(obj)
- c.Args = append(c.Args, v)
- }
- return
- }
-
- // sel.Kind()==MethodExpr indicates T.f() or (*T).f():
- // a statically dispatched call to the method f in the
- // method-set of T or *T. T may be an interface.
- //
- // e.Fun would evaluate to a concrete method, interface
- // wrapper function, or promotion wrapper.
- //
- // For now, we evaluate it in the usual way.
- //
- // TODO(adonovan): opt: inline expr() here, to make the
- // call static and to avoid generation of wrappers.
- // It's somewhat tricky as it may consume the first
- // actual parameter if the call is "invoke" mode.
- //
- // Examples:
- // type T struct{}; func (T) f() {} // "call" mode
- // type T interface { f() } // "invoke" mode
- //
- // type S struct{ T }
- //
- // var s S
- // S.f(s)
- // (*S).f(&s)
- //
- // Suggested approach:
- // - consume the first actual parameter expression
- // and build it with b.expr().
- // - apply implicit field selections.
- // - use MethodVal logic to populate fields of c.
- }
-
- // Evaluate the function operand in the usual way.
- c.Value = b.expr(fn, e.Fun)
-}
-
-// emitCallArgs emits to f code for the actual parameters of call e to
-// a (possibly built-in) function of effective type sig.
-// The argument values are appended to args, which is then returned.
-//
-func (b *builder) emitCallArgs(fn *Function, sig *types.Signature, e *ast.CallExpr, args []Value) []Value {
- // f(x, y, z...): pass slice z straight through.
- if e.Ellipsis != 0 {
- for i, arg := range e.Args {
- v := emitConv(fn, b.expr(fn, arg), sig.Params().At(i).Type())
- args = append(args, v)
- }
- return args
- }
-
- offset := len(args) // 1 if call has receiver, 0 otherwise
-
- // Evaluate actual parameter expressions.
- //
- // If this is a chained call of the form f(g()) where g has
- // multiple return values (MRV), they are flattened out into
- // args; a suffix of them may end up in a varargs slice.
- for _, arg := range e.Args {
- v := b.expr(fn, arg)
- if ttuple, ok := v.Type().(*types.Tuple); ok { // MRV chain
- for i, n := 0, ttuple.Len(); i < n; i++ {
- args = append(args, emitExtract(fn, v, i))
- }
- } else {
- args = append(args, v)
- }
- }
-
- // Actual->formal assignability conversions for normal parameters.
- np := sig.Params().Len() // number of normal parameters
- if sig.Variadic() {
- np--
- }
- for i := 0; i < np; i++ {
- args[offset+i] = emitConv(fn, args[offset+i], sig.Params().At(i).Type())
- }
-
- // Actual->formal assignability conversions for variadic parameter,
- // and construction of slice.
- if sig.Variadic() {
- varargs := args[offset+np:]
- st := sig.Params().At(np).Type().(*types.Slice)
- vt := st.Elem()
- if len(varargs) == 0 {
- args = append(args, nilConst(st))
- } else {
- // Replace a suffix of args with a slice containing it.
- at := types.NewArray(vt, int64(len(varargs)))
- a := emitNew(fn, at, token.NoPos)
- a.setPos(e.Rparen)
- a.Comment = "varargs"
- for i, arg := range varargs {
- iaddr := &IndexAddr{
- X: a,
- Index: intConst(int64(i)),
- }
- iaddr.setType(types.NewPointer(vt))
- fn.emit(iaddr)
- emitStore(fn, iaddr, arg, arg.Pos())
- }
- s := &Slice{X: a}
- s.setType(st)
- args[offset+np] = fn.emit(s)
- args = args[:offset+np+1]
- }
- }
- return args
-}
-
-// setCall emits to fn code to evaluate all the parameters of a function
-// call e, and populates *c with those values.
-//
-func (b *builder) setCall(fn *Function, e *ast.CallExpr, c *CallCommon) {
- // First deal with the f(...) part and optional receiver.
- b.setCallFunc(fn, e, c)
-
- // Then append the other actual parameters.
- sig, _ := fn.Pkg.typeOf(e.Fun).Underlying().(*types.Signature)
- if sig == nil {
- panic(fmt.Sprintf("no signature for call of %s", e.Fun))
- }
- c.Args = b.emitCallArgs(fn, sig, e, c.Args)
-}
-
-// assignOp emits to fn code to perform loc += incr or loc -= incr.
-func (b *builder) assignOp(fn *Function, loc lvalue, incr Value, op token.Token) {
- oldv := loc.load(fn)
- loc.store(fn, emitArith(fn, op, oldv, emitConv(fn, incr, oldv.Type()), loc.typ(), token.NoPos))
-}
-
-// localValueSpec emits to fn code to define all of the vars in the
-// function-local ValueSpec, spec.
-//
-func (b *builder) localValueSpec(fn *Function, spec *ast.ValueSpec) {
- switch {
- case len(spec.Values) == len(spec.Names):
- // e.g. var x, y = 0, 1
- // 1:1 assignment
- for i, id := range spec.Names {
- if !isBlankIdent(id) {
- fn.addLocalForIdent(id)
- }
- lval := b.addr(fn, id, false) // non-escaping
- b.assign(fn, lval, spec.Values[i], true, nil)
- }
-
- case len(spec.Values) == 0:
- // e.g. var x, y int
- // Locals are implicitly zero-initialized.
- for _, id := range spec.Names {
- if !isBlankIdent(id) {
- lhs := fn.addLocalForIdent(id)
- if fn.debugInfo() {
- emitDebugRef(fn, id, lhs, true)
- }
- }
- }
-
- default:
- // e.g. var x, y = pos()
- tuple := b.exprN(fn, spec.Values[0])
- for i, id := range spec.Names {
- if !isBlankIdent(id) {
- fn.addLocalForIdent(id)
- lhs := b.addr(fn, id, false) // non-escaping
- lhs.store(fn, emitExtract(fn, tuple, i))
- }
- }
- }
-}
-
-// assignStmt emits code to fn for a parallel assignment of rhss to lhss.
-// isDef is true if this is a short variable declaration (:=).
-//
-// Note the similarity with localValueSpec.
-//
-func (b *builder) assignStmt(fn *Function, lhss, rhss []ast.Expr, isDef bool) {
- // Side effects of all LHSs and RHSs must occur in left-to-right order.
- lvals := make([]lvalue, len(lhss))
- isZero := make([]bool, len(lhss))
- for i, lhs := range lhss {
- var lval lvalue = blank{}
- if !isBlankIdent(lhs) {
- if isDef {
- if obj := fn.Pkg.info.Defs[lhs.(*ast.Ident)]; obj != nil {
- fn.addNamedLocal(obj)
- isZero[i] = true
- }
- }
- lval = b.addr(fn, lhs, false) // non-escaping
- }
- lvals[i] = lval
- }
- if len(lhss) == len(rhss) {
- // Simple assignment: x = f() (!isDef)
- // Parallel assignment: x, y = f(), g() (!isDef)
- // or short var decl: x, y := f(), g() (isDef)
- //
- // In all cases, the RHSs may refer to the LHSs,
- // so we need a storebuf.
- var sb storebuf
- for i := range rhss {
- b.assign(fn, lvals[i], rhss[i], isZero[i], &sb)
- }
- sb.emit(fn)
- } else {
- // e.g. x, y = pos()
- tuple := b.exprN(fn, rhss[0])
- emitDebugRef(fn, rhss[0], tuple, false)
- for i, lval := range lvals {
- lval.store(fn, emitExtract(fn, tuple, i))
- }
- }
-}
-
-// arrayLen returns the length of the array whose composite literal elements are elts.
-func (b *builder) arrayLen(fn *Function, elts []ast.Expr) int64 {
- var max int64 = -1
- var i int64 = -1
- for _, e := range elts {
- if kv, ok := e.(*ast.KeyValueExpr); ok {
- i = b.expr(fn, kv.Key).(*Const).Int64()
- } else {
- i++
- }
- if i > max {
- max = i
- }
- }
- return max + 1
-}
-
-// compLit emits to fn code to initialize a composite literal e at
-// address addr with type typ.
-//
-// Nested composite literals are recursively initialized in place
-// where possible. If isZero is true, compLit assumes that addr
-// holds the zero value for typ.
-//
-// Because the elements of a composite literal may refer to the
-// variables being updated, as in the second line below,
-// x := T{a: 1}
-// x = T{a: x.a}
-// all the reads must occur before all the writes. Thus all stores to
-// loc are emitted to the storebuf sb for later execution.
-//
-// A CompositeLit may have pointer type only in the recursive (nested)
-// case when the type name is implicit. e.g. in []*T{{}}, the inner
-// literal has type *T behaves like &T{}.
-// In that case, addr must hold a T, not a *T.
-//
-func (b *builder) compLit(fn *Function, addr Value, e *ast.CompositeLit, isZero bool, sb *storebuf) {
- typ := deref(fn.Pkg.typeOf(e))
- switch t := typ.Underlying().(type) {
- case *types.Struct:
- if !isZero && len(e.Elts) != t.NumFields() {
- // memclear
- sb.store(&address{addr, e.Lbrace, nil},
- zeroValue(fn, deref(addr.Type())))
- isZero = true
- }
- for i, e := range e.Elts {
- fieldIndex := i
- pos := e.Pos()
- if kv, ok := e.(*ast.KeyValueExpr); ok {
- fname := kv.Key.(*ast.Ident).Name
- for i, n := 0, t.NumFields(); i < n; i++ {
- sf := t.Field(i)
- if sf.Name() == fname {
- fieldIndex = i
- pos = kv.Colon
- e = kv.Value
- break
- }
- }
- }
- sf := t.Field(fieldIndex)
- faddr := &FieldAddr{
- X: addr,
- Field: fieldIndex,
- }
- faddr.setType(types.NewPointer(sf.Type()))
- fn.emit(faddr)
- b.assign(fn, &address{addr: faddr, pos: pos, expr: e}, e, isZero, sb)
- }
-
- case *types.Array, *types.Slice:
- var at *types.Array
- var array Value
- switch t := t.(type) {
- case *types.Slice:
- at = types.NewArray(t.Elem(), b.arrayLen(fn, e.Elts))
- alloc := emitNew(fn, at, e.Lbrace)
- alloc.Comment = "slicelit"
- array = alloc
- case *types.Array:
- at = t
- array = addr
-
- if !isZero && int64(len(e.Elts)) != at.Len() {
- // memclear
- sb.store(&address{array, e.Lbrace, nil},
- zeroValue(fn, deref(array.Type())))
- }
- }
-
- var idx *Const
- for _, e := range e.Elts {
- pos := e.Pos()
- if kv, ok := e.(*ast.KeyValueExpr); ok {
- idx = b.expr(fn, kv.Key).(*Const)
- pos = kv.Colon
- e = kv.Value
- } else {
- var idxval int64
- if idx != nil {
- idxval = idx.Int64() + 1
- }
- idx = intConst(idxval)
- }
- iaddr := &IndexAddr{
- X: array,
- Index: idx,
- }
- iaddr.setType(types.NewPointer(at.Elem()))
- fn.emit(iaddr)
- if t != at { // slice
- // backing array is unaliased => storebuf not needed.
- b.assign(fn, &address{addr: iaddr, pos: pos, expr: e}, e, true, nil)
- } else {
- b.assign(fn, &address{addr: iaddr, pos: pos, expr: e}, e, true, sb)
- }
- }
-
- if t != at { // slice
- s := &Slice{X: array}
- s.setPos(e.Lbrace)
- s.setType(typ)
- sb.store(&address{addr: addr, pos: e.Lbrace, expr: e}, fn.emit(s))
- }
-
- case *types.Map:
- m := &MakeMap{Reserve: intConst(int64(len(e.Elts)))}
- m.setPos(e.Lbrace)
- m.setType(typ)
- fn.emit(m)
- for _, e := range e.Elts {
- e := e.(*ast.KeyValueExpr)
-
- // If a key expression in a map literal is itself a
- // composite literal, the type may be omitted.
- // For example:
- // map[*struct{}]bool{{}: true}
- // An &-operation may be implied:
- // map[*struct{}]bool{&struct{}{}: true}
- var key Value
- if _, ok := unparen(e.Key).(*ast.CompositeLit); ok && isPointer(t.Key()) {
- // A CompositeLit never evaluates to a pointer,
- // so if the type of the location is a pointer,
- // an &-operation is implied.
- key = b.addr(fn, e.Key, true).address(fn)
- } else {
- key = b.expr(fn, e.Key)
- }
-
- loc := element{
- m: m,
- k: emitConv(fn, key, t.Key()),
- t: t.Elem(),
- pos: e.Colon,
- }
-
- // We call assign() only because it takes care
- // of any &-operation required in the recursive
- // case, e.g.,
- // map[int]*struct{}{0: {}} implies &struct{}{}.
- // In-place update is of course impossible,
- // and no storebuf is needed.
- b.assign(fn, &loc, e.Value, true, nil)
- }
- sb.store(&address{addr: addr, pos: e.Lbrace, expr: e}, m)
-
- default:
- panic("unexpected CompositeLit type: " + t.String())
- }
-}
-
-// switchStmt emits to fn code for the switch statement s, optionally
-// labelled by label.
-//
-func (b *builder) switchStmt(fn *Function, s *ast.SwitchStmt, label *lblock) {
- // We treat SwitchStmt like a sequential if-else chain.
- // Multiway dispatch can be recovered later by ssautil.Switches()
- // to those cases that are free of side effects.
- if s.Init != nil {
- b.stmt(fn, s.Init)
- }
- var tag Value = vTrue
- if s.Tag != nil {
- tag = b.expr(fn, s.Tag)
- }
- done := fn.newBasicBlock("switch.done")
- if label != nil {
- label._break = done
- }
- // We pull the default case (if present) down to the end.
- // But each fallthrough label must point to the next
- // body block in source order, so we preallocate a
- // body block (fallthru) for the next case.
- // Unfortunately this makes for a confusing block order.
- var dfltBody *[]ast.Stmt
- var dfltFallthrough *BasicBlock
- var fallthru, dfltBlock *BasicBlock
- ncases := len(s.Body.List)
- for i, clause := range s.Body.List {
- body := fallthru
- if body == nil {
- body = fn.newBasicBlock("switch.body") // first case only
- }
-
- // Preallocate body block for the next case.
- fallthru = done
- if i+1 < ncases {
- fallthru = fn.newBasicBlock("switch.body")
- }
-
- cc := clause.(*ast.CaseClause)
- if cc.List == nil {
- // Default case.
- dfltBody = &cc.Body
- dfltFallthrough = fallthru
- dfltBlock = body
- continue
- }
-
- var nextCond *BasicBlock
- for _, cond := range cc.List {
- nextCond = fn.newBasicBlock("switch.next")
- // TODO(adonovan): opt: when tag==vTrue, we'd
- // get better code if we use b.cond(cond)
- // instead of BinOp(EQL, tag, b.expr(cond))
- // followed by If. Don't forget conversions
- // though.
- cond := emitCompare(fn, token.EQL, tag, b.expr(fn, cond), token.NoPos)
- emitIf(fn, cond, body, nextCond)
- fn.currentBlock = nextCond
- }
- fn.currentBlock = body
- fn.targets = &targets{
- tail: fn.targets,
- _break: done,
- _fallthrough: fallthru,
- }
- b.stmtList(fn, cc.Body)
- fn.targets = fn.targets.tail
- emitJump(fn, done)
- fn.currentBlock = nextCond
- }
- if dfltBlock != nil {
- emitJump(fn, dfltBlock)
- fn.currentBlock = dfltBlock
- fn.targets = &targets{
- tail: fn.targets,
- _break: done,
- _fallthrough: dfltFallthrough,
- }
- b.stmtList(fn, *dfltBody)
- fn.targets = fn.targets.tail
- }
- emitJump(fn, done)
- fn.currentBlock = done
-}
-
-// typeSwitchStmt emits to fn code for the type switch statement s, optionally
-// labelled by label.
-//
-func (b *builder) typeSwitchStmt(fn *Function, s *ast.TypeSwitchStmt, label *lblock) {
- // We treat TypeSwitchStmt like a sequential if-else chain.
- // Multiway dispatch can be recovered later by ssautil.Switches().
-
- // Typeswitch lowering:
- //
- // var x X
- // switch y := x.(type) {
- // case T1, T2: S1 // >1 (y := x)
- // case nil: SN // nil (y := x)
- // default: SD // 0 types (y := x)
- // case T3: S3 // 1 type (y := x.(T3))
- // }
- //
- // ...s.Init...
- // x := eval x
- // .caseT1:
- // t1, ok1 := typeswitch,ok x
- // if ok1 then goto S1 else goto .caseT2
- // .caseT2:
- // t2, ok2 := typeswitch,ok x
- // if ok2 then goto S1 else goto .caseNil
- // .S1:
- // y := x
- // ...S1...
- // goto done
- // .caseNil:
- // if t2, ok2 := typeswitch,ok x
- // if x == nil then goto SN else goto .caseT3
- // .SN:
- // y := x
- // ...SN...
- // goto done
- // .caseT3:
- // t3, ok3 := typeswitch,ok x
- // if ok3 then goto S3 else goto default
- // .S3:
- // y := t3
- // ...S3...
- // goto done
- // .default:
- // y := x
- // ...SD...
- // goto done
- // .done:
-
- if s.Init != nil {
- b.stmt(fn, s.Init)
- }
-
- var x Value
- switch ass := s.Assign.(type) {
- case *ast.ExprStmt: // x.(type)
- x = b.expr(fn, unparen(ass.X).(*ast.TypeAssertExpr).X)
- case *ast.AssignStmt: // y := x.(type)
- x = b.expr(fn, unparen(ass.Rhs[0]).(*ast.TypeAssertExpr).X)
- }
-
- done := fn.newBasicBlock("typeswitch.done")
- if label != nil {
- label._break = done
- }
- var default_ *ast.CaseClause
- for _, clause := range s.Body.List {
- cc := clause.(*ast.CaseClause)
- if cc.List == nil {
- default_ = cc
- continue
- }
- body := fn.newBasicBlock("typeswitch.body")
- var next *BasicBlock
- var casetype types.Type
- var ti Value // ti, ok := typeassert,ok x
- for _, cond := range cc.List {
- next = fn.newBasicBlock("typeswitch.next")
- casetype = fn.Pkg.typeOf(cond)
- var condv Value
- if casetype == tUntypedNil {
- condv = emitCompare(fn, token.EQL, x, nilConst(x.Type()), token.NoPos)
- ti = x
- } else {
- yok := emitTypeTest(fn, x, casetype, cc.Case)
- ti = emitExtract(fn, yok, 0)
- condv = emitExtract(fn, yok, 1)
- }
- emitIf(fn, condv, body, next)
- fn.currentBlock = next
- }
- if len(cc.List) != 1 {
- ti = x
- }
- fn.currentBlock = body
- b.typeCaseBody(fn, cc, ti, done)
- fn.currentBlock = next
- }
- if default_ != nil {
- b.typeCaseBody(fn, default_, x, done)
- } else {
- emitJump(fn, done)
- }
- fn.currentBlock = done
-}
-
-func (b *builder) typeCaseBody(fn *Function, cc *ast.CaseClause, x Value, done *BasicBlock) {
- if obj := fn.Pkg.info.Implicits[cc]; obj != nil {
- // In a switch y := x.(type), each case clause
- // implicitly declares a distinct object y.
- // In a single-type case, y has that type.
- // In multi-type cases, 'case nil' and default,
- // y has the same type as the interface operand.
- emitStore(fn, fn.addNamedLocal(obj), x, obj.Pos())
- }
- fn.targets = &targets{
- tail: fn.targets,
- _break: done,
- }
- b.stmtList(fn, cc.Body)
- fn.targets = fn.targets.tail
- emitJump(fn, done)
-}
-
-// selectStmt emits to fn code for the select statement s, optionally
-// labelled by label.
-//
-func (b *builder) selectStmt(fn *Function, s *ast.SelectStmt, label *lblock) {
- // A blocking select of a single case degenerates to a
- // simple send or receive.
- // TODO(adonovan): opt: is this optimization worth its weight?
- if len(s.Body.List) == 1 {
- clause := s.Body.List[0].(*ast.CommClause)
- if clause.Comm != nil {
- b.stmt(fn, clause.Comm)
- done := fn.newBasicBlock("select.done")
- if label != nil {
- label._break = done
- }
- fn.targets = &targets{
- tail: fn.targets,
- _break: done,
- }
- b.stmtList(fn, clause.Body)
- fn.targets = fn.targets.tail
- emitJump(fn, done)
- fn.currentBlock = done
- return
- }
- }
-
- // First evaluate all channels in all cases, and find
- // the directions of each state.
- var states []*SelectState
- blocking := true
- debugInfo := fn.debugInfo()
- for _, clause := range s.Body.List {
- var st *SelectState
- switch comm := clause.(*ast.CommClause).Comm.(type) {
- case nil: // default case
- blocking = false
- continue
-
- case *ast.SendStmt: // ch<- i
- ch := b.expr(fn, comm.Chan)
- st = &SelectState{
- Dir: types.SendOnly,
- Chan: ch,
- Send: emitConv(fn, b.expr(fn, comm.Value),
- ch.Type().Underlying().(*types.Chan).Elem()),
- Pos: comm.Arrow,
- }
- if debugInfo {
- st.DebugNode = comm
- }
-
- case *ast.AssignStmt: // x := <-ch
- recv := unparen(comm.Rhs[0]).(*ast.UnaryExpr)
- st = &SelectState{
- Dir: types.RecvOnly,
- Chan: b.expr(fn, recv.X),
- Pos: recv.OpPos,
- }
- if debugInfo {
- st.DebugNode = recv
- }
-
- case *ast.ExprStmt: // <-ch
- recv := unparen(comm.X).(*ast.UnaryExpr)
- st = &SelectState{
- Dir: types.RecvOnly,
- Chan: b.expr(fn, recv.X),
- Pos: recv.OpPos,
- }
- if debugInfo {
- st.DebugNode = recv
- }
- }
- states = append(states, st)
- }
-
- // We dispatch on the (fair) result of Select using a
- // sequential if-else chain, in effect:
- //
- // idx, recvOk, r0...r_n-1 := select(...)
- // if idx == 0 { // receive on channel 0 (first receive => r0)
- // x, ok := r0, recvOk
- // ...state0...
- // } else if v == 1 { // send on channel 1
- // ...state1...
- // } else {
- // ...default...
- // }
- sel := &Select{
- States: states,
- Blocking: blocking,
- }
- sel.setPos(s.Select)
- var vars []*types.Var
- vars = append(vars, varIndex, varOk)
- for _, st := range states {
- if st.Dir == types.RecvOnly {
- tElem := st.Chan.Type().Underlying().(*types.Chan).Elem()
- vars = append(vars, anonVar(tElem))
- }
- }
- sel.setType(types.NewTuple(vars...))
-
- fn.emit(sel)
- idx := emitExtract(fn, sel, 0)
-
- done := fn.newBasicBlock("select.done")
- if label != nil {
- label._break = done
- }
-
- var defaultBody *[]ast.Stmt
- state := 0
- r := 2 // index in 'sel' tuple of value; increments if st.Dir==RECV
- for _, cc := range s.Body.List {
- clause := cc.(*ast.CommClause)
- if clause.Comm == nil {
- defaultBody = &clause.Body
- continue
- }
- body := fn.newBasicBlock("select.body")
- next := fn.newBasicBlock("select.next")
- emitIf(fn, emitCompare(fn, token.EQL, idx, intConst(int64(state)), token.NoPos), body, next)
- fn.currentBlock = body
- fn.targets = &targets{
- tail: fn.targets,
- _break: done,
- }
- switch comm := clause.Comm.(type) {
- case *ast.ExprStmt: // <-ch
- if debugInfo {
- v := emitExtract(fn, sel, r)
- emitDebugRef(fn, states[state].DebugNode.(ast.Expr), v, false)
- }
- r++
-
- case *ast.AssignStmt: // x := <-states[state].Chan
- if comm.Tok == token.DEFINE {
- fn.addLocalForIdent(comm.Lhs[0].(*ast.Ident))
- }
- x := b.addr(fn, comm.Lhs[0], false) // non-escaping
- v := emitExtract(fn, sel, r)
- if debugInfo {
- emitDebugRef(fn, states[state].DebugNode.(ast.Expr), v, false)
- }
- x.store(fn, v)
-
- if len(comm.Lhs) == 2 { // x, ok := ...
- if comm.Tok == token.DEFINE {
- fn.addLocalForIdent(comm.Lhs[1].(*ast.Ident))
- }
- ok := b.addr(fn, comm.Lhs[1], false) // non-escaping
- ok.store(fn, emitExtract(fn, sel, 1))
- }
- r++
- }
- b.stmtList(fn, clause.Body)
- fn.targets = fn.targets.tail
- emitJump(fn, done)
- fn.currentBlock = next
- state++
- }
- if defaultBody != nil {
- fn.targets = &targets{
- tail: fn.targets,
- _break: done,
- }
- b.stmtList(fn, *defaultBody)
- fn.targets = fn.targets.tail
- } else {
- // A blocking select must match some case.
- // (This should really be a runtime.errorString, not a string.)
- fn.emit(&Panic{
- X: emitConv(fn, stringConst("blocking select matched no case"), tEface),
- })
- fn.currentBlock = fn.newBasicBlock("unreachable")
- }
- emitJump(fn, done)
- fn.currentBlock = done
-}
-
-// forStmt emits to fn code for the for statement s, optionally
-// labelled by label.
-//
-func (b *builder) forStmt(fn *Function, s *ast.ForStmt, label *lblock) {
- // ...init...
- // jump loop
- // loop:
- // if cond goto body else done
- // body:
- // ...body...
- // jump post
- // post: (target of continue)
- // ...post...
- // jump loop
- // done: (target of break)
- if s.Init != nil {
- b.stmt(fn, s.Init)
- }
- body := fn.newBasicBlock("for.body")
- done := fn.newBasicBlock("for.done") // target of 'break'
- loop := body // target of back-edge
- if s.Cond != nil {
- loop = fn.newBasicBlock("for.loop")
- }
- cont := loop // target of 'continue'
- if s.Post != nil {
- cont = fn.newBasicBlock("for.post")
- }
- if label != nil {
- label._break = done
- label._continue = cont
- }
- emitJump(fn, loop)
- fn.currentBlock = loop
- if loop != body {
- b.cond(fn, s.Cond, body, done)
- fn.currentBlock = body
- }
- fn.targets = &targets{
- tail: fn.targets,
- _break: done,
- _continue: cont,
- }
- b.stmt(fn, s.Body)
- fn.targets = fn.targets.tail
- emitJump(fn, cont)
-
- if s.Post != nil {
- fn.currentBlock = cont
- b.stmt(fn, s.Post)
- emitJump(fn, loop) // back-edge
- }
- fn.currentBlock = done
-}
-
-// rangeIndexed emits to fn the header for an integer-indexed loop
-// over array, *array or slice value x.
-// The v result is defined only if tv is non-nil.
-// forPos is the position of the "for" token.
-//
-func (b *builder) rangeIndexed(fn *Function, x Value, tv types.Type, pos token.Pos) (k, v Value, loop, done *BasicBlock) {
- //
- // length = len(x)
- // index = -1
- // loop: (target of continue)
- // index++
- // if index < length goto body else done
- // body:
- // k = index
- // v = x[index]
- // ...body...
- // jump loop
- // done: (target of break)
-
- // Determine number of iterations.
- var length Value
- if arr, ok := deref(x.Type()).Underlying().(*types.Array); ok {
- // For array or *array, the number of iterations is
- // known statically thanks to the type. We avoid a
- // data dependence upon x, permitting later dead-code
- // elimination if x is pure, static unrolling, etc.
- // Ranging over a nil *array may have >0 iterations.
- // We still generate code for x, in case it has effects.
- length = intConst(arr.Len())
- } else {
- // length = len(x).
- var c Call
- c.Call.Value = makeLen(x.Type())
- c.Call.Args = []Value{x}
- c.setType(tInt)
- length = fn.emit(&c)
- }
-
- index := fn.addLocal(tInt, token.NoPos)
- emitStore(fn, index, intConst(-1), pos)
-
- loop = fn.newBasicBlock("rangeindex.loop")
- emitJump(fn, loop)
- fn.currentBlock = loop
-
- incr := &BinOp{
- Op: token.ADD,
- X: emitLoad(fn, index),
- Y: vOne,
- }
- incr.setType(tInt)
- emitStore(fn, index, fn.emit(incr), pos)
-
- body := fn.newBasicBlock("rangeindex.body")
- done = fn.newBasicBlock("rangeindex.done")
- emitIf(fn, emitCompare(fn, token.LSS, incr, length, token.NoPos), body, done)
- fn.currentBlock = body
-
- k = emitLoad(fn, index)
- if tv != nil {
- switch t := x.Type().Underlying().(type) {
- case *types.Array:
- instr := &Index{
- X: x,
- Index: k,
- }
- instr.setType(t.Elem())
- v = fn.emit(instr)
-
- case *types.Pointer: // *array
- instr := &IndexAddr{
- X: x,
- Index: k,
- }
- instr.setType(types.NewPointer(t.Elem().Underlying().(*types.Array).Elem()))
- v = emitLoad(fn, fn.emit(instr))
-
- case *types.Slice:
- instr := &IndexAddr{
- X: x,
- Index: k,
- }
- instr.setType(types.NewPointer(t.Elem()))
- v = emitLoad(fn, fn.emit(instr))
-
- default:
- panic("rangeIndexed x:" + t.String())
- }
- }
- return
-}
-
-// rangeIter emits to fn the header for a loop using
-// Range/Next/Extract to iterate over map or string value x.
-// tk and tv are the types of the key/value results k and v, or nil
-// if the respective component is not wanted.
-//
-func (b *builder) rangeIter(fn *Function, x Value, tk, tv types.Type, pos token.Pos) (k, v Value, loop, done *BasicBlock) {
- //
- // it = range x
- // loop: (target of continue)
- // okv = next it (ok, key, value)
- // ok = extract okv #0
- // if ok goto body else done
- // body:
- // k = extract okv #1
- // v = extract okv #2
- // ...body...
- // jump loop
- // done: (target of break)
- //
-
- if tk == nil {
- tk = tInvalid
- }
- if tv == nil {
- tv = tInvalid
- }
-
- rng := &Range{X: x}
- rng.setPos(pos)
- rng.setType(tRangeIter)
- it := fn.emit(rng)
-
- loop = fn.newBasicBlock("rangeiter.loop")
- emitJump(fn, loop)
- fn.currentBlock = loop
-
- _, isString := x.Type().Underlying().(*types.Basic)
-
- okv := &Next{
- Iter: it,
- IsString: isString,
- }
- okv.setType(types.NewTuple(
- varOk,
- newVar("k", tk),
- newVar("v", tv),
- ))
- fn.emit(okv)
-
- body := fn.newBasicBlock("rangeiter.body")
- done = fn.newBasicBlock("rangeiter.done")
- emitIf(fn, emitExtract(fn, okv, 0), body, done)
- fn.currentBlock = body
-
- if tk != tInvalid {
- k = emitExtract(fn, okv, 1)
- }
- if tv != tInvalid {
- v = emitExtract(fn, okv, 2)
- }
- return
-}
-
-// rangeChan emits to fn the header for a loop that receives from
-// channel x until it fails.
-// tk is the channel's element type, or nil if the k result is
-// not wanted
-// pos is the position of the '=' or ':=' token.
-//
-func (b *builder) rangeChan(fn *Function, x Value, tk types.Type, pos token.Pos) (k Value, loop, done *BasicBlock) {
- //
- // loop: (target of continue)
- // ko = <-x (key, ok)
- // ok = extract ko #1
- // if ok goto body else done
- // body:
- // k = extract ko #0
- // ...
- // goto loop
- // done: (target of break)
-
- loop = fn.newBasicBlock("rangechan.loop")
- emitJump(fn, loop)
- fn.currentBlock = loop
- recv := &UnOp{
- Op: token.ARROW,
- X: x,
- CommaOk: true,
- }
- recv.setPos(pos)
- recv.setType(types.NewTuple(
- newVar("k", x.Type().Underlying().(*types.Chan).Elem()),
- varOk,
- ))
- ko := fn.emit(recv)
- body := fn.newBasicBlock("rangechan.body")
- done = fn.newBasicBlock("rangechan.done")
- emitIf(fn, emitExtract(fn, ko, 1), body, done)
- fn.currentBlock = body
- if tk != nil {
- k = emitExtract(fn, ko, 0)
- }
- return
-}
-
-// rangeStmt emits to fn code for the range statement s, optionally
-// labelled by label.
-//
-func (b *builder) rangeStmt(fn *Function, s *ast.RangeStmt, label *lblock) {
- var tk, tv types.Type
- if s.Key != nil && !isBlankIdent(s.Key) {
- tk = fn.Pkg.typeOf(s.Key)
- }
- if s.Value != nil && !isBlankIdent(s.Value) {
- tv = fn.Pkg.typeOf(s.Value)
- }
-
- // If iteration variables are defined (:=), this
- // occurs once outside the loop.
- //
- // Unlike a short variable declaration, a RangeStmt
- // using := never redeclares an existing variable; it
- // always creates a new one.
- if s.Tok == token.DEFINE {
- if tk != nil {
- fn.addLocalForIdent(s.Key.(*ast.Ident))
- }
- if tv != nil {
- fn.addLocalForIdent(s.Value.(*ast.Ident))
- }
- }
-
- x := b.expr(fn, s.X)
-
- var k, v Value
- var loop, done *BasicBlock
- switch rt := x.Type().Underlying().(type) {
- case *types.Slice, *types.Array, *types.Pointer: // *array
- k, v, loop, done = b.rangeIndexed(fn, x, tv, s.For)
-
- case *types.Chan:
- k, loop, done = b.rangeChan(fn, x, tk, s.For)
-
- case *types.Map, *types.Basic: // string
- k, v, loop, done = b.rangeIter(fn, x, tk, tv, s.For)
-
- default:
- panic("Cannot range over: " + rt.String())
- }
-
- // Evaluate both LHS expressions before we update either.
- var kl, vl lvalue
- if tk != nil {
- kl = b.addr(fn, s.Key, false) // non-escaping
- }
- if tv != nil {
- vl = b.addr(fn, s.Value, false) // non-escaping
- }
- if tk != nil {
- kl.store(fn, k)
- }
- if tv != nil {
- vl.store(fn, v)
- }
-
- if label != nil {
- label._break = done
- label._continue = loop
- }
-
- fn.targets = &targets{
- tail: fn.targets,
- _break: done,
- _continue: loop,
- }
- b.stmt(fn, s.Body)
- fn.targets = fn.targets.tail
- emitJump(fn, loop) // back-edge
- fn.currentBlock = done
-}
-
-// stmt lowers statement s to SSA form, emitting code to fn.
-func (b *builder) stmt(fn *Function, _s ast.Stmt) {
- // The label of the current statement. If non-nil, its _goto
- // target is always set; its _break and _continue are set only
- // within the body of switch/typeswitch/select/for/range.
- // It is effectively an additional default-nil parameter of stmt().
- var label *lblock
-start:
- switch s := _s.(type) {
- case *ast.EmptyStmt:
- // ignore. (Usually removed by gofmt.)
-
- case *ast.DeclStmt: // Con, Var or Typ
- d := s.Decl.(*ast.GenDecl)
- if d.Tok == token.VAR {
- for _, spec := range d.Specs {
- if vs, ok := spec.(*ast.ValueSpec); ok {
- b.localValueSpec(fn, vs)
- }
- }
- }
-
- case *ast.LabeledStmt:
- label = fn.labelledBlock(s.Label)
- emitJump(fn, label._goto)
- fn.currentBlock = label._goto
- _s = s.Stmt
- goto start // effectively: tailcall stmt(fn, s.Stmt, label)
-
- case *ast.ExprStmt:
- b.expr(fn, s.X)
-
- case *ast.SendStmt:
- fn.emit(&Send{
- Chan: b.expr(fn, s.Chan),
- X: emitConv(fn, b.expr(fn, s.Value),
- fn.Pkg.typeOf(s.Chan).Underlying().(*types.Chan).Elem()),
- pos: s.Arrow,
- })
-
- case *ast.IncDecStmt:
- op := token.ADD
- if s.Tok == token.DEC {
- op = token.SUB
- }
- loc := b.addr(fn, s.X, false)
- b.assignOp(fn, loc, NewConst(exact.MakeInt64(1), loc.typ()), op)
-
- case *ast.AssignStmt:
- switch s.Tok {
- case token.ASSIGN, token.DEFINE:
- b.assignStmt(fn, s.Lhs, s.Rhs, s.Tok == token.DEFINE)
-
- default: // +=, etc.
- op := s.Tok + token.ADD - token.ADD_ASSIGN
- b.assignOp(fn, b.addr(fn, s.Lhs[0], false), b.expr(fn, s.Rhs[0]), op)
- }
-
- case *ast.GoStmt:
- // The "intrinsics" new/make/len/cap are forbidden here.
- // panic is treated like an ordinary function call.
- v := Go{pos: s.Go}
- b.setCall(fn, s.Call, &v.Call)
- fn.emit(&v)
-
- case *ast.DeferStmt:
- // The "intrinsics" new/make/len/cap are forbidden here.
- // panic is treated like an ordinary function call.
- v := Defer{pos: s.Defer}
- b.setCall(fn, s.Call, &v.Call)
- fn.emit(&v)
-
- // A deferred call can cause recovery from panic,
- // and control resumes at the Recover block.
- createRecoverBlock(fn)
-
- case *ast.ReturnStmt:
- var results []Value
- if len(s.Results) == 1 && fn.Signature.Results().Len() > 1 {
- // Return of one expression in a multi-valued function.
- tuple := b.exprN(fn, s.Results[0])
- ttuple := tuple.Type().(*types.Tuple)
- for i, n := 0, ttuple.Len(); i < n; i++ {
- results = append(results,
- emitConv(fn, emitExtract(fn, tuple, i),
- fn.Signature.Results().At(i).Type()))
- }
- } else {
- // 1:1 return, or no-arg return in non-void function.
- for i, r := range s.Results {
- v := emitConv(fn, b.expr(fn, r), fn.Signature.Results().At(i).Type())
- results = append(results, v)
- }
- }
- if fn.namedResults != nil {
- // Function has named result parameters (NRPs).
- // Perform parallel assignment of return operands to NRPs.
- for i, r := range results {
- emitStore(fn, fn.namedResults[i], r, s.Return)
- }
- }
- // Run function calls deferred in this
- // function when explicitly returning from it.
- fn.emit(new(RunDefers))
- if fn.namedResults != nil {
- // Reload NRPs to form the result tuple.
- results = results[:0]
- for _, r := range fn.namedResults {
- results = append(results, emitLoad(fn, r))
- }
- }
- fn.emit(&Return{Results: results, pos: s.Return})
- fn.currentBlock = fn.newBasicBlock("unreachable")
-
- case *ast.BranchStmt:
- var block *BasicBlock
- switch s.Tok {
- case token.BREAK:
- if s.Label != nil {
- block = fn.labelledBlock(s.Label)._break
- } else {
- for t := fn.targets; t != nil && block == nil; t = t.tail {
- block = t._break
- }
- }
-
- case token.CONTINUE:
- if s.Label != nil {
- block = fn.labelledBlock(s.Label)._continue
- } else {
- for t := fn.targets; t != nil && block == nil; t = t.tail {
- block = t._continue
- }
- }
-
- case token.FALLTHROUGH:
- for t := fn.targets; t != nil && block == nil; t = t.tail {
- block = t._fallthrough
- }
-
- case token.GOTO:
- block = fn.labelledBlock(s.Label)._goto
- }
- emitJump(fn, block)
- fn.currentBlock = fn.newBasicBlock("unreachable")
-
- case *ast.BlockStmt:
- b.stmtList(fn, s.List)
-
- case *ast.IfStmt:
- if s.Init != nil {
- b.stmt(fn, s.Init)
- }
- then := fn.newBasicBlock("if.then")
- done := fn.newBasicBlock("if.done")
- els := done
- if s.Else != nil {
- els = fn.newBasicBlock("if.else")
- }
- b.cond(fn, s.Cond, then, els)
- fn.currentBlock = then
- b.stmt(fn, s.Body)
- emitJump(fn, done)
-
- if s.Else != nil {
- fn.currentBlock = els
- b.stmt(fn, s.Else)
- emitJump(fn, done)
- }
-
- fn.currentBlock = done
-
- case *ast.SwitchStmt:
- b.switchStmt(fn, s, label)
-
- case *ast.TypeSwitchStmt:
- b.typeSwitchStmt(fn, s, label)
-
- case *ast.SelectStmt:
- b.selectStmt(fn, s, label)
-
- case *ast.ForStmt:
- b.forStmt(fn, s, label)
-
- case *ast.RangeStmt:
- b.rangeStmt(fn, s, label)
-
- default:
- panic(fmt.Sprintf("unexpected statement kind: %T", s))
- }
-}
-
-// buildFunction builds SSA code for the body of function fn. Idempotent.
-func (b *builder) buildFunction(fn *Function) {
- if fn.Blocks != nil {
- return // building already started
- }
-
- var recvField *ast.FieldList
- var body *ast.BlockStmt
- var functype *ast.FuncType
- switch n := fn.syntax.(type) {
- case nil:
- return // not a Go source function. (Synthetic, or from object file.)
- case *ast.FuncDecl:
- functype = n.Type
- recvField = n.Recv
- body = n.Body
- case *ast.FuncLit:
- functype = n.Type
- body = n.Body
- default:
- panic(n)
- }
-
- if body == nil {
- // External function.
- if fn.Params == nil {
- // This condition ensures we add a non-empty
- // params list once only, but we may attempt
- // the degenerate empty case repeatedly.
- // TODO(adonovan): opt: don't do that.
-
- // We set Function.Params even though there is no body
- // code to reference them. This simplifies clients.
- if recv := fn.Signature.Recv(); recv != nil {
- fn.addParamObj(recv)
- }
- params := fn.Signature.Params()
- for i, n := 0, params.Len(); i < n; i++ {
- fn.addParamObj(params.At(i))
- }
- }
- return
- }
- if fn.Prog.mode&LogSource != 0 {
- defer logStack("build function %s @ %s", fn, fn.Prog.Fset.Position(fn.pos))()
- }
- fn.startBody()
- fn.createSyntacticParams(recvField, functype)
- b.stmt(fn, body)
- if cb := fn.currentBlock; cb != nil && (cb == fn.Blocks[0] || cb == fn.Recover || cb.Preds != nil) {
- // Control fell off the end of the function's body block.
- //
- // Block optimizations eliminate the current block, if
- // unreachable. It is a builder invariant that
- // if this no-arg return is ill-typed for
- // fn.Signature.Results, this block must be
- // unreachable. The sanity checker checks this.
- fn.emit(new(RunDefers))
- fn.emit(new(Return))
- }
- fn.finishBody()
-}
-
-// buildFuncDecl builds SSA code for the function or method declared
-// by decl in package pkg.
-//
-func (b *builder) buildFuncDecl(pkg *Package, decl *ast.FuncDecl) {
- id := decl.Name
- if isBlankIdent(id) {
- return // discard
- }
- fn := pkg.values[pkg.info.Defs[id]].(*Function)
- if decl.Recv == nil && id.Name == "init" {
- var v Call
- v.Call.Value = fn
- v.setType(types.NewTuple())
- pkg.init.emit(&v)
- }
- b.buildFunction(fn)
-}
-
-// Build calls Package.Build for each package in prog.
-// Building occurs in parallel unless the BuildSerially mode flag was set.
-//
-// Build is intended for whole-program analysis; a typical compiler
-// need only build a single package.
-//
-// Build is idempotent and thread-safe.
-//
-func (prog *Program) Build() {
- var wg sync.WaitGroup
- for _, p := range prog.packages {
- if prog.mode&BuildSerially != 0 {
- p.Build()
- } else {
- wg.Add(1)
- go func(p *Package) {
- p.Build()
- wg.Done()
- }(p)
- }
- }
- wg.Wait()
-}
-
-// Build builds SSA code for all functions and vars in package p.
-//
-// Precondition: CreatePackage must have been called for all of p's
-// direct imports (and hence its direct imports must have been
-// error-free).
-//
-// Build is idempotent and thread-safe.
-//
-func (p *Package) Build() { p.buildOnce.Do(p.build) }
-
-func (p *Package) build() {
- if p.info == nil {
- return // synthetic package, e.g. "testmain"
- }
-
- // Ensure we have runtime type info for all exported members.
- // TODO(adonovan): ideally belongs in memberFromObject, but
- // that would require package creation in topological order.
- for name, mem := range p.Members {
- if ast.IsExported(name) {
- p.Prog.needMethodsOf(mem.Type())
- }
- }
- if p.Prog.mode&LogSource != 0 {
- defer logStack("build %s", p)()
- }
- init := p.init
- init.startBody()
-
- var done *BasicBlock
-
- if p.Prog.mode&BareInits == 0 {
- // Make init() skip if package is already initialized.
- initguard := p.Var("init$guard")
- doinit := init.newBasicBlock("init.start")
- done = init.newBasicBlock("init.done")
- emitIf(init, emitLoad(init, initguard), done, doinit)
- init.currentBlock = doinit
- emitStore(init, initguard, vTrue, token.NoPos)
-
- // Call the init() function of each package we import.
- for _, pkg := range p.Pkg.Imports() {
- prereq := p.Prog.packages[pkg]
- if prereq == nil {
- panic(fmt.Sprintf("Package(%q).Build(): unsatisfied import: Program.CreatePackage(%q) was not called", p.Pkg.Path(), pkg.Path()))
- }
- var v Call
- v.Call.Value = prereq.init
- v.Call.pos = init.pos
- v.setType(types.NewTuple())
- init.emit(&v)
- }
- }
-
- var b builder
-
- // Initialize package-level vars in correct order.
- for _, varinit := range p.info.InitOrder {
- if init.Prog.mode&LogSource != 0 {
- fmt.Fprintf(os.Stderr, "build global initializer %v @ %s\n",
- varinit.Lhs, p.Prog.Fset.Position(varinit.Rhs.Pos()))
- }
- if len(varinit.Lhs) == 1 {
- // 1:1 initialization: var x, y = a(), b()
- var lval lvalue
- if v := varinit.Lhs[0]; v.Name() != "_" {
- lval = &address{addr: p.values[v].(*Global), pos: v.Pos()}
- } else {
- lval = blank{}
- }
- b.assign(init, lval, varinit.Rhs, true, nil)
- } else {
- // n:1 initialization: var x, y := f()
- tuple := b.exprN(init, varinit.Rhs)
- for i, v := range varinit.Lhs {
- if v.Name() == "_" {
- continue
- }
- emitStore(init, p.values[v].(*Global), emitExtract(init, tuple, i), v.Pos())
- }
- }
- }
-
- // Build all package-level functions, init functions
- // and methods, including unreachable/blank ones.
- // We build them in source order, but it's not significant.
- for _, file := range p.files {
- for _, decl := range file.Decls {
- if decl, ok := decl.(*ast.FuncDecl); ok {
- b.buildFuncDecl(p, decl)
- }
- }
- }
-
- // Finish up init().
- if p.Prog.mode&BareInits == 0 {
- emitJump(init, done)
- init.currentBlock = done
- }
- init.emit(new(Return))
- init.finishBody()
-
- p.info = nil // We no longer need ASTs or go/types deductions.
-
- if p.Prog.mode&SanityCheckFunctions != 0 {
- sanityCheckPackage(p)
- }
-}
-
-// Like ObjectOf, but panics instead of returning nil.
-// Only valid during p's create and build phases.
-func (p *Package) objectOf(id *ast.Ident) types.Object {
- if o := p.info.ObjectOf(id); o != nil {
- return o
- }
- panic(fmt.Sprintf("no types.Object for ast.Ident %s @ %s",
- id.Name, p.Prog.Fset.Position(id.Pos())))
-}
-
-// Like TypeOf, but panics instead of returning nil.
-// Only valid during p's create and build phases.
-func (p *Package) typeOf(e ast.Expr) types.Type {
- if T := p.info.TypeOf(e); T != nil {
- return T
- }
- panic(fmt.Sprintf("no type for %T @ %s",
- e, p.Prog.Fset.Position(e.Pos())))
-}
diff --git a/vendor/golang.org/x/tools/go/ssa/builder_test.go b/vendor/golang.org/x/tools/go/ssa/builder_test.go
deleted file mode 100644
index c45f930..0000000
--- a/vendor/golang.org/x/tools/go/ssa/builder_test.go
+++ /dev/null
@@ -1,500 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package ssa_test
-
-import (
- "bytes"
- "go/ast"
- "go/importer"
- "go/parser"
- "go/token"
- "go/types"
- "os"
- "reflect"
- "sort"
- "strings"
- "testing"
-
- "golang.org/x/tools/go/loader"
- "golang.org/x/tools/go/ssa"
- "golang.org/x/tools/go/ssa/ssautil"
-)
-
-func isEmpty(f *ssa.Function) bool { return f.Blocks == nil }
-
-// Tests that programs partially loaded from gc object files contain
-// functions with no code for the external portions, but are otherwise ok.
-func TestBuildPackage(t *testing.T) {
- input := `
-package main
-
-import (
- "bytes"
- "io"
- "testing"
-)
-
-func main() {
- var t testing.T
- t.Parallel() // static call to external declared method
- t.Fail() // static call to promoted external declared method
- testing.Short() // static call to external package-level function
-
- var w io.Writer = new(bytes.Buffer)
- w.Write(nil) // interface invoke of external declared method
-}
-`
-
- // Parse the file.
- fset := token.NewFileSet()
- f, err := parser.ParseFile(fset, "input.go", input, 0)
- if err != nil {
- t.Error(err)
- return
- }
-
- // Build an SSA program from the parsed file.
- // Load its dependencies from gc binary export data.
- mainPkg, _, err := ssautil.BuildPackage(&types.Config{Importer: importer.Default()}, fset,
- types.NewPackage("main", ""), []*ast.File{f}, ssa.SanityCheckFunctions)
- if err != nil {
- t.Error(err)
- return
- }
-
- // The main package, its direct and indirect dependencies are loaded.
- deps := []string{
- // directly imported dependencies:
- "bytes", "io", "testing",
- // indirect dependencies mentioned by
- // the direct imports' export data
- "sync", "unicode", "time",
- }
-
- prog := mainPkg.Prog
- all := prog.AllPackages()
- if len(all) <= len(deps) {
- t.Errorf("unexpected set of loaded packages: %q", all)
- }
- for _, path := range deps {
- pkg := prog.ImportedPackage(path)
- if pkg == nil {
- t.Errorf("package not loaded: %q", path)
- continue
- }
-
- // External packages should have no function bodies (except for wrappers).
- isExt := pkg != mainPkg
-
- // init()
- if isExt && !isEmpty(pkg.Func("init")) {
- t.Errorf("external package %s has non-empty init", pkg)
- } else if !isExt && isEmpty(pkg.Func("init")) {
- t.Errorf("main package %s has empty init", pkg)
- }
-
- for _, mem := range pkg.Members {
- switch mem := mem.(type) {
- case *ssa.Function:
- // Functions at package level.
- if isExt && !isEmpty(mem) {
- t.Errorf("external function %s is non-empty", mem)
- } else if !isExt && isEmpty(mem) {
- t.Errorf("function %s is empty", mem)
- }
-
- case *ssa.Type:
- // Methods of named types T.
- // (In this test, all exported methods belong to *T not T.)
- if !isExt {
- t.Fatalf("unexpected name type in main package: %s", mem)
- }
- mset := prog.MethodSets.MethodSet(types.NewPointer(mem.Type()))
- for i, n := 0, mset.Len(); i < n; i++ {
- m := prog.MethodValue(mset.At(i))
- // For external types, only synthetic wrappers have code.
- expExt := !strings.Contains(m.Synthetic, "wrapper")
- if expExt && !isEmpty(m) {
- t.Errorf("external method %s is non-empty: %s",
- m, m.Synthetic)
- } else if !expExt && isEmpty(m) {
- t.Errorf("method function %s is empty: %s",
- m, m.Synthetic)
- }
- }
- }
- }
- }
-
- expectedCallee := []string{
- "(*testing.T).Parallel",
- "(*testing.common).Fail",
- "testing.Short",
- "N/A",
- }
- callNum := 0
- for _, b := range mainPkg.Func("main").Blocks {
- for _, instr := range b.Instrs {
- switch instr := instr.(type) {
- case ssa.CallInstruction:
- call := instr.Common()
- if want := expectedCallee[callNum]; want != "N/A" {
- got := call.StaticCallee().String()
- if want != got {
- t.Errorf("call #%d from main.main: got callee %s, want %s",
- callNum, got, want)
- }
- }
- callNum++
- }
- }
- }
- if callNum != 4 {
- t.Errorf("in main.main: got %d calls, want %d", callNum, 4)
- }
-}
-
-// TestRuntimeTypes tests that (*Program).RuntimeTypes() includes all necessary types.
-func TestRuntimeTypes(t *testing.T) {
- tests := []struct {
- input string
- want []string
- }{
- // An exported package-level type is needed.
- {`package A; type T struct{}; func (T) f() {}`,
- []string{"*p.T", "p.T"},
- },
- // An unexported package-level type is not needed.
- {`package B; type t struct{}; func (t) f() {}`,
- nil,
- },
- // Subcomponents of type of exported package-level var are needed.
- {`package C; import "bytes"; var V struct {*bytes.Buffer}`,
- []string{"*bytes.Buffer", "*struct{*bytes.Buffer}", "struct{*bytes.Buffer}"},
- },
- // Subcomponents of type of unexported package-level var are not needed.
- {`package D; import "bytes"; var v struct {*bytes.Buffer}`,
- nil,
- },
- // Subcomponents of type of exported package-level function are needed.
- {`package E; import "bytes"; func F(struct {*bytes.Buffer}) {}`,
- []string{"*bytes.Buffer", "struct{*bytes.Buffer}"},
- },
- // Subcomponents of type of unexported package-level function are not needed.
- {`package F; import "bytes"; func f(struct {*bytes.Buffer}) {}`,
- nil,
- },
- // Subcomponents of type of exported method of uninstantiated unexported type are not needed.
- {`package G; import "bytes"; type x struct{}; func (x) G(struct {*bytes.Buffer}) {}; var v x`,
- nil,
- },
- // ...unless used by MakeInterface.
- {`package G2; import "bytes"; type x struct{}; func (x) G(struct {*bytes.Buffer}) {}; var v interface{} = x{}`,
- []string{"*bytes.Buffer", "*p.x", "p.x", "struct{*bytes.Buffer}"},
- },
- // Subcomponents of type of unexported method are not needed.
- {`package I; import "bytes"; type X struct{}; func (X) G(struct {*bytes.Buffer}) {}`,
- []string{"*bytes.Buffer", "*p.X", "p.X", "struct{*bytes.Buffer}"},
- },
- // Local types aren't needed.
- {`package J; import "bytes"; func f() { type T struct {*bytes.Buffer}; var t T; _ = t }`,
- nil,
- },
- // ...unless used by MakeInterface.
- {`package K; import "bytes"; func f() { type T struct {*bytes.Buffer}; _ = interface{}(T{}) }`,
- []string{"*bytes.Buffer", "*p.T", "p.T"},
- },
- // Types used as operand of MakeInterface are needed.
- {`package L; import "bytes"; func f() { _ = interface{}(struct{*bytes.Buffer}{}) }`,
- []string{"*bytes.Buffer", "struct{*bytes.Buffer}"},
- },
- // MakeInterface is optimized away when storing to a blank.
- {`package M; import "bytes"; var _ interface{} = struct{*bytes.Buffer}{}`,
- nil,
- },
- }
- for _, test := range tests {
- // Parse the file.
- fset := token.NewFileSet()
- f, err := parser.ParseFile(fset, "input.go", test.input, 0)
- if err != nil {
- t.Errorf("test %q: %s", test.input[:15], err)
- continue
- }
-
- // Create a single-file main package.
- // Load dependencies from gc binary export data.
- ssapkg, _, err := ssautil.BuildPackage(&types.Config{Importer: importer.Default()}, fset,
- types.NewPackage("p", ""), []*ast.File{f}, ssa.SanityCheckFunctions)
- if err != nil {
- t.Errorf("test %q: %s", test.input[:15], err)
- continue
- }
-
- var typstrs []string
- for _, T := range ssapkg.Prog.RuntimeTypes() {
- typstrs = append(typstrs, T.String())
- }
- sort.Strings(typstrs)
-
- if !reflect.DeepEqual(typstrs, test.want) {
- t.Errorf("test 'package %s': got %q, want %q",
- f.Name.Name, typstrs, test.want)
- }
- }
-}
-
-// TestInit tests that synthesized init functions are correctly formed.
-// Bare init functions omit calls to dependent init functions and the use of
-// an init guard. They are useful in cases where the client uses a different
-// calling convention for init functions, or cases where it is easier for a
-// client to analyze bare init functions. Both of these aspects are used by
-// the llgo compiler for simpler integration with gccgo's runtime library,
-// and to simplify the analysis whereby it deduces which stores to globals
-// can be lowered to global initializers.
-func TestInit(t *testing.T) {
- tests := []struct {
- mode ssa.BuilderMode
- input, want string
- }{
- {0, `package A; import _ "errors"; var i int = 42`,
- `# Name: A.init
-# Package: A
-# Synthetic: package initializer
-func init():
-0: entry P:0 S:2
- t0 = *init$guard bool
- if t0 goto 2 else 1
-1: init.start P:1 S:1
- *init$guard = true:bool
- t1 = errors.init() ()
- *i = 42:int
- jump 2
-2: init.done P:2 S:0
- return
-
-`},
- {ssa.BareInits, `package B; import _ "errors"; var i int = 42`,
- `# Name: B.init
-# Package: B
-# Synthetic: package initializer
-func init():
-0: entry P:0 S:0
- *i = 42:int
- return
-
-`},
- }
- for _, test := range tests {
- // Create a single-file main package.
- var conf loader.Config
- f, err := conf.ParseFile(" ", test.input)
- if err != nil {
- t.Errorf("test %q: %s", test.input[:15], err)
- continue
- }
- conf.CreateFromFiles(f.Name.Name, f)
-
- lprog, err := conf.Load()
- if err != nil {
- t.Errorf("test 'package %s': Load: %s", f.Name.Name, err)
- continue
- }
- prog := ssautil.CreateProgram(lprog, test.mode)
- mainPkg := prog.Package(lprog.Created[0].Pkg)
- prog.Build()
- initFunc := mainPkg.Func("init")
- if initFunc == nil {
- t.Errorf("test 'package %s': no init function", f.Name.Name)
- continue
- }
-
- var initbuf bytes.Buffer
- _, err = initFunc.WriteTo(&initbuf)
- if err != nil {
- t.Errorf("test 'package %s': WriteTo: %s", f.Name.Name, err)
- continue
- }
-
- if initbuf.String() != test.want {
- t.Errorf("test 'package %s': got %s, want %s", f.Name.Name, initbuf.String(), test.want)
- }
- }
-}
-
-// TestSyntheticFuncs checks that the expected synthetic functions are
-// created, reachable, and not duplicated.
-func TestSyntheticFuncs(t *testing.T) {
- const input = `package P
-type T int
-func (T) f() int
-func (*T) g() int
-var (
- // thunks
- a = T.f
- b = T.f
- c = (struct{T}).f
- d = (struct{T}).f
- e = (*T).g
- f = (*T).g
- g = (struct{*T}).g
- h = (struct{*T}).g
-
- // bounds
- i = T(0).f
- j = T(0).f
- k = new(T).g
- l = new(T).g
-
- // wrappers
- m interface{} = struct{T}{}
- n interface{} = struct{T}{}
- o interface{} = struct{*T}{}
- p interface{} = struct{*T}{}
- q interface{} = new(struct{T})
- r interface{} = new(struct{T})
- s interface{} = new(struct{*T})
- t interface{} = new(struct{*T})
-)
-`
- // Parse
- var conf loader.Config
- f, err := conf.ParseFile(" ", input)
- if err != nil {
- t.Fatalf("parse: %v", err)
- }
- conf.CreateFromFiles(f.Name.Name, f)
-
- // Load
- lprog, err := conf.Load()
- if err != nil {
- t.Fatalf("Load: %v", err)
- }
-
- // Create and build SSA
- prog := ssautil.CreateProgram(lprog, 0)
- prog.Build()
-
- // Enumerate reachable synthetic functions
- want := map[string]string{
- "(*P.T).g$bound": "bound method wrapper for func (*P.T).g() int",
- "(P.T).f$bound": "bound method wrapper for func (P.T).f() int",
-
- "(*P.T).g$thunk": "thunk for func (*P.T).g() int",
- "(P.T).f$thunk": "thunk for func (P.T).f() int",
- "(struct{*P.T}).g$thunk": "thunk for func (*P.T).g() int",
- "(struct{P.T}).f$thunk": "thunk for func (P.T).f() int",
-
- "(*P.T).f": "wrapper for func (P.T).f() int",
- "(*struct{*P.T}).f": "wrapper for func (P.T).f() int",
- "(*struct{*P.T}).g": "wrapper for func (*P.T).g() int",
- "(*struct{P.T}).f": "wrapper for func (P.T).f() int",
- "(*struct{P.T}).g": "wrapper for func (*P.T).g() int",
- "(struct{*P.T}).f": "wrapper for func (P.T).f() int",
- "(struct{*P.T}).g": "wrapper for func (*P.T).g() int",
- "(struct{P.T}).f": "wrapper for func (P.T).f() int",
-
- "P.init": "package initializer",
- }
- for fn := range ssautil.AllFunctions(prog) {
- if fn.Synthetic == "" {
- continue
- }
- name := fn.String()
- wantDescr, ok := want[name]
- if !ok {
- t.Errorf("got unexpected/duplicate func: %q: %q", name, fn.Synthetic)
- continue
- }
- delete(want, name)
-
- if wantDescr != fn.Synthetic {
- t.Errorf("(%s).Synthetic = %q, want %q", name, fn.Synthetic, wantDescr)
- }
- }
- for fn, descr := range want {
- t.Errorf("want func: %q: %q", fn, descr)
- }
-}
-
-// TestPhiElimination ensures that dead phis, including those that
-// participate in a cycle, are properly eliminated.
-func TestPhiElimination(t *testing.T) {
- const input = `
-package p
-
-func f() error
-
-func g(slice []int) {
- for {
- for range slice {
- // e should not be lifted to a dead φ-node.
- e := f()
- h(e)
- }
- }
-}
-
-func h(error)
-`
- // The SSA code for this function should look something like this:
- // 0:
- // jump 1
- // 1:
- // t0 = len(slice)
- // jump 2
- // 2:
- // t1 = phi [1: -1:int, 3: t2]
- // t2 = t1 + 1:int
- // t3 = t2 < t0
- // if t3 goto 3 else 1
- // 3:
- // t4 = f()
- // t5 = h(t4)
- // jump 2
- //
- // But earlier versions of the SSA construction algorithm would
- // additionally generate this cycle of dead phis:
- //
- // 1:
- // t7 = phi [0: nil:error, 2: t8] #e
- // ...
- // 2:
- // t8 = phi [1: t7, 3: t4] #e
- // ...
-
- // Parse
- var conf loader.Config
- f, err := conf.ParseFile(" ", input)
- if err != nil {
- t.Fatalf("parse: %v", err)
- }
- conf.CreateFromFiles("p", f)
-
- // Load
- lprog, err := conf.Load()
- if err != nil {
- t.Fatalf("Load: %v", err)
- }
-
- // Create and build SSA
- prog := ssautil.CreateProgram(lprog, 0)
- p := prog.Package(lprog.Package("p").Pkg)
- p.Build()
- g := p.Func("g")
-
- phis := 0
- for _, b := range g.Blocks {
- for _, instr := range b.Instrs {
- if _, ok := instr.(*ssa.Phi); ok {
- phis++
- }
- }
- }
- if phis != 1 {
- g.WriteTo(os.Stderr)
- t.Errorf("expected a single Phi (for the range index), got %d", phis)
- }
-}
diff --git a/vendor/golang.org/x/tools/go/ssa/const.go b/vendor/golang.org/x/tools/go/ssa/const.go
deleted file mode 100644
index 2870eea..0000000
--- a/vendor/golang.org/x/tools/go/ssa/const.go
+++ /dev/null
@@ -1,169 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package ssa
-
-// This file defines the Const SSA value type.
-
-import (
- "fmt"
- exact "go/constant"
- "go/token"
- "go/types"
- "strconv"
-)
-
-// NewConst returns a new constant of the specified value and type.
-// val must be valid according to the specification of Const.Value.
-//
-func NewConst(val exact.Value, typ types.Type) *Const {
- return &Const{typ, val}
-}
-
-// intConst returns an 'int' constant that evaluates to i.
-// (i is an int64 in case the host is narrower than the target.)
-func intConst(i int64) *Const {
- return NewConst(exact.MakeInt64(i), tInt)
-}
-
-// nilConst returns a nil constant of the specified type, which may
-// be any reference type, including interfaces.
-//
-func nilConst(typ types.Type) *Const {
- return NewConst(nil, typ)
-}
-
-// stringConst returns a 'string' constant that evaluates to s.
-func stringConst(s string) *Const {
- return NewConst(exact.MakeString(s), tString)
-}
-
-// zeroConst returns a new "zero" constant of the specified type,
-// which must not be an array or struct type: the zero values of
-// aggregates are well-defined but cannot be represented by Const.
-//
-func zeroConst(t types.Type) *Const {
- switch t := t.(type) {
- case *types.Basic:
- switch {
- case t.Info()&types.IsBoolean != 0:
- return NewConst(exact.MakeBool(false), t)
- case t.Info()&types.IsNumeric != 0:
- return NewConst(exact.MakeInt64(0), t)
- case t.Info()&types.IsString != 0:
- return NewConst(exact.MakeString(""), t)
- case t.Kind() == types.UnsafePointer:
- fallthrough
- case t.Kind() == types.UntypedNil:
- return nilConst(t)
- default:
- panic(fmt.Sprint("zeroConst for unexpected type:", t))
- }
- case *types.Pointer, *types.Slice, *types.Interface, *types.Chan, *types.Map, *types.Signature:
- return nilConst(t)
- case *types.Named:
- return NewConst(zeroConst(t.Underlying()).Value, t)
- case *types.Array, *types.Struct, *types.Tuple:
- panic(fmt.Sprint("zeroConst applied to aggregate:", t))
- }
- panic(fmt.Sprint("zeroConst: unexpected ", t))
-}
-
-func (c *Const) RelString(from *types.Package) string {
- var s string
- if c.Value == nil {
- s = "nil"
- } else if c.Value.Kind() == exact.String {
- s = exact.StringVal(c.Value)
- const max = 20
- // TODO(adonovan): don't cut a rune in half.
- if len(s) > max {
- s = s[:max-3] + "..." // abbreviate
- }
- s = strconv.Quote(s)
- } else {
- s = c.Value.String()
- }
- return s + ":" + relType(c.Type(), from)
-}
-
-func (c *Const) Name() string {
- return c.RelString(nil)
-}
-
-func (c *Const) String() string {
- return c.Name()
-}
-
-func (c *Const) Type() types.Type {
- return c.typ
-}
-
-func (c *Const) Referrers() *[]Instruction {
- return nil
-}
-
-func (c *Const) Parent() *Function { return nil }
-
-func (c *Const) Pos() token.Pos {
- return token.NoPos
-}
-
-// IsNil returns true if this constant represents a typed or untyped nil value.
-func (c *Const) IsNil() bool {
- return c.Value == nil
-}
-
-// TODO(adonovan): move everything below into golang.org/x/tools/go/ssa/interp.
-
-// Int64 returns the numeric value of this constant truncated to fit
-// a signed 64-bit integer.
-//
-func (c *Const) Int64() int64 {
- switch x := exact.ToInt(c.Value); x.Kind() {
- case exact.Int:
- if i, ok := exact.Int64Val(x); ok {
- return i
- }
- return 0
- case exact.Float:
- f, _ := exact.Float64Val(x)
- return int64(f)
- }
- panic(fmt.Sprintf("unexpected constant value: %T", c.Value))
-}
-
-// Uint64 returns the numeric value of this constant truncated to fit
-// an unsigned 64-bit integer.
-//
-func (c *Const) Uint64() uint64 {
- switch x := exact.ToInt(c.Value); x.Kind() {
- case exact.Int:
- if u, ok := exact.Uint64Val(x); ok {
- return u
- }
- return 0
- case exact.Float:
- f, _ := exact.Float64Val(x)
- return uint64(f)
- }
- panic(fmt.Sprintf("unexpected constant value: %T", c.Value))
-}
-
-// Float64 returns the numeric value of this constant truncated to fit
-// a float64.
-//
-func (c *Const) Float64() float64 {
- f, _ := exact.Float64Val(c.Value)
- return f
-}
-
-// Complex128 returns the complex value of this constant truncated to
-// fit a complex128.
-//
-func (c *Const) Complex128() complex128 {
- re, _ := exact.Float64Val(exact.Real(c.Value))
- im, _ := exact.Float64Val(exact.Imag(c.Value))
- return complex(re, im)
-}
diff --git a/vendor/golang.org/x/tools/go/ssa/create.go b/vendor/golang.org/x/tools/go/ssa/create.go
deleted file mode 100644
index 69ac12b..0000000
--- a/vendor/golang.org/x/tools/go/ssa/create.go
+++ /dev/null
@@ -1,263 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package ssa
-
-// This file implements the CREATE phase of SSA construction.
-// See builder.go for explanation.
-
-import (
- "fmt"
- "go/ast"
- "go/token"
- "go/types"
- "os"
- "sync"
-
- "golang.org/x/tools/go/types/typeutil"
-)
-
-// NewProgram returns a new SSA Program.
-//
-// mode controls diagnostics and checking during SSA construction.
-//
-func NewProgram(fset *token.FileSet, mode BuilderMode) *Program {
- prog := &Program{
- Fset: fset,
- imported: make(map[string]*Package),
- packages: make(map[*types.Package]*Package),
- thunks: make(map[selectionKey]*Function),
- bounds: make(map[*types.Func]*Function),
- mode: mode,
- }
-
- h := typeutil.MakeHasher() // protected by methodsMu, in effect
- prog.methodSets.SetHasher(h)
- prog.canon.SetHasher(h)
-
- return prog
-}
-
-// memberFromObject populates package pkg with a member for the
-// typechecker object obj.
-//
-// For objects from Go source code, syntax is the associated syntax
-// tree (for funcs and vars only); it will be used during the build
-// phase.
-//
-func memberFromObject(pkg *Package, obj types.Object, syntax ast.Node) {
- name := obj.Name()
- switch obj := obj.(type) {
- case *types.Builtin:
- if pkg.Pkg != types.Unsafe {
- panic("unexpected builtin object: " + obj.String())
- }
-
- case *types.TypeName:
- pkg.Members[name] = &Type{
- object: obj,
- pkg: pkg,
- }
-
- case *types.Const:
- c := &NamedConst{
- object: obj,
- Value: NewConst(obj.Val(), obj.Type()),
- pkg: pkg,
- }
- pkg.values[obj] = c.Value
- pkg.Members[name] = c
-
- case *types.Var:
- g := &Global{
- Pkg: pkg,
- name: name,
- object: obj,
- typ: types.NewPointer(obj.Type()), // address
- pos: obj.Pos(),
- }
- pkg.values[obj] = g
- pkg.Members[name] = g
-
- case *types.Func:
- sig := obj.Type().(*types.Signature)
- if sig.Recv() == nil && name == "init" {
- pkg.ninit++
- name = fmt.Sprintf("init#%d", pkg.ninit)
- }
- fn := &Function{
- name: name,
- object: obj,
- Signature: sig,
- syntax: syntax,
- pos: obj.Pos(),
- Pkg: pkg,
- Prog: pkg.Prog,
- }
- if syntax == nil {
- fn.Synthetic = "loaded from gc object file"
- }
-
- pkg.values[obj] = fn
- if sig.Recv() == nil {
- pkg.Members[name] = fn // package-level function
- }
-
- default: // (incl. *types.Package)
- panic("unexpected Object type: " + obj.String())
- }
-}
-
-// membersFromDecl populates package pkg with members for each
-// typechecker object (var, func, const or type) associated with the
-// specified decl.
-//
-func membersFromDecl(pkg *Package, decl ast.Decl) {
- switch decl := decl.(type) {
- case *ast.GenDecl: // import, const, type or var
- switch decl.Tok {
- case token.CONST:
- for _, spec := range decl.Specs {
- for _, id := range spec.(*ast.ValueSpec).Names {
- if !isBlankIdent(id) {
- memberFromObject(pkg, pkg.info.Defs[id], nil)
- }
- }
- }
-
- case token.VAR:
- for _, spec := range decl.Specs {
- for _, id := range spec.(*ast.ValueSpec).Names {
- if !isBlankIdent(id) {
- memberFromObject(pkg, pkg.info.Defs[id], spec)
- }
- }
- }
-
- case token.TYPE:
- for _, spec := range decl.Specs {
- id := spec.(*ast.TypeSpec).Name
- if !isBlankIdent(id) {
- memberFromObject(pkg, pkg.info.Defs[id], nil)
- }
- }
- }
-
- case *ast.FuncDecl:
- id := decl.Name
- if !isBlankIdent(id) {
- memberFromObject(pkg, pkg.info.Defs[id], decl)
- }
- }
-}
-
-// CreatePackage constructs and returns an SSA Package from the
-// specified type-checked, error-free file ASTs, and populates its
-// Members mapping.
-//
-// importable determines whether this package should be returned by a
-// subsequent call to ImportedPackage(pkg.Path()).
-//
-// The real work of building SSA form for each function is not done
-// until a subsequent call to Package.Build().
-//
-func (prog *Program) CreatePackage(pkg *types.Package, files []*ast.File, info *types.Info, importable bool) *Package {
- p := &Package{
- Prog: prog,
- Members: make(map[string]Member),
- values: make(map[types.Object]Value),
- Pkg: pkg,
- info: info, // transient (CREATE and BUILD phases)
- files: files, // transient (CREATE and BUILD phases)
- }
-
- // Add init() function.
- p.init = &Function{
- name: "init",
- Signature: new(types.Signature),
- Synthetic: "package initializer",
- Pkg: p,
- Prog: prog,
- }
- p.Members[p.init.name] = p.init
-
- // CREATE phase.
- // Allocate all package members: vars, funcs, consts and types.
- if len(files) > 0 {
- // Go source package.
- for _, file := range files {
- for _, decl := range file.Decls {
- membersFromDecl(p, decl)
- }
- }
- } else {
- // GC-compiled binary package (or "unsafe")
- // No code.
- // No position information.
- scope := p.Pkg.Scope()
- for _, name := range scope.Names() {
- obj := scope.Lookup(name)
- memberFromObject(p, obj, nil)
- if obj, ok := obj.(*types.TypeName); ok {
- if named, ok := obj.Type().(*types.Named); ok {
- for i, n := 0, named.NumMethods(); i < n; i++ {
- memberFromObject(p, named.Method(i), nil)
- }
- }
- }
- }
- }
-
- if prog.mode&BareInits == 0 {
- // Add initializer guard variable.
- initguard := &Global{
- Pkg: p,
- name: "init$guard",
- typ: types.NewPointer(tBool),
- }
- p.Members[initguard.Name()] = initguard
- }
-
- if prog.mode&GlobalDebug != 0 {
- p.SetDebugMode(true)
- }
-
- if prog.mode&PrintPackages != 0 {
- printMu.Lock()
- p.WriteTo(os.Stdout)
- printMu.Unlock()
- }
-
- if importable {
- prog.imported[p.Pkg.Path()] = p
- }
- prog.packages[p.Pkg] = p
-
- return p
-}
-
-// printMu serializes printing of Packages/Functions to stdout.
-var printMu sync.Mutex
-
-// AllPackages returns a new slice containing all packages in the
-// program prog in unspecified order.
-//
-func (prog *Program) AllPackages() []*Package {
- pkgs := make([]*Package, 0, len(prog.packages))
- for _, pkg := range prog.packages {
- pkgs = append(pkgs, pkg)
- }
- return pkgs
-}
-
-// ImportedPackage returns the importable SSA Package whose import
-// path is path, or nil if no such SSA package has been created.
-//
-// Not all packages are importable. For example, no import
-// declaration can resolve to the x_test package created by 'go test'
-// or the ad-hoc main package created 'go build foo.go'.
-//
-func (prog *Program) ImportedPackage(path string) *Package {
- return prog.imported[path]
-}
diff --git a/vendor/golang.org/x/tools/go/ssa/doc.go b/vendor/golang.org/x/tools/go/ssa/doc.go
deleted file mode 100644
index 2aa04f4..0000000
--- a/vendor/golang.org/x/tools/go/ssa/doc.go
+++ /dev/null
@@ -1,123 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Package ssa defines a representation of the elements of Go programs
-// (packages, types, functions, variables and constants) using a
-// static single-assignment (SSA) form intermediate representation
-// (IR) for the bodies of functions.
-//
-// THIS INTERFACE IS EXPERIMENTAL AND IS LIKELY TO CHANGE.
-//
-// For an introduction to SSA form, see
-// http://en.wikipedia.org/wiki/Static_single_assignment_form.
-// This page provides a broader reading list:
-// http://www.dcs.gla.ac.uk/~jsinger/ssa.html.
-//
-// The level of abstraction of the SSA form is intentionally close to
-// the source language to facilitate construction of source analysis
-// tools. It is not intended for machine code generation.
-//
-// All looping, branching and switching constructs are replaced with
-// unstructured control flow. Higher-level control flow constructs
-// such as multi-way branch can be reconstructed as needed; see
-// ssautil.Switches() for an example.
-//
-// To construct an SSA-form program, call ssautil.CreateProgram on a
-// loader.Program, a set of type-checked packages created from
-// parsed Go source files. The resulting ssa.Program contains all the
-// packages and their members, but SSA code is not created for
-// function bodies until a subsequent call to (*Package).Build.
-//
-// The builder initially builds a naive SSA form in which all local
-// variables are addresses of stack locations with explicit loads and
-// stores. Registerisation of eligible locals and φ-node insertion
-// using dominance and dataflow are then performed as a second pass
-// called "lifting" to improve the accuracy and performance of
-// subsequent analyses; this pass can be skipped by setting the
-// NaiveForm builder flag.
-//
-// The primary interfaces of this package are:
-//
-// - Member: a named member of a Go package.
-// - Value: an expression that yields a value.
-// - Instruction: a statement that consumes values and performs computation.
-// - Node: a Value or Instruction (emphasizing its membership in the SSA value graph)
-//
-// A computation that yields a result implements both the Value and
-// Instruction interfaces. The following table shows for each
-// concrete type which of these interfaces it implements.
-//
-// Value? Instruction? Member?
-// *Alloc ✔ ✔
-// *BinOp ✔ ✔
-// *Builtin ✔
-// *Call ✔ ✔
-// *ChangeInterface ✔ ✔
-// *ChangeType ✔ ✔
-// *Const ✔
-// *Convert ✔ ✔
-// *DebugRef ✔
-// *Defer ✔
-// *Extract ✔ ✔
-// *Field ✔ ✔
-// *FieldAddr ✔ ✔
-// *FreeVar ✔
-// *Function ✔ ✔ (func)
-// *Global ✔ ✔ (var)
-// *Go ✔
-// *If ✔
-// *Index ✔ ✔
-// *IndexAddr ✔ ✔
-// *Jump ✔
-// *Lookup ✔ ✔
-// *MakeChan ✔ ✔
-// *MakeClosure ✔ ✔
-// *MakeInterface ✔ ✔
-// *MakeMap ✔ ✔
-// *MakeSlice ✔ ✔
-// *MapUpdate ✔
-// *NamedConst ✔ (const)
-// *Next ✔ ✔
-// *Panic ✔
-// *Parameter ✔
-// *Phi ✔ ✔
-// *Range ✔ ✔
-// *Return ✔
-// *RunDefers ✔
-// *Select ✔ ✔
-// *Send ✔
-// *Slice ✔ ✔
-// *Store ✔
-// *Type ✔ (type)
-// *TypeAssert ✔ ✔
-// *UnOp ✔ ✔
-//
-// Other key types in this package include: Program, Package, Function
-// and BasicBlock.
-//
-// The program representation constructed by this package is fully
-// resolved internally, i.e. it does not rely on the names of Values,
-// Packages, Functions, Types or BasicBlocks for the correct
-// interpretation of the program. Only the identities of objects and
-// the topology of the SSA and type graphs are semantically
-// significant. (There is one exception: Ids, used to identify field
-// and method names, contain strings.) Avoidance of name-based
-// operations simplifies the implementation of subsequent passes and
-// can make them very efficient. Many objects are nonetheless named
-// to aid in debugging, but it is not essential that the names be
-// either accurate or unambiguous. The public API exposes a number of
-// name-based maps for client convenience.
-//
-// The ssa/ssautil package provides various utilities that depend only
-// on the public API of this package.
-//
-// TODO(adonovan): Consider the exceptional control-flow implications
-// of defer and recover().
-//
-// TODO(adonovan): write a how-to document for all the various cases
-// of trying to determine corresponding elements across the four
-// domains of source locations, ast.Nodes, types.Objects,
-// ssa.Values/Instructions.
-//
-package ssa // import "golang.org/x/tools/go/ssa"
diff --git a/vendor/golang.org/x/tools/go/ssa/dom.go b/vendor/golang.org/x/tools/go/ssa/dom.go
deleted file mode 100644
index 12ef430..0000000
--- a/vendor/golang.org/x/tools/go/ssa/dom.go
+++ /dev/null
@@ -1,341 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package ssa
-
-// This file defines algorithms related to dominance.
-
-// Dominator tree construction ----------------------------------------
-//
-// We use the algorithm described in Lengauer & Tarjan. 1979. A fast
-// algorithm for finding dominators in a flowgraph.
-// http://doi.acm.org/10.1145/357062.357071
-//
-// We also apply the optimizations to SLT described in Georgiadis et
-// al, Finding Dominators in Practice, JGAA 2006,
-// http://jgaa.info/accepted/2006/GeorgiadisTarjanWerneck2006.10.1.pdf
-// to avoid the need for buckets of size > 1.
-
-import (
- "bytes"
- "fmt"
- "math/big"
- "os"
- "sort"
-)
-
-// Idom returns the block that immediately dominates b:
-// its parent in the dominator tree, if any.
-// Neither the entry node (b.Index==0) nor recover node
-// (b==b.Parent().Recover()) have a parent.
-//
-func (b *BasicBlock) Idom() *BasicBlock { return b.dom.idom }
-
-// Dominees returns the list of blocks that b immediately dominates:
-// its children in the dominator tree.
-//
-func (b *BasicBlock) Dominees() []*BasicBlock { return b.dom.children }
-
-// Dominates reports whether b dominates c.
-func (b *BasicBlock) Dominates(c *BasicBlock) bool {
- return b.dom.pre <= c.dom.pre && c.dom.post <= b.dom.post
-}
-
-type byDomPreorder []*BasicBlock
-
-func (a byDomPreorder) Len() int { return len(a) }
-func (a byDomPreorder) Swap(i, j int) { a[i], a[j] = a[j], a[i] }
-func (a byDomPreorder) Less(i, j int) bool { return a[i].dom.pre < a[j].dom.pre }
-
-// DomPreorder returns a new slice containing the blocks of f in
-// dominator tree preorder.
-//
-func (f *Function) DomPreorder() []*BasicBlock {
- n := len(f.Blocks)
- order := make(byDomPreorder, n, n)
- copy(order, f.Blocks)
- sort.Sort(order)
- return order
-}
-
-// domInfo contains a BasicBlock's dominance information.
-type domInfo struct {
- idom *BasicBlock // immediate dominator (parent in domtree)
- children []*BasicBlock // nodes immediately dominated by this one
- pre, post int32 // pre- and post-order numbering within domtree
-}
-
-// ltState holds the working state for Lengauer-Tarjan algorithm
-// (during which domInfo.pre is repurposed for CFG DFS preorder number).
-type ltState struct {
- // Each slice is indexed by b.Index.
- sdom []*BasicBlock // b's semidominator
- parent []*BasicBlock // b's parent in DFS traversal of CFG
- ancestor []*BasicBlock // b's ancestor with least sdom
-}
-
-// dfs implements the depth-first search part of the LT algorithm.
-func (lt *ltState) dfs(v *BasicBlock, i int32, preorder []*BasicBlock) int32 {
- preorder[i] = v
- v.dom.pre = i // For now: DFS preorder of spanning tree of CFG
- i++
- lt.sdom[v.Index] = v
- lt.link(nil, v)
- for _, w := range v.Succs {
- if lt.sdom[w.Index] == nil {
- lt.parent[w.Index] = v
- i = lt.dfs(w, i, preorder)
- }
- }
- return i
-}
-
-// eval implements the EVAL part of the LT algorithm.
-func (lt *ltState) eval(v *BasicBlock) *BasicBlock {
- // TODO(adonovan): opt: do path compression per simple LT.
- u := v
- for ; lt.ancestor[v.Index] != nil; v = lt.ancestor[v.Index] {
- if lt.sdom[v.Index].dom.pre < lt.sdom[u.Index].dom.pre {
- u = v
- }
- }
- return u
-}
-
-// link implements the LINK part of the LT algorithm.
-func (lt *ltState) link(v, w *BasicBlock) {
- lt.ancestor[w.Index] = v
-}
-
-// buildDomTree computes the dominator tree of f using the LT algorithm.
-// Precondition: all blocks are reachable (e.g. optimizeBlocks has been run).
-//
-func buildDomTree(f *Function) {
- // The step numbers refer to the original LT paper; the
- // reordering is due to Georgiadis.
-
- // Clear any previous domInfo.
- for _, b := range f.Blocks {
- b.dom = domInfo{}
- }
-
- n := len(f.Blocks)
- // Allocate space for 5 contiguous [n]*BasicBlock arrays:
- // sdom, parent, ancestor, preorder, buckets.
- space := make([]*BasicBlock, 5*n, 5*n)
- lt := ltState{
- sdom: space[0:n],
- parent: space[n : 2*n],
- ancestor: space[2*n : 3*n],
- }
-
- // Step 1. Number vertices by depth-first preorder.
- preorder := space[3*n : 4*n]
- root := f.Blocks[0]
- prenum := lt.dfs(root, 0, preorder)
- recover := f.Recover
- if recover != nil {
- lt.dfs(recover, prenum, preorder)
- }
-
- buckets := space[4*n : 5*n]
- copy(buckets, preorder)
-
- // In reverse preorder...
- for i := int32(n) - 1; i > 0; i-- {
- w := preorder[i]
-
- // Step 3. Implicitly define the immediate dominator of each node.
- for v := buckets[i]; v != w; v = buckets[v.dom.pre] {
- u := lt.eval(v)
- if lt.sdom[u.Index].dom.pre < i {
- v.dom.idom = u
- } else {
- v.dom.idom = w
- }
- }
-
- // Step 2. Compute the semidominators of all nodes.
- lt.sdom[w.Index] = lt.parent[w.Index]
- for _, v := range w.Preds {
- u := lt.eval(v)
- if lt.sdom[u.Index].dom.pre < lt.sdom[w.Index].dom.pre {
- lt.sdom[w.Index] = lt.sdom[u.Index]
- }
- }
-
- lt.link(lt.parent[w.Index], w)
-
- if lt.parent[w.Index] == lt.sdom[w.Index] {
- w.dom.idom = lt.parent[w.Index]
- } else {
- buckets[i] = buckets[lt.sdom[w.Index].dom.pre]
- buckets[lt.sdom[w.Index].dom.pre] = w
- }
- }
-
- // The final 'Step 3' is now outside the loop.
- for v := buckets[0]; v != root; v = buckets[v.dom.pre] {
- v.dom.idom = root
- }
-
- // Step 4. Explicitly define the immediate dominator of each
- // node, in preorder.
- for _, w := range preorder[1:] {
- if w == root || w == recover {
- w.dom.idom = nil
- } else {
- if w.dom.idom != lt.sdom[w.Index] {
- w.dom.idom = w.dom.idom.dom.idom
- }
- // Calculate Children relation as inverse of Idom.
- w.dom.idom.dom.children = append(w.dom.idom.dom.children, w)
- }
- }
-
- pre, post := numberDomTree(root, 0, 0)
- if recover != nil {
- numberDomTree(recover, pre, post)
- }
-
- // printDomTreeDot(os.Stderr, f) // debugging
- // printDomTreeText(os.Stderr, root, 0) // debugging
-
- if f.Prog.mode&SanityCheckFunctions != 0 {
- sanityCheckDomTree(f)
- }
-}
-
-// numberDomTree sets the pre- and post-order numbers of a depth-first
-// traversal of the dominator tree rooted at v. These are used to
-// answer dominance queries in constant time.
-//
-func numberDomTree(v *BasicBlock, pre, post int32) (int32, int32) {
- v.dom.pre = pre
- pre++
- for _, child := range v.dom.children {
- pre, post = numberDomTree(child, pre, post)
- }
- v.dom.post = post
- post++
- return pre, post
-}
-
-// Testing utilities ----------------------------------------
-
-// sanityCheckDomTree checks the correctness of the dominator tree
-// computed by the LT algorithm by comparing against the dominance
-// relation computed by a naive Kildall-style forward dataflow
-// analysis (Algorithm 10.16 from the "Dragon" book).
-//
-func sanityCheckDomTree(f *Function) {
- n := len(f.Blocks)
-
- // D[i] is the set of blocks that dominate f.Blocks[i],
- // represented as a bit-set of block indices.
- D := make([]big.Int, n)
-
- one := big.NewInt(1)
-
- // all is the set of all blocks; constant.
- var all big.Int
- all.Set(one).Lsh(&all, uint(n)).Sub(&all, one)
-
- // Initialization.
- for i, b := range f.Blocks {
- if i == 0 || b == f.Recover {
- // A root is dominated only by itself.
- D[i].SetBit(&D[0], 0, 1)
- } else {
- // All other blocks are (initially) dominated
- // by every block.
- D[i].Set(&all)
- }
- }
-
- // Iteration until fixed point.
- for changed := true; changed; {
- changed = false
- for i, b := range f.Blocks {
- if i == 0 || b == f.Recover {
- continue
- }
- // Compute intersection across predecessors.
- var x big.Int
- x.Set(&all)
- for _, pred := range b.Preds {
- x.And(&x, &D[pred.Index])
- }
- x.SetBit(&x, i, 1) // a block always dominates itself.
- if D[i].Cmp(&x) != 0 {
- D[i].Set(&x)
- changed = true
- }
- }
- }
-
- // Check the entire relation. O(n^2).
- // The Recover block (if any) must be treated specially so we skip it.
- ok := true
- for i := 0; i < n; i++ {
- for j := 0; j < n; j++ {
- b, c := f.Blocks[i], f.Blocks[j]
- if c == f.Recover {
- continue
- }
- actual := b.Dominates(c)
- expected := D[j].Bit(i) == 1
- if actual != expected {
- fmt.Fprintf(os.Stderr, "dominates(%s, %s)==%t, want %t\n", b, c, actual, expected)
- ok = false
- }
- }
- }
-
- preorder := f.DomPreorder()
- for _, b := range f.Blocks {
- if got := preorder[b.dom.pre]; got != b {
- fmt.Fprintf(os.Stderr, "preorder[%d]==%s, want %s\n", b.dom.pre, got, b)
- ok = false
- }
- }
-
- if !ok {
- panic("sanityCheckDomTree failed for " + f.String())
- }
-
-}
-
-// Printing functions ----------------------------------------
-
-// printDomTree prints the dominator tree as text, using indentation.
-func printDomTreeText(buf *bytes.Buffer, v *BasicBlock, indent int) {
- fmt.Fprintf(buf, "%*s%s\n", 4*indent, "", v)
- for _, child := range v.dom.children {
- printDomTreeText(buf, child, indent+1)
- }
-}
-
-// printDomTreeDot prints the dominator tree of f in AT&T GraphViz
-// (.dot) format.
-func printDomTreeDot(buf *bytes.Buffer, f *Function) {
- fmt.Fprintln(buf, "//", f)
- fmt.Fprintln(buf, "digraph domtree {")
- for i, b := range f.Blocks {
- v := b.dom
- fmt.Fprintf(buf, "\tn%d [label=\"%s (%d, %d)\",shape=\"rectangle\"];\n", v.pre, b, v.pre, v.post)
- // TODO(adonovan): improve appearance of edges
- // belonging to both dominator tree and CFG.
-
- // Dominator tree edge.
- if i != 0 {
- fmt.Fprintf(buf, "\tn%d -> n%d [style=\"solid\",weight=100];\n", v.idom.dom.pre, v.pre)
- }
- // CFG edges.
- for _, pred := range b.Preds {
- fmt.Fprintf(buf, "\tn%d -> n%d [style=\"dotted\",weight=0];\n", pred.dom.pre, v.pre)
- }
- }
- fmt.Fprintln(buf, "}")
-}
diff --git a/vendor/golang.org/x/tools/go/ssa/emit.go b/vendor/golang.org/x/tools/go/ssa/emit.go
deleted file mode 100644
index 1036988..0000000
--- a/vendor/golang.org/x/tools/go/ssa/emit.go
+++ /dev/null
@@ -1,468 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package ssa
-
-// Helpers for emitting SSA instructions.
-
-import (
- "fmt"
- "go/ast"
- "go/token"
- "go/types"
-)
-
-// emitNew emits to f a new (heap Alloc) instruction allocating an
-// object of type typ. pos is the optional source location.
-//
-func emitNew(f *Function, typ types.Type, pos token.Pos) *Alloc {
- v := &Alloc{Heap: true}
- v.setType(types.NewPointer(typ))
- v.setPos(pos)
- f.emit(v)
- return v
-}
-
-// emitLoad emits to f an instruction to load the address addr into a
-// new temporary, and returns the value so defined.
-//
-func emitLoad(f *Function, addr Value) *UnOp {
- v := &UnOp{Op: token.MUL, X: addr}
- v.setType(deref(addr.Type()))
- f.emit(v)
- return v
-}
-
-// emitDebugRef emits to f a DebugRef pseudo-instruction associating
-// expression e with value v.
-//
-func emitDebugRef(f *Function, e ast.Expr, v Value, isAddr bool) {
- if !f.debugInfo() {
- return // debugging not enabled
- }
- if v == nil || e == nil {
- panic("nil")
- }
- var obj types.Object
- e = unparen(e)
- if id, ok := e.(*ast.Ident); ok {
- if isBlankIdent(id) {
- return
- }
- obj = f.Pkg.objectOf(id)
- switch obj.(type) {
- case *types.Nil, *types.Const, *types.Builtin:
- return
- }
- }
- f.emit(&DebugRef{
- X: v,
- Expr: e,
- IsAddr: isAddr,
- object: obj,
- })
-}
-
-// emitArith emits to f code to compute the binary operation op(x, y)
-// where op is an eager shift, logical or arithmetic operation.
-// (Use emitCompare() for comparisons and Builder.logicalBinop() for
-// non-eager operations.)
-//
-func emitArith(f *Function, op token.Token, x, y Value, t types.Type, pos token.Pos) Value {
- switch op {
- case token.SHL, token.SHR:
- x = emitConv(f, x, t)
- // y may be signed or an 'untyped' constant.
- // TODO(adonovan): whence signed values?
- if b, ok := y.Type().Underlying().(*types.Basic); ok && b.Info()&types.IsUnsigned == 0 {
- y = emitConv(f, y, types.Typ[types.Uint64])
- }
-
- case token.ADD, token.SUB, token.MUL, token.QUO, token.REM, token.AND, token.OR, token.XOR, token.AND_NOT:
- x = emitConv(f, x, t)
- y = emitConv(f, y, t)
-
- default:
- panic("illegal op in emitArith: " + op.String())
-
- }
- v := &BinOp{
- Op: op,
- X: x,
- Y: y,
- }
- v.setPos(pos)
- v.setType(t)
- return f.emit(v)
-}
-
-// emitCompare emits to f code compute the boolean result of
-// comparison comparison 'x op y'.
-//
-func emitCompare(f *Function, op token.Token, x, y Value, pos token.Pos) Value {
- xt := x.Type().Underlying()
- yt := y.Type().Underlying()
-
- // Special case to optimise a tagless SwitchStmt so that
- // these are equivalent
- // switch { case e: ...}
- // switch true { case e: ... }
- // if e==true { ... }
- // even in the case when e's type is an interface.
- // TODO(adonovan): opt: generalise to x==true, false!=y, etc.
- if x == vTrue && op == token.EQL {
- if yt, ok := yt.(*types.Basic); ok && yt.Info()&types.IsBoolean != 0 {
- return y
- }
- }
-
- if types.Identical(xt, yt) {
- // no conversion necessary
- } else if _, ok := xt.(*types.Interface); ok {
- y = emitConv(f, y, x.Type())
- } else if _, ok := yt.(*types.Interface); ok {
- x = emitConv(f, x, y.Type())
- } else if _, ok := x.(*Const); ok {
- x = emitConv(f, x, y.Type())
- } else if _, ok := y.(*Const); ok {
- y = emitConv(f, y, x.Type())
- } else {
- // other cases, e.g. channels. No-op.
- }
-
- v := &BinOp{
- Op: op,
- X: x,
- Y: y,
- }
- v.setPos(pos)
- v.setType(tBool)
- return f.emit(v)
-}
-
-// isValuePreserving returns true if a conversion from ut_src to
-// ut_dst is value-preserving, i.e. just a change of type.
-// Precondition: neither argument is a named type.
-//
-func isValuePreserving(ut_src, ut_dst types.Type) bool {
- // Identical underlying types?
- if structTypesIdentical(ut_dst, ut_src) {
- return true
- }
-
- switch ut_dst.(type) {
- case *types.Chan:
- // Conversion between channel types?
- _, ok := ut_src.(*types.Chan)
- return ok
-
- case *types.Pointer:
- // Conversion between pointers with identical base types?
- _, ok := ut_src.(*types.Pointer)
- return ok
- }
- return false
-}
-
-// emitConv emits to f code to convert Value val to exactly type typ,
-// and returns the converted value. Implicit conversions are required
-// by language assignability rules in assignments, parameter passing,
-// etc. Conversions cannot fail dynamically.
-//
-func emitConv(f *Function, val Value, typ types.Type) Value {
- t_src := val.Type()
-
- // Identical types? Conversion is a no-op.
- if types.Identical(t_src, typ) {
- return val
- }
-
- ut_dst := typ.Underlying()
- ut_src := t_src.Underlying()
-
- // Just a change of type, but not value or representation?
- if isValuePreserving(ut_src, ut_dst) {
- c := &ChangeType{X: val}
- c.setType(typ)
- return f.emit(c)
- }
-
- // Conversion to, or construction of a value of, an interface type?
- if _, ok := ut_dst.(*types.Interface); ok {
- // Assignment from one interface type to another?
- if _, ok := ut_src.(*types.Interface); ok {
- c := &ChangeInterface{X: val}
- c.setType(typ)
- return f.emit(c)
- }
-
- // Untyped nil constant? Return interface-typed nil constant.
- if ut_src == tUntypedNil {
- return nilConst(typ)
- }
-
- // Convert (non-nil) "untyped" literals to their default type.
- if t, ok := ut_src.(*types.Basic); ok && t.Info()&types.IsUntyped != 0 {
- val = emitConv(f, val, DefaultType(ut_src))
- }
-
- f.Pkg.Prog.needMethodsOf(val.Type())
- mi := &MakeInterface{X: val}
- mi.setType(typ)
- return f.emit(mi)
- }
-
- // Conversion of a compile-time constant value?
- if c, ok := val.(*Const); ok {
- if _, ok := ut_dst.(*types.Basic); ok || c.IsNil() {
- // Conversion of a compile-time constant to
- // another constant type results in a new
- // constant of the destination type and
- // (initially) the same abstract value.
- // We don't truncate the value yet.
- return NewConst(c.Value, typ)
- }
-
- // We're converting from constant to non-constant type,
- // e.g. string -> []byte/[]rune.
- }
-
- // A representation-changing conversion?
- // At least one of {ut_src,ut_dst} must be *Basic.
- // (The other may be []byte or []rune.)
- _, ok1 := ut_src.(*types.Basic)
- _, ok2 := ut_dst.(*types.Basic)
- if ok1 || ok2 {
- c := &Convert{X: val}
- c.setType(typ)
- return f.emit(c)
- }
-
- panic(fmt.Sprintf("in %s: cannot convert %s (%s) to %s", f, val, val.Type(), typ))
-}
-
-// emitStore emits to f an instruction to store value val at location
-// addr, applying implicit conversions as required by assignability rules.
-//
-func emitStore(f *Function, addr, val Value, pos token.Pos) *Store {
- s := &Store{
- Addr: addr,
- Val: emitConv(f, val, deref(addr.Type())),
- pos: pos,
- }
- f.emit(s)
- return s
-}
-
-// emitJump emits to f a jump to target, and updates the control-flow graph.
-// Postcondition: f.currentBlock is nil.
-//
-func emitJump(f *Function, target *BasicBlock) {
- b := f.currentBlock
- b.emit(new(Jump))
- addEdge(b, target)
- f.currentBlock = nil
-}
-
-// emitIf emits to f a conditional jump to tblock or fblock based on
-// cond, and updates the control-flow graph.
-// Postcondition: f.currentBlock is nil.
-//
-func emitIf(f *Function, cond Value, tblock, fblock *BasicBlock) {
- b := f.currentBlock
- b.emit(&If{Cond: cond})
- addEdge(b, tblock)
- addEdge(b, fblock)
- f.currentBlock = nil
-}
-
-// emitExtract emits to f an instruction to extract the index'th
-// component of tuple. It returns the extracted value.
-//
-func emitExtract(f *Function, tuple Value, index int) Value {
- e := &Extract{Tuple: tuple, Index: index}
- e.setType(tuple.Type().(*types.Tuple).At(index).Type())
- return f.emit(e)
-}
-
-// emitTypeAssert emits to f a type assertion value := x.(t) and
-// returns the value. x.Type() must be an interface.
-//
-func emitTypeAssert(f *Function, x Value, t types.Type, pos token.Pos) Value {
- a := &TypeAssert{X: x, AssertedType: t}
- a.setPos(pos)
- a.setType(t)
- return f.emit(a)
-}
-
-// emitTypeTest emits to f a type test value,ok := x.(t) and returns
-// a (value, ok) tuple. x.Type() must be an interface.
-//
-func emitTypeTest(f *Function, x Value, t types.Type, pos token.Pos) Value {
- a := &TypeAssert{
- X: x,
- AssertedType: t,
- CommaOk: true,
- }
- a.setPos(pos)
- a.setType(types.NewTuple(
- newVar("value", t),
- varOk,
- ))
- return f.emit(a)
-}
-
-// emitTailCall emits to f a function call in tail position. The
-// caller is responsible for all fields of 'call' except its type.
-// Intended for wrapper methods.
-// Precondition: f does/will not use deferred procedure calls.
-// Postcondition: f.currentBlock is nil.
-//
-func emitTailCall(f *Function, call *Call) {
- tresults := f.Signature.Results()
- nr := tresults.Len()
- if nr == 1 {
- call.typ = tresults.At(0).Type()
- } else {
- call.typ = tresults
- }
- tuple := f.emit(call)
- var ret Return
- switch nr {
- case 0:
- // no-op
- case 1:
- ret.Results = []Value{tuple}
- default:
- for i := 0; i < nr; i++ {
- v := emitExtract(f, tuple, i)
- // TODO(adonovan): in principle, this is required:
- // v = emitConv(f, o.Type, f.Signature.Results[i].Type)
- // but in practice emitTailCall is only used when
- // the types exactly match.
- ret.Results = append(ret.Results, v)
- }
- }
- f.emit(&ret)
- f.currentBlock = nil
-}
-
-// emitImplicitSelections emits to f code to apply the sequence of
-// implicit field selections specified by indices to base value v, and
-// returns the selected value.
-//
-// If v is the address of a struct, the result will be the address of
-// a field; if it is the value of a struct, the result will be the
-// value of a field.
-//
-func emitImplicitSelections(f *Function, v Value, indices []int) Value {
- for _, index := range indices {
- fld := deref(v.Type()).Underlying().(*types.Struct).Field(index)
-
- if isPointer(v.Type()) {
- instr := &FieldAddr{
- X: v,
- Field: index,
- }
- instr.setType(types.NewPointer(fld.Type()))
- v = f.emit(instr)
- // Load the field's value iff indirectly embedded.
- if isPointer(fld.Type()) {
- v = emitLoad(f, v)
- }
- } else {
- instr := &Field{
- X: v,
- Field: index,
- }
- instr.setType(fld.Type())
- v = f.emit(instr)
- }
- }
- return v
-}
-
-// emitFieldSelection emits to f code to select the index'th field of v.
-//
-// If wantAddr, the input must be a pointer-to-struct and the result
-// will be the field's address; otherwise the result will be the
-// field's value.
-// Ident id is used for position and debug info.
-//
-func emitFieldSelection(f *Function, v Value, index int, wantAddr bool, id *ast.Ident) Value {
- fld := deref(v.Type()).Underlying().(*types.Struct).Field(index)
- if isPointer(v.Type()) {
- instr := &FieldAddr{
- X: v,
- Field: index,
- }
- instr.setPos(id.Pos())
- instr.setType(types.NewPointer(fld.Type()))
- v = f.emit(instr)
- // Load the field's value iff we don't want its address.
- if !wantAddr {
- v = emitLoad(f, v)
- }
- } else {
- instr := &Field{
- X: v,
- Field: index,
- }
- instr.setPos(id.Pos())
- instr.setType(fld.Type())
- v = f.emit(instr)
- }
- emitDebugRef(f, id, v, wantAddr)
- return v
-}
-
-// zeroValue emits to f code to produce a zero value of type t,
-// and returns it.
-//
-func zeroValue(f *Function, t types.Type) Value {
- switch t.Underlying().(type) {
- case *types.Struct, *types.Array:
- return emitLoad(f, f.addLocal(t, token.NoPos))
- default:
- return zeroConst(t)
- }
-}
-
-// createRecoverBlock emits to f a block of code to return after a
-// recovered panic, and sets f.Recover to it.
-//
-// If f's result parameters are named, the code loads and returns
-// their current values, otherwise it returns the zero values of their
-// type.
-//
-// Idempotent.
-//
-func createRecoverBlock(f *Function) {
- if f.Recover != nil {
- return // already created
- }
- saved := f.currentBlock
-
- f.Recover = f.newBasicBlock("recover")
- f.currentBlock = f.Recover
-
- var results []Value
- if f.namedResults != nil {
- // Reload NRPs to form value tuple.
- for _, r := range f.namedResults {
- results = append(results, emitLoad(f, r))
- }
- } else {
- R := f.Signature.Results()
- for i, n := 0, R.Len(); i < n; i++ {
- T := R.At(i).Type()
-
- // Return zero value of each result type.
- results = append(results, zeroValue(f, T))
- }
- }
- f.emit(&Return{Results: results})
-
- f.currentBlock = saved
-}
diff --git a/vendor/golang.org/x/tools/go/ssa/example_test.go b/vendor/golang.org/x/tools/go/ssa/example_test.go
deleted file mode 100644
index 31fa561..0000000
--- a/vendor/golang.org/x/tools/go/ssa/example_test.go
+++ /dev/null
@@ -1,138 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package ssa_test
-
-import (
- "fmt"
- "go/ast"
- "go/importer"
- "go/parser"
- "go/token"
- "go/types"
- "os"
-
- "golang.org/x/tools/go/loader"
- "golang.org/x/tools/go/ssa"
- "golang.org/x/tools/go/ssa/ssautil"
-)
-
-const hello = `
-package main
-
-import "fmt"
-
-const message = "Hello, World!"
-
-func main() {
- fmt.Println(message)
-}
-`
-
-// This program demonstrates how to run the SSA builder on a single
-// package of one or more already-parsed files. Its dependencies are
-// loaded from compiler export data. This is what you'd typically use
-// for a compiler; it does not depend on golang.org/x/tools/go/loader.
-//
-// It shows the printed representation of packages, functions, and
-// instructions. Within the function listing, the name of each
-// BasicBlock such as ".0.entry" is printed left-aligned, followed by
-// the block's Instructions.
-//
-// For each instruction that defines an SSA virtual register
-// (i.e. implements Value), the type of that value is shown in the
-// right column.
-//
-// Build and run the ssadump.go program if you want a standalone tool
-// with similar functionality. It is located at
-// golang.org/x/tools/cmd/ssadump.
-//
-func ExampleBuildPackage() {
- // Parse the source files.
- fset := token.NewFileSet()
- f, err := parser.ParseFile(fset, "hello.go", hello, parser.ParseComments)
- if err != nil {
- fmt.Print(err) // parse error
- return
- }
- files := []*ast.File{f}
-
- // Create the type-checker's package.
- pkg := types.NewPackage("hello", "")
-
- // Type-check the package, load dependencies.
- // Create and build the SSA program.
- hello, _, err := ssautil.BuildPackage(
- &types.Config{Importer: importer.Default()}, fset, pkg, files, ssa.SanityCheckFunctions)
- if err != nil {
- fmt.Print(err) // type error in some package
- return
- }
-
- // Print out the package.
- hello.WriteTo(os.Stdout)
-
- // Print out the package-level functions.
- hello.Func("init").WriteTo(os.Stdout)
- hello.Func("main").WriteTo(os.Stdout)
-
- // Output:
- //
- // package hello:
- // func init func()
- // var init$guard bool
- // func main func()
- // const message message = "Hello, World!":untyped string
- //
- // # Name: hello.init
- // # Package: hello
- // # Synthetic: package initializer
- // func init():
- // 0: entry P:0 S:2
- // t0 = *init$guard bool
- // if t0 goto 2 else 1
- // 1: init.start P:1 S:1
- // *init$guard = true:bool
- // t1 = fmt.init() ()
- // jump 2
- // 2: init.done P:2 S:0
- // return
- //
- // # Name: hello.main
- // # Package: hello
- // # Location: hello.go:8:6
- // func main():
- // 0: entry P:0 S:0
- // t0 = new [1]interface{} (varargs) *[1]interface{}
- // t1 = &t0[0:int] *interface{}
- // t2 = make interface{} <- string ("Hello, World!":string) interface{}
- // *t1 = t2
- // t3 = slice t0[:] []interface{}
- // t4 = fmt.Println(t3...) (n int, err error)
- // return
-}
-
-// This program shows how to load a main package (cmd/cover) and all its
-// dependencies from source, using the loader, and then build SSA code
-// for the entire program. This is what you'd typically use for a
-// whole-program analysis.
-//
-func ExampleLoadProgram() {
- // Load cmd/cover and its dependencies.
- var conf loader.Config
- conf.Import("cmd/cover")
- lprog, err := conf.Load()
- if err != nil {
- fmt.Print(err) // type error in some package
- return
- }
-
- // Create SSA-form program representation.
- prog := ssautil.CreateProgram(lprog, ssa.SanityCheckFunctions)
-
- // Build SSA code for the entire cmd/cover program.
- prog.Build()
-
- // Output:
-}
diff --git a/vendor/golang.org/x/tools/go/ssa/func.go b/vendor/golang.org/x/tools/go/ssa/func.go
deleted file mode 100644
index b21ff4e..0000000
--- a/vendor/golang.org/x/tools/go/ssa/func.go
+++ /dev/null
@@ -1,689 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package ssa
-
-// This file implements the Function and BasicBlock types.
-
-import (
- "bytes"
- "fmt"
- "go/ast"
- "go/token"
- "go/types"
- "io"
- "os"
- "strings"
-)
-
-// addEdge adds a control-flow graph edge from from to to.
-func addEdge(from, to *BasicBlock) {
- from.Succs = append(from.Succs, to)
- to.Preds = append(to.Preds, from)
-}
-
-// Parent returns the function that contains block b.
-func (b *BasicBlock) Parent() *Function { return b.parent }
-
-// String returns a human-readable label of this block.
-// It is not guaranteed unique within the function.
-//
-func (b *BasicBlock) String() string {
- return fmt.Sprintf("%d", b.Index)
-}
-
-// emit appends an instruction to the current basic block.
-// If the instruction defines a Value, it is returned.
-//
-func (b *BasicBlock) emit(i Instruction) Value {
- i.setBlock(b)
- b.Instrs = append(b.Instrs, i)
- v, _ := i.(Value)
- return v
-}
-
-// predIndex returns the i such that b.Preds[i] == c or panics if
-// there is none.
-func (b *BasicBlock) predIndex(c *BasicBlock) int {
- for i, pred := range b.Preds {
- if pred == c {
- return i
- }
- }
- panic(fmt.Sprintf("no edge %s -> %s", c, b))
-}
-
-// hasPhi returns true if b.Instrs contains φ-nodes.
-func (b *BasicBlock) hasPhi() bool {
- _, ok := b.Instrs[0].(*Phi)
- return ok
-}
-
-// phis returns the prefix of b.Instrs containing all the block's φ-nodes.
-func (b *BasicBlock) phis() []Instruction {
- for i, instr := range b.Instrs {
- if _, ok := instr.(*Phi); !ok {
- return b.Instrs[:i]
- }
- }
- return nil // unreachable in well-formed blocks
-}
-
-// replacePred replaces all occurrences of p in b's predecessor list with q.
-// Ordinarily there should be at most one.
-//
-func (b *BasicBlock) replacePred(p, q *BasicBlock) {
- for i, pred := range b.Preds {
- if pred == p {
- b.Preds[i] = q
- }
- }
-}
-
-// replaceSucc replaces all occurrences of p in b's successor list with q.
-// Ordinarily there should be at most one.
-//
-func (b *BasicBlock) replaceSucc(p, q *BasicBlock) {
- for i, succ := range b.Succs {
- if succ == p {
- b.Succs[i] = q
- }
- }
-}
-
-// removePred removes all occurrences of p in b's
-// predecessor list and φ-nodes.
-// Ordinarily there should be at most one.
-//
-func (b *BasicBlock) removePred(p *BasicBlock) {
- phis := b.phis()
-
- // We must preserve edge order for φ-nodes.
- j := 0
- for i, pred := range b.Preds {
- if pred != p {
- b.Preds[j] = b.Preds[i]
- // Strike out φ-edge too.
- for _, instr := range phis {
- phi := instr.(*Phi)
- phi.Edges[j] = phi.Edges[i]
- }
- j++
- }
- }
- // Nil out b.Preds[j:] and φ-edges[j:] to aid GC.
- for i := j; i < len(b.Preds); i++ {
- b.Preds[i] = nil
- for _, instr := range phis {
- instr.(*Phi).Edges[i] = nil
- }
- }
- b.Preds = b.Preds[:j]
- for _, instr := range phis {
- phi := instr.(*Phi)
- phi.Edges = phi.Edges[:j]
- }
-}
-
-// Destinations associated with unlabelled for/switch/select stmts.
-// We push/pop one of these as we enter/leave each construct and for
-// each BranchStmt we scan for the innermost target of the right type.
-//
-type targets struct {
- tail *targets // rest of stack
- _break *BasicBlock
- _continue *BasicBlock
- _fallthrough *BasicBlock
-}
-
-// Destinations associated with a labelled block.
-// We populate these as labels are encountered in forward gotos or
-// labelled statements.
-//
-type lblock struct {
- _goto *BasicBlock
- _break *BasicBlock
- _continue *BasicBlock
-}
-
-// labelledBlock returns the branch target associated with the
-// specified label, creating it if needed.
-//
-func (f *Function) labelledBlock(label *ast.Ident) *lblock {
- lb := f.lblocks[label.Obj]
- if lb == nil {
- lb = &lblock{_goto: f.newBasicBlock(label.Name)}
- if f.lblocks == nil {
- f.lblocks = make(map[*ast.Object]*lblock)
- }
- f.lblocks[label.Obj] = lb
- }
- return lb
-}
-
-// addParam adds a (non-escaping) parameter to f.Params of the
-// specified name, type and source position.
-//
-func (f *Function) addParam(name string, typ types.Type, pos token.Pos) *Parameter {
- v := &Parameter{
- name: name,
- typ: typ,
- pos: pos,
- parent: f,
- }
- f.Params = append(f.Params, v)
- return v
-}
-
-func (f *Function) addParamObj(obj types.Object) *Parameter {
- name := obj.Name()
- if name == "" {
- name = fmt.Sprintf("arg%d", len(f.Params))
- }
- param := f.addParam(name, obj.Type(), obj.Pos())
- param.object = obj
- return param
-}
-
-// addSpilledParam declares a parameter that is pre-spilled to the
-// stack; the function body will load/store the spilled location.
-// Subsequent lifting will eliminate spills where possible.
-//
-func (f *Function) addSpilledParam(obj types.Object) {
- param := f.addParamObj(obj)
- spill := &Alloc{Comment: obj.Name()}
- spill.setType(types.NewPointer(obj.Type()))
- spill.setPos(obj.Pos())
- f.objects[obj] = spill
- f.Locals = append(f.Locals, spill)
- f.emit(spill)
- f.emit(&Store{Addr: spill, Val: param})
-}
-
-// startBody initializes the function prior to generating SSA code for its body.
-// Precondition: f.Type() already set.
-//
-func (f *Function) startBody() {
- f.currentBlock = f.newBasicBlock("entry")
- f.objects = make(map[types.Object]Value) // needed for some synthetics, e.g. init
-}
-
-// createSyntacticParams populates f.Params and generates code (spills
-// and named result locals) for all the parameters declared in the
-// syntax. In addition it populates the f.objects mapping.
-//
-// Preconditions:
-// f.startBody() was called.
-// Postcondition:
-// len(f.Params) == len(f.Signature.Params) + (f.Signature.Recv() ? 1 : 0)
-//
-func (f *Function) createSyntacticParams(recv *ast.FieldList, functype *ast.FuncType) {
- // Receiver (at most one inner iteration).
- if recv != nil {
- for _, field := range recv.List {
- for _, n := range field.Names {
- f.addSpilledParam(f.Pkg.info.Defs[n])
- }
- // Anonymous receiver? No need to spill.
- if field.Names == nil {
- f.addParamObj(f.Signature.Recv())
- }
- }
- }
-
- // Parameters.
- if functype.Params != nil {
- n := len(f.Params) // 1 if has recv, 0 otherwise
- for _, field := range functype.Params.List {
- for _, n := range field.Names {
- f.addSpilledParam(f.Pkg.info.Defs[n])
- }
- // Anonymous parameter? No need to spill.
- if field.Names == nil {
- f.addParamObj(f.Signature.Params().At(len(f.Params) - n))
- }
- }
- }
-
- // Named results.
- if functype.Results != nil {
- for _, field := range functype.Results.List {
- // Implicit "var" decl of locals for named results.
- for _, n := range field.Names {
- f.namedResults = append(f.namedResults, f.addLocalForIdent(n))
- }
- }
- }
-}
-
-// numberRegisters assigns numbers to all SSA registers
-// (value-defining Instructions) in f, to aid debugging.
-// (Non-Instruction Values are named at construction.)
-//
-func numberRegisters(f *Function) {
- v := 0
- for _, b := range f.Blocks {
- for _, instr := range b.Instrs {
- switch instr.(type) {
- case Value:
- instr.(interface {
- setNum(int)
- }).setNum(v)
- v++
- }
- }
- }
-}
-
-// buildReferrers populates the def/use information in all non-nil
-// Value.Referrers slice.
-// Precondition: all such slices are initially empty.
-func buildReferrers(f *Function) {
- var rands []*Value
- for _, b := range f.Blocks {
- for _, instr := range b.Instrs {
- rands = instr.Operands(rands[:0]) // recycle storage
- for _, rand := range rands {
- if r := *rand; r != nil {
- if ref := r.Referrers(); ref != nil {
- *ref = append(*ref, instr)
- }
- }
- }
- }
- }
-}
-
-// finishBody() finalizes the function after SSA code generation of its body.
-func (f *Function) finishBody() {
- f.objects = nil
- f.currentBlock = nil
- f.lblocks = nil
-
- // Don't pin the AST in memory (except in debug mode).
- if n := f.syntax; n != nil && !f.debugInfo() {
- f.syntax = extentNode{n.Pos(), n.End()}
- }
-
- // Remove from f.Locals any Allocs that escape to the heap.
- j := 0
- for _, l := range f.Locals {
- if !l.Heap {
- f.Locals[j] = l
- j++
- }
- }
- // Nil out f.Locals[j:] to aid GC.
- for i := j; i < len(f.Locals); i++ {
- f.Locals[i] = nil
- }
- f.Locals = f.Locals[:j]
-
- optimizeBlocks(f)
-
- buildReferrers(f)
-
- buildDomTree(f)
-
- if f.Prog.mode&NaiveForm == 0 {
- // For debugging pre-state of lifting pass:
- // numberRegisters(f)
- // f.WriteTo(os.Stderr)
- lift(f)
- }
-
- f.namedResults = nil // (used by lifting)
-
- numberRegisters(f)
-
- if f.Prog.mode&PrintFunctions != 0 {
- printMu.Lock()
- f.WriteTo(os.Stdout)
- printMu.Unlock()
- }
-
- if f.Prog.mode&SanityCheckFunctions != 0 {
- mustSanityCheck(f, nil)
- }
-}
-
-// removeNilBlocks eliminates nils from f.Blocks and updates each
-// BasicBlock.Index. Use this after any pass that may delete blocks.
-//
-func (f *Function) removeNilBlocks() {
- j := 0
- for _, b := range f.Blocks {
- if b != nil {
- b.Index = j
- f.Blocks[j] = b
- j++
- }
- }
- // Nil out f.Blocks[j:] to aid GC.
- for i := j; i < len(f.Blocks); i++ {
- f.Blocks[i] = nil
- }
- f.Blocks = f.Blocks[:j]
-}
-
-// SetDebugMode sets the debug mode for package pkg. If true, all its
-// functions will include full debug info. This greatly increases the
-// size of the instruction stream, and causes Functions to depend upon
-// the ASTs, potentially keeping them live in memory for longer.
-//
-func (pkg *Package) SetDebugMode(debug bool) {
- // TODO(adonovan): do we want ast.File granularity?
- pkg.debug = debug
-}
-
-// debugInfo reports whether debug info is wanted for this function.
-func (f *Function) debugInfo() bool {
- return f.Pkg != nil && f.Pkg.debug
-}
-
-// addNamedLocal creates a local variable, adds it to function f and
-// returns it. Its name and type are taken from obj. Subsequent
-// calls to f.lookup(obj) will return the same local.
-//
-func (f *Function) addNamedLocal(obj types.Object) *Alloc {
- l := f.addLocal(obj.Type(), obj.Pos())
- l.Comment = obj.Name()
- f.objects[obj] = l
- return l
-}
-
-func (f *Function) addLocalForIdent(id *ast.Ident) *Alloc {
- return f.addNamedLocal(f.Pkg.info.Defs[id])
-}
-
-// addLocal creates an anonymous local variable of type typ, adds it
-// to function f and returns it. pos is the optional source location.
-//
-func (f *Function) addLocal(typ types.Type, pos token.Pos) *Alloc {
- v := &Alloc{}
- v.setType(types.NewPointer(typ))
- v.setPos(pos)
- f.Locals = append(f.Locals, v)
- f.emit(v)
- return v
-}
-
-// lookup returns the address of the named variable identified by obj
-// that is local to function f or one of its enclosing functions.
-// If escaping, the reference comes from a potentially escaping pointer
-// expression and the referent must be heap-allocated.
-//
-func (f *Function) lookup(obj types.Object, escaping bool) Value {
- if v, ok := f.objects[obj]; ok {
- if alloc, ok := v.(*Alloc); ok && escaping {
- alloc.Heap = true
- }
- return v // function-local var (address)
- }
-
- // Definition must be in an enclosing function;
- // plumb it through intervening closures.
- if f.parent == nil {
- panic("no ssa.Value for " + obj.String())
- }
- outer := f.parent.lookup(obj, true) // escaping
- v := &FreeVar{
- name: obj.Name(),
- typ: outer.Type(),
- pos: outer.Pos(),
- outer: outer,
- parent: f,
- }
- f.objects[obj] = v
- f.FreeVars = append(f.FreeVars, v)
- return v
-}
-
-// emit emits the specified instruction to function f.
-func (f *Function) emit(instr Instruction) Value {
- return f.currentBlock.emit(instr)
-}
-
-// RelString returns the full name of this function, qualified by
-// package name, receiver type, etc.
-//
-// The specific formatting rules are not guaranteed and may change.
-//
-// Examples:
-// "math.IsNaN" // a package-level function
-// "(*bytes.Buffer).Bytes" // a declared method or a wrapper
-// "(*bytes.Buffer).Bytes$thunk" // thunk (func wrapping method; receiver is param 0)
-// "(*bytes.Buffer).Bytes$bound" // bound (func wrapping method; receiver supplied by closure)
-// "main.main$1" // an anonymous function in main
-// "main.init#1" // a declared init function
-// "main.init" // the synthesized package initializer
-//
-// When these functions are referred to from within the same package
-// (i.e. from == f.Pkg.Object), they are rendered without the package path.
-// For example: "IsNaN", "(*Buffer).Bytes", etc.
-//
-// All non-synthetic functions have distinct package-qualified names.
-// (But two methods may have the same name "(T).f" if one is a synthetic
-// wrapper promoting a non-exported method "f" from another package; in
-// that case, the strings are equal but the identifiers "f" are distinct.)
-//
-func (f *Function) RelString(from *types.Package) string {
- // Anonymous?
- if f.parent != nil {
- // An anonymous function's Name() looks like "parentName$1",
- // but its String() should include the type/package/etc.
- parent := f.parent.RelString(from)
- for i, anon := range f.parent.AnonFuncs {
- if anon == f {
- return fmt.Sprintf("%s$%d", parent, 1+i)
- }
- }
-
- return f.name // should never happen
- }
-
- // Method (declared or wrapper)?
- if recv := f.Signature.Recv(); recv != nil {
- return f.relMethod(from, recv.Type())
- }
-
- // Thunk?
- if f.method != nil {
- return f.relMethod(from, f.method.Recv())
- }
-
- // Bound?
- if len(f.FreeVars) == 1 && strings.HasSuffix(f.name, "$bound") {
- return f.relMethod(from, f.FreeVars[0].Type())
- }
-
- // Package-level function?
- // Prefix with package name for cross-package references only.
- if p := f.pkg(); p != nil && p != from {
- return fmt.Sprintf("%s.%s", p.Path(), f.name)
- }
-
- // Unknown.
- return f.name
-}
-
-func (f *Function) relMethod(from *types.Package, recv types.Type) string {
- return fmt.Sprintf("(%s).%s", relType(recv, from), f.name)
-}
-
-// writeSignature writes to buf the signature sig in declaration syntax.
-func writeSignature(buf *bytes.Buffer, from *types.Package, name string, sig *types.Signature, params []*Parameter) {
- buf.WriteString("func ")
- if recv := sig.Recv(); recv != nil {
- buf.WriteString("(")
- if n := params[0].Name(); n != "" {
- buf.WriteString(n)
- buf.WriteString(" ")
- }
- types.WriteType(buf, params[0].Type(), types.RelativeTo(from))
- buf.WriteString(") ")
- }
- buf.WriteString(name)
- types.WriteSignature(buf, sig, types.RelativeTo(from))
-}
-
-func (f *Function) pkg() *types.Package {
- if f.Pkg != nil {
- return f.Pkg.Pkg
- }
- return nil
-}
-
-var _ io.WriterTo = (*Function)(nil) // *Function implements io.Writer
-
-func (f *Function) WriteTo(w io.Writer) (int64, error) {
- var buf bytes.Buffer
- WriteFunction(&buf, f)
- n, err := w.Write(buf.Bytes())
- return int64(n), err
-}
-
-// WriteFunction writes to buf a human-readable "disassembly" of f.
-func WriteFunction(buf *bytes.Buffer, f *Function) {
- fmt.Fprintf(buf, "# Name: %s\n", f.String())
- if f.Pkg != nil {
- fmt.Fprintf(buf, "# Package: %s\n", f.Pkg.Pkg.Path())
- }
- if syn := f.Synthetic; syn != "" {
- fmt.Fprintln(buf, "# Synthetic:", syn)
- }
- if pos := f.Pos(); pos.IsValid() {
- fmt.Fprintf(buf, "# Location: %s\n", f.Prog.Fset.Position(pos))
- }
-
- if f.parent != nil {
- fmt.Fprintf(buf, "# Parent: %s\n", f.parent.Name())
- }
-
- if f.Recover != nil {
- fmt.Fprintf(buf, "# Recover: %s\n", f.Recover)
- }
-
- from := f.pkg()
-
- if f.FreeVars != nil {
- buf.WriteString("# Free variables:\n")
- for i, fv := range f.FreeVars {
- fmt.Fprintf(buf, "# % 3d:\t%s %s\n", i, fv.Name(), relType(fv.Type(), from))
- }
- }
-
- if len(f.Locals) > 0 {
- buf.WriteString("# Locals:\n")
- for i, l := range f.Locals {
- fmt.Fprintf(buf, "# % 3d:\t%s %s\n", i, l.Name(), relType(deref(l.Type()), from))
- }
- }
- writeSignature(buf, from, f.Name(), f.Signature, f.Params)
- buf.WriteString(":\n")
-
- if f.Blocks == nil {
- buf.WriteString("\t(external)\n")
- }
-
- // NB. column calculations are confused by non-ASCII
- // characters and assume 8-space tabs.
- const punchcard = 80 // for old time's sake.
- const tabwidth = 8
- for _, b := range f.Blocks {
- if b == nil {
- // Corrupt CFG.
- fmt.Fprintf(buf, ".nil:\n")
- continue
- }
- n, _ := fmt.Fprintf(buf, "%d:", b.Index)
- bmsg := fmt.Sprintf("%s P:%d S:%d", b.Comment, len(b.Preds), len(b.Succs))
- fmt.Fprintf(buf, "%*s%s\n", punchcard-1-n-len(bmsg), "", bmsg)
-
- if false { // CFG debugging
- fmt.Fprintf(buf, "\t# CFG: %s --> %s --> %s\n", b.Preds, b, b.Succs)
- }
- for _, instr := range b.Instrs {
- buf.WriteString("\t")
- switch v := instr.(type) {
- case Value:
- l := punchcard - tabwidth
- // Left-align the instruction.
- if name := v.Name(); name != "" {
- n, _ := fmt.Fprintf(buf, "%s = ", name)
- l -= n
- }
- n, _ := buf.WriteString(instr.String())
- l -= n
- // Right-align the type if there's space.
- if t := v.Type(); t != nil {
- buf.WriteByte(' ')
- ts := relType(t, from)
- l -= len(ts) + len(" ") // (spaces before and after type)
- if l > 0 {
- fmt.Fprintf(buf, "%*s", l, "")
- }
- buf.WriteString(ts)
- }
- case nil:
- // Be robust against bad transforms.
- buf.WriteString("")
- default:
- buf.WriteString(instr.String())
- }
- buf.WriteString("\n")
- }
- }
- fmt.Fprintf(buf, "\n")
-}
-
-// newBasicBlock adds to f a new basic block and returns it. It does
-// not automatically become the current block for subsequent calls to emit.
-// comment is an optional string for more readable debugging output.
-//
-func (f *Function) newBasicBlock(comment string) *BasicBlock {
- b := &BasicBlock{
- Index: len(f.Blocks),
- Comment: comment,
- parent: f,
- }
- b.Succs = b.succs2[:0]
- f.Blocks = append(f.Blocks, b)
- return b
-}
-
-// NewFunction returns a new synthetic Function instance belonging to
-// prog, with its name and signature fields set as specified.
-//
-// The caller is responsible for initializing the remaining fields of
-// the function object, e.g. Pkg, Params, Blocks.
-//
-// It is practically impossible for clients to construct well-formed
-// SSA functions/packages/programs directly, so we assume this is the
-// job of the Builder alone. NewFunction exists to provide clients a
-// little flexibility. For example, analysis tools may wish to
-// construct fake Functions for the root of the callgraph, a fake
-// "reflect" package, etc.
-//
-// TODO(adonovan): think harder about the API here.
-//
-func (prog *Program) NewFunction(name string, sig *types.Signature, provenance string) *Function {
- return &Function{Prog: prog, name: name, Signature: sig, Synthetic: provenance}
-}
-
-type extentNode [2]token.Pos
-
-func (n extentNode) Pos() token.Pos { return n[0] }
-func (n extentNode) End() token.Pos { return n[1] }
-
-// Syntax returns an ast.Node whose Pos/End methods provide the
-// lexical extent of the function if it was defined by Go source code
-// (f.Synthetic==""), or nil otherwise.
-//
-// If f was built with debug information (see Package.SetDebugRef),
-// the result is the *ast.FuncDecl or *ast.FuncLit that declared the
-// function. Otherwise, it is an opaque Node providing only position
-// information; this avoids pinning the AST in memory.
-//
-func (f *Function) Syntax() ast.Node { return f.syntax }
diff --git a/vendor/golang.org/x/tools/go/ssa/identical.go b/vendor/golang.org/x/tools/go/ssa/identical.go
deleted file mode 100644
index 53cbee1..0000000
--- a/vendor/golang.org/x/tools/go/ssa/identical.go
+++ /dev/null
@@ -1,7 +0,0 @@
-// +build go1.8
-
-package ssa
-
-import "go/types"
-
-var structTypesIdentical = types.IdenticalIgnoreTags
diff --git a/vendor/golang.org/x/tools/go/ssa/identical_17.go b/vendor/golang.org/x/tools/go/ssa/identical_17.go
deleted file mode 100644
index da89d33..0000000
--- a/vendor/golang.org/x/tools/go/ssa/identical_17.go
+++ /dev/null
@@ -1,7 +0,0 @@
-// +build !go1.8
-
-package ssa
-
-import "go/types"
-
-var structTypesIdentical = types.Identical
diff --git a/vendor/golang.org/x/tools/go/ssa/identical_test.go b/vendor/golang.org/x/tools/go/ssa/identical_test.go
deleted file mode 100644
index 404693d..0000000
--- a/vendor/golang.org/x/tools/go/ssa/identical_test.go
+++ /dev/null
@@ -1,9 +0,0 @@
-//+build go1.8
-
-package ssa_test
-
-import "testing"
-
-func TestValueForExprStructConv(t *testing.T) {
- testValueForExpr(t, "testdata/structconv.go")
-}
diff --git a/vendor/golang.org/x/tools/go/ssa/interp/external.go b/vendor/golang.org/x/tools/go/ssa/interp/external.go
deleted file mode 100644
index 34442ca..0000000
--- a/vendor/golang.org/x/tools/go/ssa/interp/external.go
+++ /dev/null
@@ -1,557 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package interp
-
-// Emulated functions that we cannot interpret because they are
-// external or because they use "unsafe" or "reflect" operations.
-
-import (
- "go/types"
- "math"
- "os"
- "runtime"
- "strings"
- "sync/atomic"
- "time"
- "unsafe"
-
- "golang.org/x/tools/go/ssa"
-)
-
-type externalFn func(fr *frame, args []value) value
-
-// TODO(adonovan): fix: reflect.Value abstracts an lvalue or an
-// rvalue; Set() causes mutations that can be observed via aliases.
-// We have not captured that correctly here.
-
-// Key strings are from Function.String().
-var externals = make(map[string]externalFn)
-
-func init() {
- // That little dot ۰ is an Arabic zero numeral (U+06F0), categories [Nd].
- for k, v := range map[string]externalFn{
- "(*sync.Pool).Get": ext۰sync۰Pool۰Get,
- "(*sync.Pool).Put": ext۰nop,
- "(reflect.Value).Bool": ext۰reflect۰Value۰Bool,
- "(reflect.Value).CanAddr": ext۰reflect۰Value۰CanAddr,
- "(reflect.Value).CanInterface": ext۰reflect۰Value۰CanInterface,
- "(reflect.Value).Elem": ext۰reflect۰Value۰Elem,
- "(reflect.Value).Field": ext۰reflect۰Value۰Field,
- "(reflect.Value).Float": ext۰reflect۰Value۰Float,
- "(reflect.Value).Index": ext۰reflect۰Value۰Index,
- "(reflect.Value).Int": ext۰reflect۰Value۰Int,
- "(reflect.Value).Interface": ext۰reflect۰Value۰Interface,
- "(reflect.Value).IsNil": ext۰reflect۰Value۰IsNil,
- "(reflect.Value).IsValid": ext۰reflect۰Value۰IsValid,
- "(reflect.Value).Kind": ext۰reflect۰Value۰Kind,
- "(reflect.Value).Len": ext۰reflect۰Value۰Len,
- "(reflect.Value).MapIndex": ext۰reflect۰Value۰MapIndex,
- "(reflect.Value).MapKeys": ext۰reflect۰Value۰MapKeys,
- "(reflect.Value).NumField": ext۰reflect۰Value۰NumField,
- "(reflect.Value).NumMethod": ext۰reflect۰Value۰NumMethod,
- "(reflect.Value).Pointer": ext۰reflect۰Value۰Pointer,
- "(reflect.Value).Set": ext۰reflect۰Value۰Set,
- "(reflect.Value).String": ext۰reflect۰Value۰String,
- "(reflect.Value).Type": ext۰reflect۰Value۰Type,
- "(reflect.Value).Uint": ext۰reflect۰Value۰Uint,
- "(reflect.error).Error": ext۰reflect۰error۰Error,
- "(reflect.rtype).Bits": ext۰reflect۰rtype۰Bits,
- "(reflect.rtype).Elem": ext۰reflect۰rtype۰Elem,
- "(reflect.rtype).Field": ext۰reflect۰rtype۰Field,
- "(reflect.rtype).In": ext۰reflect۰rtype۰In,
- "(reflect.rtype).Kind": ext۰reflect۰rtype۰Kind,
- "(reflect.rtype).NumField": ext۰reflect۰rtype۰NumField,
- "(reflect.rtype).NumIn": ext۰reflect۰rtype۰NumIn,
- "(reflect.rtype).NumMethod": ext۰reflect۰rtype۰NumMethod,
- "(reflect.rtype).NumOut": ext۰reflect۰rtype۰NumOut,
- "(reflect.rtype).Out": ext۰reflect۰rtype۰Out,
- "(reflect.rtype).Size": ext۰reflect۰rtype۰Size,
- "(reflect.rtype).String": ext۰reflect۰rtype۰String,
- "bytes.init": ext۰nop, // avoid asm dependency
- "bytes.Equal": ext۰bytes۰Equal,
- "bytes.IndexByte": ext۰bytes۰IndexByte,
- "hash/crc32.haveSSE42": ext۰crc32۰haveSSE42,
- "internal/cpu.cpuid": ext۰cpu۰cpuid,
- "math.Abs": ext۰math۰Abs,
- "math.Exp": ext۰math۰Exp,
- "math.Float32bits": ext۰math۰Float32bits,
- "math.Float32frombits": ext۰math۰Float32frombits,
- "math.Float64bits": ext۰math۰Float64bits,
- "math.Float64frombits": ext۰math۰Float64frombits,
- "math.Ldexp": ext۰math۰Ldexp,
- "math.Log": ext۰math۰Log,
- "math.Min": ext۰math۰Min,
- "math.hasSSE4": ext۰math۰hasSSE4,
- "math.hasVectorFacility": ext۰math۰hasVectorFacility,
- "os.runtime_args": ext۰os۰runtime_args,
- "os.runtime_beforeExit": ext۰nop,
- "os/signal.init": ext۰nop,
- "reflect.New": ext۰reflect۰New,
- "reflect.SliceOf": ext۰reflect۰SliceOf,
- "reflect.TypeOf": ext۰reflect۰TypeOf,
- "reflect.ValueOf": ext۰reflect۰ValueOf,
- "reflect.Zero": ext۰reflect۰Zero,
- "reflect.init": ext۰reflect۰Init,
- "reflect.valueInterface": ext۰reflect۰valueInterface,
- "runtime.Breakpoint": ext۰runtime۰Breakpoint,
- "runtime.Caller": ext۰runtime۰Caller,
- "runtime.Callers": ext۰runtime۰Callers,
- "runtime.FuncForPC": ext۰runtime۰FuncForPC,
- "runtime.GC": ext۰runtime۰GC,
- "runtime.GOMAXPROCS": ext۰runtime۰GOMAXPROCS,
- "runtime.Goexit": ext۰runtime۰Goexit,
- "runtime.Gosched": ext۰runtime۰Gosched,
- "runtime.init": ext۰nop,
- "runtime.KeepAlive": ext۰nop,
- "runtime.NumCPU": ext۰runtime۰NumCPU,
- "runtime.NumGoroutine": ext۰runtime۰NumGoroutine,
- "runtime.ReadMemStats": ext۰runtime۰ReadMemStats,
- "runtime.SetFinalizer": ext۰nop, // ignore
- "(*runtime.Func).Entry": ext۰runtime۰Func۰Entry,
- "(*runtime.Func).FileLine": ext۰runtime۰Func۰FileLine,
- "(*runtime.Func).Name": ext۰runtime۰Func۰Name,
- "runtime.environ": ext۰runtime۰environ,
- "runtime.getgoroot": ext۰runtime۰getgoroot,
- "strings.init": ext۰nop, // avoid asm dependency
- "strings.Count": ext۰strings۰Count,
- "strings.Index": ext۰strings۰Index,
- "strings.IndexByte": ext۰strings۰IndexByte,
- "sync.runtime_Semacquire": ext۰nop, // unimplementable
- "sync.runtime_Semrelease": ext۰nop, // unimplementable
- "sync.runtime_Syncsemcheck": ext۰nop, // unimplementable
- "sync.runtime_notifyListCheck": ext۰nop,
- "sync.runtime_registerPoolCleanup": ext۰nop,
- "sync/atomic.AddInt32": ext۰atomic۰AddInt32,
- "sync/atomic.AddUint32": ext۰atomic۰AddUint32,
- "sync/atomic.CompareAndSwapInt32": ext۰atomic۰CompareAndSwapInt32,
- "sync/atomic.CompareAndSwapUint32": ext۰atomic۰CompareAndSwapUint32,
- "sync/atomic.LoadInt32": ext۰atomic۰LoadInt32,
- "sync/atomic.LoadUint32": ext۰atomic۰LoadUint32,
- "sync/atomic.StoreInt32": ext۰atomic۰StoreInt32,
- "sync/atomic.StoreUint32": ext۰atomic۰StoreUint32,
- "sync/atomic.AddInt64": ext۰atomic۰AddInt64,
- "sync/atomic.AddUint64": ext۰atomic۰AddUint64,
- "sync/atomic.CompareAndSwapInt64": ext۰atomic۰CompareAndSwapInt64,
- "sync/atomic.CompareAndSwapUint64": ext۰atomic۰CompareAndSwapUint64,
- "sync/atomic.LoadInt64": ext۰atomic۰LoadInt64,
- "sync/atomic.LoadUint64": ext۰atomic۰LoadUint64,
- "sync/atomic.StoreInt64": ext۰atomic۰StoreInt64,
- "sync/atomic.StoreUint64": ext۰atomic۰StoreUint64,
- "(*sync/atomic.Value).Load": ext۰atomic۰ValueLoad,
- "(*sync/atomic.Value).Store": ext۰atomic۰ValueStore,
- "testing.MainStart": ext۰testing۰MainStart,
- "time.Sleep": ext۰time۰Sleep,
- "time.now": ext۰time۰now,
- } {
- externals[k] = v
- }
-}
-
-// wrapError returns an interpreted 'error' interface value for err.
-func wrapError(err error) value {
- if err == nil {
- return iface{}
- }
- return iface{t: errorType, v: err.Error()}
-}
-
-func ext۰nop(fr *frame, args []value) value { return nil }
-
-func ext۰sync۰Pool۰Get(fr *frame, args []value) value {
- Pool := fr.i.prog.ImportedPackage("sync").Type("Pool").Object()
- _, newIndex, _ := types.LookupFieldOrMethod(Pool.Type(), false, Pool.Pkg(), "New")
-
- if New := (*args[0].(*value)).(structure)[newIndex[0]]; New != nil {
- return call(fr.i, fr, 0, New, nil)
- }
- return nil
-}
-
-func ext۰bytes۰Equal(fr *frame, args []value) value {
- // func Equal(a, b []byte) bool
- a := args[0].([]value)
- b := args[1].([]value)
- if len(a) != len(b) {
- return false
- }
- for i := range a {
- if a[i] != b[i] {
- return false
- }
- }
- return true
-}
-
-func ext۰bytes۰IndexByte(fr *frame, args []value) value {
- // func IndexByte(s []byte, c byte) int
- s := args[0].([]value)
- c := args[1].(byte)
- for i, b := range s {
- if b.(byte) == c {
- return i
- }
- }
- return -1
-}
-
-func ext۰crc32۰haveSSE42(fr *frame, args []value) value {
- return false
-}
-
-func ext۰math۰Float64frombits(fr *frame, args []value) value {
- return math.Float64frombits(args[0].(uint64))
-}
-
-func ext۰math۰Float64bits(fr *frame, args []value) value {
- return math.Float64bits(args[0].(float64))
-}
-
-func ext۰math۰Float32frombits(fr *frame, args []value) value {
- return math.Float32frombits(args[0].(uint32))
-}
-
-func ext۰math۰Abs(fr *frame, args []value) value {
- return math.Abs(args[0].(float64))
-}
-
-func ext۰math۰Exp(fr *frame, args []value) value {
- return math.Exp(args[0].(float64))
-}
-
-func ext۰math۰Float32bits(fr *frame, args []value) value {
- return math.Float32bits(args[0].(float32))
-}
-
-func ext۰math۰Min(fr *frame, args []value) value {
- return math.Min(args[0].(float64), args[1].(float64))
-}
-
-func ext۰math۰hasSSE4(fr *frame, args []value) value {
- return false
-}
-
-func ext۰math۰hasVectorFacility(fr *frame, args []value) value {
- return false
-}
-
-func ext۰math۰Ldexp(fr *frame, args []value) value {
- return math.Ldexp(args[0].(float64), args[1].(int))
-}
-
-func ext۰math۰Log(fr *frame, args []value) value {
- return math.Log(args[0].(float64))
-}
-
-func ext۰os۰runtime_args(fr *frame, args []value) value {
- return fr.i.osArgs
-}
-
-func ext۰runtime۰Breakpoint(fr *frame, args []value) value {
- runtime.Breakpoint()
- return nil
-}
-
-func ext۰runtime۰Caller(fr *frame, args []value) value {
- // func Caller(skip int) (pc uintptr, file string, line int, ok bool)
- skip := 1 + args[0].(int)
- for i := 0; i < skip; i++ {
- if fr != nil {
- fr = fr.caller
- }
- }
- var pc uintptr
- var file string
- var line int
- var ok bool
- if fr != nil {
- fn := fr.fn
- // TODO(adonovan): use pc/posn of current instruction, not start of fn.
- // (Required to interpret the log package's tests.)
- pc = uintptr(unsafe.Pointer(fn))
- posn := fn.Prog.Fset.Position(fn.Pos())
- file = posn.Filename
- line = posn.Line
- ok = true
- }
- return tuple{pc, file, line, ok}
-}
-
-func ext۰runtime۰Callers(fr *frame, args []value) value {
- // Callers(skip int, pc []uintptr) int
- skip := args[0].(int)
- pc := args[1].([]value)
- for i := 0; i < skip; i++ {
- if fr != nil {
- fr = fr.caller
- }
- }
- i := 0
- for fr != nil && i < len(pc) {
- pc[i] = uintptr(unsafe.Pointer(fr.fn))
- i++
- fr = fr.caller
- }
- return i
-}
-
-func ext۰runtime۰FuncForPC(fr *frame, args []value) value {
- // FuncForPC(pc uintptr) *Func
- pc := args[0].(uintptr)
- var fn *ssa.Function
- if pc != 0 {
- fn = (*ssa.Function)(unsafe.Pointer(pc)) // indeed unsafe!
- }
- var Func value
- Func = structure{fn} // a runtime.Func
- return &Func
-}
-
-func ext۰runtime۰environ(fr *frame, args []value) value {
- // This function also implements syscall.runtime_envs.
- return environ
-}
-
-func ext۰runtime۰getgoroot(fr *frame, args []value) value {
- return os.Getenv("GOROOT")
-}
-
-func ext۰strings۰Count(fr *frame, args []value) value {
- // Call compiled version to avoid asm dependency.
- return strings.Count(args[0].(string), args[1].(string))
-}
-
-func ext۰strings۰IndexByte(fr *frame, args []value) value {
- // Call compiled version to avoid asm dependency.
- return strings.IndexByte(args[0].(string), args[1].(byte))
-}
-
-func ext۰strings۰Index(fr *frame, args []value) value {
- // Call compiled version to avoid asm dependency.
- return strings.Index(args[0].(string), args[1].(string))
-}
-
-func ext۰runtime۰GOMAXPROCS(fr *frame, args []value) value {
- // Ignore args[0]; don't let the interpreted program
- // set the interpreter's GOMAXPROCS!
- return runtime.GOMAXPROCS(0)
-}
-
-func ext۰runtime۰Goexit(fr *frame, args []value) value {
- // TODO(adonovan): don't kill the interpreter's main goroutine.
- runtime.Goexit()
- return nil
-}
-
-func ext۰runtime۰GC(fr *frame, args []value) value {
- runtime.GC()
- return nil
-}
-
-func ext۰runtime۰Gosched(fr *frame, args []value) value {
- runtime.Gosched()
- return nil
-}
-
-func ext۰runtime۰NumCPU(fr *frame, args []value) value {
- return runtime.NumCPU()
-}
-
-func ext۰runtime۰NumGoroutine(fr *frame, args []value) value {
- return int(atomic.LoadInt32(&fr.i.goroutines))
-}
-
-func ext۰runtime۰ReadMemStats(fr *frame, args []value) value {
- // TODO(adonovan): populate args[0].(Struct)
- return nil
-}
-
-func ext۰atomic۰LoadUint32(fr *frame, args []value) value {
- // TODO(adonovan): fix: not atomic!
- return (*args[0].(*value)).(uint32)
-}
-
-func ext۰atomic۰StoreUint32(fr *frame, args []value) value {
- // TODO(adonovan): fix: not atomic!
- *args[0].(*value) = args[1].(uint32)
- return nil
-}
-
-func ext۰atomic۰LoadInt32(fr *frame, args []value) value {
- // TODO(adonovan): fix: not atomic!
- return (*args[0].(*value)).(int32)
-}
-
-func ext۰atomic۰StoreInt32(fr *frame, args []value) value {
- // TODO(adonovan): fix: not atomic!
- *args[0].(*value) = args[1].(int32)
- return nil
-}
-
-func ext۰atomic۰CompareAndSwapInt32(fr *frame, args []value) value {
- // TODO(adonovan): fix: not atomic!
- p := args[0].(*value)
- if (*p).(int32) == args[1].(int32) {
- *p = args[2].(int32)
- return true
- }
- return false
-}
-
-func ext۰atomic۰CompareAndSwapUint32(fr *frame, args []value) value {
- // TODO(adonovan): fix: not atomic!
- p := args[0].(*value)
- if (*p).(uint32) == args[1].(uint32) {
- *p = args[2].(uint32)
- return true
- }
- return false
-}
-
-func ext۰atomic۰AddInt32(fr *frame, args []value) value {
- // TODO(adonovan): fix: not atomic!
- p := args[0].(*value)
- newv := (*p).(int32) + args[1].(int32)
- *p = newv
- return newv
-}
-
-func ext۰atomic۰AddUint32(fr *frame, args []value) value {
- // TODO(adonovan): fix: not atomic!
- p := args[0].(*value)
- newv := (*p).(uint32) + args[1].(uint32)
- *p = newv
- return newv
-}
-
-func ext۰atomic۰LoadUint64(fr *frame, args []value) value {
- // TODO(adonovan): fix: not atomic!
- return (*args[0].(*value)).(uint64)
-}
-
-func ext۰atomic۰StoreUint64(fr *frame, args []value) value {
- // TODO(adonovan): fix: not atomic!
- *args[0].(*value) = args[1].(uint64)
- return nil
-}
-
-func ext۰atomic۰LoadInt64(fr *frame, args []value) value {
- // TODO(adonovan): fix: not atomic!
- return (*args[0].(*value)).(int64)
-}
-
-func ext۰atomic۰StoreInt64(fr *frame, args []value) value {
- // TODO(adonovan): fix: not atomic!
- *args[0].(*value) = args[1].(int64)
- return nil
-}
-
-func ext۰atomic۰CompareAndSwapInt64(fr *frame, args []value) value {
- // TODO(adonovan): fix: not atomic!
- p := args[0].(*value)
- if (*p).(int64) == args[1].(int64) {
- *p = args[2].(int64)
- return true
- }
- return false
-}
-
-func ext۰atomic۰CompareAndSwapUint64(fr *frame, args []value) value {
- // TODO(adonovan): fix: not atomic!
- p := args[0].(*value)
- if (*p).(uint64) == args[1].(uint64) {
- *p = args[2].(uint64)
- return true
- }
- return false
-}
-
-func ext۰atomic۰AddInt64(fr *frame, args []value) value {
- // TODO(adonovan): fix: not atomic!
- p := args[0].(*value)
- newv := (*p).(int64) + args[1].(int64)
- *p = newv
- return newv
-}
-
-func ext۰atomic۰AddUint64(fr *frame, args []value) value {
- // TODO(adonovan): fix: not atomic!
- p := args[0].(*value)
- newv := (*p).(uint64) + args[1].(uint64)
- *p = newv
- return newv
-}
-
-func ext۰atomic۰ValueLoad(fr *frame, args []value) value {
- // TODO(adonovan): fix: not atomic!
- // Receiver is *struct{v interface{}}.
- return (*args[0].(*value)).(structure)[0]
-}
-
-func ext۰atomic۰ValueStore(fr *frame, args []value) value {
- // TODO(adonovan): fix: not atomic!
- // Receiver is *struct{v interface{}}.
- (*args[0].(*value)).(structure)[0] = args[1]
- return nil
-}
-
-func ext۰cpu۰cpuid(fr *frame, args []value) value {
- return tuple{uint32(0), uint32(0), uint32(0), uint32(0)}
-}
-
-// Pretend: type runtime.Func struct { entry *ssa.Function }
-
-func ext۰runtime۰Func۰FileLine(fr *frame, args []value) value {
- // func (*runtime.Func) FileLine(uintptr) (string, int)
- f, _ := (*args[0].(*value)).(structure)[0].(*ssa.Function)
- pc := args[1].(uintptr)
- _ = pc
- if f != nil {
- // TODO(adonovan): use position of current instruction, not fn.
- posn := f.Prog.Fset.Position(f.Pos())
- return tuple{posn.Filename, posn.Line}
- }
- return tuple{"", 0}
-}
-
-func ext۰runtime۰Func۰Name(fr *frame, args []value) value {
- // func (*runtime.Func) Name() string
- f, _ := (*args[0].(*value)).(structure)[0].(*ssa.Function)
- if f != nil {
- return f.String()
- }
- return ""
-}
-
-func ext۰runtime۰Func۰Entry(fr *frame, args []value) value {
- // func (*runtime.Func) Entry() uintptr
- f, _ := (*args[0].(*value)).(structure)[0].(*ssa.Function)
- return uintptr(unsafe.Pointer(f))
-}
-
-func ext۰time۰now(fr *frame, args []value) value {
- nano := time.Now().UnixNano()
- return tuple{int64(nano / 1e9), int32(nano % 1e9), int64(0)}
-}
-
-func ext۰time۰Sleep(fr *frame, args []value) value {
- time.Sleep(time.Duration(args[0].(int64)))
- return nil
-}
-
-func valueToBytes(v value) []byte {
- in := v.([]value)
- b := make([]byte, len(in))
- for i := range in {
- b[i] = in[i].(byte)
- }
- return b
-}
-
-func ext۰testing۰MainStart(fr *frame, args []value) value {
- // We no longer support interpretation of the "testing" package
- // because it changes too often and uses low-level features that
- // are a pain to emulate.
- panic(`interpretation of the "testing" package is no longer supported`)
-}
diff --git a/vendor/golang.org/x/tools/go/ssa/interp/external_darwin.go b/vendor/golang.org/x/tools/go/ssa/interp/external_darwin.go
deleted file mode 100644
index 4713009..0000000
--- a/vendor/golang.org/x/tools/go/ssa/interp/external_darwin.go
+++ /dev/null
@@ -1,35 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build darwin
-
-package interp
-
-import "syscall"
-
-func init() {
- externals["syscall.Sysctl"] = ext۰syscall۰Sysctl
-
- fillStat = func(st *syscall.Stat_t, stat structure) {
- stat[0] = st.Dev
- stat[1] = st.Mode
- stat[2] = st.Nlink
- stat[3] = st.Ino
- stat[4] = st.Uid
- stat[5] = st.Gid
- stat[6] = st.Rdev
- // TODO(adonovan): fix: copy Timespecs.
- // stat[8] = st.Atim
- // stat[9] = st.Mtim
- // stat[10] = st.Ctim
- stat[12] = st.Size
- stat[13] = st.Blocks
- stat[14] = st.Blksize
- }
-}
-
-func ext۰syscall۰Sysctl(fr *frame, args []value) value {
- r, err := syscall.Sysctl(args[0].(string))
- return tuple{r, wrapError(err)}
-}
diff --git a/vendor/golang.org/x/tools/go/ssa/interp/external_unix.go b/vendor/golang.org/x/tools/go/ssa/interp/external_unix.go
deleted file mode 100644
index bfa39f6..0000000
--- a/vendor/golang.org/x/tools/go/ssa/interp/external_unix.go
+++ /dev/null
@@ -1,256 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build darwin linux
-
-package interp
-
-import "syscall"
-
-func init() {
- for k, v := range map[string]externalFn{
- "os.Pipe": ext۰os۰Pipe,
- "syscall.Close": ext۰syscall۰Close,
- "syscall.Exit": ext۰syscall۰Exit,
- "syscall.Fchown": ext۰syscall۰Fchown,
- "syscall.Fstat": ext۰syscall۰Fstat,
- "syscall.Ftruncate": ext۰syscall۰Ftruncate,
- "syscall.Getpid": ext۰syscall۰Getpid,
- "syscall.Getwd": ext۰syscall۰Getwd,
- "syscall.Kill": ext۰syscall۰Kill,
- "syscall.Link": ext۰syscall۰Link,
- "syscall.Lstat": ext۰syscall۰Lstat,
- "syscall.Mkdir": ext۰syscall۰Mkdir,
- "syscall.Open": ext۰syscall۰Open,
- "syscall.ParseDirent": ext۰syscall۰ParseDirent,
- "syscall.RawSyscall": ext۰syscall۰RawSyscall,
- "syscall.Read": ext۰syscall۰Read,
- "syscall.ReadDirent": ext۰syscall۰ReadDirent,
- "syscall.Readlink": ext۰syscall۰Readlink,
- "syscall.Rmdir": ext۰syscall۰Rmdir,
- "syscall.Seek": ext۰syscall۰Seek,
- "syscall.Stat": ext۰syscall۰Stat,
- "syscall.Symlink": ext۰syscall۰Symlink,
- "syscall.Write": ext۰syscall۰Write,
- "syscall.Unlink": ext۰syscall۰Unlink,
- "syscall۰UtimesNano": ext۰syscall۰UtimesNano,
- "syscall.setenv_c": ext۰nop,
- "syscall.unsetenv_c": ext۰nop,
- "syscall.runtime_envs": ext۰runtime۰environ,
- } {
- externals[k] = v
- }
-
- syswrite = syscall.Write
-}
-
-func ext۰os۰Pipe(fr *frame, args []value) value {
- // func os.Pipe() (r *File, w *File, err error)
-
- // The portable POSIX pipe(2) call is good enough for our needs.
- var p [2]int
- if err := syscall.Pipe(p[:]); err != nil {
- // TODO(adonovan): fix: return an *os.SyscallError.
- return tuple{nil, nil, wrapError(err)}
- }
-
- NewFile := fr.i.prog.ImportedPackage("os").Func("NewFile")
- r := call(fr.i, fr, 0, NewFile, []value{uintptr(p[0]), "|0"})
- w := call(fr.i, fr, 0, NewFile, []value{uintptr(p[1]), "|1"})
- return tuple{r, w, wrapError(nil)}
-}
-
-// overridden on darwin
-var fillStat = func(st *syscall.Stat_t, stat structure) {
- stat[0] = st.Dev
- stat[1] = st.Ino
- stat[2] = st.Nlink
- stat[3] = st.Mode
- stat[4] = st.Uid
- stat[5] = st.Gid
- stat[7] = st.Rdev
- stat[8] = st.Size
- stat[9] = st.Blksize
- stat[10] = st.Blocks
- // TODO(adonovan): fix: copy Timespecs.
- // stat[11] = st.Atim
- // stat[12] = st.Mtim
- // stat[13] = st.Ctim
-}
-
-func ext۰syscall۰Close(fr *frame, args []value) value {
- // func Close(fd int) (err error)
- return wrapError(syscall.Close(args[0].(int)))
-}
-
-func ext۰syscall۰Exit(fr *frame, args []value) value {
- panic(exitPanic(args[0].(int)))
-}
-
-func ext۰syscall۰Fchown(fr *frame, args []value) value {
- fd := args[0].(int)
- uid := args[1].(int)
- gid := args[2].(int)
- return wrapError(syscall.Fchown(fd, uid, gid))
-}
-
-func ext۰syscall۰Fstat(fr *frame, args []value) value {
- // func Fstat(fd int, stat *Stat_t) (err error)
- fd := args[0].(int)
- stat := (*args[1].(*value)).(structure)
-
- var st syscall.Stat_t
- err := syscall.Fstat(fd, &st)
- fillStat(&st, stat)
- return wrapError(err)
-}
-
-func ext۰syscall۰Ftruncate(fr *frame, args []value) value {
- fd := args[0].(int)
- length := args[1].(int64)
- return wrapError(syscall.Ftruncate(fd, length))
-}
-
-func ext۰syscall۰Getpid(fr *frame, args []value) value {
- return syscall.Getpid()
-}
-
-func ext۰syscall۰Getwd(fr *frame, args []value) value {
- s, err := syscall.Getwd()
- return tuple{s, wrapError(err)}
-}
-
-func ext۰syscall۰Kill(fr *frame, args []value) value {
- // func Kill(pid int, sig Signal) (err error)
- return wrapError(syscall.Kill(args[0].(int), syscall.Signal(args[1].(int))))
-}
-
-func ext۰syscall۰Link(fr *frame, args []value) value {
- path := args[0].(string)
- link := args[1].(string)
- return wrapError(syscall.Link(path, link))
-}
-
-func ext۰syscall۰Lstat(fr *frame, args []value) value {
- // func Lstat(name string, stat *Stat_t) (err error)
- name := args[0].(string)
- stat := (*args[1].(*value)).(structure)
-
- var st syscall.Stat_t
- err := syscall.Lstat(name, &st)
- fillStat(&st, stat)
- return wrapError(err)
-}
-
-func ext۰syscall۰Mkdir(fr *frame, args []value) value {
- path := args[0].(string)
- mode := args[1].(uint32)
- return wrapError(syscall.Mkdir(path, mode))
-}
-
-func ext۰syscall۰Open(fr *frame, args []value) value {
- // func Open(path string, mode int, perm uint32) (fd int, err error) {
- path := args[0].(string)
- mode := args[1].(int)
- perm := args[2].(uint32)
- fd, err := syscall.Open(path, mode, perm)
- return tuple{fd, wrapError(err)}
-}
-
-func ext۰syscall۰ParseDirent(fr *frame, args []value) value {
- // func ParseDirent(buf []byte, max int, names []string) (consumed int, count int, newnames []string)
- max := args[1].(int)
- var names []string
- for _, iname := range args[2].([]value) {
- names = append(names, iname.(string))
- }
- consumed, count, newnames := syscall.ParseDirent(valueToBytes(args[0]), max, names)
- var inewnames []value
- for _, newname := range newnames {
- inewnames = append(inewnames, newname)
- }
- return tuple{consumed, count, inewnames}
-}
-
-func ext۰syscall۰RawSyscall(fr *frame, args []value) value {
- return tuple{uintptr(0), uintptr(0), uintptr(syscall.ENOSYS)}
-}
-
-func ext۰syscall۰Read(fr *frame, args []value) value {
- // func Read(fd int, p []byte) (n int, err error)
- fd := args[0].(int)
- p := args[1].([]value)
- b := make([]byte, len(p))
- n, err := syscall.Read(fd, b)
- for i := 0; i < n; i++ {
- p[i] = b[i]
- }
- return tuple{n, wrapError(err)}
-}
-
-func ext۰syscall۰ReadDirent(fr *frame, args []value) value {
- // func ReadDirent(fd int, buf []byte) (n int, err error)
- fd := args[0].(int)
- p := args[1].([]value)
- b := make([]byte, len(p))
- n, err := syscall.ReadDirent(fd, b)
- for i := 0; i < n; i++ {
- p[i] = b[i]
- }
- return tuple{n, wrapError(err)}
-}
-
-func ext۰syscall۰Readlink(fr *frame, args []value) value {
- path := args[0].(string)
- buf := valueToBytes(args[1])
- n, err := syscall.Readlink(path, buf)
- return tuple{n, wrapError(err)}
-}
-
-func ext۰syscall۰Rmdir(fr *frame, args []value) value {
- return wrapError(syscall.Rmdir(args[0].(string)))
-}
-
-func ext۰syscall۰Seek(fr *frame, args []value) value {
- fd := args[0].(int)
- offset := args[1].(int64)
- whence := args[2].(int)
- new, err := syscall.Seek(fd, offset, whence)
- return tuple{new, wrapError(err)}
-}
-
-func ext۰syscall۰Stat(fr *frame, args []value) value {
- // func Stat(name string, stat *Stat_t) (err error)
- name := args[0].(string)
- stat := (*args[1].(*value)).(structure)
-
- var st syscall.Stat_t
- err := syscall.Stat(name, &st)
- fillStat(&st, stat)
- return wrapError(err)
-}
-
-func ext۰syscall۰Symlink(fr *frame, args []value) value {
- path := args[0].(string)
- link := args[1].(string)
- return wrapError(syscall.Symlink(path, link))
-}
-
-func ext۰syscall۰Unlink(fr *frame, args []value) value {
- return wrapError(syscall.Unlink(args[0].(string)))
-}
-
-func ext۰syscall۰UtimesNano(fr *frame, args []value) value {
- path := args[0].(string)
- var ts [2]syscall.Timespec
- err := syscall.UtimesNano(path, ts[:])
- // TODO(adonovan): copy the Timespecs into args[1]
- return wrapError(err)
-}
-
-func ext۰syscall۰Write(fr *frame, args []value) value {
- // func Write(fd int, p []byte) (n int, err error)
- n, err := write(args[0].(int), valueToBytes(args[1]))
- return tuple{n, wrapError(err)}
-}
diff --git a/vendor/golang.org/x/tools/go/ssa/interp/interp.go b/vendor/golang.org/x/tools/go/ssa/interp/interp.go
deleted file mode 100644
index c092960..0000000
--- a/vendor/golang.org/x/tools/go/ssa/interp/interp.go
+++ /dev/null
@@ -1,764 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Package ssa/interp defines an interpreter for the SSA
-// representation of Go programs.
-//
-// This interpreter is provided as an adjunct for testing the SSA
-// construction algorithm. Its purpose is to provide a minimal
-// metacircular implementation of the dynamic semantics of each SSA
-// instruction. It is not, and will never be, a production-quality Go
-// interpreter.
-//
-// The following is a partial list of Go features that are currently
-// unsupported or incomplete in the interpreter.
-//
-// * Unsafe operations, including all uses of unsafe.Pointer, are
-// impossible to support given the "boxed" value representation we
-// have chosen.
-//
-// * The reflect package is only partially implemented.
-//
-// * The "testing" package is no longer supported because it
-// depends on low-level details that change too often.
-//
-// * "sync/atomic" operations are not atomic due to the "boxed" value
-// representation: it is not possible to read, modify and write an
-// interface value atomically. As a consequence, Mutexes are currently
-// broken.
-//
-// * recover is only partially implemented. Also, the interpreter
-// makes no attempt to distinguish target panics from interpreter
-// crashes.
-//
-// * map iteration is asymptotically inefficient.
-//
-// * the sizes of the int, uint and uintptr types in the target
-// program are assumed to be the same as those of the interpreter
-// itself.
-//
-// * all values occupy space, even those of types defined by the spec
-// to have zero size, e.g. struct{}. This can cause asymptotic
-// performance degradation.
-//
-// * os.Exit is implemented using panic, causing deferred functions to
-// run.
-package interp // import "golang.org/x/tools/go/ssa/interp"
-
-import (
- "fmt"
- "go/token"
- "go/types"
- "os"
- "reflect"
- "runtime"
- "sync/atomic"
-
- "golang.org/x/tools/go/ssa"
-)
-
-type continuation int
-
-const (
- kNext continuation = iota
- kReturn
- kJump
-)
-
-// Mode is a bitmask of options affecting the interpreter.
-type Mode uint
-
-const (
- DisableRecover Mode = 1 << iota // Disable recover() in target programs; show interpreter crash instead.
- EnableTracing // Print a trace of all instructions as they are interpreted.
-)
-
-type methodSet map[string]*ssa.Function
-
-// State shared between all interpreted goroutines.
-type interpreter struct {
- osArgs []value // the value of os.Args
- prog *ssa.Program // the SSA program
- globals map[ssa.Value]*value // addresses of global variables (immutable)
- mode Mode // interpreter options
- reflectPackage *ssa.Package // the fake reflect package
- errorMethods methodSet // the method set of reflect.error, which implements the error interface.
- rtypeMethods methodSet // the method set of rtype, which implements the reflect.Type interface.
- runtimeErrorString types.Type // the runtime.errorString type
- sizes types.Sizes // the effective type-sizing function
- goroutines int32 // atomically updated
-}
-
-type deferred struct {
- fn value
- args []value
- instr *ssa.Defer
- tail *deferred
-}
-
-type frame struct {
- i *interpreter
- caller *frame
- fn *ssa.Function
- block, prevBlock *ssa.BasicBlock
- env map[ssa.Value]value // dynamic values of SSA variables
- locals []value
- defers *deferred
- result value
- panicking bool
- panic interface{}
-}
-
-func (fr *frame) get(key ssa.Value) value {
- switch key := key.(type) {
- case nil:
- // Hack; simplifies handling of optional attributes
- // such as ssa.Slice.{Low,High}.
- return nil
- case *ssa.Function, *ssa.Builtin:
- return key
- case *ssa.Const:
- return constValue(key)
- case *ssa.Global:
- if r, ok := fr.i.globals[key]; ok {
- return r
- }
- }
- if r, ok := fr.env[key]; ok {
- return r
- }
- panic(fmt.Sprintf("get: no value for %T: %v", key, key.Name()))
-}
-
-// runDefer runs a deferred call d.
-// It always returns normally, but may set or clear fr.panic.
-//
-func (fr *frame) runDefer(d *deferred) {
- if fr.i.mode&EnableTracing != 0 {
- fmt.Fprintf(os.Stderr, "%s: invoking deferred function call\n",
- fr.i.prog.Fset.Position(d.instr.Pos()))
- }
- var ok bool
- defer func() {
- if !ok {
- // Deferred call created a new state of panic.
- fr.panicking = true
- fr.panic = recover()
- }
- }()
- call(fr.i, fr, d.instr.Pos(), d.fn, d.args)
- ok = true
-}
-
-// runDefers executes fr's deferred function calls in LIFO order.
-//
-// On entry, fr.panicking indicates a state of panic; if
-// true, fr.panic contains the panic value.
-//
-// On completion, if a deferred call started a panic, or if no
-// deferred call recovered from a previous state of panic, then
-// runDefers itself panics after the last deferred call has run.
-//
-// If there was no initial state of panic, or it was recovered from,
-// runDefers returns normally.
-//
-func (fr *frame) runDefers() {
- for d := fr.defers; d != nil; d = d.tail {
- fr.runDefer(d)
- }
- fr.defers = nil
- if fr.panicking {
- panic(fr.panic) // new panic, or still panicking
- }
-}
-
-// lookupMethod returns the method set for type typ, which may be one
-// of the interpreter's fake types.
-func lookupMethod(i *interpreter, typ types.Type, meth *types.Func) *ssa.Function {
- switch typ {
- case rtypeType:
- return i.rtypeMethods[meth.Id()]
- case errorType:
- return i.errorMethods[meth.Id()]
- }
- return i.prog.LookupMethod(typ, meth.Pkg(), meth.Name())
-}
-
-// visitInstr interprets a single ssa.Instruction within the activation
-// record frame. It returns a continuation value indicating where to
-// read the next instruction from.
-func visitInstr(fr *frame, instr ssa.Instruction) continuation {
- switch instr := instr.(type) {
- case *ssa.DebugRef:
- // no-op
-
- case *ssa.UnOp:
- fr.env[instr] = unop(instr, fr.get(instr.X))
-
- case *ssa.BinOp:
- fr.env[instr] = binop(instr.Op, instr.X.Type(), fr.get(instr.X), fr.get(instr.Y))
-
- case *ssa.Call:
- fn, args := prepareCall(fr, &instr.Call)
- fr.env[instr] = call(fr.i, fr, instr.Pos(), fn, args)
-
- case *ssa.ChangeInterface:
- fr.env[instr] = fr.get(instr.X)
-
- case *ssa.ChangeType:
- fr.env[instr] = fr.get(instr.X) // (can't fail)
-
- case *ssa.Convert:
- fr.env[instr] = conv(instr.Type(), instr.X.Type(), fr.get(instr.X))
-
- case *ssa.MakeInterface:
- fr.env[instr] = iface{t: instr.X.Type(), v: fr.get(instr.X)}
-
- case *ssa.Extract:
- fr.env[instr] = fr.get(instr.Tuple).(tuple)[instr.Index]
-
- case *ssa.Slice:
- fr.env[instr] = slice(fr.get(instr.X), fr.get(instr.Low), fr.get(instr.High), fr.get(instr.Max))
-
- case *ssa.Return:
- switch len(instr.Results) {
- case 0:
- case 1:
- fr.result = fr.get(instr.Results[0])
- default:
- var res []value
- for _, r := range instr.Results {
- res = append(res, fr.get(r))
- }
- fr.result = tuple(res)
- }
- fr.block = nil
- return kReturn
-
- case *ssa.RunDefers:
- fr.runDefers()
-
- case *ssa.Panic:
- panic(targetPanic{fr.get(instr.X)})
-
- case *ssa.Send:
- fr.get(instr.Chan).(chan value) <- fr.get(instr.X)
-
- case *ssa.Store:
- store(deref(instr.Addr.Type()), fr.get(instr.Addr).(*value), fr.get(instr.Val))
-
- case *ssa.If:
- succ := 1
- if fr.get(instr.Cond).(bool) {
- succ = 0
- }
- fr.prevBlock, fr.block = fr.block, fr.block.Succs[succ]
- return kJump
-
- case *ssa.Jump:
- fr.prevBlock, fr.block = fr.block, fr.block.Succs[0]
- return kJump
-
- case *ssa.Defer:
- fn, args := prepareCall(fr, &instr.Call)
- fr.defers = &deferred{
- fn: fn,
- args: args,
- instr: instr,
- tail: fr.defers,
- }
-
- case *ssa.Go:
- fn, args := prepareCall(fr, &instr.Call)
- atomic.AddInt32(&fr.i.goroutines, 1)
- go func() {
- call(fr.i, nil, instr.Pos(), fn, args)
- atomic.AddInt32(&fr.i.goroutines, -1)
- }()
-
- case *ssa.MakeChan:
- fr.env[instr] = make(chan value, asInt(fr.get(instr.Size)))
-
- case *ssa.Alloc:
- var addr *value
- if instr.Heap {
- // new
- addr = new(value)
- fr.env[instr] = addr
- } else {
- // local
- addr = fr.env[instr].(*value)
- }
- *addr = zero(deref(instr.Type()))
-
- case *ssa.MakeSlice:
- slice := make([]value, asInt(fr.get(instr.Cap)))
- tElt := instr.Type().Underlying().(*types.Slice).Elem()
- for i := range slice {
- slice[i] = zero(tElt)
- }
- fr.env[instr] = slice[:asInt(fr.get(instr.Len))]
-
- case *ssa.MakeMap:
- reserve := 0
- if instr.Reserve != nil {
- reserve = asInt(fr.get(instr.Reserve))
- }
- fr.env[instr] = makeMap(instr.Type().Underlying().(*types.Map).Key(), reserve)
-
- case *ssa.Range:
- fr.env[instr] = rangeIter(fr.get(instr.X), instr.X.Type())
-
- case *ssa.Next:
- fr.env[instr] = fr.get(instr.Iter).(iter).next()
-
- case *ssa.FieldAddr:
- fr.env[instr] = &(*fr.get(instr.X).(*value)).(structure)[instr.Field]
-
- case *ssa.Field:
- fr.env[instr] = fr.get(instr.X).(structure)[instr.Field]
-
- case *ssa.IndexAddr:
- x := fr.get(instr.X)
- idx := fr.get(instr.Index)
- switch x := x.(type) {
- case []value:
- fr.env[instr] = &x[asInt(idx)]
- case *value: // *array
- fr.env[instr] = &(*x).(array)[asInt(idx)]
- default:
- panic(fmt.Sprintf("unexpected x type in IndexAddr: %T", x))
- }
-
- case *ssa.Index:
- fr.env[instr] = fr.get(instr.X).(array)[asInt(fr.get(instr.Index))]
-
- case *ssa.Lookup:
- fr.env[instr] = lookup(instr, fr.get(instr.X), fr.get(instr.Index))
-
- case *ssa.MapUpdate:
- m := fr.get(instr.Map)
- key := fr.get(instr.Key)
- v := fr.get(instr.Value)
- switch m := m.(type) {
- case map[value]value:
- m[key] = v
- case *hashmap:
- m.insert(key.(hashable), v)
- default:
- panic(fmt.Sprintf("illegal map type: %T", m))
- }
-
- case *ssa.TypeAssert:
- fr.env[instr] = typeAssert(fr.i, instr, fr.get(instr.X).(iface))
-
- case *ssa.MakeClosure:
- var bindings []value
- for _, binding := range instr.Bindings {
- bindings = append(bindings, fr.get(binding))
- }
- fr.env[instr] = &closure{instr.Fn.(*ssa.Function), bindings}
-
- case *ssa.Phi:
- for i, pred := range instr.Block().Preds {
- if fr.prevBlock == pred {
- fr.env[instr] = fr.get(instr.Edges[i])
- break
- }
- }
-
- case *ssa.Select:
- var cases []reflect.SelectCase
- if !instr.Blocking {
- cases = append(cases, reflect.SelectCase{
- Dir: reflect.SelectDefault,
- })
- }
- for _, state := range instr.States {
- var dir reflect.SelectDir
- if state.Dir == types.RecvOnly {
- dir = reflect.SelectRecv
- } else {
- dir = reflect.SelectSend
- }
- var send reflect.Value
- if state.Send != nil {
- send = reflect.ValueOf(fr.get(state.Send))
- }
- cases = append(cases, reflect.SelectCase{
- Dir: dir,
- Chan: reflect.ValueOf(fr.get(state.Chan)),
- Send: send,
- })
- }
- chosen, recv, recvOk := reflect.Select(cases)
- if !instr.Blocking {
- chosen-- // default case should have index -1.
- }
- r := tuple{chosen, recvOk}
- for i, st := range instr.States {
- if st.Dir == types.RecvOnly {
- var v value
- if i == chosen && recvOk {
- // No need to copy since send makes an unaliased copy.
- v = recv.Interface().(value)
- } else {
- v = zero(st.Chan.Type().Underlying().(*types.Chan).Elem())
- }
- r = append(r, v)
- }
- }
- fr.env[instr] = r
-
- default:
- panic(fmt.Sprintf("unexpected instruction: %T", instr))
- }
-
- // if val, ok := instr.(ssa.Value); ok {
- // fmt.Println(toString(fr.env[val])) // debugging
- // }
-
- return kNext
-}
-
-// prepareCall determines the function value and argument values for a
-// function call in a Call, Go or Defer instruction, performing
-// interface method lookup if needed.
-//
-func prepareCall(fr *frame, call *ssa.CallCommon) (fn value, args []value) {
- v := fr.get(call.Value)
- if call.Method == nil {
- // Function call.
- fn = v
- } else {
- // Interface method invocation.
- recv := v.(iface)
- if recv.t == nil {
- panic("method invoked on nil interface")
- }
- if f := lookupMethod(fr.i, recv.t, call.Method); f == nil {
- // Unreachable in well-typed programs.
- panic(fmt.Sprintf("method set for dynamic type %v does not contain %s", recv.t, call.Method))
- } else {
- fn = f
- }
- args = append(args, recv.v)
- }
- for _, arg := range call.Args {
- args = append(args, fr.get(arg))
- }
- return
-}
-
-// call interprets a call to a function (function, builtin or closure)
-// fn with arguments args, returning its result.
-// callpos is the position of the callsite.
-//
-func call(i *interpreter, caller *frame, callpos token.Pos, fn value, args []value) value {
- switch fn := fn.(type) {
- case *ssa.Function:
- if fn == nil {
- panic("call of nil function") // nil of func type
- }
- return callSSA(i, caller, callpos, fn, args, nil)
- case *closure:
- return callSSA(i, caller, callpos, fn.Fn, args, fn.Env)
- case *ssa.Builtin:
- return callBuiltin(caller, callpos, fn, args)
- }
- panic(fmt.Sprintf("cannot call %T", fn))
-}
-
-func loc(fset *token.FileSet, pos token.Pos) string {
- if pos == token.NoPos {
- return ""
- }
- return " at " + fset.Position(pos).String()
-}
-
-// callSSA interprets a call to function fn with arguments args,
-// and lexical environment env, returning its result.
-// callpos is the position of the callsite.
-//
-func callSSA(i *interpreter, caller *frame, callpos token.Pos, fn *ssa.Function, args []value, env []value) value {
- if i.mode&EnableTracing != 0 {
- fset := fn.Prog.Fset
- // TODO(adonovan): fix: loc() lies for external functions.
- fmt.Fprintf(os.Stderr, "Entering %s%s.\n", fn, loc(fset, fn.Pos()))
- suffix := ""
- if caller != nil {
- suffix = ", resuming " + caller.fn.String() + loc(fset, callpos)
- }
- defer fmt.Fprintf(os.Stderr, "Leaving %s%s.\n", fn, suffix)
- }
- fr := &frame{
- i: i,
- caller: caller, // for panic/recover
- fn: fn,
- }
- if fn.Parent() == nil {
- name := fn.String()
- if ext := externals[name]; ext != nil {
- if i.mode&EnableTracing != 0 {
- fmt.Fprintln(os.Stderr, "\t(external)")
- }
- return ext(fr, args)
- }
- if fn.Blocks == nil {
- panic("no code for function: " + name)
- }
- }
- fr.env = make(map[ssa.Value]value)
- fr.block = fn.Blocks[0]
- fr.locals = make([]value, len(fn.Locals))
- for i, l := range fn.Locals {
- fr.locals[i] = zero(deref(l.Type()))
- fr.env[l] = &fr.locals[i]
- }
- for i, p := range fn.Params {
- fr.env[p] = args[i]
- }
- for i, fv := range fn.FreeVars {
- fr.env[fv] = env[i]
- }
- for fr.block != nil {
- runFrame(fr)
- }
- // Destroy the locals to avoid accidental use after return.
- for i := range fn.Locals {
- fr.locals[i] = bad{}
- }
- return fr.result
-}
-
-// runFrame executes SSA instructions starting at fr.block and
-// continuing until a return, a panic, or a recovered panic.
-//
-// After a panic, runFrame panics.
-//
-// After a normal return, fr.result contains the result of the call
-// and fr.block is nil.
-//
-// A recovered panic in a function without named return parameters
-// (NRPs) becomes a normal return of the zero value of the function's
-// result type.
-//
-// After a recovered panic in a function with NRPs, fr.result is
-// undefined and fr.block contains the block at which to resume
-// control.
-//
-func runFrame(fr *frame) {
- defer func() {
- if fr.block == nil {
- return // normal return
- }
- if fr.i.mode&DisableRecover != 0 {
- return // let interpreter crash
- }
- fr.panicking = true
- fr.panic = recover()
- if fr.i.mode&EnableTracing != 0 {
- fmt.Fprintf(os.Stderr, "Panicking: %T %v.\n", fr.panic, fr.panic)
- }
- fr.runDefers()
- fr.block = fr.fn.Recover
- }()
-
- for {
- if fr.i.mode&EnableTracing != 0 {
- fmt.Fprintf(os.Stderr, ".%s:\n", fr.block)
- }
- block:
- for _, instr := range fr.block.Instrs {
- if fr.i.mode&EnableTracing != 0 {
- if v, ok := instr.(ssa.Value); ok {
- fmt.Fprintln(os.Stderr, "\t", v.Name(), "=", instr)
- } else {
- fmt.Fprintln(os.Stderr, "\t", instr)
- }
- }
- switch visitInstr(fr, instr) {
- case kReturn:
- return
- case kNext:
- // no-op
- case kJump:
- break block
- }
- }
- }
-}
-
-// doRecover implements the recover() built-in.
-func doRecover(caller *frame) value {
- // recover() must be exactly one level beneath the deferred
- // function (two levels beneath the panicking function) to
- // have any effect. Thus we ignore both "defer recover()" and
- // "defer f() -> g() -> recover()".
- if caller.i.mode&DisableRecover == 0 &&
- caller != nil && !caller.panicking &&
- caller.caller != nil && caller.caller.panicking {
- caller.caller.panicking = false
- p := caller.caller.panic
- caller.caller.panic = nil
-
- // TODO(adonovan): support runtime.Goexit.
- switch p := p.(type) {
- case targetPanic:
- // The target program explicitly called panic().
- return p.v
- case runtime.Error:
- // The interpreter encountered a runtime error.
- return iface{caller.i.runtimeErrorString, p.Error()}
- case string:
- // The interpreter explicitly called panic().
- return iface{caller.i.runtimeErrorString, p}
- default:
- panic(fmt.Sprintf("unexpected panic type %T in target call to recover()", p))
- }
- }
- return iface{}
-}
-
-// setGlobal sets the value of a system-initialized global variable.
-func setGlobal(i *interpreter, pkg *ssa.Package, name string, v value) {
- if g, ok := i.globals[pkg.Var(name)]; ok {
- *g = v
- return
- }
- panic("no global variable: " + pkg.Pkg.Path() + "." + name)
-}
-
-var environ []value
-
-func init() {
- for _, s := range os.Environ() {
- environ = append(environ, s)
- }
- environ = append(environ, "GOSSAINTERP=1")
- environ = append(environ, "GOARCH="+runtime.GOARCH)
-}
-
-// deleteBodies delete the bodies of all standalone functions except the
-// specified ones. A missing intrinsic leads to a clear runtime error.
-func deleteBodies(pkg *ssa.Package, except ...string) {
- keep := make(map[string]bool)
- for _, e := range except {
- keep[e] = true
- }
- for _, mem := range pkg.Members {
- if fn, ok := mem.(*ssa.Function); ok && !keep[fn.Name()] {
- fn.Blocks = nil
- }
- }
-}
-
-// Interpret interprets the Go program whose main package is mainpkg.
-// mode specifies various interpreter options. filename and args are
-// the initial values of os.Args for the target program. sizes is the
-// effective type-sizing function for this program.
-//
-// Interpret returns the exit code of the program: 2 for panic (like
-// gc does), or the argument to os.Exit for normal termination.
-//
-// The SSA program must include the "runtime" package.
-//
-func Interpret(mainpkg *ssa.Package, mode Mode, sizes types.Sizes, filename string, args []string) (exitCode int) {
- if syswrite == nil {
- fmt.Fprintln(os.Stderr, "Interpret: unsupported platform.")
- return 1
- }
-
- i := &interpreter{
- prog: mainpkg.Prog,
- globals: make(map[ssa.Value]*value),
- mode: mode,
- sizes: sizes,
- goroutines: 1,
- }
- runtimePkg := i.prog.ImportedPackage("runtime")
- if runtimePkg == nil {
- panic("ssa.Program doesn't include runtime package")
- }
- i.runtimeErrorString = runtimePkg.Type("errorString").Object().Type()
-
- initReflect(i)
-
- i.osArgs = append(i.osArgs, filename)
- for _, arg := range args {
- i.osArgs = append(i.osArgs, arg)
- }
-
- for _, pkg := range i.prog.AllPackages() {
- // Initialize global storage.
- for _, m := range pkg.Members {
- switch v := m.(type) {
- case *ssa.Global:
- cell := zero(deref(v.Type()))
- i.globals[v] = &cell
- }
- }
-
- // Ad-hoc initialization for magic system variables.
- switch pkg.Pkg.Path() {
- case "syscall":
- setGlobal(i, pkg, "envs", environ)
-
- case "reflect":
- deleteBodies(pkg, "DeepEqual", "deepValueEqual")
-
- case "runtime":
- sz := sizes.Sizeof(pkg.Pkg.Scope().Lookup("MemStats").Type())
- setGlobal(i, pkg, "sizeof_C_MStats", uintptr(sz))
- deleteBodies(pkg, "GOROOT", "gogetenv")
- }
- }
-
- // Top-level error handler.
- exitCode = 2
- defer func() {
- if exitCode != 2 || i.mode&DisableRecover != 0 {
- return
- }
- switch p := recover().(type) {
- case exitPanic:
- exitCode = int(p)
- return
- case targetPanic:
- fmt.Fprintln(os.Stderr, "panic:", toString(p.v))
- case runtime.Error:
- fmt.Fprintln(os.Stderr, "panic:", p.Error())
- case string:
- fmt.Fprintln(os.Stderr, "panic:", p)
- default:
- fmt.Fprintf(os.Stderr, "panic: unexpected type: %T: %v\n", p, p)
- }
-
- // TODO(adonovan): dump panicking interpreter goroutine?
- // buf := make([]byte, 0x10000)
- // runtime.Stack(buf, false)
- // fmt.Fprintln(os.Stderr, string(buf))
- // (Or dump panicking target goroutine?)
- }()
-
- // Run!
- call(i, nil, token.NoPos, mainpkg.Func("init"), nil)
- if mainFn := mainpkg.Func("main"); mainFn != nil {
- call(i, nil, token.NoPos, mainFn, nil)
- exitCode = 0
- } else {
- fmt.Fprintln(os.Stderr, "No main function.")
- exitCode = 1
- }
- return
-}
-
-// deref returns a pointer's element type; otherwise it returns typ.
-// TODO(adonovan): Import from ssa?
-func deref(typ types.Type) types.Type {
- if p, ok := typ.Underlying().(*types.Pointer); ok {
- return p.Elem()
- }
- return typ
-}
diff --git a/vendor/golang.org/x/tools/go/ssa/interp/interp_test.go b/vendor/golang.org/x/tools/go/ssa/interp/interp_test.go
deleted file mode 100644
index 997922f..0000000
--- a/vendor/golang.org/x/tools/go/ssa/interp/interp_test.go
+++ /dev/null
@@ -1,317 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build linux darwin
-
-package interp_test
-
-import (
- "bytes"
- "fmt"
- "go/build"
- "go/types"
- "os"
- "path/filepath"
- "runtime"
- "strings"
- "testing"
- "time"
-
- "golang.org/x/tools/go/loader"
- "golang.org/x/tools/go/ssa"
- "golang.org/x/tools/go/ssa/interp"
- "golang.org/x/tools/go/ssa/ssautil"
-)
-
-// Each line contains a space-separated list of $GOROOT/test/
-// filenames comprising the main package of a program.
-// They are ordered quickest-first, roughly.
-//
-// TODO(adonovan): integrate into the $GOROOT/test driver scripts,
-// golden file checking, etc.
-var gorootTestTests = []string{
- "235.go",
- "alias1.go",
- "chancap.go",
- "func5.go",
- "func6.go",
- "func7.go",
- "func8.go",
- "helloworld.go",
- "varinit.go",
- "escape3.go",
- "initcomma.go",
- "cmp.go",
- "compos.go",
- "turing.go",
- "indirect.go",
- "complit.go",
- "for.go",
- "struct0.go",
- "intcvt.go",
- "printbig.go",
- "deferprint.go",
- "escape.go",
- "range.go",
- "const4.go",
- "float_lit.go",
- "bigalg.go",
- "decl.go",
- "if.go",
- "named.go",
- "bigmap.go",
- "func.go",
- "reorder2.go",
- "closure.go",
- "gc.go",
- "simassign.go",
- "iota.go",
- "nilptr2.go",
- "goprint.go", // doesn't actually assert anything (cmpout)
- "utf.go",
- "method.go",
- "char_lit.go",
- "env.go",
- "int_lit.go",
- "string_lit.go",
- "defer.go",
- "typeswitch.go",
- "stringrange.go",
- "reorder.go",
- "method3.go",
- "literal.go",
- "nul1.go", // doesn't actually assert anything (errorcheckoutput)
- "zerodivide.go",
- "convert.go",
- "convT2X.go",
- "switch.go",
- "initialize.go",
- "ddd.go",
- "blank.go", // partly disabled
- "map.go",
- "closedchan.go",
- "divide.go",
- "rename.go",
- "const3.go",
- "nil.go",
- "recover.go", // reflection parts disabled
- "recover1.go",
- "recover2.go",
- "recover3.go",
- "typeswitch1.go",
- "floatcmp.go",
- "crlf.go", // doesn't actually assert anything (runoutput)
- // Slow tests follow.
- "bom.go", // ~1.7s
- "gc1.go", // ~1.7s
- "cmplxdivide.go cmplxdivide1.go", // ~2.4s
-
- // Working, but not worth enabling:
- // "append.go", // works, but slow (15s).
- // "gc2.go", // works, but slow, and cheats on the memory check.
- // "sigchld.go", // works, but only on POSIX.
- // "peano.go", // works only up to n=9, and slow even then.
- // "stack.go", // works, but too slow (~30s) by default.
- // "solitaire.go", // works, but too slow (~30s).
- // "const.go", // works but for but one bug: constant folder doesn't consider representations.
- // "init1.go", // too slow (80s) and not that interesting. Cheats on ReadMemStats check too.
- // "rotate.go rotate0.go", // emits source for a test
- // "rotate.go rotate1.go", // emits source for a test
- // "rotate.go rotate2.go", // emits source for a test
- // "rotate.go rotate3.go", // emits source for a test
- // "64bit.go", // emits source for a test
- // "run.go", // test driver, not a test.
-
- // Broken. TODO(adonovan): fix.
- // copy.go // very slow; but with N=4 quickly crashes, slice index out of range.
- // nilptr.go // interp: V > uintptr not implemented. Slow test, lots of mem
- // args.go // works, but requires specific os.Args from the driver.
- // index.go // a template, not a real test.
- // mallocfin.go // SetFinalizer not implemented.
-
- // TODO(adonovan): add tests from $GOROOT/test/* subtrees:
- // bench chan bugs fixedbugs interface ken.
-}
-
-// These are files in go.tools/go/ssa/interp/testdata/.
-var testdataTests = []string{
- "boundmeth.go",
- "complit.go",
- "coverage.go",
- "defer.go",
- "fieldprom.go",
- "ifaceconv.go",
- "ifaceprom.go",
- "initorder.go",
- "methprom.go",
- "mrvchain.go",
- "range.go",
- "recover.go",
- "reflect.go",
- "static.go",
- "callstack.go",
-}
-
-type successPredicate func(exitcode int, output string) error
-
-func run(t *testing.T, dir, input string, success successPredicate) bool {
- if runtime.GOOS == "darwin" {
- t.Skip("skipping on darwin until golang.org/issue/23166 is fixed")
- }
- fmt.Printf("Input: %s\n", input)
-
- start := time.Now()
-
- var inputs []string
- for _, i := range strings.Split(input, " ") {
- if strings.HasSuffix(i, ".go") {
- i = dir + i
- }
- inputs = append(inputs, i)
- }
-
- var conf loader.Config
- if _, err := conf.FromArgs(inputs, true); err != nil {
- t.Errorf("FromArgs(%s) failed: %s", inputs, err)
- return false
- }
-
- conf.Import("runtime")
-
- // Print a helpful hint if we don't make it to the end.
- var hint string
- defer func() {
- if hint != "" {
- fmt.Println("FAIL")
- fmt.Println(hint)
- } else {
- fmt.Println("PASS")
- }
-
- interp.CapturedOutput = nil
- }()
-
- hint = fmt.Sprintf("To dump SSA representation, run:\n%% go build golang.org/x/tools/cmd/ssadump && ./ssadump -test -build=CFP %s\n", input)
-
- iprog, err := conf.Load()
- if err != nil {
- t.Errorf("conf.Load(%s) failed: %s", inputs, err)
- return false
- }
-
- prog := ssautil.CreateProgram(iprog, ssa.SanityCheckFunctions)
- prog.Build()
-
- // Find first main or test package among the initial packages.
- var mainPkg *ssa.Package
- for _, info := range iprog.InitialPackages() {
- if info.Pkg.Path() == "runtime" {
- continue // not an initial package
- }
- p := prog.Package(info.Pkg)
- if p.Pkg.Name() == "main" && p.Func("main") != nil {
- mainPkg = p
- break
- }
-
- mainPkg = prog.CreateTestMainPackage(p)
- if mainPkg != nil {
- break
- }
- }
- if mainPkg == nil {
- t.Fatalf("no main or test packages among initial packages: %s", inputs)
- }
-
- var out bytes.Buffer
- interp.CapturedOutput = &out
-
- hint = fmt.Sprintf("To trace execution, run:\n%% go build golang.org/x/tools/cmd/ssadump && ./ssadump -build=C -test -run --interp=T %s\n", input)
- exitCode := interp.Interpret(mainPkg, 0, &types.StdSizes{WordSize: 8, MaxAlign: 8}, inputs[0], []string{})
-
- // The definition of success varies with each file.
- if err := success(exitCode, out.String()); err != nil {
- t.Errorf("interp.Interpret(%s) failed: %s", inputs, err)
- return false
- }
-
- hint = "" // call off the hounds
-
- if false {
- fmt.Println(input, time.Since(start)) // test profiling
- }
-
- return true
-}
-
-const slash = string(os.PathSeparator)
-
-func printFailures(failures []string) {
- if failures != nil {
- fmt.Println("The following tests failed:")
- for _, f := range failures {
- fmt.Printf("\t%s\n", f)
- }
- }
-}
-
-func success(exitcode int, output string) error {
- if exitcode != 0 {
- return fmt.Errorf("exit code was %d", exitcode)
- }
- if strings.Contains(output, "BUG") {
- return fmt.Errorf("exited zero but output contained 'BUG'")
- }
- return nil
-}
-
-// TestTestdataFiles runs the interpreter on testdata/*.go.
-func TestTestdataFiles(t *testing.T) {
- var failures []string
- start := time.Now()
- for _, input := range testdataTests {
- if testing.Short() && time.Since(start) > 30*time.Second {
- printFailures(failures)
- t.Skipf("timeout - aborting test")
- }
- if !run(t, "testdata"+slash, input, success) {
- failures = append(failures, input)
- }
- }
- printFailures(failures)
-}
-
-// TestGorootTest runs the interpreter on $GOROOT/test/*.go.
-func TestGorootTest(t *testing.T) {
- if testing.Short() {
- t.Skip() // too slow (~30s)
- }
-
- var failures []string
-
- for _, input := range gorootTestTests {
- if !run(t, filepath.Join(build.Default.GOROOT, "test")+slash, input, success) {
- failures = append(failures, input)
- }
- }
- printFailures(failures)
-}
-
-// CreateTestMainPackage should return nil if there were no tests.
-func TestNullTestmainPackage(t *testing.T) {
- var conf loader.Config
- conf.CreateFromFilenames("", "testdata/b_test.go")
- iprog, err := conf.Load()
- if err != nil {
- t.Fatalf("CreatePackages failed: %s", err)
- }
- prog := ssautil.CreateProgram(iprog, ssa.SanityCheckFunctions)
- mainPkg := prog.Package(iprog.Created[0].Pkg)
- if mainPkg.Func("main") != nil {
- t.Fatalf("unexpected main function")
- }
- if prog.CreateTestMainPackage(mainPkg) != nil {
- t.Fatalf("CreateTestMainPackage returned non-nil")
- }
-}
diff --git a/vendor/golang.org/x/tools/go/ssa/interp/map.go b/vendor/golang.org/x/tools/go/ssa/interp/map.go
deleted file mode 100644
index 92ccf90..0000000
--- a/vendor/golang.org/x/tools/go/ssa/interp/map.go
+++ /dev/null
@@ -1,121 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package interp
-
-// Custom hashtable atop map.
-// For use when the key's equivalence relation is not consistent with ==.
-
-// The Go specification doesn't address the atomicity of map operations.
-// The FAQ states that an implementation is permitted to crash on
-// concurrent map access.
-
-import (
- "go/types"
-)
-
-type hashable interface {
- hash(t types.Type) int
- eq(t types.Type, x interface{}) bool
-}
-
-type entry struct {
- key hashable
- value value
- next *entry
-}
-
-// A hashtable atop the built-in map. Since each bucket contains
-// exactly one hash value, there's no need to perform hash-equality
-// tests when walking the linked list. Rehashing is done by the
-// underlying map.
-type hashmap struct {
- keyType types.Type
- table map[int]*entry
- length int // number of entries in map
-}
-
-// makeMap returns an empty initialized map of key type kt,
-// preallocating space for reserve elements.
-func makeMap(kt types.Type, reserve int) value {
- if usesBuiltinMap(kt) {
- return make(map[value]value, reserve)
- }
- return &hashmap{keyType: kt, table: make(map[int]*entry, reserve)}
-}
-
-// delete removes the association for key k, if any.
-func (m *hashmap) delete(k hashable) {
- if m != nil {
- hash := k.hash(m.keyType)
- head := m.table[hash]
- if head != nil {
- if k.eq(m.keyType, head.key) {
- m.table[hash] = head.next
- m.length--
- return
- }
- prev := head
- for e := head.next; e != nil; e = e.next {
- if k.eq(m.keyType, e.key) {
- prev.next = e.next
- m.length--
- return
- }
- prev = e
- }
- }
- }
-}
-
-// lookup returns the value associated with key k, if present, or
-// value(nil) otherwise.
-func (m *hashmap) lookup(k hashable) value {
- if m != nil {
- hash := k.hash(m.keyType)
- for e := m.table[hash]; e != nil; e = e.next {
- if k.eq(m.keyType, e.key) {
- return e.value
- }
- }
- }
- return nil
-}
-
-// insert updates the map to associate key k with value v. If there
-// was already an association for an eq() (though not necessarily ==)
-// k, the previous key remains in the map and its associated value is
-// updated.
-func (m *hashmap) insert(k hashable, v value) {
- hash := k.hash(m.keyType)
- head := m.table[hash]
- for e := head; e != nil; e = e.next {
- if k.eq(m.keyType, e.key) {
- e.value = v
- return
- }
- }
- m.table[hash] = &entry{
- key: k,
- value: v,
- next: head,
- }
- m.length++
-}
-
-// len returns the number of key/value associations in the map.
-func (m *hashmap) len() int {
- if m != nil {
- return m.length
- }
- return 0
-}
-
-// entries returns a rangeable map of entries.
-func (m *hashmap) entries() map[int]*entry {
- if m != nil {
- return m.table
- }
- return nil
-}
diff --git a/vendor/golang.org/x/tools/go/ssa/interp/ops.go b/vendor/golang.org/x/tools/go/ssa/interp/ops.go
deleted file mode 100644
index f3419ec..0000000
--- a/vendor/golang.org/x/tools/go/ssa/interp/ops.go
+++ /dev/null
@@ -1,1396 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package interp
-
-import (
- "bytes"
- "fmt"
- exact "go/constant"
- "go/token"
- "go/types"
- "strings"
- "sync"
- "unsafe"
-
- "golang.org/x/tools/go/ssa"
-)
-
-// If the target program panics, the interpreter panics with this type.
-type targetPanic struct {
- v value
-}
-
-func (p targetPanic) String() string {
- return toString(p.v)
-}
-
-// If the target program calls exit, the interpreter panics with this type.
-type exitPanic int
-
-// constValue returns the value of the constant with the
-// dynamic type tag appropriate for c.Type().
-func constValue(c *ssa.Const) value {
- if c.IsNil() {
- return zero(c.Type()) // typed nil
- }
-
- if t, ok := c.Type().Underlying().(*types.Basic); ok {
- // TODO(adonovan): eliminate untyped constants from SSA form.
- switch t.Kind() {
- case types.Bool, types.UntypedBool:
- return exact.BoolVal(c.Value)
- case types.Int, types.UntypedInt:
- // Assume sizeof(int) is same on host and target.
- return int(c.Int64())
- case types.Int8:
- return int8(c.Int64())
- case types.Int16:
- return int16(c.Int64())
- case types.Int32, types.UntypedRune:
- return int32(c.Int64())
- case types.Int64:
- return c.Int64()
- case types.Uint:
- // Assume sizeof(uint) is same on host and target.
- return uint(c.Uint64())
- case types.Uint8:
- return uint8(c.Uint64())
- case types.Uint16:
- return uint16(c.Uint64())
- case types.Uint32:
- return uint32(c.Uint64())
- case types.Uint64:
- return c.Uint64()
- case types.Uintptr:
- // Assume sizeof(uintptr) is same on host and target.
- return uintptr(c.Uint64())
- case types.Float32:
- return float32(c.Float64())
- case types.Float64, types.UntypedFloat:
- return c.Float64()
- case types.Complex64:
- return complex64(c.Complex128())
- case types.Complex128, types.UntypedComplex:
- return c.Complex128()
- case types.String, types.UntypedString:
- if c.Value.Kind() == exact.String {
- return exact.StringVal(c.Value)
- }
- return string(rune(c.Int64()))
- }
- }
-
- panic(fmt.Sprintf("constValue: %s", c))
-}
-
-// asInt converts x, which must be an integer, to an int suitable for
-// use as a slice or array index or operand to make().
-func asInt(x value) int {
- switch x := x.(type) {
- case int:
- return x
- case int8:
- return int(x)
- case int16:
- return int(x)
- case int32:
- return int(x)
- case int64:
- return int(x)
- case uint:
- return int(x)
- case uint8:
- return int(x)
- case uint16:
- return int(x)
- case uint32:
- return int(x)
- case uint64:
- return int(x)
- case uintptr:
- return int(x)
- }
- panic(fmt.Sprintf("cannot convert %T to int", x))
-}
-
-// asUint64 converts x, which must be an unsigned integer, to a uint64
-// suitable for use as a bitwise shift count.
-func asUint64(x value) uint64 {
- switch x := x.(type) {
- case uint:
- return uint64(x)
- case uint8:
- return uint64(x)
- case uint16:
- return uint64(x)
- case uint32:
- return uint64(x)
- case uint64:
- return x
- case uintptr:
- return uint64(x)
- }
- panic(fmt.Sprintf("cannot convert %T to uint64", x))
-}
-
-// zero returns a new "zero" value of the specified type.
-func zero(t types.Type) value {
- switch t := t.(type) {
- case *types.Basic:
- if t.Kind() == types.UntypedNil {
- panic("untyped nil has no zero value")
- }
- if t.Info()&types.IsUntyped != 0 {
- // TODO(adonovan): make it an invariant that
- // this is unreachable. Currently some
- // constants have 'untyped' types when they
- // should be defaulted by the typechecker.
- t = ssa.DefaultType(t).(*types.Basic)
- }
- switch t.Kind() {
- case types.Bool:
- return false
- case types.Int:
- return int(0)
- case types.Int8:
- return int8(0)
- case types.Int16:
- return int16(0)
- case types.Int32:
- return int32(0)
- case types.Int64:
- return int64(0)
- case types.Uint:
- return uint(0)
- case types.Uint8:
- return uint8(0)
- case types.Uint16:
- return uint16(0)
- case types.Uint32:
- return uint32(0)
- case types.Uint64:
- return uint64(0)
- case types.Uintptr:
- return uintptr(0)
- case types.Float32:
- return float32(0)
- case types.Float64:
- return float64(0)
- case types.Complex64:
- return complex64(0)
- case types.Complex128:
- return complex128(0)
- case types.String:
- return ""
- case types.UnsafePointer:
- return unsafe.Pointer(nil)
- default:
- panic(fmt.Sprint("zero for unexpected type:", t))
- }
- case *types.Pointer:
- return (*value)(nil)
- case *types.Array:
- a := make(array, t.Len())
- for i := range a {
- a[i] = zero(t.Elem())
- }
- return a
- case *types.Named:
- return zero(t.Underlying())
- case *types.Interface:
- return iface{} // nil type, methodset and value
- case *types.Slice:
- return []value(nil)
- case *types.Struct:
- s := make(structure, t.NumFields())
- for i := range s {
- s[i] = zero(t.Field(i).Type())
- }
- return s
- case *types.Tuple:
- if t.Len() == 1 {
- return zero(t.At(0).Type())
- }
- s := make(tuple, t.Len())
- for i := range s {
- s[i] = zero(t.At(i).Type())
- }
- return s
- case *types.Chan:
- return chan value(nil)
- case *types.Map:
- if usesBuiltinMap(t.Key()) {
- return map[value]value(nil)
- }
- return (*hashmap)(nil)
- case *types.Signature:
- return (*ssa.Function)(nil)
- }
- panic(fmt.Sprint("zero: unexpected ", t))
-}
-
-// slice returns x[lo:hi:max]. Any of lo, hi and max may be nil.
-func slice(x, lo, hi, max value) value {
- var Len, Cap int
- switch x := x.(type) {
- case string:
- Len = len(x)
- case []value:
- Len = len(x)
- Cap = cap(x)
- case *value: // *array
- a := (*x).(array)
- Len = len(a)
- Cap = cap(a)
- }
-
- l := 0
- if lo != nil {
- l = asInt(lo)
- }
-
- h := Len
- if hi != nil {
- h = asInt(hi)
- }
-
- m := Cap
- if max != nil {
- m = asInt(max)
- }
-
- switch x := x.(type) {
- case string:
- return x[l:h]
- case []value:
- return x[l:h:m]
- case *value: // *array
- a := (*x).(array)
- return []value(a)[l:h:m]
- }
- panic(fmt.Sprintf("slice: unexpected X type: %T", x))
-}
-
-// lookup returns x[idx] where x is a map or string.
-func lookup(instr *ssa.Lookup, x, idx value) value {
- switch x := x.(type) { // map or string
- case map[value]value, *hashmap:
- var v value
- var ok bool
- switch x := x.(type) {
- case map[value]value:
- v, ok = x[idx]
- case *hashmap:
- v = x.lookup(idx.(hashable))
- ok = v != nil
- }
- if !ok {
- v = zero(instr.X.Type().Underlying().(*types.Map).Elem())
- }
- if instr.CommaOk {
- v = tuple{v, ok}
- }
- return v
- case string:
- return x[asInt(idx)]
- }
- panic(fmt.Sprintf("unexpected x type in Lookup: %T", x))
-}
-
-// binop implements all arithmetic and logical binary operators for
-// numeric datatypes and strings. Both operands must have identical
-// dynamic type.
-//
-func binop(op token.Token, t types.Type, x, y value) value {
- switch op {
- case token.ADD:
- switch x.(type) {
- case int:
- return x.(int) + y.(int)
- case int8:
- return x.(int8) + y.(int8)
- case int16:
- return x.(int16) + y.(int16)
- case int32:
- return x.(int32) + y.(int32)
- case int64:
- return x.(int64) + y.(int64)
- case uint:
- return x.(uint) + y.(uint)
- case uint8:
- return x.(uint8) + y.(uint8)
- case uint16:
- return x.(uint16) + y.(uint16)
- case uint32:
- return x.(uint32) + y.(uint32)
- case uint64:
- return x.(uint64) + y.(uint64)
- case uintptr:
- return x.(uintptr) + y.(uintptr)
- case float32:
- return x.(float32) + y.(float32)
- case float64:
- return x.(float64) + y.(float64)
- case complex64:
- return x.(complex64) + y.(complex64)
- case complex128:
- return x.(complex128) + y.(complex128)
- case string:
- return x.(string) + y.(string)
- }
-
- case token.SUB:
- switch x.(type) {
- case int:
- return x.(int) - y.(int)
- case int8:
- return x.(int8) - y.(int8)
- case int16:
- return x.(int16) - y.(int16)
- case int32:
- return x.(int32) - y.(int32)
- case int64:
- return x.(int64) - y.(int64)
- case uint:
- return x.(uint) - y.(uint)
- case uint8:
- return x.(uint8) - y.(uint8)
- case uint16:
- return x.(uint16) - y.(uint16)
- case uint32:
- return x.(uint32) - y.(uint32)
- case uint64:
- return x.(uint64) - y.(uint64)
- case uintptr:
- return x.(uintptr) - y.(uintptr)
- case float32:
- return x.(float32) - y.(float32)
- case float64:
- return x.(float64) - y.(float64)
- case complex64:
- return x.(complex64) - y.(complex64)
- case complex128:
- return x.(complex128) - y.(complex128)
- }
-
- case token.MUL:
- switch x.(type) {
- case int:
- return x.(int) * y.(int)
- case int8:
- return x.(int8) * y.(int8)
- case int16:
- return x.(int16) * y.(int16)
- case int32:
- return x.(int32) * y.(int32)
- case int64:
- return x.(int64) * y.(int64)
- case uint:
- return x.(uint) * y.(uint)
- case uint8:
- return x.(uint8) * y.(uint8)
- case uint16:
- return x.(uint16) * y.(uint16)
- case uint32:
- return x.(uint32) * y.(uint32)
- case uint64:
- return x.(uint64) * y.(uint64)
- case uintptr:
- return x.(uintptr) * y.(uintptr)
- case float32:
- return x.(float32) * y.(float32)
- case float64:
- return x.(float64) * y.(float64)
- case complex64:
- return x.(complex64) * y.(complex64)
- case complex128:
- return x.(complex128) * y.(complex128)
- }
-
- case token.QUO:
- switch x.(type) {
- case int:
- return x.(int) / y.(int)
- case int8:
- return x.(int8) / y.(int8)
- case int16:
- return x.(int16) / y.(int16)
- case int32:
- return x.(int32) / y.(int32)
- case int64:
- return x.(int64) / y.(int64)
- case uint:
- return x.(uint) / y.(uint)
- case uint8:
- return x.(uint8) / y.(uint8)
- case uint16:
- return x.(uint16) / y.(uint16)
- case uint32:
- return x.(uint32) / y.(uint32)
- case uint64:
- return x.(uint64) / y.(uint64)
- case uintptr:
- return x.(uintptr) / y.(uintptr)
- case float32:
- return x.(float32) / y.(float32)
- case float64:
- return x.(float64) / y.(float64)
- case complex64:
- return x.(complex64) / y.(complex64)
- case complex128:
- return x.(complex128) / y.(complex128)
- }
-
- case token.REM:
- switch x.(type) {
- case int:
- return x.(int) % y.(int)
- case int8:
- return x.(int8) % y.(int8)
- case int16:
- return x.(int16) % y.(int16)
- case int32:
- return x.(int32) % y.(int32)
- case int64:
- return x.(int64) % y.(int64)
- case uint:
- return x.(uint) % y.(uint)
- case uint8:
- return x.(uint8) % y.(uint8)
- case uint16:
- return x.(uint16) % y.(uint16)
- case uint32:
- return x.(uint32) % y.(uint32)
- case uint64:
- return x.(uint64) % y.(uint64)
- case uintptr:
- return x.(uintptr) % y.(uintptr)
- }
-
- case token.AND:
- switch x.(type) {
- case int:
- return x.(int) & y.(int)
- case int8:
- return x.(int8) & y.(int8)
- case int16:
- return x.(int16) & y.(int16)
- case int32:
- return x.(int32) & y.(int32)
- case int64:
- return x.(int64) & y.(int64)
- case uint:
- return x.(uint) & y.(uint)
- case uint8:
- return x.(uint8) & y.(uint8)
- case uint16:
- return x.(uint16) & y.(uint16)
- case uint32:
- return x.(uint32) & y.(uint32)
- case uint64:
- return x.(uint64) & y.(uint64)
- case uintptr:
- return x.(uintptr) & y.(uintptr)
- }
-
- case token.OR:
- switch x.(type) {
- case int:
- return x.(int) | y.(int)
- case int8:
- return x.(int8) | y.(int8)
- case int16:
- return x.(int16) | y.(int16)
- case int32:
- return x.(int32) | y.(int32)
- case int64:
- return x.(int64) | y.(int64)
- case uint:
- return x.(uint) | y.(uint)
- case uint8:
- return x.(uint8) | y.(uint8)
- case uint16:
- return x.(uint16) | y.(uint16)
- case uint32:
- return x.(uint32) | y.(uint32)
- case uint64:
- return x.(uint64) | y.(uint64)
- case uintptr:
- return x.(uintptr) | y.(uintptr)
- }
-
- case token.XOR:
- switch x.(type) {
- case int:
- return x.(int) ^ y.(int)
- case int8:
- return x.(int8) ^ y.(int8)
- case int16:
- return x.(int16) ^ y.(int16)
- case int32:
- return x.(int32) ^ y.(int32)
- case int64:
- return x.(int64) ^ y.(int64)
- case uint:
- return x.(uint) ^ y.(uint)
- case uint8:
- return x.(uint8) ^ y.(uint8)
- case uint16:
- return x.(uint16) ^ y.(uint16)
- case uint32:
- return x.(uint32) ^ y.(uint32)
- case uint64:
- return x.(uint64) ^ y.(uint64)
- case uintptr:
- return x.(uintptr) ^ y.(uintptr)
- }
-
- case token.AND_NOT:
- switch x.(type) {
- case int:
- return x.(int) &^ y.(int)
- case int8:
- return x.(int8) &^ y.(int8)
- case int16:
- return x.(int16) &^ y.(int16)
- case int32:
- return x.(int32) &^ y.(int32)
- case int64:
- return x.(int64) &^ y.(int64)
- case uint:
- return x.(uint) &^ y.(uint)
- case uint8:
- return x.(uint8) &^ y.(uint8)
- case uint16:
- return x.(uint16) &^ y.(uint16)
- case uint32:
- return x.(uint32) &^ y.(uint32)
- case uint64:
- return x.(uint64) &^ y.(uint64)
- case uintptr:
- return x.(uintptr) &^ y.(uintptr)
- }
-
- case token.SHL:
- y := asUint64(y)
- switch x.(type) {
- case int:
- return x.(int) << y
- case int8:
- return x.(int8) << y
- case int16:
- return x.(int16) << y
- case int32:
- return x.(int32) << y
- case int64:
- return x.(int64) << y
- case uint:
- return x.(uint) << y
- case uint8:
- return x.(uint8) << y
- case uint16:
- return x.(uint16) << y
- case uint32:
- return x.(uint32) << y
- case uint64:
- return x.(uint64) << y
- case uintptr:
- return x.(uintptr) << y
- }
-
- case token.SHR:
- y := asUint64(y)
- switch x.(type) {
- case int:
- return x.(int) >> y
- case int8:
- return x.(int8) >> y
- case int16:
- return x.(int16) >> y
- case int32:
- return x.(int32) >> y
- case int64:
- return x.(int64) >> y
- case uint:
- return x.(uint) >> y
- case uint8:
- return x.(uint8) >> y
- case uint16:
- return x.(uint16) >> y
- case uint32:
- return x.(uint32) >> y
- case uint64:
- return x.(uint64) >> y
- case uintptr:
- return x.(uintptr) >> y
- }
-
- case token.LSS:
- switch x.(type) {
- case int:
- return x.(int) < y.(int)
- case int8:
- return x.(int8) < y.(int8)
- case int16:
- return x.(int16) < y.(int16)
- case int32:
- return x.(int32) < y.(int32)
- case int64:
- return x.(int64) < y.(int64)
- case uint:
- return x.(uint) < y.(uint)
- case uint8:
- return x.(uint8) < y.(uint8)
- case uint16:
- return x.(uint16) < y.(uint16)
- case uint32:
- return x.(uint32) < y.(uint32)
- case uint64:
- return x.(uint64) < y.(uint64)
- case uintptr:
- return x.(uintptr) < y.(uintptr)
- case float32:
- return x.(float32) < y.(float32)
- case float64:
- return x.(float64) < y.(float64)
- case string:
- return x.(string) < y.(string)
- }
-
- case token.LEQ:
- switch x.(type) {
- case int:
- return x.(int) <= y.(int)
- case int8:
- return x.(int8) <= y.(int8)
- case int16:
- return x.(int16) <= y.(int16)
- case int32:
- return x.(int32) <= y.(int32)
- case int64:
- return x.(int64) <= y.(int64)
- case uint:
- return x.(uint) <= y.(uint)
- case uint8:
- return x.(uint8) <= y.(uint8)
- case uint16:
- return x.(uint16) <= y.(uint16)
- case uint32:
- return x.(uint32) <= y.(uint32)
- case uint64:
- return x.(uint64) <= y.(uint64)
- case uintptr:
- return x.(uintptr) <= y.(uintptr)
- case float32:
- return x.(float32) <= y.(float32)
- case float64:
- return x.(float64) <= y.(float64)
- case string:
- return x.(string) <= y.(string)
- }
-
- case token.EQL:
- return eqnil(t, x, y)
-
- case token.NEQ:
- return !eqnil(t, x, y)
-
- case token.GTR:
- switch x.(type) {
- case int:
- return x.(int) > y.(int)
- case int8:
- return x.(int8) > y.(int8)
- case int16:
- return x.(int16) > y.(int16)
- case int32:
- return x.(int32) > y.(int32)
- case int64:
- return x.(int64) > y.(int64)
- case uint:
- return x.(uint) > y.(uint)
- case uint8:
- return x.(uint8) > y.(uint8)
- case uint16:
- return x.(uint16) > y.(uint16)
- case uint32:
- return x.(uint32) > y.(uint32)
- case uint64:
- return x.(uint64) > y.(uint64)
- case uintptr:
- return x.(uintptr) > y.(uintptr)
- case float32:
- return x.(float32) > y.(float32)
- case float64:
- return x.(float64) > y.(float64)
- case string:
- return x.(string) > y.(string)
- }
-
- case token.GEQ:
- switch x.(type) {
- case int:
- return x.(int) >= y.(int)
- case int8:
- return x.(int8) >= y.(int8)
- case int16:
- return x.(int16) >= y.(int16)
- case int32:
- return x.(int32) >= y.(int32)
- case int64:
- return x.(int64) >= y.(int64)
- case uint:
- return x.(uint) >= y.(uint)
- case uint8:
- return x.(uint8) >= y.(uint8)
- case uint16:
- return x.(uint16) >= y.(uint16)
- case uint32:
- return x.(uint32) >= y.(uint32)
- case uint64:
- return x.(uint64) >= y.(uint64)
- case uintptr:
- return x.(uintptr) >= y.(uintptr)
- case float32:
- return x.(float32) >= y.(float32)
- case float64:
- return x.(float64) >= y.(float64)
- case string:
- return x.(string) >= y.(string)
- }
- }
- panic(fmt.Sprintf("invalid binary op: %T %s %T", x, op, y))
-}
-
-// eqnil returns the comparison x == y using the equivalence relation
-// appropriate for type t.
-// If t is a reference type, at most one of x or y may be a nil value
-// of that type.
-//
-func eqnil(t types.Type, x, y value) bool {
- switch t.Underlying().(type) {
- case *types.Map, *types.Signature, *types.Slice:
- // Since these types don't support comparison,
- // one of the operands must be a literal nil.
- switch x := x.(type) {
- case *hashmap:
- return (x != nil) == (y.(*hashmap) != nil)
- case map[value]value:
- return (x != nil) == (y.(map[value]value) != nil)
- case *ssa.Function:
- switch y := y.(type) {
- case *ssa.Function:
- return (x != nil) == (y != nil)
- case *closure:
- return true
- }
- case *closure:
- return (x != nil) == (y.(*ssa.Function) != nil)
- case []value:
- return (x != nil) == (y.([]value) != nil)
- }
- panic(fmt.Sprintf("eqnil(%s): illegal dynamic type: %T", t, x))
- }
-
- return equals(t, x, y)
-}
-
-func unop(instr *ssa.UnOp, x value) value {
- switch instr.Op {
- case token.ARROW: // receive
- v, ok := <-x.(chan value)
- if !ok {
- v = zero(instr.X.Type().Underlying().(*types.Chan).Elem())
- }
- if instr.CommaOk {
- v = tuple{v, ok}
- }
- return v
- case token.SUB:
- switch x := x.(type) {
- case int:
- return -x
- case int8:
- return -x
- case int16:
- return -x
- case int32:
- return -x
- case int64:
- return -x
- case uint:
- return -x
- case uint8:
- return -x
- case uint16:
- return -x
- case uint32:
- return -x
- case uint64:
- return -x
- case uintptr:
- return -x
- case float32:
- return -x
- case float64:
- return -x
- case complex64:
- return -x
- case complex128:
- return -x
- }
- case token.MUL:
- return load(deref(instr.X.Type()), x.(*value))
- case token.NOT:
- return !x.(bool)
- case token.XOR:
- switch x := x.(type) {
- case int:
- return ^x
- case int8:
- return ^x
- case int16:
- return ^x
- case int32:
- return ^x
- case int64:
- return ^x
- case uint:
- return ^x
- case uint8:
- return ^x
- case uint16:
- return ^x
- case uint32:
- return ^x
- case uint64:
- return ^x
- case uintptr:
- return ^x
- }
- }
- panic(fmt.Sprintf("invalid unary op %s %T", instr.Op, x))
-}
-
-// typeAssert checks whether dynamic type of itf is instr.AssertedType.
-// It returns the extracted value on success, and panics on failure,
-// unless instr.CommaOk, in which case it always returns a "value,ok" tuple.
-//
-func typeAssert(i *interpreter, instr *ssa.TypeAssert, itf iface) value {
- var v value
- err := ""
- if itf.t == nil {
- err = fmt.Sprintf("interface conversion: interface is nil, not %s", instr.AssertedType)
-
- } else if idst, ok := instr.AssertedType.Underlying().(*types.Interface); ok {
- v = itf
- err = checkInterface(i, idst, itf)
-
- } else if types.Identical(itf.t, instr.AssertedType) {
- v = itf.v // extract value
-
- } else {
- err = fmt.Sprintf("interface conversion: interface is %s, not %s", itf.t, instr.AssertedType)
- }
-
- if err != "" {
- if !instr.CommaOk {
- panic(err)
- }
- return tuple{zero(instr.AssertedType), false}
- }
- if instr.CommaOk {
- return tuple{v, true}
- }
- return v
-}
-
-// If CapturedOutput is non-nil, all writes by the interpreted program
-// to file descriptors 1 and 2 will also be written to CapturedOutput.
-//
-// (The $GOROOT/test system requires that the test be considered a
-// failure if "BUG" appears in the combined stdout/stderr output, even
-// if it exits zero. This is a global variable shared by all
-// interpreters in the same process.)
-//
-var CapturedOutput *bytes.Buffer
-var capturedOutputMu sync.Mutex
-
-// write writes bytes b to the target program's file descriptor fd.
-// The print/println built-ins and the write() system call funnel
-// through here so they can be captured by the test driver.
-func write(fd int, b []byte) (int, error) {
- // TODO(adonovan): fix: on Windows, std{out,err} are not 1, 2.
- if CapturedOutput != nil && (fd == 1 || fd == 2) {
- capturedOutputMu.Lock()
- CapturedOutput.Write(b) // ignore errors
- capturedOutputMu.Unlock()
- }
- return syswrite(fd, b)
-}
-
-var syswrite func(int, []byte) (int, error) // set on darwin/linux only
-
-// callBuiltin interprets a call to builtin fn with arguments args,
-// returning its result.
-func callBuiltin(caller *frame, callpos token.Pos, fn *ssa.Builtin, args []value) value {
- switch fn.Name() {
- case "append":
- if len(args) == 1 {
- return args[0]
- }
- if s, ok := args[1].(string); ok {
- // append([]byte, ...string) []byte
- arg0 := args[0].([]value)
- for i := 0; i < len(s); i++ {
- arg0 = append(arg0, s[i])
- }
- return arg0
- }
- // append([]T, ...[]T) []T
- return append(args[0].([]value), args[1].([]value)...)
-
- case "copy": // copy([]T, []T) int or copy([]byte, string) int
- src := args[1]
- if _, ok := src.(string); ok {
- params := fn.Type().(*types.Signature).Params()
- src = conv(params.At(0).Type(), params.At(1).Type(), src)
- }
- return copy(args[0].([]value), src.([]value))
-
- case "close": // close(chan T)
- close(args[0].(chan value))
- return nil
-
- case "delete": // delete(map[K]value, K)
- switch m := args[0].(type) {
- case map[value]value:
- delete(m, args[1])
- case *hashmap:
- m.delete(args[1].(hashable))
- default:
- panic(fmt.Sprintf("illegal map type: %T", m))
- }
- return nil
-
- case "print", "println": // print(any, ...)
- ln := fn.Name() == "println"
- var buf bytes.Buffer
- for i, arg := range args {
- if i > 0 && ln {
- buf.WriteRune(' ')
- }
- buf.WriteString(toString(arg))
- }
- if ln {
- buf.WriteRune('\n')
- }
- write(1, buf.Bytes())
- return nil
-
- case "len":
- switch x := args[0].(type) {
- case string:
- return len(x)
- case array:
- return len(x)
- case *value:
- return len((*x).(array))
- case []value:
- return len(x)
- case map[value]value:
- return len(x)
- case *hashmap:
- return x.len()
- case chan value:
- return len(x)
- default:
- panic(fmt.Sprintf("len: illegal operand: %T", x))
- }
-
- case "cap":
- switch x := args[0].(type) {
- case array:
- return cap(x)
- case *value:
- return cap((*x).(array))
- case []value:
- return cap(x)
- case chan value:
- return cap(x)
- default:
- panic(fmt.Sprintf("cap: illegal operand: %T", x))
- }
-
- case "real":
- switch c := args[0].(type) {
- case complex64:
- return real(c)
- case complex128:
- return real(c)
- default:
- panic(fmt.Sprintf("real: illegal operand: %T", c))
- }
-
- case "imag":
- switch c := args[0].(type) {
- case complex64:
- return imag(c)
- case complex128:
- return imag(c)
- default:
- panic(fmt.Sprintf("imag: illegal operand: %T", c))
- }
-
- case "complex":
- switch f := args[0].(type) {
- case float32:
- return complex(f, args[1].(float32))
- case float64:
- return complex(f, args[1].(float64))
- default:
- panic(fmt.Sprintf("complex: illegal operand: %T", f))
- }
-
- case "panic":
- // ssa.Panic handles most cases; this is only for "go
- // panic" or "defer panic".
- panic(targetPanic{args[0]})
-
- case "recover":
- return doRecover(caller)
-
- case "ssa:wrapnilchk":
- recv := args[0]
- if recv.(*value) == nil {
- recvType := args[1]
- methodName := args[2]
- panic(fmt.Sprintf("value method (%s).%s called using nil *%s pointer",
- recvType, methodName, recvType))
- }
- return recv
- }
-
- panic("unknown built-in: " + fn.Name())
-}
-
-func rangeIter(x value, t types.Type) iter {
- switch x := x.(type) {
- case map[value]value:
- // TODO(adonovan): fix: leaks goroutines and channels
- // on each incomplete map iteration. We need to open
- // up an iteration interface using the
- // reflect.(Value).MapKeys machinery.
- it := make(mapIter)
- go func() {
- for k, v := range x {
- it <- [2]value{k, v}
- }
- close(it)
- }()
- return it
- case *hashmap:
- // TODO(adonovan): fix: leaks goroutines and channels
- // on each incomplete map iteration. We need to open
- // up an iteration interface using the
- // reflect.(Value).MapKeys machinery.
- it := make(mapIter)
- go func() {
- for _, e := range x.entries() {
- for e != nil {
- it <- [2]value{e.key, e.value}
- e = e.next
- }
- }
- close(it)
- }()
- return it
- case string:
- return &stringIter{Reader: strings.NewReader(x)}
- }
- panic(fmt.Sprintf("cannot range over %T", x))
-}
-
-// widen widens a basic typed value x to the widest type of its
-// category, one of:
-// bool, int64, uint64, float64, complex128, string.
-// This is inefficient but reduces the size of the cross-product of
-// cases we have to consider.
-//
-func widen(x value) value {
- switch y := x.(type) {
- case bool, int64, uint64, float64, complex128, string, unsafe.Pointer:
- return x
- case int:
- return int64(y)
- case int8:
- return int64(y)
- case int16:
- return int64(y)
- case int32:
- return int64(y)
- case uint:
- return uint64(y)
- case uint8:
- return uint64(y)
- case uint16:
- return uint64(y)
- case uint32:
- return uint64(y)
- case uintptr:
- return uint64(y)
- case float32:
- return float64(y)
- case complex64:
- return complex128(y)
- }
- panic(fmt.Sprintf("cannot widen %T", x))
-}
-
-// conv converts the value x of type t_src to type t_dst and returns
-// the result.
-// Possible cases are described with the ssa.Convert operator.
-//
-func conv(t_dst, t_src types.Type, x value) value {
- ut_src := t_src.Underlying()
- ut_dst := t_dst.Underlying()
-
- // Destination type is not an "untyped" type.
- if b, ok := ut_dst.(*types.Basic); ok && b.Info()&types.IsUntyped != 0 {
- panic("oops: conversion to 'untyped' type: " + b.String())
- }
-
- // Nor is it an interface type.
- if _, ok := ut_dst.(*types.Interface); ok {
- if _, ok := ut_src.(*types.Interface); ok {
- panic("oops: Convert should be ChangeInterface")
- } else {
- panic("oops: Convert should be MakeInterface")
- }
- }
-
- // Remaining conversions:
- // + untyped string/number/bool constant to a specific
- // representation.
- // + conversions between non-complex numeric types.
- // + conversions between complex numeric types.
- // + integer/[]byte/[]rune -> string.
- // + string -> []byte/[]rune.
- //
- // All are treated the same: first we extract the value to the
- // widest representation (int64, uint64, float64, complex128,
- // or string), then we convert it to the desired type.
-
- switch ut_src := ut_src.(type) {
- case *types.Pointer:
- switch ut_dst := ut_dst.(type) {
- case *types.Basic:
- // *value to unsafe.Pointer?
- if ut_dst.Kind() == types.UnsafePointer {
- return unsafe.Pointer(x.(*value))
- }
- }
-
- case *types.Slice:
- // []byte or []rune -> string
- // TODO(adonovan): fix: type B byte; conv([]B -> string).
- switch ut_src.Elem().(*types.Basic).Kind() {
- case types.Byte:
- x := x.([]value)
- b := make([]byte, 0, len(x))
- for i := range x {
- b = append(b, x[i].(byte))
- }
- return string(b)
-
- case types.Rune:
- x := x.([]value)
- r := make([]rune, 0, len(x))
- for i := range x {
- r = append(r, x[i].(rune))
- }
- return string(r)
- }
-
- case *types.Basic:
- x = widen(x)
-
- // integer -> string?
- // TODO(adonovan): fix: test integer -> named alias of string.
- if ut_src.Info()&types.IsInteger != 0 {
- if ut_dst, ok := ut_dst.(*types.Basic); ok && ut_dst.Kind() == types.String {
- return string(asInt(x))
- }
- }
-
- // string -> []rune, []byte or string?
- if s, ok := x.(string); ok {
- switch ut_dst := ut_dst.(type) {
- case *types.Slice:
- var res []value
- // TODO(adonovan): fix: test named alias of rune, byte.
- switch ut_dst.Elem().(*types.Basic).Kind() {
- case types.Rune:
- for _, r := range []rune(s) {
- res = append(res, r)
- }
- return res
- case types.Byte:
- for _, b := range []byte(s) {
- res = append(res, b)
- }
- return res
- }
- case *types.Basic:
- if ut_dst.Kind() == types.String {
- return x.(string)
- }
- }
- break // fail: no other conversions for string
- }
-
- // unsafe.Pointer -> *value
- if ut_src.Kind() == types.UnsafePointer {
- // TODO(adonovan): this is wrong and cannot
- // really be fixed with the current design.
- //
- // return (*value)(x.(unsafe.Pointer))
- // creates a new pointer of a different
- // type but the underlying interface value
- // knows its "true" type and so cannot be
- // meaningfully used through the new pointer.
- //
- // To make this work, the interpreter needs to
- // simulate the memory layout of a real
- // compiled implementation.
- //
- // To at least preserve type-safety, we'll
- // just return the zero value of the
- // destination type.
- return zero(t_dst)
- }
-
- // Conversions between complex numeric types?
- if ut_src.Info()&types.IsComplex != 0 {
- switch ut_dst.(*types.Basic).Kind() {
- case types.Complex64:
- return complex64(x.(complex128))
- case types.Complex128:
- return x.(complex128)
- }
- break // fail: no other conversions for complex
- }
-
- // Conversions between non-complex numeric types?
- if ut_src.Info()&types.IsNumeric != 0 {
- kind := ut_dst.(*types.Basic).Kind()
- switch x := x.(type) {
- case int64: // signed integer -> numeric?
- switch kind {
- case types.Int:
- return int(x)
- case types.Int8:
- return int8(x)
- case types.Int16:
- return int16(x)
- case types.Int32:
- return int32(x)
- case types.Int64:
- return int64(x)
- case types.Uint:
- return uint(x)
- case types.Uint8:
- return uint8(x)
- case types.Uint16:
- return uint16(x)
- case types.Uint32:
- return uint32(x)
- case types.Uint64:
- return uint64(x)
- case types.Uintptr:
- return uintptr(x)
- case types.Float32:
- return float32(x)
- case types.Float64:
- return float64(x)
- }
-
- case uint64: // unsigned integer -> numeric?
- switch kind {
- case types.Int:
- return int(x)
- case types.Int8:
- return int8(x)
- case types.Int16:
- return int16(x)
- case types.Int32:
- return int32(x)
- case types.Int64:
- return int64(x)
- case types.Uint:
- return uint(x)
- case types.Uint8:
- return uint8(x)
- case types.Uint16:
- return uint16(x)
- case types.Uint32:
- return uint32(x)
- case types.Uint64:
- return uint64(x)
- case types.Uintptr:
- return uintptr(x)
- case types.Float32:
- return float32(x)
- case types.Float64:
- return float64(x)
- }
-
- case float64: // floating point -> numeric?
- switch kind {
- case types.Int:
- return int(x)
- case types.Int8:
- return int8(x)
- case types.Int16:
- return int16(x)
- case types.Int32:
- return int32(x)
- case types.Int64:
- return int64(x)
- case types.Uint:
- return uint(x)
- case types.Uint8:
- return uint8(x)
- case types.Uint16:
- return uint16(x)
- case types.Uint32:
- return uint32(x)
- case types.Uint64:
- return uint64(x)
- case types.Uintptr:
- return uintptr(x)
- case types.Float32:
- return float32(x)
- case types.Float64:
- return float64(x)
- }
- }
- }
- }
-
- panic(fmt.Sprintf("unsupported conversion: %s -> %s, dynamic type %T", t_src, t_dst, x))
-}
-
-// checkInterface checks that the method set of x implements the
-// interface itype.
-// On success it returns "", on failure, an error message.
-//
-func checkInterface(i *interpreter, itype *types.Interface, x iface) string {
- if meth, _ := types.MissingMethod(x.t, itype, true); meth != nil {
- return fmt.Sprintf("interface conversion: %v is not %v: missing method %s",
- x.t, itype, meth.Name())
- }
- return "" // ok
-}
diff --git a/vendor/golang.org/x/tools/go/ssa/interp/reflect.go b/vendor/golang.org/x/tools/go/ssa/interp/reflect.go
deleted file mode 100644
index 2b82899..0000000
--- a/vendor/golang.org/x/tools/go/ssa/interp/reflect.go
+++ /dev/null
@@ -1,574 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package interp
-
-// Emulated "reflect" package.
-//
-// We completely replace the built-in "reflect" package.
-// The only thing clients can depend upon are that reflect.Type is an
-// interface and reflect.Value is an (opaque) struct.
-
-import (
- "fmt"
- "go/token"
- "go/types"
- "reflect"
- "unsafe"
-
- "golang.org/x/tools/go/ssa"
-)
-
-type opaqueType struct {
- types.Type
- name string
-}
-
-func (t *opaqueType) String() string { return t.name }
-
-// A bogus "reflect" type-checker package. Shared across interpreters.
-var reflectTypesPackage = types.NewPackage("reflect", "reflect")
-
-// rtype is the concrete type the interpreter uses to implement the
-// reflect.Type interface.
-//
-// type rtype
-var rtypeType = makeNamedType("rtype", &opaqueType{nil, "rtype"})
-
-// error is an (interpreted) named type whose underlying type is string.
-// The interpreter uses it for all implementations of the built-in error
-// interface that it creates.
-// We put it in the "reflect" package for expedience.
-//
-// type error string
-var errorType = makeNamedType("error", &opaqueType{nil, "error"})
-
-func makeNamedType(name string, underlying types.Type) *types.Named {
- obj := types.NewTypeName(token.NoPos, reflectTypesPackage, name, nil)
- return types.NewNamed(obj, underlying, nil)
-}
-
-func makeReflectValue(t types.Type, v value) value {
- return structure{rtype{t}, v}
-}
-
-// Given a reflect.Value, returns its rtype.
-func rV2T(v value) rtype {
- return v.(structure)[0].(rtype)
-}
-
-// Given a reflect.Value, returns the underlying interpreter value.
-func rV2V(v value) value {
- return v.(structure)[1]
-}
-
-// makeReflectType boxes up an rtype in a reflect.Type interface.
-func makeReflectType(rt rtype) value {
- return iface{rtypeType, rt}
-}
-
-func ext۰reflect۰Init(fr *frame, args []value) value {
- // Signature: func()
- return nil
-}
-
-func ext۰reflect۰rtype۰Bits(fr *frame, args []value) value {
- // Signature: func (t reflect.rtype) int
- rt := args[0].(rtype).t
- basic, ok := rt.Underlying().(*types.Basic)
- if !ok {
- panic(fmt.Sprintf("reflect.Type.Bits(%T): non-basic type", rt))
- }
- return int(fr.i.sizes.Sizeof(basic)) * 8
-}
-
-func ext۰reflect۰rtype۰Elem(fr *frame, args []value) value {
- // Signature: func (t reflect.rtype) reflect.Type
- return makeReflectType(rtype{args[0].(rtype).t.Underlying().(interface {
- Elem() types.Type
- }).Elem()})
-}
-
-func ext۰reflect۰rtype۰Field(fr *frame, args []value) value {
- // Signature: func (t reflect.rtype, i int) reflect.StructField
- st := args[0].(rtype).t.Underlying().(*types.Struct)
- i := args[1].(int)
- f := st.Field(i)
- return structure{
- f.Name(),
- f.Pkg().Path(),
- makeReflectType(rtype{f.Type()}),
- st.Tag(i),
- 0, // TODO(adonovan): offset
- []value{}, // TODO(adonovan): indices
- f.Anonymous(),
- }
-}
-
-func ext۰reflect۰rtype۰In(fr *frame, args []value) value {
- // Signature: func (t reflect.rtype, i int) int
- i := args[1].(int)
- return makeReflectType(rtype{args[0].(rtype).t.(*types.Signature).Params().At(i).Type()})
-}
-
-func ext۰reflect۰rtype۰Kind(fr *frame, args []value) value {
- // Signature: func (t reflect.rtype) uint
- return uint(reflectKind(args[0].(rtype).t))
-}
-
-func ext۰reflect۰rtype۰NumField(fr *frame, args []value) value {
- // Signature: func (t reflect.rtype) int
- return args[0].(rtype).t.Underlying().(*types.Struct).NumFields()
-}
-
-func ext۰reflect۰rtype۰NumIn(fr *frame, args []value) value {
- // Signature: func (t reflect.rtype) int
- return args[0].(rtype).t.(*types.Signature).Params().Len()
-}
-
-func ext۰reflect۰rtype۰NumMethod(fr *frame, args []value) value {
- // Signature: func (t reflect.rtype) int
- return fr.i.prog.MethodSets.MethodSet(args[0].(rtype).t).Len()
-}
-
-func ext۰reflect۰rtype۰NumOut(fr *frame, args []value) value {
- // Signature: func (t reflect.rtype) int
- return args[0].(rtype).t.(*types.Signature).Results().Len()
-}
-
-func ext۰reflect۰rtype۰Out(fr *frame, args []value) value {
- // Signature: func (t reflect.rtype, i int) int
- i := args[1].(int)
- return makeReflectType(rtype{args[0].(rtype).t.(*types.Signature).Results().At(i).Type()})
-}
-
-func ext۰reflect۰rtype۰Size(fr *frame, args []value) value {
- // Signature: func (t reflect.rtype) uintptr
- return uintptr(fr.i.sizes.Sizeof(args[0].(rtype).t))
-}
-
-func ext۰reflect۰rtype۰String(fr *frame, args []value) value {
- // Signature: func (t reflect.rtype) string
- return args[0].(rtype).t.String()
-}
-
-func ext۰reflect۰New(fr *frame, args []value) value {
- // Signature: func (t reflect.Type) reflect.Value
- t := args[0].(iface).v.(rtype).t
- alloc := zero(t)
- return makeReflectValue(types.NewPointer(t), &alloc)
-}
-
-func ext۰reflect۰SliceOf(fr *frame, args []value) value {
- // Signature: func (t reflect.rtype) Type
- return makeReflectType(rtype{types.NewSlice(args[0].(iface).v.(rtype).t)})
-}
-
-func ext۰reflect۰TypeOf(fr *frame, args []value) value {
- // Signature: func (t reflect.rtype) Type
- return makeReflectType(rtype{args[0].(iface).t})
-}
-
-func ext۰reflect۰ValueOf(fr *frame, args []value) value {
- // Signature: func (interface{}) reflect.Value
- itf := args[0].(iface)
- return makeReflectValue(itf.t, itf.v)
-}
-
-func ext۰reflect۰Zero(fr *frame, args []value) value {
- // Signature: func (t reflect.Type) reflect.Value
- t := args[0].(iface).v.(rtype).t
- return makeReflectValue(t, zero(t))
-}
-
-func reflectKind(t types.Type) reflect.Kind {
- switch t := t.(type) {
- case *types.Named:
- return reflectKind(t.Underlying())
- case *types.Basic:
- switch t.Kind() {
- case types.Bool:
- return reflect.Bool
- case types.Int:
- return reflect.Int
- case types.Int8:
- return reflect.Int8
- case types.Int16:
- return reflect.Int16
- case types.Int32:
- return reflect.Int32
- case types.Int64:
- return reflect.Int64
- case types.Uint:
- return reflect.Uint
- case types.Uint8:
- return reflect.Uint8
- case types.Uint16:
- return reflect.Uint16
- case types.Uint32:
- return reflect.Uint32
- case types.Uint64:
- return reflect.Uint64
- case types.Uintptr:
- return reflect.Uintptr
- case types.Float32:
- return reflect.Float32
- case types.Float64:
- return reflect.Float64
- case types.Complex64:
- return reflect.Complex64
- case types.Complex128:
- return reflect.Complex128
- case types.String:
- return reflect.String
- case types.UnsafePointer:
- return reflect.UnsafePointer
- }
- case *types.Array:
- return reflect.Array
- case *types.Chan:
- return reflect.Chan
- case *types.Signature:
- return reflect.Func
- case *types.Interface:
- return reflect.Interface
- case *types.Map:
- return reflect.Map
- case *types.Pointer:
- return reflect.Ptr
- case *types.Slice:
- return reflect.Slice
- case *types.Struct:
- return reflect.Struct
- }
- panic(fmt.Sprint("unexpected type: ", t))
-}
-
-func ext۰reflect۰Value۰Kind(fr *frame, args []value) value {
- // Signature: func (reflect.Value) uint
- return uint(reflectKind(rV2T(args[0]).t))
-}
-
-func ext۰reflect۰Value۰String(fr *frame, args []value) value {
- // Signature: func (reflect.Value) string
- return toString(rV2V(args[0]))
-}
-
-func ext۰reflect۰Value۰Type(fr *frame, args []value) value {
- // Signature: func (reflect.Value) reflect.Type
- return makeReflectType(rV2T(args[0]))
-}
-
-func ext۰reflect۰Value۰Uint(fr *frame, args []value) value {
- // Signature: func (reflect.Value) uint64
- switch v := rV2V(args[0]).(type) {
- case uint:
- return uint64(v)
- case uint8:
- return uint64(v)
- case uint16:
- return uint64(v)
- case uint32:
- return uint64(v)
- case uint64:
- return uint64(v)
- case uintptr:
- return uint64(v)
- }
- panic("reflect.Value.Uint")
-}
-
-func ext۰reflect۰Value۰Len(fr *frame, args []value) value {
- // Signature: func (reflect.Value) int
- switch v := rV2V(args[0]).(type) {
- case string:
- return len(v)
- case array:
- return len(v)
- case chan value:
- return cap(v)
- case []value:
- return len(v)
- case *hashmap:
- return v.len()
- case map[value]value:
- return len(v)
- default:
- panic(fmt.Sprintf("reflect.(Value).Len(%v)", v))
- }
-}
-
-func ext۰reflect۰Value۰MapIndex(fr *frame, args []value) value {
- // Signature: func (reflect.Value) Value
- tValue := rV2T(args[0]).t.Underlying().(*types.Map).Key()
- k := rV2V(args[1])
- switch m := rV2V(args[0]).(type) {
- case map[value]value:
- if v, ok := m[k]; ok {
- return makeReflectValue(tValue, v)
- }
-
- case *hashmap:
- if v := m.lookup(k.(hashable)); v != nil {
- return makeReflectValue(tValue, v)
- }
-
- default:
- panic(fmt.Sprintf("(reflect.Value).MapIndex(%T, %T)", m, k))
- }
- return makeReflectValue(nil, nil)
-}
-
-func ext۰reflect۰Value۰MapKeys(fr *frame, args []value) value {
- // Signature: func (reflect.Value) []Value
- var keys []value
- tKey := rV2T(args[0]).t.Underlying().(*types.Map).Key()
- switch v := rV2V(args[0]).(type) {
- case map[value]value:
- for k := range v {
- keys = append(keys, makeReflectValue(tKey, k))
- }
-
- case *hashmap:
- for _, e := range v.entries() {
- for ; e != nil; e = e.next {
- keys = append(keys, makeReflectValue(tKey, e.key))
- }
- }
-
- default:
- panic(fmt.Sprintf("(reflect.Value).MapKeys(%T)", v))
- }
- return keys
-}
-
-func ext۰reflect۰Value۰NumField(fr *frame, args []value) value {
- // Signature: func (reflect.Value) int
- return len(rV2V(args[0]).(structure))
-}
-
-func ext۰reflect۰Value۰NumMethod(fr *frame, args []value) value {
- // Signature: func (reflect.Value) int
- return fr.i.prog.MethodSets.MethodSet(rV2T(args[0]).t).Len()
-}
-
-func ext۰reflect۰Value۰Pointer(fr *frame, args []value) value {
- // Signature: func (v reflect.Value) uintptr
- switch v := rV2V(args[0]).(type) {
- case *value:
- return uintptr(unsafe.Pointer(v))
- case chan value:
- return reflect.ValueOf(v).Pointer()
- case []value:
- return reflect.ValueOf(v).Pointer()
- case *hashmap:
- return reflect.ValueOf(v.entries()).Pointer()
- case map[value]value:
- return reflect.ValueOf(v).Pointer()
- case *ssa.Function:
- return uintptr(unsafe.Pointer(v))
- case *closure:
- return uintptr(unsafe.Pointer(v))
- default:
- panic(fmt.Sprintf("reflect.(Value).Pointer(%T)", v))
- }
-}
-
-func ext۰reflect۰Value۰Index(fr *frame, args []value) value {
- // Signature: func (v reflect.Value, i int) Value
- i := args[1].(int)
- t := rV2T(args[0]).t.Underlying()
- switch v := rV2V(args[0]).(type) {
- case array:
- return makeReflectValue(t.(*types.Array).Elem(), v[i])
- case []value:
- return makeReflectValue(t.(*types.Slice).Elem(), v[i])
- default:
- panic(fmt.Sprintf("reflect.(Value).Index(%T)", v))
- }
-}
-
-func ext۰reflect۰Value۰Bool(fr *frame, args []value) value {
- // Signature: func (reflect.Value) bool
- return rV2V(args[0]).(bool)
-}
-
-func ext۰reflect۰Value۰CanAddr(fr *frame, args []value) value {
- // Signature: func (v reflect.Value) bool
- // Always false for our representation.
- return false
-}
-
-func ext۰reflect۰Value۰CanInterface(fr *frame, args []value) value {
- // Signature: func (v reflect.Value) bool
- // Always true for our representation.
- return true
-}
-
-func ext۰reflect۰Value۰Elem(fr *frame, args []value) value {
- // Signature: func (v reflect.Value) reflect.Value
- switch x := rV2V(args[0]).(type) {
- case iface:
- return makeReflectValue(x.t, x.v)
- case *value:
- return makeReflectValue(rV2T(args[0]).t.Underlying().(*types.Pointer).Elem(), *x)
- default:
- panic(fmt.Sprintf("reflect.(Value).Elem(%T)", x))
- }
-}
-
-func ext۰reflect۰Value۰Field(fr *frame, args []value) value {
- // Signature: func (v reflect.Value, i int) reflect.Value
- v := args[0]
- i := args[1].(int)
- return makeReflectValue(rV2T(v).t.Underlying().(*types.Struct).Field(i).Type(), rV2V(v).(structure)[i])
-}
-
-func ext۰reflect۰Value۰Float(fr *frame, args []value) value {
- // Signature: func (reflect.Value) float64
- switch v := rV2V(args[0]).(type) {
- case float32:
- return float64(v)
- case float64:
- return float64(v)
- }
- panic("reflect.Value.Float")
-}
-
-func ext۰reflect۰Value۰Interface(fr *frame, args []value) value {
- // Signature: func (v reflect.Value) interface{}
- return ext۰reflect۰valueInterface(fr, args)
-}
-
-func ext۰reflect۰Value۰Int(fr *frame, args []value) value {
- // Signature: func (reflect.Value) int64
- switch x := rV2V(args[0]).(type) {
- case int:
- return int64(x)
- case int8:
- return int64(x)
- case int16:
- return int64(x)
- case int32:
- return int64(x)
- case int64:
- return x
- default:
- panic(fmt.Sprintf("reflect.(Value).Int(%T)", x))
- }
-}
-
-func ext۰reflect۰Value۰IsNil(fr *frame, args []value) value {
- // Signature: func (reflect.Value) bool
- switch x := rV2V(args[0]).(type) {
- case *value:
- return x == nil
- case chan value:
- return x == nil
- case map[value]value:
- return x == nil
- case *hashmap:
- return x == nil
- case iface:
- return x.t == nil
- case []value:
- return x == nil
- case *ssa.Function:
- return x == nil
- case *ssa.Builtin:
- return x == nil
- case *closure:
- return x == nil
- default:
- panic(fmt.Sprintf("reflect.(Value).IsNil(%T)", x))
- }
-}
-
-func ext۰reflect۰Value۰IsValid(fr *frame, args []value) value {
- // Signature: func (reflect.Value) bool
- return rV2V(args[0]) != nil
-}
-
-func ext۰reflect۰Value۰Set(fr *frame, args []value) value {
- // TODO(adonovan): implement.
- return nil
-}
-
-func ext۰reflect۰valueInterface(fr *frame, args []value) value {
- // Signature: func (v reflect.Value, safe bool) interface{}
- v := args[0].(structure)
- return iface{rV2T(v).t, rV2V(v)}
-}
-
-func ext۰reflect۰error۰Error(fr *frame, args []value) value {
- return args[0]
-}
-
-// newMethod creates a new method of the specified name, package and receiver type.
-func newMethod(pkg *ssa.Package, recvType types.Type, name string) *ssa.Function {
- // TODO(adonovan): fix: hack: currently the only part of Signature
- // that is needed is the "pointerness" of Recv.Type, and for
- // now, we'll set it to always be false since we're only
- // concerned with rtype. Encapsulate this better.
- sig := types.NewSignature(types.NewVar(token.NoPos, nil, "recv", recvType), nil, nil, false)
- fn := pkg.Prog.NewFunction(name, sig, "fake reflect method")
- fn.Pkg = pkg
- return fn
-}
-
-func initReflect(i *interpreter) {
- i.reflectPackage = &ssa.Package{
- Prog: i.prog,
- Pkg: reflectTypesPackage,
- Members: make(map[string]ssa.Member),
- }
-
- // Clobber the type-checker's notion of reflect.Value's
- // underlying type so that it more closely matches the fake one
- // (at least in the number of fields---we lie about the type of
- // the rtype field).
- //
- // We must ensure that calls to (ssa.Value).Type() return the
- // fake type so that correct "shape" is used when allocating
- // variables, making zero values, loading, and storing.
- //
- // TODO(adonovan): obviously this is a hack. We need a cleaner
- // way to fake the reflect package (almost---DeepEqual is fine).
- // One approach would be not to even load its source code, but
- // provide fake source files. This would guarantee that no bad
- // information leaks into other packages.
- if r := i.prog.ImportedPackage("reflect"); r != nil {
- rV := r.Pkg.Scope().Lookup("Value").Type().(*types.Named)
-
- // delete bodies of the old methods
- mset := i.prog.MethodSets.MethodSet(rV)
- for j := 0; j < mset.Len(); j++ {
- i.prog.MethodValue(mset.At(j)).Blocks = nil
- }
-
- tEface := types.NewInterface(nil, nil).Complete()
- rV.SetUnderlying(types.NewStruct([]*types.Var{
- types.NewField(token.NoPos, r.Pkg, "t", tEface, false), // a lie
- types.NewField(token.NoPos, r.Pkg, "v", tEface, false),
- }, nil))
- }
-
- i.rtypeMethods = methodSet{
- "Bits": newMethod(i.reflectPackage, rtypeType, "Bits"),
- "Elem": newMethod(i.reflectPackage, rtypeType, "Elem"),
- "Field": newMethod(i.reflectPackage, rtypeType, "Field"),
- "In": newMethod(i.reflectPackage, rtypeType, "In"),
- "Kind": newMethod(i.reflectPackage, rtypeType, "Kind"),
- "NumField": newMethod(i.reflectPackage, rtypeType, "NumField"),
- "NumIn": newMethod(i.reflectPackage, rtypeType, "NumIn"),
- "NumMethod": newMethod(i.reflectPackage, rtypeType, "NumMethod"),
- "NumOut": newMethod(i.reflectPackage, rtypeType, "NumOut"),
- "Out": newMethod(i.reflectPackage, rtypeType, "Out"),
- "Size": newMethod(i.reflectPackage, rtypeType, "Size"),
- "String": newMethod(i.reflectPackage, rtypeType, "String"),
- }
- i.errorMethods = methodSet{
- "Error": newMethod(i.reflectPackage, errorType, "Error"),
- }
-}
diff --git a/vendor/golang.org/x/tools/go/ssa/interp/testdata/a_test.go b/vendor/golang.org/x/tools/go/ssa/interp/testdata/a_test.go
deleted file mode 100644
index 844ec5c..0000000
--- a/vendor/golang.org/x/tools/go/ssa/interp/testdata/a_test.go
+++ /dev/null
@@ -1,17 +0,0 @@
-package a
-
-import "testing"
-
-func TestFoo(t *testing.T) {
- t.Error("foo")
-}
-
-func TestBar(t *testing.T) {
- t.Error("bar")
-}
-
-func BenchmarkWiz(b *testing.B) {
- b.Error("wiz")
-}
-
-// Don't test Examples since that testing package needs pipe(2) for that.
diff --git a/vendor/golang.org/x/tools/go/ssa/interp/testdata/b_test.go b/vendor/golang.org/x/tools/go/ssa/interp/testdata/b_test.go
deleted file mode 100644
index 4a30e96..0000000
--- a/vendor/golang.org/x/tools/go/ssa/interp/testdata/b_test.go
+++ /dev/null
@@ -1,11 +0,0 @@
-package b
-
-import "testing"
-
-func NotATest(t *testing.T) {
- t.Error("foo")
-}
-
-func NotABenchmark(b *testing.B) {
- b.Error("wiz")
-}
diff --git a/vendor/golang.org/x/tools/go/ssa/interp/testdata/boundmeth.go b/vendor/golang.org/x/tools/go/ssa/interp/testdata/boundmeth.go
deleted file mode 100644
index 255cc60..0000000
--- a/vendor/golang.org/x/tools/go/ssa/interp/testdata/boundmeth.go
+++ /dev/null
@@ -1,144 +0,0 @@
-// Tests of bound method closures.
-
-package main
-
-import "fmt"
-
-func assert(b bool) {
- if !b {
- panic("oops")
- }
-}
-
-type I int
-
-func (i I) add(x int) int {
- return int(i) + x
-}
-
-func valueReceiver() {
- var three I = 3
- assert(three.add(5) == 8)
- var add3 func(int) int = three.add
- assert(add3(5) == 8)
-}
-
-type S struct{ x int }
-
-func (s *S) incr() {
- s.x++
-}
-
-func (s *S) get() int {
- return s.x
-}
-
-func pointerReceiver() {
- ps := new(S)
- incr := ps.incr
- get := ps.get
- assert(get() == 0)
- incr()
- incr()
- incr()
- assert(get() == 3)
-}
-
-func addressibleValuePointerReceiver() {
- var s S
- incr := s.incr
- get := s.get
- assert(get() == 0)
- incr()
- incr()
- incr()
- assert(get() == 3)
-}
-
-type S2 struct {
- S
-}
-
-func promotedReceiver() {
- var s2 S2
- incr := s2.incr
- get := s2.get
- assert(get() == 0)
- incr()
- incr()
- incr()
- assert(get() == 3)
-}
-
-func anonStruct() {
- var s struct{ S }
- incr := s.incr
- get := s.get
- assert(get() == 0)
- incr()
- incr()
- incr()
- assert(get() == 3)
-}
-
-func typeCheck() {
- var i interface{}
- i = (*S).incr
- _ = i.(func(*S)) // type assertion: receiver type prepended to params
-
- var s S
- i = s.incr
- _ = i.(func()) // type assertion: receiver type disappears
-}
-
-type errString string
-
-func (err errString) Error() string {
- return string(err)
-}
-
-// Regression test for a builder crash.
-func regress1(x error) func() string {
- return x.Error
-}
-
-// Regression test for b/7269:
-// taking the value of an interface method performs a nil check.
-func nilInterfaceMethodValue() {
- err := fmt.Errorf("ok")
- f := err.Error
- if got := f(); got != "ok" {
- panic(got)
- }
-
- err = nil
- if got := f(); got != "ok" {
- panic(got)
- }
-
- defer func() {
- r := fmt.Sprint(recover())
- // runtime panic string varies across toolchains
- if r != "runtime error: interface conversion: interface is nil, not error" &&
- r != "runtime error: invalid memory address or nil pointer dereference" {
- panic("want runtime panic from nil interface method value, got " + r)
- }
- }()
- f = err.Error // runtime panic: err is nil
- panic("unreachable")
-}
-
-func main() {
- valueReceiver()
- pointerReceiver()
- addressibleValuePointerReceiver()
- promotedReceiver()
- anonStruct()
- typeCheck()
-
- if e := regress1(errString("hi"))(); e != "hi" {
- panic(e)
- }
-
- nilInterfaceMethodValue()
-}
diff --git a/vendor/golang.org/x/tools/go/ssa/interp/testdata/c_test.go b/vendor/golang.org/x/tools/go/ssa/interp/testdata/c_test.go
deleted file mode 100644
index ad80b91..0000000
--- a/vendor/golang.org/x/tools/go/ssa/interp/testdata/c_test.go
+++ /dev/null
@@ -1,17 +0,0 @@
-package c_test
-
-import (
- "os"
- "testing"
-)
-
-func TestC(t *testing.T) {
- println("TestC")
-}
-
-func TestMain(m *testing.M) {
- println("TestMain start")
- code := m.Run()
- println("TestMain end")
- os.Exit(code)
-}
diff --git a/vendor/golang.org/x/tools/go/ssa/interp/testdata/callstack.go b/vendor/golang.org/x/tools/go/ssa/interp/testdata/callstack.go
deleted file mode 100644
index 56f3b28..0000000
--- a/vendor/golang.org/x/tools/go/ssa/interp/testdata/callstack.go
+++ /dev/null
@@ -1,52 +0,0 @@
-package main
-
-import (
- "fmt"
- "path"
- "runtime"
- "strings"
-)
-
-var stack string
-
-func f() {
- pc := make([]uintptr, 6)
- pc = pc[:runtime.Callers(1, pc)]
- for _, f := range pc {
- Func := runtime.FuncForPC(f)
- name := Func.Name()
- if strings.Contains(name, "$") || strings.Contains(name, ".func") {
- name = "func" // anon funcs vary across toolchains
- }
- file, line := Func.FileLine(0)
- stack += fmt.Sprintf("%s at %s:%d\n", name, path.Base(file), line)
- }
-}
-
-func g() { f() }
-func h() { g() }
-func i() { func() { h() }() }
-
-// Hack: the 'func' and the call to Caller are on the same line,
-// to paper over differences between toolchains.
-// (The interpreter's location info isn't yet complete.)
-func runtimeCaller0() (uintptr, string, int, bool) { return runtime.Caller(0) }
-
-func main() {
- i()
- if stack != `main.f at callstack.go:12
-main.g at callstack.go:26
-main.h at callstack.go:27
-func at callstack.go:28
-main.i at callstack.go:28
-main.main at callstack.go:35
-` {
- panic("unexpected stack: " + stack)
- }
-
- pc, file, line, _ := runtimeCaller0()
- got := fmt.Sprintf("%s @ %s:%d", runtime.FuncForPC(pc).Name(), path.Base(file), line)
- if got != "main.runtimeCaller0 @ callstack.go:33" {
- panic("runtime.Caller: " + got)
- }
-}
diff --git a/vendor/golang.org/x/tools/go/ssa/interp/testdata/complit.go b/vendor/golang.org/x/tools/go/ssa/interp/testdata/complit.go
deleted file mode 100644
index 7bec523..0000000
--- a/vendor/golang.org/x/tools/go/ssa/interp/testdata/complit.go
+++ /dev/null
@@ -1,184 +0,0 @@
-package main
-
-// Tests of composite literals.
-
-import "fmt"
-
-// Map literals.
-func init() {
- type M map[int]int
- m1 := []*M{{1: 1}, &M{2: 2}}
- want := "map[1:1] map[2:2]"
- if got := fmt.Sprint(*m1[0], *m1[1]); got != want {
- panic(got)
- }
- m2 := []M{{1: 1}, M{2: 2}}
- if got := fmt.Sprint(m2[0], m2[1]); got != want {
- panic(got)
- }
-}
-
-// Nonliteral keys in composite literal.
-func init() {
- const zero int = 1
- var v = []int{1 + zero: 42}
- if x := fmt.Sprint(v); x != "[0 0 42]" {
- panic(x)
- }
-}
-
-// Test for in-place initialization.
-func init() {
- // struct
- type S struct {
- a, b int
- }
- s := S{1, 2}
- s = S{b: 3}
- if s.a != 0 {
- panic("s.a != 0")
- }
- if s.b != 3 {
- panic("s.b != 3")
- }
- s = S{}
- if s.a != 0 {
- panic("s.a != 0")
- }
- if s.b != 0 {
- panic("s.b != 0")
- }
-
- // array
- type A [4]int
- a := A{2, 4, 6, 8}
- a = A{1: 6, 2: 4}
- if a[0] != 0 {
- panic("a[0] != 0")
- }
- if a[1] != 6 {
- panic("a[1] != 6")
- }
- if a[2] != 4 {
- panic("a[2] != 4")
- }
- if a[3] != 0 {
- panic("a[3] != 0")
- }
- a = A{}
- if a[0] != 0 {
- panic("a[0] != 0")
- }
- if a[1] != 0 {
- panic("a[1] != 0")
- }
- if a[2] != 0 {
- panic("a[2] != 0")
- }
- if a[3] != 0 {
- panic("a[3] != 0")
- }
-}
-
-// Regression test for https://github.com/golang/go/issues/10127:
-// composite literal clobbers destination before reading from it.
-func init() {
- // map
- {
- type M map[string]int
- m := M{"x": 1, "y": 2}
- m = M{"x": m["y"], "y": m["x"]}
- if m["x"] != 2 || m["y"] != 1 {
- panic(fmt.Sprint(m))
- }
-
- n := M{"x": 3}
- m, n = M{"x": n["x"]}, M{"x": m["x"]} // parallel assignment
- if got := fmt.Sprint(m["x"], n["x"]); got != "3 2" {
- panic(got)
- }
- }
-
- // struct
- {
- type T struct{ x, y, z int }
- t := T{x: 1, y: 2, z: 3}
-
- t = T{x: t.y, y: t.z, z: t.x} // all fields
- if got := fmt.Sprint(t); got != "{2 3 1}" {
- panic(got)
- }
-
- t = T{x: t.y, y: t.z + 3} // not all fields
- if got := fmt.Sprint(t); got != "{3 4 0}" {
- panic(got)
- }
-
- u := T{x: 5, y: 6, z: 7}
- t, u = T{x: u.x}, T{x: t.x} // parallel assignment
- if got := fmt.Sprint(t, u); got != "{5 0 0} {3 0 0}" {
- panic(got)
- }
- }
-
- // array
- {
- a := [3]int{0: 1, 1: 2, 2: 3}
-
- a = [3]int{0: a[1], 1: a[2], 2: a[0]} // all elements
- if got := fmt.Sprint(a); got != "[2 3 1]" {
- panic(got)
- }
-
- a = [3]int{0: a[1], 1: a[2] + 3} // not all elements
- if got := fmt.Sprint(a); got != "[3 4 0]" {
- panic(got)
- }
-
- b := [3]int{0: 5, 1: 6, 2: 7}
- a, b = [3]int{0: b[0]}, [3]int{0: a[0]} // parallel assignment
- if got := fmt.Sprint(a, b); got != "[5 0 0] [3 0 0]" {
- panic(got)
- }
- }
-
- // slice
- {
- s := []int{0: 1, 1: 2, 2: 3}
-
- s = []int{0: s[1], 1: s[2], 2: s[0]} // all elements
- if got := fmt.Sprint(s); got != "[2 3 1]" {
- panic(got)
- }
-
- s = []int{0: s[1], 1: s[2] + 3} // not all elements
- if got := fmt.Sprint(s); got != "[3 4]" {
- panic(got)
- }
-
- t := []int{0: 5, 1: 6, 2: 7}
- s, t = []int{0: t[0]}, []int{0: s[0]} // parallel assignment
- if got := fmt.Sprint(s, t); got != "[5] [3]" {
- panic(got)
- }
- }
-}
-
-// Regression test for https://github.com/golang/go/issues/13341:
-// within a map literal, if a key expression is a composite literal,
-// Go 1.5 allows its type to be omitted. An & operation may be implied.
-func init() {
- type S struct{ x int }
- // same as map[*S]bool{&S{x: 1}: true}
- m := map[*S]bool{{x: 1}: true}
- for s := range m {
- if s.x != 1 {
- panic(s) // wrong key
- }
- return
- }
- panic("map is empty")
-}
-
-func main() {
-}
diff --git a/vendor/golang.org/x/tools/go/ssa/interp/testdata/coverage.go b/vendor/golang.org/x/tools/go/ssa/interp/testdata/coverage.go
deleted file mode 100644
index 37ef95c..0000000
--- a/vendor/golang.org/x/tools/go/ssa/interp/testdata/coverage.go
+++ /dev/null
@@ -1,534 +0,0 @@
-// This interpreter test is designed to run very quickly yet provide
-// some coverage of a broad selection of constructs.
-//
-// Validate this file with 'go run' after editing.
-// TODO(adonovan): break this into small files organized by theme.
-
-package main
-
-import (
- "fmt"
- "reflect"
-)
-
-func init() {
- // Call of variadic function with (implicit) empty slice.
- if x := fmt.Sprint(); x != "" {
- panic(x)
- }
-}
-
-type empty interface{}
-
-type I interface {
- f() int
-}
-
-type T struct{ z int }
-
-func (t T) f() int { return t.z }
-
-func use(interface{}) {}
-
-var counter = 2
-
-// Test initialization, including init blocks containing 'return'.
-// Assertion is in main.
-func init() {
- counter *= 3
- return
- counter *= 3
-}
-
-func init() {
- counter *= 5
- return
- counter *= 5
-}
-
-// Recursion.
-func fib(x int) int {
- if x < 2 {
- return x
- }
- return fib(x-1) + fib(x-2)
-}
-
-func fibgen(ch chan int) {
- for x := 0; x < 10; x++ {
- ch <- fib(x)
- }
- close(ch)
-}
-
-// Goroutines and channels.
-func init() {
- ch := make(chan int)
- go fibgen(ch)
- var fibs []int
- for v := range ch {
- fibs = append(fibs, v)
- if len(fibs) == 10 {
- break
- }
- }
- if x := fmt.Sprint(fibs); x != "[0 1 1 2 3 5 8 13 21 34]" {
- panic(x)
- }
-}
-
-// Test of aliasing.
-func init() {
- type S struct {
- a, b string
- }
-
- s1 := []string{"foo", "bar"}
- s2 := s1 // creates an alias
- s2[0] = "wiz"
- if x := fmt.Sprint(s1, s2); x != "[wiz bar] [wiz bar]" {
- panic(x)
- }
-
- pa1 := &[2]string{"foo", "bar"}
- pa2 := pa1 // creates an alias
- pa2[0] = "wiz"
- if x := fmt.Sprint(*pa1, *pa2); x != "[wiz bar] [wiz bar]" {
- panic(x)
- }
-
- a1 := [2]string{"foo", "bar"}
- a2 := a1 // creates a copy
- a2[0] = "wiz"
- if x := fmt.Sprint(a1, a2); x != "[foo bar] [wiz bar]" {
- panic(x)
- }
-
- t1 := S{"foo", "bar"}
- t2 := t1 // copy
- t2.a = "wiz"
- if x := fmt.Sprint(t1, t2); x != "{foo bar} {wiz bar}" {
- panic(x)
- }
-}
-
-func main() {
- print() // legal
-
- if counter != 2*3*5 {
- panic(counter)
- }
-
- // Test builtins (e.g. complex) preserve named argument types.
- type N complex128
- var n N
- n = complex(1.0, 2.0)
- if n != complex(1.0, 2.0) {
- panic(n)
- }
- if x := reflect.TypeOf(n).String(); x != "main.N" {
- panic(x)
- }
- if real(n) != 1.0 || imag(n) != 2.0 {
- panic(n)
- }
-
- // Channel + select.
- ch := make(chan int, 1)
- select {
- case ch <- 1:
- // ok
- default:
- panic("couldn't send")
- }
- if <-ch != 1 {
- panic("couldn't receive")
- }
- // A "receive" select-case that doesn't declare its vars. (regression test)
- anint := 0
- ok := false
- select {
- case anint, ok = <-ch:
- case anint = <-ch:
- default:
- }
- _ = anint
- _ = ok
-
- // Anon structs with methods.
- anon := struct{ T }{T: T{z: 1}}
- if x := anon.f(); x != 1 {
- panic(x)
- }
- var i I = anon
- if x := i.f(); x != 1 {
- panic(x)
- }
- // NB. precise output of reflect.Type.String is undefined.
- if x := reflect.TypeOf(i).String(); x != "struct { main.T }" && x != "struct{main.T}" {
- panic(x)
- }
-
- // fmt.
- const message = "Hello, World!"
- if fmt.Sprintf("%s, %s!", "Hello", "World") != message {
- panic("oops")
- }
-
- // Type assertion.
- type S struct {
- f int
- }
- var e empty = S{f: 42}
- switch v := e.(type) {
- case S:
- if v.f != 42 {
- panic(v.f)
- }
- default:
- panic(reflect.TypeOf(v))
- }
- if i, ok := e.(I); ok {
- panic(i)
- }
-
- // Switch.
- var x int
- switch x {
- case 1:
- panic(x)
- fallthrough
- case 2, 3:
- panic(x)
- default:
- // ok
- }
- // empty switch
- switch {
- }
- // empty switch
- switch {
- default:
- }
- // empty switch
- switch {
- default:
- fallthrough
- case false:
- }
-
- // string -> []rune conversion.
- use([]rune("foo"))
-
- // Calls of form x.f().
- type S2 struct {
- f func() int
- }
- S2{f: func() int { return 1 }}.f() // field is a func value
- T{}.f() // method call
- i.f() // interface method invocation
- (interface {
- f() int
- }(T{})).f() // anon interface method invocation
-
- // Map lookup.
- if v, ok := map[string]string{}["foo5"]; v != "" || ok {
- panic("oops")
- }
-
- // Regression test: implicit address-taken struct literal
- // inside literal map element.
- _ = map[int]*struct{}{0: {}}
-}
-
-type mybool bool
-
-func (mybool) f() {}
-
-func init() {
- type mybool bool
- var b mybool
- var i interface{} = b || b // result preserves types of operands
- _ = i.(mybool)
-
- i = false && b // result preserves type of "typed" operand
- _ = i.(mybool)
-
- i = b || true // result preserves type of "typed" operand
- _ = i.(mybool)
-}
-
-func init() {
- var x, y int
- var b mybool = x == y // x==y is an untyped bool
- b.f()
-}
-
-// Simple closures.
-func init() {
- b := 3
- f := func(a int) int {
- return a + b
- }
- b++
- if x := f(1); x != 5 { // 1+4 == 5
- panic(x)
- }
- b++
- if x := f(2); x != 7 { // 2+5 == 7
- panic(x)
- }
- if b := f(1) < 16 || f(2) < 17; !b {
- panic("oops")
- }
-}
-
-// Shifts.
-func init() {
- var i int64 = 1
- var u uint64 = 1 << 32
- if x := i << uint32(u); x != 1 {
- panic(x)
- }
- if x := i << uint64(u); x != 0 {
- panic(x)
- }
-}
-
-// Implicit conversion of delete() key operand.
-func init() {
- type I interface{}
- m := make(map[I]bool)
- m[1] = true
- m[I(2)] = true
- if len(m) != 2 {
- panic(m)
- }
- delete(m, I(1))
- delete(m, 2)
- if len(m) != 0 {
- panic(m)
- }
-}
-
-// An I->I conversion always succeeds.
-func init() {
- var x I
- if I(x) != I(nil) {
- panic("I->I conversion failed")
- }
-}
-
-// An I->I type-assert fails iff the value is nil.
-func init() {
- defer func() {
- r := fmt.Sprint(recover())
- // Exact error varies by toolchain.
- if r != "runtime error: interface conversion: interface is nil, not main.I" &&
- r != "interface conversion: interface is nil, not main.I" {
- panic("I->I type assertion succeeded for nil value")
- }
- }()
- var x I
- _ = x.(I)
-}
-
-//////////////////////////////////////////////////////////////////////
-// Variadic bridge methods and interface thunks.
-
-type VT int
-
-var vcount = 0
-
-func (VT) f(x int, y ...string) {
- vcount++
- if x != 1 {
- panic(x)
- }
- if len(y) != 2 || y[0] != "foo" || y[1] != "bar" {
- panic(y)
- }
-}
-
-type VS struct {
- VT
-}
-
-type VI interface {
- f(x int, y ...string)
-}
-
-func init() {
- foobar := []string{"foo", "bar"}
- var s VS
- s.f(1, "foo", "bar")
- s.f(1, foobar...)
- if vcount != 2 {
- panic("s.f not called twice")
- }
-
- fn := VI.f
- fn(s, 1, "foo", "bar")
- fn(s, 1, foobar...)
- if vcount != 4 {
- panic("I.f not called twice")
- }
-}
-
-// Multiple labels on same statement.
-func multipleLabels() {
- var trace []int
- i := 0
-one:
-two:
- for ; i < 3; i++ {
- trace = append(trace, i)
- switch i {
- case 0:
- continue two
- case 1:
- i++
- goto one
- case 2:
- break two
- }
- }
- if x := fmt.Sprint(trace); x != "[0 1 2]" {
- panic(x)
- }
-}
-
-func init() {
- multipleLabels()
-}
-
-func init() {
- // Struct equivalence ignores blank fields.
- type s struct{ x, _, z int }
- s1 := s{x: 1, z: 3}
- s2 := s{x: 1, z: 3}
- if s1 != s2 {
- panic("not equal")
- }
-}
-
-func init() {
- // A slice var can be compared to const []T nil.
- var i interface{} = []string{"foo"}
- var j interface{} = []string(nil)
- if i.([]string) == nil {
- panic("expected i non-nil")
- }
- if j.([]string) != nil {
- panic("expected j nil")
- }
- // But two slices cannot be compared, even if one is nil.
- defer func() {
- r := fmt.Sprint(recover())
- if r != "runtime error: comparing uncomparable type []string" {
- panic("want panic from slice comparison, got " + r)
- }
- }()
- _ = i == j // interface comparison recurses on types
-}
-
-func init() {
- // Regression test for SSA renaming bug.
- var ints []int
- for range "foo" {
- var x int
- x++
- ints = append(ints, x)
- }
- if fmt.Sprint(ints) != "[1 1 1]" {
- panic(ints)
- }
-}
-
-// Regression test for issue 6949:
-// []byte("foo") is not a constant since it allocates memory.
-func init() {
- var r string
- for i, b := range "ABC" {
- x := []byte("abc")
- x[i] = byte(b)
- r += string(x)
- }
- if r != "AbcaBcabC" {
- panic(r)
- }
-}
-
-// Test of 3-operand x[lo:hi:max] slice.
-func init() {
- s := []int{0, 1, 2, 3}
- lenCapLoHi := func(x []int) [4]int { return [4]int{len(x), cap(x), x[0], x[len(x)-1]} }
- if got := lenCapLoHi(s[1:3]); got != [4]int{2, 3, 1, 2} {
- panic(got)
- }
- if got := lenCapLoHi(s[1:3:3]); got != [4]int{2, 2, 1, 2} {
- panic(got)
- }
- max := 3
- if "a"[0] == 'a' {
- max = 2 // max is non-constant, even in SSA form
- }
- if got := lenCapLoHi(s[1:2:max]); got != [4]int{1, 1, 1, 1} {
- panic(got)
- }
-}
-
-var one = 1 // not a constant
-
-// Test makeslice.
-func init() {
- check := func(s []string, wantLen, wantCap int) {
- if len(s) != wantLen {
- panic(len(s))
- }
- if cap(s) != wantCap {
- panic(cap(s))
- }
- }
- // SSA form:
- check(make([]string, 10), 10, 10) // new([10]string)[:10]
- check(make([]string, one), 1, 1) // make([]string, one, one)
- check(make([]string, 0, 10), 0, 10) // new([10]string)[:0]
- check(make([]string, 0, one), 0, 1) // make([]string, 0, one)
- check(make([]string, one, 10), 1, 10) // new([10]string)[:one]
- check(make([]string, one, one), 1, 1) // make([]string, one, one)
-}
-
-// Test that a nice error is issued by indirection wrappers.
-func init() {
- var ptr *T
- var i I = ptr
-
- defer func() {
- r := fmt.Sprint(recover())
- // Exact error varies by toolchain:
- if r != "runtime error: value method (main.T).f called using nil *main.T pointer" &&
- r != "value method main.T.f called using nil *T pointer" {
- panic("want panic from call with nil receiver, got " + r)
- }
- }()
- i.f()
- panic("unreachable")
-}
-
-// Regression test for a subtle bug in which copying values would causes
-// subcomponents of aggregate variables to change address, breaking
-// aliases.
-func init() {
- type T struct{ f int }
- var x T
- p := &x.f
- x = T{}
- *p = 1
- if x.f != 1 {
- panic("lost store")
- }
- if p != &x.f {
- panic("unstable address")
- }
-}
diff --git a/vendor/golang.org/x/tools/go/ssa/interp/testdata/defer.go b/vendor/golang.org/x/tools/go/ssa/interp/testdata/defer.go
deleted file mode 100644
index f5bae6c..0000000
--- a/vendor/golang.org/x/tools/go/ssa/interp/testdata/defer.go
+++ /dev/null
@@ -1,53 +0,0 @@
-package main
-
-// Tests of defer. (Deferred recover() belongs is recover.go.)
-
-import "fmt"
-
-func deferMutatesResults(noArgReturn bool) (a, b int) {
- defer func() {
- if a != 1 || b != 2 {
- panic(fmt.Sprint(a, b))
- }
- a, b = 3, 4
- }()
- if noArgReturn {
- a, b = 1, 2
- return
- }
- return 1, 2
-}
-
-func init() {
- a, b := deferMutatesResults(true)
- if a != 3 || b != 4 {
- panic(fmt.Sprint(a, b))
- }
- a, b = deferMutatesResults(false)
- if a != 3 || b != 4 {
- panic(fmt.Sprint(a, b))
- }
-}
-
-// We concatenate init blocks to make a single function, but we must
-// run defers at the end of each block, not the combined function.
-var deferCount = 0
-
-func init() {
- deferCount = 1
- defer func() {
- deferCount++
- }()
- // defer runs HERE
-}
-
-func init() {
- // Strictly speaking the spec says deferCount may be 0 or 2
- // since the relative order of init blocks is unspecified.
- if deferCount != 2 {
- panic(deferCount) // defer call has not run!
- }
-}
-
-func main() {
-}
diff --git a/vendor/golang.org/x/tools/go/ssa/interp/testdata/fieldprom.go b/vendor/golang.org/x/tools/go/ssa/interp/testdata/fieldprom.go
deleted file mode 100644
index fc276dd..0000000
--- a/vendor/golang.org/x/tools/go/ssa/interp/testdata/fieldprom.go
+++ /dev/null
@@ -1,114 +0,0 @@
-package main
-
-// Tests of field promotion logic.
-
-type A struct {
- x int
- y *int
-}
-
-type B struct {
- p int
- q *int
-}
-
-type C struct {
- A
- *B
-}
-
-type D struct {
- a int
- C
-}
-
-func assert(cond bool) {
- if !cond {
- panic("failed")
- }
-}
-
-func f1(c C) {
- assert(c.x == c.A.x)
- assert(c.y == c.A.y)
- assert(&c.x == &c.A.x)
- assert(&c.y == &c.A.y)
-
- assert(c.p == c.B.p)
- assert(c.q == c.B.q)
- assert(&c.p == &c.B.p)
- assert(&c.q == &c.B.q)
-
- c.x = 1
- *c.y = 1
- c.p = 1
- *c.q = 1
-}
-
-func f2(c *C) {
- assert(c.x == c.A.x)
- assert(c.y == c.A.y)
- assert(&c.x == &c.A.x)
- assert(&c.y == &c.A.y)
-
- assert(c.p == c.B.p)
- assert(c.q == c.B.q)
- assert(&c.p == &c.B.p)
- assert(&c.q == &c.B.q)
-
- c.x = 1
- *c.y = 1
- c.p = 1
- *c.q = 1
-}
-
-func f3(d D) {
- assert(d.x == d.C.A.x)
- assert(d.y == d.C.A.y)
- assert(&d.x == &d.C.A.x)
- assert(&d.y == &d.C.A.y)
-
- assert(d.p == d.C.B.p)
- assert(d.q == d.C.B.q)
- assert(&d.p == &d.C.B.p)
- assert(&d.q == &d.C.B.q)
-
- d.x = 1
- *d.y = 1
- d.p = 1
- *d.q = 1
-}
-
-func f4(d *D) {
- assert(d.x == d.C.A.x)
- assert(d.y == d.C.A.y)
- assert(&d.x == &d.C.A.x)
- assert(&d.y == &d.C.A.y)
-
- assert(d.p == d.C.B.p)
- assert(d.q == d.C.B.q)
- assert(&d.p == &d.C.B.p)
- assert(&d.q == &d.C.B.q)
-
- d.x = 1
- *d.y = 1
- d.p = 1
- *d.q = 1
-}
-
-func main() {
- y := 123
- c := C{
- A{x: 42, y: &y},
- &B{p: 42, q: &y},
- }
-
- assert(&c.x == &c.A.x)
-
- f1(c)
- f2(&c)
-
- d := D{C: c}
- f3(d)
- f4(&d)
-}
diff --git a/vendor/golang.org/x/tools/go/ssa/interp/testdata/ifaceconv.go b/vendor/golang.org/x/tools/go/ssa/interp/testdata/ifaceconv.go
deleted file mode 100644
index 96fc105..0000000
--- a/vendor/golang.org/x/tools/go/ssa/interp/testdata/ifaceconv.go
+++ /dev/null
@@ -1,83 +0,0 @@
-package main
-
-// Tests of interface conversions and type assertions.
-
-type I0 interface {
-}
-type I1 interface {
- f()
-}
-type I2 interface {
- f()
- g()
-}
-
-type C0 struct{}
-type C1 struct{}
-
-func (C1) f() {}
-
-type C2 struct{}
-
-func (C2) f() {}
-func (C2) g() {}
-
-func main() {
- var i0 I0
- var i1 I1
- var i2 I2
-
- // Nil always causes a type assertion to fail, even to the
- // same type.
- if _, ok := i0.(I0); ok {
- panic("nil i0.(I0) succeeded")
- }
- if _, ok := i1.(I1); ok {
- panic("nil i1.(I1) succeeded")
- }
- if _, ok := i2.(I2); ok {
- panic("nil i2.(I2) succeeded")
- }
-
- // Conversions can't fail, even with nil.
- _ = I0(i0)
-
- _ = I0(i1)
- _ = I1(i1)
-
- _ = I0(i2)
- _ = I1(i2)
- _ = I2(i2)
-
- // Non-nil type assertions pass or fail based on the concrete type.
- i1 = C1{}
- if _, ok := i1.(I0); !ok {
- panic("C1 i1.(I0) failed")
- }
- if _, ok := i1.(I1); !ok {
- panic("C1 i1.(I1) failed")
- }
- if _, ok := i1.(I2); ok {
- panic("C1 i1.(I2) succeeded")
- }
-
- i1 = C2{}
- if _, ok := i1.(I0); !ok {
- panic("C2 i1.(I0) failed")
- }
- if _, ok := i1.(I1); !ok {
- panic("C2 i1.(I1) failed")
- }
- if _, ok := i1.(I2); !ok {
- panic("C2 i1.(I2) failed")
- }
-
- // Conversions can't fail.
- i1 = C1{}
- if I0(i1) == nil {
- panic("C1 I0(i1) was nil")
- }
- if I1(i1) == nil {
- panic("C1 I1(i1) was nil")
- }
-}
diff --git a/vendor/golang.org/x/tools/go/ssa/interp/testdata/ifaceprom.go b/vendor/golang.org/x/tools/go/ssa/interp/testdata/ifaceprom.go
deleted file mode 100644
index 414dc73..0000000
--- a/vendor/golang.org/x/tools/go/ssa/interp/testdata/ifaceprom.go
+++ /dev/null
@@ -1,58 +0,0 @@
-package main
-
-// Test of promotion of methods of an interface embedded within a
-// struct. In particular, this test exercises that the correct
-// method is called.
-
-type I interface {
- one() int
- two() string
-}
-
-type S struct {
- I
-}
-
-type impl struct{}
-
-func (impl) one() int {
- return 1
-}
-
-func (impl) two() string {
- return "two"
-}
-
-func main() {
- var s S
- s.I = impl{}
- if one := s.I.one(); one != 1 {
- panic(one)
- }
- if one := s.one(); one != 1 {
- panic(one)
- }
- closOne := s.I.one
- if one := closOne(); one != 1 {
- panic(one)
- }
- closOne = s.one
- if one := closOne(); one != 1 {
- panic(one)
- }
-
- if two := s.I.two(); two != "two" {
- panic(two)
- }
- if two := s.two(); two != "two" {
- panic(two)
- }
- closTwo := s.I.two
- if two := closTwo(); two != "two" {
- panic(two)
- }
- closTwo = s.two
- if two := closTwo(); two != "two" {
- panic(two)
- }
-}
diff --git a/vendor/golang.org/x/tools/go/ssa/interp/testdata/initorder.go b/vendor/golang.org/x/tools/go/ssa/interp/testdata/initorder.go
deleted file mode 100644
index 0f26bed..0000000
--- a/vendor/golang.org/x/tools/go/ssa/interp/testdata/initorder.go
+++ /dev/null
@@ -1,67 +0,0 @@
-package main
-
-import "fmt"
-
-// Test of initialization order of package-level vars.
-
-var counter int
-
-func next() int {
- c := counter
- counter++
- return c
-}
-
-func next2() (x int, y int) {
- x = next()
- y = next()
- return
-}
-
-func makeOrder() int {
- _, _, _, _ = f, b, d, e
- return 0
-}
-
-func main() {
- // Initialization constraints:
- // - {f,b,c/d,e} < order (ref graph traversal)
- // - order < {a} (lexical order)
- // - b < c/d < e < f (lexical order)
- // Solution: a b c/d e f
- abcdef := [6]int{a, b, c, d, e, f}
- if abcdef != [6]int{0, 1, 2, 3, 4, 5} {
- panic(abcdef)
- }
-}
-
-var order = makeOrder()
-
-var a, b = next(), next()
-var c, d = next2()
-var e, f = next(), next()
-
-// ------------------------------------------------------------------------
-
-var order2 []string
-
-func create(x int, name string) int {
- order2 = append(order2, name)
- return x
-}
-
-var C = create(B+1, "C")
-var A, B = create(1, "A"), create(2, "B")
-
-// Initialization order of package-level value specs.
-func init() {
- x := fmt.Sprint(order2)
- // Result varies by toolchain. This is a spec bug.
- if x != "[B C A]" && // gc
- x != "[A B C]" { // go/types
- panic(x)
- }
- if C != 3 {
- panic(c)
- }
-}
diff --git a/vendor/golang.org/x/tools/go/ssa/interp/testdata/methprom.go b/vendor/golang.org/x/tools/go/ssa/interp/testdata/methprom.go
deleted file mode 100644
index e8e384c..0000000
--- a/vendor/golang.org/x/tools/go/ssa/interp/testdata/methprom.go
+++ /dev/null
@@ -1,93 +0,0 @@
-package main
-
-// Tests of method promotion logic.
-
-type A struct{ magic int }
-
-func (a A) x() {
- if a.magic != 1 {
- panic(a.magic)
- }
-}
-func (a *A) y() *A {
- return a
-}
-
-type B struct{ magic int }
-
-func (b B) p() {
- if b.magic != 2 {
- panic(b.magic)
- }
-}
-func (b *B) q() {
- if b != theC.B {
- panic("oops")
- }
-}
-
-type I interface {
- f()
-}
-
-type impl struct{ magic int }
-
-func (i impl) f() {
- if i.magic != 3 {
- panic("oops")
- }
-}
-
-type C struct {
- A
- *B
- I
-}
-
-func assert(cond bool) {
- if !cond {
- panic("failed")
- }
-}
-
-var theC = C{
- A: A{1},
- B: &B{2},
- I: impl{3},
-}
-
-func addr() *C {
- return &theC
-}
-
-func value() C {
- return theC
-}
-
-func main() {
- // address
- addr().x()
- if addr().y() != &theC.A {
- panic("oops")
- }
- addr().p()
- addr().q()
- addr().f()
-
- // addressable value
- var c C = value()
- c.x()
- if c.y() != &c.A {
- panic("oops")
- }
- c.p()
- c.q()
- c.f()
-
- // non-addressable value
- value().x()
- // value().y() // not in method set
- value().p()
- value().q()
- value().f()
-}
diff --git a/vendor/golang.org/x/tools/go/ssa/interp/testdata/mrvchain.go b/vendor/golang.org/x/tools/go/ssa/interp/testdata/mrvchain.go
deleted file mode 100644
index 70dfd02..0000000
--- a/vendor/golang.org/x/tools/go/ssa/interp/testdata/mrvchain.go
+++ /dev/null
@@ -1,75 +0,0 @@
-// Tests of call chaining f(g()) when g has multiple return values (MRVs).
-// See https://code.google.com/p/go/issues/detail?id=4573.
-
-package main
-
-func assert(actual, expected int) {
- if actual != expected {
- panic(actual)
- }
-}
-
-func g() (int, int) {
- return 5, 7
-}
-
-func g2() (float64, float64) {
- return 5, 7
-}
-
-func f1v(x int, v ...int) {
- assert(x, 5)
- assert(v[0], 7)
-}
-
-func f2(x, y int) {
- assert(x, 5)
- assert(y, 7)
-}
-
-func f2v(x, y int, v ...int) {
- assert(x, 5)
- assert(y, 7)
- assert(len(v), 0)
-}
-
-func complexArgs() (float64, float64) {
- return 5, 7
-}
-
-func appendArgs() ([]string, string) {
- return []string{"foo"}, "bar"
-}
-
-func h() (i interface{}, ok bool) {
- m := map[int]string{1: "hi"}
- i, ok = m[1] // string->interface{} conversion within multi-valued expression
- return
-}
-
-func h2() (i interface{}, ok bool) {
- ch := make(chan string, 1)
- ch <- "hi"
- i, ok = <-ch // string->interface{} conversion within multi-valued expression
- return
-}
-
-func main() {
- f1v(g())
- f2(g())
- f2v(g())
- if c := complex(complexArgs()); c != 5+7i {
- panic(c)
- }
- if s := append(appendArgs()); len(s) != 2 || s[0] != "foo" || s[1] != "bar" {
- panic(s)
- }
- i, ok := h()
- if !ok || i.(string) != "hi" {
- panic(i)
- }
- i, ok = h2()
- if !ok || i.(string) != "hi" {
- panic(i)
- }
-}
diff --git a/vendor/golang.org/x/tools/go/ssa/interp/testdata/range.go b/vendor/golang.org/x/tools/go/ssa/interp/testdata/range.go
deleted file mode 100644
index da8a421..0000000
--- a/vendor/golang.org/x/tools/go/ssa/interp/testdata/range.go
+++ /dev/null
@@ -1,55 +0,0 @@
-package main
-
-// Tests of range loops.
-
-import "fmt"
-
-// Range over string.
-func init() {
- if x := len("Hello, 世界"); x != 13 { // bytes
- panic(x)
- }
- var indices []int
- var runes []rune
- for i, r := range "Hello, 世界" {
- runes = append(runes, r)
- indices = append(indices, i)
- }
- if x := fmt.Sprint(runes); x != "[72 101 108 108 111 44 32 19990 30028]" {
- panic(x)
- }
- if x := fmt.Sprint(indices); x != "[0 1 2 3 4 5 6 7 10]" {
- panic(x)
- }
- s := ""
- for _, r := range runes {
- s = fmt.Sprintf("%s%c", s, r)
- }
- if s != "Hello, 世界" {
- panic(s)
- }
-
- var x int
- for range "Hello, 世界" {
- x++
- }
- if x != len(indices) {
- panic(x)
- }
-}
-
-// Regression test for range of pointer to named array type.
-func init() {
- type intarr [3]int
- ia := intarr{1, 2, 3}
- var count int
- for _, x := range &ia {
- count += x
- }
- if count != 6 {
- panic(count)
- }
-}
-
-func main() {
-}
diff --git a/vendor/golang.org/x/tools/go/ssa/interp/testdata/recover.go b/vendor/golang.org/x/tools/go/ssa/interp/testdata/recover.go
deleted file mode 100644
index b560052..0000000
--- a/vendor/golang.org/x/tools/go/ssa/interp/testdata/recover.go
+++ /dev/null
@@ -1,34 +0,0 @@
-package main
-
-// Tests of panic/recover.
-
-import "fmt"
-
-func fortyTwo() (r int) {
- r = 42
- // The next two statements simulate a 'return' statement.
- defer func() { recover() }()
- panic(nil)
-}
-
-func zero() int {
- defer func() { recover() }()
- panic(1)
-}
-
-func zeroEmpty() (int, string) {
- defer func() { recover() }()
- panic(1)
-}
-
-func main() {
- if r := fortyTwo(); r != 42 {
- panic(r)
- }
- if r := zero(); r != 0 {
- panic(r)
- }
- if r, s := zeroEmpty(); r != 0 || s != "" {
- panic(fmt.Sprint(r, s))
- }
-}
diff --git a/vendor/golang.org/x/tools/go/ssa/interp/testdata/reflect.go b/vendor/golang.org/x/tools/go/ssa/interp/testdata/reflect.go
deleted file mode 100644
index 6aa9a67..0000000
--- a/vendor/golang.org/x/tools/go/ssa/interp/testdata/reflect.go
+++ /dev/null
@@ -1,11 +0,0 @@
-package main
-
-import "reflect"
-
-func main() {
- // Regression test for issue 9462.
- got := reflect.SliceOf(reflect.TypeOf(byte(0))).String()
- if got != "[]uint8" && got != "[]byte" { // result varies by toolchain
- println("BUG: " + got)
- }
-}
diff --git a/vendor/golang.org/x/tools/go/ssa/interp/testdata/static.go b/vendor/golang.org/x/tools/go/ssa/interp/testdata/static.go
deleted file mode 100644
index b115513..0000000
--- a/vendor/golang.org/x/tools/go/ssa/interp/testdata/static.go
+++ /dev/null
@@ -1,58 +0,0 @@
-package main
-
-// Static tests of SSA builder (via the sanity checker).
-// Dynamic semantics are not exercised.
-
-func init() {
- // Regression test for issue 6806.
- ch := make(chan int)
- select {
- case n, _ := <-ch:
- _ = n
- default:
- // The default case disables the simplification of
- // select to a simple receive statement.
- }
-
- // value,ok-form receive where TypeOf(ok) is a named boolean.
- type mybool bool
- var x int
- var y mybool
- select {
- case x, y = <-ch:
- default:
- // The default case disables the simplification of
- // select to a simple receive statement.
- }
- _ = x
- _ = y
-}
-
-var a int
-
-// Regression test for issue 7840 (covered by SSA sanity checker).
-func bug7840() bool {
- // This creates a single-predecessor block with a φ-node.
- return false && a == 0 && a == 0
-}
-
-// A blocking select (sans "default:") cannot fall through.
-// Regression test for issue 7022.
-func bug7022() int {
- var c1, c2 chan int
- select {
- case <-c1:
- return 123
- case <-c2:
- return 456
- }
-}
-
-// Parens should not prevent intrinsic treatment of built-ins.
-// (Regression test for a crash.)
-func init() {
- _ = (new)(int)
- _ = (make)([]int, 0)
-}
-
-func main() {}
diff --git a/vendor/golang.org/x/tools/go/ssa/interp/value.go b/vendor/golang.org/x/tools/go/ssa/interp/value.go
deleted file mode 100644
index 4faa7b8..0000000
--- a/vendor/golang.org/x/tools/go/ssa/interp/value.go
+++ /dev/null
@@ -1,497 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package interp
-
-// Values
-//
-// All interpreter values are "boxed" in the empty interface, value.
-// The range of possible dynamic types within value are:
-//
-// - bool
-// - numbers (all built-in int/float/complex types are distinguished)
-// - string
-// - map[value]value --- maps for which usesBuiltinMap(keyType)
-// *hashmap --- maps for which !usesBuiltinMap(keyType)
-// - chan value
-// - []value --- slices
-// - iface --- interfaces.
-// - structure --- structs. Fields are ordered and accessed by numeric indices.
-// - array --- arrays.
-// - *value --- pointers. Careful: *value is a distinct type from *array etc.
-// - *ssa.Function \
-// *ssa.Builtin } --- functions. A nil 'func' is always of type *ssa.Function.
-// *closure /
-// - tuple --- as returned by Return, Next, "value,ok" modes, etc.
-// - iter --- iterators from 'range' over map or string.
-// - bad --- a poison pill for locals that have gone out of scope.
-// - rtype -- the interpreter's concrete implementation of reflect.Type
-//
-// Note that nil is not on this list.
-//
-// Pay close attention to whether or not the dynamic type is a pointer.
-// The compiler cannot help you since value is an empty interface.
-
-import (
- "bytes"
- "fmt"
- "go/types"
- "io"
- "reflect"
- "strings"
- "sync"
- "unsafe"
-
- "golang.org/x/tools/go/ssa"
- "golang.org/x/tools/go/types/typeutil"
-)
-
-type value interface{}
-
-type tuple []value
-
-type array []value
-
-type iface struct {
- t types.Type // never an "untyped" type
- v value
-}
-
-type structure []value
-
-// For map, array, *array, slice, string or channel.
-type iter interface {
- // next returns a Tuple (key, value, ok).
- // key and value are unaliased, e.g. copies of the sequence element.
- next() tuple
-}
-
-type closure struct {
- Fn *ssa.Function
- Env []value
-}
-
-type bad struct{}
-
-type rtype struct {
- t types.Type
-}
-
-// Hash functions and equivalence relation:
-
-// hashString computes the FNV hash of s.
-func hashString(s string) int {
- var h uint32
- for i := 0; i < len(s); i++ {
- h ^= uint32(s[i])
- h *= 16777619
- }
- return int(h)
-}
-
-var (
- mu sync.Mutex
- hasher = typeutil.MakeHasher()
-)
-
-// hashType returns a hash for t such that
-// types.Identical(x, y) => hashType(x) == hashType(y).
-func hashType(t types.Type) int {
- mu.Lock()
- h := int(hasher.Hash(t))
- mu.Unlock()
- return h
-}
-
-// usesBuiltinMap returns true if the built-in hash function and
-// equivalence relation for type t are consistent with those of the
-// interpreter's representation of type t. Such types are: all basic
-// types (bool, numbers, string), pointers and channels.
-//
-// usesBuiltinMap returns false for types that require a custom map
-// implementation: interfaces, arrays and structs.
-//
-// Panic ensues if t is an invalid map key type: function, map or slice.
-func usesBuiltinMap(t types.Type) bool {
- switch t := t.(type) {
- case *types.Basic, *types.Chan, *types.Pointer:
- return true
- case *types.Named:
- return usesBuiltinMap(t.Underlying())
- case *types.Interface, *types.Array, *types.Struct:
- return false
- }
- panic(fmt.Sprintf("invalid map key type: %T", t))
-}
-
-func (x array) eq(t types.Type, _y interface{}) bool {
- y := _y.(array)
- tElt := t.Underlying().(*types.Array).Elem()
- for i, xi := range x {
- if !equals(tElt, xi, y[i]) {
- return false
- }
- }
- return true
-}
-
-func (x array) hash(t types.Type) int {
- h := 0
- tElt := t.Underlying().(*types.Array).Elem()
- for _, xi := range x {
- h += hash(tElt, xi)
- }
- return h
-}
-
-func (x structure) eq(t types.Type, _y interface{}) bool {
- y := _y.(structure)
- tStruct := t.Underlying().(*types.Struct)
- for i, n := 0, tStruct.NumFields(); i < n; i++ {
- if f := tStruct.Field(i); !f.Anonymous() {
- if !equals(f.Type(), x[i], y[i]) {
- return false
- }
- }
- }
- return true
-}
-
-func (x structure) hash(t types.Type) int {
- tStruct := t.Underlying().(*types.Struct)
- h := 0
- for i, n := 0, tStruct.NumFields(); i < n; i++ {
- if f := tStruct.Field(i); !f.Anonymous() {
- h += hash(f.Type(), x[i])
- }
- }
- return h
-}
-
-// nil-tolerant variant of types.Identical.
-func sameType(x, y types.Type) bool {
- if x == nil {
- return y == nil
- }
- return y != nil && types.Identical(x, y)
-}
-
-func (x iface) eq(t types.Type, _y interface{}) bool {
- y := _y.(iface)
- return sameType(x.t, y.t) && (x.t == nil || equals(x.t, x.v, y.v))
-}
-
-func (x iface) hash(_ types.Type) int {
- return hashType(x.t)*8581 + hash(x.t, x.v)
-}
-
-func (x rtype) hash(_ types.Type) int {
- return hashType(x.t)
-}
-
-func (x rtype) eq(_ types.Type, y interface{}) bool {
- return types.Identical(x.t, y.(rtype).t)
-}
-
-// equals returns true iff x and y are equal according to Go's
-// linguistic equivalence relation for type t.
-// In a well-typed program, the dynamic types of x and y are
-// guaranteed equal.
-func equals(t types.Type, x, y value) bool {
- switch x := x.(type) {
- case bool:
- return x == y.(bool)
- case int:
- return x == y.(int)
- case int8:
- return x == y.(int8)
- case int16:
- return x == y.(int16)
- case int32:
- return x == y.(int32)
- case int64:
- return x == y.(int64)
- case uint:
- return x == y.(uint)
- case uint8:
- return x == y.(uint8)
- case uint16:
- return x == y.(uint16)
- case uint32:
- return x == y.(uint32)
- case uint64:
- return x == y.(uint64)
- case uintptr:
- return x == y.(uintptr)
- case float32:
- return x == y.(float32)
- case float64:
- return x == y.(float64)
- case complex64:
- return x == y.(complex64)
- case complex128:
- return x == y.(complex128)
- case string:
- return x == y.(string)
- case *value:
- return x == y.(*value)
- case chan value:
- return x == y.(chan value)
- case structure:
- return x.eq(t, y)
- case array:
- return x.eq(t, y)
- case iface:
- return x.eq(t, y)
- case rtype:
- return x.eq(t, y)
- }
-
- // Since map, func and slice don't support comparison, this
- // case is only reachable if one of x or y is literally nil
- // (handled in eqnil) or via interface{} values.
- panic(fmt.Sprintf("comparing uncomparable type %s", t))
-}
-
-// Returns an integer hash of x such that equals(x, y) => hash(x) == hash(y).
-func hash(t types.Type, x value) int {
- switch x := x.(type) {
- case bool:
- if x {
- return 1
- }
- return 0
- case int:
- return x
- case int8:
- return int(x)
- case int16:
- return int(x)
- case int32:
- return int(x)
- case int64:
- return int(x)
- case uint:
- return int(x)
- case uint8:
- return int(x)
- case uint16:
- return int(x)
- case uint32:
- return int(x)
- case uint64:
- return int(x)
- case uintptr:
- return int(x)
- case float32:
- return int(x)
- case float64:
- return int(x)
- case complex64:
- return int(real(x))
- case complex128:
- return int(real(x))
- case string:
- return hashString(x)
- case *value:
- return int(uintptr(unsafe.Pointer(x)))
- case chan value:
- return int(uintptr(reflect.ValueOf(x).Pointer()))
- case structure:
- return x.hash(t)
- case array:
- return x.hash(t)
- case iface:
- return x.hash(t)
- case rtype:
- return x.hash(t)
- }
- panic(fmt.Sprintf("%T is unhashable", x))
-}
-
-// reflect.Value struct values don't have a fixed shape, since the
-// payload can be a scalar or an aggregate depending on the instance.
-// So store (and load) can't simply use recursion over the shape of the
-// rhs value, or the lhs, to copy the value; we need the static type
-// information. (We can't make reflect.Value a new basic data type
-// because its "structness" is exposed to Go programs.)
-
-// load returns the value of type T in *addr.
-func load(T types.Type, addr *value) value {
- switch T := T.Underlying().(type) {
- case *types.Struct:
- v := (*addr).(structure)
- a := make(structure, len(v))
- for i := range a {
- a[i] = load(T.Field(i).Type(), &v[i])
- }
- return a
- case *types.Array:
- v := (*addr).(array)
- a := make(array, len(v))
- for i := range a {
- a[i] = load(T.Elem(), &v[i])
- }
- return a
- default:
- return *addr
- }
-}
-
-// store stores value v of type T into *addr.
-func store(T types.Type, addr *value, v value) {
- switch T := T.Underlying().(type) {
- case *types.Struct:
- lhs := (*addr).(structure)
- rhs := v.(structure)
- for i := range lhs {
- store(T.Field(i).Type(), &lhs[i], rhs[i])
- }
- case *types.Array:
- lhs := (*addr).(array)
- rhs := v.(array)
- for i := range lhs {
- store(T.Elem(), &lhs[i], rhs[i])
- }
- default:
- *addr = v
- }
-}
-
-// Prints in the style of built-in println.
-// (More or less; in gc println is actually a compiler intrinsic and
-// can distinguish println(1) from println(interface{}(1)).)
-func writeValue(buf *bytes.Buffer, v value) {
- switch v := v.(type) {
- case nil, bool, int, int8, int16, int32, int64, uint, uint8, uint16, uint32, uint64, uintptr, float32, float64, complex64, complex128, string:
- fmt.Fprintf(buf, "%v", v)
-
- case map[value]value:
- buf.WriteString("map[")
- sep := ""
- for k, e := range v {
- buf.WriteString(sep)
- sep = " "
- writeValue(buf, k)
- buf.WriteString(":")
- writeValue(buf, e)
- }
- buf.WriteString("]")
-
- case *hashmap:
- buf.WriteString("map[")
- sep := " "
- for _, e := range v.entries() {
- for e != nil {
- buf.WriteString(sep)
- sep = " "
- writeValue(buf, e.key)
- buf.WriteString(":")
- writeValue(buf, e.value)
- e = e.next
- }
- }
- buf.WriteString("]")
-
- case chan value:
- fmt.Fprintf(buf, "%v", v) // (an address)
-
- case *value:
- if v == nil {
- buf.WriteString("")
- } else {
- fmt.Fprintf(buf, "%p", v)
- }
-
- case iface:
- fmt.Fprintf(buf, "(%s, ", v.t)
- writeValue(buf, v.v)
- buf.WriteString(")")
-
- case structure:
- buf.WriteString("{")
- for i, e := range v {
- if i > 0 {
- buf.WriteString(" ")
- }
- writeValue(buf, e)
- }
- buf.WriteString("}")
-
- case array:
- buf.WriteString("[")
- for i, e := range v {
- if i > 0 {
- buf.WriteString(" ")
- }
- writeValue(buf, e)
- }
- buf.WriteString("]")
-
- case []value:
- buf.WriteString("[")
- for i, e := range v {
- if i > 0 {
- buf.WriteString(" ")
- }
- writeValue(buf, e)
- }
- buf.WriteString("]")
-
- case *ssa.Function, *ssa.Builtin, *closure:
- fmt.Fprintf(buf, "%p", v) // (an address)
-
- case rtype:
- buf.WriteString(v.t.String())
-
- case tuple:
- // Unreachable in well-formed Go programs
- buf.WriteString("(")
- for i, e := range v {
- if i > 0 {
- buf.WriteString(", ")
- }
- writeValue(buf, e)
- }
- buf.WriteString(")")
-
- default:
- fmt.Fprintf(buf, "<%T>", v)
- }
-}
-
-// Implements printing of Go values in the style of built-in println.
-func toString(v value) string {
- var b bytes.Buffer
- writeValue(&b, v)
- return b.String()
-}
-
-// ------------------------------------------------------------------------
-// Iterators
-
-type stringIter struct {
- *strings.Reader
- i int
-}
-
-func (it *stringIter) next() tuple {
- okv := make(tuple, 3)
- ch, n, err := it.ReadRune()
- ok := err != io.EOF
- okv[0] = ok
- if ok {
- okv[1] = it.i
- okv[2] = ch
- }
- it.i += n
- return okv
-}
-
-type mapIter chan [2]value
-
-func (it mapIter) next() tuple {
- kv, ok := <-it
- return tuple{ok, kv[0], kv[1]}
-}
diff --git a/vendor/golang.org/x/tools/go/ssa/lift.go b/vendor/golang.org/x/tools/go/ssa/lift.go
deleted file mode 100644
index 048e9b0..0000000
--- a/vendor/golang.org/x/tools/go/ssa/lift.go
+++ /dev/null
@@ -1,653 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package ssa
-
-// This file defines the lifting pass which tries to "lift" Alloc
-// cells (new/local variables) into SSA registers, replacing loads
-// with the dominating stored value, eliminating loads and stores, and
-// inserting φ-nodes as needed.
-
-// Cited papers and resources:
-//
-// Ron Cytron et al. 1991. Efficiently computing SSA form...
-// http://doi.acm.org/10.1145/115372.115320
-//
-// Cooper, Harvey, Kennedy. 2001. A Simple, Fast Dominance Algorithm.
-// Software Practice and Experience 2001, 4:1-10.
-// http://www.hipersoft.rice.edu/grads/publications/dom14.pdf
-//
-// Daniel Berlin, llvmdev mailing list, 2012.
-// http://lists.cs.uiuc.edu/pipermail/llvmdev/2012-January/046638.html
-// (Be sure to expand the whole thread.)
-
-// TODO(adonovan): opt: there are many optimizations worth evaluating, and
-// the conventional wisdom for SSA construction is that a simple
-// algorithm well engineered often beats those of better asymptotic
-// complexity on all but the most egregious inputs.
-//
-// Danny Berlin suggests that the Cooper et al. algorithm for
-// computing the dominance frontier is superior to Cytron et al.
-// Furthermore he recommends that rather than computing the DF for the
-// whole function then renaming all alloc cells, it may be cheaper to
-// compute the DF for each alloc cell separately and throw it away.
-//
-// Consider exploiting liveness information to avoid creating dead
-// φ-nodes which we then immediately remove.
-//
-// Also see many other "TODO: opt" suggestions in the code.
-
-import (
- "fmt"
- "go/token"
- "go/types"
- "math/big"
- "os"
-)
-
-// If true, show diagnostic information at each step of lifting.
-// Very verbose.
-const debugLifting = false
-
-// domFrontier maps each block to the set of blocks in its dominance
-// frontier. The outer slice is conceptually a map keyed by
-// Block.Index. The inner slice is conceptually a set, possibly
-// containing duplicates.
-//
-// TODO(adonovan): opt: measure impact of dups; consider a packed bit
-// representation, e.g. big.Int, and bitwise parallel operations for
-// the union step in the Children loop.
-//
-// domFrontier's methods mutate the slice's elements but not its
-// length, so their receivers needn't be pointers.
-//
-type domFrontier [][]*BasicBlock
-
-func (df domFrontier) add(u, v *BasicBlock) {
- p := &df[u.Index]
- *p = append(*p, v)
-}
-
-// build builds the dominance frontier df for the dominator (sub)tree
-// rooted at u, using the Cytron et al. algorithm.
-//
-// TODO(adonovan): opt: consider Berlin approach, computing pruned SSA
-// by pruning the entire IDF computation, rather than merely pruning
-// the DF -> IDF step.
-func (df domFrontier) build(u *BasicBlock) {
- // Encounter each node u in postorder of dom tree.
- for _, child := range u.dom.children {
- df.build(child)
- }
- for _, vb := range u.Succs {
- if v := vb.dom; v.idom != u {
- df.add(u, vb)
- }
- }
- for _, w := range u.dom.children {
- for _, vb := range df[w.Index] {
- // TODO(adonovan): opt: use word-parallel bitwise union.
- if v := vb.dom; v.idom != u {
- df.add(u, vb)
- }
- }
- }
-}
-
-func buildDomFrontier(fn *Function) domFrontier {
- df := make(domFrontier, len(fn.Blocks))
- df.build(fn.Blocks[0])
- if fn.Recover != nil {
- df.build(fn.Recover)
- }
- return df
-}
-
-func removeInstr(refs []Instruction, instr Instruction) []Instruction {
- i := 0
- for _, ref := range refs {
- if ref == instr {
- continue
- }
- refs[i] = ref
- i++
- }
- for j := i; j != len(refs); j++ {
- refs[j] = nil // aid GC
- }
- return refs[:i]
-}
-
-// lift replaces local and new Allocs accessed only with
-// load/store by SSA registers, inserting φ-nodes where necessary.
-// The result is a program in classical pruned SSA form.
-//
-// Preconditions:
-// - fn has no dead blocks (blockopt has run).
-// - Def/use info (Operands and Referrers) is up-to-date.
-// - The dominator tree is up-to-date.
-//
-func lift(fn *Function) {
- // TODO(adonovan): opt: lots of little optimizations may be
- // worthwhile here, especially if they cause us to avoid
- // buildDomFrontier. For example:
- //
- // - Alloc never loaded? Eliminate.
- // - Alloc never stored? Replace all loads with a zero constant.
- // - Alloc stored once? Replace loads with dominating store;
- // don't forget that an Alloc is itself an effective store
- // of zero.
- // - Alloc used only within a single block?
- // Use degenerate algorithm avoiding φ-nodes.
- // - Consider synergy with scalar replacement of aggregates (SRA).
- // e.g. *(&x.f) where x is an Alloc.
- // Perhaps we'd get better results if we generated this as x.f
- // i.e. Field(x, .f) instead of Load(FieldIndex(x, .f)).
- // Unclear.
- //
- // But we will start with the simplest correct code.
- df := buildDomFrontier(fn)
-
- if debugLifting {
- title := false
- for i, blocks := range df {
- if blocks != nil {
- if !title {
- fmt.Fprintf(os.Stderr, "Dominance frontier of %s:\n", fn)
- title = true
- }
- fmt.Fprintf(os.Stderr, "\t%s: %s\n", fn.Blocks[i], blocks)
- }
- }
- }
-
- newPhis := make(newPhiMap)
-
- // During this pass we will replace some BasicBlock.Instrs
- // (allocs, loads and stores) with nil, keeping a count in
- // BasicBlock.gaps. At the end we will reset Instrs to the
- // concatenation of all non-dead newPhis and non-nil Instrs
- // for the block, reusing the original array if space permits.
-
- // While we're here, we also eliminate 'rundefers'
- // instructions in functions that contain no 'defer'
- // instructions.
- usesDefer := false
-
- // A counter used to generate ~unique ids for Phi nodes, as an
- // aid to debugging. We use large numbers to make them highly
- // visible. All nodes are renumbered later.
- fresh := 1000
-
- // Determine which allocs we can lift and number them densely.
- // The renaming phase uses this numbering for compact maps.
- numAllocs := 0
- for _, b := range fn.Blocks {
- b.gaps = 0
- b.rundefers = 0
- for _, instr := range b.Instrs {
- switch instr := instr.(type) {
- case *Alloc:
- index := -1
- if liftAlloc(df, instr, newPhis, &fresh) {
- index = numAllocs
- numAllocs++
- }
- instr.index = index
- case *Defer:
- usesDefer = true
- case *RunDefers:
- b.rundefers++
- }
- }
- }
-
- // renaming maps an alloc (keyed by index) to its replacement
- // value. Initially the renaming contains nil, signifying the
- // zero constant of the appropriate type; we construct the
- // Const lazily at most once on each path through the domtree.
- // TODO(adonovan): opt: cache per-function not per subtree.
- renaming := make([]Value, numAllocs)
-
- // Renaming.
- rename(fn.Blocks[0], renaming, newPhis)
-
- // Eliminate dead φ-nodes.
- removeDeadPhis(fn.Blocks, newPhis)
-
- // Prepend remaining live φ-nodes to each block.
- for _, b := range fn.Blocks {
- nps := newPhis[b]
- j := len(nps)
-
- rundefersToKill := b.rundefers
- if usesDefer {
- rundefersToKill = 0
- }
-
- if j+b.gaps+rundefersToKill == 0 {
- continue // fast path: no new phis or gaps
- }
-
- // Compact nps + non-nil Instrs into a new slice.
- // TODO(adonovan): opt: compact in situ (rightwards)
- // if Instrs has sufficient space or slack.
- dst := make([]Instruction, len(b.Instrs)+j-b.gaps-rundefersToKill)
- for i, np := range nps {
- dst[i] = np.phi
- }
- for _, instr := range b.Instrs {
- if instr == nil {
- continue
- }
- if !usesDefer {
- if _, ok := instr.(*RunDefers); ok {
- continue
- }
- }
- dst[j] = instr
- j++
- }
- b.Instrs = dst
- }
-
- // Remove any fn.Locals that were lifted.
- j := 0
- for _, l := range fn.Locals {
- if l.index < 0 {
- fn.Locals[j] = l
- j++
- }
- }
- // Nil out fn.Locals[j:] to aid GC.
- for i := j; i < len(fn.Locals); i++ {
- fn.Locals[i] = nil
- }
- fn.Locals = fn.Locals[:j]
-}
-
-// removeDeadPhis removes φ-nodes not transitively needed by a
-// non-Phi, non-DebugRef instruction.
-func removeDeadPhis(blocks []*BasicBlock, newPhis newPhiMap) {
- // First pass: find the set of "live" φ-nodes: those reachable
- // from some non-Phi instruction.
- //
- // We compute reachability in reverse, starting from each φ,
- // rather than forwards, starting from each live non-Phi
- // instruction, because this way visits much less of the
- // Value graph.
- livePhis := make(map[*Phi]bool)
- for _, npList := range newPhis {
- for _, np := range npList {
- phi := np.phi
- if !livePhis[phi] && phiHasDirectReferrer(phi) {
- markLivePhi(livePhis, phi)
- }
- }
- }
-
- // Existing φ-nodes due to && and || operators
- // are all considered live (see Go issue 19622).
- for _, b := range blocks {
- for _, phi := range b.phis() {
- markLivePhi(livePhis, phi.(*Phi))
- }
- }
-
- // Second pass: eliminate unused phis from newPhis.
- for block, npList := range newPhis {
- j := 0
- for _, np := range npList {
- if livePhis[np.phi] {
- npList[j] = np
- j++
- } else {
- // discard it, first removing it from referrers
- for _, val := range np.phi.Edges {
- if refs := val.Referrers(); refs != nil {
- *refs = removeInstr(*refs, np.phi)
- }
- }
- np.phi.block = nil
- }
- }
- newPhis[block] = npList[:j]
- }
-}
-
-// markLivePhi marks phi, and all φ-nodes transitively reachable via
-// its Operands, live.
-func markLivePhi(livePhis map[*Phi]bool, phi *Phi) {
- livePhis[phi] = true
- for _, rand := range phi.Operands(nil) {
- if q, ok := (*rand).(*Phi); ok {
- if !livePhis[q] {
- markLivePhi(livePhis, q)
- }
- }
- }
-}
-
-// phiHasDirectReferrer reports whether phi is directly referred to by
-// a non-Phi instruction. Such instructions are the
-// roots of the liveness traversal.
-func phiHasDirectReferrer(phi *Phi) bool {
- for _, instr := range *phi.Referrers() {
- if _, ok := instr.(*Phi); !ok {
- return true
- }
- }
- return false
-}
-
-type blockSet struct{ big.Int } // (inherit methods from Int)
-
-// add adds b to the set and returns true if the set changed.
-func (s *blockSet) add(b *BasicBlock) bool {
- i := b.Index
- if s.Bit(i) != 0 {
- return false
- }
- s.SetBit(&s.Int, i, 1)
- return true
-}
-
-// take removes an arbitrary element from a set s and
-// returns its index, or returns -1 if empty.
-func (s *blockSet) take() int {
- l := s.BitLen()
- for i := 0; i < l; i++ {
- if s.Bit(i) == 1 {
- s.SetBit(&s.Int, i, 0)
- return i
- }
- }
- return -1
-}
-
-// newPhi is a pair of a newly introduced φ-node and the lifted Alloc
-// it replaces.
-type newPhi struct {
- phi *Phi
- alloc *Alloc
-}
-
-// newPhiMap records for each basic block, the set of newPhis that
-// must be prepended to the block.
-type newPhiMap map[*BasicBlock][]newPhi
-
-// liftAlloc determines whether alloc can be lifted into registers,
-// and if so, it populates newPhis with all the φ-nodes it may require
-// and returns true.
-//
-// fresh is a source of fresh ids for phi nodes.
-//
-func liftAlloc(df domFrontier, alloc *Alloc, newPhis newPhiMap, fresh *int) bool {
- // Don't lift aggregates into registers, because we don't have
- // a way to express their zero-constants.
- switch deref(alloc.Type()).Underlying().(type) {
- case *types.Array, *types.Struct:
- return false
- }
-
- // Don't lift named return values in functions that defer
- // calls that may recover from panic.
- if fn := alloc.Parent(); fn.Recover != nil {
- for _, nr := range fn.namedResults {
- if nr == alloc {
- return false
- }
- }
- }
-
- // Compute defblocks, the set of blocks containing a
- // definition of the alloc cell.
- var defblocks blockSet
- for _, instr := range *alloc.Referrers() {
- // Bail out if we discover the alloc is not liftable;
- // the only operations permitted to use the alloc are
- // loads/stores into the cell, and DebugRef.
- switch instr := instr.(type) {
- case *Store:
- if instr.Val == alloc {
- return false // address used as value
- }
- if instr.Addr != alloc {
- panic("Alloc.Referrers is inconsistent")
- }
- defblocks.add(instr.Block())
- case *UnOp:
- if instr.Op != token.MUL {
- return false // not a load
- }
- if instr.X != alloc {
- panic("Alloc.Referrers is inconsistent")
- }
- case *DebugRef:
- // ok
- default:
- return false // some other instruction
- }
- }
- // The Alloc itself counts as a (zero) definition of the cell.
- defblocks.add(alloc.Block())
-
- if debugLifting {
- fmt.Fprintln(os.Stderr, "\tlifting ", alloc, alloc.Name())
- }
-
- fn := alloc.Parent()
-
- // Φ-insertion.
- //
- // What follows is the body of the main loop of the insert-φ
- // function described by Cytron et al, but instead of using
- // counter tricks, we just reset the 'hasAlready' and 'work'
- // sets each iteration. These are bitmaps so it's pretty cheap.
- //
- // TODO(adonovan): opt: recycle slice storage for W,
- // hasAlready, defBlocks across liftAlloc calls.
- var hasAlready blockSet
-
- // Initialize W and work to defblocks.
- var work blockSet = defblocks // blocks seen
- var W blockSet // blocks to do
- W.Set(&defblocks.Int)
-
- // Traverse iterated dominance frontier, inserting φ-nodes.
- for i := W.take(); i != -1; i = W.take() {
- u := fn.Blocks[i]
- for _, v := range df[u.Index] {
- if hasAlready.add(v) {
- // Create φ-node.
- // It will be prepended to v.Instrs later, if needed.
- phi := &Phi{
- Edges: make([]Value, len(v.Preds)),
- Comment: alloc.Comment,
- }
- // This is merely a debugging aid:
- phi.setNum(*fresh)
- *fresh++
-
- phi.pos = alloc.Pos()
- phi.setType(deref(alloc.Type()))
- phi.block = v
- if debugLifting {
- fmt.Fprintf(os.Stderr, "\tplace %s = %s at block %s\n", phi.Name(), phi, v)
- }
- newPhis[v] = append(newPhis[v], newPhi{phi, alloc})
-
- if work.add(v) {
- W.add(v)
- }
- }
- }
- }
-
- return true
-}
-
-// replaceAll replaces all intraprocedural uses of x with y,
-// updating x.Referrers and y.Referrers.
-// Precondition: x.Referrers() != nil, i.e. x must be local to some function.
-//
-func replaceAll(x, y Value) {
- var rands []*Value
- pxrefs := x.Referrers()
- pyrefs := y.Referrers()
- for _, instr := range *pxrefs {
- rands = instr.Operands(rands[:0]) // recycle storage
- for _, rand := range rands {
- if *rand != nil {
- if *rand == x {
- *rand = y
- }
- }
- }
- if pyrefs != nil {
- *pyrefs = append(*pyrefs, instr) // dups ok
- }
- }
- *pxrefs = nil // x is now unreferenced
-}
-
-// renamed returns the value to which alloc is being renamed,
-// constructing it lazily if it's the implicit zero initialization.
-//
-func renamed(renaming []Value, alloc *Alloc) Value {
- v := renaming[alloc.index]
- if v == nil {
- v = zeroConst(deref(alloc.Type()))
- renaming[alloc.index] = v
- }
- return v
-}
-
-// rename implements the (Cytron et al) SSA renaming algorithm, a
-// preorder traversal of the dominator tree replacing all loads of
-// Alloc cells with the value stored to that cell by the dominating
-// store instruction. For lifting, we need only consider loads,
-// stores and φ-nodes.
-//
-// renaming is a map from *Alloc (keyed by index number) to its
-// dominating stored value; newPhis[x] is the set of new φ-nodes to be
-// prepended to block x.
-//
-func rename(u *BasicBlock, renaming []Value, newPhis newPhiMap) {
- // Each φ-node becomes the new name for its associated Alloc.
- for _, np := range newPhis[u] {
- phi := np.phi
- alloc := np.alloc
- renaming[alloc.index] = phi
- }
-
- // Rename loads and stores of allocs.
- for i, instr := range u.Instrs {
- switch instr := instr.(type) {
- case *Alloc:
- if instr.index >= 0 { // store of zero to Alloc cell
- // Replace dominated loads by the zero value.
- renaming[instr.index] = nil
- if debugLifting {
- fmt.Fprintf(os.Stderr, "\tkill alloc %s\n", instr)
- }
- // Delete the Alloc.
- u.Instrs[i] = nil
- u.gaps++
- }
-
- case *Store:
- if alloc, ok := instr.Addr.(*Alloc); ok && alloc.index >= 0 { // store to Alloc cell
- // Replace dominated loads by the stored value.
- renaming[alloc.index] = instr.Val
- if debugLifting {
- fmt.Fprintf(os.Stderr, "\tkill store %s; new value: %s\n",
- instr, instr.Val.Name())
- }
- // Remove the store from the referrer list of the stored value.
- if refs := instr.Val.Referrers(); refs != nil {
- *refs = removeInstr(*refs, instr)
- }
- // Delete the Store.
- u.Instrs[i] = nil
- u.gaps++
- }
-
- case *UnOp:
- if instr.Op == token.MUL {
- if alloc, ok := instr.X.(*Alloc); ok && alloc.index >= 0 { // load of Alloc cell
- newval := renamed(renaming, alloc)
- if debugLifting {
- fmt.Fprintf(os.Stderr, "\tupdate load %s = %s with %s\n",
- instr.Name(), instr, newval.Name())
- }
- // Replace all references to
- // the loaded value by the
- // dominating stored value.
- replaceAll(instr, newval)
- // Delete the Load.
- u.Instrs[i] = nil
- u.gaps++
- }
- }
-
- case *DebugRef:
- if alloc, ok := instr.X.(*Alloc); ok && alloc.index >= 0 { // ref of Alloc cell
- if instr.IsAddr {
- instr.X = renamed(renaming, alloc)
- instr.IsAddr = false
-
- // Add DebugRef to instr.X's referrers.
- if refs := instr.X.Referrers(); refs != nil {
- *refs = append(*refs, instr)
- }
- } else {
- // A source expression denotes the address
- // of an Alloc that was optimized away.
- instr.X = nil
-
- // Delete the DebugRef.
- u.Instrs[i] = nil
- u.gaps++
- }
- }
- }
- }
-
- // For each φ-node in a CFG successor, rename the edge.
- for _, v := range u.Succs {
- phis := newPhis[v]
- if len(phis) == 0 {
- continue
- }
- i := v.predIndex(u)
- for _, np := range phis {
- phi := np.phi
- alloc := np.alloc
- newval := renamed(renaming, alloc)
- if debugLifting {
- fmt.Fprintf(os.Stderr, "\tsetphi %s edge %s -> %s (#%d) (alloc=%s) := %s\n",
- phi.Name(), u, v, i, alloc.Name(), newval.Name())
- }
- phi.Edges[i] = newval
- if prefs := newval.Referrers(); prefs != nil {
- *prefs = append(*prefs, phi)
- }
- }
- }
-
- // Continue depth-first recursion over domtree, pushing a
- // fresh copy of the renaming map for each subtree.
- for i, v := range u.dom.children {
- r := renaming
- if i < len(u.dom.children)-1 {
- // On all but the final iteration, we must make
- // a copy to avoid destructive update.
- r = make([]Value, len(renaming))
- copy(r, renaming)
- }
- rename(v, r, newPhis)
- }
-
-}
diff --git a/vendor/golang.org/x/tools/go/ssa/lvalue.go b/vendor/golang.org/x/tools/go/ssa/lvalue.go
deleted file mode 100644
index 4d85be3..0000000
--- a/vendor/golang.org/x/tools/go/ssa/lvalue.go
+++ /dev/null
@@ -1,120 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package ssa
-
-// lvalues are the union of addressable expressions and map-index
-// expressions.
-
-import (
- "go/ast"
- "go/token"
- "go/types"
-)
-
-// An lvalue represents an assignable location that may appear on the
-// left-hand side of an assignment. This is a generalization of a
-// pointer to permit updates to elements of maps.
-//
-type lvalue interface {
- store(fn *Function, v Value) // stores v into the location
- load(fn *Function) Value // loads the contents of the location
- address(fn *Function) Value // address of the location
- typ() types.Type // returns the type of the location
-}
-
-// An address is an lvalue represented by a true pointer.
-type address struct {
- addr Value
- pos token.Pos // source position
- expr ast.Expr // source syntax of the value (not address) [debug mode]
-}
-
-func (a *address) load(fn *Function) Value {
- load := emitLoad(fn, a.addr)
- load.pos = a.pos
- return load
-}
-
-func (a *address) store(fn *Function, v Value) {
- store := emitStore(fn, a.addr, v, a.pos)
- if a.expr != nil {
- // store.Val is v, converted for assignability.
- emitDebugRef(fn, a.expr, store.Val, false)
- }
-}
-
-func (a *address) address(fn *Function) Value {
- if a.expr != nil {
- emitDebugRef(fn, a.expr, a.addr, true)
- }
- return a.addr
-}
-
-func (a *address) typ() types.Type {
- return deref(a.addr.Type())
-}
-
-// An element is an lvalue represented by m[k], the location of an
-// element of a map or string. These locations are not addressable
-// since pointers cannot be formed from them, but they do support
-// load(), and in the case of maps, store().
-//
-type element struct {
- m, k Value // map or string
- t types.Type // map element type or string byte type
- pos token.Pos // source position of colon ({k:v}) or lbrack (m[k]=v)
-}
-
-func (e *element) load(fn *Function) Value {
- l := &Lookup{
- X: e.m,
- Index: e.k,
- }
- l.setPos(e.pos)
- l.setType(e.t)
- return fn.emit(l)
-}
-
-func (e *element) store(fn *Function, v Value) {
- up := &MapUpdate{
- Map: e.m,
- Key: e.k,
- Value: emitConv(fn, v, e.t),
- }
- up.pos = e.pos
- fn.emit(up)
-}
-
-func (e *element) address(fn *Function) Value {
- panic("map/string elements are not addressable")
-}
-
-func (e *element) typ() types.Type {
- return e.t
-}
-
-// A blank is a dummy variable whose name is "_".
-// It is not reified: loads are illegal and stores are ignored.
-//
-type blank struct{}
-
-func (bl blank) load(fn *Function) Value {
- panic("blank.load is illegal")
-}
-
-func (bl blank) store(fn *Function, v Value) {
- // no-op
-}
-
-func (bl blank) address(fn *Function) Value {
- panic("blank var is not addressable")
-}
-
-func (bl blank) typ() types.Type {
- // This should be the type of the blank Ident; the typechecker
- // doesn't provide this yet, but fortunately, we don't need it
- // yet either.
- panic("blank.typ is unimplemented")
-}
diff --git a/vendor/golang.org/x/tools/go/ssa/methods.go b/vendor/golang.org/x/tools/go/ssa/methods.go
deleted file mode 100644
index 080dca9..0000000
--- a/vendor/golang.org/x/tools/go/ssa/methods.go
+++ /dev/null
@@ -1,239 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package ssa
-
-// This file defines utilities for population of method sets.
-
-import (
- "fmt"
- "go/types"
-)
-
-// MethodValue returns the Function implementing method sel, building
-// wrapper methods on demand. It returns nil if sel denotes an
-// abstract (interface) method.
-//
-// Precondition: sel.Kind() == MethodVal.
-//
-// Thread-safe.
-//
-// EXCLUSIVE_LOCKS_ACQUIRED(prog.methodsMu)
-//
-func (prog *Program) MethodValue(sel *types.Selection) *Function {
- if sel.Kind() != types.MethodVal {
- panic(fmt.Sprintf("Method(%s) kind != MethodVal", sel))
- }
- T := sel.Recv()
- if isInterface(T) {
- return nil // abstract method
- }
- if prog.mode&LogSource != 0 {
- defer logStack("Method %s %v", T, sel)()
- }
-
- prog.methodsMu.Lock()
- defer prog.methodsMu.Unlock()
-
- return prog.addMethod(prog.createMethodSet(T), sel)
-}
-
-// LookupMethod returns the implementation of the method of type T
-// identified by (pkg, name). It returns nil if the method exists but
-// is abstract, and panics if T has no such method.
-//
-func (prog *Program) LookupMethod(T types.Type, pkg *types.Package, name string) *Function {
- sel := prog.MethodSets.MethodSet(T).Lookup(pkg, name)
- if sel == nil {
- panic(fmt.Sprintf("%s has no method %s", T, types.Id(pkg, name)))
- }
- return prog.MethodValue(sel)
-}
-
-// methodSet contains the (concrete) methods of a non-interface type.
-type methodSet struct {
- mapping map[string]*Function // populated lazily
- complete bool // mapping contains all methods
-}
-
-// Precondition: !isInterface(T).
-// EXCLUSIVE_LOCKS_REQUIRED(prog.methodsMu)
-func (prog *Program) createMethodSet(T types.Type) *methodSet {
- mset, ok := prog.methodSets.At(T).(*methodSet)
- if !ok {
- mset = &methodSet{mapping: make(map[string]*Function)}
- prog.methodSets.Set(T, mset)
- }
- return mset
-}
-
-// EXCLUSIVE_LOCKS_REQUIRED(prog.methodsMu)
-func (prog *Program) addMethod(mset *methodSet, sel *types.Selection) *Function {
- if sel.Kind() == types.MethodExpr {
- panic(sel)
- }
- id := sel.Obj().Id()
- fn := mset.mapping[id]
- if fn == nil {
- obj := sel.Obj().(*types.Func)
-
- needsPromotion := len(sel.Index()) > 1
- needsIndirection := !isPointer(recvType(obj)) && isPointer(sel.Recv())
- if needsPromotion || needsIndirection {
- fn = makeWrapper(prog, sel)
- } else {
- fn = prog.declaredFunc(obj)
- }
- if fn.Signature.Recv() == nil {
- panic(fn) // missing receiver
- }
- mset.mapping[id] = fn
- }
- return fn
-}
-
-// RuntimeTypes returns a new unordered slice containing all
-// concrete types in the program for which a complete (non-empty)
-// method set is required at run-time.
-//
-// Thread-safe.
-//
-// EXCLUSIVE_LOCKS_ACQUIRED(prog.methodsMu)
-//
-func (prog *Program) RuntimeTypes() []types.Type {
- prog.methodsMu.Lock()
- defer prog.methodsMu.Unlock()
-
- var res []types.Type
- prog.methodSets.Iterate(func(T types.Type, v interface{}) {
- if v.(*methodSet).complete {
- res = append(res, T)
- }
- })
- return res
-}
-
-// declaredFunc returns the concrete function/method denoted by obj.
-// Panic ensues if there is none.
-//
-func (prog *Program) declaredFunc(obj *types.Func) *Function {
- if v := prog.packageLevelValue(obj); v != nil {
- return v.(*Function)
- }
- panic("no concrete method: " + obj.String())
-}
-
-// needMethodsOf ensures that runtime type information (including the
-// complete method set) is available for the specified type T and all
-// its subcomponents.
-//
-// needMethodsOf must be called for at least every type that is an
-// operand of some MakeInterface instruction, and for the type of
-// every exported package member.
-//
-// Precondition: T is not a method signature (*Signature with Recv()!=nil).
-//
-// Thread-safe. (Called via emitConv from multiple builder goroutines.)
-//
-// TODO(adonovan): make this faster. It accounts for 20% of SSA build time.
-//
-// EXCLUSIVE_LOCKS_ACQUIRED(prog.methodsMu)
-//
-func (prog *Program) needMethodsOf(T types.Type) {
- prog.methodsMu.Lock()
- prog.needMethods(T, false)
- prog.methodsMu.Unlock()
-}
-
-// Precondition: T is not a method signature (*Signature with Recv()!=nil).
-// Recursive case: skip => don't create methods for T.
-//
-// EXCLUSIVE_LOCKS_REQUIRED(prog.methodsMu)
-//
-func (prog *Program) needMethods(T types.Type, skip bool) {
- // Each package maintains its own set of types it has visited.
- if prevSkip, ok := prog.runtimeTypes.At(T).(bool); ok {
- // needMethods(T) was previously called
- if !prevSkip || skip {
- return // already seen, with same or false 'skip' value
- }
- }
- prog.runtimeTypes.Set(T, skip)
-
- tmset := prog.MethodSets.MethodSet(T)
-
- if !skip && !isInterface(T) && tmset.Len() > 0 {
- // Create methods of T.
- mset := prog.createMethodSet(T)
- if !mset.complete {
- mset.complete = true
- n := tmset.Len()
- for i := 0; i < n; i++ {
- prog.addMethod(mset, tmset.At(i))
- }
- }
- }
-
- // Recursion over signatures of each method.
- for i := 0; i < tmset.Len(); i++ {
- sig := tmset.At(i).Type().(*types.Signature)
- prog.needMethods(sig.Params(), false)
- prog.needMethods(sig.Results(), false)
- }
-
- switch t := T.(type) {
- case *types.Basic:
- // nop
-
- case *types.Interface:
- // nop---handled by recursion over method set.
-
- case *types.Pointer:
- prog.needMethods(t.Elem(), false)
-
- case *types.Slice:
- prog.needMethods(t.Elem(), false)
-
- case *types.Chan:
- prog.needMethods(t.Elem(), false)
-
- case *types.Map:
- prog.needMethods(t.Key(), false)
- prog.needMethods(t.Elem(), false)
-
- case *types.Signature:
- if t.Recv() != nil {
- panic(fmt.Sprintf("Signature %s has Recv %s", t, t.Recv()))
- }
- prog.needMethods(t.Params(), false)
- prog.needMethods(t.Results(), false)
-
- case *types.Named:
- // A pointer-to-named type can be derived from a named
- // type via reflection. It may have methods too.
- prog.needMethods(types.NewPointer(T), false)
-
- // Consider 'type T struct{S}' where S has methods.
- // Reflection provides no way to get from T to struct{S},
- // only to S, so the method set of struct{S} is unwanted,
- // so set 'skip' flag during recursion.
- prog.needMethods(t.Underlying(), true)
-
- case *types.Array:
- prog.needMethods(t.Elem(), false)
-
- case *types.Struct:
- for i, n := 0, t.NumFields(); i < n; i++ {
- prog.needMethods(t.Field(i).Type(), false)
- }
-
- case *types.Tuple:
- for i, n := 0, t.Len(); i < n; i++ {
- prog.needMethods(t.At(i).Type(), false)
- }
-
- default:
- panic(T)
- }
-}
diff --git a/vendor/golang.org/x/tools/go/ssa/mode.go b/vendor/golang.org/x/tools/go/ssa/mode.go
deleted file mode 100644
index d2a2698..0000000
--- a/vendor/golang.org/x/tools/go/ssa/mode.go
+++ /dev/null
@@ -1,100 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package ssa
-
-// This file defines the BuilderMode type and its command-line flag.
-
-import (
- "bytes"
- "fmt"
-)
-
-// BuilderMode is a bitmask of options for diagnostics and checking.
-//
-// *BuilderMode satisfies the flag.Value interface. Example:
-//
-// var mode = ssa.BuilderMode(0)
-// func init() { flag.Var(&mode, "build", ssa.BuilderModeDoc) }
-//
-type BuilderMode uint
-
-const (
- PrintPackages BuilderMode = 1 << iota // Print package inventory to stdout
- PrintFunctions // Print function SSA code to stdout
- LogSource // Log source locations as SSA builder progresses
- SanityCheckFunctions // Perform sanity checking of function bodies
- NaiveForm // Build naïve SSA form: don't replace local loads/stores with registers
- BuildSerially // Build packages serially, not in parallel.
- GlobalDebug // Enable debug info for all packages
- BareInits // Build init functions without guards or calls to dependent inits
-)
-
-const BuilderModeDoc = `Options controlling the SSA builder.
-The value is a sequence of zero or more of these letters:
-C perform sanity [C]hecking of the SSA form.
-D include [D]ebug info for every function.
-P print [P]ackage inventory.
-F print [F]unction SSA code.
-S log [S]ource locations as SSA builder progresses.
-L build distinct packages seria[L]ly instead of in parallel.
-N build [N]aive SSA form: don't replace local loads/stores with registers.
-I build bare [I]nit functions: no init guards or calls to dependent inits.
-`
-
-func (m BuilderMode) String() string {
- var buf bytes.Buffer
- if m&GlobalDebug != 0 {
- buf.WriteByte('D')
- }
- if m&PrintPackages != 0 {
- buf.WriteByte('P')
- }
- if m&PrintFunctions != 0 {
- buf.WriteByte('F')
- }
- if m&LogSource != 0 {
- buf.WriteByte('S')
- }
- if m&SanityCheckFunctions != 0 {
- buf.WriteByte('C')
- }
- if m&NaiveForm != 0 {
- buf.WriteByte('N')
- }
- if m&BuildSerially != 0 {
- buf.WriteByte('L')
- }
- return buf.String()
-}
-
-// Set parses the flag characters in s and updates *m.
-func (m *BuilderMode) Set(s string) error {
- var mode BuilderMode
- for _, c := range s {
- switch c {
- case 'D':
- mode |= GlobalDebug
- case 'P':
- mode |= PrintPackages
- case 'F':
- mode |= PrintFunctions
- case 'S':
- mode |= LogSource | BuildSerially
- case 'C':
- mode |= SanityCheckFunctions
- case 'N':
- mode |= NaiveForm
- case 'L':
- mode |= BuildSerially
- default:
- return fmt.Errorf("unknown BuilderMode option: %q", c)
- }
- }
- *m = mode
- return nil
-}
-
-// Get returns m.
-func (m BuilderMode) Get() interface{} { return m }
diff --git a/vendor/golang.org/x/tools/go/ssa/print.go b/vendor/golang.org/x/tools/go/ssa/print.go
deleted file mode 100644
index 3333ba4..0000000
--- a/vendor/golang.org/x/tools/go/ssa/print.go
+++ /dev/null
@@ -1,431 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package ssa
-
-// This file implements the String() methods for all Value and
-// Instruction types.
-
-import (
- "bytes"
- "fmt"
- "go/types"
- "io"
- "reflect"
- "sort"
-
- "golang.org/x/tools/go/types/typeutil"
-)
-
-// relName returns the name of v relative to i.
-// In most cases, this is identical to v.Name(), but references to
-// Functions (including methods) and Globals use RelString and
-// all types are displayed with relType, so that only cross-package
-// references are package-qualified.
-//
-func relName(v Value, i Instruction) string {
- var from *types.Package
- if i != nil {
- from = i.Parent().pkg()
- }
- switch v := v.(type) {
- case Member: // *Function or *Global
- return v.RelString(from)
- case *Const:
- return v.RelString(from)
- }
- return v.Name()
-}
-
-func relType(t types.Type, from *types.Package) string {
- return types.TypeString(t, types.RelativeTo(from))
-}
-
-func relString(m Member, from *types.Package) string {
- // NB: not all globals have an Object (e.g. init$guard),
- // so use Package().Object not Object.Package().
- if pkg := m.Package().Pkg; pkg != nil && pkg != from {
- return fmt.Sprintf("%s.%s", pkg.Path(), m.Name())
- }
- return m.Name()
-}
-
-// Value.String()
-//
-// This method is provided only for debugging.
-// It never appears in disassembly, which uses Value.Name().
-
-func (v *Parameter) String() string {
- from := v.Parent().pkg()
- return fmt.Sprintf("parameter %s : %s", v.Name(), relType(v.Type(), from))
-}
-
-func (v *FreeVar) String() string {
- from := v.Parent().pkg()
- return fmt.Sprintf("freevar %s : %s", v.Name(), relType(v.Type(), from))
-}
-
-func (v *Builtin) String() string {
- return fmt.Sprintf("builtin %s", v.Name())
-}
-
-// Instruction.String()
-
-func (v *Alloc) String() string {
- op := "local"
- if v.Heap {
- op = "new"
- }
- from := v.Parent().pkg()
- return fmt.Sprintf("%s %s (%s)", op, relType(deref(v.Type()), from), v.Comment)
-}
-
-func (v *Phi) String() string {
- var b bytes.Buffer
- b.WriteString("phi [")
- for i, edge := range v.Edges {
- if i > 0 {
- b.WriteString(", ")
- }
- // Be robust against malformed CFG.
- if v.block == nil {
- b.WriteString("??")
- continue
- }
- block := -1
- if i < len(v.block.Preds) {
- block = v.block.Preds[i].Index
- }
- fmt.Fprintf(&b, "%d: ", block)
- edgeVal := "" // be robust
- if edge != nil {
- edgeVal = relName(edge, v)
- }
- b.WriteString(edgeVal)
- }
- b.WriteString("]")
- if v.Comment != "" {
- b.WriteString(" #")
- b.WriteString(v.Comment)
- }
- return b.String()
-}
-
-func printCall(v *CallCommon, prefix string, instr Instruction) string {
- var b bytes.Buffer
- b.WriteString(prefix)
- if !v.IsInvoke() {
- b.WriteString(relName(v.Value, instr))
- } else {
- fmt.Fprintf(&b, "invoke %s.%s", relName(v.Value, instr), v.Method.Name())
- }
- b.WriteString("(")
- for i, arg := range v.Args {
- if i > 0 {
- b.WriteString(", ")
- }
- b.WriteString(relName(arg, instr))
- }
- if v.Signature().Variadic() {
- b.WriteString("...")
- }
- b.WriteString(")")
- return b.String()
-}
-
-func (c *CallCommon) String() string {
- return printCall(c, "", nil)
-}
-
-func (v *Call) String() string {
- return printCall(&v.Call, "", v)
-}
-
-func (v *BinOp) String() string {
- return fmt.Sprintf("%s %s %s", relName(v.X, v), v.Op.String(), relName(v.Y, v))
-}
-
-func (v *UnOp) String() string {
- return fmt.Sprintf("%s%s%s", v.Op, relName(v.X, v), commaOk(v.CommaOk))
-}
-
-func printConv(prefix string, v, x Value) string {
- from := v.Parent().pkg()
- return fmt.Sprintf("%s %s <- %s (%s)",
- prefix,
- relType(v.Type(), from),
- relType(x.Type(), from),
- relName(x, v.(Instruction)))
-}
-
-func (v *ChangeType) String() string { return printConv("changetype", v, v.X) }
-func (v *Convert) String() string { return printConv("convert", v, v.X) }
-func (v *ChangeInterface) String() string { return printConv("change interface", v, v.X) }
-func (v *MakeInterface) String() string { return printConv("make", v, v.X) }
-
-func (v *MakeClosure) String() string {
- var b bytes.Buffer
- fmt.Fprintf(&b, "make closure %s", relName(v.Fn, v))
- if v.Bindings != nil {
- b.WriteString(" [")
- for i, c := range v.Bindings {
- if i > 0 {
- b.WriteString(", ")
- }
- b.WriteString(relName(c, v))
- }
- b.WriteString("]")
- }
- return b.String()
-}
-
-func (v *MakeSlice) String() string {
- from := v.Parent().pkg()
- return fmt.Sprintf("make %s %s %s",
- relType(v.Type(), from),
- relName(v.Len, v),
- relName(v.Cap, v))
-}
-
-func (v *Slice) String() string {
- var b bytes.Buffer
- b.WriteString("slice ")
- b.WriteString(relName(v.X, v))
- b.WriteString("[")
- if v.Low != nil {
- b.WriteString(relName(v.Low, v))
- }
- b.WriteString(":")
- if v.High != nil {
- b.WriteString(relName(v.High, v))
- }
- if v.Max != nil {
- b.WriteString(":")
- b.WriteString(relName(v.Max, v))
- }
- b.WriteString("]")
- return b.String()
-}
-
-func (v *MakeMap) String() string {
- res := ""
- if v.Reserve != nil {
- res = relName(v.Reserve, v)
- }
- from := v.Parent().pkg()
- return fmt.Sprintf("make %s %s", relType(v.Type(), from), res)
-}
-
-func (v *MakeChan) String() string {
- from := v.Parent().pkg()
- return fmt.Sprintf("make %s %s", relType(v.Type(), from), relName(v.Size, v))
-}
-
-func (v *FieldAddr) String() string {
- st := deref(v.X.Type()).Underlying().(*types.Struct)
- // Be robust against a bad index.
- name := "?"
- if 0 <= v.Field && v.Field < st.NumFields() {
- name = st.Field(v.Field).Name()
- }
- return fmt.Sprintf("&%s.%s [#%d]", relName(v.X, v), name, v.Field)
-}
-
-func (v *Field) String() string {
- st := v.X.Type().Underlying().(*types.Struct)
- // Be robust against a bad index.
- name := "?"
- if 0 <= v.Field && v.Field < st.NumFields() {
- name = st.Field(v.Field).Name()
- }
- return fmt.Sprintf("%s.%s [#%d]", relName(v.X, v), name, v.Field)
-}
-
-func (v *IndexAddr) String() string {
- return fmt.Sprintf("&%s[%s]", relName(v.X, v), relName(v.Index, v))
-}
-
-func (v *Index) String() string {
- return fmt.Sprintf("%s[%s]", relName(v.X, v), relName(v.Index, v))
-}
-
-func (v *Lookup) String() string {
- return fmt.Sprintf("%s[%s]%s", relName(v.X, v), relName(v.Index, v), commaOk(v.CommaOk))
-}
-
-func (v *Range) String() string {
- return "range " + relName(v.X, v)
-}
-
-func (v *Next) String() string {
- return "next " + relName(v.Iter, v)
-}
-
-func (v *TypeAssert) String() string {
- from := v.Parent().pkg()
- return fmt.Sprintf("typeassert%s %s.(%s)", commaOk(v.CommaOk), relName(v.X, v), relType(v.AssertedType, from))
-}
-
-func (v *Extract) String() string {
- return fmt.Sprintf("extract %s #%d", relName(v.Tuple, v), v.Index)
-}
-
-func (s *Jump) String() string {
- // Be robust against malformed CFG.
- block := -1
- if s.block != nil && len(s.block.Succs) == 1 {
- block = s.block.Succs[0].Index
- }
- return fmt.Sprintf("jump %d", block)
-}
-
-func (s *If) String() string {
- // Be robust against malformed CFG.
- tblock, fblock := -1, -1
- if s.block != nil && len(s.block.Succs) == 2 {
- tblock = s.block.Succs[0].Index
- fblock = s.block.Succs[1].Index
- }
- return fmt.Sprintf("if %s goto %d else %d", relName(s.Cond, s), tblock, fblock)
-}
-
-func (s *Go) String() string {
- return printCall(&s.Call, "go ", s)
-}
-
-func (s *Panic) String() string {
- return "panic " + relName(s.X, s)
-}
-
-func (s *Return) String() string {
- var b bytes.Buffer
- b.WriteString("return")
- for i, r := range s.Results {
- if i == 0 {
- b.WriteString(" ")
- } else {
- b.WriteString(", ")
- }
- b.WriteString(relName(r, s))
- }
- return b.String()
-}
-
-func (*RunDefers) String() string {
- return "rundefers"
-}
-
-func (s *Send) String() string {
- return fmt.Sprintf("send %s <- %s", relName(s.Chan, s), relName(s.X, s))
-}
-
-func (s *Defer) String() string {
- return printCall(&s.Call, "defer ", s)
-}
-
-func (s *Select) String() string {
- var b bytes.Buffer
- for i, st := range s.States {
- if i > 0 {
- b.WriteString(", ")
- }
- if st.Dir == types.RecvOnly {
- b.WriteString("<-")
- b.WriteString(relName(st.Chan, s))
- } else {
- b.WriteString(relName(st.Chan, s))
- b.WriteString("<-")
- b.WriteString(relName(st.Send, s))
- }
- }
- non := ""
- if !s.Blocking {
- non = "non"
- }
- return fmt.Sprintf("select %sblocking [%s]", non, b.String())
-}
-
-func (s *Store) String() string {
- return fmt.Sprintf("*%s = %s", relName(s.Addr, s), relName(s.Val, s))
-}
-
-func (s *MapUpdate) String() string {
- return fmt.Sprintf("%s[%s] = %s", relName(s.Map, s), relName(s.Key, s), relName(s.Value, s))
-}
-
-func (s *DebugRef) String() string {
- p := s.Parent().Prog.Fset.Position(s.Pos())
- var descr interface{}
- if s.object != nil {
- descr = s.object // e.g. "var x int"
- } else {
- descr = reflect.TypeOf(s.Expr) // e.g. "*ast.CallExpr"
- }
- var addr string
- if s.IsAddr {
- addr = "address of "
- }
- return fmt.Sprintf("; %s%s @ %d:%d is %s", addr, descr, p.Line, p.Column, s.X.Name())
-}
-
-func (p *Package) String() string {
- return "package " + p.Pkg.Path()
-}
-
-var _ io.WriterTo = (*Package)(nil) // *Package implements io.Writer
-
-func (p *Package) WriteTo(w io.Writer) (int64, error) {
- var buf bytes.Buffer
- WritePackage(&buf, p)
- n, err := w.Write(buf.Bytes())
- return int64(n), err
-}
-
-// WritePackage writes to buf a human-readable summary of p.
-func WritePackage(buf *bytes.Buffer, p *Package) {
- fmt.Fprintf(buf, "%s:\n", p)
-
- var names []string
- maxname := 0
- for name := range p.Members {
- if l := len(name); l > maxname {
- maxname = l
- }
- names = append(names, name)
- }
-
- from := p.Pkg
- sort.Strings(names)
- for _, name := range names {
- switch mem := p.Members[name].(type) {
- case *NamedConst:
- fmt.Fprintf(buf, " const %-*s %s = %s\n",
- maxname, name, mem.Name(), mem.Value.RelString(from))
-
- case *Function:
- fmt.Fprintf(buf, " func %-*s %s\n",
- maxname, name, relType(mem.Type(), from))
-
- case *Type:
- fmt.Fprintf(buf, " type %-*s %s\n",
- maxname, name, relType(mem.Type().Underlying(), from))
- for _, meth := range typeutil.IntuitiveMethodSet(mem.Type(), &p.Prog.MethodSets) {
- fmt.Fprintf(buf, " %s\n", types.SelectionString(meth, types.RelativeTo(from)))
- }
-
- case *Global:
- fmt.Fprintf(buf, " var %-*s %s\n",
- maxname, name, relType(mem.Type().(*types.Pointer).Elem(), from))
- }
- }
-
- fmt.Fprintf(buf, "\n")
-}
-
-func commaOk(x bool) string {
- if x {
- return ",ok"
- }
- return ""
-}
diff --git a/vendor/golang.org/x/tools/go/ssa/sanity.go b/vendor/golang.org/x/tools/go/ssa/sanity.go
deleted file mode 100644
index 0d13beb..0000000
--- a/vendor/golang.org/x/tools/go/ssa/sanity.go
+++ /dev/null
@@ -1,521 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package ssa
-
-// An optional pass for sanity-checking invariants of the SSA representation.
-// Currently it checks CFG invariants but little at the instruction level.
-
-import (
- "fmt"
- "go/types"
- "io"
- "os"
- "strings"
-)
-
-type sanity struct {
- reporter io.Writer
- fn *Function
- block *BasicBlock
- instrs map[Instruction]struct{}
- insane bool
-}
-
-// sanityCheck performs integrity checking of the SSA representation
-// of the function fn and returns true if it was valid. Diagnostics
-// are written to reporter if non-nil, os.Stderr otherwise. Some
-// diagnostics are only warnings and do not imply a negative result.
-//
-// Sanity-checking is intended to facilitate the debugging of code
-// transformation passes.
-//
-func sanityCheck(fn *Function, reporter io.Writer) bool {
- if reporter == nil {
- reporter = os.Stderr
- }
- return (&sanity{reporter: reporter}).checkFunction(fn)
-}
-
-// mustSanityCheck is like sanityCheck but panics instead of returning
-// a negative result.
-//
-func mustSanityCheck(fn *Function, reporter io.Writer) {
- if !sanityCheck(fn, reporter) {
- fn.WriteTo(os.Stderr)
- panic("SanityCheck failed")
- }
-}
-
-func (s *sanity) diagnostic(prefix, format string, args ...interface{}) {
- fmt.Fprintf(s.reporter, "%s: function %s", prefix, s.fn)
- if s.block != nil {
- fmt.Fprintf(s.reporter, ", block %s", s.block)
- }
- io.WriteString(s.reporter, ": ")
- fmt.Fprintf(s.reporter, format, args...)
- io.WriteString(s.reporter, "\n")
-}
-
-func (s *sanity) errorf(format string, args ...interface{}) {
- s.insane = true
- s.diagnostic("Error", format, args...)
-}
-
-func (s *sanity) warnf(format string, args ...interface{}) {
- s.diagnostic("Warning", format, args...)
-}
-
-// findDuplicate returns an arbitrary basic block that appeared more
-// than once in blocks, or nil if all were unique.
-func findDuplicate(blocks []*BasicBlock) *BasicBlock {
- if len(blocks) < 2 {
- return nil
- }
- if blocks[0] == blocks[1] {
- return blocks[0]
- }
- // Slow path:
- m := make(map[*BasicBlock]bool)
- for _, b := range blocks {
- if m[b] {
- return b
- }
- m[b] = true
- }
- return nil
-}
-
-func (s *sanity) checkInstr(idx int, instr Instruction) {
- switch instr := instr.(type) {
- case *If, *Jump, *Return, *Panic:
- s.errorf("control flow instruction not at end of block")
- case *Phi:
- if idx == 0 {
- // It suffices to apply this check to just the first phi node.
- if dup := findDuplicate(s.block.Preds); dup != nil {
- s.errorf("phi node in block with duplicate predecessor %s", dup)
- }
- } else {
- prev := s.block.Instrs[idx-1]
- if _, ok := prev.(*Phi); !ok {
- s.errorf("Phi instruction follows a non-Phi: %T", prev)
- }
- }
- if ne, np := len(instr.Edges), len(s.block.Preds); ne != np {
- s.errorf("phi node has %d edges but %d predecessors", ne, np)
-
- } else {
- for i, e := range instr.Edges {
- if e == nil {
- s.errorf("phi node '%s' has no value for edge #%d from %s", instr.Comment, i, s.block.Preds[i])
- }
- }
- }
-
- case *Alloc:
- if !instr.Heap {
- found := false
- for _, l := range s.fn.Locals {
- if l == instr {
- found = true
- break
- }
- }
- if !found {
- s.errorf("local alloc %s = %s does not appear in Function.Locals", instr.Name(), instr)
- }
- }
-
- case *BinOp:
- case *Call:
- case *ChangeInterface:
- case *ChangeType:
- case *Convert:
- if _, ok := instr.X.Type().Underlying().(*types.Basic); !ok {
- if _, ok := instr.Type().Underlying().(*types.Basic); !ok {
- s.errorf("convert %s -> %s: at least one type must be basic", instr.X.Type(), instr.Type())
- }
- }
-
- case *Defer:
- case *Extract:
- case *Field:
- case *FieldAddr:
- case *Go:
- case *Index:
- case *IndexAddr:
- case *Lookup:
- case *MakeChan:
- case *MakeClosure:
- numFree := len(instr.Fn.(*Function).FreeVars)
- numBind := len(instr.Bindings)
- if numFree != numBind {
- s.errorf("MakeClosure has %d Bindings for function %s with %d free vars",
- numBind, instr.Fn, numFree)
-
- }
- if recv := instr.Type().(*types.Signature).Recv(); recv != nil {
- s.errorf("MakeClosure's type includes receiver %s", recv.Type())
- }
-
- case *MakeInterface:
- case *MakeMap:
- case *MakeSlice:
- case *MapUpdate:
- case *Next:
- case *Range:
- case *RunDefers:
- case *Select:
- case *Send:
- case *Slice:
- case *Store:
- case *TypeAssert:
- case *UnOp:
- case *DebugRef:
- // TODO(adonovan): implement checks.
- default:
- panic(fmt.Sprintf("Unknown instruction type: %T", instr))
- }
-
- if call, ok := instr.(CallInstruction); ok {
- if call.Common().Signature() == nil {
- s.errorf("nil signature: %s", call)
- }
- }
-
- // Check that value-defining instructions have valid types
- // and a valid referrer list.
- if v, ok := instr.(Value); ok {
- t := v.Type()
- if t == nil {
- s.errorf("no type: %s = %s", v.Name(), v)
- } else if t == tRangeIter {
- // not a proper type; ignore.
- } else if b, ok := t.Underlying().(*types.Basic); ok && b.Info()&types.IsUntyped != 0 {
- s.errorf("instruction has 'untyped' result: %s = %s : %s", v.Name(), v, t)
- }
- s.checkReferrerList(v)
- }
-
- // Untyped constants are legal as instruction Operands(),
- // for example:
- // _ = "foo"[0]
- // or:
- // if wordsize==64 {...}
-
- // All other non-Instruction Values can be found via their
- // enclosing Function or Package.
-}
-
-func (s *sanity) checkFinalInstr(instr Instruction) {
- switch instr := instr.(type) {
- case *If:
- if nsuccs := len(s.block.Succs); nsuccs != 2 {
- s.errorf("If-terminated block has %d successors; expected 2", nsuccs)
- return
- }
- if s.block.Succs[0] == s.block.Succs[1] {
- s.errorf("If-instruction has same True, False target blocks: %s", s.block.Succs[0])
- return
- }
-
- case *Jump:
- if nsuccs := len(s.block.Succs); nsuccs != 1 {
- s.errorf("Jump-terminated block has %d successors; expected 1", nsuccs)
- return
- }
-
- case *Return:
- if nsuccs := len(s.block.Succs); nsuccs != 0 {
- s.errorf("Return-terminated block has %d successors; expected none", nsuccs)
- return
- }
- if na, nf := len(instr.Results), s.fn.Signature.Results().Len(); nf != na {
- s.errorf("%d-ary return in %d-ary function", na, nf)
- }
-
- case *Panic:
- if nsuccs := len(s.block.Succs); nsuccs != 0 {
- s.errorf("Panic-terminated block has %d successors; expected none", nsuccs)
- return
- }
-
- default:
- s.errorf("non-control flow instruction at end of block")
- }
-}
-
-func (s *sanity) checkBlock(b *BasicBlock, index int) {
- s.block = b
-
- if b.Index != index {
- s.errorf("block has incorrect Index %d", b.Index)
- }
- if b.parent != s.fn {
- s.errorf("block has incorrect parent %s", b.parent)
- }
-
- // Check all blocks are reachable.
- // (The entry block is always implicitly reachable,
- // as is the Recover block, if any.)
- if (index > 0 && b != b.parent.Recover) && len(b.Preds) == 0 {
- s.warnf("unreachable block")
- if b.Instrs == nil {
- // Since this block is about to be pruned,
- // tolerating transient problems in it
- // simplifies other optimizations.
- return
- }
- }
-
- // Check predecessor and successor relations are dual,
- // and that all blocks in CFG belong to same function.
- for _, a := range b.Preds {
- found := false
- for _, bb := range a.Succs {
- if bb == b {
- found = true
- break
- }
- }
- if !found {
- s.errorf("expected successor edge in predecessor %s; found only: %s", a, a.Succs)
- }
- if a.parent != s.fn {
- s.errorf("predecessor %s belongs to different function %s", a, a.parent)
- }
- }
- for _, c := range b.Succs {
- found := false
- for _, bb := range c.Preds {
- if bb == b {
- found = true
- break
- }
- }
- if !found {
- s.errorf("expected predecessor edge in successor %s; found only: %s", c, c.Preds)
- }
- if c.parent != s.fn {
- s.errorf("successor %s belongs to different function %s", c, c.parent)
- }
- }
-
- // Check each instruction is sane.
- n := len(b.Instrs)
- if n == 0 {
- s.errorf("basic block contains no instructions")
- }
- var rands [10]*Value // reuse storage
- for j, instr := range b.Instrs {
- if instr == nil {
- s.errorf("nil instruction at index %d", j)
- continue
- }
- if b2 := instr.Block(); b2 == nil {
- s.errorf("nil Block() for instruction at index %d", j)
- continue
- } else if b2 != b {
- s.errorf("wrong Block() (%s) for instruction at index %d ", b2, j)
- continue
- }
- if j < n-1 {
- s.checkInstr(j, instr)
- } else {
- s.checkFinalInstr(instr)
- }
-
- // Check Instruction.Operands.
- operands:
- for i, op := range instr.Operands(rands[:0]) {
- if op == nil {
- s.errorf("nil operand pointer %d of %s", i, instr)
- continue
- }
- val := *op
- if val == nil {
- continue // a nil operand is ok
- }
-
- // Check that "untyped" types only appear on constant operands.
- if _, ok := (*op).(*Const); !ok {
- if basic, ok := (*op).Type().(*types.Basic); ok {
- if basic.Info()&types.IsUntyped != 0 {
- s.errorf("operand #%d of %s is untyped: %s", i, instr, basic)
- }
- }
- }
-
- // Check that Operands that are also Instructions belong to same function.
- // TODO(adonovan): also check their block dominates block b.
- if val, ok := val.(Instruction); ok {
- if val.Block() == nil {
- s.errorf("operand %d of %s is an instruction (%s) that belongs to no block", i, instr, val)
- } else if val.Parent() != s.fn {
- s.errorf("operand %d of %s is an instruction (%s) from function %s", i, instr, val, val.Parent())
- }
- }
-
- // Check that each function-local operand of
- // instr refers back to instr. (NB: quadratic)
- switch val := val.(type) {
- case *Const, *Global, *Builtin:
- continue // not local
- case *Function:
- if val.parent == nil {
- continue // only anon functions are local
- }
- }
-
- // TODO(adonovan): check val.Parent() != nil <=> val.Referrers() is defined.
-
- if refs := val.Referrers(); refs != nil {
- for _, ref := range *refs {
- if ref == instr {
- continue operands
- }
- }
- s.errorf("operand %d of %s (%s) does not refer to us", i, instr, val)
- } else {
- s.errorf("operand %d of %s (%s) has no referrers", i, instr, val)
- }
- }
- }
-}
-
-func (s *sanity) checkReferrerList(v Value) {
- refs := v.Referrers()
- if refs == nil {
- s.errorf("%s has missing referrer list", v.Name())
- return
- }
- for i, ref := range *refs {
- if _, ok := s.instrs[ref]; !ok {
- s.errorf("%s.Referrers()[%d] = %s is not an instruction belonging to this function", v.Name(), i, ref)
- }
- }
-}
-
-func (s *sanity) checkFunction(fn *Function) bool {
- // TODO(adonovan): check Function invariants:
- // - check params match signature
- // - check transient fields are nil
- // - warn if any fn.Locals do not appear among block instructions.
- s.fn = fn
- if fn.Prog == nil {
- s.errorf("nil Prog")
- }
-
- fn.String() // must not crash
- fn.RelString(fn.pkg()) // must not crash
-
- // All functions have a package, except delegates (which are
- // shared across packages, or duplicated as weak symbols in a
- // separate-compilation model), and error.Error.
- if fn.Pkg == nil {
- if strings.HasPrefix(fn.Synthetic, "wrapper ") ||
- strings.HasPrefix(fn.Synthetic, "bound ") ||
- strings.HasPrefix(fn.Synthetic, "thunk ") ||
- strings.HasSuffix(fn.name, "Error") {
- // ok
- } else {
- s.errorf("nil Pkg")
- }
- }
- if src, syn := fn.Synthetic == "", fn.Syntax() != nil; src != syn {
- s.errorf("got fromSource=%t, hasSyntax=%t; want same values", src, syn)
- }
- for i, l := range fn.Locals {
- if l.Parent() != fn {
- s.errorf("Local %s at index %d has wrong parent", l.Name(), i)
- }
- if l.Heap {
- s.errorf("Local %s at index %d has Heap flag set", l.Name(), i)
- }
- }
- // Build the set of valid referrers.
- s.instrs = make(map[Instruction]struct{})
- for _, b := range fn.Blocks {
- for _, instr := range b.Instrs {
- s.instrs[instr] = struct{}{}
- }
- }
- for i, p := range fn.Params {
- if p.Parent() != fn {
- s.errorf("Param %s at index %d has wrong parent", p.Name(), i)
- }
- s.checkReferrerList(p)
- }
- for i, fv := range fn.FreeVars {
- if fv.Parent() != fn {
- s.errorf("FreeVar %s at index %d has wrong parent", fv.Name(), i)
- }
- s.checkReferrerList(fv)
- }
-
- if fn.Blocks != nil && len(fn.Blocks) == 0 {
- // Function _had_ blocks (so it's not external) but
- // they were "optimized" away, even the entry block.
- s.errorf("Blocks slice is non-nil but empty")
- }
- for i, b := range fn.Blocks {
- if b == nil {
- s.warnf("nil *BasicBlock at f.Blocks[%d]", i)
- continue
- }
- s.checkBlock(b, i)
- }
- if fn.Recover != nil && fn.Blocks[fn.Recover.Index] != fn.Recover {
- s.errorf("Recover block is not in Blocks slice")
- }
-
- s.block = nil
- for i, anon := range fn.AnonFuncs {
- if anon.Parent() != fn {
- s.errorf("AnonFuncs[%d]=%s but %s.Parent()=%s", i, anon, anon, anon.Parent())
- }
- }
- s.fn = nil
- return !s.insane
-}
-
-// sanityCheckPackage checks invariants of packages upon creation.
-// It does not require that the package is built.
-// Unlike sanityCheck (for functions), it just panics at the first error.
-func sanityCheckPackage(pkg *Package) {
- if pkg.Pkg == nil {
- panic(fmt.Sprintf("Package %s has no Object", pkg))
- }
- pkg.String() // must not crash
-
- for name, mem := range pkg.Members {
- if name != mem.Name() {
- panic(fmt.Sprintf("%s: %T.Name() = %s, want %s",
- pkg.Pkg.Path(), mem, mem.Name(), name))
- }
- obj := mem.Object()
- if obj == nil {
- // This check is sound because fields
- // {Global,Function}.object have type
- // types.Object. (If they were declared as
- // *types.{Var,Func}, we'd have a non-empty
- // interface containing a nil pointer.)
-
- continue // not all members have typechecker objects
- }
- if obj.Name() != name {
- if obj.Name() == "init" && strings.HasPrefix(mem.Name(), "init#") {
- // Ok. The name of a declared init function varies between
- // its types.Func ("init") and its ssa.Function ("init#%d").
- } else {
- panic(fmt.Sprintf("%s: %T.Object().Name() = %s, want %s",
- pkg.Pkg.Path(), mem, obj.Name(), name))
- }
- }
- if obj.Pos() != mem.Pos() {
- panic(fmt.Sprintf("%s Pos=%d obj.Pos=%d", mem, mem.Pos(), obj.Pos()))
- }
- }
-}
diff --git a/vendor/golang.org/x/tools/go/ssa/source.go b/vendor/golang.org/x/tools/go/ssa/source.go
deleted file mode 100644
index 6d2223e..0000000
--- a/vendor/golang.org/x/tools/go/ssa/source.go
+++ /dev/null
@@ -1,293 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package ssa
-
-// This file defines utilities for working with source positions
-// or source-level named entities ("objects").
-
-// TODO(adonovan): test that {Value,Instruction}.Pos() positions match
-// the originating syntax, as specified.
-
-import (
- "go/ast"
- "go/token"
- "go/types"
-)
-
-// EnclosingFunction returns the function that contains the syntax
-// node denoted by path.
-//
-// Syntax associated with package-level variable specifications is
-// enclosed by the package's init() function.
-//
-// Returns nil if not found; reasons might include:
-// - the node is not enclosed by any function.
-// - the node is within an anonymous function (FuncLit) and
-// its SSA function has not been created yet
-// (pkg.Build() has not yet been called).
-//
-func EnclosingFunction(pkg *Package, path []ast.Node) *Function {
- // Start with package-level function...
- fn := findEnclosingPackageLevelFunction(pkg, path)
- if fn == nil {
- return nil // not in any function
- }
-
- // ...then walk down the nested anonymous functions.
- n := len(path)
-outer:
- for i := range path {
- if lit, ok := path[n-1-i].(*ast.FuncLit); ok {
- for _, anon := range fn.AnonFuncs {
- if anon.Pos() == lit.Type.Func {
- fn = anon
- continue outer
- }
- }
- // SSA function not found:
- // - package not yet built, or maybe
- // - builder skipped FuncLit in dead block
- // (in principle; but currently the Builder
- // generates even dead FuncLits).
- return nil
- }
- }
- return fn
-}
-
-// HasEnclosingFunction returns true if the AST node denoted by path
-// is contained within the declaration of some function or
-// package-level variable.
-//
-// Unlike EnclosingFunction, the behaviour of this function does not
-// depend on whether SSA code for pkg has been built, so it can be
-// used to quickly reject check inputs that will cause
-// EnclosingFunction to fail, prior to SSA building.
-//
-func HasEnclosingFunction(pkg *Package, path []ast.Node) bool {
- return findEnclosingPackageLevelFunction(pkg, path) != nil
-}
-
-// findEnclosingPackageLevelFunction returns the Function
-// corresponding to the package-level function enclosing path.
-//
-func findEnclosingPackageLevelFunction(pkg *Package, path []ast.Node) *Function {
- if n := len(path); n >= 2 { // [... {Gen,Func}Decl File]
- switch decl := path[n-2].(type) {
- case *ast.GenDecl:
- if decl.Tok == token.VAR && n >= 3 {
- // Package-level 'var' initializer.
- return pkg.init
- }
-
- case *ast.FuncDecl:
- if decl.Recv == nil && decl.Name.Name == "init" {
- // Explicit init() function.
- for _, b := range pkg.init.Blocks {
- for _, instr := range b.Instrs {
- if instr, ok := instr.(*Call); ok {
- if callee, ok := instr.Call.Value.(*Function); ok && callee.Pkg == pkg && callee.Pos() == decl.Name.NamePos {
- return callee
- }
- }
- }
- }
- // Hack: return non-nil when SSA is not yet
- // built so that HasEnclosingFunction works.
- return pkg.init
- }
- // Declared function/method.
- return findNamedFunc(pkg, decl.Name.NamePos)
- }
- }
- return nil // not in any function
-}
-
-// findNamedFunc returns the named function whose FuncDecl.Ident is at
-// position pos.
-//
-func findNamedFunc(pkg *Package, pos token.Pos) *Function {
- // Look at all package members and method sets of named types.
- // Not very efficient.
- for _, mem := range pkg.Members {
- switch mem := mem.(type) {
- case *Function:
- if mem.Pos() == pos {
- return mem
- }
- case *Type:
- mset := pkg.Prog.MethodSets.MethodSet(types.NewPointer(mem.Type()))
- for i, n := 0, mset.Len(); i < n; i++ {
- // Don't call Program.Method: avoid creating wrappers.
- obj := mset.At(i).Obj().(*types.Func)
- if obj.Pos() == pos {
- return pkg.values[obj].(*Function)
- }
- }
- }
- }
- return nil
-}
-
-// ValueForExpr returns the SSA Value that corresponds to non-constant
-// expression e.
-//
-// It returns nil if no value was found, e.g.
-// - the expression is not lexically contained within f;
-// - f was not built with debug information; or
-// - e is a constant expression. (For efficiency, no debug
-// information is stored for constants. Use
-// go/types.Info.Types[e].Value instead.)
-// - e is a reference to nil or a built-in function.
-// - the value was optimised away.
-//
-// If e is an addressable expression used in an lvalue context,
-// value is the address denoted by e, and isAddr is true.
-//
-// The types of e (or &e, if isAddr) and the result are equal
-// (modulo "untyped" bools resulting from comparisons).
-//
-// (Tip: to find the ssa.Value given a source position, use
-// importer.PathEnclosingInterval to locate the ast.Node, then
-// EnclosingFunction to locate the Function, then ValueForExpr to find
-// the ssa.Value.)
-//
-func (f *Function) ValueForExpr(e ast.Expr) (value Value, isAddr bool) {
- if f.debugInfo() { // (opt)
- e = unparen(e)
- for _, b := range f.Blocks {
- for _, instr := range b.Instrs {
- if ref, ok := instr.(*DebugRef); ok {
- if ref.Expr == e {
- return ref.X, ref.IsAddr
- }
- }
- }
- }
- }
- return
-}
-
-// --- Lookup functions for source-level named entities (types.Objects) ---
-
-// Package returns the SSA Package corresponding to the specified
-// type-checker package object.
-// It returns nil if no such SSA package has been created.
-//
-func (prog *Program) Package(obj *types.Package) *Package {
- return prog.packages[obj]
-}
-
-// packageLevelValue returns the package-level value corresponding to
-// the specified named object, which may be a package-level const
-// (*Const), var (*Global) or func (*Function) of some package in
-// prog. It returns nil if the object is not found.
-//
-func (prog *Program) packageLevelValue(obj types.Object) Value {
- if pkg, ok := prog.packages[obj.Pkg()]; ok {
- return pkg.values[obj]
- }
- return nil
-}
-
-// FuncValue returns the concrete Function denoted by the source-level
-// named function obj, or nil if obj denotes an interface method.
-//
-// TODO(adonovan): check the invariant that obj.Type() matches the
-// result's Signature, both in the params/results and in the receiver.
-//
-func (prog *Program) FuncValue(obj *types.Func) *Function {
- fn, _ := prog.packageLevelValue(obj).(*Function)
- return fn
-}
-
-// ConstValue returns the SSA Value denoted by the source-level named
-// constant obj.
-//
-func (prog *Program) ConstValue(obj *types.Const) *Const {
- // TODO(adonovan): opt: share (don't reallocate)
- // Consts for const objects and constant ast.Exprs.
-
- // Universal constant? {true,false,nil}
- if obj.Parent() == types.Universe {
- return NewConst(obj.Val(), obj.Type())
- }
- // Package-level named constant?
- if v := prog.packageLevelValue(obj); v != nil {
- return v.(*Const)
- }
- return NewConst(obj.Val(), obj.Type())
-}
-
-// VarValue returns the SSA Value that corresponds to a specific
-// identifier denoting the source-level named variable obj.
-//
-// VarValue returns nil if a local variable was not found, perhaps
-// because its package was not built, the debug information was not
-// requested during SSA construction, or the value was optimized away.
-//
-// ref is the path to an ast.Ident (e.g. from PathEnclosingInterval),
-// and that ident must resolve to obj.
-//
-// pkg is the package enclosing the reference. (A reference to a var
-// always occurs within a function, so we need to know where to find it.)
-//
-// If the identifier is a field selector and its base expression is
-// non-addressable, then VarValue returns the value of that field.
-// For example:
-// func f() struct {x int}
-// f().x // VarValue(x) returns a *Field instruction of type int
-//
-// All other identifiers denote addressable locations (variables).
-// For them, VarValue may return either the variable's address or its
-// value, even when the expression is evaluated only for its value; the
-// situation is reported by isAddr, the second component of the result.
-//
-// If !isAddr, the returned value is the one associated with the
-// specific identifier. For example,
-// var x int // VarValue(x) returns Const 0 here
-// x = 1 // VarValue(x) returns Const 1 here
-//
-// It is not specified whether the value or the address is returned in
-// any particular case, as it may depend upon optimizations performed
-// during SSA code generation, such as registerization, constant
-// folding, avoidance of materialization of subexpressions, etc.
-//
-func (prog *Program) VarValue(obj *types.Var, pkg *Package, ref []ast.Node) (value Value, isAddr bool) {
- // All references to a var are local to some function, possibly init.
- fn := EnclosingFunction(pkg, ref)
- if fn == nil {
- return // e.g. def of struct field; SSA not built?
- }
-
- id := ref[0].(*ast.Ident)
-
- // Defining ident of a parameter?
- if id.Pos() == obj.Pos() {
- for _, param := range fn.Params {
- if param.Object() == obj {
- return param, false
- }
- }
- }
-
- // Other ident?
- for _, b := range fn.Blocks {
- for _, instr := range b.Instrs {
- if dr, ok := instr.(*DebugRef); ok {
- if dr.Pos() == id.Pos() {
- return dr.X, dr.IsAddr
- }
- }
- }
- }
-
- // Defining ident of package-level var?
- if v := prog.packageLevelValue(obj); v != nil {
- return v.(*Global), true
- }
-
- return // e.g. debug info not requested, or var optimized away
-}
diff --git a/vendor/golang.org/x/tools/go/ssa/source_test.go b/vendor/golang.org/x/tools/go/ssa/source_test.go
deleted file mode 100644
index 43051f8..0000000
--- a/vendor/golang.org/x/tools/go/ssa/source_test.go
+++ /dev/null
@@ -1,397 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package ssa_test
-
-// This file defines tests of source-level debugging utilities.
-
-import (
- "fmt"
- "go/ast"
- exact "go/constant"
- "go/parser"
- "go/token"
- "go/types"
- "os"
- "regexp"
- "runtime"
- "strings"
- "testing"
-
- "golang.org/x/tools/go/ast/astutil"
- "golang.org/x/tools/go/loader"
- "golang.org/x/tools/go/ssa"
- "golang.org/x/tools/go/ssa/ssautil"
-)
-
-func TestObjValueLookup(t *testing.T) {
- if runtime.GOOS == "android" {
- t.Skipf("no testdata directory on %s", runtime.GOOS)
- }
-
- conf := loader.Config{ParserMode: parser.ParseComments}
- f, err := conf.ParseFile("testdata/objlookup.go", nil)
- if err != nil {
- t.Error(err)
- return
- }
- conf.CreateFromFiles("main", f)
-
- // Maps each var Ident (represented "name:linenum") to the
- // kind of ssa.Value we expect (represented "Constant", "&Alloc").
- expectations := make(map[string]string)
-
- // Find all annotations of form x::BinOp, &y::Alloc, etc.
- re := regexp.MustCompile(`(\b|&)?(\w*)::(\w*)\b`)
- for _, c := range f.Comments {
- text := c.Text()
- pos := conf.Fset.Position(c.Pos())
- for _, m := range re.FindAllStringSubmatch(text, -1) {
- key := fmt.Sprintf("%s:%d", m[2], pos.Line)
- value := m[1] + m[3]
- expectations[key] = value
- }
- }
-
- iprog, err := conf.Load()
- if err != nil {
- t.Error(err)
- return
- }
-
- prog := ssautil.CreateProgram(iprog, 0 /*|ssa.PrintFunctions*/)
- mainInfo := iprog.Created[0]
- mainPkg := prog.Package(mainInfo.Pkg)
- mainPkg.SetDebugMode(true)
- mainPkg.Build()
-
- var varIds []*ast.Ident
- var varObjs []*types.Var
- for id, obj := range mainInfo.Defs {
- // Check invariants for func and const objects.
- switch obj := obj.(type) {
- case *types.Func:
- checkFuncValue(t, prog, obj)
-
- case *types.Const:
- checkConstValue(t, prog, obj)
-
- case *types.Var:
- if id.Name == "_" {
- continue
- }
- varIds = append(varIds, id)
- varObjs = append(varObjs, obj)
- }
- }
- for id, obj := range mainInfo.Uses {
- if obj, ok := obj.(*types.Var); ok {
- varIds = append(varIds, id)
- varObjs = append(varObjs, obj)
- }
- }
-
- // Check invariants for var objects.
- // The result varies based on the specific Ident.
- for i, id := range varIds {
- obj := varObjs[i]
- ref, _ := astutil.PathEnclosingInterval(f, id.Pos(), id.Pos())
- pos := prog.Fset.Position(id.Pos())
- exp := expectations[fmt.Sprintf("%s:%d", id.Name, pos.Line)]
- if exp == "" {
- t.Errorf("%s: no expectation for var ident %s ", pos, id.Name)
- continue
- }
- wantAddr := false
- if exp[0] == '&' {
- wantAddr = true
- exp = exp[1:]
- }
- checkVarValue(t, prog, mainPkg, ref, obj, exp, wantAddr)
- }
-}
-
-func checkFuncValue(t *testing.T, prog *ssa.Program, obj *types.Func) {
- fn := prog.FuncValue(obj)
- // fmt.Printf("FuncValue(%s) = %s\n", obj, fn) // debugging
- if fn == nil {
- if obj.Name() != "interfaceMethod" {
- t.Errorf("FuncValue(%s) == nil", obj)
- }
- return
- }
- if fnobj := fn.Object(); fnobj != obj {
- t.Errorf("FuncValue(%s).Object() == %s; value was %s",
- obj, fnobj, fn.Name())
- return
- }
- if !types.Identical(fn.Type(), obj.Type()) {
- t.Errorf("FuncValue(%s).Type() == %s", obj, fn.Type())
- return
- }
-}
-
-func checkConstValue(t *testing.T, prog *ssa.Program, obj *types.Const) {
- c := prog.ConstValue(obj)
- // fmt.Printf("ConstValue(%s) = %s\n", obj, c) // debugging
- if c == nil {
- t.Errorf("ConstValue(%s) == nil", obj)
- return
- }
- if !types.Identical(c.Type(), obj.Type()) {
- t.Errorf("ConstValue(%s).Type() == %s", obj, c.Type())
- return
- }
- if obj.Name() != "nil" {
- if !exact.Compare(c.Value, token.EQL, obj.Val()) {
- t.Errorf("ConstValue(%s).Value (%s) != %s",
- obj, c.Value, obj.Val())
- return
- }
- }
-}
-
-func checkVarValue(t *testing.T, prog *ssa.Program, pkg *ssa.Package, ref []ast.Node, obj *types.Var, expKind string, wantAddr bool) {
- // The prefix of all assertions messages.
- prefix := fmt.Sprintf("VarValue(%s @ L%d)",
- obj, prog.Fset.Position(ref[0].Pos()).Line)
-
- v, gotAddr := prog.VarValue(obj, pkg, ref)
-
- // Kind is the concrete type of the ssa Value.
- gotKind := "nil"
- if v != nil {
- gotKind = fmt.Sprintf("%T", v)[len("*ssa."):]
- }
-
- // fmt.Printf("%s = %v (kind %q; expect %q) wantAddr=%t gotAddr=%t\n", prefix, v, gotKind, expKind, wantAddr, gotAddr) // debugging
-
- // Check the kinds match.
- // "nil" indicates expected failure (e.g. optimized away).
- if expKind != gotKind {
- t.Errorf("%s concrete type == %s, want %s", prefix, gotKind, expKind)
- }
-
- // Check the types match.
- // If wantAddr, the expected type is the object's address.
- if v != nil {
- expType := obj.Type()
- if wantAddr {
- expType = types.NewPointer(expType)
- if !gotAddr {
- t.Errorf("%s: got value, want address", prefix)
- }
- } else if gotAddr {
- t.Errorf("%s: got address, want value", prefix)
- }
- if !types.Identical(v.Type(), expType) {
- t.Errorf("%s.Type() == %s, want %s", prefix, v.Type(), expType)
- }
- }
-}
-
-// Ensure that, in debug mode, we can determine the ssa.Value
-// corresponding to every ast.Expr.
-func TestValueForExpr(t *testing.T) {
- testValueForExpr(t, "testdata/valueforexpr.go")
-}
-
-func testValueForExpr(t *testing.T, testfile string) {
- if runtime.GOOS == "android" {
- t.Skipf("no testdata dir on %s", runtime.GOOS)
- }
-
- conf := loader.Config{ParserMode: parser.ParseComments}
- f, err := conf.ParseFile(testfile, nil)
- if err != nil {
- t.Error(err)
- return
- }
- conf.CreateFromFiles("main", f)
-
- iprog, err := conf.Load()
- if err != nil {
- t.Error(err)
- return
- }
-
- mainInfo := iprog.Created[0]
-
- prog := ssautil.CreateProgram(iprog, 0)
- mainPkg := prog.Package(mainInfo.Pkg)
- mainPkg.SetDebugMode(true)
- mainPkg.Build()
-
- if false {
- // debugging
- for _, mem := range mainPkg.Members {
- if fn, ok := mem.(*ssa.Function); ok {
- fn.WriteTo(os.Stderr)
- }
- }
- }
-
- // Find the actual AST node for each canonical position.
- parenExprByPos := make(map[token.Pos]*ast.ParenExpr)
- ast.Inspect(f, func(n ast.Node) bool {
- if n != nil {
- if e, ok := n.(*ast.ParenExpr); ok {
- parenExprByPos[e.Pos()] = e
- }
- }
- return true
- })
-
- // Find all annotations of form /*@kind*/.
- for _, c := range f.Comments {
- text := strings.TrimSpace(c.Text())
- if text == "" || text[0] != '@' {
- continue
- }
- text = text[1:]
- pos := c.End() + 1
- position := prog.Fset.Position(pos)
- var e ast.Expr
- if target := parenExprByPos[pos]; target == nil {
- t.Errorf("%s: annotation doesn't precede ParenExpr: %q", position, text)
- continue
- } else {
- e = target.X
- }
-
- path, _ := astutil.PathEnclosingInterval(f, pos, pos)
- if path == nil {
- t.Errorf("%s: can't find AST path from root to comment: %s", position, text)
- continue
- }
-
- fn := ssa.EnclosingFunction(mainPkg, path)
- if fn == nil {
- t.Errorf("%s: can't find enclosing function", position)
- continue
- }
-
- v, gotAddr := fn.ValueForExpr(e) // (may be nil)
- got := strings.TrimPrefix(fmt.Sprintf("%T", v), "*ssa.")
- if want := text; got != want {
- t.Errorf("%s: got value %q, want %q", position, got, want)
- }
- if v != nil {
- T := v.Type()
- if gotAddr {
- T = T.Underlying().(*types.Pointer).Elem() // deref
- }
- if !types.Identical(T, mainInfo.TypeOf(e)) {
- t.Errorf("%s: got type %s, want %s", position, mainInfo.TypeOf(e), T)
- }
- }
- }
-}
-
-// findInterval parses input and returns the [start, end) positions of
-// the first occurrence of substr in input. f==nil indicates failure;
-// an error has already been reported in that case.
-//
-func findInterval(t *testing.T, fset *token.FileSet, input, substr string) (f *ast.File, start, end token.Pos) {
- f, err := parser.ParseFile(fset, " ", input, 0)
- if err != nil {
- t.Errorf("parse error: %s", err)
- return
- }
-
- i := strings.Index(input, substr)
- if i < 0 {
- t.Errorf("%q is not a substring of input", substr)
- f = nil
- return
- }
-
- filePos := fset.File(f.Package)
- return f, filePos.Pos(i), filePos.Pos(i + len(substr))
-}
-
-func TestEnclosingFunction(t *testing.T) {
- tests := []struct {
- input string // the input file
- substr string // first occurrence of this string denotes interval
- fn string // name of expected containing function
- }{
- // We use distinctive numbers as syntactic landmarks.
-
- // Ordinary function:
- {`package main
- func f() { println(1003) }`,
- "100", "main.f"},
- // Methods:
- {`package main
- type T int
- func (t T) f() { println(200) }`,
- "200", "(main.T).f"},
- // Function literal:
- {`package main
- func f() { println(func() { print(300) }) }`,
- "300", "main.f$1"},
- // Doubly nested
- {`package main
- func f() { println(func() { print(func() { print(350) })})}`,
- "350", "main.f$1$1"},
- // Implicit init for package-level var initializer.
- {"package main; var a = 400", "400", "main.init"},
- // No code for constants:
- {"package main; const a = 500", "500", "(none)"},
- // Explicit init()
- {"package main; func init() { println(600) }", "600", "main.init#1"},
- // Multiple explicit init functions:
- {`package main
- func init() { println("foo") }
- func init() { println(800) }`,
- "800", "main.init#2"},
- // init() containing FuncLit.
- {`package main
- func init() { println(func(){print(900)}) }`,
- "900", "main.init#1$1"},
- }
- for _, test := range tests {
- conf := loader.Config{Fset: token.NewFileSet()}
- f, start, end := findInterval(t, conf.Fset, test.input, test.substr)
- if f == nil {
- continue
- }
- path, exact := astutil.PathEnclosingInterval(f, start, end)
- if !exact {
- t.Errorf("EnclosingFunction(%q) not exact", test.substr)
- continue
- }
-
- conf.CreateFromFiles("main", f)
-
- iprog, err := conf.Load()
- if err != nil {
- t.Error(err)
- continue
- }
- prog := ssautil.CreateProgram(iprog, 0)
- pkg := prog.Package(iprog.Created[0].Pkg)
- pkg.Build()
-
- name := "(none)"
- fn := ssa.EnclosingFunction(pkg, path)
- if fn != nil {
- name = fn.String()
- }
-
- if name != test.fn {
- t.Errorf("EnclosingFunction(%q in %q) got %s, want %s",
- test.substr, test.input, name, test.fn)
- continue
- }
-
- // While we're here: test HasEnclosingFunction.
- if has := ssa.HasEnclosingFunction(pkg, path); has != (fn != nil) {
- t.Errorf("HasEnclosingFunction(%q in %q) got %v, want %v",
- test.substr, test.input, has, fn != nil)
- continue
- }
- }
-}
diff --git a/vendor/golang.org/x/tools/go/ssa/ssa.go b/vendor/golang.org/x/tools/go/ssa/ssa.go
deleted file mode 100644
index e8350f1..0000000
--- a/vendor/golang.org/x/tools/go/ssa/ssa.go
+++ /dev/null
@@ -1,1696 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package ssa
-
-// This package defines a high-level intermediate representation for
-// Go programs using static single-assignment (SSA) form.
-
-import (
- "fmt"
- "go/ast"
- exact "go/constant"
- "go/token"
- "go/types"
- "sync"
-
- "golang.org/x/tools/go/types/typeutil"
-)
-
-// A Program is a partial or complete Go program converted to SSA form.
-type Program struct {
- Fset *token.FileSet // position information for the files of this Program
- imported map[string]*Package // all importable Packages, keyed by import path
- packages map[*types.Package]*Package // all loaded Packages, keyed by object
- mode BuilderMode // set of mode bits for SSA construction
- MethodSets typeutil.MethodSetCache // cache of type-checker's method-sets
-
- methodsMu sync.Mutex // guards the following maps:
- methodSets typeutil.Map // maps type to its concrete methodSet
- runtimeTypes typeutil.Map // types for which rtypes are needed
- canon typeutil.Map // type canonicalization map
- bounds map[*types.Func]*Function // bounds for curried x.Method closures
- thunks map[selectionKey]*Function // thunks for T.Method expressions
-}
-
-// A Package is a single analyzed Go package containing Members for
-// all package-level functions, variables, constants and types it
-// declares. These may be accessed directly via Members, or via the
-// type-specific accessor methods Func, Type, Var and Const.
-//
-// Members also contains entries for "init" (the synthetic package
-// initializer) and "init#%d", the nth declared init function,
-// and unspecified other things too.
-//
-type Package struct {
- Prog *Program // the owning program
- Pkg *types.Package // the corresponding go/types.Package
- Members map[string]Member // all package members keyed by name (incl. init and init#%d)
- values map[types.Object]Value // package members (incl. types and methods), keyed by object
- init *Function // Func("init"); the package's init function
- debug bool // include full debug info in this package
-
- // The following fields are set transiently, then cleared
- // after building.
- buildOnce sync.Once // ensures package building occurs once
- ninit int32 // number of init functions
- info *types.Info // package type information
- files []*ast.File // package ASTs
-}
-
-// A Member is a member of a Go package, implemented by *NamedConst,
-// *Global, *Function, or *Type; they are created by package-level
-// const, var, func and type declarations respectively.
-//
-type Member interface {
- Name() string // declared name of the package member
- String() string // package-qualified name of the package member
- RelString(*types.Package) string // like String, but relative refs are unqualified
- Object() types.Object // typechecker's object for this member, if any
- Pos() token.Pos // position of member's declaration, if known
- Type() types.Type // type of the package member
- Token() token.Token // token.{VAR,FUNC,CONST,TYPE}
- Package() *Package // the containing package
-}
-
-// A Type is a Member of a Package representing a package-level named type.
-type Type struct {
- object *types.TypeName
- pkg *Package
-}
-
-// A NamedConst is a Member of a Package representing a package-level
-// named constant.
-//
-// Pos() returns the position of the declaring ast.ValueSpec.Names[*]
-// identifier.
-//
-// NB: a NamedConst is not a Value; it contains a constant Value, which
-// it augments with the name and position of its 'const' declaration.
-//
-type NamedConst struct {
- object *types.Const
- Value *Const
- pkg *Package
-}
-
-// A Value is an SSA value that can be referenced by an instruction.
-type Value interface {
- // Name returns the name of this value, and determines how
- // this Value appears when used as an operand of an
- // Instruction.
- //
- // This is the same as the source name for Parameters,
- // Builtins, Functions, FreeVars, Globals.
- // For constants, it is a representation of the constant's value
- // and type. For all other Values this is the name of the
- // virtual register defined by the instruction.
- //
- // The name of an SSA Value is not semantically significant,
- // and may not even be unique within a function.
- Name() string
-
- // If this value is an Instruction, String returns its
- // disassembled form; otherwise it returns unspecified
- // human-readable information about the Value, such as its
- // kind, name and type.
- String() string
-
- // Type returns the type of this value. Many instructions
- // (e.g. IndexAddr) change their behaviour depending on the
- // types of their operands.
- Type() types.Type
-
- // Parent returns the function to which this Value belongs.
- // It returns nil for named Functions, Builtin, Const and Global.
- Parent() *Function
-
- // Referrers returns the list of instructions that have this
- // value as one of their operands; it may contain duplicates
- // if an instruction has a repeated operand.
- //
- // Referrers actually returns a pointer through which the
- // caller may perform mutations to the object's state.
- //
- // Referrers is currently only defined if Parent()!=nil,
- // i.e. for the function-local values FreeVar, Parameter,
- // Functions (iff anonymous) and all value-defining instructions.
- // It returns nil for named Functions, Builtin, Const and Global.
- //
- // Instruction.Operands contains the inverse of this relation.
- Referrers() *[]Instruction
-
- // Pos returns the location of the AST token most closely
- // associated with the operation that gave rise to this value,
- // or token.NoPos if it was not explicit in the source.
- //
- // For each ast.Node type, a particular token is designated as
- // the closest location for the expression, e.g. the Lparen
- // for an *ast.CallExpr. This permits a compact but
- // approximate mapping from Values to source positions for use
- // in diagnostic messages, for example.
- //
- // (Do not use this position to determine which Value
- // corresponds to an ast.Expr; use Function.ValueForExpr
- // instead. NB: it requires that the function was built with
- // debug information.)
- Pos() token.Pos
-}
-
-// An Instruction is an SSA instruction that computes a new Value or
-// has some effect.
-//
-// An Instruction that defines a value (e.g. BinOp) also implements
-// the Value interface; an Instruction that only has an effect (e.g. Store)
-// does not.
-//
-type Instruction interface {
- // String returns the disassembled form of this value.
- //
- // Examples of Instructions that are Values:
- // "x + y" (BinOp)
- // "len([])" (Call)
- // Note that the name of the Value is not printed.
- //
- // Examples of Instructions that are not Values:
- // "return x" (Return)
- // "*y = x" (Store)
- //
- // (The separation Value.Name() from Value.String() is useful
- // for some analyses which distinguish the operation from the
- // value it defines, e.g., 'y = local int' is both an allocation
- // of memory 'local int' and a definition of a pointer y.)
- String() string
-
- // Parent returns the function to which this instruction
- // belongs.
- Parent() *Function
-
- // Block returns the basic block to which this instruction
- // belongs.
- Block() *BasicBlock
-
- // setBlock sets the basic block to which this instruction belongs.
- setBlock(*BasicBlock)
-
- // Operands returns the operands of this instruction: the
- // set of Values it references.
- //
- // Specifically, it appends their addresses to rands, a
- // user-provided slice, and returns the resulting slice,
- // permitting avoidance of memory allocation.
- //
- // The operands are appended in undefined order, but the order
- // is consistent for a given Instruction; the addresses are
- // always non-nil but may point to a nil Value. Clients may
- // store through the pointers, e.g. to effect a value
- // renaming.
- //
- // Value.Referrers is a subset of the inverse of this
- // relation. (Referrers are not tracked for all types of
- // Values.)
- Operands(rands []*Value) []*Value
-
- // Pos returns the location of the AST token most closely
- // associated with the operation that gave rise to this
- // instruction, or token.NoPos if it was not explicit in the
- // source.
- //
- // For each ast.Node type, a particular token is designated as
- // the closest location for the expression, e.g. the Go token
- // for an *ast.GoStmt. This permits a compact but approximate
- // mapping from Instructions to source positions for use in
- // diagnostic messages, for example.
- //
- // (Do not use this position to determine which Instruction
- // corresponds to an ast.Expr; see the notes for Value.Pos.
- // This position may be used to determine which non-Value
- // Instruction corresponds to some ast.Stmts, but not all: If
- // and Jump instructions have no Pos(), for example.)
- Pos() token.Pos
-}
-
-// A Node is a node in the SSA value graph. Every concrete type that
-// implements Node is also either a Value, an Instruction, or both.
-//
-// Node contains the methods common to Value and Instruction, plus the
-// Operands and Referrers methods generalized to return nil for
-// non-Instructions and non-Values, respectively.
-//
-// Node is provided to simplify SSA graph algorithms. Clients should
-// use the more specific and informative Value or Instruction
-// interfaces where appropriate.
-//
-type Node interface {
- // Common methods:
- String() string
- Pos() token.Pos
- Parent() *Function
-
- // Partial methods:
- Operands(rands []*Value) []*Value // nil for non-Instructions
- Referrers() *[]Instruction // nil for non-Values
-}
-
-// Function represents the parameters, results, and code of a function
-// or method.
-//
-// If Blocks is nil, this indicates an external function for which no
-// Go source code is available. In this case, FreeVars and Locals
-// are nil too. Clients performing whole-program analysis must
-// handle external functions specially.
-//
-// Blocks contains the function's control-flow graph (CFG).
-// Blocks[0] is the function entry point; block order is not otherwise
-// semantically significant, though it may affect the readability of
-// the disassembly.
-// To iterate over the blocks in dominance order, use DomPreorder().
-//
-// Recover is an optional second entry point to which control resumes
-// after a recovered panic. The Recover block may contain only a return
-// statement, preceded by a load of the function's named return
-// parameters, if any.
-//
-// A nested function (Parent()!=nil) that refers to one or more
-// lexically enclosing local variables ("free variables") has FreeVars.
-// Such functions cannot be called directly but require a
-// value created by MakeClosure which, via its Bindings, supplies
-// values for these parameters.
-//
-// If the function is a method (Signature.Recv() != nil) then the first
-// element of Params is the receiver parameter.
-//
-// A Go package may declare many functions called "init".
-// For each one, Object().Name() returns "init" but Name() returns
-// "init#1", etc, in declaration order.
-//
-// Pos() returns the declaring ast.FuncLit.Type.Func or the position
-// of the ast.FuncDecl.Name, if the function was explicit in the
-// source. Synthetic wrappers, for which Synthetic != "", may share
-// the same position as the function they wrap.
-// Syntax.Pos() always returns the position of the declaring "func" token.
-//
-// Type() returns the function's Signature.
-//
-type Function struct {
- name string
- object types.Object // a declared *types.Func or one of its wrappers
- method *types.Selection // info about provenance of synthetic methods
- Signature *types.Signature
- pos token.Pos
-
- Synthetic string // provenance of synthetic function; "" for true source functions
- syntax ast.Node // *ast.Func{Decl,Lit}; replaced with simple ast.Node after build, unless debug mode
- parent *Function // enclosing function if anon; nil if global
- Pkg *Package // enclosing package; nil for shared funcs (wrappers and error.Error)
- Prog *Program // enclosing program
- Params []*Parameter // function parameters; for methods, includes receiver
- FreeVars []*FreeVar // free variables whose values must be supplied by closure
- Locals []*Alloc // local variables of this function
- Blocks []*BasicBlock // basic blocks of the function; nil => external
- Recover *BasicBlock // optional; control transfers here after recovered panic
- AnonFuncs []*Function // anonymous functions directly beneath this one
- referrers []Instruction // referring instructions (iff Parent() != nil)
-
- // The following fields are set transiently during building,
- // then cleared.
- currentBlock *BasicBlock // where to emit code
- objects map[types.Object]Value // addresses of local variables
- namedResults []*Alloc // tuple of named results
- targets *targets // linked stack of branch targets
- lblocks map[*ast.Object]*lblock // labelled blocks
-}
-
-// BasicBlock represents an SSA basic block.
-//
-// The final element of Instrs is always an explicit transfer of
-// control (If, Jump, Return, or Panic).
-//
-// A block may contain no Instructions only if it is unreachable,
-// i.e., Preds is nil. Empty blocks are typically pruned.
-//
-// BasicBlocks and their Preds/Succs relation form a (possibly cyclic)
-// graph independent of the SSA Value graph: the control-flow graph or
-// CFG. It is illegal for multiple edges to exist between the same
-// pair of blocks.
-//
-// Each BasicBlock is also a node in the dominator tree of the CFG.
-// The tree may be navigated using Idom()/Dominees() and queried using
-// Dominates().
-//
-// The order of Preds and Succs is significant (to Phi and If
-// instructions, respectively).
-//
-type BasicBlock struct {
- Index int // index of this block within Parent().Blocks
- Comment string // optional label; no semantic significance
- parent *Function // parent function
- Instrs []Instruction // instructions in order
- Preds, Succs []*BasicBlock // predecessors and successors
- succs2 [2]*BasicBlock // initial space for Succs
- dom domInfo // dominator tree info
- gaps int // number of nil Instrs (transient)
- rundefers int // number of rundefers (transient)
-}
-
-// Pure values ----------------------------------------
-
-// A FreeVar represents a free variable of the function to which it
-// belongs.
-//
-// FreeVars are used to implement anonymous functions, whose free
-// variables are lexically captured in a closure formed by
-// MakeClosure. The value of such a free var is an Alloc or another
-// FreeVar and is considered a potentially escaping heap address, with
-// pointer type.
-//
-// FreeVars are also used to implement bound method closures. Such a
-// free var represents the receiver value and may be of any type that
-// has concrete methods.
-//
-// Pos() returns the position of the value that was captured, which
-// belongs to an enclosing function.
-//
-type FreeVar struct {
- name string
- typ types.Type
- pos token.Pos
- parent *Function
- referrers []Instruction
-
- // Transiently needed during building.
- outer Value // the Value captured from the enclosing context.
-}
-
-// A Parameter represents an input parameter of a function.
-//
-type Parameter struct {
- name string
- object types.Object // a *types.Var; nil for non-source locals
- typ types.Type
- pos token.Pos
- parent *Function
- referrers []Instruction
-}
-
-// A Const represents the value of a constant expression.
-//
-// The underlying type of a constant may be any boolean, numeric, or
-// string type. In addition, a Const may represent the nil value of
-// any reference type---interface, map, channel, pointer, slice, or
-// function---but not "untyped nil".
-//
-// All source-level constant expressions are represented by a Const
-// of the same type and value.
-//
-// Value holds the exact value of the constant, independent of its
-// Type(), using the same representation as package go/exact uses for
-// constants, or nil for a typed nil value.
-//
-// Pos() returns token.NoPos.
-//
-// Example printed form:
-// 42:int
-// "hello":untyped string
-// 3+4i:MyComplex
-//
-type Const struct {
- typ types.Type
- Value exact.Value
-}
-
-// A Global is a named Value holding the address of a package-level
-// variable.
-//
-// Pos() returns the position of the ast.ValueSpec.Names[*]
-// identifier.
-//
-type Global struct {
- name string
- object types.Object // a *types.Var; may be nil for synthetics e.g. init$guard
- typ types.Type
- pos token.Pos
-
- Pkg *Package
-}
-
-// A Builtin represents a specific use of a built-in function, e.g. len.
-//
-// Builtins are immutable values. Builtins do not have addresses.
-// Builtins can only appear in CallCommon.Func.
-//
-// Name() indicates the function: one of the built-in functions from the
-// Go spec (excluding "make" and "new") or one of these ssa-defined
-// intrinsics:
-//
-// // wrapnilchk returns ptr if non-nil, panics otherwise.
-// // (For use in indirection wrappers.)
-// func ssa:wrapnilchk(ptr *T, recvType, methodName string) *T
-//
-// Object() returns a *types.Builtin for built-ins defined by the spec,
-// nil for others.
-//
-// Type() returns a *types.Signature representing the effective
-// signature of the built-in for this call.
-//
-type Builtin struct {
- name string
- sig *types.Signature
-}
-
-// Value-defining instructions ----------------------------------------
-
-// The Alloc instruction reserves space for a variable of the given type,
-// zero-initializes it, and yields its address.
-//
-// Alloc values are always addresses, and have pointer types, so the
-// type of the allocated variable is actually
-// Type().Underlying().(*types.Pointer).Elem().
-//
-// If Heap is false, Alloc allocates space in the function's
-// activation record (frame); we refer to an Alloc(Heap=false) as a
-// "local" alloc. Each local Alloc returns the same address each time
-// it is executed within the same activation; the space is
-// re-initialized to zero.
-//
-// If Heap is true, Alloc allocates space in the heap; we
-// refer to an Alloc(Heap=true) as a "new" alloc. Each new Alloc
-// returns a different address each time it is executed.
-//
-// When Alloc is applied to a channel, map or slice type, it returns
-// the address of an uninitialized (nil) reference of that kind; store
-// the result of MakeSlice, MakeMap or MakeChan in that location to
-// instantiate these types.
-//
-// Pos() returns the ast.CompositeLit.Lbrace for a composite literal,
-// or the ast.CallExpr.Rparen for a call to new() or for a call that
-// allocates a varargs slice.
-//
-// Example printed form:
-// t0 = local int
-// t1 = new int
-//
-type Alloc struct {
- register
- Comment string
- Heap bool
- index int // dense numbering; for lifting
-}
-
-// The Phi instruction represents an SSA φ-node, which combines values
-// that differ across incoming control-flow edges and yields a new
-// value. Within a block, all φ-nodes must appear before all non-φ
-// nodes.
-//
-// Pos() returns the position of the && or || for short-circuit
-// control-flow joins, or that of the *Alloc for φ-nodes inserted
-// during SSA renaming.
-//
-// Example printed form:
-// t2 = phi [0: t0, 1: t1]
-//
-type Phi struct {
- register
- Comment string // a hint as to its purpose
- Edges []Value // Edges[i] is value for Block().Preds[i]
-}
-
-// The Call instruction represents a function or method call.
-//
-// The Call instruction yields the function result if there is exactly
-// one. Otherwise it returns a tuple, the components of which are
-// accessed via Extract.
-//
-// See CallCommon for generic function call documentation.
-//
-// Pos() returns the ast.CallExpr.Lparen, if explicit in the source.
-//
-// Example printed form:
-// t2 = println(t0, t1)
-// t4 = t3()
-// t7 = invoke t5.Println(...t6)
-//
-type Call struct {
- register
- Call CallCommon
-}
-
-// The BinOp instruction yields the result of binary operation X Op Y.
-//
-// Pos() returns the ast.BinaryExpr.OpPos, if explicit in the source.
-//
-// Example printed form:
-// t1 = t0 + 1:int
-//
-type BinOp struct {
- register
- // One of:
- // ADD SUB MUL QUO REM + - * / %
- // AND OR XOR SHL SHR AND_NOT & | ^ << >> &~
- // EQL LSS GTR NEQ LEQ GEQ == != < <= < >=
- Op token.Token
- X, Y Value
-}
-
-// The UnOp instruction yields the result of Op X.
-// ARROW is channel receive.
-// MUL is pointer indirection (load).
-// XOR is bitwise complement.
-// SUB is negation.
-// NOT is logical negation.
-//
-// If CommaOk and Op=ARROW, the result is a 2-tuple of the value above
-// and a boolean indicating the success of the receive. The
-// components of the tuple are accessed using Extract.
-//
-// Pos() returns the ast.UnaryExpr.OpPos, if explicit in the source.
-// For receive operations (ARROW) implicit in ranging over a channel,
-// Pos() returns the ast.RangeStmt.For.
-// For implicit memory loads (STAR), Pos() returns the position of the
-// most closely associated source-level construct; the details are not
-// specified.
-//
-// Example printed form:
-// t0 = *x
-// t2 = <-t1,ok
-//
-type UnOp struct {
- register
- Op token.Token // One of: NOT SUB ARROW MUL XOR ! - <- * ^
- X Value
- CommaOk bool
-}
-
-// The ChangeType instruction applies to X a value-preserving type
-// change to Type().
-//
-// Type changes are permitted:
-// - between a named type and its underlying type.
-// - between two named types of the same underlying type.
-// - between (possibly named) pointers to identical base types.
-// - from a bidirectional channel to a read- or write-channel,
-// optionally adding/removing a name.
-//
-// This operation cannot fail dynamically.
-//
-// Pos() returns the ast.CallExpr.Lparen, if the instruction arose
-// from an explicit conversion in the source.
-//
-// Example printed form:
-// t1 = changetype *int <- IntPtr (t0)
-//
-type ChangeType struct {
- register
- X Value
-}
-
-// The Convert instruction yields the conversion of value X to type
-// Type(). One or both of those types is basic (but possibly named).
-//
-// A conversion may change the value and representation of its operand.
-// Conversions are permitted:
-// - between real numeric types.
-// - between complex numeric types.
-// - between string and []byte or []rune.
-// - between pointers and unsafe.Pointer.
-// - between unsafe.Pointer and uintptr.
-// - from (Unicode) integer to (UTF-8) string.
-// A conversion may imply a type name change also.
-//
-// This operation cannot fail dynamically.
-//
-// Conversions of untyped string/number/bool constants to a specific
-// representation are eliminated during SSA construction.
-//
-// Pos() returns the ast.CallExpr.Lparen, if the instruction arose
-// from an explicit conversion in the source.
-//
-// Example printed form:
-// t1 = convert []byte <- string (t0)
-//
-type Convert struct {
- register
- X Value
-}
-
-// ChangeInterface constructs a value of one interface type from a
-// value of another interface type known to be assignable to it.
-// This operation cannot fail.
-//
-// Pos() returns the ast.CallExpr.Lparen if the instruction arose from
-// an explicit T(e) conversion; the ast.TypeAssertExpr.Lparen if the
-// instruction arose from an explicit e.(T) operation; or token.NoPos
-// otherwise.
-//
-// Example printed form:
-// t1 = change interface interface{} <- I (t0)
-//
-type ChangeInterface struct {
- register
- X Value
-}
-
-// MakeInterface constructs an instance of an interface type from a
-// value of a concrete type.
-//
-// Use Program.MethodSets.MethodSet(X.Type()) to find the method-set
-// of X, and Program.Method(m) to find the implementation of a method.
-//
-// To construct the zero value of an interface type T, use:
-// NewConst(exact.MakeNil(), T, pos)
-//
-// Pos() returns the ast.CallExpr.Lparen, if the instruction arose
-// from an explicit conversion in the source.
-//
-// Example printed form:
-// t1 = make interface{} <- int (42:int)
-// t2 = make Stringer <- t0
-//
-type MakeInterface struct {
- register
- X Value
-}
-
-// The MakeClosure instruction yields a closure value whose code is
-// Fn and whose free variables' values are supplied by Bindings.
-//
-// Type() returns a (possibly named) *types.Signature.
-//
-// Pos() returns the ast.FuncLit.Type.Func for a function literal
-// closure or the ast.SelectorExpr.Sel for a bound method closure.
-//
-// Example printed form:
-// t0 = make closure anon@1.2 [x y z]
-// t1 = make closure bound$(main.I).add [i]
-//
-type MakeClosure struct {
- register
- Fn Value // always a *Function
- Bindings []Value // values for each free variable in Fn.FreeVars
-}
-
-// The MakeMap instruction creates a new hash-table-based map object
-// and yields a value of kind map.
-//
-// Type() returns a (possibly named) *types.Map.
-//
-// Pos() returns the ast.CallExpr.Lparen, if created by make(map), or
-// the ast.CompositeLit.Lbrack if created by a literal.
-//
-// Example printed form:
-// t1 = make map[string]int t0
-// t1 = make StringIntMap t0
-//
-type MakeMap struct {
- register
- Reserve Value // initial space reservation; nil => default
-}
-
-// The MakeChan instruction creates a new channel object and yields a
-// value of kind chan.
-//
-// Type() returns a (possibly named) *types.Chan.
-//
-// Pos() returns the ast.CallExpr.Lparen for the make(chan) that
-// created it.
-//
-// Example printed form:
-// t0 = make chan int 0
-// t0 = make IntChan 0
-//
-type MakeChan struct {
- register
- Size Value // int; size of buffer; zero => synchronous.
-}
-
-// The MakeSlice instruction yields a slice of length Len backed by a
-// newly allocated array of length Cap.
-//
-// Both Len and Cap must be non-nil Values of integer type.
-//
-// (Alloc(types.Array) followed by Slice will not suffice because
-// Alloc can only create arrays of constant length.)
-//
-// Type() returns a (possibly named) *types.Slice.
-//
-// Pos() returns the ast.CallExpr.Lparen for the make([]T) that
-// created it.
-//
-// Example printed form:
-// t1 = make []string 1:int t0
-// t1 = make StringSlice 1:int t0
-//
-type MakeSlice struct {
- register
- Len Value
- Cap Value
-}
-
-// The Slice instruction yields a slice of an existing string, slice
-// or *array X between optional integer bounds Low and High.
-//
-// Dynamically, this instruction panics if X evaluates to a nil *array
-// pointer.
-//
-// Type() returns string if the type of X was string, otherwise a
-// *types.Slice with the same element type as X.
-//
-// Pos() returns the ast.SliceExpr.Lbrack if created by a x[:] slice
-// operation, the ast.CompositeLit.Lbrace if created by a literal, or
-// NoPos if not explicit in the source (e.g. a variadic argument slice).
-//
-// Example printed form:
-// t1 = slice t0[1:]
-//
-type Slice struct {
- register
- X Value // slice, string, or *array
- Low, High, Max Value // each may be nil
-}
-
-// The FieldAddr instruction yields the address of Field of *struct X.
-//
-// The field is identified by its index within the field list of the
-// struct type of X.
-//
-// Dynamically, this instruction panics if X evaluates to a nil
-// pointer.
-//
-// Type() returns a (possibly named) *types.Pointer.
-//
-// Pos() returns the position of the ast.SelectorExpr.Sel for the
-// field, if explicit in the source.
-//
-// Example printed form:
-// t1 = &t0.name [#1]
-//
-type FieldAddr struct {
- register
- X Value // *struct
- Field int // index into X.Type().Deref().(*types.Struct).Fields
-}
-
-// The Field instruction yields the Field of struct X.
-//
-// The field is identified by its index within the field list of the
-// struct type of X; by using numeric indices we avoid ambiguity of
-// package-local identifiers and permit compact representations.
-//
-// Pos() returns the position of the ast.SelectorExpr.Sel for the
-// field, if explicit in the source.
-//
-// Example printed form:
-// t1 = t0.name [#1]
-//
-type Field struct {
- register
- X Value // struct
- Field int // index into X.Type().(*types.Struct).Fields
-}
-
-// The IndexAddr instruction yields the address of the element at
-// index Index of collection X. Index is an integer expression.
-//
-// The elements of maps and strings are not addressable; use Lookup or
-// MapUpdate instead.
-//
-// Dynamically, this instruction panics if X evaluates to a nil *array
-// pointer.
-//
-// Type() returns a (possibly named) *types.Pointer.
-//
-// Pos() returns the ast.IndexExpr.Lbrack for the index operation, if
-// explicit in the source.
-//
-// Example printed form:
-// t2 = &t0[t1]
-//
-type IndexAddr struct {
- register
- X Value // slice or *array,
- Index Value // numeric index
-}
-
-// The Index instruction yields element Index of array X.
-//
-// Pos() returns the ast.IndexExpr.Lbrack for the index operation, if
-// explicit in the source.
-//
-// Example printed form:
-// t2 = t0[t1]
-//
-type Index struct {
- register
- X Value // array
- Index Value // integer index
-}
-
-// The Lookup instruction yields element Index of collection X, a map
-// or string. Index is an integer expression if X is a string or the
-// appropriate key type if X is a map.
-//
-// If CommaOk, the result is a 2-tuple of the value above and a
-// boolean indicating the result of a map membership test for the key.
-// The components of the tuple are accessed using Extract.
-//
-// Pos() returns the ast.IndexExpr.Lbrack, if explicit in the source.
-//
-// Example printed form:
-// t2 = t0[t1]
-// t5 = t3[t4],ok
-//
-type Lookup struct {
- register
- X Value // string or map
- Index Value // numeric or key-typed index
- CommaOk bool // return a value,ok pair
-}
-
-// SelectState is a helper for Select.
-// It represents one goal state and its corresponding communication.
-//
-type SelectState struct {
- Dir types.ChanDir // direction of case (SendOnly or RecvOnly)
- Chan Value // channel to use (for send or receive)
- Send Value // value to send (for send)
- Pos token.Pos // position of token.ARROW
- DebugNode ast.Node // ast.SendStmt or ast.UnaryExpr(<-) [debug mode]
-}
-
-// The Select instruction tests whether (or blocks until) one
-// of the specified sent or received states is entered.
-//
-// Let n be the number of States for which Dir==RECV and T_i (0<=i string iterator; false => map iterator.
-}
-
-// The TypeAssert instruction tests whether interface value X has type
-// AssertedType.
-//
-// If !CommaOk, on success it returns v, the result of the conversion
-// (defined below); on failure it panics.
-//
-// If CommaOk: on success it returns a pair (v, true) where v is the
-// result of the conversion; on failure it returns (z, false) where z
-// is AssertedType's zero value. The components of the pair must be
-// accessed using the Extract instruction.
-//
-// If AssertedType is a concrete type, TypeAssert checks whether the
-// dynamic type in interface X is equal to it, and if so, the result
-// of the conversion is a copy of the value in the interface.
-//
-// If AssertedType is an interface, TypeAssert checks whether the
-// dynamic type of the interface is assignable to it, and if so, the
-// result of the conversion is a copy of the interface value X.
-// If AssertedType is a superinterface of X.Type(), the operation will
-// fail iff the operand is nil. (Contrast with ChangeInterface, which
-// performs no nil-check.)
-//
-// Type() reflects the actual type of the result, possibly a
-// 2-types.Tuple; AssertedType is the asserted type.
-//
-// Pos() returns the ast.CallExpr.Lparen if the instruction arose from
-// an explicit T(e) conversion; the ast.TypeAssertExpr.Lparen if the
-// instruction arose from an explicit e.(T) operation; or the
-// ast.CaseClause.Case if the instruction arose from a case of a
-// type-switch statement.
-//
-// Example printed form:
-// t1 = typeassert t0.(int)
-// t3 = typeassert,ok t2.(T)
-//
-type TypeAssert struct {
- register
- X Value
- AssertedType types.Type
- CommaOk bool
-}
-
-// The Extract instruction yields component Index of Tuple.
-//
-// This is used to access the results of instructions with multiple
-// return values, such as Call, TypeAssert, Next, UnOp(ARROW) and
-// IndexExpr(Map).
-//
-// Example printed form:
-// t1 = extract t0 #1
-//
-type Extract struct {
- register
- Tuple Value
- Index int
-}
-
-// Instructions executed for effect. They do not yield a value. --------------------
-
-// The Jump instruction transfers control to the sole successor of its
-// owning block.
-//
-// A Jump must be the last instruction of its containing BasicBlock.
-//
-// Pos() returns NoPos.
-//
-// Example printed form:
-// jump done
-//
-type Jump struct {
- anInstruction
-}
-
-// The If instruction transfers control to one of the two successors
-// of its owning block, depending on the boolean Cond: the first if
-// true, the second if false.
-//
-// An If instruction must be the last instruction of its containing
-// BasicBlock.
-//
-// Pos() returns NoPos.
-//
-// Example printed form:
-// if t0 goto done else body
-//
-type If struct {
- anInstruction
- Cond Value
-}
-
-// The Return instruction returns values and control back to the calling
-// function.
-//
-// len(Results) is always equal to the number of results in the
-// function's signature.
-//
-// If len(Results) > 1, Return returns a tuple value with the specified
-// components which the caller must access using Extract instructions.
-//
-// There is no instruction to return a ready-made tuple like those
-// returned by a "value,ok"-mode TypeAssert, Lookup or UnOp(ARROW) or
-// a tail-call to a function with multiple result parameters.
-//
-// Return must be the last instruction of its containing BasicBlock.
-// Such a block has no successors.
-//
-// Pos() returns the ast.ReturnStmt.Return, if explicit in the source.
-//
-// Example printed form:
-// return
-// return nil:I, 2:int
-//
-type Return struct {
- anInstruction
- Results []Value
- pos token.Pos
-}
-
-// The RunDefers instruction pops and invokes the entire stack of
-// procedure calls pushed by Defer instructions in this function.
-//
-// It is legal to encounter multiple 'rundefers' instructions in a
-// single control-flow path through a function; this is useful in
-// the combined init() function, for example.
-//
-// Pos() returns NoPos.
-//
-// Example printed form:
-// rundefers
-//
-type RunDefers struct {
- anInstruction
-}
-
-// The Panic instruction initiates a panic with value X.
-//
-// A Panic instruction must be the last instruction of its containing
-// BasicBlock, which must have no successors.
-//
-// NB: 'go panic(x)' and 'defer panic(x)' do not use this instruction;
-// they are treated as calls to a built-in function.
-//
-// Pos() returns the ast.CallExpr.Lparen if this panic was explicit
-// in the source.
-//
-// Example printed form:
-// panic t0
-//
-type Panic struct {
- anInstruction
- X Value // an interface{}
- pos token.Pos
-}
-
-// The Go instruction creates a new goroutine and calls the specified
-// function within it.
-//
-// See CallCommon for generic function call documentation.
-//
-// Pos() returns the ast.GoStmt.Go.
-//
-// Example printed form:
-// go println(t0, t1)
-// go t3()
-// go invoke t5.Println(...t6)
-//
-type Go struct {
- anInstruction
- Call CallCommon
- pos token.Pos
-}
-
-// The Defer instruction pushes the specified call onto a stack of
-// functions to be called by a RunDefers instruction or by a panic.
-//
-// See CallCommon for generic function call documentation.
-//
-// Pos() returns the ast.DeferStmt.Defer.
-//
-// Example printed form:
-// defer println(t0, t1)
-// defer t3()
-// defer invoke t5.Println(...t6)
-//
-type Defer struct {
- anInstruction
- Call CallCommon
- pos token.Pos
-}
-
-// The Send instruction sends X on channel Chan.
-//
-// Pos() returns the ast.SendStmt.Arrow, if explicit in the source.
-//
-// Example printed form:
-// send t0 <- t1
-//
-type Send struct {
- anInstruction
- Chan, X Value
- pos token.Pos
-}
-
-// The Store instruction stores Val at address Addr.
-// Stores can be of arbitrary types.
-//
-// Pos() returns the position of the source-level construct most closely
-// associated with the memory store operation.
-// Since implicit memory stores are numerous and varied and depend upon
-// implementation choices, the details are not specified.
-//
-// Example printed form:
-// *x = y
-//
-type Store struct {
- anInstruction
- Addr Value
- Val Value
- pos token.Pos
-}
-
-// The MapUpdate instruction updates the association of Map[Key] to
-// Value.
-//
-// Pos() returns the ast.KeyValueExpr.Colon or ast.IndexExpr.Lbrack,
-// if explicit in the source.
-//
-// Example printed form:
-// t0[t1] = t2
-//
-type MapUpdate struct {
- anInstruction
- Map Value
- Key Value
- Value Value
- pos token.Pos
-}
-
-// A DebugRef instruction maps a source-level expression Expr to the
-// SSA value X that represents the value (!IsAddr) or address (IsAddr)
-// of that expression.
-//
-// DebugRef is a pseudo-instruction: it has no dynamic effect.
-//
-// Pos() returns Expr.Pos(), the start position of the source-level
-// expression. This is not the same as the "designated" token as
-// documented at Value.Pos(). e.g. CallExpr.Pos() does not return the
-// position of the ("designated") Lparen token.
-//
-// If Expr is an *ast.Ident denoting a var or func, Object() returns
-// the object; though this information can be obtained from the type
-// checker, including it here greatly facilitates debugging.
-// For non-Ident expressions, Object() returns nil.
-//
-// DebugRefs are generated only for functions built with debugging
-// enabled; see Package.SetDebugMode() and the GlobalDebug builder
-// mode flag.
-//
-// DebugRefs are not emitted for ast.Idents referring to constants or
-// predeclared identifiers, since they are trivial and numerous.
-// Nor are they emitted for ast.ParenExprs.
-//
-// (By representing these as instructions, rather than out-of-band,
-// consistency is maintained during transformation passes by the
-// ordinary SSA renaming machinery.)
-//
-// Example printed form:
-// ; *ast.CallExpr @ 102:9 is t5
-// ; var x float64 @ 109:72 is x
-// ; address of *ast.CompositeLit @ 216:10 is t0
-//
-type DebugRef struct {
- anInstruction
- Expr ast.Expr // the referring expression (never *ast.ParenExpr)
- object types.Object // the identity of the source var/func
- IsAddr bool // Expr is addressable and X is the address it denotes
- X Value // the value or address of Expr
-}
-
-// Embeddable mix-ins and helpers for common parts of other structs. -----------
-
-// register is a mix-in embedded by all SSA values that are also
-// instructions, i.e. virtual registers, and provides a uniform
-// implementation of most of the Value interface: Value.Name() is a
-// numbered register (e.g. "t0"); the other methods are field accessors.
-//
-// Temporary names are automatically assigned to each register on
-// completion of building a function in SSA form.
-//
-// Clients must not assume that the 'id' value (and the Name() derived
-// from it) is unique within a function. As always in this API,
-// semantics are determined only by identity; names exist only to
-// facilitate debugging.
-//
-type register struct {
- anInstruction
- num int // "name" of virtual register, e.g. "t0". Not guaranteed unique.
- typ types.Type // type of virtual register
- pos token.Pos // position of source expression, or NoPos
- referrers []Instruction
-}
-
-// anInstruction is a mix-in embedded by all Instructions.
-// It provides the implementations of the Block and setBlock methods.
-type anInstruction struct {
- block *BasicBlock // the basic block of this instruction
-}
-
-// CallCommon is contained by Go, Defer and Call to hold the
-// common parts of a function or method call.
-//
-// Each CallCommon exists in one of two modes, function call and
-// interface method invocation, or "call" and "invoke" for short.
-//
-// 1. "call" mode: when Method is nil (!IsInvoke), a CallCommon
-// represents an ordinary function call of the value in Value,
-// which may be a *Builtin, a *Function or any other value of kind
-// 'func'.
-//
-// Value may be one of:
-// (a) a *Function, indicating a statically dispatched call
-// to a package-level function, an anonymous function, or
-// a method of a named type.
-// (b) a *MakeClosure, indicating an immediately applied
-// function literal with free variables.
-// (c) a *Builtin, indicating a statically dispatched call
-// to a built-in function.
-// (d) any other value, indicating a dynamically dispatched
-// function call.
-// StaticCallee returns the identity of the callee in cases
-// (a) and (b), nil otherwise.
-//
-// Args contains the arguments to the call. If Value is a method,
-// Args[0] contains the receiver parameter.
-//
-// Example printed form:
-// t2 = println(t0, t1)
-// go t3()
-// defer t5(...t6)
-//
-// 2. "invoke" mode: when Method is non-nil (IsInvoke), a CallCommon
-// represents a dynamically dispatched call to an interface method.
-// In this mode, Value is the interface value and Method is the
-// interface's abstract method. Note: an abstract method may be
-// shared by multiple interfaces due to embedding; Value.Type()
-// provides the specific interface used for this call.
-//
-// Value is implicitly supplied to the concrete method implementation
-// as the receiver parameter; in other words, Args[0] holds not the
-// receiver but the first true argument.
-//
-// Example printed form:
-// t1 = invoke t0.String()
-// go invoke t3.Run(t2)
-// defer invoke t4.Handle(...t5)
-//
-// For all calls to variadic functions (Signature().Variadic()),
-// the last element of Args is a slice.
-//
-type CallCommon struct {
- Value Value // receiver (invoke mode) or func value (call mode)
- Method *types.Func // abstract method (invoke mode)
- Args []Value // actual parameters (in static method call, includes receiver)
- pos token.Pos // position of CallExpr.Lparen, iff explicit in source
-}
-
-// IsInvoke returns true if this call has "invoke" (not "call") mode.
-func (c *CallCommon) IsInvoke() bool {
- return c.Method != nil
-}
-
-func (c *CallCommon) Pos() token.Pos { return c.pos }
-
-// Signature returns the signature of the called function.
-//
-// For an "invoke"-mode call, the signature of the interface method is
-// returned.
-//
-// In either "call" or "invoke" mode, if the callee is a method, its
-// receiver is represented by sig.Recv, not sig.Params().At(0).
-//
-func (c *CallCommon) Signature() *types.Signature {
- if c.Method != nil {
- return c.Method.Type().(*types.Signature)
- }
- return c.Value.Type().Underlying().(*types.Signature)
-}
-
-// StaticCallee returns the callee if this is a trivially static
-// "call"-mode call to a function.
-func (c *CallCommon) StaticCallee() *Function {
- switch fn := c.Value.(type) {
- case *Function:
- return fn
- case *MakeClosure:
- return fn.Fn.(*Function)
- }
- return nil
-}
-
-// Description returns a description of the mode of this call suitable
-// for a user interface, e.g., "static method call".
-func (c *CallCommon) Description() string {
- switch fn := c.Value.(type) {
- case *Builtin:
- return "built-in function call"
- case *MakeClosure:
- return "static function closure call"
- case *Function:
- if fn.Signature.Recv() != nil {
- return "static method call"
- }
- return "static function call"
- }
- if c.IsInvoke() {
- return "dynamic method call" // ("invoke" mode)
- }
- return "dynamic function call"
-}
-
-// The CallInstruction interface, implemented by *Go, *Defer and *Call,
-// exposes the common parts of function-calling instructions,
-// yet provides a way back to the Value defined by *Call alone.
-//
-type CallInstruction interface {
- Instruction
- Common() *CallCommon // returns the common parts of the call
- Value() *Call // returns the result value of the call (*Call) or nil (*Go, *Defer)
-}
-
-func (s *Call) Common() *CallCommon { return &s.Call }
-func (s *Defer) Common() *CallCommon { return &s.Call }
-func (s *Go) Common() *CallCommon { return &s.Call }
-
-func (s *Call) Value() *Call { return s }
-func (s *Defer) Value() *Call { return nil }
-func (s *Go) Value() *Call { return nil }
-
-func (v *Builtin) Type() types.Type { return v.sig }
-func (v *Builtin) Name() string { return v.name }
-func (*Builtin) Referrers() *[]Instruction { return nil }
-func (v *Builtin) Pos() token.Pos { return token.NoPos }
-func (v *Builtin) Object() types.Object { return types.Universe.Lookup(v.name) }
-func (v *Builtin) Parent() *Function { return nil }
-
-func (v *FreeVar) Type() types.Type { return v.typ }
-func (v *FreeVar) Name() string { return v.name }
-func (v *FreeVar) Referrers() *[]Instruction { return &v.referrers }
-func (v *FreeVar) Pos() token.Pos { return v.pos }
-func (v *FreeVar) Parent() *Function { return v.parent }
-
-func (v *Global) Type() types.Type { return v.typ }
-func (v *Global) Name() string { return v.name }
-func (v *Global) Parent() *Function { return nil }
-func (v *Global) Pos() token.Pos { return v.pos }
-func (v *Global) Referrers() *[]Instruction { return nil }
-func (v *Global) Token() token.Token { return token.VAR }
-func (v *Global) Object() types.Object { return v.object }
-func (v *Global) String() string { return v.RelString(nil) }
-func (v *Global) Package() *Package { return v.Pkg }
-func (v *Global) RelString(from *types.Package) string { return relString(v, from) }
-
-func (v *Function) Name() string { return v.name }
-func (v *Function) Type() types.Type { return v.Signature }
-func (v *Function) Pos() token.Pos { return v.pos }
-func (v *Function) Token() token.Token { return token.FUNC }
-func (v *Function) Object() types.Object { return v.object }
-func (v *Function) String() string { return v.RelString(nil) }
-func (v *Function) Package() *Package { return v.Pkg }
-func (v *Function) Parent() *Function { return v.parent }
-func (v *Function) Referrers() *[]Instruction {
- if v.parent != nil {
- return &v.referrers
- }
- return nil
-}
-
-func (v *Parameter) Type() types.Type { return v.typ }
-func (v *Parameter) Name() string { return v.name }
-func (v *Parameter) Object() types.Object { return v.object }
-func (v *Parameter) Referrers() *[]Instruction { return &v.referrers }
-func (v *Parameter) Pos() token.Pos { return v.pos }
-func (v *Parameter) Parent() *Function { return v.parent }
-
-func (v *Alloc) Type() types.Type { return v.typ }
-func (v *Alloc) Referrers() *[]Instruction { return &v.referrers }
-func (v *Alloc) Pos() token.Pos { return v.pos }
-
-func (v *register) Type() types.Type { return v.typ }
-func (v *register) setType(typ types.Type) { v.typ = typ }
-func (v *register) Name() string { return fmt.Sprintf("t%d", v.num) }
-func (v *register) setNum(num int) { v.num = num }
-func (v *register) Referrers() *[]Instruction { return &v.referrers }
-func (v *register) Pos() token.Pos { return v.pos }
-func (v *register) setPos(pos token.Pos) { v.pos = pos }
-
-func (v *anInstruction) Parent() *Function { return v.block.parent }
-func (v *anInstruction) Block() *BasicBlock { return v.block }
-func (v *anInstruction) setBlock(block *BasicBlock) { v.block = block }
-func (v *anInstruction) Referrers() *[]Instruction { return nil }
-
-func (t *Type) Name() string { return t.object.Name() }
-func (t *Type) Pos() token.Pos { return t.object.Pos() }
-func (t *Type) Type() types.Type { return t.object.Type() }
-func (t *Type) Token() token.Token { return token.TYPE }
-func (t *Type) Object() types.Object { return t.object }
-func (t *Type) String() string { return t.RelString(nil) }
-func (t *Type) Package() *Package { return t.pkg }
-func (t *Type) RelString(from *types.Package) string { return relString(t, from) }
-
-func (c *NamedConst) Name() string { return c.object.Name() }
-func (c *NamedConst) Pos() token.Pos { return c.object.Pos() }
-func (c *NamedConst) String() string { return c.RelString(nil) }
-func (c *NamedConst) Type() types.Type { return c.object.Type() }
-func (c *NamedConst) Token() token.Token { return token.CONST }
-func (c *NamedConst) Object() types.Object { return c.object }
-func (c *NamedConst) Package() *Package { return c.pkg }
-func (c *NamedConst) RelString(from *types.Package) string { return relString(c, from) }
-
-// Func returns the package-level function of the specified name,
-// or nil if not found.
-//
-func (p *Package) Func(name string) (f *Function) {
- f, _ = p.Members[name].(*Function)
- return
-}
-
-// Var returns the package-level variable of the specified name,
-// or nil if not found.
-//
-func (p *Package) Var(name string) (g *Global) {
- g, _ = p.Members[name].(*Global)
- return
-}
-
-// Const returns the package-level constant of the specified name,
-// or nil if not found.
-//
-func (p *Package) Const(name string) (c *NamedConst) {
- c, _ = p.Members[name].(*NamedConst)
- return
-}
-
-// Type returns the package-level type of the specified name,
-// or nil if not found.
-//
-func (p *Package) Type(name string) (t *Type) {
- t, _ = p.Members[name].(*Type)
- return
-}
-
-func (v *Call) Pos() token.Pos { return v.Call.pos }
-func (s *Defer) Pos() token.Pos { return s.pos }
-func (s *Go) Pos() token.Pos { return s.pos }
-func (s *MapUpdate) Pos() token.Pos { return s.pos }
-func (s *Panic) Pos() token.Pos { return s.pos }
-func (s *Return) Pos() token.Pos { return s.pos }
-func (s *Send) Pos() token.Pos { return s.pos }
-func (s *Store) Pos() token.Pos { return s.pos }
-func (s *If) Pos() token.Pos { return token.NoPos }
-func (s *Jump) Pos() token.Pos { return token.NoPos }
-func (s *RunDefers) Pos() token.Pos { return token.NoPos }
-func (s *DebugRef) Pos() token.Pos { return s.Expr.Pos() }
-
-// Operands.
-
-func (v *Alloc) Operands(rands []*Value) []*Value {
- return rands
-}
-
-func (v *BinOp) Operands(rands []*Value) []*Value {
- return append(rands, &v.X, &v.Y)
-}
-
-func (c *CallCommon) Operands(rands []*Value) []*Value {
- rands = append(rands, &c.Value)
- for i := range c.Args {
- rands = append(rands, &c.Args[i])
- }
- return rands
-}
-
-func (s *Go) Operands(rands []*Value) []*Value {
- return s.Call.Operands(rands)
-}
-
-func (s *Call) Operands(rands []*Value) []*Value {
- return s.Call.Operands(rands)
-}
-
-func (s *Defer) Operands(rands []*Value) []*Value {
- return s.Call.Operands(rands)
-}
-
-func (v *ChangeInterface) Operands(rands []*Value) []*Value {
- return append(rands, &v.X)
-}
-
-func (v *ChangeType) Operands(rands []*Value) []*Value {
- return append(rands, &v.X)
-}
-
-func (v *Convert) Operands(rands []*Value) []*Value {
- return append(rands, &v.X)
-}
-
-func (s *DebugRef) Operands(rands []*Value) []*Value {
- return append(rands, &s.X)
-}
-
-func (v *Extract) Operands(rands []*Value) []*Value {
- return append(rands, &v.Tuple)
-}
-
-func (v *Field) Operands(rands []*Value) []*Value {
- return append(rands, &v.X)
-}
-
-func (v *FieldAddr) Operands(rands []*Value) []*Value {
- return append(rands, &v.X)
-}
-
-func (s *If) Operands(rands []*Value) []*Value {
- return append(rands, &s.Cond)
-}
-
-func (v *Index) Operands(rands []*Value) []*Value {
- return append(rands, &v.X, &v.Index)
-}
-
-func (v *IndexAddr) Operands(rands []*Value) []*Value {
- return append(rands, &v.X, &v.Index)
-}
-
-func (*Jump) Operands(rands []*Value) []*Value {
- return rands
-}
-
-func (v *Lookup) Operands(rands []*Value) []*Value {
- return append(rands, &v.X, &v.Index)
-}
-
-func (v *MakeChan) Operands(rands []*Value) []*Value {
- return append(rands, &v.Size)
-}
-
-func (v *MakeClosure) Operands(rands []*Value) []*Value {
- rands = append(rands, &v.Fn)
- for i := range v.Bindings {
- rands = append(rands, &v.Bindings[i])
- }
- return rands
-}
-
-func (v *MakeInterface) Operands(rands []*Value) []*Value {
- return append(rands, &v.X)
-}
-
-func (v *MakeMap) Operands(rands []*Value) []*Value {
- return append(rands, &v.Reserve)
-}
-
-func (v *MakeSlice) Operands(rands []*Value) []*Value {
- return append(rands, &v.Len, &v.Cap)
-}
-
-func (v *MapUpdate) Operands(rands []*Value) []*Value {
- return append(rands, &v.Map, &v.Key, &v.Value)
-}
-
-func (v *Next) Operands(rands []*Value) []*Value {
- return append(rands, &v.Iter)
-}
-
-func (s *Panic) Operands(rands []*Value) []*Value {
- return append(rands, &s.X)
-}
-
-func (v *Phi) Operands(rands []*Value) []*Value {
- for i := range v.Edges {
- rands = append(rands, &v.Edges[i])
- }
- return rands
-}
-
-func (v *Range) Operands(rands []*Value) []*Value {
- return append(rands, &v.X)
-}
-
-func (s *Return) Operands(rands []*Value) []*Value {
- for i := range s.Results {
- rands = append(rands, &s.Results[i])
- }
- return rands
-}
-
-func (*RunDefers) Operands(rands []*Value) []*Value {
- return rands
-}
-
-func (v *Select) Operands(rands []*Value) []*Value {
- for i := range v.States {
- rands = append(rands, &v.States[i].Chan, &v.States[i].Send)
- }
- return rands
-}
-
-func (s *Send) Operands(rands []*Value) []*Value {
- return append(rands, &s.Chan, &s.X)
-}
-
-func (v *Slice) Operands(rands []*Value) []*Value {
- return append(rands, &v.X, &v.Low, &v.High, &v.Max)
-}
-
-func (s *Store) Operands(rands []*Value) []*Value {
- return append(rands, &s.Addr, &s.Val)
-}
-
-func (v *TypeAssert) Operands(rands []*Value) []*Value {
- return append(rands, &v.X)
-}
-
-func (v *UnOp) Operands(rands []*Value) []*Value {
- return append(rands, &v.X)
-}
-
-// Non-Instruction Values:
-func (v *Builtin) Operands(rands []*Value) []*Value { return rands }
-func (v *FreeVar) Operands(rands []*Value) []*Value { return rands }
-func (v *Const) Operands(rands []*Value) []*Value { return rands }
-func (v *Function) Operands(rands []*Value) []*Value { return rands }
-func (v *Global) Operands(rands []*Value) []*Value { return rands }
-func (v *Parameter) Operands(rands []*Value) []*Value { return rands }
diff --git a/vendor/golang.org/x/tools/go/ssa/ssautil/load.go b/vendor/golang.org/x/tools/go/ssa/ssautil/load.go
deleted file mode 100644
index 30b8053..0000000
--- a/vendor/golang.org/x/tools/go/ssa/ssautil/load.go
+++ /dev/null
@@ -1,95 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package ssautil
-
-// This file defines utility functions for constructing programs in SSA form.
-
-import (
- "go/ast"
- "go/token"
- "go/types"
-
- "golang.org/x/tools/go/loader"
- "golang.org/x/tools/go/ssa"
-)
-
-// CreateProgram returns a new program in SSA form, given a program
-// loaded from source. An SSA package is created for each transitively
-// error-free package of lprog.
-//
-// Code for bodies of functions is not built until Build is called
-// on the result.
-//
-// mode controls diagnostics and checking during SSA construction.
-//
-func CreateProgram(lprog *loader.Program, mode ssa.BuilderMode) *ssa.Program {
- prog := ssa.NewProgram(lprog.Fset, mode)
-
- for _, info := range lprog.AllPackages {
- if info.TransitivelyErrorFree {
- prog.CreatePackage(info.Pkg, info.Files, &info.Info, info.Importable)
- }
- }
-
- return prog
-}
-
-// BuildPackage builds an SSA program with IR for a single package.
-//
-// It populates pkg by type-checking the specified file ASTs. All
-// dependencies are loaded using the importer specified by tc, which
-// typically loads compiler export data; SSA code cannot be built for
-// those packages. BuildPackage then constructs an ssa.Program with all
-// dependency packages created, and builds and returns the SSA package
-// corresponding to pkg.
-//
-// The caller must have set pkg.Path() to the import path.
-//
-// The operation fails if there were any type-checking or import errors.
-//
-// See ../ssa/example_test.go for an example.
-//
-func BuildPackage(tc *types.Config, fset *token.FileSet, pkg *types.Package, files []*ast.File, mode ssa.BuilderMode) (*ssa.Package, *types.Info, error) {
- if fset == nil {
- panic("no token.FileSet")
- }
- if pkg.Path() == "" {
- panic("package has no import path")
- }
-
- info := &types.Info{
- Types: make(map[ast.Expr]types.TypeAndValue),
- Defs: make(map[*ast.Ident]types.Object),
- Uses: make(map[*ast.Ident]types.Object),
- Implicits: make(map[ast.Node]types.Object),
- Scopes: make(map[ast.Node]*types.Scope),
- Selections: make(map[*ast.SelectorExpr]*types.Selection),
- }
- if err := types.NewChecker(tc, fset, pkg, info).Files(files); err != nil {
- return nil, nil, err
- }
-
- prog := ssa.NewProgram(fset, mode)
-
- // Create SSA packages for all imports.
- // Order is not significant.
- created := make(map[*types.Package]bool)
- var createAll func(pkgs []*types.Package)
- createAll = func(pkgs []*types.Package) {
- for _, p := range pkgs {
- if !created[p] {
- created[p] = true
- prog.CreatePackage(p, nil, nil, true)
- createAll(p.Imports())
- }
- }
- }
- createAll(pkg.Imports())
-
- // Create and build the primary package.
- ssapkg := prog.CreatePackage(pkg, files, info, false)
- ssapkg.Build()
- return ssapkg, info, nil
-}
diff --git a/vendor/golang.org/x/tools/go/ssa/ssautil/load_test.go b/vendor/golang.org/x/tools/go/ssa/ssautil/load_test.go
deleted file mode 100644
index 8ccd463..0000000
--- a/vendor/golang.org/x/tools/go/ssa/ssautil/load_test.go
+++ /dev/null
@@ -1,64 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package ssautil_test
-
-import (
- "go/ast"
- "go/importer"
- "go/parser"
- "go/token"
- "go/types"
- "os"
- "testing"
-
- "golang.org/x/tools/go/ssa/ssautil"
-)
-
-const hello = `package main
-
-import "fmt"
-
-func main() {
- fmt.Println("Hello, world")
-}
-`
-
-func TestBuildPackage(t *testing.T) {
- // There is a more substantial test of BuildPackage and the
- // SSA program it builds in ../ssa/builder_test.go.
-
- fset := token.NewFileSet()
- f, err := parser.ParseFile(fset, "hello.go", hello, 0)
- if err != nil {
- t.Fatal(err)
- }
-
- pkg := types.NewPackage("hello", "")
- ssapkg, _, err := ssautil.BuildPackage(&types.Config{Importer: importer.Default()}, fset, pkg, []*ast.File{f}, 0)
- if err != nil {
- t.Fatal(err)
- }
- if pkg.Name() != "main" {
- t.Errorf("pkg.Name() = %s, want main", pkg.Name())
- }
- if ssapkg.Func("main") == nil {
- ssapkg.WriteTo(os.Stderr)
- t.Errorf("ssapkg has no main function")
- }
-}
-
-func TestBuildPackage_MissingImport(t *testing.T) {
- fset := token.NewFileSet()
- f, err := parser.ParseFile(fset, "bad.go", `package bad; import "missing"`, 0)
- if err != nil {
- t.Fatal(err)
- }
-
- pkg := types.NewPackage("bad", "")
- ssapkg, _, err := ssautil.BuildPackage(new(types.Config), fset, pkg, []*ast.File{f}, 0)
- if err == nil || ssapkg != nil {
- t.Fatal("BuildPackage succeeded unexpectedly")
- }
-}
diff --git a/vendor/golang.org/x/tools/go/ssa/ssautil/switch.go b/vendor/golang.org/x/tools/go/ssa/ssautil/switch.go
deleted file mode 100644
index db03bf5..0000000
--- a/vendor/golang.org/x/tools/go/ssa/ssautil/switch.go
+++ /dev/null
@@ -1,234 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package ssautil
-
-// This file implements discovery of switch and type-switch constructs
-// from low-level control flow.
-//
-// Many techniques exist for compiling a high-level switch with
-// constant cases to efficient machine code. The optimal choice will
-// depend on the data type, the specific case values, the code in the
-// body of each case, and the hardware.
-// Some examples:
-// - a lookup table (for a switch that maps constants to constants)
-// - a computed goto
-// - a binary tree
-// - a perfect hash
-// - a two-level switch (to partition constant strings by their first byte).
-
-import (
- "bytes"
- "fmt"
- "go/token"
- "go/types"
-
- "golang.org/x/tools/go/ssa"
-)
-
-// A ConstCase represents a single constant comparison.
-// It is part of a Switch.
-type ConstCase struct {
- Block *ssa.BasicBlock // block performing the comparison
- Body *ssa.BasicBlock // body of the case
- Value *ssa.Const // case comparand
-}
-
-// A TypeCase represents a single type assertion.
-// It is part of a Switch.
-type TypeCase struct {
- Block *ssa.BasicBlock // block performing the type assert
- Body *ssa.BasicBlock // body of the case
- Type types.Type // case type
- Binding ssa.Value // value bound by this case
-}
-
-// A Switch is a logical high-level control flow operation
-// (a multiway branch) discovered by analysis of a CFG containing
-// only if/else chains. It is not part of the ssa.Instruction set.
-//
-// One of ConstCases and TypeCases has length >= 2;
-// the other is nil.
-//
-// In a value switch, the list of cases may contain duplicate constants.
-// A type switch may contain duplicate types, or types assignable
-// to an interface type also in the list.
-// TODO(adonovan): eliminate such duplicates.
-//
-type Switch struct {
- Start *ssa.BasicBlock // block containing start of if/else chain
- X ssa.Value // the switch operand
- ConstCases []ConstCase // ordered list of constant comparisons
- TypeCases []TypeCase // ordered list of type assertions
- Default *ssa.BasicBlock // successor if all comparisons fail
-}
-
-func (sw *Switch) String() string {
- // We represent each block by the String() of its
- // first Instruction, e.g. "print(42:int)".
- var buf bytes.Buffer
- if sw.ConstCases != nil {
- fmt.Fprintf(&buf, "switch %s {\n", sw.X.Name())
- for _, c := range sw.ConstCases {
- fmt.Fprintf(&buf, "case %s: %s\n", c.Value, c.Body.Instrs[0])
- }
- } else {
- fmt.Fprintf(&buf, "switch %s.(type) {\n", sw.X.Name())
- for _, c := range sw.TypeCases {
- fmt.Fprintf(&buf, "case %s %s: %s\n",
- c.Binding.Name(), c.Type, c.Body.Instrs[0])
- }
- }
- if sw.Default != nil {
- fmt.Fprintf(&buf, "default: %s\n", sw.Default.Instrs[0])
- }
- fmt.Fprintf(&buf, "}")
- return buf.String()
-}
-
-// Switches examines the control-flow graph of fn and returns the
-// set of inferred value and type switches. A value switch tests an
-// ssa.Value for equality against two or more compile-time constant
-// values. Switches involving link-time constants (addresses) are
-// ignored. A type switch type-asserts an ssa.Value against two or
-// more types.
-//
-// The switches are returned in dominance order.
-//
-// The resulting switches do not necessarily correspond to uses of the
-// 'switch' keyword in the source: for example, a single source-level
-// switch statement with non-constant cases may result in zero, one or
-// many Switches, one per plural sequence of constant cases.
-// Switches may even be inferred from if/else- or goto-based control flow.
-// (In general, the control flow constructs of the source program
-// cannot be faithfully reproduced from the SSA representation.)
-//
-func Switches(fn *ssa.Function) []Switch {
- // Traverse the CFG in dominance order, so we don't
- // enter an if/else-chain in the middle.
- var switches []Switch
- seen := make(map[*ssa.BasicBlock]bool) // TODO(adonovan): opt: use ssa.blockSet
- for _, b := range fn.DomPreorder() {
- if x, k := isComparisonBlock(b); x != nil {
- // Block b starts a switch.
- sw := Switch{Start: b, X: x}
- valueSwitch(&sw, k, seen)
- if len(sw.ConstCases) > 1 {
- switches = append(switches, sw)
- }
- }
-
- if y, x, T := isTypeAssertBlock(b); y != nil {
- // Block b starts a type switch.
- sw := Switch{Start: b, X: x}
- typeSwitch(&sw, y, T, seen)
- if len(sw.TypeCases) > 1 {
- switches = append(switches, sw)
- }
- }
- }
- return switches
-}
-
-func valueSwitch(sw *Switch, k *ssa.Const, seen map[*ssa.BasicBlock]bool) {
- b := sw.Start
- x := sw.X
- for x == sw.X {
- if seen[b] {
- break
- }
- seen[b] = true
-
- sw.ConstCases = append(sw.ConstCases, ConstCase{
- Block: b,
- Body: b.Succs[0],
- Value: k,
- })
- b = b.Succs[1]
- if len(b.Instrs) > 2 {
- // Block b contains not just 'if x == k',
- // so it may have side effects that
- // make it unsafe to elide.
- break
- }
- if len(b.Preds) != 1 {
- // Block b has multiple predecessors,
- // so it cannot be treated as a case.
- break
- }
- x, k = isComparisonBlock(b)
- }
- sw.Default = b
-}
-
-func typeSwitch(sw *Switch, y ssa.Value, T types.Type, seen map[*ssa.BasicBlock]bool) {
- b := sw.Start
- x := sw.X
- for x == sw.X {
- if seen[b] {
- break
- }
- seen[b] = true
-
- sw.TypeCases = append(sw.TypeCases, TypeCase{
- Block: b,
- Body: b.Succs[0],
- Type: T,
- Binding: y,
- })
- b = b.Succs[1]
- if len(b.Instrs) > 4 {
- // Block b contains not just
- // {TypeAssert; Extract #0; Extract #1; If}
- // so it may have side effects that
- // make it unsafe to elide.
- break
- }
- if len(b.Preds) != 1 {
- // Block b has multiple predecessors,
- // so it cannot be treated as a case.
- break
- }
- y, x, T = isTypeAssertBlock(b)
- }
- sw.Default = b
-}
-
-// isComparisonBlock returns the operands (v, k) if a block ends with
-// a comparison v==k, where k is a compile-time constant.
-//
-func isComparisonBlock(b *ssa.BasicBlock) (v ssa.Value, k *ssa.Const) {
- if n := len(b.Instrs); n >= 2 {
- if i, ok := b.Instrs[n-1].(*ssa.If); ok {
- if binop, ok := i.Cond.(*ssa.BinOp); ok && binop.Block() == b && binop.Op == token.EQL {
- if k, ok := binop.Y.(*ssa.Const); ok {
- return binop.X, k
- }
- if k, ok := binop.X.(*ssa.Const); ok {
- return binop.Y, k
- }
- }
- }
- }
- return
-}
-
-// isTypeAssertBlock returns the operands (y, x, T) if a block ends with
-// a type assertion "if y, ok := x.(T); ok {".
-//
-func isTypeAssertBlock(b *ssa.BasicBlock) (y, x ssa.Value, T types.Type) {
- if n := len(b.Instrs); n >= 4 {
- if i, ok := b.Instrs[n-1].(*ssa.If); ok {
- if ext1, ok := i.Cond.(*ssa.Extract); ok && ext1.Block() == b && ext1.Index == 1 {
- if ta, ok := ext1.Tuple.(*ssa.TypeAssert); ok && ta.Block() == b {
- // hack: relies upon instruction ordering.
- if ext0, ok := b.Instrs[n-3].(*ssa.Extract); ok {
- return ext0, ta.X, ta.AssertedType
- }
- }
- }
- }
- }
- return
-}
diff --git a/vendor/golang.org/x/tools/go/ssa/ssautil/switch_test.go b/vendor/golang.org/x/tools/go/ssa/ssautil/switch_test.go
deleted file mode 100644
index a47dbef..0000000
--- a/vendor/golang.org/x/tools/go/ssa/ssautil/switch_test.go
+++ /dev/null
@@ -1,74 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// No testdata on Android.
-
-// +build !android
-
-package ssautil_test
-
-import (
- "go/parser"
- "strings"
- "testing"
-
- "golang.org/x/tools/go/loader"
- "golang.org/x/tools/go/ssa"
- "golang.org/x/tools/go/ssa/ssautil"
-)
-
-func TestSwitches(t *testing.T) {
- conf := loader.Config{ParserMode: parser.ParseComments}
- f, err := conf.ParseFile("testdata/switches.go", nil)
- if err != nil {
- t.Error(err)
- return
- }
-
- conf.CreateFromFiles("main", f)
- iprog, err := conf.Load()
- if err != nil {
- t.Error(err)
- return
- }
-
- prog := ssautil.CreateProgram(iprog, 0)
- mainPkg := prog.Package(iprog.Created[0].Pkg)
- mainPkg.Build()
-
- for _, mem := range mainPkg.Members {
- if fn, ok := mem.(*ssa.Function); ok {
- if fn.Synthetic != "" {
- continue // e.g. init()
- }
- // Each (multi-line) "switch" comment within
- // this function must match the printed form
- // of a ConstSwitch.
- var wantSwitches []string
- for _, c := range f.Comments {
- if fn.Syntax().Pos() <= c.Pos() && c.Pos() < fn.Syntax().End() {
- text := strings.TrimSpace(c.Text())
- if strings.HasPrefix(text, "switch ") {
- wantSwitches = append(wantSwitches, text)
- }
- }
- }
-
- switches := ssautil.Switches(fn)
- if len(switches) != len(wantSwitches) {
- t.Errorf("in %s, found %d switches, want %d", fn, len(switches), len(wantSwitches))
- }
- for i, sw := range switches {
- got := sw.String()
- if i >= len(wantSwitches) {
- continue
- }
- want := wantSwitches[i]
- if got != want {
- t.Errorf("in %s, found switch %d: got <<%s>>, want <<%s>>", fn, i, got, want)
- }
- }
- }
- }
-}
diff --git a/vendor/golang.org/x/tools/go/ssa/ssautil/testdata/switches.go b/vendor/golang.org/x/tools/go/ssa/ssautil/testdata/switches.go
deleted file mode 100644
index 8ab4c11..0000000
--- a/vendor/golang.org/x/tools/go/ssa/ssautil/testdata/switches.go
+++ /dev/null
@@ -1,357 +0,0 @@
-// +build ignore
-
-package main
-
-// This file is the input to TestSwitches in switch_test.go.
-// Each multiway conditional with constant or type cases (Switch)
-// discovered by Switches is printed, and compared with the
-// comments.
-//
-// The body of each case is printed as the value of its first
-// instruction.
-
-// -------- Value switches --------
-
-func SimpleSwitch(x, y int) {
- // switch x {
- // case 1:int: print(1:int)
- // case 2:int: print(23:int)
- // case 3:int: print(23:int)
- // case 4:int: print(3:int)
- // default: x == y
- // }
- switch x {
- case 1:
- print(1)
- case 2, 3:
- print(23)
- fallthrough
- case 4:
- print(3)
- default:
- print(4)
- case y:
- print(5)
- }
- print(6)
-}
-
-func four() int { return 4 }
-
-// A non-constant case makes a switch "impure", but its pure
-// cases form two separate switches.
-func SwitchWithNonConstantCase(x int) {
- // switch x {
- // case 1:int: print(1:int)
- // case 2:int: print(23:int)
- // case 3:int: print(23:int)
- // default: four()
- // }
-
- // switch x {
- // case 5:int: print(5:int)
- // case 6:int: print(6:int)
- // default: print("done":string)
- // }
- switch x {
- case 1:
- print(1)
- case 2, 3:
- print(23)
- case four():
- print(3)
- case 5:
- print(5)
- case 6:
- print(6)
- }
- print("done")
-}
-
-// Switches may be found even where the source
-// program doesn't have a switch statement.
-
-func ImplicitSwitches(x, y int) {
- // switch x {
- // case 1:int: print(12:int)
- // case 2:int: print(12:int)
- // default: x < 5:int
- // }
- if x == 1 || 2 == x || x < 5 {
- print(12)
- }
-
- // switch x {
- // case 3:int: print(34:int)
- // case 4:int: print(34:int)
- // default: x == y
- // }
- if x == 3 || 4 == x || x == y {
- print(34)
- }
-
- // Not a switch: no consistent variable.
- if x == 5 || y == 6 {
- print(56)
- }
-
- // Not a switch: only one constant comparison.
- if x == 7 || x == y {
- print(78)
- }
-}
-
-func IfElseBasedSwitch(x int) {
- // switch x {
- // case 1:int: print(1:int)
- // case 2:int: print(2:int)
- // default: print("else":string)
- // }
- if x == 1 {
- print(1)
- } else if x == 2 {
- print(2)
- } else {
- print("else")
- }
-}
-
-func GotoBasedSwitch(x int) {
- // switch x {
- // case 1:int: print(1:int)
- // case 2:int: print(2:int)
- // default: print("else":string)
- // }
- if x == 1 {
- goto L1
- }
- if x == 2 {
- goto L2
- }
- print("else")
-L1:
- print(1)
- goto end
-L2:
- print(2)
-end:
-}
-
-func SwitchInAForLoop(x int) {
- // switch x {
- // case 1:int: print(1:int)
- // case 2:int: print(2:int)
- // default: print("head":string)
- // }
-loop:
- for {
- print("head")
- switch x {
- case 1:
- print(1)
- break loop
- case 2:
- print(2)
- break loop
- }
- }
-}
-
-// This case is a switch in a for-loop, both constructed using goto.
-// As before, the default case points back to the block containing the
-// switch, but that's ok.
-func SwitchInAForLoopUsingGoto(x int) {
- // switch x {
- // case 1:int: print(1:int)
- // case 2:int: print(2:int)
- // default: print("head":string)
- // }
-loop:
- print("head")
- if x == 1 {
- goto L1
- }
- if x == 2 {
- goto L2
- }
- goto loop
-L1:
- print(1)
- goto end
-L2:
- print(2)
-end:
-}
-
-func UnstructuredSwitchInAForLoop(x int) {
- // switch x {
- // case 1:int: print(1:int)
- // case 2:int: x == 1:int
- // default: print("end":string)
- // }
- for {
- if x == 1 {
- print(1)
- return
- }
- if x == 2 {
- continue
- }
- break
- }
- print("end")
-}
-
-func CaseWithMultiplePreds(x int) {
- for {
- if x == 1 {
- print(1)
- return
- }
- loop:
- // This block has multiple predecessors,
- // so can't be treated as a switch case.
- if x == 2 {
- goto loop
- }
- break
- }
- print("end")
-}
-
-func DuplicateConstantsAreNotEliminated(x int) {
- // switch x {
- // case 1:int: print(1:int)
- // case 1:int: print("1a":string)
- // case 2:int: print(2:int)
- // default: return
- // }
- if x == 1 {
- print(1)
- } else if x == 1 { // duplicate => unreachable
- print("1a")
- } else if x == 2 {
- print(2)
- }
-}
-
-// Interface values (created by comparisons) are not constants,
-// so ConstSwitch.X is never of interface type.
-func MakeInterfaceIsNotAConstant(x interface{}) {
- if x == "foo" {
- print("foo")
- } else if x == 1 {
- print(1)
- }
-}
-
-func ZeroInitializedVarsAreConstants(x int) {
- // switch x {
- // case 0:int: print(1:int)
- // case 2:int: print(2:int)
- // default: print("end":string)
- // }
- var zero int // SSA construction replaces zero with 0
- if x == zero {
- print(1)
- } else if x == 2 {
- print(2)
- }
- print("end")
-}
-
-// -------- Select --------
-
-// NB, potentially fragile reliance on register number.
-func SelectDesugarsToSwitch(ch chan int) {
- // switch t1 {
- // case 0:int: extract t0 #2
- // case 1:int: println(0:int)
- // case 2:int: println(1:int)
- // default: println("default":string)
- // }
- select {
- case x := <-ch:
- println(x)
- case <-ch:
- println(0)
- case ch <- 1:
- println(1)
- default:
- println("default")
- }
-}
-
-// NB, potentially fragile reliance on register number.
-func NonblockingSelectDefaultCasePanics(ch chan int) {
- // switch t1 {
- // case 0:int: extract t0 #2
- // case 1:int: println(0:int)
- // case 2:int: println(1:int)
- // default: make interface{} <- string ("blocking select m...":string)
- // }
- select {
- case x := <-ch:
- println(x)
- case <-ch:
- println(0)
- case ch <- 1:
- println(1)
- }
-}
-
-// -------- Type switches --------
-
-// NB, reliance on fragile register numbering.
-func SimpleTypeSwitch(x interface{}) {
- // switch x.(type) {
- // case t3 int: println(x)
- // case t7 bool: println(x)
- // case t10 string: println(t10)
- // default: println(x)
- // }
- switch y := x.(type) {
- case nil:
- println(y)
- case int, bool:
- println(y)
- case string:
- println(y)
- default:
- println(y)
- }
-}
-
-// NB, potentially fragile reliance on register number.
-func DuplicateTypesAreNotEliminated(x interface{}) {
- // switch x.(type) {
- // case t1 string: println(1:int)
- // case t5 interface{}: println(t5)
- // case t9 int: println(3:int)
- // default: return
- // }
- switch y := x.(type) {
- case string:
- println(1)
- case interface{}:
- println(y)
- case int:
- println(3) // unreachable!
- }
-}
-
-// NB, potentially fragile reliance on register number.
-func AdHocTypeSwitch(x interface{}) {
- // switch x.(type) {
- // case t1 int: println(t1)
- // case t5 string: println(t5)
- // default: print("default":string)
- // }
- if i, ok := x.(int); ok {
- println(i)
- } else if s, ok := x.(string); ok {
- println(s)
- } else {
- print("default")
- }
-}
diff --git a/vendor/golang.org/x/tools/go/ssa/ssautil/visit.go b/vendor/golang.org/x/tools/go/ssa/ssautil/visit.go
deleted file mode 100644
index 3424e8a..0000000
--- a/vendor/golang.org/x/tools/go/ssa/ssautil/visit.go
+++ /dev/null
@@ -1,79 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package ssautil // import "golang.org/x/tools/go/ssa/ssautil"
-
-import "golang.org/x/tools/go/ssa"
-
-// This file defines utilities for visiting the SSA representation of
-// a Program.
-//
-// TODO(adonovan): test coverage.
-
-// AllFunctions finds and returns the set of functions potentially
-// needed by program prog, as determined by a simple linker-style
-// reachability algorithm starting from the members and method-sets of
-// each package. The result may include anonymous functions and
-// synthetic wrappers.
-//
-// Precondition: all packages are built.
-//
-func AllFunctions(prog *ssa.Program) map[*ssa.Function]bool {
- visit := visitor{
- prog: prog,
- seen: make(map[*ssa.Function]bool),
- }
- visit.program()
- return visit.seen
-}
-
-type visitor struct {
- prog *ssa.Program
- seen map[*ssa.Function]bool
-}
-
-func (visit *visitor) program() {
- for _, pkg := range visit.prog.AllPackages() {
- for _, mem := range pkg.Members {
- if fn, ok := mem.(*ssa.Function); ok {
- visit.function(fn)
- }
- }
- }
- for _, T := range visit.prog.RuntimeTypes() {
- mset := visit.prog.MethodSets.MethodSet(T)
- for i, n := 0, mset.Len(); i < n; i++ {
- visit.function(visit.prog.MethodValue(mset.At(i)))
- }
- }
-}
-
-func (visit *visitor) function(fn *ssa.Function) {
- if !visit.seen[fn] {
- visit.seen[fn] = true
- var buf [10]*ssa.Value // avoid alloc in common case
- for _, b := range fn.Blocks {
- for _, instr := range b.Instrs {
- for _, op := range instr.Operands(buf[:0]) {
- if fn, ok := (*op).(*ssa.Function); ok {
- visit.function(fn)
- }
- }
- }
- }
- }
-}
-
-// MainPackages returns the subset of the specified packages
-// named "main" that define a main function.
-// The result may include synthetic "testmain" packages.
-func MainPackages(pkgs []*ssa.Package) []*ssa.Package {
- var mains []*ssa.Package
- for _, pkg := range pkgs {
- if pkg.Pkg.Name() == "main" && pkg.Func("main") != nil {
- mains = append(mains, pkg)
- }
- }
- return mains
-}
diff --git a/vendor/golang.org/x/tools/go/ssa/stdlib_test.go b/vendor/golang.org/x/tools/go/ssa/stdlib_test.go
deleted file mode 100644
index f7e0f86..0000000
--- a/vendor/golang.org/x/tools/go/ssa/stdlib_test.go
+++ /dev/null
@@ -1,151 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Incomplete source tree on Android.
-
-// +build !android
-
-package ssa_test
-
-// This file runs the SSA builder in sanity-checking mode on all
-// packages beneath $GOROOT and prints some summary information.
-//
-// Run with "go test -cpu=8 to" set GOMAXPROCS.
-
-import (
- "go/ast"
- "go/build"
- "go/token"
- "runtime"
- "testing"
- "time"
-
- "golang.org/x/tools/go/buildutil"
- "golang.org/x/tools/go/loader"
- "golang.org/x/tools/go/ssa"
- "golang.org/x/tools/go/ssa/ssautil"
-)
-
-// Skip the set of packages that transitively depend on
-// cmd/internal/objfile, which uses vendoring,
-// which go/loader does not yet support.
-// TODO(adonovan): add support for vendoring and delete this.
-var skip = map[string]bool{
- "cmd/addr2line": true,
- "cmd/internal/objfile": true,
- "cmd/nm": true,
- "cmd/objdump": true,
- "cmd/pprof": true,
-}
-
-func bytesAllocated() uint64 {
- runtime.GC()
- var stats runtime.MemStats
- runtime.ReadMemStats(&stats)
- return stats.Alloc
-}
-
-func TestStdlib(t *testing.T) {
- if testing.Short() {
- t.Skip("skipping in short mode; too slow (golang.org/issue/14113)")
- }
- // Load, parse and type-check the program.
- t0 := time.Now()
- alloc0 := bytesAllocated()
-
- // Load, parse and type-check the program.
- ctxt := build.Default // copy
- ctxt.GOPATH = "" // disable GOPATH
- conf := loader.Config{Build: &ctxt}
- for _, path := range buildutil.AllPackages(conf.Build) {
- if skip[path] {
- continue
- }
- conf.ImportWithTests(path)
- }
-
- iprog, err := conf.Load()
- if err != nil {
- t.Fatalf("Load failed: %v", err)
- }
-
- t1 := time.Now()
- alloc1 := bytesAllocated()
-
- // Create SSA packages.
- var mode ssa.BuilderMode
- // Comment out these lines during benchmarking. Approx SSA build costs are noted.
- mode |= ssa.SanityCheckFunctions // + 2% space, + 4% time
- mode |= ssa.GlobalDebug // +30% space, +18% time
- prog := ssautil.CreateProgram(iprog, mode)
-
- t2 := time.Now()
-
- // Build SSA.
- prog.Build()
-
- t3 := time.Now()
- alloc3 := bytesAllocated()
-
- numPkgs := len(prog.AllPackages())
- if want := 140; numPkgs < want {
- t.Errorf("Loaded only %d packages, want at least %d", numPkgs, want)
- }
-
- // Keep iprog reachable until after we've measured memory usage.
- if len(iprog.AllPackages) == 0 {
- panic("unreachable")
- }
-
- allFuncs := ssautil.AllFunctions(prog)
-
- // Check that all non-synthetic functions have distinct names.
- // Synthetic wrappers for exported methods should be distinct too,
- // except for unexported ones (explained at (*Function).RelString).
- byName := make(map[string]*ssa.Function)
- for fn := range allFuncs {
- if fn.Synthetic == "" || ast.IsExported(fn.Name()) {
- str := fn.String()
- prev := byName[str]
- byName[str] = fn
- if prev != nil {
- t.Errorf("%s: duplicate function named %s",
- prog.Fset.Position(fn.Pos()), str)
- t.Errorf("%s: (previously defined here)",
- prog.Fset.Position(prev.Pos()))
- }
- }
- }
-
- // Dump some statistics.
- var numInstrs int
- for fn := range allFuncs {
- for _, b := range fn.Blocks {
- numInstrs += len(b.Instrs)
- }
- }
-
- // determine line count
- var lineCount int
- prog.Fset.Iterate(func(f *token.File) bool {
- lineCount += f.LineCount()
- return true
- })
-
- // NB: when benchmarking, don't forget to clear the debug +
- // sanity builder flags for better performance.
-
- t.Log("GOMAXPROCS: ", runtime.GOMAXPROCS(0))
- t.Log("#Source lines: ", lineCount)
- t.Log("Load/parse/typecheck: ", t1.Sub(t0))
- t.Log("SSA create: ", t2.Sub(t1))
- t.Log("SSA build: ", t3.Sub(t2))
-
- // SSA stats:
- t.Log("#Packages: ", numPkgs)
- t.Log("#Functions: ", len(allFuncs))
- t.Log("#Instructions: ", numInstrs)
- t.Log("#MB AST+types: ", int64(alloc1-alloc0)/1e6)
- t.Log("#MB SSA: ", int64(alloc3-alloc1)/1e6)
-}
diff --git a/vendor/golang.org/x/tools/go/ssa/testdata/objlookup.go b/vendor/golang.org/x/tools/go/ssa/testdata/objlookup.go
deleted file mode 100644
index 1aaa417..0000000
--- a/vendor/golang.org/x/tools/go/ssa/testdata/objlookup.go
+++ /dev/null
@@ -1,160 +0,0 @@
-//+build ignore
-
-package main
-
-// This file is the input to TestObjValueLookup in source_test.go,
-// which ensures that each occurrence of an ident defining or
-// referring to a func, var or const object can be mapped to its
-// corresponding SSA Value.
-//
-// For every reference to a var object, we use annotations in comments
-// to denote both the expected SSA Value kind, and whether to expect
-// its value (x) or its address (&x).
-//
-// For const and func objects, the results don't vary by reference and
-// are always values not addresses, so no annotations are needed. The
-// declaration is enough.
-
-import "fmt"
-import "os"
-
-type J int
-
-func (*J) method() {}
-
-const globalConst = 0
-
-var globalVar int // &globalVar::Global
-
-func globalFunc() {}
-
-type I interface {
- interfaceMethod()
-}
-
-type S struct {
- x int // x::nil
-}
-
-func main() {
- print(globalVar) // globalVar::UnOp
- globalVar = 1 // globalVar::Const
-
- var v0 int = 1 // v0::Const (simple local value spec)
- if v0 > 0 { // v0::Const
- v0 = 2 // v0::Const
- }
- print(v0) // v0::Phi
-
- // v1 is captured and thus implicitly address-taken.
- var v1 int = 1 // v1::Const
- v1 = 2 // v1::Const
- fmt.Println(v1) // v1::UnOp (load)
- f := func(param int) { // f::MakeClosure param::Parameter
- if y := 1; y > 0 { // y::Const
- print(v1, param) // v1::UnOp (load) param::Parameter
- }
- param = 2 // param::Const
- println(param) // param::Const
- }
-
- f(0) // f::MakeClosure
-
- var v2 int // v2::Const (implicitly zero-initialized local value spec)
- print(v2) // v2::Const
-
- m := make(map[string]int) // m::MakeMap
-
- // Local value spec with multi-valued RHS:
- var v3, v4 = m[""] // v3::Extract v4::Extract m::MakeMap
- print(v3) // v3::Extract
- print(v4) // v4::Extract
-
- v3++ // v3::BinOp (assign with op)
- v3 += 2 // v3::BinOp (assign with op)
-
- v5, v6 := false, "" // v5::Const v6::Const (defining assignment)
- print(v5) // v5::Const
- print(v6) // v6::Const
-
- var v7 S // &v7::Alloc
- v7.x = 1 // &v7::Alloc &x::FieldAddr
- print(v7.x) // &v7::Alloc &x::FieldAddr
-
- var v8 [1]int // &v8::Alloc
- v8[0] = 0 // &v8::Alloc
- print(v8[:]) // &v8::Alloc
- _ = v8[0] // &v8::Alloc
- _ = v8[:][0] // &v8::Alloc
- v8ptr := &v8 // v8ptr::Alloc &v8::Alloc
- _ = v8ptr[0] // v8ptr::Alloc
- _ = *v8ptr // v8ptr::Alloc
-
- v8a := make([]int, 1) // v8a::Slice
- v8a[0] = 0 // v8a::Slice
- print(v8a[:]) // v8a::Slice
-
- v9 := S{} // &v9::Alloc
-
- v10 := &v9 // v10::Alloc &v9::Alloc
- _ = v10 // v10::Alloc
-
- var v11 *J = nil // v11::Const
- v11.method() // v11::Const
-
- var v12 J // &v12::Alloc
- v12.method() // &v12::Alloc (implicitly address-taken)
-
- // NB, in the following, 'method' resolves to the *types.Func
- // of (*J).method, so it doesn't help us locate the specific
- // ssa.Values here: a bound-method closure and a promotion
- // wrapper.
- _ = v11.method // v11::Const
- _ = (*struct{ J }).method // J::nil
-
- // These vars are not optimised away.
- if false {
- v13 := 0 // v13::Const
- println(v13) // v13::Const
- }
-
- switch x := 1; x { // x::Const
- case v0: // v0::Phi
- }
-
- for k, v := range m { // k::Extract v::Extract m::MakeMap
- _ = k // k::Extract
- v++ // v::BinOp
- }
-
- if y := 0; y > 1 { // y::Const y::Const
- }
-
- var i interface{} // i::Const (nil interface)
- i = 1 // i::MakeInterface
- switch i := i.(type) { // i::MakeInterface i::MakeInterface
- case int:
- println(i) // i::Extract
- }
-
- ch := make(chan int) // ch::MakeChan
- select {
- case x := <-ch: // x::UnOp (receive) ch::MakeChan
- _ = x // x::UnOp
- }
-
- // .Op is an inter-package FieldVal-selection.
- var err os.PathError // &err::Alloc
- _ = err.Op // &err::Alloc &Op::FieldAddr
- _ = &err.Op // &err::Alloc &Op::FieldAddr
-
- // Exercise corner-cases of lvalues vs rvalues.
- // (Guessing IsAddr from the 'pointerness' won't cut it here.)
- type N *N
- var n N // n::Const
- n1 := n // n1::Const n::Const
- n2 := &n1 // n2::Alloc &n1::Alloc
- n3 := *n2 // n3::UnOp n2::Alloc
- n4 := **n3 // n4::UnOp n3::UnOp
- _ = n4 // n4::UnOp
-}
diff --git a/vendor/golang.org/x/tools/go/ssa/testdata/structconv.go b/vendor/golang.org/x/tools/go/ssa/testdata/structconv.go
deleted file mode 100644
index 3126469..0000000
--- a/vendor/golang.org/x/tools/go/ssa/testdata/structconv.go
+++ /dev/null
@@ -1,24 +0,0 @@
-//+build ignore
-
-// This file is the input to TestValueForExprStructConv in identical_test.go,
-// which uses the same framework as TestValueForExpr does in source_test.go.
-//
-// In Go 1.8, struct conversions are permitted even when the struct types have
-// different tags. This wasn't permitted in earlier versions of Go, so this file
-// exists separately from valueforexpr.go to just test this behavior in Go 1.8
-// and later.
-
-package main
-
-type t1 struct {
- x int
-}
-type t2 struct {
- x int `tag`
-}
-
-func main() {
- var tv1 t1
- var tv2 t2 = /*@ChangeType*/ (t2(tv1))
- _ = tv2
-}
diff --git a/vendor/golang.org/x/tools/go/ssa/testdata/valueforexpr.go b/vendor/golang.org/x/tools/go/ssa/testdata/valueforexpr.go
deleted file mode 100644
index 4a2cb85..0000000
--- a/vendor/golang.org/x/tools/go/ssa/testdata/valueforexpr.go
+++ /dev/null
@@ -1,152 +0,0 @@
-//+build ignore
-
-package main
-
-// This file is the input to TestValueForExpr in source_test.go, which
-// ensures that each expression e immediately following a /*@kind*/(x)
-// annotation, when passed to Function.ValueForExpr(e), returns a
-// non-nil Value of the same type as e and of kind 'kind'.
-
-func f(spilled, unspilled int) {
- _ = /*@UnOp*/ (spilled)
- _ = /*@Parameter*/ (unspilled)
- _ = /*@*/ (1 + 2) // (constant)
- i := 0
-
- f := func() (int, int) { return 0, 0 }
-
- /*@Call*/ (print( /*@BinOp*/ (i + 1)))
- _, _ = /*@Call*/ (f())
- ch := /*@MakeChan*/ (make(chan int))
- /*@UnOp*/ (<-ch)
- x := /*@UnOp*/ (<-ch)
- _ = x
- select {
- case /*@Extract*/ (<-ch):
- case x := /*@Extract*/ (<-ch):
- _ = x
- }
- defer /*@Function*/ (func() {
- })()
- go /*@Function*/ (func() {
- })()
- y := 0
- if true && /*@BinOp*/ (bool(y > 0)) {
- y = 1
- }
- _ = /*@Phi*/ (y)
- map1 := /*@MakeMap*/ (make(map[string]string))
- _ = map1
- _ = /*@Slice*/ (make([]int, 0))
- _ = /*@MakeClosure*/ (func() { print(spilled) })
-
- sl := []int{}
- _ = /*@Slice*/ (sl[:0])
-
- _ = /*@*/ (new(int)) // optimized away
- tmp := /*@Alloc*/ (new(int))
- _ = tmp
- var iface interface{}
- _ = /*@TypeAssert*/ (iface.(int))
- _ = /*@UnOp*/ (sl[0])
- _ = /*@IndexAddr*/ (&sl[0])
- _ = /*@Index*/ ([2]int{}[0])
- var p *int
- _ = /*@UnOp*/ (*p)
-
- _ = /*@UnOp*/ (global)
- /*@UnOp*/ (global)[""] = ""
- /*@Global*/ (global) = map[string]string{}
-
- var local t
- /*UnOp*/ (local.x) = 1
-
- // Exercise corner-cases of lvalues vs rvalues.
- type N *N
- var n N
- /*@UnOp*/ (n) = /*@UnOp*/ (n)
- /*@ChangeType*/ (n) = /*@Alloc*/ (&n)
- /*@UnOp*/ (n) = /*@UnOp*/ (*n)
- /*@UnOp*/ (n) = /*@UnOp*/ (**n)
-}
-
-func complit() {
- // Composite literals.
- // We get different results for
- // - composite literal as value (e.g. operand to print)
- // - composite literal initializer for addressable value
- // - composite literal value assigned to blank var
-
- // 1. Slices
- print( /*@Slice*/ ([]int{}))
- print( /*@Alloc*/ (&[]int{}))
- print(& /*@Slice*/ ([]int{}))
-
- sl1 := /*@Slice*/ ([]int{})
- sl2 := /*@Alloc*/ (&[]int{})
- sl3 := & /*@Slice*/ ([]int{})
- _, _, _ = sl1, sl2, sl3
-
- _ = /*@Slice*/ ([]int{})
- _ = /*@*/ (& /*@Slice*/ ([]int{})) // & optimized away
- _ = & /*@Slice*/ ([]int{})
-
- // 2. Arrays
- print( /*@UnOp*/ ([1]int{}))
- print( /*@Alloc*/ (&[1]int{}))
- print(& /*@Alloc*/ ([1]int{}))
-
- arr1 := /*@Alloc*/ ([1]int{})
- arr2 := /*@Alloc*/ (&[1]int{})
- arr3 := & /*@Alloc*/ ([1]int{})
- _, _, _ = arr1, arr2, arr3
-
- _ = /*@UnOp*/ ([1]int{})
- _ = /*@Alloc*/ (& /*@Alloc*/ ([1]int{}))
- _ = & /*@Alloc*/ ([1]int{})
-
- // 3. Maps
- type M map[int]int
- print( /*@MakeMap*/ (M{}))
- print( /*@Alloc*/ (&M{}))
- print(& /*@MakeMap*/ (M{}))
-
- m1 := /*@MakeMap*/ (M{})
- m2 := /*@Alloc*/ (&M{})
- m3 := & /*@MakeMap*/ (M{})
- _, _, _ = m1, m2, m3
-
- _ = /*@MakeMap*/ (M{})
- _ = /*@*/ (& /*@MakeMap*/ (M{})) // & optimized away
- _ = & /*@MakeMap*/ (M{})
-
- // 4. Structs
- print( /*@UnOp*/ (struct{}{}))
- print( /*@Alloc*/ (&struct{}{}))
- print(& /*@Alloc*/ (struct{}{}))
-
- s1 := /*@Alloc*/ (struct{}{})
- s2 := /*@Alloc*/ (&struct{}{})
- s3 := & /*@Alloc*/ (struct{}{})
- _, _, _ = s1, s2, s3
-
- _ = /*@UnOp*/ (struct{}{})
- _ = /*@Alloc*/ (& /*@Alloc*/ (struct{}{}))
- _ = & /*@Alloc*/ (struct{}{})
-}
-
-type t struct{ x int }
-
-// Ensure we can locate methods of named types.
-func (t) f(param int) {
- _ = /*@Parameter*/ (param)
-}
-
-// Ensure we can locate init functions.
-func init() {
- m := /*@MakeMap*/ (make(map[string]string))
- _ = m
-}
-
-// Ensure we can locate variables in initializer expressions.
-var global = /*@MakeMap*/ (make(map[string]string))
diff --git a/vendor/golang.org/x/tools/go/ssa/testmain.go b/vendor/golang.org/x/tools/go/ssa/testmain.go
deleted file mode 100644
index ea232ad..0000000
--- a/vendor/golang.org/x/tools/go/ssa/testmain.go
+++ /dev/null
@@ -1,267 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package ssa
-
-// CreateTestMainPackage synthesizes a main package that runs all the
-// tests of the supplied packages.
-// It is closely coupled to $GOROOT/src/cmd/go/test.go and $GOROOT/src/testing.
-//
-// TODO(adonovan): this file no longer needs to live in the ssa package.
-// Move it to ssautil.
-
-import (
- "bytes"
- "fmt"
- "go/ast"
- "go/parser"
- "go/types"
- "log"
- "os"
- "strings"
- "text/template"
-)
-
-// FindTests returns the Test, Benchmark, and Example functions
-// (as defined by "go test") defined in the specified package,
-// and its TestMain function, if any.
-func FindTests(pkg *Package) (tests, benchmarks, examples []*Function, main *Function) {
- prog := pkg.Prog
-
- // The first two of these may be nil: if the program doesn't import "testing",
- // it can't contain any tests, but it may yet contain Examples.
- var testSig *types.Signature // func(*testing.T)
- var benchmarkSig *types.Signature // func(*testing.B)
- var exampleSig = types.NewSignature(nil, nil, nil, false) // func()
-
- // Obtain the types from the parameters of testing.MainStart.
- if testingPkg := prog.ImportedPackage("testing"); testingPkg != nil {
- mainStart := testingPkg.Func("MainStart")
- params := mainStart.Signature.Params()
- testSig = funcField(params.At(1).Type())
- benchmarkSig = funcField(params.At(2).Type())
-
- // Does the package define this function?
- // func TestMain(*testing.M)
- if f := pkg.Func("TestMain"); f != nil {
- sig := f.Type().(*types.Signature)
- starM := mainStart.Signature.Results().At(0).Type() // *testing.M
- if sig.Results().Len() == 0 &&
- sig.Params().Len() == 1 &&
- types.Identical(sig.Params().At(0).Type(), starM) {
- main = f
- }
- }
- }
-
- // TODO(adonovan): use a stable order, e.g. lexical.
- for _, mem := range pkg.Members {
- if f, ok := mem.(*Function); ok &&
- ast.IsExported(f.Name()) &&
- strings.HasSuffix(prog.Fset.Position(f.Pos()).Filename, "_test.go") {
-
- switch {
- case testSig != nil && isTestSig(f, "Test", testSig):
- tests = append(tests, f)
- case benchmarkSig != nil && isTestSig(f, "Benchmark", benchmarkSig):
- benchmarks = append(benchmarks, f)
- case isTestSig(f, "Example", exampleSig):
- examples = append(examples, f)
- default:
- continue
- }
- }
- }
- return
-}
-
-// Like isTest, but checks the signature too.
-func isTestSig(f *Function, prefix string, sig *types.Signature) bool {
- return isTest(f.Name(), prefix) && types.Identical(f.Signature, sig)
-}
-
-// Given the type of one of the three slice parameters of testing.Main,
-// returns the function type.
-func funcField(slice types.Type) *types.Signature {
- return slice.(*types.Slice).Elem().Underlying().(*types.Struct).Field(1).Type().(*types.Signature)
-}
-
-// isTest tells whether name looks like a test (or benchmark, according to prefix).
-// It is a Test (say) if there is a character after Test that is not a lower-case letter.
-// We don't want TesticularCancer.
-// Plundered from $GOROOT/src/cmd/go/test.go
-func isTest(name, prefix string) bool {
- if !strings.HasPrefix(name, prefix) {
- return false
- }
- if len(name) == len(prefix) { // "Test" is ok
- return true
- }
- return ast.IsExported(name[len(prefix):])
-}
-
-// CreateTestMainPackage creates and returns a synthetic "testmain"
-// package for the specified package if it defines tests, benchmarks or
-// executable examples, or nil otherwise. The new package is named
-// "main" and provides a function named "main" that runs the tests,
-// similar to the one that would be created by the 'go test' tool.
-//
-// Subsequent calls to prog.AllPackages include the new package.
-// The package pkg must belong to the program prog.
-func (prog *Program) CreateTestMainPackage(pkg *Package) *Package {
- if pkg.Prog != prog {
- log.Fatal("Package does not belong to Program")
- }
-
- // Template data
- var data struct {
- Pkg *Package
- Tests, Benchmarks, Examples []*Function
- Main *Function
- Go18 bool
- }
- data.Pkg = pkg
-
- // Enumerate tests.
- data.Tests, data.Benchmarks, data.Examples, data.Main = FindTests(pkg)
- if data.Main == nil &&
- data.Tests == nil && data.Benchmarks == nil && data.Examples == nil {
- return nil
- }
-
- // Synthesize source for testmain package.
- path := pkg.Pkg.Path() + "$testmain"
- tmpl := testmainTmpl
- if testingPkg := prog.ImportedPackage("testing"); testingPkg != nil {
- // In Go 1.8, testing.MainStart's first argument is an interface, not a func.
- data.Go18 = types.IsInterface(testingPkg.Func("MainStart").Signature.Params().At(0).Type())
- } else {
- // The program does not import "testing", but FindTests
- // returned non-nil, which must mean there were Examples
- // but no Test, Benchmark, or TestMain functions.
-
- // We'll simply call them from testmain.main; this will
- // ensure they don't panic, but will not check any
- // "Output:" comments.
- // (We should not execute an Example that has no
- // "Output:" comment, but it's impossible to tell here.)
- tmpl = examplesOnlyTmpl
- }
- var buf bytes.Buffer
- if err := tmpl.Execute(&buf, data); err != nil {
- log.Fatalf("internal error expanding template for %s: %v", path, err)
- }
- if false { // debugging
- fmt.Fprintln(os.Stderr, buf.String())
- }
-
- // Parse and type-check the testmain package.
- f, err := parser.ParseFile(prog.Fset, path+".go", &buf, parser.Mode(0))
- if err != nil {
- log.Fatalf("internal error parsing %s: %v", path, err)
- }
- conf := types.Config{
- DisableUnusedImportCheck: true,
- Importer: importer{pkg},
- }
- files := []*ast.File{f}
- info := &types.Info{
- Types: make(map[ast.Expr]types.TypeAndValue),
- Defs: make(map[*ast.Ident]types.Object),
- Uses: make(map[*ast.Ident]types.Object),
- Implicits: make(map[ast.Node]types.Object),
- Scopes: make(map[ast.Node]*types.Scope),
- Selections: make(map[*ast.SelectorExpr]*types.Selection),
- }
- testmainPkg, err := conf.Check(path, prog.Fset, files, info)
- if err != nil {
- log.Fatalf("internal error type-checking %s: %v", path, err)
- }
-
- // Create and build SSA code.
- testmain := prog.CreatePackage(testmainPkg, files, info, false)
- testmain.SetDebugMode(false)
- testmain.Build()
- testmain.Func("main").Synthetic = "test main function"
- testmain.Func("init").Synthetic = "package initializer"
- return testmain
-}
-
-// An implementation of types.Importer for an already loaded SSA program.
-type importer struct {
- pkg *Package // package under test; may be non-importable
-}
-
-func (imp importer) Import(path string) (*types.Package, error) {
- if p := imp.pkg.Prog.ImportedPackage(path); p != nil {
- return p.Pkg, nil
- }
- if path == imp.pkg.Pkg.Path() {
- return imp.pkg.Pkg, nil
- }
- return nil, fmt.Errorf("not found") // can't happen
-}
-
-var testmainTmpl = template.Must(template.New("testmain").Parse(`
-package main
-
-import "io"
-import "os"
-import "testing"
-import p {{printf "%q" .Pkg.Pkg.Path}}
-
-{{if .Go18}}
-type deps struct{}
-
-func (deps) ImportPath() string { return "" }
-func (deps) MatchString(pat, str string) (bool, error) { return true, nil }
-func (deps) StartCPUProfile(io.Writer) error { return nil }
-func (deps) StartTestLog(io.Writer) {}
-func (deps) StopCPUProfile() {}
-func (deps) StopTestLog() error { return nil }
-func (deps) WriteHeapProfile(io.Writer) error { return nil }
-func (deps) WriteProfileTo(string, io.Writer, int) error { return nil }
-
-var match deps
-{{else}}
-func match(_, _ string) (bool, error) { return true, nil }
-{{end}}
-
-func main() {
- tests := []testing.InternalTest{
-{{range .Tests}}
- { {{printf "%q" .Name}}, p.{{.Name}} },
-{{end}}
- }
- benchmarks := []testing.InternalBenchmark{
-{{range .Benchmarks}}
- { {{printf "%q" .Name}}, p.{{.Name}} },
-{{end}}
- }
- examples := []testing.InternalExample{
-{{range .Examples}}
- {Name: {{printf "%q" .Name}}, F: p.{{.Name}}},
-{{end}}
- }
- m := testing.MainStart(match, tests, benchmarks, examples)
-{{with .Main}}
- p.{{.Name}}(m)
-{{else}}
- os.Exit(m.Run())
-{{end}}
-}
-
-`))
-
-var examplesOnlyTmpl = template.Must(template.New("examples").Parse(`
-package main
-
-import p {{printf "%q" .Pkg.Pkg.Path}}
-
-func main() {
-{{range .Examples}}
- p.{{.Name}}()
-{{end}}
-}
-`))
diff --git a/vendor/golang.org/x/tools/go/ssa/testmain_test.go b/vendor/golang.org/x/tools/go/ssa/testmain_test.go
deleted file mode 100644
index e24b23b..0000000
--- a/vendor/golang.org/x/tools/go/ssa/testmain_test.go
+++ /dev/null
@@ -1,124 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package ssa_test
-
-// Tests of FindTests. CreateTestMainPackage is tested via the interpreter.
-// TODO(adonovan): test the 'pkgs' result from FindTests.
-
-import (
- "fmt"
- "sort"
- "testing"
-
- "golang.org/x/tools/go/loader"
- "golang.org/x/tools/go/ssa"
- "golang.org/x/tools/go/ssa/ssautil"
-)
-
-func create(t *testing.T, content string) *ssa.Package {
- var conf loader.Config
- f, err := conf.ParseFile("foo_test.go", content)
- if err != nil {
- t.Fatal(err)
- }
- conf.CreateFromFiles("foo", f)
-
- lprog, err := conf.Load()
- if err != nil {
- t.Fatal(err)
- }
-
- // We needn't call Build.
- foo := lprog.Package("foo").Pkg
- return ssautil.CreateProgram(lprog, ssa.SanityCheckFunctions).Package(foo)
-}
-
-func TestFindTests(t *testing.T) {
- test := `
-package foo
-
-import "testing"
-
-type T int
-
-// Tests:
-func Test(t *testing.T) {}
-func TestA(t *testing.T) {}
-func TestB(t *testing.T) {}
-
-// Not tests:
-func testC(t *testing.T) {}
-func TestD() {}
-func testE(t *testing.T) int { return 0 }
-func (T) Test(t *testing.T) {}
-
-// Benchmarks:
-func Benchmark(*testing.B) {}
-func BenchmarkA(b *testing.B) {}
-func BenchmarkB(*testing.B) {}
-
-// Not benchmarks:
-func benchmarkC(t *testing.T) {}
-func BenchmarkD() {}
-func benchmarkE(t *testing.T) int { return 0 }
-func (T) Benchmark(t *testing.T) {}
-
-// Examples:
-func Example() {}
-func ExampleA() {}
-
-// Not examples:
-func exampleC() {}
-func ExampleD(t *testing.T) {}
-func exampleE() int { return 0 }
-func (T) Example() {}
-`
- pkg := create(t, test)
- tests, benchmarks, examples, _ := ssa.FindTests(pkg)
-
- sort.Sort(funcsByPos(tests))
- if got, want := fmt.Sprint(tests), "[foo.Test foo.TestA foo.TestB]"; got != want {
- t.Errorf("FindTests.tests = %s, want %s", got, want)
- }
-
- sort.Sort(funcsByPos(benchmarks))
- if got, want := fmt.Sprint(benchmarks), "[foo.Benchmark foo.BenchmarkA foo.BenchmarkB]"; got != want {
- t.Errorf("FindTests.benchmarks = %s, want %s", got, want)
- }
-
- sort.Sort(funcsByPos(examples))
- if got, want := fmt.Sprint(examples), "[foo.Example foo.ExampleA]"; got != want {
- t.Errorf("FindTests examples = %s, want %s", got, want)
- }
-}
-
-func TestFindTestsTesting(t *testing.T) {
- test := `
-package foo
-
-// foo does not import "testing", but defines Examples.
-
-func Example() {}
-func ExampleA() {}
-`
- pkg := create(t, test)
- tests, benchmarks, examples, _ := ssa.FindTests(pkg)
- if len(tests) > 0 {
- t.Errorf("FindTests.tests = %s, want none", tests)
- }
- if len(benchmarks) > 0 {
- t.Errorf("FindTests.benchmarks = %s, want none", benchmarks)
- }
- sort.Sort(funcsByPos(examples))
- if got, want := fmt.Sprint(examples), "[foo.Example foo.ExampleA]"; got != want {
- t.Errorf("FindTests examples = %s, want %s", got, want)
- }
-}
-
-type funcsByPos []*ssa.Function
-
-func (p funcsByPos) Len() int { return len(p) }
-func (p funcsByPos) Less(i, j int) bool { return p[i].Pos() < p[j].Pos() }
-func (p funcsByPos) Swap(i, j int) { p[i], p[j] = p[j], p[i] }
diff --git a/vendor/golang.org/x/tools/go/ssa/util.go b/vendor/golang.org/x/tools/go/ssa/util.go
deleted file mode 100644
index ddb1184..0000000
--- a/vendor/golang.org/x/tools/go/ssa/util.go
+++ /dev/null
@@ -1,119 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package ssa
-
-// This file defines a number of miscellaneous utility functions.
-
-import (
- "fmt"
- "go/ast"
- "go/token"
- "go/types"
- "io"
- "os"
-
- "golang.org/x/tools/go/ast/astutil"
-)
-
-//// AST utilities
-
-func unparen(e ast.Expr) ast.Expr { return astutil.Unparen(e) }
-
-// isBlankIdent returns true iff e is an Ident with name "_".
-// They have no associated types.Object, and thus no type.
-//
-func isBlankIdent(e ast.Expr) bool {
- id, ok := e.(*ast.Ident)
- return ok && id.Name == "_"
-}
-
-//// Type utilities. Some of these belong in go/types.
-
-// isPointer returns true for types whose underlying type is a pointer.
-func isPointer(typ types.Type) bool {
- _, ok := typ.Underlying().(*types.Pointer)
- return ok
-}
-
-func isInterface(T types.Type) bool { return types.IsInterface(T) }
-
-// deref returns a pointer's element type; otherwise it returns typ.
-func deref(typ types.Type) types.Type {
- if p, ok := typ.Underlying().(*types.Pointer); ok {
- return p.Elem()
- }
- return typ
-}
-
-// recvType returns the receiver type of method obj.
-func recvType(obj *types.Func) types.Type {
- return obj.Type().(*types.Signature).Recv().Type()
-}
-
-// DefaultType returns the default "typed" type for an "untyped" type;
-// it returns the incoming type for all other types. The default type
-// for untyped nil is untyped nil.
-//
-// Exported to ssa/interp.
-//
-// TODO(adonovan): use go/types.DefaultType after 1.8.
-//
-func DefaultType(typ types.Type) types.Type {
- if t, ok := typ.(*types.Basic); ok {
- k := t.Kind()
- switch k {
- case types.UntypedBool:
- k = types.Bool
- case types.UntypedInt:
- k = types.Int
- case types.UntypedRune:
- k = types.Rune
- case types.UntypedFloat:
- k = types.Float64
- case types.UntypedComplex:
- k = types.Complex128
- case types.UntypedString:
- k = types.String
- }
- typ = types.Typ[k]
- }
- return typ
-}
-
-// logStack prints the formatted "start" message to stderr and
-// returns a closure that prints the corresponding "end" message.
-// Call using 'defer logStack(...)()' to show builder stack on panic.
-// Don't forget trailing parens!
-//
-func logStack(format string, args ...interface{}) func() {
- msg := fmt.Sprintf(format, args...)
- io.WriteString(os.Stderr, msg)
- io.WriteString(os.Stderr, "\n")
- return func() {
- io.WriteString(os.Stderr, msg)
- io.WriteString(os.Stderr, " end\n")
- }
-}
-
-// newVar creates a 'var' for use in a types.Tuple.
-func newVar(name string, typ types.Type) *types.Var {
- return types.NewParam(token.NoPos, nil, name, typ)
-}
-
-// anonVar creates an anonymous 'var' for use in a types.Tuple.
-func anonVar(typ types.Type) *types.Var {
- return newVar("", typ)
-}
-
-var lenResults = types.NewTuple(anonVar(tInt))
-
-// makeLen returns the len builtin specialized to type func(T)int.
-func makeLen(T types.Type) *Builtin {
- lenParams := types.NewTuple(anonVar(T))
- return &Builtin{
- name: "len",
- sig: types.NewSignature(nil, lenParams, lenResults, false),
- }
-}
diff --git a/vendor/golang.org/x/tools/go/ssa/wrappers.go b/vendor/golang.org/x/tools/go/ssa/wrappers.go
deleted file mode 100644
index 701dd90..0000000
--- a/vendor/golang.org/x/tools/go/ssa/wrappers.go
+++ /dev/null
@@ -1,294 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package ssa
-
-// This file defines synthesis of Functions that delegate to declared
-// methods; they come in three kinds:
-//
-// (1) wrappers: methods that wrap declared methods, performing
-// implicit pointer indirections and embedded field selections.
-//
-// (2) thunks: funcs that wrap declared methods. Like wrappers,
-// thunks perform indirections and field selections. The thunk's
-// first parameter is used as the receiver for the method call.
-//
-// (3) bounds: funcs that wrap declared methods. The bound's sole
-// free variable, supplied by a closure, is used as the receiver
-// for the method call. No indirections or field selections are
-// performed since they can be done before the call.
-
-import (
- "fmt"
-
- "go/types"
-)
-
-// -- wrappers -----------------------------------------------------------
-
-// makeWrapper returns a synthetic method that delegates to the
-// declared method denoted by meth.Obj(), first performing any
-// necessary pointer indirections or field selections implied by meth.
-//
-// The resulting method's receiver type is meth.Recv().
-//
-// This function is versatile but quite subtle! Consider the
-// following axes of variation when making changes:
-// - optional receiver indirection
-// - optional implicit field selections
-// - meth.Obj() may denote a concrete or an interface method
-// - the result may be a thunk or a wrapper.
-//
-// EXCLUSIVE_LOCKS_REQUIRED(prog.methodsMu)
-//
-func makeWrapper(prog *Program, sel *types.Selection) *Function {
- obj := sel.Obj().(*types.Func) // the declared function
- sig := sel.Type().(*types.Signature) // type of this wrapper
-
- var recv *types.Var // wrapper's receiver or thunk's params[0]
- name := obj.Name()
- var description string
- var start int // first regular param
- if sel.Kind() == types.MethodExpr {
- name += "$thunk"
- description = "thunk"
- recv = sig.Params().At(0)
- start = 1
- } else {
- description = "wrapper"
- recv = sig.Recv()
- }
-
- description = fmt.Sprintf("%s for %s", description, sel.Obj())
- if prog.mode&LogSource != 0 {
- defer logStack("make %s to (%s)", description, recv.Type())()
- }
- fn := &Function{
- name: name,
- method: sel,
- object: obj,
- Signature: sig,
- Synthetic: description,
- Prog: prog,
- pos: obj.Pos(),
- }
- fn.startBody()
- fn.addSpilledParam(recv)
- createParams(fn, start)
-
- indices := sel.Index()
-
- var v Value = fn.Locals[0] // spilled receiver
- if isPointer(sel.Recv()) {
- v = emitLoad(fn, v)
-
- // For simple indirection wrappers, perform an informative nil-check:
- // "value method (T).f called using nil *T pointer"
- if len(indices) == 1 && !isPointer(recvType(obj)) {
- var c Call
- c.Call.Value = &Builtin{
- name: "ssa:wrapnilchk",
- sig: types.NewSignature(nil,
- types.NewTuple(anonVar(sel.Recv()), anonVar(tString), anonVar(tString)),
- types.NewTuple(anonVar(sel.Recv())), false),
- }
- c.Call.Args = []Value{
- v,
- stringConst(deref(sel.Recv()).String()),
- stringConst(sel.Obj().Name()),
- }
- c.setType(v.Type())
- v = fn.emit(&c)
- }
- }
-
- // Invariant: v is a pointer, either
- // value of *A receiver param, or
- // address of A spilled receiver.
-
- // We use pointer arithmetic (FieldAddr possibly followed by
- // Load) in preference to value extraction (Field possibly
- // preceded by Load).
-
- v = emitImplicitSelections(fn, v, indices[:len(indices)-1])
-
- // Invariant: v is a pointer, either
- // value of implicit *C field, or
- // address of implicit C field.
-
- var c Call
- if r := recvType(obj); !isInterface(r) { // concrete method
- if !isPointer(r) {
- v = emitLoad(fn, v)
- }
- c.Call.Value = prog.declaredFunc(obj)
- c.Call.Args = append(c.Call.Args, v)
- } else {
- c.Call.Method = obj
- c.Call.Value = emitLoad(fn, v)
- }
- for _, arg := range fn.Params[1:] {
- c.Call.Args = append(c.Call.Args, arg)
- }
- emitTailCall(fn, &c)
- fn.finishBody()
- return fn
-}
-
-// createParams creates parameters for wrapper method fn based on its
-// Signature.Params, which do not include the receiver.
-// start is the index of the first regular parameter to use.
-//
-func createParams(fn *Function, start int) {
- var last *Parameter
- tparams := fn.Signature.Params()
- for i, n := start, tparams.Len(); i < n; i++ {
- last = fn.addParamObj(tparams.At(i))
- }
- if fn.Signature.Variadic() {
- last.typ = types.NewSlice(last.typ)
- }
-}
-
-// -- bounds -----------------------------------------------------------
-
-// makeBound returns a bound method wrapper (or "bound"), a synthetic
-// function that delegates to a concrete or interface method denoted
-// by obj. The resulting function has no receiver, but has one free
-// variable which will be used as the method's receiver in the
-// tail-call.
-//
-// Use MakeClosure with such a wrapper to construct a bound method
-// closure. e.g.:
-//
-// type T int or: type T interface { meth() }
-// func (t T) meth()
-// var t T
-// f := t.meth
-// f() // calls t.meth()
-//
-// f is a closure of a synthetic wrapper defined as if by:
-//
-// f := func() { return t.meth() }
-//
-// Unlike makeWrapper, makeBound need perform no indirection or field
-// selections because that can be done before the closure is
-// constructed.
-//
-// EXCLUSIVE_LOCKS_ACQUIRED(meth.Prog.methodsMu)
-//
-func makeBound(prog *Program, obj *types.Func) *Function {
- prog.methodsMu.Lock()
- defer prog.methodsMu.Unlock()
- fn, ok := prog.bounds[obj]
- if !ok {
- description := fmt.Sprintf("bound method wrapper for %s", obj)
- if prog.mode&LogSource != 0 {
- defer logStack("%s", description)()
- }
- fn = &Function{
- name: obj.Name() + "$bound",
- object: obj,
- Signature: changeRecv(obj.Type().(*types.Signature), nil), // drop receiver
- Synthetic: description,
- Prog: prog,
- pos: obj.Pos(),
- }
-
- fv := &FreeVar{name: "recv", typ: recvType(obj), parent: fn}
- fn.FreeVars = []*FreeVar{fv}
- fn.startBody()
- createParams(fn, 0)
- var c Call
-
- if !isInterface(recvType(obj)) { // concrete
- c.Call.Value = prog.declaredFunc(obj)
- c.Call.Args = []Value{fv}
- } else {
- c.Call.Value = fv
- c.Call.Method = obj
- }
- for _, arg := range fn.Params {
- c.Call.Args = append(c.Call.Args, arg)
- }
- emitTailCall(fn, &c)
- fn.finishBody()
-
- prog.bounds[obj] = fn
- }
- return fn
-}
-
-// -- thunks -----------------------------------------------------------
-
-// makeThunk returns a thunk, a synthetic function that delegates to a
-// concrete or interface method denoted by sel.Obj(). The resulting
-// function has no receiver, but has an additional (first) regular
-// parameter.
-//
-// Precondition: sel.Kind() == types.MethodExpr.
-//
-// type T int or: type T interface { meth() }
-// func (t T) meth()
-// f := T.meth
-// var t T
-// f(t) // calls t.meth()
-//
-// f is a synthetic wrapper defined as if by:
-//
-// f := func(t T) { return t.meth() }
-//
-// TODO(adonovan): opt: currently the stub is created even when used
-// directly in a function call: C.f(i, 0). This is less efficient
-// than inlining the stub.
-//
-// EXCLUSIVE_LOCKS_ACQUIRED(meth.Prog.methodsMu)
-//
-func makeThunk(prog *Program, sel *types.Selection) *Function {
- if sel.Kind() != types.MethodExpr {
- panic(sel)
- }
-
- key := selectionKey{
- kind: sel.Kind(),
- recv: sel.Recv(),
- obj: sel.Obj(),
- index: fmt.Sprint(sel.Index()),
- indirect: sel.Indirect(),
- }
-
- prog.methodsMu.Lock()
- defer prog.methodsMu.Unlock()
-
- // Canonicalize key.recv to avoid constructing duplicate thunks.
- canonRecv, ok := prog.canon.At(key.recv).(types.Type)
- if !ok {
- canonRecv = key.recv
- prog.canon.Set(key.recv, canonRecv)
- }
- key.recv = canonRecv
-
- fn, ok := prog.thunks[key]
- if !ok {
- fn = makeWrapper(prog, sel)
- if fn.Signature.Recv() != nil {
- panic(fn) // unexpected receiver
- }
- prog.thunks[key] = fn
- }
- return fn
-}
-
-func changeRecv(s *types.Signature, recv *types.Var) *types.Signature {
- return types.NewSignature(recv, s.Params(), s.Results(), s.Variadic())
-}
-
-// selectionKey is like types.Selection but a usable map key.
-type selectionKey struct {
- kind types.SelectionKind
- recv types.Type // canonicalized via Program.canon
- obj types.Object
- index string
- indirect bool
-}
diff --git a/vendor/golang.org/x/tools/go/types/typeutil/example_test.go b/vendor/golang.org/x/tools/go/types/typeutil/example_test.go
deleted file mode 100644
index 86c4d44..0000000
--- a/vendor/golang.org/x/tools/go/types/typeutil/example_test.go
+++ /dev/null
@@ -1,67 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package typeutil_test
-
-import (
- "fmt"
- "go/ast"
- "go/parser"
- "go/token"
- "go/types"
- "sort"
-
- "golang.org/x/tools/go/types/typeutil"
-)
-
-func ExampleMap() {
- const source = `package P
-
-var X []string
-var Y []string
-
-const p, q = 1.0, 2.0
-
-func f(offset int32) (value byte, ok bool)
-func g(rune) (uint8, bool)
-`
-
- // Parse and type-check the package.
- fset := token.NewFileSet()
- f, err := parser.ParseFile(fset, "P.go", source, 0)
- if err != nil {
- panic(err)
- }
- pkg, err := new(types.Config).Check("P", fset, []*ast.File{f}, nil)
- if err != nil {
- panic(err)
- }
-
- scope := pkg.Scope()
-
- // Group names of package-level objects by their type.
- var namesByType typeutil.Map // value is []string
- for _, name := range scope.Names() {
- T := scope.Lookup(name).Type()
-
- names, _ := namesByType.At(T).([]string)
- names = append(names, name)
- namesByType.Set(T, names)
- }
-
- // Format, sort, and print the map entries.
- var lines []string
- namesByType.Iterate(func(T types.Type, names interface{}) {
- lines = append(lines, fmt.Sprintf("%s %s", names, T))
- })
- sort.Strings(lines)
- for _, line := range lines {
- fmt.Println(line)
- }
-
- // Output:
- // [X Y] []string
- // [f g] func(offset int32) (value byte, ok bool)
- // [p q] untyped float
-}
diff --git a/vendor/golang.org/x/tools/go/types/typeutil/imports.go b/vendor/golang.org/x/tools/go/types/typeutil/imports.go
deleted file mode 100644
index 9c441db..0000000
--- a/vendor/golang.org/x/tools/go/types/typeutil/imports.go
+++ /dev/null
@@ -1,31 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package typeutil
-
-import "go/types"
-
-// Dependencies returns all dependencies of the specified packages.
-//
-// Dependent packages appear in topological order: if package P imports
-// package Q, Q appears earlier than P in the result.
-// The algorithm follows import statements in the order they
-// appear in the source code, so the result is a total order.
-//
-func Dependencies(pkgs ...*types.Package) []*types.Package {
- var result []*types.Package
- seen := make(map[*types.Package]bool)
- var visit func(pkgs []*types.Package)
- visit = func(pkgs []*types.Package) {
- for _, p := range pkgs {
- if !seen[p] {
- seen[p] = true
- visit(p.Imports())
- result = append(result, p)
- }
- }
- }
- visit(pkgs)
- return result
-}
diff --git a/vendor/golang.org/x/tools/go/types/typeutil/imports_test.go b/vendor/golang.org/x/tools/go/types/typeutil/imports_test.go
deleted file mode 100644
index c8ef6d6..0000000
--- a/vendor/golang.org/x/tools/go/types/typeutil/imports_test.go
+++ /dev/null
@@ -1,80 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package typeutil_test
-
-import (
- "fmt"
- "go/ast"
- "go/parser"
- "go/token"
- "go/types"
- "testing"
-
- "golang.org/x/tools/go/types/typeutil"
-)
-
-type closure map[string]*types.Package
-
-func (c closure) Import(path string) (*types.Package, error) { return c[path], nil }
-
-func TestDependencies(t *testing.T) {
- packages := make(map[string]*types.Package)
- conf := types.Config{
- Importer: closure(packages),
- }
- fset := token.NewFileSet()
-
- // All edges go to the right.
- // /--D--B--A
- // F \_C_/
- // \__E_/
- for i, content := range []string{
- `package a`,
- `package c; import (_ "a")`,
- `package b; import (_ "a")`,
- `package e; import (_ "c")`,
- `package d; import (_ "b"; _ "c")`,
- `package f; import (_ "d"; _ "e")`,
- } {
- f, err := parser.ParseFile(fset, fmt.Sprintf("%d.go", i), content, 0)
- if err != nil {
- t.Fatal(err)
- }
- pkg, err := conf.Check(f.Name.Name, fset, []*ast.File{f}, nil)
- if err != nil {
- t.Fatal(err)
- }
- packages[pkg.Path()] = pkg
- }
-
- for _, test := range []struct {
- roots, want string
- }{
- {"a", "a"},
- {"b", "ab"},
- {"c", "ac"},
- {"d", "abcd"},
- {"e", "ace"},
- {"f", "abcdef"},
-
- {"be", "abce"},
- {"eb", "aceb"},
- {"de", "abcde"},
- {"ed", "acebd"},
- {"ef", "acebdf"},
- } {
- var pkgs []*types.Package
- for _, r := range test.roots {
- pkgs = append(pkgs, packages[string(r)])
- }
- var got string
- for _, p := range typeutil.Dependencies(pkgs...) {
- got += p.Path()
- }
- if got != test.want {
- t.Errorf("Dependencies(%q) = %q, want %q", test.roots, got, test.want)
- }
- }
-}
diff --git a/vendor/golang.org/x/tools/go/types/typeutil/map.go b/vendor/golang.org/x/tools/go/types/typeutil/map.go
deleted file mode 100644
index c7f7545..0000000
--- a/vendor/golang.org/x/tools/go/types/typeutil/map.go
+++ /dev/null
@@ -1,313 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Package typeutil defines various utilities for types, such as Map,
-// a mapping from types.Type to interface{} values.
-package typeutil // import "golang.org/x/tools/go/types/typeutil"
-
-import (
- "bytes"
- "fmt"
- "go/types"
- "reflect"
-)
-
-// Map is a hash-table-based mapping from types (types.Type) to
-// arbitrary interface{} values. The concrete types that implement
-// the Type interface are pointers. Since they are not canonicalized,
-// == cannot be used to check for equivalence, and thus we cannot
-// simply use a Go map.
-//
-// Just as with map[K]V, a nil *Map is a valid empty map.
-//
-// Not thread-safe.
-//
-type Map struct {
- hasher Hasher // shared by many Maps
- table map[uint32][]entry // maps hash to bucket; entry.key==nil means unused
- length int // number of map entries
-}
-
-// entry is an entry (key/value association) in a hash bucket.
-type entry struct {
- key types.Type
- value interface{}
-}
-
-// SetHasher sets the hasher used by Map.
-//
-// All Hashers are functionally equivalent but contain internal state
-// used to cache the results of hashing previously seen types.
-//
-// A single Hasher created by MakeHasher() may be shared among many
-// Maps. This is recommended if the instances have many keys in
-// common, as it will amortize the cost of hash computation.
-//
-// A Hasher may grow without bound as new types are seen. Even when a
-// type is deleted from the map, the Hasher never shrinks, since other
-// types in the map may reference the deleted type indirectly.
-//
-// Hashers are not thread-safe, and read-only operations such as
-// Map.Lookup require updates to the hasher, so a full Mutex lock (not a
-// read-lock) is require around all Map operations if a shared
-// hasher is accessed from multiple threads.
-//
-// If SetHasher is not called, the Map will create a private hasher at
-// the first call to Insert.
-//
-func (m *Map) SetHasher(hasher Hasher) {
- m.hasher = hasher
-}
-
-// Delete removes the entry with the given key, if any.
-// It returns true if the entry was found.
-//
-func (m *Map) Delete(key types.Type) bool {
- if m != nil && m.table != nil {
- hash := m.hasher.Hash(key)
- bucket := m.table[hash]
- for i, e := range bucket {
- if e.key != nil && types.Identical(key, e.key) {
- // We can't compact the bucket as it
- // would disturb iterators.
- bucket[i] = entry{}
- m.length--
- return true
- }
- }
- }
- return false
-}
-
-// At returns the map entry for the given key.
-// The result is nil if the entry is not present.
-//
-func (m *Map) At(key types.Type) interface{} {
- if m != nil && m.table != nil {
- for _, e := range m.table[m.hasher.Hash(key)] {
- if e.key != nil && types.Identical(key, e.key) {
- return e.value
- }
- }
- }
- return nil
-}
-
-// Set sets the map entry for key to val,
-// and returns the previous entry, if any.
-func (m *Map) Set(key types.Type, value interface{}) (prev interface{}) {
- if m.table != nil {
- hash := m.hasher.Hash(key)
- bucket := m.table[hash]
- var hole *entry
- for i, e := range bucket {
- if e.key == nil {
- hole = &bucket[i]
- } else if types.Identical(key, e.key) {
- prev = e.value
- bucket[i].value = value
- return
- }
- }
-
- if hole != nil {
- *hole = entry{key, value} // overwrite deleted entry
- } else {
- m.table[hash] = append(bucket, entry{key, value})
- }
- } else {
- if m.hasher.memo == nil {
- m.hasher = MakeHasher()
- }
- hash := m.hasher.Hash(key)
- m.table = map[uint32][]entry{hash: {entry{key, value}}}
- }
-
- m.length++
- return
-}
-
-// Len returns the number of map entries.
-func (m *Map) Len() int {
- if m != nil {
- return m.length
- }
- return 0
-}
-
-// Iterate calls function f on each entry in the map in unspecified order.
-//
-// If f should mutate the map, Iterate provides the same guarantees as
-// Go maps: if f deletes a map entry that Iterate has not yet reached,
-// f will not be invoked for it, but if f inserts a map entry that
-// Iterate has not yet reached, whether or not f will be invoked for
-// it is unspecified.
-//
-func (m *Map) Iterate(f func(key types.Type, value interface{})) {
- if m != nil {
- for _, bucket := range m.table {
- for _, e := range bucket {
- if e.key != nil {
- f(e.key, e.value)
- }
- }
- }
- }
-}
-
-// Keys returns a new slice containing the set of map keys.
-// The order is unspecified.
-func (m *Map) Keys() []types.Type {
- keys := make([]types.Type, 0, m.Len())
- m.Iterate(func(key types.Type, _ interface{}) {
- keys = append(keys, key)
- })
- return keys
-}
-
-func (m *Map) toString(values bool) string {
- if m == nil {
- return "{}"
- }
- var buf bytes.Buffer
- fmt.Fprint(&buf, "{")
- sep := ""
- m.Iterate(func(key types.Type, value interface{}) {
- fmt.Fprint(&buf, sep)
- sep = ", "
- fmt.Fprint(&buf, key)
- if values {
- fmt.Fprintf(&buf, ": %q", value)
- }
- })
- fmt.Fprint(&buf, "}")
- return buf.String()
-}
-
-// String returns a string representation of the map's entries.
-// Values are printed using fmt.Sprintf("%v", v).
-// Order is unspecified.
-//
-func (m *Map) String() string {
- return m.toString(true)
-}
-
-// KeysString returns a string representation of the map's key set.
-// Order is unspecified.
-//
-func (m *Map) KeysString() string {
- return m.toString(false)
-}
-
-////////////////////////////////////////////////////////////////////////
-// Hasher
-
-// A Hasher maps each type to its hash value.
-// For efficiency, a hasher uses memoization; thus its memory
-// footprint grows monotonically over time.
-// Hashers are not thread-safe.
-// Hashers have reference semantics.
-// Call MakeHasher to create a Hasher.
-type Hasher struct {
- memo map[types.Type]uint32
-}
-
-// MakeHasher returns a new Hasher instance.
-func MakeHasher() Hasher {
- return Hasher{make(map[types.Type]uint32)}
-}
-
-// Hash computes a hash value for the given type t such that
-// Identical(t, t') => Hash(t) == Hash(t').
-func (h Hasher) Hash(t types.Type) uint32 {
- hash, ok := h.memo[t]
- if !ok {
- hash = h.hashFor(t)
- h.memo[t] = hash
- }
- return hash
-}
-
-// hashString computes the Fowler–Noll–Vo hash of s.
-func hashString(s string) uint32 {
- var h uint32
- for i := 0; i < len(s); i++ {
- h ^= uint32(s[i])
- h *= 16777619
- }
- return h
-}
-
-// hashFor computes the hash of t.
-func (h Hasher) hashFor(t types.Type) uint32 {
- // See Identical for rationale.
- switch t := t.(type) {
- case *types.Basic:
- return uint32(t.Kind())
-
- case *types.Array:
- return 9043 + 2*uint32(t.Len()) + 3*h.Hash(t.Elem())
-
- case *types.Slice:
- return 9049 + 2*h.Hash(t.Elem())
-
- case *types.Struct:
- var hash uint32 = 9059
- for i, n := 0, t.NumFields(); i < n; i++ {
- f := t.Field(i)
- if f.Anonymous() {
- hash += 8861
- }
- hash += hashString(t.Tag(i))
- hash += hashString(f.Name()) // (ignore f.Pkg)
- hash += h.Hash(f.Type())
- }
- return hash
-
- case *types.Pointer:
- return 9067 + 2*h.Hash(t.Elem())
-
- case *types.Signature:
- var hash uint32 = 9091
- if t.Variadic() {
- hash *= 8863
- }
- return hash + 3*h.hashTuple(t.Params()) + 5*h.hashTuple(t.Results())
-
- case *types.Interface:
- var hash uint32 = 9103
- for i, n := 0, t.NumMethods(); i < n; i++ {
- // See go/types.identicalMethods for rationale.
- // Method order is not significant.
- // Ignore m.Pkg().
- m := t.Method(i)
- hash += 3*hashString(m.Name()) + 5*h.Hash(m.Type())
- }
- return hash
-
- case *types.Map:
- return 9109 + 2*h.Hash(t.Key()) + 3*h.Hash(t.Elem())
-
- case *types.Chan:
- return 9127 + 2*uint32(t.Dir()) + 3*h.Hash(t.Elem())
-
- case *types.Named:
- // Not safe with a copying GC; objects may move.
- return uint32(reflect.ValueOf(t.Obj()).Pointer())
-
- case *types.Tuple:
- return h.hashTuple(t)
- }
- panic(t)
-}
-
-func (h Hasher) hashTuple(tuple *types.Tuple) uint32 {
- // See go/types.identicalTypes for rationale.
- n := tuple.Len()
- var hash uint32 = 9137 + 2*uint32(n)
- for i := 0; i < n; i++ {
- hash += 3 * h.Hash(tuple.At(i).Type())
- }
- return hash
-}
diff --git a/vendor/golang.org/x/tools/go/types/typeutil/map_test.go b/vendor/golang.org/x/tools/go/types/typeutil/map_test.go
deleted file mode 100644
index 34facbe..0000000
--- a/vendor/golang.org/x/tools/go/types/typeutil/map_test.go
+++ /dev/null
@@ -1,174 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package typeutil_test
-
-// TODO(adonovan):
-// - test use of explicit hasher across two maps.
-// - test hashcodes are consistent with equals for a range of types
-// (e.g. all types generated by type-checking some body of real code).
-
-import (
- "go/types"
- "testing"
-
- "golang.org/x/tools/go/types/typeutil"
-)
-
-var (
- tStr = types.Typ[types.String] // string
- tPStr1 = types.NewPointer(tStr) // *string
- tPStr2 = types.NewPointer(tStr) // *string, again
- tInt = types.Typ[types.Int] // int
- tChanInt1 = types.NewChan(types.RecvOnly, tInt) // <-chan int
- tChanInt2 = types.NewChan(types.RecvOnly, tInt) // <-chan int, again
-)
-
-func checkEqualButNotIdentical(t *testing.T, x, y types.Type, comment string) {
- if !types.Identical(x, y) {
- t.Errorf("%s: not equal: %s, %s", comment, x, y)
- }
- if x == y {
- t.Errorf("%s: identical: %v, %v", comment, x, y)
- }
-}
-
-func TestAxioms(t *testing.T) {
- checkEqualButNotIdentical(t, tPStr1, tPStr2, "tPstr{1,2}")
- checkEqualButNotIdentical(t, tChanInt1, tChanInt2, "tChanInt{1,2}")
-}
-
-func TestMap(t *testing.T) {
- var tmap *typeutil.Map
-
- // All methods but Set are safe on on (*T)(nil).
- tmap.Len()
- tmap.At(tPStr1)
- tmap.Delete(tPStr1)
- tmap.KeysString()
- tmap.String()
-
- tmap = new(typeutil.Map)
-
- // Length of empty map.
- if l := tmap.Len(); l != 0 {
- t.Errorf("Len() on empty Map: got %d, want 0", l)
- }
- // At of missing key.
- if v := tmap.At(tPStr1); v != nil {
- t.Errorf("At() on empty Map: got %v, want nil", v)
- }
- // Deletion of missing key.
- if tmap.Delete(tPStr1) {
- t.Errorf("Delete() on empty Map: got true, want false")
- }
- // Set of new key.
- if prev := tmap.Set(tPStr1, "*string"); prev != nil {
- t.Errorf("Set() on empty Map returned non-nil previous value %s", prev)
- }
-
- // Now: {*string: "*string"}
-
- // Length of non-empty map.
- if l := tmap.Len(); l != 1 {
- t.Errorf("Len(): got %d, want 1", l)
- }
- // At via insertion key.
- if v := tmap.At(tPStr1); v != "*string" {
- t.Errorf("At(): got %q, want \"*string\"", v)
- }
- // At via equal key.
- if v := tmap.At(tPStr2); v != "*string" {
- t.Errorf("At(): got %q, want \"*string\"", v)
- }
- // Iteration over sole entry.
- tmap.Iterate(func(key types.Type, value interface{}) {
- if key != tPStr1 {
- t.Errorf("Iterate: key: got %s, want %s", key, tPStr1)
- }
- if want := "*string"; value != want {
- t.Errorf("Iterate: value: got %s, want %s", value, want)
- }
- })
-
- // Setion with key equal to present one.
- if prev := tmap.Set(tPStr2, "*string again"); prev != "*string" {
- t.Errorf("Set() previous value: got %s, want \"*string\"", prev)
- }
-
- // Setion of another association.
- if prev := tmap.Set(tChanInt1, "<-chan int"); prev != nil {
- t.Errorf("Set() previous value: got %s, want nil", prev)
- }
-
- // Now: {*string: "*string again", <-chan int: "<-chan int"}
-
- want1 := "{*string: \"*string again\", <-chan int: \"<-chan int\"}"
- want2 := "{<-chan int: \"<-chan int\", *string: \"*string again\"}"
- if s := tmap.String(); s != want1 && s != want2 {
- t.Errorf("String(): got %s, want %s", s, want1)
- }
-
- want1 = "{*string, <-chan int}"
- want2 = "{<-chan int, *string}"
- if s := tmap.KeysString(); s != want1 && s != want2 {
- t.Errorf("KeysString(): got %s, want %s", s, want1)
- }
-
- // Keys().
- I := types.Identical
- switch k := tmap.Keys(); {
- case I(k[0], tChanInt1) && I(k[1], tPStr1): // ok
- case I(k[1], tChanInt1) && I(k[0], tPStr1): // ok
- default:
- t.Errorf("Keys(): got %v, want %s", k, want2)
- }
-
- if l := tmap.Len(); l != 2 {
- t.Errorf("Len(): got %d, want 1", l)
- }
- // At via original key.
- if v := tmap.At(tPStr1); v != "*string again" {
- t.Errorf("At(): got %q, want \"*string again\"", v)
- }
- hamming := 1
- tmap.Iterate(func(key types.Type, value interface{}) {
- switch {
- case I(key, tChanInt1):
- hamming *= 2 // ok
- case I(key, tPStr1):
- hamming *= 3 // ok
- }
- })
- if hamming != 6 {
- t.Errorf("Iterate: hamming: got %d, want %d", hamming, 6)
- }
-
- if v := tmap.At(tChanInt2); v != "<-chan int" {
- t.Errorf("At(): got %q, want \"<-chan int\"", v)
- }
- // Deletion with key equal to present one.
- if !tmap.Delete(tChanInt2) {
- t.Errorf("Delete() of existing key: got false, want true")
- }
-
- // Now: {*string: "*string again"}
-
- if l := tmap.Len(); l != 1 {
- t.Errorf("Len(): got %d, want 1", l)
- }
- // Deletion again.
- if !tmap.Delete(tPStr2) {
- t.Errorf("Delete() of existing key: got false, want true")
- }
-
- // Now: {}
-
- if l := tmap.Len(); l != 0 {
- t.Errorf("Len(): got %d, want %d", l, 0)
- }
- if s := tmap.String(); s != "{}" {
- t.Errorf("Len(): got %q, want %q", s, "")
- }
-}
diff --git a/vendor/golang.org/x/tools/go/types/typeutil/methodsetcache.go b/vendor/golang.org/x/tools/go/types/typeutil/methodsetcache.go
deleted file mode 100644
index 3208461..0000000
--- a/vendor/golang.org/x/tools/go/types/typeutil/methodsetcache.go
+++ /dev/null
@@ -1,72 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// This file implements a cache of method sets.
-
-package typeutil
-
-import (
- "go/types"
- "sync"
-)
-
-// A MethodSetCache records the method set of each type T for which
-// MethodSet(T) is called so that repeat queries are fast.
-// The zero value is a ready-to-use cache instance.
-type MethodSetCache struct {
- mu sync.Mutex
- named map[*types.Named]struct{ value, pointer *types.MethodSet } // method sets for named N and *N
- others map[types.Type]*types.MethodSet // all other types
-}
-
-// MethodSet returns the method set of type T. It is thread-safe.
-//
-// If cache is nil, this function is equivalent to types.NewMethodSet(T).
-// Utility functions can thus expose an optional *MethodSetCache
-// parameter to clients that care about performance.
-//
-func (cache *MethodSetCache) MethodSet(T types.Type) *types.MethodSet {
- if cache == nil {
- return types.NewMethodSet(T)
- }
- cache.mu.Lock()
- defer cache.mu.Unlock()
-
- switch T := T.(type) {
- case *types.Named:
- return cache.lookupNamed(T).value
-
- case *types.Pointer:
- if N, ok := T.Elem().(*types.Named); ok {
- return cache.lookupNamed(N).pointer
- }
- }
-
- // all other types
- // (The map uses pointer equivalence, not type identity.)
- mset := cache.others[T]
- if mset == nil {
- mset = types.NewMethodSet(T)
- if cache.others == nil {
- cache.others = make(map[types.Type]*types.MethodSet)
- }
- cache.others[T] = mset
- }
- return mset
-}
-
-func (cache *MethodSetCache) lookupNamed(named *types.Named) struct{ value, pointer *types.MethodSet } {
- if cache.named == nil {
- cache.named = make(map[*types.Named]struct{ value, pointer *types.MethodSet })
- }
- // Avoid recomputing mset(*T) for each distinct Pointer
- // instance whose underlying type is a named type.
- msets, ok := cache.named[named]
- if !ok {
- msets.value = types.NewMethodSet(named)
- msets.pointer = types.NewMethodSet(types.NewPointer(named))
- cache.named[named] = msets
- }
- return msets
-}
diff --git a/vendor/golang.org/x/tools/go/types/typeutil/ui.go b/vendor/golang.org/x/tools/go/types/typeutil/ui.go
deleted file mode 100644
index 9849c24..0000000
--- a/vendor/golang.org/x/tools/go/types/typeutil/ui.go
+++ /dev/null
@@ -1,52 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package typeutil
-
-// This file defines utilities for user interfaces that display types.
-
-import "go/types"
-
-// IntuitiveMethodSet returns the intuitive method set of a type T,
-// which is the set of methods you can call on an addressable value of
-// that type.
-//
-// The result always contains MethodSet(T), and is exactly MethodSet(T)
-// for interface types and for pointer-to-concrete types.
-// For all other concrete types T, the result additionally
-// contains each method belonging to *T if there is no identically
-// named method on T itself.
-//
-// This corresponds to user intuition about method sets;
-// this function is intended only for user interfaces.
-//
-// The order of the result is as for types.MethodSet(T).
-//
-func IntuitiveMethodSet(T types.Type, msets *MethodSetCache) []*types.Selection {
- isPointerToConcrete := func(T types.Type) bool {
- ptr, ok := T.(*types.Pointer)
- return ok && !types.IsInterface(ptr.Elem())
- }
-
- var result []*types.Selection
- mset := msets.MethodSet(T)
- if types.IsInterface(T) || isPointerToConcrete(T) {
- for i, n := 0, mset.Len(); i < n; i++ {
- result = append(result, mset.At(i))
- }
- } else {
- // T is some other concrete type.
- // Report methods of T and *T, preferring those of T.
- pmset := msets.MethodSet(types.NewPointer(T))
- for i, n := 0, pmset.Len(); i < n; i++ {
- meth := pmset.At(i)
- if m := mset.Lookup(meth.Obj().Pkg(), meth.Obj().Name()); m != nil {
- meth = m
- }
- result = append(result, meth)
- }
-
- }
- return result
-}
diff --git a/vendor/golang.org/x/tools/go/types/typeutil/ui_test.go b/vendor/golang.org/x/tools/go/types/typeutil/ui_test.go
deleted file mode 100644
index b5064ac..0000000
--- a/vendor/golang.org/x/tools/go/types/typeutil/ui_test.go
+++ /dev/null
@@ -1,61 +0,0 @@
-package typeutil_test
-
-import (
- "fmt"
- "go/ast"
- "go/parser"
- "go/token"
- "go/types"
- "strings"
- "testing"
-
- "golang.org/x/tools/go/types/typeutil"
-)
-
-func TestIntuitiveMethodSet(t *testing.T) {
- const source = `
-package P
-type A int
-func (A) f()
-func (*A) g()
-`
-
- fset := token.NewFileSet()
- f, err := parser.ParseFile(fset, "hello.go", source, 0)
- if err != nil {
- t.Fatal(err)
- }
-
- var conf types.Config
- pkg, err := conf.Check("P", fset, []*ast.File{f}, nil)
- if err != nil {
- t.Fatal(err)
- }
- qual := types.RelativeTo(pkg)
-
- for _, test := range []struct {
- expr string // type expression
- want string // intuitive method set
- }{
- {"A", "(A).f (*A).g"},
- {"*A", "(*A).f (*A).g"},
- {"error", "(error).Error"},
- {"*error", ""},
- {"struct{A}", "(struct{A}).f (*struct{A}).g"},
- {"*struct{A}", "(*struct{A}).f (*struct{A}).g"},
- } {
- tv, err := types.Eval(fset, pkg, 0, test.expr)
- if err != nil {
- t.Errorf("Eval(%s) failed: %v", test.expr, err)
- }
- var names []string
- for _, m := range typeutil.IntuitiveMethodSet(tv.Type, nil) {
- name := fmt.Sprintf("(%s).%s", types.TypeString(m.Recv(), qual), m.Obj().Name())
- names = append(names, name)
- }
- got := strings.Join(names, " ")
- if got != test.want {
- t.Errorf("IntuitiveMethodSet(%s) = %q, want %q", test.expr, got, test.want)
- }
- }
-}
diff --git a/vendor/golang.org/x/tools/go/vcs/discovery.go b/vendor/golang.org/x/tools/go/vcs/discovery.go
deleted file mode 100644
index f431dc1..0000000
--- a/vendor/golang.org/x/tools/go/vcs/discovery.go
+++ /dev/null
@@ -1,76 +0,0 @@
-// Copyright 2012 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package vcs
-
-import (
- "encoding/xml"
- "fmt"
- "io"
- "strings"
-)
-
-// charsetReader returns a reader for the given charset. Currently
-// it only supports UTF-8 and ASCII. Otherwise, it returns a meaningful
-// error which is printed by go get, so the user can find why the package
-// wasn't downloaded if the encoding is not supported. Note that, in
-// order to reduce potential errors, ASCII is treated as UTF-8 (i.e. characters
-// greater than 0x7f are not rejected).
-func charsetReader(charset string, input io.Reader) (io.Reader, error) {
- switch strings.ToLower(charset) {
- case "ascii":
- return input, nil
- default:
- return nil, fmt.Errorf("can't decode XML document using charset %q", charset)
- }
-}
-
-// parseMetaGoImports returns meta imports from the HTML in r.
-// Parsing ends at the end of the section or the beginning of the .
-func parseMetaGoImports(r io.Reader) (imports []metaImport, err error) {
- d := xml.NewDecoder(r)
- d.CharsetReader = charsetReader
- d.Strict = false
- var t xml.Token
- for {
- t, err = d.Token()
- if err != nil {
- if err == io.EOF || len(imports) > 0 {
- err = nil
- }
- return
- }
- if e, ok := t.(xml.StartElement); ok && strings.EqualFold(e.Name.Local, "body") {
- return
- }
- if e, ok := t.(xml.EndElement); ok && strings.EqualFold(e.Name.Local, "head") {
- return
- }
- e, ok := t.(xml.StartElement)
- if !ok || !strings.EqualFold(e.Name.Local, "meta") {
- continue
- }
- if attrValue(e.Attr, "name") != "go-import" {
- continue
- }
- if f := strings.Fields(attrValue(e.Attr, "content")); len(f) == 3 {
- imports = append(imports, metaImport{
- Prefix: f[0],
- VCS: f[1],
- RepoRoot: f[2],
- })
- }
- }
-}
-
-// attrValue returns the attribute value for the case-insensitive key
-// `name', or the empty string if nothing is found.
-func attrValue(attrs []xml.Attr, name string) string {
- for _, a := range attrs {
- if strings.EqualFold(a.Name.Local, name) {
- return a.Value
- }
- }
- return ""
-}
diff --git a/vendor/golang.org/x/tools/go/vcs/env.go b/vendor/golang.org/x/tools/go/vcs/env.go
deleted file mode 100644
index e846f5b..0000000
--- a/vendor/golang.org/x/tools/go/vcs/env.go
+++ /dev/null
@@ -1,39 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package vcs
-
-import (
- "os"
- "strings"
-)
-
-// envForDir returns a copy of the environment
-// suitable for running in the given directory.
-// The environment is the current process's environment
-// but with an updated $PWD, so that an os.Getwd in the
-// child will be faster.
-func envForDir(dir string) []string {
- env := os.Environ()
- // Internally we only use rooted paths, so dir is rooted.
- // Even if dir is not rooted, no harm done.
- return mergeEnvLists([]string{"PWD=" + dir}, env)
-}
-
-// mergeEnvLists merges the two environment lists such that
-// variables with the same name in "in" replace those in "out".
-func mergeEnvLists(in, out []string) []string {
-NextVar:
- for _, inkv := range in {
- k := strings.SplitAfterN(inkv, "=", 2)[0]
- for i, outkv := range out {
- if strings.HasPrefix(outkv, k) {
- out[i] = inkv
- continue NextVar
- }
- }
- out = append(out, inkv)
- }
- return out
-}
diff --git a/vendor/golang.org/x/tools/go/vcs/http.go b/vendor/golang.org/x/tools/go/vcs/http.go
deleted file mode 100644
index 9618818..0000000
--- a/vendor/golang.org/x/tools/go/vcs/http.go
+++ /dev/null
@@ -1,80 +0,0 @@
-// Copyright 2012 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package vcs
-
-import (
- "fmt"
- "io"
- "io/ioutil"
- "log"
- "net/http"
- "net/url"
-)
-
-// httpClient is the default HTTP client, but a variable so it can be
-// changed by tests, without modifying http.DefaultClient.
-var httpClient = http.DefaultClient
-
-// httpGET returns the data from an HTTP GET request for the given URL.
-func httpGET(url string) ([]byte, error) {
- resp, err := httpClient.Get(url)
- if err != nil {
- return nil, err
- }
- defer resp.Body.Close()
- if resp.StatusCode != 200 {
- return nil, fmt.Errorf("%s: %s", url, resp.Status)
- }
- b, err := ioutil.ReadAll(resp.Body)
- if err != nil {
- return nil, fmt.Errorf("%s: %v", url, err)
- }
- return b, nil
-}
-
-// httpsOrHTTP returns the body of either the importPath's
-// https resource or, if unavailable, the http resource.
-func httpsOrHTTP(importPath string) (urlStr string, body io.ReadCloser, err error) {
- fetch := func(scheme string) (urlStr string, res *http.Response, err error) {
- u, err := url.Parse(scheme + "://" + importPath)
- if err != nil {
- return "", nil, err
- }
- u.RawQuery = "go-get=1"
- urlStr = u.String()
- if Verbose {
- log.Printf("Fetching %s", urlStr)
- }
- res, err = httpClient.Get(urlStr)
- return
- }
- closeBody := func(res *http.Response) {
- if res != nil {
- res.Body.Close()
- }
- }
- urlStr, res, err := fetch("https")
- if err != nil || res.StatusCode != 200 {
- if Verbose {
- if err != nil {
- log.Printf("https fetch failed.")
- } else {
- log.Printf("ignoring https fetch with status code %d", res.StatusCode)
- }
- }
- closeBody(res)
- urlStr, res, err = fetch("http")
- }
- if err != nil {
- closeBody(res)
- return "", nil, err
- }
- // Note: accepting a non-200 OK here, so people can serve a
- // meta import in their http 404 page.
- if Verbose {
- log.Printf("Parsing meta tags from %s (status code %d)", urlStr, res.StatusCode)
- }
- return urlStr, res.Body, nil
-}
diff --git a/vendor/golang.org/x/tools/go/vcs/vcs.go b/vendor/golang.org/x/tools/go/vcs/vcs.go
deleted file mode 100644
index 89319be..0000000
--- a/vendor/golang.org/x/tools/go/vcs/vcs.go
+++ /dev/null
@@ -1,755 +0,0 @@
-// Copyright 2012 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Package vcs exposes functions for resolving import paths
-// and using version control systems, which can be used to
-// implement behavior similar to the standard "go get" command.
-//
-// This package is a copy of internal code in package cmd/go/internal/get,
-// modified to make the identifiers exported. It's provided here
-// for developers who want to write tools with similar semantics.
-// It needs to be manually kept in sync with upstream when changes are
-// made to cmd/go/internal/get; see https://golang.org/issues/11490.
-//
-package vcs // import "golang.org/x/tools/go/vcs"
-
-import (
- "bytes"
- "encoding/json"
- "errors"
- "fmt"
- "log"
- "net/url"
- "os"
- "os/exec"
- "path/filepath"
- "regexp"
- "strconv"
- "strings"
-)
-
-// Verbose enables verbose operation logging.
-var Verbose bool
-
-// ShowCmd controls whether VCS commands are printed.
-var ShowCmd bool
-
-// A Cmd describes how to use a version control system
-// like Mercurial, Git, or Subversion.
-type Cmd struct {
- Name string
- Cmd string // name of binary to invoke command
-
- CreateCmd string // command to download a fresh copy of a repository
- DownloadCmd string // command to download updates into an existing repository
-
- TagCmd []TagCmd // commands to list tags
- TagLookupCmd []TagCmd // commands to lookup tags before running tagSyncCmd
- TagSyncCmd string // command to sync to specific tag
- TagSyncDefault string // command to sync to default tag
-
- LogCmd string // command to list repository changelogs in an XML format
-
- Scheme []string
- PingCmd string
-}
-
-// A TagCmd describes a command to list available tags
-// that can be passed to Cmd.TagSyncCmd.
-type TagCmd struct {
- Cmd string // command to list tags
- Pattern string // regexp to extract tags from list
-}
-
-// vcsList lists the known version control systems
-var vcsList = []*Cmd{
- vcsHg,
- vcsGit,
- vcsSvn,
- vcsBzr,
-}
-
-// ByCmd returns the version control system for the given
-// command name (hg, git, svn, bzr).
-func ByCmd(cmd string) *Cmd {
- for _, vcs := range vcsList {
- if vcs.Cmd == cmd {
- return vcs
- }
- }
- return nil
-}
-
-// vcsHg describes how to use Mercurial.
-var vcsHg = &Cmd{
- Name: "Mercurial",
- Cmd: "hg",
-
- CreateCmd: "clone -U {repo} {dir}",
- DownloadCmd: "pull",
-
- // We allow both tag and branch names as 'tags'
- // for selecting a version. This lets people have
- // a go.release.r60 branch and a go1 branch
- // and make changes in both, without constantly
- // editing .hgtags.
- TagCmd: []TagCmd{
- {"tags", `^(\S+)`},
- {"branches", `^(\S+)`},
- },
- TagSyncCmd: "update -r {tag}",
- TagSyncDefault: "update default",
-
- LogCmd: "log --encoding=utf-8 --limit={limit} --template={template}",
-
- Scheme: []string{"https", "http", "ssh"},
- PingCmd: "identify {scheme}://{repo}",
-}
-
-// vcsGit describes how to use Git.
-var vcsGit = &Cmd{
- Name: "Git",
- Cmd: "git",
-
- CreateCmd: "clone {repo} {dir}",
- DownloadCmd: "pull --ff-only",
-
- TagCmd: []TagCmd{
- // tags/xxx matches a git tag named xxx
- // origin/xxx matches a git branch named xxx on the default remote repository
- {"show-ref", `(?:tags|origin)/(\S+)$`},
- },
- TagLookupCmd: []TagCmd{
- {"show-ref tags/{tag} origin/{tag}", `((?:tags|origin)/\S+)$`},
- },
- TagSyncCmd: "checkout {tag}",
- TagSyncDefault: "checkout master",
-
- Scheme: []string{"git", "https", "http", "git+ssh"},
- PingCmd: "ls-remote {scheme}://{repo}",
-}
-
-// vcsBzr describes how to use Bazaar.
-var vcsBzr = &Cmd{
- Name: "Bazaar",
- Cmd: "bzr",
-
- CreateCmd: "branch {repo} {dir}",
-
- // Without --overwrite bzr will not pull tags that changed.
- // Replace by --overwrite-tags after http://pad.lv/681792 goes in.
- DownloadCmd: "pull --overwrite",
-
- TagCmd: []TagCmd{{"tags", `^(\S+)`}},
- TagSyncCmd: "update -r {tag}",
- TagSyncDefault: "update -r revno:-1",
-
- Scheme: []string{"https", "http", "bzr", "bzr+ssh"},
- PingCmd: "info {scheme}://{repo}",
-}
-
-// vcsSvn describes how to use Subversion.
-var vcsSvn = &Cmd{
- Name: "Subversion",
- Cmd: "svn",
-
- CreateCmd: "checkout {repo} {dir}",
- DownloadCmd: "update",
-
- // There is no tag command in subversion.
- // The branch information is all in the path names.
-
- LogCmd: "log --xml --limit={limit}",
-
- Scheme: []string{"https", "http", "svn", "svn+ssh"},
- PingCmd: "info {scheme}://{repo}",
-}
-
-func (v *Cmd) String() string {
- return v.Name
-}
-
-// run runs the command line cmd in the given directory.
-// keyval is a list of key, value pairs. run expands
-// instances of {key} in cmd into value, but only after
-// splitting cmd into individual arguments.
-// If an error occurs, run prints the command line and the
-// command's combined stdout+stderr to standard error.
-// Otherwise run discards the command's output.
-func (v *Cmd) run(dir string, cmd string, keyval ...string) error {
- _, err := v.run1(dir, cmd, keyval, true)
- return err
-}
-
-// runVerboseOnly is like run but only generates error output to standard error in verbose mode.
-func (v *Cmd) runVerboseOnly(dir string, cmd string, keyval ...string) error {
- _, err := v.run1(dir, cmd, keyval, false)
- return err
-}
-
-// runOutput is like run but returns the output of the command.
-func (v *Cmd) runOutput(dir string, cmd string, keyval ...string) ([]byte, error) {
- return v.run1(dir, cmd, keyval, true)
-}
-
-// run1 is the generalized implementation of run and runOutput.
-func (v *Cmd) run1(dir string, cmdline string, keyval []string, verbose bool) ([]byte, error) {
- m := make(map[string]string)
- for i := 0; i < len(keyval); i += 2 {
- m[keyval[i]] = keyval[i+1]
- }
- args := strings.Fields(cmdline)
- for i, arg := range args {
- args[i] = expand(m, arg)
- }
-
- _, err := exec.LookPath(v.Cmd)
- if err != nil {
- fmt.Fprintf(os.Stderr,
- "go: missing %s command. See http://golang.org/s/gogetcmd\n",
- v.Name)
- return nil, err
- }
-
- cmd := exec.Command(v.Cmd, args...)
- cmd.Dir = dir
- cmd.Env = envForDir(cmd.Dir)
- if ShowCmd {
- fmt.Printf("cd %s\n", dir)
- fmt.Printf("%s %s\n", v.Cmd, strings.Join(args, " "))
- }
- var buf bytes.Buffer
- cmd.Stdout = &buf
- cmd.Stderr = &buf
- err = cmd.Run()
- out := buf.Bytes()
- if err != nil {
- if verbose || Verbose {
- fmt.Fprintf(os.Stderr, "# cd %s; %s %s\n", dir, v.Cmd, strings.Join(args, " "))
- os.Stderr.Write(out)
- }
- return nil, err
- }
- return out, nil
-}
-
-// Ping pings the repo to determine if scheme used is valid.
-// This repo must be pingable with this scheme and VCS.
-func (v *Cmd) Ping(scheme, repo string) error {
- return v.runVerboseOnly(".", v.PingCmd, "scheme", scheme, "repo", repo)
-}
-
-// Create creates a new copy of repo in dir.
-// The parent of dir must exist; dir must not.
-func (v *Cmd) Create(dir, repo string) error {
- return v.run(".", v.CreateCmd, "dir", dir, "repo", repo)
-}
-
-// CreateAtRev creates a new copy of repo in dir at revision rev.
-// The parent of dir must exist; dir must not.
-// rev must be a valid revision in repo.
-func (v *Cmd) CreateAtRev(dir, repo, rev string) error {
- if err := v.Create(dir, repo); err != nil {
- return err
- }
- return v.run(dir, v.TagSyncCmd, "tag", rev)
-}
-
-// Download downloads any new changes for the repo in dir.
-// dir must be a valid VCS repo compatible with v.
-func (v *Cmd) Download(dir string) error {
- return v.run(dir, v.DownloadCmd)
-}
-
-// Tags returns the list of available tags for the repo in dir.
-// dir must be a valid VCS repo compatible with v.
-func (v *Cmd) Tags(dir string) ([]string, error) {
- var tags []string
- for _, tc := range v.TagCmd {
- out, err := v.runOutput(dir, tc.Cmd)
- if err != nil {
- return nil, err
- }
- re := regexp.MustCompile(`(?m-s)` + tc.Pattern)
- for _, m := range re.FindAllStringSubmatch(string(out), -1) {
- tags = append(tags, m[1])
- }
- }
- return tags, nil
-}
-
-// TagSync syncs the repo in dir to the named tag, which is either a
-// tag returned by Tags or the empty string (the default tag).
-// dir must be a valid VCS repo compatible with v and the tag must exist.
-func (v *Cmd) TagSync(dir, tag string) error {
- if v.TagSyncCmd == "" {
- return nil
- }
- if tag != "" {
- for _, tc := range v.TagLookupCmd {
- out, err := v.runOutput(dir, tc.Cmd, "tag", tag)
- if err != nil {
- return err
- }
- re := regexp.MustCompile(`(?m-s)` + tc.Pattern)
- m := re.FindStringSubmatch(string(out))
- if len(m) > 1 {
- tag = m[1]
- break
- }
- }
- }
- if tag == "" && v.TagSyncDefault != "" {
- return v.run(dir, v.TagSyncDefault)
- }
- return v.run(dir, v.TagSyncCmd, "tag", tag)
-}
-
-// Log logs the changes for the repo in dir.
-// dir must be a valid VCS repo compatible with v.
-func (v *Cmd) Log(dir, logTemplate string) ([]byte, error) {
- if err := v.Download(dir); err != nil {
- return []byte{}, err
- }
-
- const N = 50 // how many revisions to grab
- return v.runOutput(dir, v.LogCmd, "limit", strconv.Itoa(N), "template", logTemplate)
-}
-
-// LogAtRev logs the change for repo in dir at the rev revision.
-// dir must be a valid VCS repo compatible with v.
-// rev must be a valid revision for the repo in dir.
-func (v *Cmd) LogAtRev(dir, rev, logTemplate string) ([]byte, error) {
- if err := v.Download(dir); err != nil {
- return []byte{}, err
- }
-
- // Append revision flag to LogCmd.
- logAtRevCmd := v.LogCmd + " --rev=" + rev
- return v.runOutput(dir, logAtRevCmd, "limit", strconv.Itoa(1), "template", logTemplate)
-}
-
-// A vcsPath describes how to convert an import path into a
-// version control system and repository name.
-type vcsPath struct {
- prefix string // prefix this description applies to
- re string // pattern for import path
- repo string // repository to use (expand with match of re)
- vcs string // version control system to use (expand with match of re)
- check func(match map[string]string) error // additional checks
- ping bool // ping for scheme to use to download repo
-
- regexp *regexp.Regexp // cached compiled form of re
-}
-
-// FromDir inspects dir and its parents to determine the
-// version control system and code repository to use.
-// On return, root is the import path
-// corresponding to the root of the repository.
-func FromDir(dir, srcRoot string) (vcs *Cmd, root string, err error) {
- // Clean and double-check that dir is in (a subdirectory of) srcRoot.
- dir = filepath.Clean(dir)
- srcRoot = filepath.Clean(srcRoot)
- if len(dir) <= len(srcRoot) || dir[len(srcRoot)] != filepath.Separator {
- return nil, "", fmt.Errorf("directory %q is outside source root %q", dir, srcRoot)
- }
-
- var vcsRet *Cmd
- var rootRet string
-
- origDir := dir
- for len(dir) > len(srcRoot) {
- for _, vcs := range vcsList {
- if _, err := os.Stat(filepath.Join(dir, "."+vcs.Cmd)); err == nil {
- root := filepath.ToSlash(dir[len(srcRoot)+1:])
- // Record first VCS we find, but keep looking,
- // to detect mistakes like one kind of VCS inside another.
- if vcsRet == nil {
- vcsRet = vcs
- rootRet = root
- continue
- }
- // Allow .git inside .git, which can arise due to submodules.
- if vcsRet == vcs && vcs.Cmd == "git" {
- continue
- }
- // Otherwise, we have one VCS inside a different VCS.
- return nil, "", fmt.Errorf("directory %q uses %s, but parent %q uses %s",
- filepath.Join(srcRoot, rootRet), vcsRet.Cmd, filepath.Join(srcRoot, root), vcs.Cmd)
- }
- }
-
- // Move to parent.
- ndir := filepath.Dir(dir)
- if len(ndir) >= len(dir) {
- // Shouldn't happen, but just in case, stop.
- break
- }
- dir = ndir
- }
-
- if vcsRet != nil {
- return vcsRet, rootRet, nil
- }
-
- return nil, "", fmt.Errorf("directory %q is not using a known version control system", origDir)
-}
-
-// RepoRoot represents a version control system, a repo, and a root of
-// where to put it on disk.
-type RepoRoot struct {
- VCS *Cmd
-
- // Repo is the repository URL, including scheme.
- Repo string
-
- // Root is the import path corresponding to the root of the
- // repository.
- Root string
-}
-
-// RepoRootForImportPath analyzes importPath to determine the
-// version control system, and code repository to use.
-func RepoRootForImportPath(importPath string, verbose bool) (*RepoRoot, error) {
- rr, err := RepoRootForImportPathStatic(importPath, "")
- if err == errUnknownSite {
- rr, err = RepoRootForImportDynamic(importPath, verbose)
-
- // RepoRootForImportDynamic returns error detail
- // that is irrelevant if the user didn't intend to use a
- // dynamic import in the first place.
- // Squelch it.
- if err != nil {
- if Verbose {
- log.Printf("import %q: %v", importPath, err)
- }
- err = fmt.Errorf("unrecognized import path %q", importPath)
- }
- }
-
- if err == nil && strings.Contains(importPath, "...") && strings.Contains(rr.Root, "...") {
- // Do not allow wildcards in the repo root.
- rr = nil
- err = fmt.Errorf("cannot expand ... in %q", importPath)
- }
- return rr, err
-}
-
-var errUnknownSite = errors.New("dynamic lookup required to find mapping")
-
-// RepoRootForImportPathStatic attempts to map importPath to a
-// RepoRoot using the commonly-used VCS hosting sites in vcsPaths
-// (github.com/user/dir), or from a fully-qualified importPath already
-// containing its VCS type (foo.com/repo.git/dir)
-//
-// If scheme is non-empty, that scheme is forced.
-func RepoRootForImportPathStatic(importPath, scheme string) (*RepoRoot, error) {
- if strings.Contains(importPath, "://") {
- return nil, fmt.Errorf("invalid import path %q", importPath)
- }
- for _, srv := range vcsPaths {
- if !strings.HasPrefix(importPath, srv.prefix) {
- continue
- }
- m := srv.regexp.FindStringSubmatch(importPath)
- if m == nil {
- if srv.prefix != "" {
- return nil, fmt.Errorf("invalid %s import path %q", srv.prefix, importPath)
- }
- continue
- }
-
- // Build map of named subexpression matches for expand.
- match := map[string]string{
- "prefix": srv.prefix,
- "import": importPath,
- }
- for i, name := range srv.regexp.SubexpNames() {
- if name != "" && match[name] == "" {
- match[name] = m[i]
- }
- }
- if srv.vcs != "" {
- match["vcs"] = expand(match, srv.vcs)
- }
- if srv.repo != "" {
- match["repo"] = expand(match, srv.repo)
- }
- if srv.check != nil {
- if err := srv.check(match); err != nil {
- return nil, err
- }
- }
- vcs := ByCmd(match["vcs"])
- if vcs == nil {
- return nil, fmt.Errorf("unknown version control system %q", match["vcs"])
- }
- if srv.ping {
- if scheme != "" {
- match["repo"] = scheme + "://" + match["repo"]
- } else {
- for _, scheme := range vcs.Scheme {
- if vcs.Ping(scheme, match["repo"]) == nil {
- match["repo"] = scheme + "://" + match["repo"]
- break
- }
- }
- }
- }
- rr := &RepoRoot{
- VCS: vcs,
- Repo: match["repo"],
- Root: match["root"],
- }
- return rr, nil
- }
- return nil, errUnknownSite
-}
-
-// RepoRootForImportDynamic finds a *RepoRoot for a custom domain that's not
-// statically known by RepoRootForImportPathStatic.
-//
-// This handles custom import paths like "name.tld/pkg/foo" or just "name.tld".
-func RepoRootForImportDynamic(importPath string, verbose bool) (*RepoRoot, error) {
- slash := strings.Index(importPath, "/")
- if slash < 0 {
- slash = len(importPath)
- }
- host := importPath[:slash]
- if !strings.Contains(host, ".") {
- return nil, errors.New("import path doesn't contain a hostname")
- }
- urlStr, body, err := httpsOrHTTP(importPath)
- if err != nil {
- return nil, fmt.Errorf("http/https fetch: %v", err)
- }
- defer body.Close()
- imports, err := parseMetaGoImports(body)
- if err != nil {
- return nil, fmt.Errorf("parsing %s: %v", importPath, err)
- }
- metaImport, err := matchGoImport(imports, importPath)
- if err != nil {
- if err != errNoMatch {
- return nil, fmt.Errorf("parse %s: %v", urlStr, err)
- }
- return nil, fmt.Errorf("parse %s: no go-import meta tags", urlStr)
- }
- if verbose {
- log.Printf("get %q: found meta tag %#v at %s", importPath, metaImport, urlStr)
- }
- // If the import was "uni.edu/bob/project", which said the
- // prefix was "uni.edu" and the RepoRoot was "evilroot.com",
- // make sure we don't trust Bob and check out evilroot.com to
- // "uni.edu" yet (possibly overwriting/preempting another
- // non-evil student). Instead, first verify the root and see
- // if it matches Bob's claim.
- if metaImport.Prefix != importPath {
- if verbose {
- log.Printf("get %q: verifying non-authoritative meta tag", importPath)
- }
- urlStr0 := urlStr
- urlStr, body, err = httpsOrHTTP(metaImport.Prefix)
- if err != nil {
- return nil, fmt.Errorf("fetch %s: %v", urlStr, err)
- }
- imports, err := parseMetaGoImports(body)
- if err != nil {
- return nil, fmt.Errorf("parsing %s: %v", importPath, err)
- }
- if len(imports) == 0 {
- return nil, fmt.Errorf("fetch %s: no go-import meta tag", urlStr)
- }
- metaImport2, err := matchGoImport(imports, importPath)
- if err != nil || metaImport != metaImport2 {
- return nil, fmt.Errorf("%s and %s disagree about go-import for %s", urlStr0, urlStr, metaImport.Prefix)
- }
- }
-
- if err := validateRepoRoot(metaImport.RepoRoot); err != nil {
- return nil, fmt.Errorf("%s: invalid repo root %q: %v", urlStr, metaImport.RepoRoot, err)
- }
- rr := &RepoRoot{
- VCS: ByCmd(metaImport.VCS),
- Repo: metaImport.RepoRoot,
- Root: metaImport.Prefix,
- }
- if rr.VCS == nil {
- return nil, fmt.Errorf("%s: unknown vcs %q", urlStr, metaImport.VCS)
- }
- return rr, nil
-}
-
-// validateRepoRoot returns an error if repoRoot does not seem to be
-// a valid URL with scheme.
-func validateRepoRoot(repoRoot string) error {
- url, err := url.Parse(repoRoot)
- if err != nil {
- return err
- }
- if url.Scheme == "" {
- return errors.New("no scheme")
- }
- return nil
-}
-
-// metaImport represents the parsed tags from HTML files.
-type metaImport struct {
- Prefix, VCS, RepoRoot string
-}
-
-// errNoMatch is returned from matchGoImport when there's no applicable match.
-var errNoMatch = errors.New("no import match")
-
-// matchGoImport returns the metaImport from imports matching importPath.
-// An error is returned if there are multiple matches.
-// errNoMatch is returned if none match.
-func matchGoImport(imports []metaImport, importPath string) (_ metaImport, err error) {
- match := -1
- for i, im := range imports {
- if !strings.HasPrefix(importPath, im.Prefix) {
- continue
- }
- if match != -1 {
- err = fmt.Errorf("multiple meta tags match import path %q", importPath)
- return
- }
- match = i
- }
- if match == -1 {
- err = errNoMatch
- return
- }
- return imports[match], nil
-}
-
-// expand rewrites s to replace {k} with match[k] for each key k in match.
-func expand(match map[string]string, s string) string {
- for k, v := range match {
- s = strings.Replace(s, "{"+k+"}", v, -1)
- }
- return s
-}
-
-// vcsPaths lists the known vcs paths.
-var vcsPaths = []*vcsPath{
- // go.googlesource.com
- {
- prefix: "go.googlesource.com",
- re: `^(?Pgo\.googlesource\.com/[A-Za-z0-9_.\-]+/?)$`,
- vcs: "git",
- repo: "https://{root}",
- check: noVCSSuffix,
- },
-
- // Github
- {
- prefix: "github.com/",
- re: `^(?Pgithub\.com/[A-Za-z0-9_.\-]+/[A-Za-z0-9_.\-]+)(/[\p{L}0-9_.\-]+)*$`,
- vcs: "git",
- repo: "https://{root}",
- check: noVCSSuffix,
- },
-
- // Bitbucket
- {
- prefix: "bitbucket.org/",
- re: `^(?Pbitbucket\.org/(?P[A-Za-z0-9_.\-]+/[A-Za-z0-9_.\-]+))(/[A-Za-z0-9_.\-]+)*$`,
- repo: "https://{root}",
- check: bitbucketVCS,
- },
-
- // Launchpad
- {
- prefix: "launchpad.net/",
- re: `^(?Plaunchpad\.net/((?P[A-Za-z0-9_.\-]+)(?P/[A-Za-z0-9_.\-]+)?|~[A-Za-z0-9_.\-]+/(\+junk|[A-Za-z0-9_.\-]+)/[A-Za-z0-9_.\-]+))(/[A-Za-z0-9_.\-]+)*$`,
- vcs: "bzr",
- repo: "https://{root}",
- check: launchpadVCS,
- },
-
- // Git at OpenStack
- {
- prefix: "git.openstack.org",
- re: `^(?Pgit\.openstack\.org/[A-Za-z0-9_.\-]+/[A-Za-z0-9_.\-]+)(\.git)?(/[A-Za-z0-9_.\-]+)*$`,
- vcs: "git",
- repo: "https://{root}",
- check: noVCSSuffix,
- },
-
- // General syntax for any server.
- {
- re: `^(?P(?P([a-z0-9.\-]+\.)+[a-z0-9.\-]+(:[0-9]+)?/[A-Za-z0-9_.\-/]*?)\.(?Pbzr|git|hg|svn))(/[A-Za-z0-9_.\-]+)*$`,
- ping: true,
- },
-}
-
-func init() {
- // fill in cached regexps.
- // Doing this eagerly discovers invalid regexp syntax
- // without having to run a command that needs that regexp.
- for _, srv := range vcsPaths {
- srv.regexp = regexp.MustCompile(srv.re)
- }
-}
-
-// noVCSSuffix checks that the repository name does not
-// end in .foo for any version control system foo.
-// The usual culprit is ".git".
-func noVCSSuffix(match map[string]string) error {
- repo := match["repo"]
- for _, vcs := range vcsList {
- if strings.HasSuffix(repo, "."+vcs.Cmd) {
- return fmt.Errorf("invalid version control suffix in %s path", match["prefix"])
- }
- }
- return nil
-}
-
-// bitbucketVCS determines the version control system for a
-// Bitbucket repository, by using the Bitbucket API.
-func bitbucketVCS(match map[string]string) error {
- if err := noVCSSuffix(match); err != nil {
- return err
- }
-
- var resp struct {
- SCM string `json:"scm"`
- }
- url := expand(match, "https://api.bitbucket.org/1.0/repositories/{bitname}")
- data, err := httpGET(url)
- if err != nil {
- return err
- }
- if err := json.Unmarshal(data, &resp); err != nil {
- return fmt.Errorf("decoding %s: %v", url, err)
- }
-
- if ByCmd(resp.SCM) != nil {
- match["vcs"] = resp.SCM
- if resp.SCM == "git" {
- match["repo"] += ".git"
- }
- return nil
- }
-
- return fmt.Errorf("unable to detect version control system for bitbucket.org/ path")
-}
-
-// launchpadVCS solves the ambiguity for "lp.net/project/foo". In this case,
-// "foo" could be a series name registered in Launchpad with its own branch,
-// and it could also be the name of a directory within the main project
-// branch one level up.
-func launchpadVCS(match map[string]string) error {
- if match["project"] == "" || match["series"] == "" {
- return nil
- }
- _, err := httpGET(expand(match, "https://code.launchpad.net/{project}{series}/.bzr/branch-format"))
- if err != nil {
- match["root"] = expand(match, "launchpad.net/{project}")
- match["repo"] = expand(match, "https://{root}")
- }
- return nil
-}
diff --git a/vendor/golang.org/x/tools/go/vcs/vcs_test.go b/vendor/golang.org/x/tools/go/vcs/vcs_test.go
deleted file mode 100644
index ee422e8..0000000
--- a/vendor/golang.org/x/tools/go/vcs/vcs_test.go
+++ /dev/null
@@ -1,186 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package vcs
-
-import (
- "io/ioutil"
- "os"
- "path"
- "path/filepath"
- "reflect"
- "runtime"
- "strings"
- "testing"
-)
-
-// Test that RepoRootForImportPath creates the correct RepoRoot for a given importPath.
-// TODO(cmang): Add tests for SVN and BZR.
-func TestRepoRootForImportPath(t *testing.T) {
- if runtime.GOOS == "android" {
- t.Skipf("incomplete source tree on %s", runtime.GOOS)
- }
-
- tests := []struct {
- path string
- want *RepoRoot
- }{
- {
- "github.com/golang/groupcache",
- &RepoRoot{
- VCS: vcsGit,
- Repo: "https://github.com/golang/groupcache",
- },
- },
- // Unicode letters in directories (issue 18660).
- {
- "github.com/user/unicode/испытание",
- &RepoRoot{
- VCS: vcsGit,
- Repo: "https://github.com/user/unicode",
- },
- },
- }
-
- for _, test := range tests {
- got, err := RepoRootForImportPath(test.path, false)
- if err != nil {
- t.Errorf("RepoRootForImportPath(%q): %v", test.path, err)
- continue
- }
- want := test.want
- if got.VCS.Name != want.VCS.Name || got.Repo != want.Repo {
- t.Errorf("RepoRootForImportPath(%q) = VCS(%s) Repo(%s), want VCS(%s) Repo(%s)", test.path, got.VCS, got.Repo, want.VCS, want.Repo)
- }
- }
-}
-
-// Test that FromDir correctly inspects a given directory and returns the right VCS and root.
-func TestFromDir(t *testing.T) {
- tempDir, err := ioutil.TempDir("", "vcstest")
- if err != nil {
- t.Fatal(err)
- }
- defer os.RemoveAll(tempDir)
-
- for j, vcs := range vcsList {
- dir := filepath.Join(tempDir, "example.com", vcs.Name, "."+vcs.Cmd)
- if j&1 == 0 {
- err := os.MkdirAll(dir, 0755)
- if err != nil {
- t.Fatal(err)
- }
- } else {
- err := os.MkdirAll(filepath.Dir(dir), 0755)
- if err != nil {
- t.Fatal(err)
- }
- f, err := os.Create(dir)
- if err != nil {
- t.Fatal(err)
- }
- f.Close()
- }
-
- want := RepoRoot{
- VCS: vcs,
- Root: path.Join("example.com", vcs.Name),
- }
- var got RepoRoot
- got.VCS, got.Root, err = FromDir(dir, tempDir)
- if err != nil {
- t.Errorf("FromDir(%q, %q): %v", dir, tempDir, err)
- continue
- }
- if got.VCS.Name != want.VCS.Name || got.Root != want.Root {
- t.Errorf("FromDir(%q, %q) = VCS(%s) Root(%s), want VCS(%s) Root(%s)", dir, tempDir, got.VCS, got.Root, want.VCS, want.Root)
- }
- }
-}
-
-var parseMetaGoImportsTests = []struct {
- in string
- out []metaImport
-}{
- {
- ` `,
- []metaImport{{"foo/bar", "git", "https://github.com/rsc/foo/bar"}},
- },
- {
- `
- `,
- []metaImport{
- {"foo/bar", "git", "https://github.com/rsc/foo/bar"},
- {"baz/quux", "git", "http://github.com/rsc/baz/quux"},
- },
- },
- {
- `
-
- `,
- []metaImport{{"foo/bar", "git", "https://github.com/rsc/foo/bar"}},
- },
- {
- `
- `,
- []metaImport{{"foo/bar", "git", "https://github.com/rsc/foo/bar"}},
- },
-}
-
-func TestParseMetaGoImports(t *testing.T) {
- for i, tt := range parseMetaGoImportsTests {
- out, err := parseMetaGoImports(strings.NewReader(tt.in))
- if err != nil {
- t.Errorf("test#%d: %v", i, err)
- continue
- }
- if !reflect.DeepEqual(out, tt.out) {
- t.Errorf("test#%d:\n\thave %q\n\twant %q", i, out, tt.out)
- }
- }
-}
-
-func TestValidateRepoRoot(t *testing.T) {
- tests := []struct {
- root string
- ok bool
- }{
- {
- root: "",
- ok: false,
- },
- {
- root: "http://",
- ok: true,
- },
- {
- root: "git+ssh://",
- ok: true,
- },
- {
- root: "http#://",
- ok: false,
- },
- {
- root: "-config",
- ok: false,
- },
- {
- root: "-config://",
- ok: false,
- },
- }
-
- for _, test := range tests {
- err := validateRepoRoot(test.root)
- ok := err == nil
- if ok != test.ok {
- want := "error"
- if test.ok {
- want = "nil"
- }
- t.Errorf("validateRepoRoot(%q) = %q, want %s", test.root, err, want)
- }
- }
-}
diff --git a/vendor/golang.org/x/tools/godoc/README.md b/vendor/golang.org/x/tools/godoc/README.md
deleted file mode 100644
index 52bc8a4..0000000
--- a/vendor/golang.org/x/tools/godoc/README.md
+++ /dev/null
@@ -1,31 +0,0 @@
-# godoc
-
-This directory contains most of the code for running a godoc server. The
-executable lives at golang.org/x/tools/cmd/godoc.
-
-## Development mode
-
-In production, CSS/JS/template assets need to be compiled into the godoc
-binary. It can be tedious to recompile assets every time, but you can pass a
-flag to load CSS/JS/templates from disk every time a page loads:
-
-```
-godoc -templates=$GOPATH/src/golang.org/x/tools/godoc/static -http=:6060
-```
-
-## Recompiling static assets
-
-The files that live at `static/style.css`, `static/jquery.js` and so on are not
-present in the final binary. They are placed into `static/static.go` by running
-`go generate`. So to compile a change and test it in your browser:
-
-1) Make changes to e.g. `static/style.css`.
-
-2) Run `go generate golang.org/x/tools/godoc/static` so `static/static.go` picks
-up the change.
-
-3) Run `go install golang.org/x/tools/cmd/godoc` so the compiled `godoc` binary
-picks up the change.
-
-4) Run `godoc -http=:6060` and view your changes in the browser. You may need
-to disable your browser's cache to avoid reloading a stale file.
diff --git a/vendor/golang.org/x/tools/godoc/analysis/README b/vendor/golang.org/x/tools/godoc/analysis/README
deleted file mode 100644
index 5b29a32..0000000
--- a/vendor/golang.org/x/tools/godoc/analysis/README
+++ /dev/null
@@ -1,111 +0,0 @@
-
-Type and Pointer Analysis to-do list
-====================================
-
-Alan Donovan
-
-
-Overall design
---------------
-
-We should re-run the type and pointer analyses periodically,
-as we do with the indexer.
-
-Version skew: how to mitigate the bad effects of stale URLs in old pages?
-We could record the file's length/CRC32/mtime in the go/loader, and
-refuse to decorate it with links unless they match at serving time.
-
-Use the VFS mechanism when (a) enumerating packages and (b) loading
-them. (Requires planned changes to go/loader.)
-
-Future work: shard this using map/reduce for larger corpora.
-
-Testing: how does one test that a web page "looks right"?
-
-
-Bugs
-----
-
-(*ssa.Program).Create requires transitively error-free packages. We
-can make this more robust by making the requirement transitively free
-of "hard" errors; soft errors are fine.
-
-Markup of compiler errors is slightly buggy because they overlap with
-other selections (e.g. Idents). Fix.
-
-
-User Interface
---------------
-
-CALLGRAPH:
-- Add a search box: given a search node, expand path from each entry
- point to it.
-- Cause hovering over a given node to highlight that node, and all
- nodes that are logically identical to it.
-- Initially expand the callgraph trees (but not their toggle divs).
-
-CALLEES:
-- The '(' links are not very discoverable. Highlight them?
-
-Type info:
-- In the source viewer's lower pane, use a toggle div around the
- IMPLEMENTS and METHODSETS lists, like we do in the pacakge view.
- Only expand them initially if short.
-- Include IMPLEMENTS and METHOD SETS information in search index.
-- URLs in IMPLEMENTS/METHOD SETS always link to source, even from the
- package docs view. This makes sense for links to non-exported
- types, but links to exported types and funcs should probably go to
- other package docs.
-- Suppress toggle divs for empty method sets.
-
-Misc:
-- The [X] button in the lower pane is subject to scrolling.
-- Should the lower pane be floating? An iframe?
- When we change document.location by clicking on a link, it will go away.
- How do we prevent that (a la Gmail's chat windows)?
-- Progress/status: for each file, display its analysis status, one of:
- - not in analysis scope
- - type analysis running...
- - type analysis complete
- (+ optionally: there were type errors in this file)
- And if PTA requested:
- - type analysis complete; PTA not attempted due to type errors
- - PTA running...
- - PTA complete
-- Scroll the selection into view, e.g. the vertical center, or better
- still, under the pointer (assuming we have a mouse).
-
-
-More features
--------------
-
-Display the REFERRERS relation? (Useful but potentially large.)
-
-Display the INSTANTIATIONS relation? i.e. given a type T, show the set of
-syntactic constructs that can instantiate it:
- var x T
- x := T{...}
- x = new(T)
- x = make([]T, n)
- etc
- + all INSTANTIATIONS of all S defined as struct{t T} or [n]T
-(Potentially a lot of information.)
-(Add this to guru too.)
-
-
-Optimisations
--------------
-
-Each call to addLink takes a (per-file) lock. The locking is
-fine-grained so server latency isn't terrible, but overall it makes
-the link computation quite slow. Batch update might be better.
-
-Memory usage is now about 1.5GB for GOROOT + go.tools. It used to be 700MB.
-
-Optimize for time and space. The main slowdown is the network I/O
-time caused by an increase in page size of about 3x: about 2x from
-HTML, and 0.7--2.1x from JSON (unindented vs indented). The JSON
-contains a lot of filenames (e.g. 820 copies of 16 distinct
-filenames). 20% of the HTML is L%d spans (now disabled). The HTML
-also contains lots of tooltips for long struct/interface types.
-De-dup or just abbreviate? The actual formatting is very fast.
diff --git a/vendor/golang.org/x/tools/godoc/analysis/analysis.go b/vendor/golang.org/x/tools/godoc/analysis/analysis.go
deleted file mode 100644
index b79286c..0000000
--- a/vendor/golang.org/x/tools/godoc/analysis/analysis.go
+++ /dev/null
@@ -1,613 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Package analysis performs type and pointer analysis
-// and generates mark-up for the Go source view.
-//
-// The Run method populates a Result object by running type and
-// (optionally) pointer analysis. The Result object is thread-safe
-// and at all times may be accessed by a serving thread, even as it is
-// progressively populated as analysis facts are derived.
-//
-// The Result is a mapping from each godoc file URL
-// (e.g. /src/fmt/print.go) to information about that file. The
-// information is a list of HTML markup links and a JSON array of
-// structured data values. Some of the links call client-side
-// JavaScript functions that index this array.
-//
-// The analysis computes mark-up for the following relations:
-//
-// IMPORTS: for each ast.ImportSpec, the package that it denotes.
-//
-// RESOLUTION: for each ast.Ident, its kind and type, and the location
-// of its definition.
-//
-// METHOD SETS, IMPLEMENTS: for each ast.Ident defining a named type,
-// its method-set, the set of interfaces it implements or is
-// implemented by, and its size/align values.
-//
-// CALLERS, CALLEES: for each function declaration ('func' token), its
-// callers, and for each call-site ('(' token), its callees.
-//
-// CALLGRAPH: the package docs include an interactive viewer for the
-// intra-package call graph of "fmt".
-//
-// CHANNEL PEERS: for each channel operation make/<-/close, the set of
-// other channel ops that alias the same channel(s).
-//
-// ERRORS: for each locus of a frontend (scanner/parser/type) error, the
-// location is highlighted in red and hover text provides the compiler
-// error message.
-//
-package analysis // import "golang.org/x/tools/godoc/analysis"
-
-import (
- "fmt"
- "go/build"
- "go/scanner"
- "go/token"
- "go/types"
- "html"
- "io"
- "log"
- "os"
- "path/filepath"
- "sort"
- "strings"
- "sync"
-
- "golang.org/x/tools/go/loader"
- "golang.org/x/tools/go/pointer"
- "golang.org/x/tools/go/ssa"
- "golang.org/x/tools/go/ssa/ssautil"
-)
-
-// -- links ------------------------------------------------------------
-
-// A Link is an HTML decoration of the bytes [Start, End) of a file.
-// Write is called before/after those bytes to emit the mark-up.
-type Link interface {
- Start() int
- End() int
- Write(w io.Writer, _ int, start bool) // the godoc.LinkWriter signature
-}
-
-// An element.
-type aLink struct {
- start, end int // =godoc.Segment
- title string // hover text
- onclick string // JS code (NB: trusted)
- href string // URL (NB: trusted)
-}
-
-func (a aLink) Start() int { return a.start }
-func (a aLink) End() int { return a.end }
-func (a aLink) Write(w io.Writer, _ int, start bool) {
- if start {
- fmt.Fprintf(w, ` ")
- } else {
- fmt.Fprintf(w, " ")
- }
-}
-
-// An element.
-type errorLink struct {
- start int
- msg string
-}
-
-func (e errorLink) Start() int { return e.start }
-func (e errorLink) End() int { return e.start + 1 }
-
-func (e errorLink) Write(w io.Writer, _ int, start bool) {
- // causes havoc, not sure why, so use .
- if start {
- fmt.Fprintf(w, ` `, html.EscapeString(e.msg))
- } else {
- fmt.Fprintf(w, " ")
- }
-}
-
-// -- fileInfo ---------------------------------------------------------
-
-// FileInfo holds analysis information for the source file view.
-// Clients must not mutate it.
-type FileInfo struct {
- Data []interface{} // JSON serializable values
- Links []Link // HTML link markup
-}
-
-// A fileInfo is the server's store of hyperlinks and JSON data for a
-// particular file.
-type fileInfo struct {
- mu sync.Mutex
- data []interface{} // JSON objects
- links []Link
- sorted bool
- hasErrors bool // TODO(adonovan): surface this in the UI
-}
-
-// addLink adds a link to the Go source file fi.
-func (fi *fileInfo) addLink(link Link) {
- fi.mu.Lock()
- fi.links = append(fi.links, link)
- fi.sorted = false
- if _, ok := link.(errorLink); ok {
- fi.hasErrors = true
- }
- fi.mu.Unlock()
-}
-
-// addData adds the structured value x to the JSON data for the Go
-// source file fi. Its index is returned.
-func (fi *fileInfo) addData(x interface{}) int {
- fi.mu.Lock()
- index := len(fi.data)
- fi.data = append(fi.data, x)
- fi.mu.Unlock()
- return index
-}
-
-// get returns the file info in external form.
-// Callers must not mutate its fields.
-func (fi *fileInfo) get() FileInfo {
- var r FileInfo
- // Copy slices, to avoid races.
- fi.mu.Lock()
- r.Data = append(r.Data, fi.data...)
- if !fi.sorted {
- sort.Sort(linksByStart(fi.links))
- fi.sorted = true
- }
- r.Links = append(r.Links, fi.links...)
- fi.mu.Unlock()
- return r
-}
-
-// PackageInfo holds analysis information for the package view.
-// Clients must not mutate it.
-type PackageInfo struct {
- CallGraph []*PCGNodeJSON
- CallGraphIndex map[string]int
- Types []*TypeInfoJSON
-}
-
-type pkgInfo struct {
- mu sync.Mutex
- callGraph []*PCGNodeJSON
- callGraphIndex map[string]int // keys are (*ssa.Function).RelString()
- types []*TypeInfoJSON // type info for exported types
-}
-
-func (pi *pkgInfo) setCallGraph(callGraph []*PCGNodeJSON, callGraphIndex map[string]int) {
- pi.mu.Lock()
- pi.callGraph = callGraph
- pi.callGraphIndex = callGraphIndex
- pi.mu.Unlock()
-}
-
-func (pi *pkgInfo) addType(t *TypeInfoJSON) {
- pi.mu.Lock()
- pi.types = append(pi.types, t)
- pi.mu.Unlock()
-}
-
-// get returns the package info in external form.
-// Callers must not mutate its fields.
-func (pi *pkgInfo) get() PackageInfo {
- var r PackageInfo
- // Copy slices, to avoid races.
- pi.mu.Lock()
- r.CallGraph = append(r.CallGraph, pi.callGraph...)
- r.CallGraphIndex = pi.callGraphIndex
- r.Types = append(r.Types, pi.types...)
- pi.mu.Unlock()
- return r
-}
-
-// -- Result -----------------------------------------------------------
-
-// Result contains the results of analysis.
-// The result contains a mapping from filenames to a set of HTML links
-// and JavaScript data referenced by the links.
-type Result struct {
- mu sync.Mutex // guards maps (but not their contents)
- status string // global analysis status
- fileInfos map[string]*fileInfo // keys are godoc file URLs
- pkgInfos map[string]*pkgInfo // keys are import paths
-}
-
-// fileInfo returns the fileInfo for the specified godoc file URL,
-// constructing it as needed. Thread-safe.
-func (res *Result) fileInfo(url string) *fileInfo {
- res.mu.Lock()
- fi, ok := res.fileInfos[url]
- if !ok {
- if res.fileInfos == nil {
- res.fileInfos = make(map[string]*fileInfo)
- }
- fi = new(fileInfo)
- res.fileInfos[url] = fi
- }
- res.mu.Unlock()
- return fi
-}
-
-// Status returns a human-readable description of the current analysis status.
-func (res *Result) Status() string {
- res.mu.Lock()
- defer res.mu.Unlock()
- return res.status
-}
-
-func (res *Result) setStatusf(format string, args ...interface{}) {
- res.mu.Lock()
- res.status = fmt.Sprintf(format, args...)
- log.Printf(format, args...)
- res.mu.Unlock()
-}
-
-// FileInfo returns new slices containing opaque JSON values and the
-// HTML link markup for the specified godoc file URL. Thread-safe.
-// Callers must not mutate the elements.
-// It returns "zero" if no data is available.
-//
-func (res *Result) FileInfo(url string) (fi FileInfo) {
- return res.fileInfo(url).get()
-}
-
-// pkgInfo returns the pkgInfo for the specified import path,
-// constructing it as needed. Thread-safe.
-func (res *Result) pkgInfo(importPath string) *pkgInfo {
- res.mu.Lock()
- pi, ok := res.pkgInfos[importPath]
- if !ok {
- if res.pkgInfos == nil {
- res.pkgInfos = make(map[string]*pkgInfo)
- }
- pi = new(pkgInfo)
- res.pkgInfos[importPath] = pi
- }
- res.mu.Unlock()
- return pi
-}
-
-// PackageInfo returns new slices of JSON values for the callgraph and
-// type info for the specified package. Thread-safe.
-// Callers must not mutate its fields.
-// PackageInfo returns "zero" if no data is available.
-//
-func (res *Result) PackageInfo(importPath string) PackageInfo {
- return res.pkgInfo(importPath).get()
-}
-
-// -- analysis ---------------------------------------------------------
-
-type analysis struct {
- result *Result
- prog *ssa.Program
- ops []chanOp // all channel ops in program
- allNamed []*types.Named // all "defined" (formerly "named") types in the program
- ptaConfig pointer.Config
- path2url map[string]string // maps openable path to godoc file URL (/src/fmt/print.go)
- pcgs map[*ssa.Package]*packageCallGraph
-}
-
-// fileAndOffset returns the file and offset for a given pos.
-func (a *analysis) fileAndOffset(pos token.Pos) (fi *fileInfo, offset int) {
- return a.fileAndOffsetPosn(a.prog.Fset.Position(pos))
-}
-
-// fileAndOffsetPosn returns the file and offset for a given position.
-func (a *analysis) fileAndOffsetPosn(posn token.Position) (fi *fileInfo, offset int) {
- url := a.path2url[posn.Filename]
- return a.result.fileInfo(url), posn.Offset
-}
-
-// posURL returns the URL of the source extent [pos, pos+len).
-func (a *analysis) posURL(pos token.Pos, len int) string {
- if pos == token.NoPos {
- return ""
- }
- posn := a.prog.Fset.Position(pos)
- url := a.path2url[posn.Filename]
- return fmt.Sprintf("%s?s=%d:%d#L%d",
- url, posn.Offset, posn.Offset+len, posn.Line)
-}
-
-// ----------------------------------------------------------------------
-
-// Run runs program analysis and computes the resulting markup,
-// populating *result in a thread-safe manner, first with type
-// information then later with pointer analysis information if
-// enabled by the pta flag.
-//
-func Run(pta bool, result *Result) {
- conf := loader.Config{
- AllowErrors: true,
- }
-
- // Silence the default error handler.
- // Don't print all errors; we'll report just
- // one per errant package later.
- conf.TypeChecker.Error = func(e error) {}
-
- var roots, args []string // roots[i] ends with os.PathSeparator
-
- // Enumerate packages in $GOROOT.
- root := filepath.Join(build.Default.GOROOT, "src") + string(os.PathSeparator)
- roots = append(roots, root)
- args = allPackages(root)
- log.Printf("GOROOT=%s: %s\n", root, args)
-
- // Enumerate packages in $GOPATH.
- for i, dir := range filepath.SplitList(build.Default.GOPATH) {
- root := filepath.Join(dir, "src") + string(os.PathSeparator)
- roots = append(roots, root)
- pkgs := allPackages(root)
- log.Printf("GOPATH[%d]=%s: %s\n", i, root, pkgs)
- args = append(args, pkgs...)
- }
-
- // Uncomment to make startup quicker during debugging.
- //args = []string{"golang.org/x/tools/cmd/godoc"}
- //args = []string{"fmt"}
-
- if _, err := conf.FromArgs(args, true); err != nil {
- // TODO(adonovan): degrade gracefully, not fail totally.
- // (The crippling case is a parse error in an external test file.)
- result.setStatusf("Analysis failed: %s.", err) // import error
- return
- }
-
- result.setStatusf("Loading and type-checking packages...")
- iprog, err := conf.Load()
- if iprog != nil {
- // Report only the first error of each package.
- for _, info := range iprog.AllPackages {
- for _, err := range info.Errors {
- fmt.Fprintln(os.Stderr, err)
- break
- }
- }
- log.Printf("Loaded %d packages.", len(iprog.AllPackages))
- }
- if err != nil {
- result.setStatusf("Loading failed: %s.\n", err)
- return
- }
-
- // Create SSA-form program representation.
- // Only the transitively error-free packages are used.
- prog := ssautil.CreateProgram(iprog, ssa.GlobalDebug)
-
- // Create a "testmain" package for each package with tests.
- for _, pkg := range prog.AllPackages() {
- if testmain := prog.CreateTestMainPackage(pkg); testmain != nil {
- log.Printf("Adding tests for %s", pkg.Pkg.Path())
- }
- }
-
- // Build SSA code for bodies of all functions in the whole program.
- result.setStatusf("Constructing SSA form...")
- prog.Build()
- log.Print("SSA construction complete")
-
- a := analysis{
- result: result,
- prog: prog,
- pcgs: make(map[*ssa.Package]*packageCallGraph),
- }
-
- // Build a mapping from openable filenames to godoc file URLs,
- // i.e. "/src/" plus path relative to GOROOT/src or GOPATH[i]/src.
- a.path2url = make(map[string]string)
- for _, info := range iprog.AllPackages {
- nextfile:
- for _, f := range info.Files {
- if f.Pos() == 0 {
- continue // e.g. files generated by cgo
- }
- abs := iprog.Fset.File(f.Pos()).Name()
- // Find the root to which this file belongs.
- for _, root := range roots {
- rel := strings.TrimPrefix(abs, root)
- if len(rel) < len(abs) {
- a.path2url[abs] = "/src/" + filepath.ToSlash(rel)
- continue nextfile
- }
- }
-
- log.Printf("Can't locate file %s (package %q) beneath any root",
- abs, info.Pkg.Path())
- }
- }
-
- // Add links for scanner, parser, type-checker errors.
- // TODO(adonovan): fix: these links can overlap with
- // identifier markup, causing the renderer to emit some
- // characters twice.
- errors := make(map[token.Position][]string)
- for _, info := range iprog.AllPackages {
- for _, err := range info.Errors {
- switch err := err.(type) {
- case types.Error:
- posn := a.prog.Fset.Position(err.Pos)
- errors[posn] = append(errors[posn], err.Msg)
- case scanner.ErrorList:
- for _, e := range err {
- errors[e.Pos] = append(errors[e.Pos], e.Msg)
- }
- default:
- log.Printf("Package %q has error (%T) without position: %v\n",
- info.Pkg.Path(), err, err)
- }
- }
- }
- for posn, errs := range errors {
- fi, offset := a.fileAndOffsetPosn(posn)
- fi.addLink(errorLink{
- start: offset,
- msg: strings.Join(errs, "\n"),
- })
- }
-
- // ---------- type-based analyses ----------
-
- // Compute the all-pairs IMPLEMENTS relation.
- // Collect all named types, even local types
- // (which can have methods via promotion)
- // and the built-in "error".
- errorType := types.Universe.Lookup("error").Type().(*types.Named)
- a.allNamed = append(a.allNamed, errorType)
- for _, info := range iprog.AllPackages {
- for _, obj := range info.Defs {
- if obj, ok := obj.(*types.TypeName); ok {
- if named, ok := obj.Type().(*types.Named); ok {
- a.allNamed = append(a.allNamed, named)
- }
- }
- }
- }
- log.Print("Computing implements relation...")
- facts := computeImplements(&a.prog.MethodSets, a.allNamed)
-
- // Add the type-based analysis results.
- log.Print("Extracting type info...")
- for _, info := range iprog.AllPackages {
- a.doTypeInfo(info, facts)
- }
-
- a.visitInstrs(pta)
-
- result.setStatusf("Type analysis complete.")
-
- if pta {
- mainPkgs := ssautil.MainPackages(prog.AllPackages())
- log.Print("Transitively error-free main packages: ", mainPkgs)
- a.pointer(mainPkgs)
- }
-}
-
-// visitInstrs visits all SSA instructions in the program.
-func (a *analysis) visitInstrs(pta bool) {
- log.Print("Visit instructions...")
- for fn := range ssautil.AllFunctions(a.prog) {
- for _, b := range fn.Blocks {
- for _, instr := range b.Instrs {
- // CALLEES (static)
- // (Dynamic calls require pointer analysis.)
- //
- // We use the SSA representation to find the static callee,
- // since in many cases it does better than the
- // types.Info.{Refs,Selection} information. For example:
- //
- // defer func(){}() // static call to anon function
- // f := func(){}; f() // static call to anon function
- // f := fmt.Println; f() // static call to named function
- //
- // The downside is that we get no static callee information
- // for packages that (transitively) contain errors.
- if site, ok := instr.(ssa.CallInstruction); ok {
- if callee := site.Common().StaticCallee(); callee != nil {
- // TODO(adonovan): callgraph: elide wrappers.
- // (Do static calls ever go to wrappers?)
- if site.Common().Pos() != token.NoPos {
- a.addCallees(site, []*ssa.Function{callee})
- }
- }
- }
-
- if !pta {
- continue
- }
-
- // CHANNEL PEERS
- // Collect send/receive/close instructions in the whole ssa.Program.
- for _, op := range chanOps(instr) {
- a.ops = append(a.ops, op)
- a.ptaConfig.AddQuery(op.ch) // add channel ssa.Value to PTA query
- }
- }
- }
- }
- log.Print("Visit instructions complete")
-}
-
-// pointer runs the pointer analysis.
-func (a *analysis) pointer(mainPkgs []*ssa.Package) {
- // Run the pointer analysis and build the complete callgraph.
- a.ptaConfig.Mains = mainPkgs
- a.ptaConfig.BuildCallGraph = true
- a.ptaConfig.Reflection = false // (for now)
-
- a.result.setStatusf("Pointer analysis running...")
-
- ptares, err := pointer.Analyze(&a.ptaConfig)
- if err != nil {
- // If this happens, it indicates a bug.
- a.result.setStatusf("Pointer analysis failed: %s.", err)
- return
- }
- log.Print("Pointer analysis complete.")
-
- // Add the results of pointer analysis.
-
- a.result.setStatusf("Computing channel peers...")
- a.doChannelPeers(ptares.Queries)
- a.result.setStatusf("Computing dynamic call graph edges...")
- a.doCallgraph(ptares.CallGraph)
-
- a.result.setStatusf("Analysis complete.")
-}
-
-type linksByStart []Link
-
-func (a linksByStart) Less(i, j int) bool { return a[i].Start() < a[j].Start() }
-func (a linksByStart) Swap(i, j int) { a[i], a[j] = a[j], a[i] }
-func (a linksByStart) Len() int { return len(a) }
-
-// allPackages returns a new sorted slice of all packages beneath the
-// specified package root directory, e.g. $GOROOT/src or $GOPATH/src.
-// Derived from from go/ssa/stdlib_test.go
-// root must end with os.PathSeparator.
-//
-// TODO(adonovan): use buildutil.AllPackages when the tree thaws.
-func allPackages(root string) []string {
- var pkgs []string
- filepath.Walk(root, func(path string, info os.FileInfo, err error) error {
- if info == nil {
- return nil // non-existent root directory?
- }
- if !info.IsDir() {
- return nil // not a directory
- }
- // Prune the search if we encounter any of these names:
- base := filepath.Base(path)
- if base == "testdata" || strings.HasPrefix(base, ".") {
- return filepath.SkipDir
- }
- pkg := filepath.ToSlash(strings.TrimPrefix(path, root))
- switch pkg {
- case "builtin":
- return filepath.SkipDir
- case "":
- return nil // ignore root of tree
- }
- pkgs = append(pkgs, pkg)
- return nil
- })
- return pkgs
-}
diff --git a/vendor/golang.org/x/tools/godoc/analysis/callgraph.go b/vendor/golang.org/x/tools/godoc/analysis/callgraph.go
deleted file mode 100644
index 492022d..0000000
--- a/vendor/golang.org/x/tools/godoc/analysis/callgraph.go
+++ /dev/null
@@ -1,351 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package analysis
-
-// This file computes the CALLERS and CALLEES relations from the call
-// graph. CALLERS/CALLEES information is displayed in the lower pane
-// when a "func" token or ast.CallExpr.Lparen is clicked, respectively.
-
-import (
- "fmt"
- "go/ast"
- "go/token"
- "go/types"
- "log"
- "math/big"
- "sort"
-
- "golang.org/x/tools/go/callgraph"
- "golang.org/x/tools/go/ssa"
-)
-
-// doCallgraph computes the CALLEES and CALLERS relations.
-func (a *analysis) doCallgraph(cg *callgraph.Graph) {
- log.Print("Deleting synthetic nodes...")
- // TODO(adonovan): opt: DeleteSyntheticNodes is asymptotically
- // inefficient and can be (unpredictably) slow.
- cg.DeleteSyntheticNodes()
- log.Print("Synthetic nodes deleted")
-
- // Populate nodes of package call graphs (PCGs).
- for _, n := range cg.Nodes {
- a.pcgAddNode(n.Func)
- }
- // Within each PCG, sort funcs by name.
- for _, pcg := range a.pcgs {
- pcg.sortNodes()
- }
-
- calledFuncs := make(map[ssa.CallInstruction]map[*ssa.Function]bool)
- callingSites := make(map[*ssa.Function]map[ssa.CallInstruction]bool)
- for _, n := range cg.Nodes {
- for _, e := range n.Out {
- if e.Site == nil {
- continue // a call from a synthetic node such as
- }
-
- // Add (site pos, callee) to calledFuncs.
- // (Dynamic calls only.)
- callee := e.Callee.Func
-
- a.pcgAddEdge(n.Func, callee)
-
- if callee.Synthetic != "" {
- continue // call of a package initializer
- }
-
- if e.Site.Common().StaticCallee() == nil {
- // dynamic call
- // (CALLEES information for static calls
- // is computed using SSA information.)
- lparen := e.Site.Common().Pos()
- if lparen != token.NoPos {
- fns := calledFuncs[e.Site]
- if fns == nil {
- fns = make(map[*ssa.Function]bool)
- calledFuncs[e.Site] = fns
- }
- fns[callee] = true
- }
- }
-
- // Add (callee, site) to callingSites.
- fns := callingSites[callee]
- if fns == nil {
- fns = make(map[ssa.CallInstruction]bool)
- callingSites[callee] = fns
- }
- fns[e.Site] = true
- }
- }
-
- // CALLEES.
- log.Print("Callees...")
- for site, fns := range calledFuncs {
- var funcs funcsByPos
- for fn := range fns {
- funcs = append(funcs, fn)
- }
- sort.Sort(funcs)
-
- a.addCallees(site, funcs)
- }
-
- // CALLERS
- log.Print("Callers...")
- for callee, sites := range callingSites {
- pos := funcToken(callee)
- if pos == token.NoPos {
- log.Printf("CALLERS: skipping %s: no pos", callee)
- continue
- }
-
- var this *types.Package // for relativizing names
- if callee.Pkg != nil {
- this = callee.Pkg.Pkg
- }
-
- // Compute sites grouped by parent, with text and URLs.
- sitesByParent := make(map[*ssa.Function]sitesByPos)
- for site := range sites {
- fn := site.Parent()
- sitesByParent[fn] = append(sitesByParent[fn], site)
- }
- var funcs funcsByPos
- for fn := range sitesByParent {
- funcs = append(funcs, fn)
- }
- sort.Sort(funcs)
-
- v := callersJSON{
- Callee: callee.String(),
- Callers: []callerJSON{}, // (JS wants non-nil)
- }
- for _, fn := range funcs {
- caller := callerJSON{
- Func: prettyFunc(this, fn),
- Sites: []anchorJSON{}, // (JS wants non-nil)
- }
- sites := sitesByParent[fn]
- sort.Sort(sites)
- for _, site := range sites {
- pos := site.Common().Pos()
- if pos != token.NoPos {
- caller.Sites = append(caller.Sites, anchorJSON{
- Text: fmt.Sprintf("%d", a.prog.Fset.Position(pos).Line),
- Href: a.posURL(pos, len("(")),
- })
- }
- }
- v.Callers = append(v.Callers, caller)
- }
-
- fi, offset := a.fileAndOffset(pos)
- fi.addLink(aLink{
- start: offset,
- end: offset + len("func"),
- title: fmt.Sprintf("%d callers", len(sites)),
- onclick: fmt.Sprintf("onClickCallers(%d)", fi.addData(v)),
- })
- }
-
- // PACKAGE CALLGRAPH
- log.Print("Package call graph...")
- for pkg, pcg := range a.pcgs {
- // Maps (*ssa.Function).RelString() to index in JSON CALLGRAPH array.
- index := make(map[string]int)
-
- // Treat exported functions (and exported methods of
- // exported named types) as roots even if they aren't
- // actually called from outside the package.
- for i, n := range pcg.nodes {
- if i == 0 || n.fn.Object() == nil || !n.fn.Object().Exported() {
- continue
- }
- recv := n.fn.Signature.Recv()
- if recv == nil || deref(recv.Type()).(*types.Named).Obj().Exported() {
- roots := &pcg.nodes[0].edges
- roots.SetBit(roots, i, 1)
- }
- index[n.fn.RelString(pkg.Pkg)] = i
- }
-
- json := a.pcgJSON(pcg)
-
- // TODO(adonovan): pkg.Path() is not unique!
- // It is possible to declare a non-test package called x_test.
- a.result.pkgInfo(pkg.Pkg.Path()).setCallGraph(json, index)
- }
-}
-
-// addCallees adds client data and links for the facts that site calls fns.
-func (a *analysis) addCallees(site ssa.CallInstruction, fns []*ssa.Function) {
- v := calleesJSON{
- Descr: site.Common().Description(),
- Callees: []anchorJSON{}, // (JS wants non-nil)
- }
- var this *types.Package // for relativizing names
- if p := site.Parent().Package(); p != nil {
- this = p.Pkg
- }
-
- for _, fn := range fns {
- v.Callees = append(v.Callees, anchorJSON{
- Text: prettyFunc(this, fn),
- Href: a.posURL(funcToken(fn), len("func")),
- })
- }
-
- fi, offset := a.fileAndOffset(site.Common().Pos())
- fi.addLink(aLink{
- start: offset,
- end: offset + len("("),
- title: fmt.Sprintf("%d callees", len(v.Callees)),
- onclick: fmt.Sprintf("onClickCallees(%d)", fi.addData(v)),
- })
-}
-
-// -- utilities --------------------------------------------------------
-
-// stable order within packages but undefined across packages.
-type funcsByPos []*ssa.Function
-
-func (a funcsByPos) Less(i, j int) bool { return a[i].Pos() < a[j].Pos() }
-func (a funcsByPos) Swap(i, j int) { a[i], a[j] = a[j], a[i] }
-func (a funcsByPos) Len() int { return len(a) }
-
-type sitesByPos []ssa.CallInstruction
-
-func (a sitesByPos) Less(i, j int) bool { return a[i].Common().Pos() < a[j].Common().Pos() }
-func (a sitesByPos) Swap(i, j int) { a[i], a[j] = a[j], a[i] }
-func (a sitesByPos) Len() int { return len(a) }
-
-func funcToken(fn *ssa.Function) token.Pos {
- switch syntax := fn.Syntax().(type) {
- case *ast.FuncLit:
- return syntax.Type.Func
- case *ast.FuncDecl:
- return syntax.Type.Func
- }
- return token.NoPos
-}
-
-// prettyFunc pretty-prints fn for the user interface.
-// TODO(adonovan): return HTML so we have more markup freedom.
-func prettyFunc(this *types.Package, fn *ssa.Function) string {
- if fn.Parent() != nil {
- return fmt.Sprintf("%s in %s",
- types.TypeString(fn.Signature, types.RelativeTo(this)),
- prettyFunc(this, fn.Parent()))
- }
- if fn.Synthetic != "" && fn.Name() == "init" {
- // (This is the actual initializer, not a declared 'func init').
- if fn.Pkg.Pkg == this {
- return "package initializer"
- }
- return fmt.Sprintf("%q package initializer", fn.Pkg.Pkg.Path())
- }
- return fn.RelString(this)
-}
-
-// -- intra-package callgraph ------------------------------------------
-
-// pcgNode represents a node in the package call graph (PCG).
-type pcgNode struct {
- fn *ssa.Function
- pretty string // cache of prettyFunc(fn)
- edges big.Int // set of callee func indices
-}
-
-// A packageCallGraph represents the intra-package edges of the global call graph.
-// The zeroth node indicates "all external functions".
-type packageCallGraph struct {
- nodeIndex map[*ssa.Function]int // maps func to node index (a small int)
- nodes []*pcgNode // maps node index to node
-}
-
-// sortNodes populates pcg.nodes in name order and updates the nodeIndex.
-func (pcg *packageCallGraph) sortNodes() {
- nodes := make([]*pcgNode, 0, len(pcg.nodeIndex))
- nodes = append(nodes, &pcgNode{fn: nil, pretty: ""})
- for fn := range pcg.nodeIndex {
- nodes = append(nodes, &pcgNode{
- fn: fn,
- pretty: prettyFunc(fn.Pkg.Pkg, fn),
- })
- }
- sort.Sort(pcgNodesByPretty(nodes[1:]))
- for i, n := range nodes {
- pcg.nodeIndex[n.fn] = i
- }
- pcg.nodes = nodes
-}
-
-func (pcg *packageCallGraph) addEdge(caller, callee *ssa.Function) {
- var callerIndex int
- if caller.Pkg == callee.Pkg {
- // intra-package edge
- callerIndex = pcg.nodeIndex[caller]
- if callerIndex < 1 {
- panic(caller)
- }
- }
- edges := &pcg.nodes[callerIndex].edges
- edges.SetBit(edges, pcg.nodeIndex[callee], 1)
-}
-
-func (a *analysis) pcgAddNode(fn *ssa.Function) {
- if fn.Pkg == nil {
- return
- }
- pcg, ok := a.pcgs[fn.Pkg]
- if !ok {
- pcg = &packageCallGraph{nodeIndex: make(map[*ssa.Function]int)}
- a.pcgs[fn.Pkg] = pcg
- }
- pcg.nodeIndex[fn] = -1
-}
-
-func (a *analysis) pcgAddEdge(caller, callee *ssa.Function) {
- if callee.Pkg != nil {
- a.pcgs[callee.Pkg].addEdge(caller, callee)
- }
-}
-
-// pcgJSON returns a new slice of callgraph JSON values.
-func (a *analysis) pcgJSON(pcg *packageCallGraph) []*PCGNodeJSON {
- var nodes []*PCGNodeJSON
- for _, n := range pcg.nodes {
-
- // TODO(adonovan): why is there no good way to iterate
- // over the set bits of a big.Int?
- var callees []int
- nbits := n.edges.BitLen()
- for j := 0; j < nbits; j++ {
- if n.edges.Bit(j) == 1 {
- callees = append(callees, j)
- }
- }
-
- var pos token.Pos
- if n.fn != nil {
- pos = funcToken(n.fn)
- }
- nodes = append(nodes, &PCGNodeJSON{
- Func: anchorJSON{
- Text: n.pretty,
- Href: a.posURL(pos, len("func")),
- },
- Callees: callees,
- })
- }
- return nodes
-}
-
-type pcgNodesByPretty []*pcgNode
-
-func (a pcgNodesByPretty) Less(i, j int) bool { return a[i].pretty < a[j].pretty }
-func (a pcgNodesByPretty) Swap(i, j int) { a[i], a[j] = a[j], a[i] }
-func (a pcgNodesByPretty) Len() int { return len(a) }
diff --git a/vendor/golang.org/x/tools/godoc/analysis/implements.go b/vendor/golang.org/x/tools/godoc/analysis/implements.go
deleted file mode 100644
index 5a29579..0000000
--- a/vendor/golang.org/x/tools/godoc/analysis/implements.go
+++ /dev/null
@@ -1,195 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package analysis
-
-// This file computes the "implements" relation over all pairs of
-// named types in the program. (The mark-up is done by typeinfo.go.)
-
-// TODO(adonovan): do we want to report implements(C, I) where C and I
-// belong to different packages and at least one is not exported?
-
-import (
- "go/types"
- "sort"
-
- "golang.org/x/tools/go/types/typeutil"
-)
-
-// computeImplements computes the "implements" relation over all pairs
-// of named types in allNamed.
-func computeImplements(cache *typeutil.MethodSetCache, allNamed []*types.Named) map[*types.Named]implementsFacts {
- // Information about a single type's method set.
- type msetInfo struct {
- typ types.Type
- mset *types.MethodSet
- mask1, mask2 uint64
- }
-
- initMsetInfo := func(info *msetInfo, typ types.Type) {
- info.typ = typ
- info.mset = cache.MethodSet(typ)
- for i := 0; i < info.mset.Len(); i++ {
- name := info.mset.At(i).Obj().Name()
- info.mask1 |= 1 << methodBit(name[0])
- info.mask2 |= 1 << methodBit(name[len(name)-1])
- }
- }
-
- // satisfies(T, U) reports whether type T satisfies type U.
- // U must be an interface.
- //
- // Since there are thousands of types (and thus millions of
- // pairs of types) and types.Assignable(T, U) is relatively
- // expensive, we compute assignability directly from the
- // method sets. (At least one of T and U must be an
- // interface.)
- //
- // We use a trick (thanks gri!) related to a Bloom filter to
- // quickly reject most tests, which are false. For each
- // method set, we precompute a mask, a set of bits, one per
- // distinct initial byte of each method name. Thus the mask
- // for io.ReadWriter would be {'R','W'}. AssignableTo(T, U)
- // cannot be true unless mask(T)&mask(U)==mask(U).
- //
- // As with a Bloom filter, we can improve precision by testing
- // additional hashes, e.g. using the last letter of each
- // method name, so long as the subset mask property holds.
- //
- // When analyzing the standard library, there are about 1e6
- // calls to satisfies(), of which 0.6% return true. With a
- // 1-hash filter, 95% of calls avoid the expensive check; with
- // a 2-hash filter, this grows to 98.2%.
- satisfies := func(T, U *msetInfo) bool {
- return T.mask1&U.mask1 == U.mask1 &&
- T.mask2&U.mask2 == U.mask2 &&
- containsAllIdsOf(T.mset, U.mset)
- }
-
- // Information about a named type N, and perhaps also *N.
- type namedInfo struct {
- isInterface bool
- base msetInfo // N
- ptr msetInfo // *N, iff N !isInterface
- }
-
- var infos []namedInfo
-
- // Precompute the method sets and their masks.
- for _, N := range allNamed {
- var info namedInfo
- initMsetInfo(&info.base, N)
- _, info.isInterface = N.Underlying().(*types.Interface)
- if !info.isInterface {
- initMsetInfo(&info.ptr, types.NewPointer(N))
- }
-
- if info.base.mask1|info.ptr.mask1 == 0 {
- continue // neither N nor *N has methods
- }
-
- infos = append(infos, info)
- }
-
- facts := make(map[*types.Named]implementsFacts)
-
- // Test all pairs of distinct named types (T, U).
- // TODO(adonovan): opt: compute (U, T) at the same time.
- for t := range infos {
- T := &infos[t]
- var to, from, fromPtr []types.Type
- for u := range infos {
- if t == u {
- continue
- }
- U := &infos[u]
- switch {
- case T.isInterface && U.isInterface:
- if satisfies(&U.base, &T.base) {
- to = append(to, U.base.typ)
- }
- if satisfies(&T.base, &U.base) {
- from = append(from, U.base.typ)
- }
- case T.isInterface: // U concrete
- if satisfies(&U.base, &T.base) {
- to = append(to, U.base.typ)
- } else if satisfies(&U.ptr, &T.base) {
- to = append(to, U.ptr.typ)
- }
- case U.isInterface: // T concrete
- if satisfies(&T.base, &U.base) {
- from = append(from, U.base.typ)
- } else if satisfies(&T.ptr, &U.base) {
- fromPtr = append(fromPtr, U.base.typ)
- }
- }
- }
-
- // Sort types (arbitrarily) to avoid nondeterminism.
- sort.Sort(typesByString(to))
- sort.Sort(typesByString(from))
- sort.Sort(typesByString(fromPtr))
-
- facts[T.base.typ.(*types.Named)] = implementsFacts{to, from, fromPtr}
- }
-
- return facts
-}
-
-type implementsFacts struct {
- to []types.Type // named or ptr-to-named types assignable to interface T
- from []types.Type // named interfaces assignable from T
- fromPtr []types.Type // named interfaces assignable only from *T
-}
-
-type typesByString []types.Type
-
-func (p typesByString) Len() int { return len(p) }
-func (p typesByString) Less(i, j int) bool { return p[i].String() < p[j].String() }
-func (p typesByString) Swap(i, j int) { p[i], p[j] = p[j], p[i] }
-
-// methodBit returns the index of x in [a-zA-Z], or 52 if not found.
-func methodBit(x byte) uint64 {
- switch {
- case 'a' <= x && x <= 'z':
- return uint64(x - 'a')
- case 'A' <= x && x <= 'Z':
- return uint64(26 + x - 'A')
- }
- return 52 // all other bytes
-}
-
-// containsAllIdsOf reports whether the method identifiers of T are a
-// superset of those in U. If U belongs to an interface type, the
-// result is equal to types.Assignable(T, U), but is cheaper to compute.
-//
-// TODO(gri): make this a method of *types.MethodSet.
-//
-func containsAllIdsOf(T, U *types.MethodSet) bool {
- t, tlen := 0, T.Len()
- u, ulen := 0, U.Len()
- for t < tlen && u < ulen {
- tMeth := T.At(t).Obj()
- uMeth := U.At(u).Obj()
- tId := tMeth.Id()
- uId := uMeth.Id()
- if tId > uId {
- // U has a method T lacks: fail.
- return false
- }
- if tId < uId {
- // T has a method U lacks: ignore it.
- t++
- continue
- }
- // U and T both have a method of this Id. Check types.
- if !types.Identical(tMeth.Type(), uMeth.Type()) {
- return false // type mismatch
- }
- u++
- t++
- }
- return u == ulen
-}
diff --git a/vendor/golang.org/x/tools/godoc/analysis/json.go b/vendor/golang.org/x/tools/godoc/analysis/json.go
deleted file mode 100644
index f897618..0000000
--- a/vendor/golang.org/x/tools/godoc/analysis/json.go
+++ /dev/null
@@ -1,69 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package analysis
-
-// This file defines types used by client-side JavaScript.
-
-type anchorJSON struct {
- Text string // HTML
- Href string // URL
-}
-
-type commOpJSON struct {
- Op anchorJSON
- Fn string
-}
-
-// JavaScript's onClickComm() expects a commJSON.
-type commJSON struct {
- Ops []commOpJSON
-}
-
-// Indicates one of these forms of fact about a type T:
-// T "is implemented by type " (ByKind != "", e.g. "array")
-// T "implements " (ByKind == "")
-type implFactJSON struct {
- ByKind string `json:",omitempty"`
- Other anchorJSON
-}
-
-// Implements facts are grouped by form, for ease of reading.
-type implGroupJSON struct {
- Descr string
- Facts []implFactJSON
-}
-
-// JavaScript's onClickIdent() expects a TypeInfoJSON.
-type TypeInfoJSON struct {
- Name string // type name
- Size, Align int64
- Methods []anchorJSON
- ImplGroups []implGroupJSON
-}
-
-// JavaScript's onClickCallees() expects a calleesJSON.
-type calleesJSON struct {
- Descr string
- Callees []anchorJSON // markup for called function
-}
-
-type callerJSON struct {
- Func string
- Sites []anchorJSON
-}
-
-// JavaScript's onClickCallers() expects a callersJSON.
-type callersJSON struct {
- Callee string
- Callers []callerJSON
-}
-
-// JavaScript's cgAddChild requires a global array of PCGNodeJSON
-// called CALLGRAPH, representing the intra-package call graph.
-// The first element is special and represents "all external callers".
-type PCGNodeJSON struct {
- Func anchorJSON
- Callees []int // indices within CALLGRAPH of nodes called by this one
-}
diff --git a/vendor/golang.org/x/tools/godoc/analysis/peers.go b/vendor/golang.org/x/tools/godoc/analysis/peers.go
deleted file mode 100644
index a742f06..0000000
--- a/vendor/golang.org/x/tools/godoc/analysis/peers.go
+++ /dev/null
@@ -1,154 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package analysis
-
-// This file computes the channel "peers" relation over all pairs of
-// channel operations in the program. The peers are displayed in the
-// lower pane when a channel operation (make, <-, close) is clicked.
-
-// TODO(adonovan): handle calls to reflect.{Select,Recv,Send,Close} too,
-// then enable reflection in PTA.
-
-import (
- "fmt"
- "go/token"
- "go/types"
-
- "golang.org/x/tools/go/pointer"
- "golang.org/x/tools/go/ssa"
-)
-
-func (a *analysis) doChannelPeers(ptsets map[ssa.Value]pointer.Pointer) {
- addSendRecv := func(j *commJSON, op chanOp) {
- j.Ops = append(j.Ops, commOpJSON{
- Op: anchorJSON{
- Text: op.mode,
- Href: a.posURL(op.pos, op.len),
- },
- Fn: prettyFunc(nil, op.fn),
- })
- }
-
- // Build an undirected bipartite multigraph (binary relation)
- // of MakeChan ops and send/recv/close ops.
- //
- // TODO(adonovan): opt: use channel element types to partition
- // the O(n^2) problem into subproblems.
- aliasedOps := make(map[*ssa.MakeChan][]chanOp)
- opToMakes := make(map[chanOp][]*ssa.MakeChan)
- for _, op := range a.ops {
- // Combine the PT sets from all contexts.
- var makes []*ssa.MakeChan // aliased ops
- ptr, ok := ptsets[op.ch]
- if !ok {
- continue // e.g. channel op in dead code
- }
- for _, label := range ptr.PointsTo().Labels() {
- makechan, ok := label.Value().(*ssa.MakeChan)
- if !ok {
- continue // skip intrinsically-created channels for now
- }
- if makechan.Pos() == token.NoPos {
- continue // not possible?
- }
- makes = append(makes, makechan)
- aliasedOps[makechan] = append(aliasedOps[makechan], op)
- }
- opToMakes[op] = makes
- }
-
- // Now that complete relation is built, build links for ops.
- for _, op := range a.ops {
- v := commJSON{
- Ops: []commOpJSON{}, // (JS wants non-nil)
- }
- ops := make(map[chanOp]bool)
- for _, makechan := range opToMakes[op] {
- v.Ops = append(v.Ops, commOpJSON{
- Op: anchorJSON{
- Text: "made",
- Href: a.posURL(makechan.Pos()-token.Pos(len("make")),
- len("make")),
- },
- Fn: makechan.Parent().RelString(op.fn.Package().Pkg),
- })
- for _, op := range aliasedOps[makechan] {
- ops[op] = true
- }
- }
- for op := range ops {
- addSendRecv(&v, op)
- }
-
- // Add links for each aliased op.
- fi, offset := a.fileAndOffset(op.pos)
- fi.addLink(aLink{
- start: offset,
- end: offset + op.len,
- title: "show channel ops",
- onclick: fmt.Sprintf("onClickComm(%d)", fi.addData(v)),
- })
- }
- // Add links for makechan ops themselves.
- for makechan, ops := range aliasedOps {
- v := commJSON{
- Ops: []commOpJSON{}, // (JS wants non-nil)
- }
- for _, op := range ops {
- addSendRecv(&v, op)
- }
-
- fi, offset := a.fileAndOffset(makechan.Pos())
- fi.addLink(aLink{
- start: offset - len("make"),
- end: offset,
- title: "show channel ops",
- onclick: fmt.Sprintf("onClickComm(%d)", fi.addData(v)),
- })
- }
-}
-
-// -- utilities --------------------------------------------------------
-
-// chanOp abstracts an ssa.Send, ssa.Unop(ARROW), close(), or a SelectState.
-// Derived from cmd/guru/peers.go.
-type chanOp struct {
- ch ssa.Value
- mode string // sent|received|closed
- pos token.Pos
- len int
- fn *ssa.Function
-}
-
-// chanOps returns a slice of all the channel operations in the instruction.
-// Derived from cmd/guru/peers.go.
-func chanOps(instr ssa.Instruction) []chanOp {
- fn := instr.Parent()
- var ops []chanOp
- switch instr := instr.(type) {
- case *ssa.UnOp:
- if instr.Op == token.ARROW {
- // TODO(adonovan): don't assume <-ch; could be 'range ch'.
- ops = append(ops, chanOp{instr.X, "received", instr.Pos(), len("<-"), fn})
- }
- case *ssa.Send:
- ops = append(ops, chanOp{instr.Chan, "sent", instr.Pos(), len("<-"), fn})
- case *ssa.Select:
- for _, st := range instr.States {
- mode := "received"
- if st.Dir == types.SendOnly {
- mode = "sent"
- }
- ops = append(ops, chanOp{st.Chan, mode, st.Pos, len("<-"), fn})
- }
- case ssa.CallInstruction:
- call := instr.Common()
- if blt, ok := call.Value.(*ssa.Builtin); ok && blt.Name() == "close" {
- pos := instr.Common().Pos()
- ops = append(ops, chanOp{call.Args[0], "closed", pos - token.Pos(len("close")), len("close("), fn})
- }
- }
- return ops
-}
diff --git a/vendor/golang.org/x/tools/godoc/analysis/typeinfo.go b/vendor/golang.org/x/tools/godoc/analysis/typeinfo.go
deleted file mode 100644
index e57683f..0000000
--- a/vendor/golang.org/x/tools/godoc/analysis/typeinfo.go
+++ /dev/null
@@ -1,234 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package analysis
-
-// This file computes the markup for information from go/types:
-// IMPORTS, identifier RESOLUTION, METHOD SETS, size/alignment, and
-// the IMPLEMENTS relation.
-//
-// IMPORTS links connect import specs to the documentation for the
-// imported package.
-//
-// RESOLUTION links referring identifiers to their defining
-// identifier, and adds tooltips for kind and type.
-//
-// METHOD SETS, size/alignment, and the IMPLEMENTS relation are
-// displayed in the lower pane when a type's defining identifier is
-// clicked.
-
-import (
- "fmt"
- "go/types"
- "reflect"
- "strconv"
- "strings"
-
- "golang.org/x/tools/go/loader"
- "golang.org/x/tools/go/types/typeutil"
-)
-
-// TODO(adonovan): audit to make sure it's safe on ill-typed packages.
-
-// TODO(adonovan): use same Sizes as loader.Config.
-var sizes = types.StdSizes{WordSize: 8, MaxAlign: 8}
-
-func (a *analysis) doTypeInfo(info *loader.PackageInfo, implements map[*types.Named]implementsFacts) {
- // We must not assume the corresponding SSA packages were
- // created (i.e. were transitively error-free).
-
- // IMPORTS
- for _, f := range info.Files {
- // Package decl.
- fi, offset := a.fileAndOffset(f.Name.Pos())
- fi.addLink(aLink{
- start: offset,
- end: offset + len(f.Name.Name),
- title: "Package docs for " + info.Pkg.Path(),
- // TODO(adonovan): fix: we're putting the untrusted Path()
- // into a trusted field. What's the appropriate sanitizer?
- href: "/pkg/" + info.Pkg.Path(),
- })
-
- // Import specs.
- for _, imp := range f.Imports {
- // Remove quotes.
- L := int(imp.End()-imp.Path.Pos()) - len(`""`)
- path, _ := strconv.Unquote(imp.Path.Value)
- fi, offset := a.fileAndOffset(imp.Path.Pos())
- fi.addLink(aLink{
- start: offset + 1,
- end: offset + 1 + L,
- title: "Package docs for " + path,
- // TODO(adonovan): fix: we're putting the untrusted path
- // into a trusted field. What's the appropriate sanitizer?
- href: "/pkg/" + path,
- })
- }
- }
-
- // RESOLUTION
- qualifier := types.RelativeTo(info.Pkg)
- for id, obj := range info.Uses {
- // Position of the object definition.
- pos := obj.Pos()
- Len := len(obj.Name())
-
- // Correct the position for non-renaming import specs.
- // import "sync/atomic"
- // ^^^^^^^^^^^
- if obj, ok := obj.(*types.PkgName); ok && id.Name == obj.Imported().Name() {
- // Assume this is a non-renaming import.
- // NB: not true for degenerate renamings: `import foo "foo"`.
- pos++
- Len = len(obj.Imported().Path())
- }
-
- if obj.Pkg() == nil {
- continue // don't mark up built-ins.
- }
-
- fi, offset := a.fileAndOffset(id.NamePos)
- fi.addLink(aLink{
- start: offset,
- end: offset + len(id.Name),
- title: types.ObjectString(obj, qualifier),
- href: a.posURL(pos, Len),
- })
- }
-
- // IMPLEMENTS & METHOD SETS
- for _, obj := range info.Defs {
- if obj, ok := obj.(*types.TypeName); ok {
- if named, ok := obj.Type().(*types.Named); ok {
- a.namedType(named, implements)
- }
- }
- }
-}
-
-func (a *analysis) namedType(T *types.Named, implements map[*types.Named]implementsFacts) {
- obj := T.Obj()
- qualifier := types.RelativeTo(obj.Pkg())
- v := &TypeInfoJSON{
- Name: obj.Name(),
- Size: sizes.Sizeof(T),
- Align: sizes.Alignof(T),
- Methods: []anchorJSON{}, // (JS wants non-nil)
- }
-
- // addFact adds the fact "is implemented by T" (by) or
- // "implements T" (!by) to group.
- addFact := func(group *implGroupJSON, T types.Type, by bool) {
- Tobj := deref(T).(*types.Named).Obj()
- var byKind string
- if by {
- // Show underlying kind of implementing type,
- // e.g. "slice", "array", "struct".
- s := reflect.TypeOf(T.Underlying()).String()
- byKind = strings.ToLower(strings.TrimPrefix(s, "*types."))
- }
- group.Facts = append(group.Facts, implFactJSON{
- ByKind: byKind,
- Other: anchorJSON{
- Href: a.posURL(Tobj.Pos(), len(Tobj.Name())),
- Text: types.TypeString(T, qualifier),
- },
- })
- }
-
- // IMPLEMENTS
- if r, ok := implements[T]; ok {
- if isInterface(T) {
- // "T is implemented by " ...
- // "T is implemented by "...
- // "T implements "...
- group := implGroupJSON{
- Descr: types.TypeString(T, qualifier),
- }
- // Show concrete types first; use two passes.
- for _, sub := range r.to {
- if !isInterface(sub) {
- addFact(&group, sub, true)
- }
- }
- for _, sub := range r.to {
- if isInterface(sub) {
- addFact(&group, sub, true)
- }
- }
- for _, super := range r.from {
- addFact(&group, super, false)
- }
- v.ImplGroups = append(v.ImplGroups, group)
- } else {
- // T is concrete.
- if r.from != nil {
- // "T implements "...
- group := implGroupJSON{
- Descr: types.TypeString(T, qualifier),
- }
- for _, super := range r.from {
- addFact(&group, super, false)
- }
- v.ImplGroups = append(v.ImplGroups, group)
- }
- if r.fromPtr != nil {
- // "*C implements "...
- group := implGroupJSON{
- Descr: "*" + types.TypeString(T, qualifier),
- }
- for _, psuper := range r.fromPtr {
- addFact(&group, psuper, false)
- }
- v.ImplGroups = append(v.ImplGroups, group)
- }
- }
- }
-
- // METHOD SETS
- for _, sel := range typeutil.IntuitiveMethodSet(T, &a.prog.MethodSets) {
- meth := sel.Obj().(*types.Func)
- pos := meth.Pos() // may be 0 for error.Error
- v.Methods = append(v.Methods, anchorJSON{
- Href: a.posURL(pos, len(meth.Name())),
- Text: types.SelectionString(sel, qualifier),
- })
- }
-
- // Since there can be many specs per decl, we
- // can't attach the link to the keyword 'type'
- // (as we do with 'func'); we use the Ident.
- fi, offset := a.fileAndOffset(obj.Pos())
- fi.addLink(aLink{
- start: offset,
- end: offset + len(obj.Name()),
- title: fmt.Sprintf("type info for %s", obj.Name()),
- onclick: fmt.Sprintf("onClickTypeInfo(%d)", fi.addData(v)),
- })
-
- // Add info for exported package-level types to the package info.
- if obj.Exported() && isPackageLevel(obj) {
- // TODO(adonovan): Path is not unique!
- // It is possible to declare a non-test package called x_test.
- a.result.pkgInfo(obj.Pkg().Path()).addType(v)
- }
-}
-
-// -- utilities --------------------------------------------------------
-
-func isInterface(T types.Type) bool { return types.IsInterface(T) }
-
-// deref returns a pointer's element type; otherwise it returns typ.
-func deref(typ types.Type) types.Type {
- if p, ok := typ.Underlying().(*types.Pointer); ok {
- return p.Elem()
- }
- return typ
-}
-
-// isPackageLevel reports whether obj is a package-level object.
-func isPackageLevel(obj types.Object) bool {
- return obj.Pkg().Scope().Lookup(obj.Name()) == obj
-}
diff --git a/vendor/golang.org/x/tools/godoc/appengine.go b/vendor/golang.org/x/tools/godoc/appengine.go
deleted file mode 100644
index fe5e687..0000000
--- a/vendor/golang.org/x/tools/godoc/appengine.go
+++ /dev/null
@@ -1,13 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build appengine
-
-package godoc
-
-import "google.golang.org/appengine"
-
-func init() {
- onAppengine = !appengine.IsDevAppServer()
-}
diff --git a/vendor/golang.org/x/tools/godoc/cmdline.go b/vendor/golang.org/x/tools/godoc/cmdline.go
deleted file mode 100644
index 7c53681..0000000
--- a/vendor/golang.org/x/tools/godoc/cmdline.go
+++ /dev/null
@@ -1,207 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package godoc
-
-import (
- "fmt"
- "go/ast"
- "go/build"
- "io"
- "log"
- "os"
- pathpkg "path"
- "path/filepath"
- "regexp"
- "strings"
-
- "golang.org/x/tools/godoc/vfs"
-)
-
-const (
- target = "/target"
- cmdPrefix = "cmd/"
- srcPrefix = "src/"
- toolsPath = "golang.org/x/tools/cmd/"
-)
-
-// CommandLine returns godoc results to w.
-// Note that it may add a /target path to fs.
-func CommandLine(w io.Writer, fs vfs.NameSpace, pres *Presentation, args []string) error {
- path := args[0]
- srcMode := pres.SrcMode
- cmdMode := strings.HasPrefix(path, cmdPrefix)
- if strings.HasPrefix(path, srcPrefix) {
- path = strings.TrimPrefix(path, srcPrefix)
- srcMode = true
- }
- var abspath, relpath string
- if cmdMode {
- path = strings.TrimPrefix(path, cmdPrefix)
- } else {
- abspath, relpath = paths(fs, pres, path)
- }
-
- var mode PageInfoMode
- if relpath == builtinPkgPath {
- // the fake built-in package contains unexported identifiers
- mode = NoFiltering | NoTypeAssoc
- }
- if srcMode {
- // only filter exports if we don't have explicit command-line filter arguments
- if len(args) > 1 {
- mode |= NoFiltering
- }
- mode |= ShowSource
- }
-
- // First, try as package unless forced as command.
- var info *PageInfo
- if !cmdMode {
- info = pres.GetPkgPageInfo(abspath, relpath, mode)
- }
-
- // Second, try as command (if the path is not absolute).
- var cinfo *PageInfo
- if !filepath.IsAbs(path) {
- // First try go.tools/cmd.
- abspath = pathpkg.Join(pres.PkgFSRoot(), toolsPath+path)
- cinfo = pres.GetCmdPageInfo(abspath, relpath, mode)
- if cinfo.IsEmpty() {
- // Then try $GOROOT/cmd.
- abspath = pathpkg.Join(pres.CmdFSRoot(), path)
- cinfo = pres.GetCmdPageInfo(abspath, relpath, mode)
- }
- }
-
- // determine what to use
- if info == nil || info.IsEmpty() {
- if cinfo != nil && !cinfo.IsEmpty() {
- // only cinfo exists - switch to cinfo
- info = cinfo
- }
- } else if cinfo != nil && !cinfo.IsEmpty() {
- // both info and cinfo exist - use cinfo if info
- // contains only subdirectory information
- if info.PAst == nil && info.PDoc == nil {
- info = cinfo
- } else if relpath != target {
- // The above check handles the case where an operating system path
- // is provided (see documentation for paths below). In that case,
- // relpath is set to "/target" (in anticipation of accessing packages there),
- // and is therefore not expected to match a command.
- fmt.Fprintf(w, "use 'godoc %s%s' for documentation on the %s command \n\n", cmdPrefix, relpath, relpath)
- }
- }
-
- if info == nil {
- return fmt.Errorf("%s: no such directory or package", args[0])
- }
- if info.Err != nil {
- return info.Err
- }
-
- if info.PDoc != nil && info.PDoc.ImportPath == target {
- // Replace virtual /target with actual argument from command line.
- info.PDoc.ImportPath = args[0]
- }
-
- // If we have more than one argument, use the remaining arguments for filtering.
- if len(args) > 1 {
- info.IsFiltered = true
- filterInfo(args[1:], info)
- }
-
- packageText := pres.PackageText
- if pres.HTMLMode {
- packageText = pres.PackageHTML
- }
- if err := packageText.Execute(w, info); err != nil {
- return err
- }
- return nil
-}
-
-// paths determines the paths to use.
-//
-// If we are passed an operating system path like . or ./foo or /foo/bar or c:\mysrc,
-// we need to map that path somewhere in the fs name space so that routines
-// like getPageInfo will see it. We use the arbitrarily-chosen virtual path "/target"
-// for this. That is, if we get passed a directory like the above, we map that
-// directory so that getPageInfo sees it as /target.
-// Returns the absolute and relative paths.
-func paths(fs vfs.NameSpace, pres *Presentation, path string) (string, string) {
- if filepath.IsAbs(path) {
- fs.Bind(target, vfs.OS(path), "/", vfs.BindReplace)
- return target, target
- }
- if build.IsLocalImport(path) {
- cwd, _ := os.Getwd() // ignore errors
- path = filepath.Join(cwd, path)
- fs.Bind(target, vfs.OS(path), "/", vfs.BindReplace)
- return target, target
- }
- if bp, _ := build.Import(path, "", build.FindOnly); bp.Dir != "" && bp.ImportPath != "" {
- fs.Bind(target, vfs.OS(bp.Dir), "/", vfs.BindReplace)
- return target, bp.ImportPath
- }
- return pathpkg.Join(pres.PkgFSRoot(), path), path
-}
-
-// filterInfo updates info to include only the nodes that match the given
-// filter args.
-func filterInfo(args []string, info *PageInfo) {
- rx, err := makeRx(args)
- if err != nil {
- log.Fatalf("illegal regular expression from %v: %v", args, err)
- }
-
- filter := func(s string) bool { return rx.MatchString(s) }
- switch {
- case info.PAst != nil:
- newPAst := map[string]*ast.File{}
- for name, a := range info.PAst {
- cmap := ast.NewCommentMap(info.FSet, a, a.Comments)
- a.Comments = []*ast.CommentGroup{} // remove all comments.
- ast.FilterFile(a, filter)
- if len(a.Decls) > 0 {
- newPAst[name] = a
- }
- for _, d := range a.Decls {
- // add back the comments associated with d only
- comments := cmap.Filter(d).Comments()
- a.Comments = append(a.Comments, comments...)
- }
- }
- info.PAst = newPAst // add only matching files.
- case info.PDoc != nil:
- info.PDoc.Filter(filter)
- }
-}
-
-// Does s look like a regular expression?
-func isRegexp(s string) bool {
- return strings.ContainsAny(s, ".(|)*+?^$[]")
-}
-
-// Make a regular expression of the form
-// names[0]|names[1]|...names[len(names)-1].
-// Returns an error if the regular expression is illegal.
-func makeRx(names []string) (*regexp.Regexp, error) {
- if len(names) == 0 {
- return nil, fmt.Errorf("no expression provided")
- }
- s := ""
- for i, name := range names {
- if i > 0 {
- s += "|"
- }
- if isRegexp(name) {
- s += name
- } else {
- s += "^" + name + "$" // must match exactly
- }
- }
- return regexp.Compile(s)
-}
diff --git a/vendor/golang.org/x/tools/godoc/cmdline_test.go b/vendor/golang.org/x/tools/godoc/cmdline_test.go
deleted file mode 100644
index 602f2bb..0000000
--- a/vendor/golang.org/x/tools/godoc/cmdline_test.go
+++ /dev/null
@@ -1,294 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package godoc
-
-import (
- "bytes"
- "go/build"
- "io/ioutil"
- "os"
- "path/filepath"
- "reflect"
- "regexp"
- "runtime"
- "testing"
- "text/template"
-
- "golang.org/x/tools/godoc/vfs"
- "golang.org/x/tools/godoc/vfs/mapfs"
-)
-
-// setupGoroot creates temporary directory to act as GOROOT when running tests
-// that depend upon the build package. It updates build.Default to point to the
-// new GOROOT.
-// It returns a function that can be called to reset build.Default and remove
-// the temporary directory.
-func setupGoroot(t *testing.T) (cleanup func()) {
- var stdLib = map[string]string{
- "src/fmt/fmt.go": `// Package fmt implements formatted I/O.
-package fmt
-
-type Stringer interface {
- String() string
-}
-`,
- }
- goroot, err := ioutil.TempDir("", "cmdline_test")
- if err != nil {
- t.Fatal(err)
- }
- origContext := build.Default
- build.Default = build.Context{
- GOROOT: goroot,
- Compiler: "gc",
- }
- for relname, contents := range stdLib {
- name := filepath.Join(goroot, relname)
- if err := os.MkdirAll(filepath.Dir(name), 0770); err != nil {
- t.Fatal(err)
- }
- if err := ioutil.WriteFile(name, []byte(contents), 0770); err != nil {
- t.Fatal(err)
- }
- }
-
- return func() {
- if err := os.RemoveAll(goroot); err != nil {
- t.Log(err)
- }
- build.Default = origContext
- }
-}
-
-func TestPaths(t *testing.T) {
- cleanup := setupGoroot(t)
- defer cleanup()
-
- pres := &Presentation{
- pkgHandler: handlerServer{
- fsRoot: "/fsroot",
- },
- }
- fs := make(vfs.NameSpace)
-
- absPath := "/foo/fmt"
- if runtime.GOOS == "windows" {
- absPath = `c:\foo\fmt`
- }
-
- for _, tc := range []struct {
- desc string
- path string
- expAbs string
- expRel string
- }{
- {
- "Absolute path",
- absPath,
- "/target",
- "/target",
- },
- {
- "Local import",
- "../foo/fmt",
- "/target",
- "/target",
- },
- {
- "Import",
- "fmt",
- "/target",
- "fmt",
- },
- {
- "Default",
- "unknownpkg",
- "/fsroot/unknownpkg",
- "unknownpkg",
- },
- } {
- abs, rel := paths(fs, pres, tc.path)
- if abs != tc.expAbs || rel != tc.expRel {
- t.Errorf("%s: paths(%q) = %s,%s; want %s,%s", tc.desc, tc.path, abs, rel, tc.expAbs, tc.expRel)
- }
- }
-}
-
-func TestMakeRx(t *testing.T) {
- for _, tc := range []struct {
- desc string
- names []string
- exp string
- }{
- {
- desc: "empty string",
- names: []string{""},
- exp: `^$`,
- },
- {
- desc: "simple text",
- names: []string{"a"},
- exp: `^a$`,
- },
- {
- desc: "two words",
- names: []string{"foo", "bar"},
- exp: `^foo$|^bar$`,
- },
- {
- desc: "word & non-trivial",
- names: []string{"foo", `ab?c`},
- exp: `^foo$|ab?c`,
- },
- {
- desc: "bad regexp",
- names: []string{`(."`},
- exp: `(."`,
- },
- } {
- expRE, expErr := regexp.Compile(tc.exp)
- if re, err := makeRx(tc.names); !reflect.DeepEqual(err, expErr) && !reflect.DeepEqual(re, expRE) {
- t.Errorf("%s: makeRx(%v) = %q,%q; want %q,%q", tc.desc, tc.names, re, err, expRE, expErr)
- }
- }
-}
-
-func TestCommandLine(t *testing.T) {
- cleanup := setupGoroot(t)
- defer cleanup()
- mfs := mapfs.New(map[string]string{
- "src/bar/bar.go": `// Package bar is an example.
-package bar
-`,
- "src/foo/foo.go": `// Package foo.
-package foo
-
-// First function is first.
-func First() {
-}
-
-// Second function is second.
-func Second() {
-}
-`,
- "src/gen/gen.go": `// Package gen
-package gen
-
-//line notgen.go:3
-// F doc //line 1 should appear
-// line 2 should appear
-func F()
-//line foo.go:100`, // no newline on end to check corner cases!
- "src/vet/vet.go": `// Package vet
-package vet
-`,
- "src/cmd/go/doc.go": `// The go command
-package main
-`,
- "src/cmd/gofmt/doc.go": `// The gofmt command
-package main
-`,
- "src/cmd/vet/vet.go": `// The vet command
-package main
-`,
- })
- fs := make(vfs.NameSpace)
- fs.Bind("/", mfs, "/", vfs.BindReplace)
- c := NewCorpus(fs)
- p := &Presentation{Corpus: c}
- p.cmdHandler = handlerServer{
- p: p,
- c: c,
- pattern: "/cmd/",
- fsRoot: "/src/cmd",
- }
- p.pkgHandler = handlerServer{
- p: p,
- c: c,
- pattern: "/pkg/",
- fsRoot: "/src",
- exclude: []string{"/src/cmd"},
- }
- p.initFuncMap()
- p.PackageText = template.Must(template.New("PackageText").Funcs(p.FuncMap()).Parse(`{{$info := .}}{{$filtered := .IsFiltered}}{{if $filtered}}{{range .PAst}}{{range .Decls}}{{node $info .}}{{end}}{{end}}{{else}}{{with .PAst}}{{range $filename, $ast := .}}{{$filename}}:
-{{node $ $ast}}{{end}}{{end}}{{end}}{{with .PDoc}}{{if $.IsMain}}COMMAND {{.Doc}}{{else}}PACKAGE {{.Doc}}{{end}}{{with .Funcs}}
-{{range .}}{{node $ .Decl}}
-{{comment_text .Doc " " "\t"}}{{end}}{{end}}{{end}}`))
-
- for _, tc := range []struct {
- desc string
- args []string
- exp string
- err bool
- }{
- {
- desc: "standard package",
- args: []string{"fmt"},
- exp: "PACKAGE Package fmt implements formatted I/O.\n",
- },
- {
- desc: "package",
- args: []string{"bar"},
- exp: "PACKAGE Package bar is an example.\n",
- },
- {
- desc: "package w. filter",
- args: []string{"foo", "First"},
- exp: "PACKAGE \nfunc First()\n First function is first.\n",
- },
- {
- desc: "package w. bad filter",
- args: []string{"foo", "DNE"},
- exp: "PACKAGE ",
- },
- {
- desc: "source mode",
- args: []string{"src/bar"},
- exp: "bar/bar.go:\n// Package bar is an example.\npackage bar\n",
- },
- {
- desc: "source mode w. filter",
- args: []string{"src/foo", "Second"},
- exp: "// Second function is second.\nfunc Second() {\n}",
- },
- {
- desc: "package w. //line comments",
- args: []string{"gen", "F"},
- exp: "PACKAGE \nfunc F()\n F doc //line 1 should appear line 2 should appear\n",
- },
- {
- desc: "command",
- args: []string{"go"},
- exp: "COMMAND The go command\n",
- },
- {
- desc: "forced command",
- args: []string{"cmd/gofmt"},
- exp: "COMMAND The gofmt command\n",
- },
- {
- desc: "bad arg",
- args: []string{"doesnotexist"},
- err: true,
- },
- {
- desc: "both command and package",
- args: []string{"vet"},
- exp: "use 'godoc cmd/vet' for documentation on the vet command \n\nPACKAGE Package vet\n",
- },
- {
- desc: "root directory",
- args: []string{"/"},
- exp: "",
- },
- } {
- w := new(bytes.Buffer)
- err := CommandLine(w, fs, p, tc.args)
- if got, want := w.String(), tc.exp; got != want || tc.err == (err == nil) {
- t.Errorf("%s: CommandLine(%v) = %q (%v); want %q (%v)",
- tc.desc, tc.args, got, err, want, tc.err)
- }
- }
-}
diff --git a/vendor/golang.org/x/tools/godoc/corpus.go b/vendor/golang.org/x/tools/godoc/corpus.go
deleted file mode 100644
index 8e38365..0000000
--- a/vendor/golang.org/x/tools/godoc/corpus.go
+++ /dev/null
@@ -1,164 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package godoc
-
-import (
- "errors"
- pathpkg "path"
- "sync"
- "time"
-
- "golang.org/x/tools/godoc/analysis"
- "golang.org/x/tools/godoc/util"
- "golang.org/x/tools/godoc/vfs"
-)
-
-// A Corpus holds all the state related to serving and indexing a
-// collection of Go code.
-//
-// Construct a new Corpus with NewCorpus, then modify options,
-// then call its Init method.
-type Corpus struct {
- fs vfs.FileSystem
-
- // Verbose logging.
- Verbose bool
-
- // IndexEnabled controls whether indexing is enabled.
- IndexEnabled bool
-
- // IndexFiles specifies a glob pattern specifying index files.
- // If not empty, the index is read from these files in sorted
- // order.
- IndexFiles string
-
- // IndexThrottle specifies the indexing throttle value
- // between 0.0 and 1.0. At 0.0, the indexer always sleeps.
- // At 1.0, the indexer never sleeps. Because 0.0 is useless
- // and redundant with setting IndexEnabled to false, the
- // zero value for IndexThrottle means 0.9.
- IndexThrottle float64
-
- // IndexInterval specifies the time to sleep between reindexing
- // all the sources.
- // If zero, a default is used. If negative, the index is only
- // built once.
- IndexInterval time.Duration
-
- // IndexDocs enables indexing of Go documentation.
- // This will produce search results for exported types, functions,
- // methods, variables, and constants, and will link to the godoc
- // documentation for those identifiers.
- IndexDocs bool
-
- // IndexGoCode enables indexing of Go source code.
- // This will produce search results for internal and external identifiers
- // and will link to both declarations and uses of those identifiers in
- // source code.
- IndexGoCode bool
-
- // IndexFullText enables full-text indexing.
- // This will provide search results for any matching text in any file that
- // is indexed, including non-Go files (see whitelisted in index.go).
- // Regexp searching is supported via full-text indexing.
- IndexFullText bool
-
- // MaxResults optionally specifies the maximum results for indexing.
- MaxResults int
-
- // SummarizePackage optionally specifies a function to
- // summarize a package. It exists as an optimization to
- // avoid reading files to parse package comments.
- //
- // If SummarizePackage returns false for ok, the caller
- // ignores all return values and parses the files in the package
- // as if SummarizePackage were nil.
- //
- // If showList is false, the package is hidden from the
- // package listing.
- SummarizePackage func(pkg string) (summary string, showList, ok bool)
-
- // IndexDirectory optionally specifies a function to determine
- // whether the provided directory should be indexed. The dir
- // will be of the form "/src/cmd/6a", "/doc/play",
- // "/src/io", etc.
- // If nil, all directories are indexed if indexing is enabled.
- IndexDirectory func(dir string) bool
-
- testDir string // TODO(bradfitz,adg): migrate old godoc flag? looks unused.
-
- // Send a value on this channel to trigger a metadata refresh.
- // It is buffered so that if a signal is not lost if sent
- // during a refresh.
- refreshMetadataSignal chan bool
-
- // file system information
- fsTree util.RWValue // *Directory tree of packages, updated with each sync (but sync code is removed now)
- fsModified util.RWValue // timestamp of last call to invalidateIndex
- docMetadata util.RWValue // mapping from paths to *Metadata
-
- // SearchIndex is the search index in use.
- searchIndex util.RWValue
-
- // Analysis is the result of type and pointer analysis.
- Analysis analysis.Result
-
- // flag to check whether a corpus is initialized or not
- initMu sync.RWMutex
- initDone bool
-}
-
-// NewCorpus returns a new Corpus from a filesystem.
-// The returned corpus has all indexing enabled and MaxResults set to 1000.
-// Change or set any options on Corpus before calling the Corpus.Init method.
-func NewCorpus(fs vfs.FileSystem) *Corpus {
- c := &Corpus{
- fs: fs,
- refreshMetadataSignal: make(chan bool, 1),
-
- MaxResults: 1000,
- IndexEnabled: true,
- IndexDocs: true,
- IndexGoCode: true,
- IndexFullText: true,
- }
- return c
-}
-
-func (c *Corpus) CurrentIndex() (*Index, time.Time) {
- v, t := c.searchIndex.Get()
- idx, _ := v.(*Index)
- return idx, t
-}
-
-func (c *Corpus) FSModifiedTime() time.Time {
- _, ts := c.fsModified.Get()
- return ts
-}
-
-// Init initializes Corpus, once options on Corpus are set.
-// It must be called before any subsequent method calls.
-func (c *Corpus) Init() error {
- if err := c.initFSTree(); err != nil {
- return err
- }
- c.updateMetadata()
- go c.refreshMetadataLoop()
-
- c.initMu.Lock()
- c.initDone = true
- c.initMu.Unlock()
- return nil
-}
-
-func (c *Corpus) initFSTree() error {
- dir := c.newDirectory(pathpkg.Join("/", c.testDir), -1)
- if dir == nil {
- return errors.New("godoc: corpus fstree is nil")
- }
- c.fsTree.Set(dir)
- c.invalidateIndex()
- return nil
-}
diff --git a/vendor/golang.org/x/tools/godoc/dirtrees.go b/vendor/golang.org/x/tools/godoc/dirtrees.go
deleted file mode 100644
index 2b14a41..0000000
--- a/vendor/golang.org/x/tools/godoc/dirtrees.go
+++ /dev/null
@@ -1,342 +0,0 @@
-// Copyright 2010 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// This file contains the code dealing with package directory trees.
-
-package godoc
-
-import (
- "go/doc"
- "go/parser"
- "go/token"
- "log"
- "os"
- pathpkg "path"
- "strings"
-)
-
-// Conventional name for directories containing test data.
-// Excluded from directory trees.
-//
-const testdataDirName = "testdata"
-
-type Directory struct {
- Depth int
- Path string // directory path; includes Name
- Name string // directory name
- HasPkg bool // true if the directory contains at least one package
- Synopsis string // package documentation, if any
- Dirs []*Directory // subdirectories
-}
-
-func isGoFile(fi os.FileInfo) bool {
- name := fi.Name()
- return !fi.IsDir() &&
- len(name) > 0 && name[0] != '.' && // ignore .files
- pathpkg.Ext(name) == ".go"
-}
-
-func isPkgFile(fi os.FileInfo) bool {
- return isGoFile(fi) &&
- !strings.HasSuffix(fi.Name(), "_test.go") // ignore test files
-}
-
-func isPkgDir(fi os.FileInfo) bool {
- name := fi.Name()
- return fi.IsDir() && len(name) > 0 &&
- name[0] != '_' && name[0] != '.' // ignore _files and .files
-}
-
-type treeBuilder struct {
- c *Corpus
- maxDepth int
-}
-
-// ioGate is a semaphore controlling VFS activity (ReadDir, parseFile, etc).
-// Send before an operation and receive after.
-var ioGate = make(chan bool, 20)
-
-func (b *treeBuilder) newDirTree(fset *token.FileSet, path, name string, depth int) *Directory {
- if name == testdataDirName {
- return nil
- }
-
- if depth >= b.maxDepth {
- // return a dummy directory so that the parent directory
- // doesn't get discarded just because we reached the max
- // directory depth
- return &Directory{
- Depth: depth,
- Path: path,
- Name: name,
- }
- }
-
- var synopses [3]string // prioritized package documentation (0 == highest priority)
-
- show := true // show in package listing
- hasPkgFiles := false
- haveSummary := false
-
- if hook := b.c.SummarizePackage; hook != nil {
- if summary, show0, ok := hook(strings.TrimPrefix(path, "/src/")); ok {
- hasPkgFiles = true
- show = show0
- synopses[0] = summary
- haveSummary = true
- }
- }
-
- ioGate <- true
- list, err := b.c.fs.ReadDir(path)
- <-ioGate
- if err != nil {
- // TODO: propagate more. See golang.org/issue/14252.
- // For now:
- if b.c.Verbose {
- log.Printf("newDirTree reading %s: %v", path, err)
- }
- }
-
- // determine number of subdirectories and if there are package files
- var dirchs []chan *Directory
-
- for _, d := range list {
- filename := pathpkg.Join(path, d.Name())
- switch {
- case isPkgDir(d):
- ch := make(chan *Directory, 1)
- dirchs = append(dirchs, ch)
- name := d.Name()
- go func() {
- ch <- b.newDirTree(fset, filename, name, depth+1)
- }()
- case !haveSummary && isPkgFile(d):
- // looks like a package file, but may just be a file ending in ".go";
- // don't just count it yet (otherwise we may end up with hasPkgFiles even
- // though the directory doesn't contain any real package files - was bug)
- // no "optimal" package synopsis yet; continue to collect synopses
- ioGate <- true
- const flags = parser.ParseComments | parser.PackageClauseOnly
- file, err := b.c.parseFile(fset, filename, flags)
- <-ioGate
- if err != nil {
- if b.c.Verbose {
- log.Printf("Error parsing %v: %v", filename, err)
- }
- break
- }
-
- hasPkgFiles = true
- if file.Doc != nil {
- // prioritize documentation
- i := -1
- switch file.Name.Name {
- case name:
- i = 0 // normal case: directory name matches package name
- case "main":
- i = 1 // directory contains a main package
- default:
- i = 2 // none of the above
- }
- if 0 <= i && i < len(synopses) && synopses[i] == "" {
- synopses[i] = doc.Synopsis(file.Doc.Text())
- }
- }
- haveSummary = synopses[0] != ""
- }
- }
-
- // create subdirectory tree
- var dirs []*Directory
- for _, ch := range dirchs {
- if d := <-ch; d != nil {
- dirs = append(dirs, d)
- }
- }
-
- // if there are no package files and no subdirectories
- // containing package files, ignore the directory
- if !hasPkgFiles && len(dirs) == 0 {
- return nil
- }
-
- // select the highest-priority synopsis for the directory entry, if any
- synopsis := ""
- for _, synopsis = range synopses {
- if synopsis != "" {
- break
- }
- }
-
- return &Directory{
- Depth: depth,
- Path: path,
- Name: name,
- HasPkg: hasPkgFiles && show, // TODO(bradfitz): add proper Hide field?
- Synopsis: synopsis,
- Dirs: dirs,
- }
-}
-
-// newDirectory creates a new package directory tree with at most maxDepth
-// levels, anchored at root. The result tree is pruned such that it only
-// contains directories that contain package files or that contain
-// subdirectories containing package files (transitively). If a non-nil
-// pathFilter is provided, directory paths additionally must be accepted
-// by the filter (i.e., pathFilter(path) must be true). If a value >= 0 is
-// provided for maxDepth, nodes at larger depths are pruned as well; they
-// are assumed to contain package files even if their contents are not known
-// (i.e., in this case the tree may contain directories w/o any package files).
-//
-func (c *Corpus) newDirectory(root string, maxDepth int) *Directory {
- // The root could be a symbolic link so use Stat not Lstat.
- d, err := c.fs.Stat(root)
- // If we fail here, report detailed error messages; otherwise
- // is is hard to see why a directory tree was not built.
- switch {
- case err != nil:
- log.Printf("newDirectory(%s): %s", root, err)
- return nil
- case root != "/" && !isPkgDir(d):
- log.Printf("newDirectory(%s): not a package directory", root)
- return nil
- case root == "/" && !d.IsDir():
- log.Printf("newDirectory(%s): not a directory", root)
- return nil
- }
- if maxDepth < 0 {
- maxDepth = 1e6 // "infinity"
- }
- b := treeBuilder{c, maxDepth}
- // the file set provided is only for local parsing, no position
- // information escapes and thus we don't need to save the set
- return b.newDirTree(token.NewFileSet(), root, d.Name(), 0)
-}
-
-func (dir *Directory) walk(c chan<- *Directory, skipRoot bool) {
- if dir != nil {
- if !skipRoot {
- c <- dir
- }
- for _, d := range dir.Dirs {
- d.walk(c, false)
- }
- }
-}
-
-func (dir *Directory) iter(skipRoot bool) <-chan *Directory {
- c := make(chan *Directory)
- go func() {
- dir.walk(c, skipRoot)
- close(c)
- }()
- return c
-}
-
-func (dir *Directory) lookupLocal(name string) *Directory {
- for _, d := range dir.Dirs {
- if d.Name == name {
- return d
- }
- }
- return nil
-}
-
-func splitPath(p string) []string {
- p = strings.TrimPrefix(p, "/")
- if p == "" {
- return nil
- }
- return strings.Split(p, "/")
-}
-
-// lookup looks for the *Directory for a given path, relative to dir.
-func (dir *Directory) lookup(path string) *Directory {
- d := splitPath(dir.Path)
- p := splitPath(path)
- i := 0
- for i < len(d) {
- if i >= len(p) || d[i] != p[i] {
- return nil
- }
- i++
- }
- for dir != nil && i < len(p) {
- dir = dir.lookupLocal(p[i])
- i++
- }
- return dir
-}
-
-// DirEntry describes a directory entry. The Depth and Height values
-// are useful for presenting an entry in an indented fashion.
-//
-type DirEntry struct {
- Depth int // >= 0
- Height int // = DirList.MaxHeight - Depth, > 0
- Path string // directory path; includes Name, relative to DirList root
- Name string // directory name
- HasPkg bool // true if the directory contains at least one package
- Synopsis string // package documentation, if any
-}
-
-type DirList struct {
- MaxHeight int // directory tree height, > 0
- List []DirEntry
-}
-
-// listing creates a (linear) directory listing from a directory tree.
-// If skipRoot is set, the root directory itself is excluded from the list.
-// If filter is set, only the directory entries whose paths match the filter
-// are included.
-//
-func (root *Directory) listing(skipRoot bool, filter func(string) bool) *DirList {
- if root == nil {
- return nil
- }
-
- // determine number of entries n and maximum height
- n := 0
- minDepth := 1 << 30 // infinity
- maxDepth := 0
- for d := range root.iter(skipRoot) {
- n++
- if minDepth > d.Depth {
- minDepth = d.Depth
- }
- if maxDepth < d.Depth {
- maxDepth = d.Depth
- }
- }
- maxHeight := maxDepth - minDepth + 1
-
- if n == 0 {
- return nil
- }
-
- // create list
- list := make([]DirEntry, 0, n)
- for d := range root.iter(skipRoot) {
- if filter != nil && !filter(d.Path) {
- continue
- }
- var p DirEntry
- p.Depth = d.Depth - minDepth
- p.Height = maxHeight - p.Depth
- // the path is relative to root.Path - remove the root.Path
- // prefix (the prefix should always be present but avoid
- // crashes and check)
- path := strings.TrimPrefix(d.Path, root.Path)
- // remove leading separator if any - path must be relative
- path = strings.TrimPrefix(path, "/")
- p.Path = path
- p.Name = d.Name
- p.HasPkg = d.HasPkg
- p.Synopsis = d.Synopsis
- list = append(list, p)
- }
-
- return &DirList{maxHeight, list}
-}
diff --git a/vendor/golang.org/x/tools/godoc/dl/dl.go b/vendor/golang.org/x/tools/godoc/dl/dl.go
deleted file mode 100644
index f5e6320..0000000
--- a/vendor/golang.org/x/tools/godoc/dl/dl.go
+++ /dev/null
@@ -1,558 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by the Apache 2.0
-// license that can be found in the LICENSE file.
-
-// +build appengine
-
-// Package dl implements a simple downloads frontend server.
-//
-// It accepts HTTP POST requests to create a new download metadata entity, and
-// lists entities with sorting and filtering.
-// It is designed to run only on the instance of godoc that serves golang.org.
-package dl
-
-import (
- "crypto/hmac"
- "crypto/md5"
- "encoding/json"
- "fmt"
- "html/template"
- "io"
- "net/http"
- "regexp"
- "sort"
- "strconv"
- "strings"
- "sync"
- "time"
-
- "golang.org/x/net/context"
-
- "google.golang.org/appengine"
- "google.golang.org/appengine/datastore"
- "google.golang.org/appengine/log"
- "google.golang.org/appengine/memcache"
-)
-
-const (
- downloadBaseURL = "https://dl.google.com/go/"
- cacheKey = "download_list_3" // increment if listTemplateData changes
- cacheDuration = time.Hour
-)
-
-func RegisterHandlers(mux *http.ServeMux) {
- mux.Handle("/dl", http.RedirectHandler("/dl/", http.StatusFound))
- mux.HandleFunc("/dl/", getHandler) // also serves listHandler
- mux.HandleFunc("/dl/upload", uploadHandler)
- mux.HandleFunc("/dl/init", initHandler)
-}
-
-type File struct {
- Filename string `json:"filename"`
- OS string `json:"os"`
- Arch string `json:"arch"`
- Version string `json:"-"`
- Checksum string `json:"-" datastore:",noindex"` // SHA1; deprecated
- ChecksumSHA256 string `json:"sha256" datastore:",noindex"`
- Size int64 `json:"size" datastore:",noindex"`
- Kind string `json:"kind"` // "archive", "installer", "source"
- Uploaded time.Time `json:"-"`
-}
-
-func (f File) ChecksumType() string {
- if f.ChecksumSHA256 != "" {
- return "SHA256"
- }
- return "SHA1"
-}
-
-func (f File) PrettyChecksum() string {
- if f.ChecksumSHA256 != "" {
- return f.ChecksumSHA256
- }
- return f.Checksum
-}
-
-func (f File) PrettyOS() string {
- if f.OS == "darwin" {
- switch {
- case strings.Contains(f.Filename, "osx10.8"):
- return "OS X 10.8+"
- case strings.Contains(f.Filename, "osx10.6"):
- return "OS X 10.6+"
- }
- }
- return pretty(f.OS)
-}
-
-func (f File) PrettySize() string {
- const mb = 1 << 20
- if f.Size == 0 {
- return ""
- }
- if f.Size < mb {
- // All Go releases are >1mb, but handle this case anyway.
- return fmt.Sprintf("%v bytes", f.Size)
- }
- return fmt.Sprintf("%.0fMB", float64(f.Size)/mb)
-}
-
-var primaryPorts = map[string]bool{
- "darwin/amd64": true,
- "linux/386": true,
- "linux/amd64": true,
- "linux/armv6l": true,
- "windows/386": true,
- "windows/amd64": true,
-}
-
-func (f File) PrimaryPort() bool {
- if f.Kind == "source" {
- return true
- }
- return primaryPorts[f.OS+"/"+f.Arch]
-}
-
-func (f File) Highlight() bool {
- switch {
- case f.Kind == "source":
- return true
- case f.Arch == "amd64" && f.OS == "linux":
- return true
- case f.Arch == "amd64" && f.Kind == "installer":
- switch f.OS {
- case "windows":
- return true
- case "darwin":
- if !strings.Contains(f.Filename, "osx10.6") {
- return true
- }
- }
- }
- return false
-}
-
-func (f File) URL() string {
- return downloadBaseURL + f.Filename
-}
-
-type Release struct {
- Version string `json:"version"`
- Stable bool `json:"stable"`
- Files []File `json:"files"`
- Visible bool `json:"-"` // show files on page load
- SplitPortTable bool `json:"-"` // whether files should be split by primary/other ports.
-}
-
-type Feature struct {
- // The File field will be filled in by the first stable File
- // whose name matches the given fileRE.
- File
- fileRE *regexp.Regexp
-
- Platform string // "Microsoft Windows", "Apple macOS", "Linux"
- Requirements string // "Windows XP and above, 64-bit Intel Processor"
-}
-
-// featuredFiles lists the platforms and files to be featured
-// at the top of the downloads page.
-var featuredFiles = []Feature{
- {
- Platform: "Microsoft Windows",
- Requirements: "Windows XP SP3 or later, Intel 64-bit processor",
- fileRE: regexp.MustCompile(`\.windows-amd64\.msi$`),
- },
- {
- Platform: "Apple macOS",
- Requirements: "macOS 10.8 or later, Intel 64-bit processor",
- fileRE: regexp.MustCompile(`\.darwin-amd64(-osx10\.8)?\.pkg$`),
- },
- {
- Platform: "Linux",
- Requirements: "Linux 2.6.23 or later, Intel 64-bit processor",
- fileRE: regexp.MustCompile(`\.linux-amd64\.tar\.gz$`),
- },
- {
- Platform: "Source",
- fileRE: regexp.MustCompile(`\.src\.tar\.gz$`),
- },
-}
-
-// data to send to the template; increment cacheKey if you change this.
-type listTemplateData struct {
- Featured []Feature
- Stable, Unstable, Archive []Release
-}
-
-var (
- listTemplate = template.Must(template.New("").Funcs(templateFuncs).Parse(templateHTML))
- templateFuncs = template.FuncMap{"pretty": pretty}
-)
-
-func listHandler(w http.ResponseWriter, r *http.Request) {
- if r.Method != "GET" {
- http.Error(w, "method not allowed", http.StatusMethodNotAllowed)
- return
- }
- var (
- c = appengine.NewContext(r)
- d listTemplateData
- )
- if _, err := memcache.Gob.Get(c, cacheKey, &d); err != nil {
- if err == memcache.ErrCacheMiss {
- log.Debugf(c, "cache miss")
- } else {
- log.Errorf(c, "cache get error: %v", err)
- }
-
- var fs []File
- _, err := datastore.NewQuery("File").Ancestor(rootKey(c)).GetAll(c, &fs)
- if err != nil {
- log.Errorf(c, "error listing: %v", err)
- return
- }
- d.Stable, d.Unstable, d.Archive = filesToReleases(fs)
- if len(d.Stable) > 0 {
- d.Featured = filesToFeatured(d.Stable[0].Files)
- }
-
- item := &memcache.Item{Key: cacheKey, Object: &d, Expiration: cacheDuration}
- if err := memcache.Gob.Set(c, item); err != nil {
- log.Errorf(c, "cache set error: %v", err)
- }
- }
-
- if r.URL.Query().Get("mode") == "json" {
- w.Header().Set("Content-Type", "application/json")
- enc := json.NewEncoder(w)
- enc.SetIndent("", " ")
- if err := enc.Encode(d.Stable); err != nil {
- log.Errorf(c, "failed rendering JSON for releases: %v", err)
- }
- return
- }
-
- if err := listTemplate.ExecuteTemplate(w, "root", d); err != nil {
- log.Errorf(c, "error executing template: %v", err)
- }
-}
-
-func filesToFeatured(fs []File) (featured []Feature) {
- for _, feature := range featuredFiles {
- for _, file := range fs {
- if feature.fileRE.MatchString(file.Filename) {
- feature.File = file
- featured = append(featured, feature)
- break
- }
- }
- }
- return
-}
-
-func filesToReleases(fs []File) (stable, unstable, archive []Release) {
- sort.Sort(fileOrder(fs))
-
- var r *Release
- var stableMaj, stableMin int
- add := func() {
- if r == nil {
- return
- }
- if !r.Stable {
- if len(unstable) != 0 {
- // Only show one (latest) unstable version.
- return
- }
- maj, min, _ := parseVersion(r.Version)
- if maj < stableMaj || maj == stableMaj && min <= stableMin {
- // Display unstable version only if newer than the
- // latest stable release.
- return
- }
- unstable = append(unstable, *r)
- }
-
- // Reports whether the release is the most recent minor version of the
- // two most recent major versions.
- shouldAddStable := func() bool {
- if len(stable) >= 2 {
- // Show up to two stable versions.
- return false
- }
- if len(stable) == 0 {
- // Most recent stable version.
- stableMaj, stableMin, _ = parseVersion(r.Version)
- return true
- }
- if maj, _, _ := parseVersion(r.Version); maj == stableMaj {
- // Older minor version of most recent major version.
- return false
- }
- // Second most recent stable version.
- return true
- }
- if !shouldAddStable() {
- archive = append(archive, *r)
- return
- }
-
- // Split the file list into primary/other ports for the stable releases.
- // NOTE(cbro): This is only done for stable releases because maintaining the historical
- // nature of primary/other ports for older versions is infeasible.
- // If freebsd is considered primary some time in the future, we'd not want to
- // mark all of the older freebsd binaries as "primary".
- // It might be better if we set that as a flag when uploading.
- r.SplitPortTable = true
- r.Visible = true // Toggle open all stable releases.
- stable = append(stable, *r)
- }
- for _, f := range fs {
- if r == nil || f.Version != r.Version {
- add()
- r = &Release{
- Version: f.Version,
- Stable: isStable(f.Version),
- }
- }
- r.Files = append(r.Files, f)
- }
- add()
- return
-}
-
-// isStable reports whether the version string v is a stable version.
-func isStable(v string) bool {
- return !strings.Contains(v, "beta") && !strings.Contains(v, "rc")
-}
-
-type fileOrder []File
-
-func (s fileOrder) Len() int { return len(s) }
-func (s fileOrder) Swap(i, j int) { s[i], s[j] = s[j], s[i] }
-func (s fileOrder) Less(i, j int) bool {
- a, b := s[i], s[j]
- if av, bv := a.Version, b.Version; av != bv {
- return versionLess(av, bv)
- }
- if a.OS != b.OS {
- return a.OS < b.OS
- }
- if a.Arch != b.Arch {
- return a.Arch < b.Arch
- }
- if a.Kind != b.Kind {
- return a.Kind < b.Kind
- }
- return a.Filename < b.Filename
-}
-
-func versionLess(a, b string) bool {
- // Put stable releases first.
- if isStable(a) != isStable(b) {
- return isStable(a)
- }
- maja, mina, ta := parseVersion(a)
- majb, minb, tb := parseVersion(b)
- if maja == majb {
- if mina == minb {
- return ta >= tb
- }
- return mina >= minb
- }
- return maja >= majb
-}
-
-func parseVersion(v string) (maj, min int, tail string) {
- if i := strings.Index(v, "beta"); i > 0 {
- tail = v[i:]
- v = v[:i]
- }
- if i := strings.Index(v, "rc"); i > 0 {
- tail = v[i:]
- v = v[:i]
- }
- p := strings.Split(strings.TrimPrefix(v, "go1."), ".")
- maj, _ = strconv.Atoi(p[0])
- if len(p) < 2 {
- return
- }
- min, _ = strconv.Atoi(p[1])
- return
-}
-
-func uploadHandler(w http.ResponseWriter, r *http.Request) {
- if r.Method != "POST" {
- http.Error(w, "method not allowed", http.StatusMethodNotAllowed)
- return
- }
- c := appengine.NewContext(r)
-
- // Authenticate using a user token (same as gomote).
- user := r.FormValue("user")
- if !validUser(user) {
- http.Error(w, "bad user", http.StatusForbidden)
- return
- }
- if r.FormValue("key") != userKey(c, user) {
- http.Error(w, "bad key", http.StatusForbidden)
- return
- }
-
- var f File
- defer r.Body.Close()
- if err := json.NewDecoder(r.Body).Decode(&f); err != nil {
- log.Errorf(c, "error decoding upload JSON: %v", err)
- http.Error(w, "Something broke", http.StatusInternalServerError)
- return
- }
- if f.Filename == "" {
- http.Error(w, "Must provide Filename", http.StatusBadRequest)
- return
- }
- if f.Uploaded.IsZero() {
- f.Uploaded = time.Now()
- }
- k := datastore.NewKey(c, "File", f.Filename, 0, rootKey(c))
- if _, err := datastore.Put(c, k, &f); err != nil {
- log.Errorf(c, "putting File entity: %v", err)
- http.Error(w, "could not put File entity", http.StatusInternalServerError)
- return
- }
- if err := memcache.Delete(c, cacheKey); err != nil {
- log.Errorf(c, "cache delete error: %v", err)
- }
- io.WriteString(w, "OK")
-}
-
-func getHandler(w http.ResponseWriter, r *http.Request) {
- name := strings.TrimPrefix(r.URL.Path, "/dl/")
- if name == "" {
- listHandler(w, r)
- return
- }
- if !fileRe.MatchString(name) {
- http.NotFound(w, r)
- return
- }
- http.Redirect(w, r, downloadBaseURL+name, http.StatusFound)
-}
-
-func validUser(user string) bool {
- switch user {
- case "adg", "bradfitz", "cbro", "andybons":
- return true
- }
- return false
-}
-
-func userKey(c context.Context, user string) string {
- h := hmac.New(md5.New, []byte(secret(c)))
- h.Write([]byte("user-" + user))
- return fmt.Sprintf("%x", h.Sum(nil))
-}
-
-var fileRe = regexp.MustCompile(`^go[0-9a-z.]+\.[0-9a-z.-]+\.(tar\.gz|pkg|msi|zip)$`)
-
-func initHandler(w http.ResponseWriter, r *http.Request) {
- var fileRoot struct {
- Root string
- }
- c := appengine.NewContext(r)
- k := rootKey(c)
- err := datastore.RunInTransaction(c, func(c context.Context) error {
- err := datastore.Get(c, k, &fileRoot)
- if err != nil && err != datastore.ErrNoSuchEntity {
- return err
- }
- _, err = datastore.Put(c, k, &fileRoot)
- return err
- }, nil)
- if err != nil {
- http.Error(w, err.Error(), 500)
- return
- }
- io.WriteString(w, "OK")
-}
-
-// rootKey is the ancestor of all File entities.
-func rootKey(c context.Context) *datastore.Key {
- return datastore.NewKey(c, "FileRoot", "root", 0, nil)
-}
-
-// pretty returns a human-readable version of the given OS, Arch, or Kind.
-func pretty(s string) string {
- t, ok := prettyStrings[s]
- if !ok {
- return s
- }
- return t
-}
-
-var prettyStrings = map[string]string{
- "darwin": "macOS",
- "freebsd": "FreeBSD",
- "linux": "Linux",
- "windows": "Windows",
-
- "386": "x86",
- "amd64": "x86-64",
- "armv6l": "ARMv6",
- "arm64": "ARMv8",
-
- "archive": "Archive",
- "installer": "Installer",
- "source": "Source",
-}
-
-// Code below copied from x/build/app/key
-
-var theKey struct {
- sync.RWMutex
- builderKey
-}
-
-type builderKey struct {
- Secret string
-}
-
-func (k *builderKey) Key(c context.Context) *datastore.Key {
- return datastore.NewKey(c, "BuilderKey", "root", 0, nil)
-}
-
-func secret(c context.Context) string {
- // check with rlock
- theKey.RLock()
- k := theKey.Secret
- theKey.RUnlock()
- if k != "" {
- return k
- }
-
- // prepare to fill; check with lock and keep lock
- theKey.Lock()
- defer theKey.Unlock()
- if theKey.Secret != "" {
- return theKey.Secret
- }
-
- // fill
- if err := datastore.Get(c, theKey.Key(c), &theKey.builderKey); err != nil {
- if err == datastore.ErrNoSuchEntity {
- // If the key is not stored in datastore, write it.
- // This only happens at the beginning of a new deployment.
- // The code is left here for SDK use and in case a fresh
- // deployment is ever needed. "gophers rule" is not the
- // real key.
- if !appengine.IsDevAppServer() {
- panic("lost key from datastore")
- }
- theKey.Secret = "gophers rule"
- datastore.Put(c, theKey.Key(c), &theKey.builderKey)
- return theKey.Secret
- }
- panic("cannot load builder key: " + err.Error())
- }
-
- return theKey.Secret
-}
diff --git a/vendor/golang.org/x/tools/godoc/dl/dl_test.go b/vendor/golang.org/x/tools/godoc/dl/dl_test.go
deleted file mode 100644
index 3f61fe9..0000000
--- a/vendor/golang.org/x/tools/godoc/dl/dl_test.go
+++ /dev/null
@@ -1,137 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by the Apache 2.0
-// license that can be found in the LICENSE file.
-
-// +build appengine
-
-package dl
-
-import (
- "sort"
- "strings"
- "testing"
-)
-
-func TestParseVersion(t *testing.T) {
- for _, c := range []struct {
- in string
- maj, min int
- tail string
- }{
- {"go1.5", 5, 0, ""},
- {"go1.5beta1", 5, 0, "beta1"},
- {"go1.5.1", 5, 1, ""},
- {"go1.5.1rc1", 5, 1, "rc1"},
- } {
- maj, min, tail := parseVersion(c.in)
- if maj != c.maj || min != c.min || tail != c.tail {
- t.Errorf("parseVersion(%q) = %v, %v, %q; want %v, %v, %q",
- c.in, maj, min, tail, c.maj, c.min, c.tail)
- }
- }
-}
-
-func TestFileOrder(t *testing.T) {
- fs := []File{
- {Filename: "go1.3.src.tar.gz", Version: "go1.3", OS: "", Arch: "", Kind: "source"},
- {Filename: "go1.3.1.src.tar.gz", Version: "go1.3.1", OS: "", Arch: "", Kind: "source"},
- {Filename: "go1.3.linux-amd64.tar.gz", Version: "go1.3", OS: "linux", Arch: "amd64", Kind: "archive"},
- {Filename: "go1.3.1.linux-amd64.tar.gz", Version: "go1.3.1", OS: "linux", Arch: "amd64", Kind: "archive"},
- {Filename: "go1.3.darwin-amd64.tar.gz", Version: "go1.3", OS: "darwin", Arch: "amd64", Kind: "archive"},
- {Filename: "go1.3.darwin-amd64.pkg", Version: "go1.3", OS: "darwin", Arch: "amd64", Kind: "installer"},
- {Filename: "go1.3.darwin-386.tar.gz", Version: "go1.3", OS: "darwin", Arch: "386", Kind: "archive"},
- {Filename: "go1.3beta1.linux-amd64.tar.gz", Version: "go1.3beta1", OS: "linux", Arch: "amd64", Kind: "archive"},
- {Filename: "go1.3beta2.linux-amd64.tar.gz", Version: "go1.3beta2", OS: "linux", Arch: "amd64", Kind: "archive"},
- {Filename: "go1.3rc1.linux-amd64.tar.gz", Version: "go1.3rc1", OS: "linux", Arch: "amd64", Kind: "archive"},
- {Filename: "go1.2.linux-amd64.tar.gz", Version: "go1.2", OS: "linux", Arch: "amd64", Kind: "archive"},
- {Filename: "go1.2.2.linux-amd64.tar.gz", Version: "go1.2.2", OS: "linux", Arch: "amd64", Kind: "archive"},
- }
- sort.Sort(fileOrder(fs))
- var s []string
- for _, f := range fs {
- s = append(s, f.Filename)
- }
- got := strings.Join(s, "\n")
- want := strings.Join([]string{
- "go1.3.1.src.tar.gz",
- "go1.3.1.linux-amd64.tar.gz",
- "go1.3.src.tar.gz",
- "go1.3.darwin-386.tar.gz",
- "go1.3.darwin-amd64.tar.gz",
- "go1.3.darwin-amd64.pkg",
- "go1.3.linux-amd64.tar.gz",
- "go1.2.2.linux-amd64.tar.gz",
- "go1.2.linux-amd64.tar.gz",
- "go1.3rc1.linux-amd64.tar.gz",
- "go1.3beta2.linux-amd64.tar.gz",
- "go1.3beta1.linux-amd64.tar.gz",
- }, "\n")
- if got != want {
- t.Errorf("sort order is\n%s\nwant:\n%s", got, want)
- }
-}
-
-func TestFilesToReleases(t *testing.T) {
- fs := []File{
- {Version: "go1.7.4", OS: "darwin"},
- {Version: "go1.7.4", OS: "windows"},
- {Version: "go1.7", OS: "darwin"},
- {Version: "go1.7", OS: "windows"},
- {Version: "go1.6.2", OS: "darwin"},
- {Version: "go1.6.2", OS: "windows"},
- {Version: "go1.6", OS: "darwin"},
- {Version: "go1.6", OS: "windows"},
- {Version: "go1.5.2", OS: "darwin"},
- {Version: "go1.5.2", OS: "windows"},
- {Version: "go1.5", OS: "darwin"},
- {Version: "go1.5", OS: "windows"},
- {Version: "go1.5beta1", OS: "windows"},
- }
- stable, unstable, archive := filesToReleases(fs)
- if got, want := len(stable), 2; want != got {
- t.Errorf("len(stable): got %v, want %v", got, want)
- } else {
- if got, want := stable[0].Version, "go1.7.4"; want != got {
- t.Errorf("stable[0].Version: got %v, want %v", got, want)
- }
- if got, want := stable[1].Version, "go1.6.2"; want != got {
- t.Errorf("stable[1].Version: got %v, want %v", got, want)
- }
- }
- if got, want := len(unstable), 0; want != got {
- t.Errorf("len(unstable): got %v, want %v", got, want)
- }
- if got, want := len(archive), 4; want != got {
- t.Errorf("len(archive): got %v, want %v", got, want)
- }
-}
-
-func TestOldUnstableNotShown(t *testing.T) {
- fs := []File{
- {Version: "go1.7.4"},
- {Version: "go1.7"},
- {Version: "go1.7beta1"},
- }
- _, unstable, _ := filesToReleases(fs)
- if len(unstable) != 0 {
- t.Errorf("got unstable, want none")
- }
-}
-
-func TestUnstableShown(t *testing.T) {
- fs := []File{
- {Version: "go1.8beta2"},
- {Version: "go1.8rc1"},
- {Version: "go1.7.4"},
- {Version: "go1.7"},
- {Version: "go1.7beta1"},
- }
- _, unstable, _ := filesToReleases(fs)
- if got, want := len(unstable), 1; got != want {
- t.Fatalf("len(unstable): got %v, want %v", got, want)
- }
- // show rcs ahead of betas.
- if got, want := unstable[0].Version, "go1.8rc1"; got != want {
- t.Fatalf("unstable[0].Version: got %v, want %v", got, want)
- }
-}
diff --git a/vendor/golang.org/x/tools/godoc/dl/tmpl.go b/vendor/golang.org/x/tools/godoc/dl/tmpl.go
deleted file mode 100644
index c5df742..0000000
--- a/vendor/golang.org/x/tools/godoc/dl/tmpl.go
+++ /dev/null
@@ -1,279 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by the Apache 2.0
-// license that can be found in the LICENSE file.
-
-// +build appengine
-
-package dl
-
-// TODO(adg): refactor this to use the tools/godoc/static template.
-
-const templateHTML = `
-{{define "root"}}
-
-
-
-
- Downloads - The Go Programming Language
-
-
-
-
-
-
-
-
-
-
-
-
Downloads
-
-
-After downloading a binary release suitable for your system,
-please follow the installation instructions .
-
-
-
-If you are building from source,
-follow the source installation instructions .
-
-
-
-See the release history for more
-information about Go releases.
-
-
-{{with .Featured}}
-
Featured downloads
-{{range .}}
-{{template "download" .}}
-{{end}}
-{{end}}
-
-
-
-{{with .Stable}}
-
Stable versions
-{{template "releases" .}}
-{{end}}
-
-{{with .Unstable}}
-
Unstable version
-{{template "releases" .}}
-{{end}}
-
-{{with .Archive}}
-
-
-
-
-
-
- {{template "releases" .}}
-
-
-{{end}}
-
-
-
-
-
-
-
-
-
-
-
-{{end}}
-
-{{define "releases"}}
-{{range .}}
-
-
-
-
-
-
- {{if .Stable}}{{else}}
-
This is an unstable version of Go. Use with caution.
-
If you already have Go installed, you can install this version by running:
-
-go get golang.org/x/build/version/{{.Version}}
-
-
Then, use the {{.Version}}
command instead of the go
command to use {{.Version}}.
- {{end}}
- {{template "files" .}}
-
-
-{{end}}
-{{end}}
-
-{{define "files"}}
-
-
-
- File name
- Kind
- OS
- Arch
- Size
- {{/* Use the checksum type of the first file for the column heading. */}}
- {{(index .Files 0).ChecksumType}} Checksum
-
-
-{{if .SplitPortTable}}
- {{range .Files}}{{if .PrimaryPort}}{{template "file" .}}{{end}}{{end}}
-
- {{/* TODO(cbro): add a link to an explanatory doc page */}}
- Other Ports
- {{range .Files}}{{if not .PrimaryPort}}{{template "file" .}}{{end}}{{end}}
-{{else}}
- {{range .Files}}{{template "file" .}}{{end}}
-{{end}}
-
-{{end}}
-
-{{define "file"}}
-
- {{.Filename}}
- {{pretty .Kind}}
- {{.PrettyOS}}
- {{pretty .Arch}}
- {{.PrettySize}}
- {{.PrettyChecksum}}
-
-{{end}}
-
-{{define "download"}}
-
-{{.Platform}}
-{{with .Requirements}}{{.}}
{{end}}
-
- {{.Filename}}
- {{if .Size}}({{.PrettySize}}) {{end}}
-
-
-{{end}}
-`
diff --git a/vendor/golang.org/x/tools/godoc/format.go b/vendor/golang.org/x/tools/godoc/format.go
deleted file mode 100644
index 6013238..0000000
--- a/vendor/golang.org/x/tools/godoc/format.go
+++ /dev/null
@@ -1,371 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// This file implements FormatSelections and FormatText.
-// FormatText is used to HTML-format Go and non-Go source
-// text with line numbers and highlighted sections. It is
-// built on top of FormatSelections, a generic formatter
-// for "selected" text.
-
-package godoc
-
-import (
- "fmt"
- "go/scanner"
- "go/token"
- "io"
- "regexp"
- "strconv"
- "text/template"
-)
-
-// ----------------------------------------------------------------------------
-// Implementation of FormatSelections
-
-// A Segment describes a text segment [start, end).
-// The zero value of a Segment is a ready-to-use empty segment.
-//
-type Segment struct {
- start, end int
-}
-
-func (seg *Segment) isEmpty() bool { return seg.start >= seg.end }
-
-// A Selection is an "iterator" function returning a text segment.
-// Repeated calls to a selection return consecutive, non-overlapping,
-// non-empty segments, followed by an infinite sequence of empty
-// segments. The first empty segment marks the end of the selection.
-//
-type Selection func() Segment
-
-// A LinkWriter writes some start or end "tag" to w for the text offset offs.
-// It is called by FormatSelections at the start or end of each link segment.
-//
-type LinkWriter func(w io.Writer, offs int, start bool)
-
-// A SegmentWriter formats a text according to selections and writes it to w.
-// The selections parameter is a bit set indicating which selections provided
-// to FormatSelections overlap with the text segment: If the n'th bit is set
-// in selections, the n'th selection provided to FormatSelections is overlapping
-// with the text.
-//
-type SegmentWriter func(w io.Writer, text []byte, selections int)
-
-// FormatSelections takes a text and writes it to w using link and segment
-// writers lw and sw as follows: lw is invoked for consecutive segment starts
-// and ends as specified through the links selection, and sw is invoked for
-// consecutive segments of text overlapped by the same selections as specified
-// by selections. The link writer lw may be nil, in which case the links
-// Selection is ignored.
-//
-func FormatSelections(w io.Writer, text []byte, lw LinkWriter, links Selection, sw SegmentWriter, selections ...Selection) {
- // If we have a link writer, make the links
- // selection the last entry in selections
- if lw != nil {
- selections = append(selections, links)
- }
-
- // compute the sequence of consecutive segment changes
- changes := newMerger(selections)
-
- // The i'th bit in bitset indicates that the text
- // at the current offset is covered by selections[i].
- bitset := 0
- lastOffs := 0
-
- // Text segments are written in a delayed fashion
- // such that consecutive segments belonging to the
- // same selection can be combined (peephole optimization).
- // last describes the last segment which has not yet been written.
- var last struct {
- begin, end int // valid if begin < end
- bitset int
- }
-
- // flush writes the last delayed text segment
- flush := func() {
- if last.begin < last.end {
- sw(w, text[last.begin:last.end], last.bitset)
- }
- last.begin = last.end // invalidate last
- }
-
- // segment runs the segment [lastOffs, end) with the selection
- // indicated by bitset through the segment peephole optimizer.
- segment := func(end int) {
- if lastOffs < end { // ignore empty segments
- if last.end != lastOffs || last.bitset != bitset {
- // the last segment is not adjacent to or
- // differs from the new one
- flush()
- // start a new segment
- last.begin = lastOffs
- }
- last.end = end
- last.bitset = bitset
- }
- }
-
- for {
- // get the next segment change
- index, offs, start := changes.next()
- if index < 0 || offs > len(text) {
- // no more segment changes or the next change
- // is past the end of the text - we're done
- break
- }
- // determine the kind of segment change
- if lw != nil && index == len(selections)-1 {
- // we have a link segment change (see start of this function):
- // format the previous selection segment, write the
- // link tag and start a new selection segment
- segment(offs)
- flush()
- lastOffs = offs
- lw(w, offs, start)
- } else {
- // we have a selection change:
- // format the previous selection segment, determine
- // the new selection bitset and start a new segment
- segment(offs)
- lastOffs = offs
- mask := 1 << uint(index)
- if start {
- bitset |= mask
- } else {
- bitset &^= mask
- }
- }
- }
- segment(len(text))
- flush()
-}
-
-// A merger merges a slice of Selections and produces a sequence of
-// consecutive segment change events through repeated next() calls.
-//
-type merger struct {
- selections []Selection
- segments []Segment // segments[i] is the next segment of selections[i]
-}
-
-const infinity int = 2e9
-
-func newMerger(selections []Selection) *merger {
- segments := make([]Segment, len(selections))
- for i, sel := range selections {
- segments[i] = Segment{infinity, infinity}
- if sel != nil {
- if seg := sel(); !seg.isEmpty() {
- segments[i] = seg
- }
- }
- }
- return &merger{selections, segments}
-}
-
-// next returns the next segment change: index specifies the Selection
-// to which the segment belongs, offs is the segment start or end offset
-// as determined by the start value. If there are no more segment changes,
-// next returns an index value < 0.
-//
-func (m *merger) next() (index, offs int, start bool) {
- // find the next smallest offset where a segment starts or ends
- offs = infinity
- index = -1
- for i, seg := range m.segments {
- switch {
- case seg.start < offs:
- offs = seg.start
- index = i
- start = true
- case seg.end < offs:
- offs = seg.end
- index = i
- start = false
- }
- }
- if index < 0 {
- // no offset found => all selections merged
- return
- }
- // offset found - it's either the start or end offset but
- // either way it is ok to consume the start offset: set it
- // to infinity so it won't be considered in the following
- // next call
- m.segments[index].start = infinity
- if start {
- return
- }
- // end offset found - consume it
- m.segments[index].end = infinity
- // advance to the next segment for that selection
- seg := m.selections[index]()
- if !seg.isEmpty() {
- m.segments[index] = seg
- }
- return
-}
-
-// ----------------------------------------------------------------------------
-// Implementation of FormatText
-
-// lineSelection returns the line segments for text as a Selection.
-func lineSelection(text []byte) Selection {
- i, j := 0, 0
- return func() (seg Segment) {
- // find next newline, if any
- for j < len(text) {
- j++
- if text[j-1] == '\n' {
- break
- }
- }
- if i < j {
- // text[i:j] constitutes a line
- seg = Segment{i, j}
- i = j
- }
- return
- }
-}
-
-// tokenSelection returns, as a selection, the sequence of
-// consecutive occurrences of token sel in the Go src text.
-//
-func tokenSelection(src []byte, sel token.Token) Selection {
- var s scanner.Scanner
- fset := token.NewFileSet()
- file := fset.AddFile("", fset.Base(), len(src))
- s.Init(file, src, nil, scanner.ScanComments)
- return func() (seg Segment) {
- for {
- pos, tok, lit := s.Scan()
- if tok == token.EOF {
- break
- }
- offs := file.Offset(pos)
- if tok == sel {
- seg = Segment{offs, offs + len(lit)}
- break
- }
- }
- return
- }
-}
-
-// makeSelection is a helper function to make a Selection from a slice of pairs.
-// Pairs describing empty segments are ignored.
-//
-func makeSelection(matches [][]int) Selection {
- i := 0
- return func() Segment {
- for i < len(matches) {
- m := matches[i]
- i++
- if m[0] < m[1] {
- // non-empty segment
- return Segment{m[0], m[1]}
- }
- }
- return Segment{}
- }
-}
-
-// regexpSelection computes the Selection for the regular expression expr in text.
-func regexpSelection(text []byte, expr string) Selection {
- var matches [][]int
- if rx, err := regexp.Compile(expr); err == nil {
- matches = rx.FindAllIndex(text, -1)
- }
- return makeSelection(matches)
-}
-
-var selRx = regexp.MustCompile(`^([0-9]+):([0-9]+)`)
-
-// RangeSelection computes the Selection for a text range described
-// by the argument str; the range description must match the selRx
-// regular expression.
-func RangeSelection(str string) Selection {
- m := selRx.FindStringSubmatch(str)
- if len(m) >= 2 {
- from, _ := strconv.Atoi(m[1])
- to, _ := strconv.Atoi(m[2])
- if from < to {
- return makeSelection([][]int{{from, to}})
- }
- }
- return nil
-}
-
-// Span tags for all the possible selection combinations that may
-// be generated by FormatText. Selections are indicated by a bitset,
-// and the value of the bitset specifies the tag to be used.
-//
-// bit 0: comments
-// bit 1: highlights
-// bit 2: selections
-//
-var startTags = [][]byte{
- /* 000 */ []byte(``),
- /* 001 */ []byte(`