[^\\/\\\\\r\n]++)$/m', $lines[0], $info)) {
22 | $app['monolog']->warning('Invalid symbol file: ' . $lines[0]);
23 | $app['redis']->hIncrBy('throttle:stats', 'symbols:rejected:invalid', 1);
24 |
25 | return new \Symfony\Component\HttpFoundation\Response('Invalid symbol file', 400);
26 | }
27 |
28 | if ($info['operatingsystem'] === 'Linux') {
29 | $functions = 0;
30 |
31 | foreach ($lines as $line) {
32 | list($type) = explode(' ', $line, 2);
33 |
34 | if ($type === 'STACK') {
35 | break;
36 | }
37 |
38 | if ($type === 'FUNC') {
39 | $functions++;
40 | }
41 | }
42 |
43 | if ($functions === 0) {
44 | $app['redis']->hIncrBy('throttle:stats', 'symbols:rejected:no-functions', 1);
45 | return new \Symfony\Component\HttpFoundation\Response('Symbol file had no FUNC records, please update to Accelerator 2.4.3 or later', 400);
46 | }
47 | }
48 |
49 | $path = $app['root'] . '/symbols/public/' . $info['name'] . '/' . $info['id'];
50 |
51 | \Filesystem::createDirectory($path, 0755, true);
52 |
53 | $file = $info['name'];
54 | if (pathinfo($file, PATHINFO_EXTENSION) == 'pdb') {
55 | $file = substr($file, 0, -4);
56 | }
57 |
58 | \Filesystem::writeFile($path . '/' . $file . '.sym.gz', gzencode($data));
59 |
60 | $app['redis']->hIncrBy('throttle:stats', 'symbols:accepted', 1);
61 |
62 | return $app['twig']->render('submit-symbols.txt.twig', array(
63 | 'module' => $info,
64 | ));
65 | }
66 | }
67 |
68 |
--------------------------------------------------------------------------------
/symbols/public/.gitignore:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/asherkin/throttle/f150edb423ce2f805b7c20d21dcc6887b9128cd1/symbols/public/.gitignore
--------------------------------------------------------------------------------
/views/carburetor.html.twig:
--------------------------------------------------------------------------------
1 | {% extends 'layout.html.twig' %}
2 |
3 | {% set logout_to_index = true %}
4 | {% set supports_mobile = true %}
5 |
6 | {% block content %}
7 |
11 |
12 |
24 | {% endblock %}
25 |
26 | {% block scripts %}
27 |
28 |
29 |
98 | {% endblock %}
99 |
100 |
--------------------------------------------------------------------------------
/views/console.html.twig:
--------------------------------------------------------------------------------
1 | {% extends 'layout.html.twig' %}
2 |
3 | {% set logout_to_index = true %}
4 | {% set supports_mobile = true %}
5 |
6 | {% block content %}
7 |
10 |
11 |
12 | {% for line in console %}
13 |
14 | {{ line[1]|trim }}
15 | {{ line[2]|trim }}
16 | {{ line[3]|trim }}
17 |
18 | {% else %}
19 |
20 | Console output is unavailable for this crash.
21 |
22 | {% endfor %}
23 |
24 |
25 | {% endblock %}
26 |
27 |
--------------------------------------------------------------------------------
/views/dashboard.html.twig:
--------------------------------------------------------------------------------
1 | {% extends 'layout.html.twig' %}
2 |
3 | {% set logout_to_index = true %}
4 |
5 | {% block content %}
6 | {% if shared|length > 1 or app.user.admin %}
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 | {% for user in shared %}
15 |
16 |
17 |
18 |
19 |
20 | {% endfor %}
21 |
22 |
23 | {% endif %}
24 |
25 |
26 |
27 |
28 |
29 | Crash ID
30 | Uploaded
31 |
32 | Function
33 |
34 |
35 |
36 |
37 | {% set last = null %}
38 | {% for crash in crashes %}
39 | {% set last = crash.timestamp %}
40 |
41 |
42 | {% if crash.cmdline %}
43 |
44 | {% endif %}
45 |
46 | {{ crash.id|crashid }}
47 | {{ crash.timestamp|diffdate }}
48 | {% spaceless %}
49 |
50 | {% if userid == null and (shared|length > 1 or app.user.admin) and crash.owner and crash.name %}
51 |
52 |
53 |
54 | {% endif %}
55 |
56 | {% endspaceless %}
57 | {% if crash.module is not empty or crash.module2 is empty %}
58 | {% set frame = {rendered: crash.rendered, first: true} %}
59 | {% else %}
60 | {% set frame = {rendered: crash.rendered2, first: false} %}
61 | {% endif %}
62 |
63 | {{ frame.rendered }}
64 |
65 | {% spaceless %}
66 |
67 | {% if crash.notice is not empty %}
68 | {% set notice = crash.notice | split('-', 2) %}
69 | {{ (notice[0] != 1 ? notice[0] : ' ') | raw }}
70 | {% endif %}
71 | {% if app.user.admin %}
72 | {% if crash.processed == 1 %}
73 |
76 | {% endif %}
77 |
80 | {% endif %}
81 |
82 | {% endspaceless %}
83 |
84 | {% else %}
85 |
86 | No Crashes
87 |
88 | {% endfor %}
89 |
90 |
91 |
92 |
93 |
101 |
102 |
103 |
104 |
105 |
106 | {% endblock %}
107 |
108 |
--------------------------------------------------------------------------------
/views/details.html.twig:
--------------------------------------------------------------------------------
1 | {% extends 'layout.html.twig' %}
2 |
3 | {% set supports_mobile = true %}
4 |
5 | {% block content %}
6 | {% if not crash.owner %}
7 | {% if app.config.accelerator %}
8 | This crash was submitted anonymously. If you are the owner, please configure Accelerator with your Steam ID.
9 | {% endif %}
10 | {% else %}
11 | {% if not app.user %}
12 | If you are the owner of this crash,
login to see more information.
13 | {% elseif not can_manage %}
14 | You can not see full information about this crash as you are not the owner.
15 | {% endif %}
16 | {% endif %}
17 |
18 |
19 |
20 | Uploaded
21 | {{ crash.timestamp|date }}
22 | {% if can_manage %}
23 | {% if crash.ip %}
24 | Upload IP
25 | {{ crash.ip }}
26 | {% endif %}
27 | {% if can_manage and crash.owner and crash.owner != app.user.id %}
28 | Owner
29 | {{ crash.name ?? crash.owner }}
30 | {% endif %}
31 | {% if crash.cmdline %}
32 | Command Line
33 | {{ crash.cmdline }}
34 | {% endif %}
35 | {% for key, value in crash.metadata %}
36 | {{ key|format_metadata_key }}
37 | {% if value %}
38 | {{ value }}
39 | {% else %}
40 |
41 | {% endif %}
42 | {% endfor %}
43 | {% endif %}
44 |
45 | {% if app.feature.subscriptions %}
46 |
Supporter
47 | {% endif %}
48 |
49 |
50 | {% if crash.processed == 0 %}
51 | This crash is pending processing, try again later.
52 | {% elseif crash.failed == 1 %}
53 | An error occurred while processing this crash.
54 | {% endif %}
55 |
56 | {%if outdated %}
57 |
58 | {% endif %}
59 |
60 | {% if crash.processed == 1 and crash.failed == 0 %}
61 | {% for notice in notices %}
62 | {{ notice.text|raw }}
63 | {% endfor %}
64 |
65 | {%if show_sourcepawn_message %}
66 | Update to SourceMod 1.10.0.6431 or later for improved SourcePawn stack traces. This crash is from a server running a version of SourceMod that does not fully support SourcePawn stack walking and the stack trace displayed may be incomplete or incorrect.
67 | {% endif %}
68 |
69 | {% if crash.thread != 0 %}
70 | This crash is not from the main thread. The stack trace displayed below is of the thread that crashed.
71 | {% endif %}
72 |
73 | {% if has_error_string and can_manage %}
74 |
75 | {% endif %}
76 |
77 | {% if modules|length == 0 %}
78 | This crash is missing a module list and will not have symbol information.
79 | {% endif %}
80 |
81 |
88 | {% endif %}
89 |
90 | {% if can_manage %}
91 |
109 | {% endif %}
110 |
111 | {% if crash.processed == 1 and crash.failed == 0 %}
112 | Stack Trace
113 |
114 |
115 |
116 |
117 |
118 | Function
119 |
120 |
121 |
122 | {% for frame in stack %}
123 |
124 | {{ frame.frame }}
125 |
126 | {{ frame.rendered }}
127 | {% if frame.url %}
128 |
129 | {% endif %}
130 | {% if '__SourceHook_' in frame.rendered %}
131 |
132 | {% endif %}
133 |
134 |
135 | {% endfor %}
136 |
137 |
138 |
139 |
140 |
141 |
142 |
143 |
144 |
145 | {% if modules|length > 0 and can_manage %}
146 | Modules
147 |
148 |
149 |
150 |
151 | Name
152 | Identifier
153 | Base
154 |
155 |
156 |
157 | {% for module in modules %}
158 | {% set class = ((module.identifier == '000000000000000000000000000000000') ? 'info' : (module.processed ? '' : (module.present ? 'warning' : 'danger'))) %}
159 |
160 | {{ module.name }}
161 | {{ module.identifier }}
162 | {{ module.base|address }}
163 |
164 | {% endfor %}
165 |
166 |
167 |
168 |
169 |
170 |
171 |
172 |
173 | {% endif %}
174 | {% endif %}
175 |
176 |
177 |
178 |
179 |
If you are copying the stack trace to share, please link this page instead.
180 |
Having the full report makes it a lot easier to help you, and only non-sensitive information is visible publicly.
181 |
You can verify this yourself by logging out or using an Incognito / Private Browsing window.
182 |
OK
183 |
184 |
185 |
186 |
187 | {% endblock %}
188 |
189 | {% block scripts %}
190 |
191 |
225 | {% endblock %}
226 |
227 |
--------------------------------------------------------------------------------
/views/error.html.twig:
--------------------------------------------------------------------------------
1 | {% extends 'layout.html.twig' %}
2 |
3 | {% block content %}
4 |
5 |
6 | {{ title }}
7 | {{ comment | nl2br }}
8 |
9 | {% endblock %}
10 |
11 |
--------------------------------------------------------------------------------
/views/index.html.twig:
--------------------------------------------------------------------------------
1 | {% extends 'layout.html.twig' %}
2 |
3 | {% set supports_mobile = true %}
4 |
5 | {% block content %}
6 | {% if maintenance_message is not empty %}
7 |
8 |
9 |
{{ maintenance_message|raw }}
10 |
11 |
12 | {% endif %}
13 |
14 |
15 |
Crash reports received to date
16 |
17 |
18 |
Last 24 hours (5m average)
19 |
20 |
21 |
22 |
23 |
24 | {% for error in app.session.flashbag.get('error_crash') %}
25 |
{{ error }}
26 | {% endfor %}
27 |
36 |
OR
37 | {% if app.user %}
38 |
View Dashboard
39 | {% else %}
40 |
Login
41 | {% endif %}
42 |
43 |
44 |
45 | {% endblock %}
46 |
47 | {% block scripts %}
48 | {% include 'stat-counter.stub.twig' %}
49 |
55 | {% endblock %}
56 |
--------------------------------------------------------------------------------
/views/invite.html.twig:
--------------------------------------------------------------------------------
1 | {% extends 'layout.html.twig' %}
2 |
3 | {% set logout_to_index = true %}
4 | {% set supports_mobile = true %}
5 |
6 | {% block content %}
7 |
8 |
9 |
12 |
13 |
14 |
Granting access to your crash reports using this form will give full permissions to the other person to interact with them as you do.
15 |
This includes downloading the raw minidump and viewing the full command line options.
16 |
If you just want to share the stack trace and other limited public information with someone, just link them to the crash report page rather than adding them here.
17 |
18 | {% for error in app.session.flashbag.get('error_share_invite') %}
19 |
{{ error }}
20 | {% endfor %}
21 |
30 |
31 |
32 |
33 | {% endblock %}
34 |
35 |
--------------------------------------------------------------------------------
/views/layout.html.twig:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | {% if supports_mobile|default(false) %}
7 |
8 | {% endif %}
9 | Throttle
10 |
11 |
12 | {% block stylesheets %}{% endblock %}
13 |
14 | {% if 'Kindle/3.0' in app.request.headers.get('User-Agent') %}
15 |
16 | {% endif %}
17 |
18 |
19 |
20 |
21 |
Throttle
22 |
23 | {% if app.user %}
24 |
52 | {% else %}
53 |
Login
54 | {% endif %}
55 |
56 |
57 |
58 |
59 | {% for error in app.session.flashbag.get('error_auth') %}
60 |
{{ error }}
61 | {% endfor %}
62 | {% block content %}{% endblock %}
63 |
64 |
67 |
68 |
69 |
74 | {% block scripts %}{% endblock %}
75 |
76 |
77 |
78 |
--------------------------------------------------------------------------------
/views/logs.html.twig:
--------------------------------------------------------------------------------
1 | {% extends 'layout.html.twig' %}
2 |
3 | {% set logout_to_index = true %}
4 | {% set supports_mobile = true %}
5 |
6 | {% block content %}
7 |
10 | {% if logs is not empty %}
11 |
12 | {% else %}
13 | Logs are unavailable for this crash.
14 | {% endif %}
15 | {% endblock %}
16 |
17 |
--------------------------------------------------------------------------------
/views/share.html.twig:
--------------------------------------------------------------------------------
1 | {% extends 'layout.html.twig' %}
2 |
3 | {% set logout_to_index = true %}
4 | {% set supports_mobile = true %}
5 |
6 | {% block content %}
7 |
8 |
9 |
Sharing With Others
10 |
11 |
12 |
13 |
14 |
15 | User
16 |
17 | {#
18 | Invite
19 | #}
20 |
21 |
22 |
23 |
24 | {% for user in sharing %}
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 | {{ user.name ?? user.id }}
33 |
34 |
35 | {% if user.accepted == null %}
36 | Pending
37 | {% else %}
38 | {{ user.accepted|date('Y-m-d') }}
39 | {% endif %}
40 |
43 |
44 |
45 | {% else %}
46 |
47 | You aren't sharing with anybody
48 |
49 | {% endfor %}
50 |
51 |
52 |
53 |
54 | Invite
55 |
56 |
57 |
58 |
59 |
60 |
61 |
Shared With You
62 |
63 |
64 |
65 |
66 |
67 | User
68 |
69 |
70 |
71 |
72 | {% for user in shared %}
73 |
74 |
75 |
76 |
77 |
78 |
79 |
80 | {{ user.name ?? user.id }}
81 |
82 |
83 | {% if user.accepted == null %}
84 |
87 | {% else %}
88 | {{ user.accepted|date('Y-m-d') }}
89 | {% endif %}
90 |
93 |
94 |
95 | {% else %}
96 |
97 | Nobody is sharing with you
98 |
99 | {% endfor %}
100 |
101 |
102 |
103 |
104 |
105 | {% endblock %}
106 |
107 |
--------------------------------------------------------------------------------
/views/stat-counter.stub.twig:
--------------------------------------------------------------------------------
1 |
51 |
--------------------------------------------------------------------------------
/views/stats.html.twig:
--------------------------------------------------------------------------------
1 | {% extends 'layout.html.twig' %}
2 |
3 | {% block content %}
4 | {% if module %}
5 |
6 |
7 | {% if function %}
8 | Stats
9 | {{ module }}
10 | {{ function }}
11 | {% else %}
12 | Stats
13 | {{ module }}
14 | {% endif %}
15 |
16 |
17 | {% else %}
18 |
19 |
20 |
Unique servers last 24 hours
21 |
22 |
23 |
Crash reports received to date
24 |
25 |
26 |
Last 24 hours (5m average)
27 |
28 |
29 | {% endif %}
30 | Crash Reports / Hour{% if module %} Historical data may be inaccurate due to active filter {% endif %}
31 |
38 | Crash Reports / Day{% if module %} Historical data may be inaccurate due to active filter {% endif %}
39 |
46 |
47 | Top Crashers
48 |
49 | Day
50 | Week
51 | Month
52 | All
53 |
54 |
55 |
56 |
57 | Function
58 |
59 |
60 |
61 |
62 |
63 |
64 |
65 |
66 |
67 | Latest Crash Reports
68 |
69 |
70 | Function
71 |
72 |
73 |
74 |
75 |
76 |
77 |
78 |
79 |
80 | {% if not module %}
81 | Processing Performance
82 |
83 |
84 |
85 |
86 |
87 |
88 |
89 |
90 |
91 |
92 | {% endif %}
93 | {% endblock %}
94 |
95 | {% block scripts %}
96 | {% include 'stat-counter.stub.twig' %}
97 |
98 |
99 |
302 | {% endblock %}
303 |
304 |
--------------------------------------------------------------------------------
/views/submit-empty.txt.twig:
--------------------------------------------------------------------------------
1 | A problem with your host is preventing crash reports from being generated.
2 |
--------------------------------------------------------------------------------
/views/submit-nosteam.txt.twig:
--------------------------------------------------------------------------------
1 | Servers that support piracy are not welcome.
--------------------------------------------------------------------------------
/views/submit-reject.txt.twig:
--------------------------------------------------------------------------------
1 | Rate limit exceeded.
--------------------------------------------------------------------------------
/views/submit-symbols.txt.twig:
--------------------------------------------------------------------------------
1 | Stored symbols for {{ module.name }}/{{ module.id }}/{{ module.operatingsystem }}/{{ module.architecture }}
2 |
--------------------------------------------------------------------------------
/views/submit.txt.twig:
--------------------------------------------------------------------------------
1 | Crash ID: {{ id|crashid }}
--------------------------------------------------------------------------------
/views/subscribe.html.twig:
--------------------------------------------------------------------------------
1 | {% extends 'layout.html.twig' %}
2 |
3 | {% set logout_to_index = true %}
4 | {% set supports_mobile = true %}
5 |
6 | {% block stylesheets %}
7 |
8 | {% endblock %}
9 |
10 | {% block content %}
11 | {% set supporter_count = 1 %}
12 | {% set supporter_total = 20 %}
13 |
14 |
15 |
16 | {{ supporter_count|number_format(0) }} supporter{% if supporter_count == 1 %} is{% else %}s are {% endif %} contributing
17 | ${{ supporter_total|number_format(2) }} per month
18 |
19 |
Money raised by Throttle Supporters goes towards hosting and developing this service. Your status as a Throttle Supporter will be publicly displayed on all crash dumps associated with your Steam ID.
20 |
21 |
22 |
23 |
24 |
25 |
42 |
43 |
44 |
45 | - %
46 |
47 |
Tax that goes to your government.
48 |
49 |
50 |
51 | - %
52 |
53 |
Fees for the payment processor.
54 |
55 |
56 |
57 | + %
58 |
59 |
Percentage that goes to support Throttle!
60 |
61 |
62 |
Subscribe
63 |
64 |
65 |
66 |
67 |
68 | Subscription can be cancelled at any time, and access to any subscription-specific functionality will remain until end of the current billing period. If you wish to make a one-off contribution, please subscribe for the amount of your choosing and then cancel once the first payment is confirmed. If anything goes wrong, I'm here to help.
69 |
70 |
71 | {% endblock %}
72 |
73 | {% block scripts %}
74 |
75 |
76 |
229 | {% endblock %}
230 |
231 |
--------------------------------------------------------------------------------
/views/view.html.twig:
--------------------------------------------------------------------------------
1 | {% extends 'layout.html.twig' %}
2 |
3 | {% set logout_to_index = true %}
4 | {% set supports_mobile = true %}
5 |
6 | {% block content %}
7 |
11 |
14 | {% endblock %}
15 |
16 | {% block scripts %}
17 |
18 |
19 | {% endblock %}
20 |
21 |
--------------------------------------------------------------------------------
/web/css/bootstrap-slider.min.css:
--------------------------------------------------------------------------------
1 | /*! =======================================================
2 | VERSION 9.9.0
3 | ========================================================= */
4 | /*! =========================================================
5 | * bootstrap-slider.js
6 | *
7 | * Maintainers:
8 | * Kyle Kemp
9 | * - Twitter: @seiyria
10 | * - Github: seiyria
11 | * Rohit Kalkur
12 | * - Twitter: @Rovolutionary
13 | * - Github: rovolution
14 | *
15 | * =========================================================
16 | *
17 | * bootstrap-slider is released under the MIT License
18 | * Copyright (c) 2017 Kyle Kemp, Rohit Kalkur, and contributors
19 | *
20 | * Permission is hereby granted, free of charge, to any person
21 | * obtaining a copy of this software and associated documentation
22 | * files (the "Software"), to deal in the Software without
23 | * restriction, including without limitation the rights to use,
24 | * copy, modify, merge, publish, distribute, sublicense, and/or sell
25 | * copies of the Software, and to permit persons to whom the
26 | * Software is furnished to do so, subject to the following
27 | * conditions:
28 | *
29 | * The above copyright notice and this permission notice shall be
30 | * included in all copies or substantial portions of the Software.
31 | *
32 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
33 | * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
34 | * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
35 | * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
36 | * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
37 | * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
38 | * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
39 | * OTHER DEALINGS IN THE SOFTWARE.
40 | *
41 | * ========================================================= */.slider{display:inline-block;vertical-align:middle;position:relative}.slider.slider-horizontal{width:210px;height:20px}.slider.slider-horizontal .slider-track{height:10px;width:100%;margin-top:-5px;top:50%;left:0}.slider.slider-horizontal .slider-selection,.slider.slider-horizontal .slider-track-low,.slider.slider-horizontal .slider-track-high{height:100%;top:0;bottom:0}.slider.slider-horizontal .slider-tick,.slider.slider-horizontal .slider-handle{margin-left:-10px}.slider.slider-horizontal .slider-tick.triangle,.slider.slider-horizontal .slider-handle.triangle{position:relative;top:50%;transform:translateY(-50%);border-width:0 10px 10px 10px;width:0;height:0;border-bottom-color:#2e6da4;margin-top:0}.slider.slider-horizontal .slider-tick-container{white-space:nowrap;position:absolute;top:0;left:0;width:100%}.slider.slider-horizontal .slider-tick-label-container{white-space:nowrap;margin-top:20px}.slider.slider-horizontal .slider-tick-label-container .slider-tick-label{padding-top:4px;display:inline-block;text-align:center}.slider.slider-horizontal.slider-rtl .slider-track{left:initial;right:0}.slider.slider-horizontal.slider-rtl .slider-tick,.slider.slider-horizontal.slider-rtl .slider-handle{margin-left:initial;margin-right:-10px}.slider.slider-horizontal.slider-rtl .slider-tick-container{left:initial;right:0}.slider.slider-vertical{height:210px;width:20px}.slider.slider-vertical .slider-track{width:10px;height:100%;left:25%;top:0}.slider.slider-vertical .slider-selection{width:100%;left:0;top:0;bottom:0}.slider.slider-vertical .slider-track-low,.slider.slider-vertical .slider-track-high{width:100%;left:0;right:0}.slider.slider-vertical .slider-tick,.slider.slider-vertical .slider-handle{margin-top:-10px}.slider.slider-vertical .slider-tick.triangle,.slider.slider-vertical .slider-handle.triangle{border-width:10px 0 10px 10px;width:1px;height:1px;border-left-color:#2e6da4;border-right-color:#2e6da4;margin-left:0;margin-right:0}.slider.slider-vertical .slider-tick-label-container{white-space:nowrap}.slider.slider-vertical .slider-tick-label-container .slider-tick-label{padding-left:4px}.slider.slider-vertical.slider-rtl .slider-track{left:initial;right:25%}.slider.slider-vertical.slider-rtl .slider-selection{left:initial;right:0}.slider.slider-vertical.slider-rtl .slider-tick.triangle,.slider.slider-vertical.slider-rtl .slider-handle.triangle{border-width:10px 10px 10px 0}.slider.slider-vertical.slider-rtl .slider-tick-label-container .slider-tick-label{padding-left:initial;padding-right:4px}.slider.slider-disabled .slider-handle{background-image:-webkit-linear-gradient(top,#dfdfdf 0,#bebebe 100%);background-image:-o-linear-gradient(top,#dfdfdf 0,#bebebe 100%);background-image:linear-gradient(to bottom,#dfdfdf 0,#bebebe 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdfdfdf',endColorstr='#ffbebebe',GradientType=0)}.slider.slider-disabled .slider-track{background-image:-webkit-linear-gradient(top,#e5e5e5 0,#e9e9e9 100%);background-image:-o-linear-gradient(top,#e5e5e5 0,#e9e9e9 100%);background-image:linear-gradient(to bottom,#e5e5e5 0,#e9e9e9 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe5e5e5',endColorstr='#ffe9e9e9',GradientType=0);cursor:not-allowed}.slider input{display:none}.slider .tooltip.top{margin-top:-36px}.slider .tooltip-inner{white-space:nowrap;max-width:none}.slider .hide{display:none}.slider-track{position:absolute;cursor:pointer;background-image:-webkit-linear-gradient(top,#f5f5f5 0,#f9f9f9 100%);background-image:-o-linear-gradient(top,#f5f5f5 0,#f9f9f9 100%);background-image:linear-gradient(to bottom,#f5f5f5 0,#f9f9f9 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5',endColorstr='#fff9f9f9',GradientType=0);-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);border-radius:4px}.slider-selection{position:absolute;background-image:-webkit-linear-gradient(top,#f9f9f9 0,#f5f5f5 100%);background-image:-o-linear-gradient(top,#f9f9f9 0,#f5f5f5 100%);background-image:linear-gradient(to bottom,#f9f9f9 0,#f5f5f5 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff9f9f9',endColorstr='#fff5f5f5',GradientType=0);-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;border-radius:4px}.slider-selection.tick-slider-selection{background-image:-webkit-linear-gradient(top,#8ac1ef 0,#82b3de 100%);background-image:-o-linear-gradient(top,#8ac1ef 0,#82b3de 100%);background-image:linear-gradient(to bottom,#8ac1ef 0,#82b3de 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff8ac1ef',endColorstr='#ff82b3de',GradientType=0)}.slider-track-low,.slider-track-high{position:absolute;background:transparent;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;border-radius:4px}.slider-handle{position:absolute;top:0;width:20px;height:20px;background-color:#337ab7;background-image:-webkit-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:linear-gradient(to bottom,#337ab7 0,#2e6da4 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7',endColorstr='#ff2e6da4',GradientType=0);filter:none;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.2),0 1px 2px rgba(0,0,0,.05);box-shadow:inset 0 1px 0 rgba(255,255,255,.2),0 1px 2px rgba(0,0,0,.05);border:0 solid transparent}.slider-handle.round{border-radius:50%}.slider-handle.triangle{background:transparent none}.slider-handle.custom{background:transparent none}.slider-handle.custom::before{line-height:20px;font-size:20px;content:'\2605';color:#726204}.slider-tick{position:absolute;width:20px;height:20px;background-image:-webkit-linear-gradient(top,#f9f9f9 0,#f5f5f5 100%);background-image:-o-linear-gradient(top,#f9f9f9 0,#f5f5f5 100%);background-image:linear-gradient(to bottom,#f9f9f9 0,#f5f5f5 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff9f9f9',endColorstr='#fff5f5f5',GradientType=0);-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;filter:none;opacity:.8;border:0 solid transparent}.slider-tick.round{border-radius:50%}.slider-tick.triangle{background:transparent none}.slider-tick.custom{background:transparent none}.slider-tick.custom::before{line-height:20px;font-size:20px;content:'\2605';color:#726204}.slider-tick.in-selection{background-image:-webkit-linear-gradient(top,#8ac1ef 0,#82b3de 100%);background-image:-o-linear-gradient(top,#8ac1ef 0,#82b3de 100%);background-image:linear-gradient(to bottom,#8ac1ef 0,#82b3de 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff8ac1ef',endColorstr='#ff82b3de',GradientType=0);opacity:1}
--------------------------------------------------------------------------------
/web/css/kindle.css:
--------------------------------------------------------------------------------
1 | * {
2 | color: black !important;
3 | background-color: transparent !important;
4 | }
5 |
6 | .icon-spin {
7 | -moz-animation: none;
8 | -o-animation: none;
9 | -webkit-animation: none;
10 | animation: none;
11 | }
12 |
13 | .highcharts-series rect {
14 | fill: black;
15 | }
16 |
--------------------------------------------------------------------------------
/web/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/asherkin/throttle/f150edb423ce2f805b7c20d21dcc6887b9128cd1/web/favicon.ico
--------------------------------------------------------------------------------
/web/font/fontawesome-webfont.eot:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/asherkin/throttle/f150edb423ce2f805b7c20d21dcc6887b9128cd1/web/font/fontawesome-webfont.eot
--------------------------------------------------------------------------------
/web/font/fontawesome-webfont.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/asherkin/throttle/f150edb423ce2f805b7c20d21dcc6887b9128cd1/web/font/fontawesome-webfont.ttf
--------------------------------------------------------------------------------
/web/font/fontawesome-webfont.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/asherkin/throttle/f150edb423ce2f805b7c20d21dcc6887b9128cd1/web/font/fontawesome-webfont.woff
--------------------------------------------------------------------------------
/web/js/carburetor-analyze.js:
--------------------------------------------------------------------------------
1 | 'use strict';
2 |
3 | if (!String.prototype.padStart) {
4 | String.prototype.padStart = function padStart(targetLength,padString) {
5 | targetLength = targetLength>>0; //floor if number or convert non-number to 0;
6 | padString = String(padString || ' ');
7 | if (this.length > targetLength) {
8 | return String(this);
9 | }
10 | else {
11 | targetLength = targetLength-this.length;
12 | if (targetLength > padString.length) {
13 | padString += padString.repeat(targetLength/padString.length); //append to original to ensure we are longer than needed
14 | }
15 | return padString.slice(0,targetLength) + String(this);
16 | }
17 | };
18 | }
19 |
20 | if (!String.prototype.padEnd) {
21 | String.prototype.padEnd = function padEnd(targetLength,padString) {
22 | targetLength = targetLength>>0; //floor if number or convert non-number to 0;
23 | padString = String(padString || ' ');
24 | if (this.length > targetLength) {
25 | return String(this);
26 | }
27 | else {
28 | targetLength = targetLength-this.length;
29 | if (targetLength > padString.length) {
30 | padString += padString.repeat(targetLength/padString.length); //append to original to ensure we are longer than needed
31 | }
32 | return String(this) + padString.slice(0,targetLength);
33 | }
34 | };
35 | }
36 |
37 | const FRAME_TRUST = [
38 | 'unknown',
39 | 'stack scanning',
40 | 'call frame info with scanning',
41 | 'previous frame\'s frame pointer',
42 | 'call frame info',
43 | 'external stack walker',
44 | 'instruction pointer in context',
45 | ];
46 |
47 | function print_registers(indent, registers) {
48 | let order = [
49 | "eip", "esp", "ebp", "ebx",
50 | "esi", "edi", "eax", "ecx",
51 | "edx", "efl",
52 | "rax", "rdx", "rcx", "rbx",
53 | "rsi", "rdi", "rbp", "rsp",
54 | "r8", "r9", "r10", "r11",
55 | "r12", "r13", "r14",
56 | "r15", "rip",
57 | ];
58 |
59 | let source = order;
60 | let printed = {};
61 | let register_count = 0;
62 | let line = indent;
63 |
64 | for (let i = 0; i < 2; ++i) {
65 | for (let register in source) {
66 | if (i === 0) {
67 | register = order[register];
68 | }
69 |
70 | if (printed[register] || registers[register] === undefined) {
71 | continue;
72 | }
73 |
74 | line += register + ': 0x' + registers[register].toString(16).padStart(8, '0');
75 |
76 | register_count++;
77 |
78 | if (register_count < 4) {
79 | line += ' ';
80 | } else {
81 | console.log(line);
82 |
83 | register_count = 0;
84 | line = indent;
85 | }
86 |
87 | printed[register] = true;
88 | }
89 |
90 | source = registers;
91 | }
92 |
93 | if (register_count > 0) {
94 | console.log(line);
95 | }
96 | }
97 |
98 | function print_stack(indent, base, memory) {
99 | const kAddressBytes = 4;
100 | const kHeader = false;
101 | const kRowBytes = 16;
102 | const kChunkBytes = 8;
103 | const kChunkText = false;
104 |
105 | if (kHeader) {
106 | let line = indent + ' '.repeat(kAddressBytes * 2) + ' ';
107 | let string = '';
108 | for (let i = 0; i < kRowBytes; ++i) {
109 | line += i.toString(16).padStart(2, ' ') + ' ';
110 | string += ' ';
111 | //string += i.toString(16).padStart(2, ' ').substr(1, 1);
112 |
113 | if (kChunkBytes > 0 && i < (kRowBytes - 1) && (i % kChunkBytes) === (kChunkBytes - 1)) {
114 | line += ' ';
115 | if (kChunkText) {
116 | string += ' ';
117 | }
118 | }
119 | }
120 | line += ' ' + string + ' ';
121 | console.log(line);
122 | }
123 |
124 | for (let offset = 0; offset < memory.length;) {
125 | let line = indent + (base + offset).toString(16).padStart(kAddressBytes * 2, '0') + ' ';
126 |
127 | let string = '';
128 | for (let i = 0; i < kRowBytes; ++i, ++offset) {
129 | if (offset < memory.length) {
130 | line += memory[offset].toString(16).padStart(2, '0') + ' ';
131 |
132 | const character = String.fromCharCode(memory[offset]);
133 | string += (character.length === 1 && character.match(/^[ -~]$/)) ? character : '.';
134 | } else {
135 | line += ' ';
136 | string += ' ';
137 | }
138 |
139 | if (kChunkBytes > 0 && i < (kRowBytes - 1) && (i % kChunkBytes) === (kChunkBytes - 1)) {
140 | line += ' ';
141 |
142 | if (kChunkText) {
143 | string += ' ';
144 | }
145 | }
146 | }
147 |
148 | line += ' ' + string;
149 |
150 | console.log(line);
151 | }
152 | }
153 |
154 | function print_instructions(indent, ip, instructions) {
155 | let bytes_per_line = 0;
156 | let crash_opcode = -1;
157 |
158 | for (let i = 0; i < instructions.length; ++i) {
159 | if (ip >= instructions[i].offset && (i === (instructions.length - 1) || ip < instructions[i + 1].offset)) {
160 | crash_opcode = i;
161 | break;
162 | }
163 | }
164 |
165 | if (crash_opcode >= 0) {
166 | for (let i = 0; i < instructions.length; ++i) {
167 | if (i < (crash_opcode - 5)) {
168 | continue;
169 | }
170 |
171 | if (i > (crash_opcode + 5)) {
172 | break;
173 | }
174 |
175 | const bytes = instructions[i].hex.length / 2;
176 | if (bytes > bytes_per_line) {
177 | bytes_per_line = bytes;
178 | }
179 | }
180 | }
181 |
182 | for (let i = 0; i < instructions.length; ++i) {
183 | if (crash_opcode >= 0) {
184 | if (i < (crash_opcode - 5)) {
185 | continue;
186 | }
187 |
188 | if (i > (crash_opcode + 5)) {
189 | break;
190 | }
191 | }
192 |
193 | let line = indent;
194 |
195 | if (crash_opcode >= 0 && i === crash_opcode) {
196 | line = ' >' + line.substr(3);
197 | }
198 |
199 | line += instructions[i].offset.toString(16).padStart(8, '0');
200 | line += ' ';
201 | line += instructions[i].hex.match(/.{2}/g).join(' ').padEnd((bytes_per_line * 3) - 1, ' ');
202 | line += ' ';
203 | line += instructions[i].mnemonic;
204 |
205 | console.log(line);
206 | }
207 | }
208 |
209 | function print_thread(i, crashed, thread) {
210 | let title = 'Thread ' + i;
211 | if (crashed) {
212 | title += ' (crashed)';
213 | }
214 | title += ':';
215 |
216 | console.log(title);
217 |
218 | let num_frames = thread.length;
219 | /*if (num_frames > 10) {
220 | num_frames = 10;
221 | }*/
222 |
223 | for (let i = 0; i < num_frames; ++i) {
224 | const frame = thread[i];
225 |
226 | const prefix = i.toString().padStart((num_frames - 1).toString().length, ' ') + ': ';
227 | const indent = ' ' + ' '.repeat(prefix.length);
228 |
229 | console.log(' ' + prefix + frame.rendered);
230 |
231 | if (frame.url) {
232 | console.log(indent + frame.url);
233 | }
234 |
235 | if (frame.registers) {
236 | //console.log(indent + 'Registers');
237 | print_registers(indent, frame.registers);
238 | console.log('');
239 | }
240 |
241 | if (frame.instructions) {
242 | //console.log(indent + 'Disassembly');
243 | print_instructions(indent, frame.instruction, frame.instructions);
244 | console.log('');
245 | }
246 |
247 | if (frame.stack) {
248 | //console.log(indent + 'Stack Memory');
249 | print_stack(indent, frame.registers && frame.registers.esp, base64ToUint8Array(frame.stack));
250 | console.log('');
251 | }
252 |
253 | console.log(indent + 'Found via ' + (FRAME_TRUST[frame.trust] || FRAME_TRUST[0]));
254 | console.log('');
255 |
256 | console.log('');
257 | }
258 | }
259 |
260 | function base64ToUint8Array(base64) {
261 | var binary_string = window.atob(base64);
262 | var len = binary_string.length;
263 | var bytes = new Uint8Array( len );
264 | for (var i = 0; i < len; i++) {
265 | bytes[i] = binary_string.charCodeAt(i);
266 | }
267 | return bytes;
268 | }
269 |
270 | function analyze(data) {
271 | if (data.crashed) {
272 | console.log(data.crash_reason + ' accessing 0x' + data.crash_address.toString(16));
273 | console.log('');
274 | }
275 |
276 | if (typeof data.requesting_thread !== 'undefined' && data.requesting_thread >= 0) {
277 | const thread = data.threads[data.requesting_thread];
278 | print_thread(data.requesting_thread, true, thread);
279 | }
280 |
281 | for (let i = 0; i < data.threads.length; ++i) {
282 | if (i === data.requesting_thread) {
283 | continue;
284 | }
285 |
286 | const thread = data.threads[i];
287 | print_thread(i, false, thread);
288 | }
289 | }
290 |
--------------------------------------------------------------------------------
/web/js/carburetor-memory.js:
--------------------------------------------------------------------------------
1 | 'use strict';
2 |
3 | if (!String.prototype.padStart) {
4 | String.prototype.padStart = function padStart(targetLength,padString) {
5 | targetLength = targetLength>>0; //floor if number or convert non-number to 0;
6 | padString = String(padString || ' ');
7 | if (this.length > targetLength) {
8 | return String(this);
9 | }
10 | else {
11 | targetLength = targetLength-this.length;
12 | if (targetLength > padString.length) {
13 | padString += padString.repeat(targetLength/padString.length); //append to original to ensure we are longer than needed
14 | }
15 | return padString.slice(0,targetLength) + String(this);
16 | }
17 | };
18 | }
19 |
20 | if (!String.prototype.padEnd) {
21 | String.prototype.padEnd = function padEnd(targetLength,padString) {
22 | targetLength = targetLength>>0; //floor if number or convert non-number to 0;
23 | padString = String(padString || ' ');
24 | if (this.length > targetLength) {
25 | return String(this);
26 | }
27 | else {
28 | targetLength = targetLength-this.length;
29 | if (targetLength > padString.length) {
30 | padString += padString.repeat(targetLength/padString.length); //append to original to ensure we are longer than needed
31 | }
32 | return String(this) + padString.slice(0,targetLength);
33 | }
34 | };
35 | }
36 |
37 | function base64ToUint8Array(base64) {
38 | var binary_string = window.atob(base64);
39 | var len = binary_string.length;
40 | var bytes = new Uint8Array( len );
41 | for (var i = 0; i < len; i++) {
42 | bytes[i] = binary_string.charCodeAt(i);
43 | }
44 | return bytes;
45 | }
46 |
47 | function print_memory(region) {
48 | const base = region.base;
49 | const memory = base64ToUint8Array(region.data);
50 |
51 | if (memory.length !== region.size) {
52 | throw new Error('size mismatch');
53 | }
54 |
55 | const kAddressBytes = 4;
56 | const kHeader = false;
57 | const kRowBytes = 32;
58 | const kChunkBytes = 8;
59 | const kChunkText = false;
60 |
61 | if (kHeader) {
62 | let line = ' '.repeat(kAddressBytes * 2) + ' ';
63 | let string = '';
64 | for (let i = 0; i < kRowBytes; ++i) {
65 | line += i.toString(16).padStart(2, ' ') + ' ';
66 | string += ' ';
67 | //string += i.toString(16).padStart(2, ' ').substr(1, 1);
68 |
69 | if (kChunkBytes > 0 && i < (kRowBytes - 1) && (i % kChunkBytes) === (kChunkBytes - 1)) {
70 | line += ' ';
71 | if (kChunkText) {
72 | string += ' ';
73 | }
74 | }
75 | }
76 | line += ' ' + string + ' ';
77 | console.log(line);
78 | }
79 |
80 | for (let offset = 0; offset < memory.length;) {
81 | let line = (base + offset).toString(16).padStart(kAddressBytes * 2, '0') + ' ';
82 |
83 | let string = '';
84 | for (let i = 0; i < kRowBytes; ++i, ++offset) {
85 | if (offset < memory.length) {
86 | line += memory[offset].toString(16).padStart(2, '0') + ' ';
87 |
88 | const character = String.fromCharCode(memory[offset]);
89 | string += (character.length === 1 && character.match(/^[ -~]$/)) ? character : '.';
90 | } else {
91 | line += ' ';
92 | string += ' ';
93 | }
94 |
95 | if (kChunkBytes > 0 && i < (kRowBytes - 1) && (i % kChunkBytes) === (kChunkBytes - 1)) {
96 | line += ' ';
97 |
98 | if (kChunkText) {
99 | string += ' ';
100 | }
101 | }
102 | }
103 |
104 | line += ' ' + string;
105 |
106 | console.log(line);
107 | }
108 | }
109 |
110 | function memory(data) {
111 | const memory = data.memory;
112 | if (!memory) {
113 | console.log('No memory regions in input');
114 | throw e;
115 | }
116 |
117 | memory.sort((a, b) => (a.base - b.base));
118 |
119 | const start = memory[0].base;
120 | const end = memory[memory.length - 1].base + memory[memory.length - 1].size;
121 | const size = end - start;
122 | const real = memory.map((a) => a.size).reduce((a, b) => (a + b), 0);
123 |
124 | //console.log(start.toString(16), end.toString(16), size, real);
125 | console.log('Got ' + real + ' bytes of memory covering ' + start.toString(16).padStart(8, '0') + ' to ' + end.toString(16).padStart(8, '0') + ' (' + (real / size) + '% coverage)')
126 | console.log('');
127 |
128 | for (let i = 0; i < memory.length; ++i) {
129 | print_memory(memory[i]);
130 | console.log('');
131 | }
132 | }
133 |
--------------------------------------------------------------------------------
/web/js/highcharts.data.js:
--------------------------------------------------------------------------------
1 | /*
2 | Data plugin for Highcharts
3 |
4 | (c) 2012-2014 Torstein Honsi
5 |
6 | License: www.highcharts.com/license
7 | */
8 | (function(g){var j=g.each,q=HighchartsAdapter.inArray,s=g.splat,l,n=function(a,b){this.init(a,b)};g.extend(n.prototype,{init:function(a,b){this.options=a;this.chartOptions=b;this.columns=a.columns||this.rowsToColumns(a.rows)||[];this.rawColumns=[];this.columns.length?this.dataFound():(this.parseCSV(),this.parseTable(),this.parseGoogleSpreadsheet())},getColumnDistribution:function(){var a=this.chartOptions,b=this.options,c=[],f=function(a){return(g.seriesTypes[a||"line"].prototype.pointArrayMap||[0]).length},
9 | e=a&&a.chart&&a.chart.type,d=[],i=[],p,h;j(a&&a.series||[],function(a){d.push(f(a.type||e))});j(b&&b.seriesMapping||[],function(a){c.push(a.x||0)});c.length===0&&c.push(0);j(b&&b.seriesMapping||[],function(b){var c=new l,m,j=d[p]||f(e),o=g.seriesTypes[((a&&a.series||[])[p]||{}).type||e||"line"].prototype.pointArrayMap||["y"];c.addColumnReader(b.x,"x");for(m in b)b.hasOwnProperty(m)&&m!=="x"&&c.addColumnReader(b[m],m);for(h=0;h=e&&c<=d&&!t&&g!==""&&(g=b.split(h),j(g,function(a,b){b>=i&&b<=p&&(f[b-i]||(f[b-i]=[]),f[b-i][r]=a)}),r+=1)}),this.dataFound())},parseTable:function(){var a=this.options,b=a.table,c=this.columns,f=a.startRow||0,e=a.endRow||Number.MAX_VALUE,d=a.startColumn||0,i=a.endColumn||
12 | Number.MAX_VALUE;b&&(typeof b==="string"&&(b=document.getElementById(b)),j(b.getElementsByTagName("tr"),function(a,b){b>=f&&b<=e&&j(a.children,function(a,e){if((a.tagName==="TD"||a.tagName==="TH")&&e>=d&&e<=i)c[e-d]||(c[e-d]=[]),c[e-d][b-f]=a.innerHTML})}),this.dataFound())},parseGoogleSpreadsheet:function(){var a=this,b=this.options,c=b.googleSpreadsheetKey,f=this.columns,e=b.startRow||0,d=b.endRow||Number.MAX_VALUE,i=b.startColumn||0,g=b.endColumn||Number.MAX_VALUE,h,j;c&&jQuery.ajax({dataType:"json",
13 | url:"https://spreadsheets.google.com/feeds/cells/"+c+"/"+(b.googleSpreadsheetWorksheet||"od6")+"/public/values?alt=json-in-script&callback=?",error:b.error,success:function(b){var b=b.feed.entry,c,l=b.length,o=0,n=0,k;for(k=0;k=i&&k<=g)f[k-i]=[],f[k-i].length=Math.min(n,d-e);for(k=0;k=i&&j<=g&&h>=e&&h<=d)f[j-i][h-e]=c.content.$t;a.dataFound()}})},findHeaderRow:function(){var a=
14 | 0;j(this.columns,function(b){b.isNumeric&&typeof b[0]!=="string"&&(a=null)});this.headerRow=a},trim:function(a){return typeof a==="string"?a.replace(/^\s+|\s+$/g,""):a},parseTypes:function(){for(var a=this.columns,b=this.rawColumns,c=a.length,f,e,d,i,g,h,j=[],l,m=this.chartOptions;c--;){f=a[c].length;b[c]=[];for(l=(g=q(c,this.valueCount.xColumns)!==-1)&&m&&m.xAxis&&s(m.xAxis)[0].type==="category";f--;)if(e=j[f]||a[c][f],d=parseFloat(e),i=b[c][f]=this.trim(e),l)a[c][f]=i;else if(i==d)a[c][f]=d,d>31536E6?
15 | a[c].isDatetime=!0:a[c].isNumeric=!0;else if(d=this.parseDate(e),g&&typeof d==="number"&&!isNaN(d)){if(j[f]=e,a[c][f]=d,a[c].isDatetime=!0,a[c][f+1]!==void 0){e=d>a[c][f+1];if(e!==h&&h!==void 0)this.alternativeFormat?(this.dateFormat=this.alternativeFormat,f=a[c].length,this.alternativeFormat=this.dateFormats[this.dateFormat].alternative):a[c].unsorted=!0;h=e}}else if(a[c][f]=i===""?null:i,f!==0&&(a[c].isDatetime||a[c].isNumeric))a[c].mixed=!0;g&&a[c].mixed&&(a[c]=b[c])}if(a[0].isDatetime&&h){b=typeof a[0][0]!==
16 | "number";for(c=0;c0;){h=new l;h.addColumnReader(0,"x");d=q(0,e);d!==-1&&e.splice(d,1);for(d=0;d0&&g[0].readers.length>0&&(h=a[g[0].readers[0].columnIndex],h!==void 0&&(h.isDatetime?b="datetime":h.isNumeric||(b="category")));if(b==="category")for(d=0;d=2&&(e=this.getReferencedColumnIndexes(),e.length>=2))e.shift(),e.sort(),this.name=a[e.shift()].name;return f};l.prototype.addColumnReader=function(a,b){this.readers.push({columnIndex:a,configName:b});if(!(b==="x"||b==="y"||b===void 0))this.pointIsArray=!1};l.prototype.getReferencedColumnIndexes=function(){var a,b=[],c;for(a=0;ad;d++)c[d]=255&a.charCodeAt(d);return c}function f(a){return a>=0&&31>a?1<d;d++)c[d]=b[d];return c};l.context2d=document.createElement("canvas").getContext("2d")}var m={Int8:1,Int16:2,Int32:4,Uint8:1,Uint16:2,Uint32:4,Float32:4,Float64:8};d.wrapBuffer=function(a){switch(typeof a){case"number":if(i.ArrayBuffer)a=new Uint8Array(a).buffer;else if(i.PixelData)a=l(a);else{a=new Array(a);for(var c=0;c=0){var d=g.fromNumber(a);b=d.lo,c=d.hi}else c=Math.floor(a/f(32)),b=a-c*f(32),c+=f(32);return new h(b,c)};var n=d.prototype={compatibility:i,_checkBounds:function(a,b,d){if("number"!=typeof a)throw new TypeError("Offset is not a number.");if("number"!=typeof b)throw new TypeError("Size is not a number.");if(0>b)throw new RangeError("Length is negative.");if(0>a||a+b>c(d,this.byteLength))throw new RangeError("Offsets are out of bounds.")},_action:function(a,b,d,e,f){return this._engineAction(a,b,c(d,this._offset),c(e,this._littleEndian),f)},_dataViewAction:function(a,b,c,d,e){return this._offset=c+m[a],b?this._view["get"+a](c,d):this._view["set"+a](c,e,d)},_arrayBufferAction:function(b,d,e,f,g){var h,i=m[b],j=a[b+"Array"];if(f=c(f,this._littleEndian),1===i||(this.byteOffset+e)%i===0&&f)return h=new j(this.buffer,this.byteOffset+e,1),this._offset=e+i,d?h[0]:h[0]=g;var k=new Uint8Array(d?this.getBytes(i,e,f,!0):i);return h=new j(k.buffer,0,1),d?h[0]:(h[0]=g,void this._setBytes(e,k,f))},_arrayAction:function(a,b,c,d,e){return b?this["_get"+a](c,d):this["_set"+a](c,e,d)},_getBytes:function(a,d,e){e=c(e,this._littleEndian),d=c(d,this._offset),a=c(a,this.byteLength-d),this._checkBounds(d,a),d+=this.byteOffset,this._offset=d-this.byteOffset+a;var f=this._isArrayBuffer?new Uint8Array(this.buffer,d,a):(this.buffer.slice||Array.prototype.slice).call(this.buffer,d,d+a);return e||1>=a?f:b(f).reverse()},getBytes:function(a,d,e,f){var g=this._getBytes(a,d,c(e,!0));return f?b(g):g},_setBytes:function(a,d,e){var f=d.length;if(0!==f){if(e=c(e,this._littleEndian),a=c(a,this._offset),this._checkBounds(a,f),!e&&f>1&&(d=b(d,!0).reverse()),a+=this.byteOffset,this._isArrayBuffer)new Uint8Array(this.buffer,a,f).set(d);else for(var g=0;f>g;g++)this.buffer[a+g]=d[g];this._offset=a-this.byteOffset+f}},setBytes:function(a,b,d){this._setBytes(a,b,c(d,!0))},getString:function(a,b,c){var d=this._getBytes(a,b,!0);if(c="utf8"===c?"utf-8":c||"binary",k&&"binary"!==c)return new k(c).decode(this._isArrayBuffer?d:new Uint8Array(d));var e="";a=d.length;for(var f=0;a>f;f++)e+=String.fromCharCode(d[f]);return"utf-8"===c&&(e=decodeURIComponent(escape(e))),e},setString:function(a,b,c){c="utf8"===c?"utf-8":c||"binary";var d;j&&"binary"!==c?d=new j(c).encode(b):("utf-8"===c&&(b=unescape(encodeURIComponent(b))),d=e(b)),this._setBytes(a,d,!0)},getChar:function(a){return this.getString(1,a)},setChar:function(a,b){this.setString(a,b)},tell:function(){return this._offset},seek:function(a){return this._checkBounds(a,0),this._offset=a},skip:function(a){return this.seek(this._offset+a)},slice:function(a,b,e){function f(a,b){return 0>a?a+b:a}return a=f(a,this.byteLength),b=f(c(b,this.byteLength),this.byteLength),e?new d(this.getBytes(b-a,a,!0,!0),void 0,void 0,this._littleEndian):new d(this.buffer,this.byteOffset+a,b-a,this._littleEndian)},alignBy:function(a){return this._bitOffset=0,1!==c(a,1)?this.skip(a-(this._offset%a||a)):this._offset},_getFloat64:function(a,b){var c=this._getBytes(8,a,b),d=1-2*(c[7]>>7),e=((c[7]<<1&255)<<3|c[6]>>4)-1023,g=(15&c[6])*f(48)+c[5]*f(40)+c[4]*f(32)+c[3]*f(24)+c[2]*f(16)+c[1]*f(8)+c[0];return 1024===e?0!==g?0/0:1/0*d:-1023===e?d*g*f(-1074):d*(1+g*f(-52))*f(e)},_getFloat32:function(a,b){var c=this._getBytes(4,a,b),d=1-2*(c[3]>>7),e=(c[3]<<1&255|c[2]>>7)-127,g=(127&c[2])<<16|c[1]<<8|c[0];return 128===e?0!==g?0/0:1/0*d:-127===e?d*g*f(-149):d*(1+g*f(-23))*f(e)},_get64:function(a,b,d){d=c(d,this._littleEndian),b=c(b,this._offset);for(var e=d?[0,4]:[4,0],f=0;2>f;f++)e[f]=this.getUint32(b+e[f],d);return this._offset=b+8,new a(e[0],e[1])},getInt64:function(a,b){return this._get64(h,a,b)},getUint64:function(a,b){return this._get64(g,a,b)},_getInt32:function(a,b){var c=this._getBytes(4,a,b);return c[3]<<24|c[2]<<16|c[1]<<8|c[0]},_getUint32:function(a,b){return this._getInt32(a,b)>>>0},_getInt16:function(a,b){return this._getUint16(a,b)<<16>>16},_getUint16:function(a,b){var c=this._getBytes(2,a,b);return c[1]<<8|c[0]},_getInt8:function(a){return this._getUint8(a)<<24>>24},_getUint8:function(a){return this._getBytes(1,a)[0]},_getBitRangeData:function(a,b){var d=(c(b,this._offset)<<3)+this._bitOffset,e=d+a,f=d>>>3,g=e+7>>>3,h=this._getBytes(g-f,f,!0),i=0;(this._bitOffset=7&e)&&(this._bitOffset-=8);for(var j=0,k=h.length;k>j;j++)i=i<<8|h[j];return{start:f,bytes:h,wideValue:i}},getSigned:function(a,b){var c=32-a;return this.getUnsigned(a,b)<>c},getUnsigned:function(a,b){var c=this._getBitRangeData(a,b).wideValue>>>-this._bitOffset;return 32>a?c&~(-1<b?1:0,j=~(-1<b&&(b=-b),0===b?(g=0,h=0):isNaN(b)?(g=2*j+1,h=1):1/0===b?(g=2*j+1,h=0):(g=Math.floor(Math.log(b)/Math.LN2),g>=k&&j>=g?(h=Math.floor((b*f(-g)-1)*f(c)),g+=j):(h=Math.floor(b/f(k-c)),g=0));for(var l=[];c>=8;)l.push(h%256),h=Math.floor(h/256),c-=8;for(g=g<=8;)l.push(255&g),g>>>=8,d-=8;l.push(i<>>8&255,b>>>16&255,b>>>24],c)},_setUint16:function(a,b,c){this._setBytes(a,[255&b,b>>>8&255],c)},_setUint8:function(a,b){this._setBytes(a,[255&b])},setUnsigned:function(a,b,c){var d=this._getBitRangeData(c,a),e=d.wideValue,f=d.bytes;e&=~(~(-1<c?b&~(-1<=0;g--)f[g]=255&e,e>>>=8;this._setBytes(d.start,f,!0)}};for(var o in m)!function(a){n["get"+a]=function(b,c){return this._action(a,!0,b,c)},n["set"+a]=function(b,c,d){this._action(a,!1,b,d,c)}}(o);n._setInt32=n._setUint32,n._setInt16=n._setUint16,n._setInt8=n._setUint8,n.setSigned=n.setUnsigned;for(var p in n)"set"===p.slice(0,3)&&!function(a){n["write"+a]=function(){Array.prototype.unshift.call(arguments,void 0),this["set"+a].apply(this,arguments)}}(p.slice(3));return d});
2 |
--------------------------------------------------------------------------------
/web/js/jquery.hoverIntent.min.js:
--------------------------------------------------------------------------------
1 | /*!
2 | * hoverIntent r7 // 2013.03.11 // jQuery 1.9.1+
3 | * http://cherne.net/brian/resources/jquery.hoverIntent.html
4 | *
5 | * You may use hoverIntent under the terms of the MIT license.
6 | * Copyright 2007, 2013 Brian Cherne
7 | */
8 | (function(e){e.fn.hoverIntent=function(t,n,r){var i={interval:100,sensitivity:7,timeout:0};if(typeof t==="object"){i=e.extend(i,t)}else if(e.isFunction(n)){i=e.extend(i,{over:t,out:n,selector:r})}else{i=e.extend(i,{over:t,out:t,selector:n})}var s,o,u,a;var f=function(e){s=e.pageX;o=e.pageY};var l=function(t,n){n.hoverIntent_t=clearTimeout(n.hoverIntent_t);if(Math.abs(u-s)+Math.abs(a-o)