Import kraken benchmark.
This commit is contained in:
Родитель
b2d3148a51
Коммит
f0966bef20
|
@ -0,0 +1,7 @@
|
|||
Kraken 1.1
|
||||
==========
|
||||
Fix Bug 599914 - Kraken: audio-beat-detection and audio-fft computes on NaN and undefined.
|
||||
|
||||
Kraken 1.0
|
||||
==========
|
||||
Initial import.
|
|
@ -0,0 +1,98 @@
|
|||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
|
||||
<meta charset=utf8>
|
||||
|
||||
<!--
|
||||
Copyright (C) 2007 Apple Inc. All rights reserved.
|
||||
Copyright (C) 2010 Mozilla Foundation
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions
|
||||
are met:
|
||||
1. Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
2. 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 APPLE COMPUTER, INC. ``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 APPLE COMPUTER, INC. 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.
|
||||
-->
|
||||
|
||||
<title>Kraken JavaScript Benchmark: A* Search Algorithm</title>
|
||||
<link rel="stylesheet" href="../kraken.css">
|
||||
<script src="astar.js"></script>
|
||||
<script>
|
||||
function getCanvasContext() {
|
||||
var canvas = document.getElementById('display');
|
||||
if (canvas.getContext)
|
||||
return canvas.getContext('2d');
|
||||
}
|
||||
|
||||
function drawEndpoints(ctx, start, end) {
|
||||
drawCanvasCell(ctx, start.x, start.y, "rgb(256,0,0)");
|
||||
drawCanvasCell(ctx, end.x, end.y, "rgb(256,256,0)");
|
||||
}
|
||||
|
||||
function drawSuccessfulPath(nodeList) {
|
||||
var ctx = getCanvasContext();
|
||||
for (var i=0; i < nodeList.length; i++) {
|
||||
ctx.fillStyle = "rgb(256,0,0)";
|
||||
ctx.fillRect((nodeList[i].x * 5) + 1, (nodeList[i].y * 5) + 1, 3, 3);
|
||||
}
|
||||
}
|
||||
|
||||
function drawCanvas(graphSet) {
|
||||
var ctx = getCanvasContext();
|
||||
for (var i = 0; i < graphSet.length; i++) {
|
||||
for (var j = 0; j < graphSet.length; j++) {
|
||||
var node = graphSet[i][j];
|
||||
if (node.isWall()) {
|
||||
drawCanvasCell(ctx, node.x, node.y, "rgb(0,0,0)");
|
||||
} else {
|
||||
drawCanvasCell(ctx, node.x, node.y, "rgb(50,50,50)");
|
||||
}
|
||||
}
|
||||
}
|
||||
drawEndpoints(ctx, start, end);
|
||||
}
|
||||
|
||||
function drawCanvasCell(ctx, x, y, style) {
|
||||
ctx.fillStyle = style;
|
||||
ctx.fillRect(x * 5, y * 5, 5, 5);
|
||||
}
|
||||
|
||||
function doIt() {
|
||||
var div = document.getElementById("console");
|
||||
div.innerHTML += go();
|
||||
div.innerHTML += "<br>";
|
||||
drawSuccessfulPath(path);
|
||||
}
|
||||
</script>
|
||||
<style> #display { border: 5px solid rgb(0,0,50);}</style>
|
||||
</head>
|
||||
|
||||
<body onload="drawCanvas(g1);">
|
||||
<div id="content">
|
||||
<h2>Kraken JavaScript Benchmark: A* Search Algorithm</h2>
|
||||
<div id="results">
|
||||
<p>This benchmark uses the <a href="http://en.wikipedia.org/wiki/A*_search_algorithm">A* search algorithm</a> is used to automatically plot an efficient path between two points,<br> in the presence of obstacles. Adapted from code by <a href="http://www.briangrinstead.com/blog/astar-search-algorithm-in-javascript">Brian Gringstead</a>.</p>
|
||||
<p>Below, you can watch the algorithm plot a path through the maze.</p>
|
||||
<canvas id="display" width=500 height=500></canvas>
|
||||
<p><input onclick="drawCanvas(g1); setTimeout(doIt, 10);" type="button" value="Try It!"></p>
|
||||
<div id="console"></div>
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
Разница между файлами не показана из-за своего большого размера
Загрузить разницу
|
@ -0,0 +1,49 @@
|
|||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
|
||||
<meta charset=utf8>
|
||||
|
||||
<!--
|
||||
Copyright (C) 2007 Apple Inc. All rights reserved.
|
||||
Copyright (C) 2010 Mozilla Foundation
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions
|
||||
are met:
|
||||
1. Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
2. 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 APPLE COMPUTER, INC. ``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 APPLE COMPUTER, INC. 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.
|
||||
-->
|
||||
|
||||
<title>Kraken JavaScript Benchmark: Gaussian Blur</title>
|
||||
<link rel="stylesheet" href="../kraken.css">
|
||||
<script>
|
||||
|
||||
</script>
|
||||
<style> #display { border: 5px solid rgb(0,0,50);}</style>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<div id="content">
|
||||
<h2>Kraken JavaScript Benchmark: Beat Detection</h2>
|
||||
<div id="results">
|
||||
<p>This benchmark performs <a href="http://en.wikipedia.org/wiki/Beat_detection">beat detection</a> on an Audio sample using <a href="http://beatdetektor.svn.sourceforge.net/viewvc/beatdetektor/trunk/core/js/beatdetektor.js?revision=18&view=markup">code</a> from <a href="http://www.cubicproductions.com/index.php?option=com_content&view=article&id=67&Itemid=82">BeatDetektor</a> and <a href="http://github.com/corbanbrook/dsp.js/">DSP.js</a>.</p>
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
|
@ -0,0 +1,256 @@
|
|||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
|
||||
<meta charset=utf8>
|
||||
<link type="text/css" href="jquery-ui-1.8.2.custom.css" rel="stylesheet"/>
|
||||
<script type="text/javascript" src="jquery-1.4.2.min.js"></script>
|
||||
<script type="text/javascript" src="jquery-ui-1.8.2.custom.min.js"></script>
|
||||
|
||||
<!--
|
||||
Copyright (C) 2007 Apple Inc. All rights reserved.
|
||||
Copyright (C) 2010 Mozilla Foundation
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions
|
||||
are met:
|
||||
1. Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
2. 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 APPLE COMPUTER, INC. ``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 APPLE COMPUTER, INC. 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.
|
||||
-->
|
||||
|
||||
<title>Kraken JavaScript Benchmark: Gaussian Blur</title>
|
||||
<link rel="stylesheet" href="../kraken.css">
|
||||
|
||||
<script type="text/javascript" src="darkroom.js"></script>
|
||||
<style>
|
||||
#imagedisplay {
|
||||
width: 70%;
|
||||
/*background: blue;*/
|
||||
padding-top: 15px;
|
||||
padding-bottom: 15px;
|
||||
float: left;
|
||||
}
|
||||
|
||||
#imagedisplay-inner {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
-moz-border-radius: 30px;
|
||||
border: 30px dashed #eeeeee;
|
||||
}
|
||||
|
||||
#controls {
|
||||
background: rgba(0, 0, 0, .5);
|
||||
width: 30%;
|
||||
min-width: 100px;
|
||||
float: right;
|
||||
}
|
||||
|
||||
.blackbg #controls {
|
||||
color: white;
|
||||
}
|
||||
|
||||
.graybg #controls {
|
||||
color: #aaaaaa;
|
||||
}
|
||||
|
||||
#controls h4 {
|
||||
}
|
||||
|
||||
.slidergroup {
|
||||
margin: 5px;
|
||||
}
|
||||
|
||||
.slidergroup tr {
|
||||
font-size: 11px;
|
||||
}
|
||||
|
||||
.slider {
|
||||
margin-left: 15px;
|
||||
margin-right: 15px;
|
||||
}
|
||||
|
||||
body {
|
||||
font-family: sans-serif;
|
||||
}
|
||||
|
||||
#log {
|
||||
font-size: 70%;
|
||||
margin-left: 10px;
|
||||
margin-right: 10px;
|
||||
}
|
||||
|
||||
.indrag {
|
||||
background: rgba(0,128,128,.25);
|
||||
cursor: default;
|
||||
}
|
||||
|
||||
.options {
|
||||
margin: 10px;
|
||||
}
|
||||
|
||||
.canzoomin {
|
||||
cursor: -moz-zoom-in;
|
||||
}
|
||||
|
||||
.canzoomout {
|
||||
cursor: -moz-zoom-out ! important;
|
||||
}
|
||||
|
||||
.cangrab {
|
||||
cursor: -moz-grab;
|
||||
}
|
||||
|
||||
.isgrabbing {
|
||||
cursor: -moz-grabbing ! important;
|
||||
}
|
||||
|
||||
.blackbg {
|
||||
background: black;
|
||||
}
|
||||
|
||||
.whitebg {
|
||||
background: white;
|
||||
}
|
||||
|
||||
.graybg {
|
||||
background: gray;
|
||||
}
|
||||
|
||||
span {
|
||||
font-size: 11px;
|
||||
}
|
||||
|
||||
</style>
|
||||
|
||||
</style>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<div id="content">
|
||||
<h2>Kraken JavaScript Benchmark: Darkroom</h2>
|
||||
<div id="results">
|
||||
<p>This benchmark performs a variety of photo manipulations. You can try these manipulations out in the interface below.</p>
|
||||
<p> </p>
|
||||
<div id="imagedisplay">
|
||||
<center><canvas id="canvas"></canvas></center>
|
||||
</div>
|
||||
|
||||
<div id="controls">
|
||||
<div class="slidergroup">
|
||||
<h4>Exposure</h4>
|
||||
<table border="0">
|
||||
<tr>
|
||||
<td>Black Point</td>
|
||||
<td width="100%"><div class="slider" id="blackPoint"></div></td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>Fill</td>
|
||||
<td><div class="slider" id="fill"></div></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Brightness</td>
|
||||
<td><div class="slider" id="brightness"></div></td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>Contrast</td>
|
||||
<td><div class="slider" id="contrast"></div></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Saturation</td>
|
||||
<td><div class="slider" id="saturation"></div></td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>Temperature</td>
|
||||
<td><div class="slider" id="temperature"></div></td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
<div class="slidergroup">
|
||||
<h4>Tone Control</h4>
|
||||
|
||||
<table border="0">
|
||||
<tr>
|
||||
<td>Split Point</td>
|
||||
<td><div class="slider" id="splitPoint"></div></td>
|
||||
</tr>
|
||||
<tr><td><b>Shadows</b></td></tr>
|
||||
<tr>
|
||||
<td>Hue</td>
|
||||
|
||||
<td width="100%"><div class="slider" id="shadowsHue"></div></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Saturation</td>
|
||||
<td><div class="slider" id="shadowsSaturation"></div></td>
|
||||
</tr>
|
||||
<tr><td><b>Highlights</b></td></tr>
|
||||
<tr>
|
||||
|
||||
<td>Hue</td>
|
||||
<td><div class="slider" id="highlightsHue"></div></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Saturation</td>
|
||||
<td><div class="slider" id="highlightsSaturation"></div></td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
</div>
|
||||
|
||||
<div class="slidergroup">
|
||||
<h4>Geometry</h4>
|
||||
<table border="0" width="100%">
|
||||
<tr><td>Angle (+/- 90.0)</td></tr>
|
||||
<tr>
|
||||
<td width="100%"><div class="slider" id="angle"></div></td>
|
||||
|
||||
</tr>
|
||||
<tr><td>Fine Angle (+/- 2.0)</td></tr>
|
||||
<tr>
|
||||
<td><div class="slider" id="fineangle"></div></td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
|
||||
<div class="options">
|
||||
|
||||
<span>Background: <div style="display: inline-block; width: 15px; height: 15px; border: 1px solid white; background: black;" onclick="SetBackground(0);"></div>
|
||||
<div style="display: inline-block; width: 15px; height: 15px; border: 1px solid white; background: gray;" onclick="SetBackground(1);"></div>
|
||||
<div style="display: inline-block; width: 15px; height: 15px; border: 1px solid white; background: white;" onclick="SetBackground(2);"></div>
|
||||
</span><br>
|
||||
|
||||
<span style="font-weight: bold;">Drag and drop a new image onto the canvas to load.</span><br>
|
||||
|
||||
<button onclick="ZoomReset()">Reset Zoom</button>
|
||||
|
||||
<button onclick="DoReset()">Reset All</button>
|
||||
<button onclick="DoRedisplay()">Repaint</button><br><br>
|
||||
<input type="checkbox" id="correct_before" onchange="CheckboxToggled()">Color correct before scaling for display<br><br>
|
||||
</div>
|
||||
|
||||
<div id="log"></div>
|
||||
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
|
@ -0,0 +1,571 @@
|
|||
/* -*- Mode: js2; js2-basic-offset: 2; indent-tabs-mode: nil; tab-width: 40; -*- */
|
||||
|
||||
// The if (0) block of function definitions here tries to use
|
||||
// faster math primitives, based on being able to reinterpret
|
||||
// floats as ints and vice versa. We do that using the
|
||||
// WebGL arrays.
|
||||
|
||||
if (0) {
|
||||
|
||||
var gConversionBuffer = new ArrayBuffer(4);
|
||||
var gFloatConversion = new WebGLFloatArray(gConversionBuffer);
|
||||
var gIntConversion = new WebGLIntArray(gConversionBuffer);
|
||||
|
||||
function AsFloat(i) {
|
||||
gIntConversion[0] = i;
|
||||
return gFloatConversion[0];
|
||||
}
|
||||
|
||||
function AsInt(f) {
|
||||
gFloatConversion[0] = f;
|
||||
return gIntConversion[0];
|
||||
}
|
||||
|
||||
// magic constants used for various floating point manipulations
|
||||
var kMagicFloatToInt = (1 << 23);
|
||||
var kOneAsInt = 0x3F800000;
|
||||
var kScaleUp = AsFloat(0x00800000);
|
||||
var kScaleDown = 1.0 / kScaleUp;
|
||||
|
||||
function ToInt(f) {
|
||||
// force integer part into lower bits of mantissa
|
||||
var i = ReinterpretFloatAsInt(f + kMagicFloatToInt);
|
||||
// return lower bits of mantissa
|
||||
return i & 0x3FFFFF;
|
||||
}
|
||||
|
||||
function FastLog2(x) {
|
||||
return (AsInt(x) - kOneAsInt) * kScaleDown;
|
||||
}
|
||||
|
||||
function FastPower(x, p) {
|
||||
return AsFloat(p * AsInt(x) + (1.0 - p) * kOneAsInt);
|
||||
}
|
||||
|
||||
var LOG2_HALF = FastLog2(0.5);
|
||||
|
||||
function FastBias(b, x) {
|
||||
return FastPower(x, FastLog2(b) / LOG2_HALF);
|
||||
}
|
||||
|
||||
} else {
|
||||
|
||||
function FastLog2(x) {
|
||||
return Math.log(x) / Math.LN2;
|
||||
}
|
||||
|
||||
var LOG2_HALF = FastLog2(0.5);
|
||||
|
||||
function FastBias(b, x) {
|
||||
return Math.pow(x, FastLog2(b) / LOG2_HALF);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
function FastGain(g, x) {
|
||||
return (x < 0.5) ?
|
||||
FastBias(1.0 - g, 2.0 * x) * 0.5 :
|
||||
1.0 - FastBias(1.0 - g, 2.0 - 2.0 * x) * 0.5;
|
||||
}
|
||||
|
||||
function Clamp(x) {
|
||||
return (x < 0.0) ? 0.0 : ((x > 1.0) ? 1.0 : x);
|
||||
}
|
||||
|
||||
function ProcessImageData(imageData, params) {
|
||||
var saturation = params.saturation;
|
||||
var contrast = params.contrast;
|
||||
var brightness = params.brightness;
|
||||
var blackPoint = params.blackPoint;
|
||||
var fill = params.fill;
|
||||
var temperature = params.temperature;
|
||||
var shadowsHue = params.shadowsHue;
|
||||
var shadowsSaturation = params.shadowsSaturation;
|
||||
var highlightsHue = params.highlightsHue;
|
||||
var highlightsSaturation = params.highlightsSaturation;
|
||||
var splitPoint = params.splitPoint;
|
||||
|
||||
var brightness_a, brightness_b;
|
||||
var oo255 = 1.0 / 255.0;
|
||||
|
||||
// do some adjustments
|
||||
fill *= 0.2;
|
||||
brightness = (brightness - 1.0) * 0.75 + 1.0;
|
||||
if (brightness < 1.0) {
|
||||
brightness_a = brightness;
|
||||
brightness_b = 0.0;
|
||||
} else {
|
||||
brightness_b = brightness - 1.0;
|
||||
brightness_a = 1.0 - brightness_b;
|
||||
}
|
||||
contrast = contrast * 0.5;
|
||||
contrast = (contrast - 0.5) * 0.75 + 0.5;
|
||||
temperature = (temperature / 2000.0) * 0.1;
|
||||
if (temperature > 0.0) temperature *= 2.0;
|
||||
splitPoint = ((splitPoint + 1.0) * 0.5);
|
||||
|
||||
// apply to pixels
|
||||
var sz = imageData.width * imageData.height;
|
||||
var data = imageData.data;
|
||||
for (var j = 0; j < sz; j++) {
|
||||
var r = data[j*4+0] * oo255;
|
||||
var g = data[j*4+1] * oo255;
|
||||
var b = data[j*4+2] * oo255;
|
||||
// convert RGB to YIQ
|
||||
// this is a less than ideal colorspace;
|
||||
// HSL would probably be better, but more expensive
|
||||
var y = 0.299 * r + 0.587 * g + 0.114 * b;
|
||||
var i = 0.596 * r - 0.275 * g - 0.321 * b;
|
||||
var q = 0.212 * r - 0.523 * g + 0.311 * b;
|
||||
i = i + temperature;
|
||||
q = q - temperature;
|
||||
i = i * saturation;
|
||||
q = q * saturation;
|
||||
y = (1.0 + blackPoint) * y - blackPoint;
|
||||
y = y + fill;
|
||||
y = y * brightness_a + brightness_b;
|
||||
y = FastGain(contrast, Clamp(y));
|
||||
|
||||
if (y < splitPoint) {
|
||||
q = q + (shadowsHue * shadowsSaturation) * (splitPoint - y);
|
||||
} else {
|
||||
i = i + (highlightsHue * highlightsSaturation) * (y - splitPoint);
|
||||
}
|
||||
|
||||
// convert back to RGB for display
|
||||
r = y + 0.956 * i + 0.621 * q;
|
||||
g = y - 0.272 * i - 0.647 * q;
|
||||
b = y - 1.105 * i + 1.702 * q;
|
||||
|
||||
// clamping is "free" as part of the ImageData object
|
||||
data[j*4+0] = r * 255.0;
|
||||
data[j*4+1] = g * 255.0;
|
||||
data[j*4+2] = b * 255.0;
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// UI code
|
||||
//
|
||||
|
||||
var gFullCanvas = null;
|
||||
var gFullContext = null;
|
||||
var gFullImage = null;
|
||||
var gDisplayCanvas = null;
|
||||
var gDisplayContext = null;
|
||||
var gZoomPoint = null;
|
||||
var gDisplaySize = null;
|
||||
var gZoomSize = [600, 600];
|
||||
var gMouseStart = null;
|
||||
var gMouseOrig = [0, 0];
|
||||
var gDirty = true;
|
||||
|
||||
// If true, apply image correction to the original
|
||||
// source image before scaling down; if false,
|
||||
// scale down first.
|
||||
var gCorrectBefore = false;
|
||||
|
||||
var gParams = null;
|
||||
var gIgnoreChanges = true;
|
||||
|
||||
function OnSliderChanged() {
|
||||
if (gIgnoreChanges)
|
||||
return;
|
||||
|
||||
gDirty = true;
|
||||
|
||||
gParams = {};
|
||||
|
||||
// The values will come in as 0.0 .. 1.0; some params want
|
||||
// a different range.
|
||||
var ranges = {
|
||||
"saturation": [0, 2],
|
||||
"contrast": [0, 2],
|
||||
"brightness": [0, 2],
|
||||
"temperature": [-2000, 2000],
|
||||
"splitPoint": [-1, 1]
|
||||
};
|
||||
|
||||
$(".slider").each(function(index, e) {
|
||||
var val = Math.floor($(e).slider("value")) / 1000.0;
|
||||
var id = e.getAttribute("id");
|
||||
if (id in ranges)
|
||||
val = val * (ranges[id][1] - ranges[id][0]) + ranges[id][0];
|
||||
gParams[id] = val;
|
||||
});
|
||||
|
||||
Redisplay();
|
||||
}
|
||||
|
||||
function ClampZoomPointToTranslation() {
|
||||
var tx = gZoomPoint[0] - gZoomSize[0]/2;
|
||||
var ty = gZoomPoint[1] - gZoomSize[1]/2;
|
||||
tx = Math.max(0, tx);
|
||||
ty = Math.max(0, ty);
|
||||
|
||||
if (tx + gZoomSize[0] > gFullImage.width)
|
||||
tx = gFullImage.width - gZoomSize[0];
|
||||
if (ty + gZoomSize[1] > gFullImage.height)
|
||||
ty = gFullImage.height - gZoomSize[1];
|
||||
return [tx, ty];
|
||||
}
|
||||
|
||||
function Redisplay() {
|
||||
if (!gParams)
|
||||
return;
|
||||
|
||||
var angle =
|
||||
(gParams.angle*2.0 - 1.0) * 90.0 +
|
||||
(gParams.fineangle*2.0 - 1.0) * 2.0;
|
||||
|
||||
angle = Math.max(-90, Math.min(90, angle));
|
||||
angle = (angle * Math.PI) / 180.0;
|
||||
|
||||
var processTime;
|
||||
var processWidth, processHeight;
|
||||
|
||||
var t0 = (new Date()).getTime();
|
||||
|
||||
// Render the image with rotation; we only need to render
|
||||
// if we're either correcting just the portion that's visible,
|
||||
// or if we're correcting the full thing and the sliders have been
|
||||
// changed. Otherwise, what's in the full canvas is already corrected
|
||||
// and correct.
|
||||
if ((gCorrectBefore && gDirty) ||
|
||||
!gCorrectBefore)
|
||||
{
|
||||
gFullContext.save();
|
||||
gFullContext.translate(Math.floor(gFullImage.width / 2), Math.floor(gFullImage.height / 2));
|
||||
gFullContext.rotate(angle);
|
||||
gFullContext.globalCompositeOperation = "copy";
|
||||
gFullContext.drawImage(gFullImage,
|
||||
-Math.floor(gFullImage.width / 2),
|
||||
-Math.floor(gFullImage.height / 2));
|
||||
gFullContext.restore();
|
||||
}
|
||||
|
||||
function FullToDisplay() {
|
||||
gDisplayContext.save();
|
||||
if (gZoomPoint) {
|
||||
var pt = ClampZoomPointToTranslation();
|
||||
|
||||
gDisplayContext.translate(-pt[0], -pt[1]);
|
||||
} else {
|
||||
gDisplayContext.translate(0, 0);
|
||||
var ratio = gDisplaySize[0] / gFullCanvas.width;
|
||||
gDisplayContext.scale(ratio, ratio);
|
||||
}
|
||||
|
||||
gDisplayContext.globalCompositeOperation = "copy";
|
||||
gDisplayContext.drawImage(gFullCanvas, 0, 0);
|
||||
gDisplayContext.restore();
|
||||
}
|
||||
|
||||
function ProcessCanvas(cx, canvas) {
|
||||
var ts = (new Date()).getTime();
|
||||
|
||||
var data = cx.getImageData(0, 0, canvas.width, canvas.height);
|
||||
ProcessImageData(data, gParams);
|
||||
cx.putImageData(data, 0, 0);
|
||||
|
||||
processWidth = canvas.width;
|
||||
processHeight = canvas.height;
|
||||
|
||||
processTime = (new Date()).getTime() - ts;
|
||||
}
|
||||
|
||||
if (gCorrectBefore) {
|
||||
if (gDirty) {
|
||||
ProcessCanvas(gFullContext, gFullCanvas);
|
||||
} else {
|
||||
processTime = -1;
|
||||
}
|
||||
gDirty = false;
|
||||
FullToDisplay();
|
||||
} else {
|
||||
FullToDisplay();
|
||||
ProcessCanvas(gDisplayContext, gDisplayCanvas);
|
||||
}
|
||||
|
||||
var t3 = (new Date()).getTime();
|
||||
|
||||
if (processTime != -1) {
|
||||
$("#log")[0].innerHTML = "<p>" +
|
||||
"Size: " + processWidth + "x" + processHeight + " (" + (processWidth*processHeight) + " pixels)<br>" +
|
||||
"Process: " + processTime + "ms" + " Total: " + (t3-t0) + "ms<br>" +
|
||||
"Throughput: " + Math.floor((processWidth*processHeight) / (processTime / 1000.0)) + " pixels per second<br>" +
|
||||
"FPS: " + (Math.floor((1000.0 / (t3-t0)) * 100) / 100) + "<br>" +
|
||||
"</p>";
|
||||
} else {
|
||||
$("#log")[0].innerHTML = "<p>(No stats when zoomed and no processing done)</p>";
|
||||
}
|
||||
}
|
||||
|
||||
function ZoomToPoint(x, y) {
|
||||
if (gZoomSize[0] > gFullImage.width ||
|
||||
gZoomSize[1] > gFullImage.height)
|
||||
return;
|
||||
|
||||
var r = gDisplaySize[0] / gFullCanvas.width;
|
||||
|
||||
gDisplayCanvas.width = gZoomSize[0];
|
||||
gDisplayCanvas.height = gZoomSize[1];
|
||||
gZoomPoint = [x/r, y/r];
|
||||
$("#canvas").removeClass("canzoomin").addClass("cangrab");
|
||||
Redisplay();
|
||||
}
|
||||
|
||||
function ZoomReset() {
|
||||
gDisplayCanvas.width = gDisplaySize[0];
|
||||
gDisplayCanvas.height = gDisplaySize[1];
|
||||
gZoomPoint = null;
|
||||
$("#canvas").removeClass("canzoomout cangrab isgrabbing").addClass("canzoomin");
|
||||
Redisplay();
|
||||
}
|
||||
|
||||
function LoadImage(url) {
|
||||
if (!gFullCanvas)
|
||||
gFullCanvas = document.createElementNS("http://www.w3.org/1999/xhtml", "canvas");
|
||||
if (!gDisplayCanvas)
|
||||
gDisplayCanvas = $("#canvas")[0];
|
||||
|
||||
var img = new Image();
|
||||
img.onload = function() {
|
||||
var w = img.width;
|
||||
var h = img.height;
|
||||
|
||||
gFullImage = img;
|
||||
|
||||
gFullCanvas.width = w;
|
||||
gFullCanvas.height = h;
|
||||
gFullContext = gFullCanvas.getContext("2d");
|
||||
|
||||
// XXX use the actual size of the visible region, so that
|
||||
// we rescale along with the window
|
||||
var dim = 600;
|
||||
if (Math.max(w,h) > dim) {
|
||||
var scale = dim / Math.max(w,h);
|
||||
w *= scale;
|
||||
h *= scale;
|
||||
}
|
||||
|
||||
gDisplayCanvas.width = Math.floor(w);
|
||||
gDisplayCanvas.height = Math.floor(h);
|
||||
gDisplaySize = [ Math.floor(w), Math.floor(h) ];
|
||||
gDisplayContext = gDisplayCanvas.getContext("2d");
|
||||
|
||||
$("#canvas").removeClass("canzoomin canzoomout cangrab isgrabbing");
|
||||
|
||||
if (gZoomSize[0] <= gFullImage.width &&
|
||||
gZoomSize[1] <= gFullImage.height)
|
||||
{
|
||||
$("#canvas").addClass("canzoomin");
|
||||
}
|
||||
|
||||
OnSliderChanged();
|
||||
};
|
||||
//img.src = "foo.jpg";
|
||||
//img.src = "Nina6.jpg";
|
||||
img.src = url ? url : "sunspots.jpg";
|
||||
}
|
||||
|
||||
function SetupDnD() {
|
||||
$("#imagedisplay").bind({
|
||||
dragenter: function(e) {
|
||||
$("#imagedisplay").addClass("indrag");
|
||||
return false;
|
||||
},
|
||||
|
||||
dragover: function(e) {
|
||||
return false;
|
||||
},
|
||||
|
||||
dragleave: function(e) {
|
||||
$("#imagedisplay").removeClass("indrag");
|
||||
return false;
|
||||
},
|
||||
|
||||
drop: function(e) {
|
||||
e = e.originalEvent;
|
||||
var dt = e.dataTransfer;
|
||||
var files = dt.files;
|
||||
|
||||
if (files.length > 0) {
|
||||
var file = files[0];
|
||||
var reader = new FileReader();
|
||||
reader.onload = function(e) { LoadImage(e.target.result); };
|
||||
reader.readAsDataURL(file);
|
||||
}
|
||||
|
||||
$("#imagedisplay").removeClass("indrag");
|
||||
return false;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function SetupZoomClick() {
|
||||
$("#canvas").bind({
|
||||
click: function(e) {
|
||||
if (gZoomPoint)
|
||||
return true;
|
||||
|
||||
var bounds = $("#canvas")[0].getBoundingClientRect();
|
||||
var x = e.clientX - bounds.left;
|
||||
var y = e.clientY - bounds.top;
|
||||
|
||||
ZoomToPoint(x, y);
|
||||
return false;
|
||||
},
|
||||
|
||||
mousedown: function(e) {
|
||||
if (!gZoomPoint)
|
||||
return true;
|
||||
|
||||
$("#canvas").addClass("isgrabbing");
|
||||
|
||||
gMouseOrig[0] = gZoomPoint[0];
|
||||
gMouseOrig[1] = gZoomPoint[1];
|
||||
gMouseStart = [ e.clientX, e.clientY ];
|
||||
|
||||
return false;
|
||||
},
|
||||
|
||||
mouseup: function(e) {
|
||||
if (!gZoomPoint || !gMouseStart)
|
||||
return true;
|
||||
$("#canvas").removeClass("isgrabbing");
|
||||
|
||||
gZoomPoint = ClampZoomPointToTranslation();
|
||||
|
||||
gZoomPoint[0] += gZoomSize[0]/2;
|
||||
gZoomPoint[1] += gZoomSize[1]/2;
|
||||
|
||||
gMouseStart = null;
|
||||
return false;
|
||||
},
|
||||
|
||||
mousemove: function(e) {
|
||||
if (!gZoomPoint || !gMouseStart)
|
||||
return true;
|
||||
|
||||
gZoomPoint[0] = gMouseOrig[0] + (gMouseStart[0] - e.clientX);
|
||||
gZoomPoint[1] = gMouseOrig[1] + (gMouseStart[1] - e.clientY);
|
||||
Redisplay();
|
||||
|
||||
return false;
|
||||
}
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
function CheckboxToggled(skipRedisplay) {
|
||||
gCorrectBefore = $("#correct_before")[0].checked ? true : false;
|
||||
|
||||
if (!skipRedisplay)
|
||||
Redisplay();
|
||||
}
|
||||
|
||||
function ResetSliders() {
|
||||
gIgnoreChanges = true;
|
||||
|
||||
$(".slider").each(function(index, e) { $(e).slider("value", 500); });
|
||||
$("#blackPoint").slider("value", 0);
|
||||
$("#fill").slider("value", 0);
|
||||
$("#shadowsSaturation").slider("value", 0);
|
||||
$("#highlightsSaturation").slider("value", 0);
|
||||
|
||||
gIgnoreChanges = false;
|
||||
}
|
||||
|
||||
function DoReset() {
|
||||
ResetSliders();
|
||||
ZoomReset();
|
||||
OnSliderChanged();
|
||||
}
|
||||
|
||||
function DoRedisplay() {
|
||||
Redisplay();
|
||||
}
|
||||
|
||||
// Speed test: run 10 processings, report in thousands-of-pixels-per-second
|
||||
function Benchmark() {
|
||||
var times = [];
|
||||
|
||||
var width = gFullCanvas.width;
|
||||
var height = gFullCanvas.height;
|
||||
|
||||
$("#benchmark-status")[0].innerHTML = "Resetting...";
|
||||
|
||||
ResetSliders();
|
||||
|
||||
setTimeout(RunOneTiming, 0);
|
||||
|
||||
function RunOneTiming() {
|
||||
|
||||
$("#benchmark-status")[0].innerHTML = "Running... " + (times.length + 1);
|
||||
|
||||
// reset to original image
|
||||
gFullContext.save();
|
||||
gFullContext.translate(Math.floor(gFullImage.width / 2), Math.floor(gFullImage.height / 2));
|
||||
gFullContext.globalCompositeOperation = "copy";
|
||||
gFullContext.drawImage(gFullImage,
|
||||
-Math.floor(gFullImage.width / 2),
|
||||
-Math.floor(gFullImage.height / 2));
|
||||
gFullContext.restore();
|
||||
|
||||
// time the processing
|
||||
var start = (new Date()).getTime();
|
||||
var data = gFullContext.getImageData(0, 0, width, height);
|
||||
ProcessImageData(data, gParams);
|
||||
gFullContext.putImageData(data, 0, 0);
|
||||
var end = (new Date()).getTime();
|
||||
times.push(end - start);
|
||||
|
||||
if (times.length < 5) {
|
||||
setTimeout(RunOneTiming, 0);
|
||||
} else {
|
||||
displayResults();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
function displayResults() {
|
||||
var totalTime = times.reduce(function(p, c) { return p + c; });
|
||||
var totalPixels = height * width * times.length;
|
||||
var MPixelsPerSec = totalPixels / totalTime / 1000;
|
||||
$("#benchmark-status")[0].innerHTML = "Complete: " + MPixelsPerSec.toFixed(2) + " megapixels/sec";
|
||||
$("#benchmark-ua")[0].innerHTML = navigator.userAgent;
|
||||
}
|
||||
}
|
||||
|
||||
function SetBackground(n) {
|
||||
$("body").removeClass("blackbg whitebg graybg");
|
||||
|
||||
switch (n) {
|
||||
case 0: // black
|
||||
$("body").addClass("blackbg");
|
||||
break;
|
||||
case 1: // gray
|
||||
$("body").addClass("graybg");
|
||||
break;
|
||||
case 2: // white
|
||||
$("body").addClass("whitebg");
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
$(function() {
|
||||
$(".slider").slider({
|
||||
orientation: 'horizontal',
|
||||
range: "min",
|
||||
max: 1000,
|
||||
value: 500,
|
||||
slide: OnSliderChanged,
|
||||
change: OnSliderChanged
|
||||
});
|
||||
ResetSliders();
|
||||
SetupDnD();
|
||||
SetupZoomClick();
|
||||
CheckboxToggled(true);
|
||||
LoadImage();
|
||||
});
|
|
@ -0,0 +1,119 @@
|
|||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
|
||||
<meta charset=utf8>
|
||||
|
||||
<!--
|
||||
Copyright (C) 2007 Apple Inc. All rights reserved.
|
||||
Copyright (C) 2010 Mozilla Foundation
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions
|
||||
are met:
|
||||
1. Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
2. 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 APPLE COMPUTER, INC. ``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 APPLE COMPUTER, INC. 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.
|
||||
-->
|
||||
|
||||
<title>Kraken JavaScript Benchmark: Gaussian Blur</title>
|
||||
<link rel="stylesheet" href="../kraken.css">
|
||||
<script>
|
||||
|
||||
</script>
|
||||
<style> #display { border: 5px solid rgb(0,0,50);}</style>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<div id="content">
|
||||
<h2>Kraken JavaScript Benchmark: Desaturate</h2>
|
||||
<div id="results">
|
||||
<p>This benchmark <a href="http://en.wikipedia.org/wiki/Colorfulness">desaturates</a> a photo using code from <a href="http://www.pixastic.com/">Pixastic</a>.</p>
|
||||
<p><small>Photo courtesy <a href="http://www.flickr.com/photos/katclay/4296523922/in/photostream/">Kat Clay</a> from Flickr</small>.</p>
|
||||
<img id="image" src="squid.png" width="400" height="267">
|
||||
<canvas id="canvas" width="400" height="267"></canvas>
|
||||
<script>
|
||||
/*
|
||||
* Pixastic Lib - Desaturation filter - v0.1.1
|
||||
* Copyright (c) 2008 Jacob Seidelin, jseidelin@nihilogic.dk, http://blog.nihilogic.dk/
|
||||
* License: [http://www.pixastic.com/lib/license.txt] (MPL 1.1)
|
||||
*/
|
||||
|
||||
var Pixastic = {};
|
||||
Pixastic.Actions = {};
|
||||
Pixastic.Actions.desaturate = {
|
||||
process : function(params) {
|
||||
var useAverage = !!(params.options.average && params.options.average != "false");
|
||||
var data = params.data;
|
||||
var rect = params.options.rect;
|
||||
var w = rect.width;
|
||||
var h = rect.height;
|
||||
|
||||
var p = w*h;
|
||||
var pix = p*4, pix1, pix2;
|
||||
|
||||
if (useAverage) {
|
||||
while (p--)
|
||||
data[pix-=4] = data[pix1=pix+1] = data[pix2=pix+2] = (data[pix]+data[pix1]+data[pix2])/3
|
||||
} else {
|
||||
while (p--)
|
||||
data[pix-=4] = data[pix1=pix+1] = data[pix2=pix+2] = (data[pix]*0.3 + data[pix1]*0.59 + data[pix2]*0.11);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
function desaturateTest() {
|
||||
var results = document.getElementById('blur-result');
|
||||
results.innerHTML = "Running test...";
|
||||
|
||||
window.setTimeout(function() {
|
||||
var canvas = document.getElementById('canvas');
|
||||
var ctx = canvas.getContext('2d');
|
||||
var img = document.getElementById('image')
|
||||
ctx.drawImage(img, 0, 0, img.width, img.height);
|
||||
|
||||
var imgData = ctx.getImageData(0, 0, canvas.width, canvas.height);
|
||||
var width = imgData.width, height = imgData.height;
|
||||
var data = imgData.data;
|
||||
|
||||
var len = data.length;
|
||||
var startTime = (new Date()).getTime();
|
||||
|
||||
var params = {
|
||||
options: {
|
||||
rect: { width: width, height: height}
|
||||
},
|
||||
data: imgData.data
|
||||
}
|
||||
Pixastic.Actions.desaturate.process(params);
|
||||
|
||||
var finishTime = Date.now() - startTime;
|
||||
for (var i = 0; i < data.length; i++) {
|
||||
imgData.data[i] = data[i];
|
||||
}
|
||||
//imgData.data = data;
|
||||
ctx.putImageData(imgData, 0, 0);
|
||||
results.innerHTML = "Finished: " + finishTime + "ms";
|
||||
}, 10);
|
||||
}
|
||||
</script>
|
||||
<p><input type="button" value="Desaturate Test" onclick="desaturateTest();"> <span id="blur-result"></span></p>
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
|
@ -0,0 +1,49 @@
|
|||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
|
||||
<meta charset=utf8>
|
||||
|
||||
<!--
|
||||
Copyright (C) 2007 Apple Inc. All rights reserved.
|
||||
Copyright (C) 2010 Mozilla Foundation
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions
|
||||
are met:
|
||||
1. Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
2. 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 APPLE COMPUTER, INC. ``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 APPLE COMPUTER, INC. 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.
|
||||
-->
|
||||
|
||||
<title>Kraken JavaScript Benchmark: Gaussian Blur</title>
|
||||
<link rel="stylesheet" href="../kraken.css">
|
||||
<script>
|
||||
|
||||
</script>
|
||||
<style> #display { border: 5px solid rgb(0,0,50);}</style>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<div id="content">
|
||||
<h2>Kraken JavaScript Benchmark: Discrete Fourier Transform</h2>
|
||||
<div id="results">
|
||||
<p>This benchmark performs a <a href="http://en.wikipedia.org/wiki/Discrete_Fourier_transform">Discrete Fourier Transform</a> on an Audio sample using code from <a href="http://github.com/corbanbrook/dsp.js/">DSP.js</a>.</p>
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
|
@ -0,0 +1,49 @@
|
|||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
|
||||
<meta charset=utf8>
|
||||
|
||||
<!--
|
||||
Copyright (C) 2007 Apple Inc. All rights reserved.
|
||||
Copyright (C) 2010 Mozilla Foundation
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions
|
||||
are met:
|
||||
1. Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
2. 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 APPLE COMPUTER, INC. ``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 APPLE COMPUTER, INC. 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.
|
||||
-->
|
||||
|
||||
<title>Kraken JavaScript Benchmark: Gaussian Blur</title>
|
||||
<link rel="stylesheet" href="../kraken.css">
|
||||
<script>
|
||||
|
||||
</script>
|
||||
<style> #display { border: 5px solid rgb(0,0,50);}</style>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<div id="content">
|
||||
<h2>Kraken JavaScript Benchmark: Fast Fourier Transform</h2>
|
||||
<div id="results">
|
||||
<p>This benchmark performs a <a href="http://en.wikipedia.org/wiki/Fast_Fourier_transform">Fast Fourier Transform</a> on an Audio sample using code from <a href="http://github.com/corbanbrook/dsp.js/">DSP.js</a>.</p>
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
|
@ -0,0 +1,139 @@
|
|||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
|
||||
<meta charset=utf8>
|
||||
|
||||
<!--
|
||||
Copyright (C) 2007 Apple Inc. All rights reserved.
|
||||
Copyright (C) 2010 Mozilla Foundation
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions
|
||||
are met:
|
||||
1. Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
2. 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 APPLE COMPUTER, INC. ``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 APPLE COMPUTER, INC. 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.
|
||||
-->
|
||||
|
||||
<title>Kraken JavaScript Benchmark: Gaussian Blur</title>
|
||||
<link rel="stylesheet" href="../kraken.css">
|
||||
<script>
|
||||
|
||||
</script>
|
||||
<style> #display { border: 5px solid rgb(0,0,50);}</style>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<div id="content">
|
||||
<h2>Kraken JavaScript Benchmark: Gaussian Blur</h2>
|
||||
<div id="results">
|
||||
<p>This benchmark performs a <a href="http://en.wikipedia.org/wiki/Gaussian_blur">Gaussian blur</a> on a photo.</p>
|
||||
<p><small>Photo courtesy <a href="http://www.flickr.com/photos/katclay/4296523922/in/photostream/">Kat Clay</a> from Flickr</small>.</p>
|
||||
<img id="image" src="squid.png" width="400" height="267">
|
||||
<canvas id="canvas" width="400" height="267"></canvas>
|
||||
<script>
|
||||
var sigma = 10; // radius
|
||||
var kernel, kernelSize, kernelSum;
|
||||
buildKernel();
|
||||
|
||||
try {
|
||||
// Opera createImageData fix
|
||||
if (!("createImageData" in CanvasRenderingContext2D.prototype)) {
|
||||
CanvasRenderingContext2D.prototype.createImageData = function(sw,sh) { return this.getImageData(0,0,sw,sh); }
|
||||
}
|
||||
} catch(e) {}
|
||||
|
||||
function buildKernel() {
|
||||
var ss = sigma * sigma;
|
||||
var factor = 2 * Math.PI * ss;
|
||||
kernel = [];
|
||||
kernel.push([]);
|
||||
var i = 0, j;
|
||||
do {
|
||||
var g = Math.exp(-(i * i) / (2 * ss)) / factor;
|
||||
if (g < 1e-3) break;
|
||||
kernel[0].push(g);
|
||||
++i;
|
||||
} while (i < 7);
|
||||
kernelSize = i;
|
||||
for (j = 1; j < kernelSize; ++j) {
|
||||
kernel.push([]);
|
||||
for (i = 0; i < kernelSize; ++i) {
|
||||
var g = Math.exp(-(i * i + j * j) / (2 * ss)) / factor;
|
||||
kernel[j].push(g);
|
||||
}
|
||||
}
|
||||
kernelSum = 0;
|
||||
for (j = 1 - kernelSize; j < kernelSize; ++j) {
|
||||
for (i = 1 - kernelSize; i < kernelSize; ++i) {
|
||||
kernelSum += kernel[Math.abs(j)][Math.abs(i)];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function blurTest() {
|
||||
var results = document.getElementById('blur-result');
|
||||
results.innerHTML = "Running test...";
|
||||
|
||||
window.setTimeout(function() {
|
||||
var canvas = document.getElementById('canvas');
|
||||
var ctx = canvas.getContext('2d');
|
||||
var img = document.getElementById('image')
|
||||
ctx.drawImage(img, 0, 0, img.width, img.height);
|
||||
|
||||
var imgData = ctx.getImageData(0, 0, canvas.width, canvas.height);
|
||||
var width = imgData.width, height = imgData.height;
|
||||
var data = imgData.data;
|
||||
|
||||
var len = data.length;
|
||||
var startTime = (new Date()).getTime();
|
||||
|
||||
for (var y = 0; y < height; ++y) {
|
||||
for (var x = 0; x < width; ++x) {
|
||||
var r = 0, g = 0, b = 0, a = 0;
|
||||
for (j = 1 - kernelSize; j < kernelSize; ++j) {
|
||||
if (y + j < 0 || y + j >= height) continue;
|
||||
for (i = 1 - kernelSize; i < kernelSize; ++i) {
|
||||
if (x + i < 0 || x + i >= width) continue;
|
||||
r += data[4 * ((y + j) * width + (x + i)) + 0] * kernel[Math.abs(j)][Math.abs(i)];
|
||||
g += data[4 * ((y + j) * width + (x + i)) + 1] * kernel[Math.abs(j)][Math.abs(i)];
|
||||
b += data[4 * ((y + j) * width + (x + i)) + 2] * kernel[Math.abs(j)][Math.abs(i)];
|
||||
a += data[4 * ((y + j) * width + (x + i)) + 3] * kernel[Math.abs(j)][Math.abs(i)];
|
||||
}
|
||||
}
|
||||
data[4 * (y * width + x) + 0] = r / kernelSum;
|
||||
data[4 * (y * width + x) + 1] = g / kernelSum;
|
||||
data[4 * (y * width + x) + 2] = b / kernelSum;
|
||||
data[4 * (y * width + x) + 3] = a / kernelSum;
|
||||
}
|
||||
}
|
||||
var finishTime = Date.now() - startTime;
|
||||
for (var i = 0; i < data.length; i++) {
|
||||
imgData.data[i] = data[i];
|
||||
}
|
||||
//imgData.data = data;
|
||||
ctx.putImageData(imgData, 0, 0);
|
||||
results.innerHTML = "Finished: " + finishTime + "ms";
|
||||
}, 10);
|
||||
}
|
||||
</script>
|
||||
<p><input type="button" value="Blur Test" onclick="blurTest();"> <span id="blur-result"></span></p>
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
|
@ -0,0 +1,154 @@
|
|||
/*!
|
||||
* jQuery JavaScript Library v1.4.2
|
||||
* http://jquery.com/
|
||||
*
|
||||
* Copyright 2010, John Resig
|
||||
* Dual licensed under the MIT or GPL Version 2 licenses.
|
||||
* http://jquery.org/license
|
||||
*
|
||||
* Includes Sizzle.js
|
||||
* http://sizzlejs.com/
|
||||
* Copyright 2010, The Dojo Foundation
|
||||
* Released under the MIT, BSD, and GPL Licenses.
|
||||
*
|
||||
* Date: Sat Feb 13 22:33:48 2010 -0500
|
||||
*/
|
||||
(function(A,w){function ma(){if(!c.isReady){try{s.documentElement.doScroll("left")}catch(a){setTimeout(ma,1);return}c.ready()}}function Qa(a,b){b.src?c.ajax({url:b.src,async:false,dataType:"script"}):c.globalEval(b.text||b.textContent||b.innerHTML||"");b.parentNode&&b.parentNode.removeChild(b)}function X(a,b,d,f,e,j){var i=a.length;if(typeof b==="object"){for(var o in b)X(a,o,b[o],f,e,d);return a}if(d!==w){f=!j&&f&&c.isFunction(d);for(o=0;o<i;o++)e(a[o],b,f?d.call(a[o],o,e(a[o],b)):d,j);return a}return i?
|
||||
e(a[0],b):w}function J(){return(new Date).getTime()}function Y(){return false}function Z(){return true}function na(a,b,d){d[0].type=a;return c.event.handle.apply(b,d)}function oa(a){var b,d=[],f=[],e=arguments,j,i,o,k,n,r;i=c.data(this,"events");if(!(a.liveFired===this||!i||!i.live||a.button&&a.type==="click")){a.liveFired=this;var u=i.live.slice(0);for(k=0;k<u.length;k++){i=u[k];i.origType.replace(O,"")===a.type?f.push(i.selector):u.splice(k--,1)}j=c(a.target).closest(f,a.currentTarget);n=0;for(r=
|
||||
j.length;n<r;n++)for(k=0;k<u.length;k++){i=u[k];if(j[n].selector===i.selector){o=j[n].elem;f=null;if(i.preType==="mouseenter"||i.preType==="mouseleave")f=c(a.relatedTarget).closest(i.selector)[0];if(!f||f!==o)d.push({elem:o,handleObj:i})}}n=0;for(r=d.length;n<r;n++){j=d[n];a.currentTarget=j.elem;a.data=j.handleObj.data;a.handleObj=j.handleObj;if(j.handleObj.origHandler.apply(j.elem,e)===false){b=false;break}}return b}}function pa(a,b){return"live."+(a&&a!=="*"?a+".":"")+b.replace(/\./g,"`").replace(/ /g,
|
||||
"&")}function qa(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function ra(a,b){var d=0;b.each(function(){if(this.nodeName===(a[d]&&a[d].nodeName)){var f=c.data(a[d++]),e=c.data(this,f);if(f=f&&f.events){delete e.handle;e.events={};for(var j in f)for(var i in f[j])c.event.add(this,j,f[j][i],f[j][i].data)}}})}function sa(a,b,d){var f,e,j;b=b&&b[0]?b[0].ownerDocument||b[0]:s;if(a.length===1&&typeof a[0]==="string"&&a[0].length<512&&b===s&&!ta.test(a[0])&&(c.support.checkClone||!ua.test(a[0]))){e=
|
||||
true;if(j=c.fragments[a[0]])if(j!==1)f=j}if(!f){f=b.createDocumentFragment();c.clean(a,b,f,d)}if(e)c.fragments[a[0]]=j?f:1;return{fragment:f,cacheable:e}}function K(a,b){var d={};c.each(va.concat.apply([],va.slice(0,b)),function(){d[this]=a});return d}function wa(a){return"scrollTo"in a&&a.document?a:a.nodeType===9?a.defaultView||a.parentWindow:false}var c=function(a,b){return new c.fn.init(a,b)},Ra=A.jQuery,Sa=A.$,s=A.document,T,Ta=/^[^<]*(<[\w\W]+>)[^>]*$|^#([\w-]+)$/,Ua=/^.[^:#\[\.,]*$/,Va=/\S/,
|
||||
Wa=/^(\s|\u00A0)+|(\s|\u00A0)+$/g,Xa=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,P=navigator.userAgent,xa=false,Q=[],L,$=Object.prototype.toString,aa=Object.prototype.hasOwnProperty,ba=Array.prototype.push,R=Array.prototype.slice,ya=Array.prototype.indexOf;c.fn=c.prototype={init:function(a,b){var d,f;if(!a)return this;if(a.nodeType){this.context=this[0]=a;this.length=1;return this}if(a==="body"&&!b){this.context=s;this[0]=s.body;this.selector="body";this.length=1;return this}if(typeof a==="string")if((d=Ta.exec(a))&&
|
||||
(d[1]||!b))if(d[1]){f=b?b.ownerDocument||b:s;if(a=Xa.exec(a))if(c.isPlainObject(b)){a=[s.createElement(a[1])];c.fn.attr.call(a,b,true)}else a=[f.createElement(a[1])];else{a=sa([d[1]],[f]);a=(a.cacheable?a.fragment.cloneNode(true):a.fragment).childNodes}return c.merge(this,a)}else{if(b=s.getElementById(d[2])){if(b.id!==d[2])return T.find(a);this.length=1;this[0]=b}this.context=s;this.selector=a;return this}else if(!b&&/^\w+$/.test(a)){this.selector=a;this.context=s;a=s.getElementsByTagName(a);return c.merge(this,
|
||||
a)}else return!b||b.jquery?(b||T).find(a):c(b).find(a);else if(c.isFunction(a))return T.ready(a);if(a.selector!==w){this.selector=a.selector;this.context=a.context}return c.makeArray(a,this)},selector:"",jquery:"1.4.2",length:0,size:function(){return this.length},toArray:function(){return R.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this.slice(a)[0]:this[a]},pushStack:function(a,b,d){var f=c();c.isArray(a)?ba.apply(f,a):c.merge(f,a);f.prevObject=this;f.context=this.context;if(b===
|
||||
"find")f.selector=this.selector+(this.selector?" ":"")+d;else if(b)f.selector=this.selector+"."+b+"("+d+")";return f},each:function(a,b){return c.each(this,a,b)},ready:function(a){c.bindReady();if(c.isReady)a.call(s,c);else Q&&Q.push(a);return this},eq:function(a){return a===-1?this.slice(a):this.slice(a,+a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(R.apply(this,arguments),"slice",R.call(arguments).join(","))},map:function(a){return this.pushStack(c.map(this,
|
||||
function(b,d){return a.call(b,d,b)}))},end:function(){return this.prevObject||c(null)},push:ba,sort:[].sort,splice:[].splice};c.fn.init.prototype=c.fn;c.extend=c.fn.extend=function(){var a=arguments[0]||{},b=1,d=arguments.length,f=false,e,j,i,o;if(typeof a==="boolean"){f=a;a=arguments[1]||{};b=2}if(typeof a!=="object"&&!c.isFunction(a))a={};if(d===b){a=this;--b}for(;b<d;b++)if((e=arguments[b])!=null)for(j in e){i=a[j];o=e[j];if(a!==o)if(f&&o&&(c.isPlainObject(o)||c.isArray(o))){i=i&&(c.isPlainObject(i)||
|
||||
c.isArray(i))?i:c.isArray(o)?[]:{};a[j]=c.extend(f,i,o)}else if(o!==w)a[j]=o}return a};c.extend({noConflict:function(a){A.$=Sa;if(a)A.jQuery=Ra;return c},isReady:false,ready:function(){if(!c.isReady){if(!s.body)return setTimeout(c.ready,13);c.isReady=true;if(Q){for(var a,b=0;a=Q[b++];)a.call(s,c);Q=null}c.fn.triggerHandler&&c(s).triggerHandler("ready")}},bindReady:function(){if(!xa){xa=true;if(s.readyState==="complete")return c.ready();if(s.addEventListener){s.addEventListener("DOMContentLoaded",
|
||||
L,false);A.addEventListener("load",c.ready,false)}else if(s.attachEvent){s.attachEvent("onreadystatechange",L);A.attachEvent("onload",c.ready);var a=false;try{a=A.frameElement==null}catch(b){}s.documentElement.doScroll&&a&&ma()}}},isFunction:function(a){return $.call(a)==="[object Function]"},isArray:function(a){return $.call(a)==="[object Array]"},isPlainObject:function(a){if(!a||$.call(a)!=="[object Object]"||a.nodeType||a.setInterval)return false;if(a.constructor&&!aa.call(a,"constructor")&&!aa.call(a.constructor.prototype,
|
||||
"isPrototypeOf"))return false;var b;for(b in a);return b===w||aa.call(a,b)},isEmptyObject:function(a){for(var b in a)return false;return true},error:function(a){throw a;},parseJSON:function(a){if(typeof a!=="string"||!a)return null;a=c.trim(a);if(/^[\],:{}\s]*$/.test(a.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,"@").replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,"]").replace(/(?:^|:|,)(?:\s*\[)+/g,"")))return A.JSON&&A.JSON.parse?A.JSON.parse(a):(new Function("return "+
|
||||
a))();else c.error("Invalid JSON: "+a)},noop:function(){},globalEval:function(a){if(a&&Va.test(a)){var b=s.getElementsByTagName("head")[0]||s.documentElement,d=s.createElement("script");d.type="text/javascript";if(c.support.scriptEval)d.appendChild(s.createTextNode(a));else d.text=a;b.insertBefore(d,b.firstChild);b.removeChild(d)}},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,b,d){var f,e=0,j=a.length,i=j===w||c.isFunction(a);if(d)if(i)for(f in a){if(b.apply(a[f],
|
||||
d)===false)break}else for(;e<j;){if(b.apply(a[e++],d)===false)break}else if(i)for(f in a){if(b.call(a[f],f,a[f])===false)break}else for(d=a[0];e<j&&b.call(d,e,d)!==false;d=a[++e]);return a},trim:function(a){return(a||"").replace(Wa,"")},makeArray:function(a,b){b=b||[];if(a!=null)a.length==null||typeof a==="string"||c.isFunction(a)||typeof a!=="function"&&a.setInterval?ba.call(b,a):c.merge(b,a);return b},inArray:function(a,b){if(b.indexOf)return b.indexOf(a);for(var d=0,f=b.length;d<f;d++)if(b[d]===
|
||||
a)return d;return-1},merge:function(a,b){var d=a.length,f=0;if(typeof b.length==="number")for(var e=b.length;f<e;f++)a[d++]=b[f];else for(;b[f]!==w;)a[d++]=b[f++];a.length=d;return a},grep:function(a,b,d){for(var f=[],e=0,j=a.length;e<j;e++)!d!==!b(a[e],e)&&f.push(a[e]);return f},map:function(a,b,d){for(var f=[],e,j=0,i=a.length;j<i;j++){e=b(a[j],j,d);if(e!=null)f[f.length]=e}return f.concat.apply([],f)},guid:1,proxy:function(a,b,d){if(arguments.length===2)if(typeof b==="string"){d=a;a=d[b];b=w}else if(b&&
|
||||
!c.isFunction(b)){d=b;b=w}if(!b&&a)b=function(){return a.apply(d||this,arguments)};if(a)b.guid=a.guid=a.guid||b.guid||c.guid++;return b},uaMatch:function(a){a=a.toLowerCase();a=/(webkit)[ \/]([\w.]+)/.exec(a)||/(opera)(?:.*version)?[ \/]([\w.]+)/.exec(a)||/(msie) ([\w.]+)/.exec(a)||!/compatible/.test(a)&&/(mozilla)(?:.*? rv:([\w.]+))?/.exec(a)||[];return{browser:a[1]||"",version:a[2]||"0"}},browser:{}});P=c.uaMatch(P);if(P.browser){c.browser[P.browser]=true;c.browser.version=P.version}if(c.browser.webkit)c.browser.safari=
|
||||
true;if(ya)c.inArray=function(a,b){return ya.call(b,a)};T=c(s);if(s.addEventListener)L=function(){s.removeEventListener("DOMContentLoaded",L,false);c.ready()};else if(s.attachEvent)L=function(){if(s.readyState==="complete"){s.detachEvent("onreadystatechange",L);c.ready()}};(function(){c.support={};var a=s.documentElement,b=s.createElement("script"),d=s.createElement("div"),f="script"+J();d.style.display="none";d.innerHTML=" <link/><table></table><a href='/a' style='color:red;float:left;opacity:.55;'>a</a><input type='checkbox'/>";
|
||||
var e=d.getElementsByTagName("*"),j=d.getElementsByTagName("a")[0];if(!(!e||!e.length||!j)){c.support={leadingWhitespace:d.firstChild.nodeType===3,tbody:!d.getElementsByTagName("tbody").length,htmlSerialize:!!d.getElementsByTagName("link").length,style:/red/.test(j.getAttribute("style")),hrefNormalized:j.getAttribute("href")==="/a",opacity:/^0.55$/.test(j.style.opacity),cssFloat:!!j.style.cssFloat,checkOn:d.getElementsByTagName("input")[0].value==="on",optSelected:s.createElement("select").appendChild(s.createElement("option")).selected,
|
||||
parentNode:d.removeChild(d.appendChild(s.createElement("div"))).parentNode===null,deleteExpando:true,checkClone:false,scriptEval:false,noCloneEvent:true,boxModel:null};b.type="text/javascript";try{b.appendChild(s.createTextNode("window."+f+"=1;"))}catch(i){}a.insertBefore(b,a.firstChild);if(A[f]){c.support.scriptEval=true;delete A[f]}try{delete b.test}catch(o){c.support.deleteExpando=false}a.removeChild(b);if(d.attachEvent&&d.fireEvent){d.attachEvent("onclick",function k(){c.support.noCloneEvent=
|
||||
false;d.detachEvent("onclick",k)});d.cloneNode(true).fireEvent("onclick")}d=s.createElement("div");d.innerHTML="<input type='radio' name='radiotest' checked='checked'/>";a=s.createDocumentFragment();a.appendChild(d.firstChild);c.support.checkClone=a.cloneNode(true).cloneNode(true).lastChild.checked;c(function(){var k=s.createElement("div");k.style.width=k.style.paddingLeft="1px";s.body.appendChild(k);c.boxModel=c.support.boxModel=k.offsetWidth===2;s.body.removeChild(k).style.display="none"});a=function(k){var n=
|
||||
s.createElement("div");k="on"+k;var r=k in n;if(!r){n.setAttribute(k,"return;");r=typeof n[k]==="function"}return r};c.support.submitBubbles=a("submit");c.support.changeBubbles=a("change");a=b=d=e=j=null}})();c.props={"for":"htmlFor","class":"className",readonly:"readOnly",maxlength:"maxLength",cellspacing:"cellSpacing",rowspan:"rowSpan",colspan:"colSpan",tabindex:"tabIndex",usemap:"useMap",frameborder:"frameBorder"};var G="jQuery"+J(),Ya=0,za={};c.extend({cache:{},expando:G,noData:{embed:true,object:true,
|
||||
applet:true},data:function(a,b,d){if(!(a.nodeName&&c.noData[a.nodeName.toLowerCase()])){a=a==A?za:a;var f=a[G],e=c.cache;if(!f&&typeof b==="string"&&d===w)return null;f||(f=++Ya);if(typeof b==="object"){a[G]=f;e[f]=c.extend(true,{},b)}else if(!e[f]){a[G]=f;e[f]={}}a=e[f];if(d!==w)a[b]=d;return typeof b==="string"?a[b]:a}},removeData:function(a,b){if(!(a.nodeName&&c.noData[a.nodeName.toLowerCase()])){a=a==A?za:a;var d=a[G],f=c.cache,e=f[d];if(b){if(e){delete e[b];c.isEmptyObject(e)&&c.removeData(a)}}else{if(c.support.deleteExpando)delete a[c.expando];
|
||||
else a.removeAttribute&&a.removeAttribute(c.expando);delete f[d]}}}});c.fn.extend({data:function(a,b){if(typeof a==="undefined"&&this.length)return c.data(this[0]);else if(typeof a==="object")return this.each(function(){c.data(this,a)});var d=a.split(".");d[1]=d[1]?"."+d[1]:"";if(b===w){var f=this.triggerHandler("getData"+d[1]+"!",[d[0]]);if(f===w&&this.length)f=c.data(this[0],a);return f===w&&d[1]?this.data(d[0]):f}else return this.trigger("setData"+d[1]+"!",[d[0],b]).each(function(){c.data(this,
|
||||
a,b)})},removeData:function(a){return this.each(function(){c.removeData(this,a)})}});c.extend({queue:function(a,b,d){if(a){b=(b||"fx")+"queue";var f=c.data(a,b);if(!d)return f||[];if(!f||c.isArray(d))f=c.data(a,b,c.makeArray(d));else f.push(d);return f}},dequeue:function(a,b){b=b||"fx";var d=c.queue(a,b),f=d.shift();if(f==="inprogress")f=d.shift();if(f){b==="fx"&&d.unshift("inprogress");f.call(a,function(){c.dequeue(a,b)})}}});c.fn.extend({queue:function(a,b){if(typeof a!=="string"){b=a;a="fx"}if(b===
|
||||
w)return c.queue(this[0],a);return this.each(function(){var d=c.queue(this,a,b);a==="fx"&&d[0]!=="inprogress"&&c.dequeue(this,a)})},dequeue:function(a){return this.each(function(){c.dequeue(this,a)})},delay:function(a,b){a=c.fx?c.fx.speeds[a]||a:a;b=b||"fx";return this.queue(b,function(){var d=this;setTimeout(function(){c.dequeue(d,b)},a)})},clearQueue:function(a){return this.queue(a||"fx",[])}});var Aa=/[\n\t]/g,ca=/\s+/,Za=/\r/g,$a=/href|src|style/,ab=/(button|input)/i,bb=/(button|input|object|select|textarea)/i,
|
||||
cb=/^(a|area)$/i,Ba=/radio|checkbox/;c.fn.extend({attr:function(a,b){return X(this,a,b,true,c.attr)},removeAttr:function(a){return this.each(function(){c.attr(this,a,"");this.nodeType===1&&this.removeAttribute(a)})},addClass:function(a){if(c.isFunction(a))return this.each(function(n){var r=c(this);r.addClass(a.call(this,n,r.attr("class")))});if(a&&typeof a==="string")for(var b=(a||"").split(ca),d=0,f=this.length;d<f;d++){var e=this[d];if(e.nodeType===1)if(e.className){for(var j=" "+e.className+" ",
|
||||
i=e.className,o=0,k=b.length;o<k;o++)if(j.indexOf(" "+b[o]+" ")<0)i+=" "+b[o];e.className=c.trim(i)}else e.className=a}return this},removeClass:function(a){if(c.isFunction(a))return this.each(function(k){var n=c(this);n.removeClass(a.call(this,k,n.attr("class")))});if(a&&typeof a==="string"||a===w)for(var b=(a||"").split(ca),d=0,f=this.length;d<f;d++){var e=this[d];if(e.nodeType===1&&e.className)if(a){for(var j=(" "+e.className+" ").replace(Aa," "),i=0,o=b.length;i<o;i++)j=j.replace(" "+b[i]+" ",
|
||||
" ");e.className=c.trim(j)}else e.className=""}return this},toggleClass:function(a,b){var d=typeof a,f=typeof b==="boolean";if(c.isFunction(a))return this.each(function(e){var j=c(this);j.toggleClass(a.call(this,e,j.attr("class"),b),b)});return this.each(function(){if(d==="string")for(var e,j=0,i=c(this),o=b,k=a.split(ca);e=k[j++];){o=f?o:!i.hasClass(e);i[o?"addClass":"removeClass"](e)}else if(d==="undefined"||d==="boolean"){this.className&&c.data(this,"__className__",this.className);this.className=
|
||||
this.className||a===false?"":c.data(this,"__className__")||""}})},hasClass:function(a){a=" "+a+" ";for(var b=0,d=this.length;b<d;b++)if((" "+this[b].className+" ").replace(Aa," ").indexOf(a)>-1)return true;return false},val:function(a){if(a===w){var b=this[0];if(b){if(c.nodeName(b,"option"))return(b.attributes.value||{}).specified?b.value:b.text;if(c.nodeName(b,"select")){var d=b.selectedIndex,f=[],e=b.options;b=b.type==="select-one";if(d<0)return null;var j=b?d:0;for(d=b?d+1:e.length;j<d;j++){var i=
|
||||
e[j];if(i.selected){a=c(i).val();if(b)return a;f.push(a)}}return f}if(Ba.test(b.type)&&!c.support.checkOn)return b.getAttribute("value")===null?"on":b.value;return(b.value||"").replace(Za,"")}return w}var o=c.isFunction(a);return this.each(function(k){var n=c(this),r=a;if(this.nodeType===1){if(o)r=a.call(this,k,n.val());if(typeof r==="number")r+="";if(c.isArray(r)&&Ba.test(this.type))this.checked=c.inArray(n.val(),r)>=0;else if(c.nodeName(this,"select")){var u=c.makeArray(r);c("option",this).each(function(){this.selected=
|
||||
c.inArray(c(this).val(),u)>=0});if(!u.length)this.selectedIndex=-1}else this.value=r}})}});c.extend({attrFn:{val:true,css:true,html:true,text:true,data:true,width:true,height:true,offset:true},attr:function(a,b,d,f){if(!a||a.nodeType===3||a.nodeType===8)return w;if(f&&b in c.attrFn)return c(a)[b](d);f=a.nodeType!==1||!c.isXMLDoc(a);var e=d!==w;b=f&&c.props[b]||b;if(a.nodeType===1){var j=$a.test(b);if(b in a&&f&&!j){if(e){b==="type"&&ab.test(a.nodeName)&&a.parentNode&&c.error("type property can't be changed");
|
||||
a[b]=d}if(c.nodeName(a,"form")&&a.getAttributeNode(b))return a.getAttributeNode(b).nodeValue;if(b==="tabIndex")return(b=a.getAttributeNode("tabIndex"))&&b.specified?b.value:bb.test(a.nodeName)||cb.test(a.nodeName)&&a.href?0:w;return a[b]}if(!c.support.style&&f&&b==="style"){if(e)a.style.cssText=""+d;return a.style.cssText}e&&a.setAttribute(b,""+d);a=!c.support.hrefNormalized&&f&&j?a.getAttribute(b,2):a.getAttribute(b);return a===null?w:a}return c.style(a,b,d)}});var O=/\.(.*)$/,db=function(a){return a.replace(/[^\w\s\.\|`]/g,
|
||||
function(b){return"\\"+b})};c.event={add:function(a,b,d,f){if(!(a.nodeType===3||a.nodeType===8)){if(a.setInterval&&a!==A&&!a.frameElement)a=A;var e,j;if(d.handler){e=d;d=e.handler}if(!d.guid)d.guid=c.guid++;if(j=c.data(a)){var i=j.events=j.events||{},o=j.handle;if(!o)j.handle=o=function(){return typeof c!=="undefined"&&!c.event.triggered?c.event.handle.apply(o.elem,arguments):w};o.elem=a;b=b.split(" ");for(var k,n=0,r;k=b[n++];){j=e?c.extend({},e):{handler:d,data:f};if(k.indexOf(".")>-1){r=k.split(".");
|
||||
k=r.shift();j.namespace=r.slice(0).sort().join(".")}else{r=[];j.namespace=""}j.type=k;j.guid=d.guid;var u=i[k],z=c.event.special[k]||{};if(!u){u=i[k]=[];if(!z.setup||z.setup.call(a,f,r,o)===false)if(a.addEventListener)a.addEventListener(k,o,false);else a.attachEvent&&a.attachEvent("on"+k,o)}if(z.add){z.add.call(a,j);if(!j.handler.guid)j.handler.guid=d.guid}u.push(j);c.event.global[k]=true}a=null}}},global:{},remove:function(a,b,d,f){if(!(a.nodeType===3||a.nodeType===8)){var e,j=0,i,o,k,n,r,u,z=c.data(a),
|
||||
C=z&&z.events;if(z&&C){if(b&&b.type){d=b.handler;b=b.type}if(!b||typeof b==="string"&&b.charAt(0)==="."){b=b||"";for(e in C)c.event.remove(a,e+b)}else{for(b=b.split(" ");e=b[j++];){n=e;i=e.indexOf(".")<0;o=[];if(!i){o=e.split(".");e=o.shift();k=new RegExp("(^|\\.)"+c.map(o.slice(0).sort(),db).join("\\.(?:.*\\.)?")+"(\\.|$)")}if(r=C[e])if(d){n=c.event.special[e]||{};for(B=f||0;B<r.length;B++){u=r[B];if(d.guid===u.guid){if(i||k.test(u.namespace)){f==null&&r.splice(B--,1);n.remove&&n.remove.call(a,u)}if(f!=
|
||||
null)break}}if(r.length===0||f!=null&&r.length===1){if(!n.teardown||n.teardown.call(a,o)===false)Ca(a,e,z.handle);delete C[e]}}else for(var B=0;B<r.length;B++){u=r[B];if(i||k.test(u.namespace)){c.event.remove(a,n,u.handler,B);r.splice(B--,1)}}}if(c.isEmptyObject(C)){if(b=z.handle)b.elem=null;delete z.events;delete z.handle;c.isEmptyObject(z)&&c.removeData(a)}}}}},trigger:function(a,b,d,f){var e=a.type||a;if(!f){a=typeof a==="object"?a[G]?a:c.extend(c.Event(e),a):c.Event(e);if(e.indexOf("!")>=0){a.type=
|
||||
e=e.slice(0,-1);a.exclusive=true}if(!d){a.stopPropagation();c.event.global[e]&&c.each(c.cache,function(){this.events&&this.events[e]&&c.event.trigger(a,b,this.handle.elem)})}if(!d||d.nodeType===3||d.nodeType===8)return w;a.result=w;a.target=d;b=c.makeArray(b);b.unshift(a)}a.currentTarget=d;(f=c.data(d,"handle"))&&f.apply(d,b);f=d.parentNode||d.ownerDocument;try{if(!(d&&d.nodeName&&c.noData[d.nodeName.toLowerCase()]))if(d["on"+e]&&d["on"+e].apply(d,b)===false)a.result=false}catch(j){}if(!a.isPropagationStopped()&&
|
||||
f)c.event.trigger(a,b,f,true);else if(!a.isDefaultPrevented()){f=a.target;var i,o=c.nodeName(f,"a")&&e==="click",k=c.event.special[e]||{};if((!k._default||k._default.call(d,a)===false)&&!o&&!(f&&f.nodeName&&c.noData[f.nodeName.toLowerCase()])){try{if(f[e]){if(i=f["on"+e])f["on"+e]=null;c.event.triggered=true;f[e]()}}catch(n){}if(i)f["on"+e]=i;c.event.triggered=false}}},handle:function(a){var b,d,f,e;a=arguments[0]=c.event.fix(a||A.event);a.currentTarget=this;b=a.type.indexOf(".")<0&&!a.exclusive;
|
||||
if(!b){d=a.type.split(".");a.type=d.shift();f=new RegExp("(^|\\.)"+d.slice(0).sort().join("\\.(?:.*\\.)?")+"(\\.|$)")}e=c.data(this,"events");d=e[a.type];if(e&&d){d=d.slice(0);e=0;for(var j=d.length;e<j;e++){var i=d[e];if(b||f.test(i.namespace)){a.handler=i.handler;a.data=i.data;a.handleObj=i;i=i.handler.apply(this,arguments);if(i!==w){a.result=i;if(i===false){a.preventDefault();a.stopPropagation()}}if(a.isImmediatePropagationStopped())break}}}return a.result},props:"altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode layerX layerY metaKey newValue offsetX offsetY originalTarget pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "),
|
||||
fix:function(a){if(a[G])return a;var b=a;a=c.Event(b);for(var d=this.props.length,f;d;){f=this.props[--d];a[f]=b[f]}if(!a.target)a.target=a.srcElement||s;if(a.target.nodeType===3)a.target=a.target.parentNode;if(!a.relatedTarget&&a.fromElement)a.relatedTarget=a.fromElement===a.target?a.toElement:a.fromElement;if(a.pageX==null&&a.clientX!=null){b=s.documentElement;d=s.body;a.pageX=a.clientX+(b&&b.scrollLeft||d&&d.scrollLeft||0)-(b&&b.clientLeft||d&&d.clientLeft||0);a.pageY=a.clientY+(b&&b.scrollTop||
|
||||
d&&d.scrollTop||0)-(b&&b.clientTop||d&&d.clientTop||0)}if(!a.which&&(a.charCode||a.charCode===0?a.charCode:a.keyCode))a.which=a.charCode||a.keyCode;if(!a.metaKey&&a.ctrlKey)a.metaKey=a.ctrlKey;if(!a.which&&a.button!==w)a.which=a.button&1?1:a.button&2?3:a.button&4?2:0;return a},guid:1E8,proxy:c.proxy,special:{ready:{setup:c.bindReady,teardown:c.noop},live:{add:function(a){c.event.add(this,a.origType,c.extend({},a,{handler:oa}))},remove:function(a){var b=true,d=a.origType.replace(O,"");c.each(c.data(this,
|
||||
"events").live||[],function(){if(d===this.origType.replace(O,""))return b=false});b&&c.event.remove(this,a.origType,oa)}},beforeunload:{setup:function(a,b,d){if(this.setInterval)this.onbeforeunload=d;return false},teardown:function(a,b){if(this.onbeforeunload===b)this.onbeforeunload=null}}}};var Ca=s.removeEventListener?function(a,b,d){a.removeEventListener(b,d,false)}:function(a,b,d){a.detachEvent("on"+b,d)};c.Event=function(a){if(!this.preventDefault)return new c.Event(a);if(a&&a.type){this.originalEvent=
|
||||
a;this.type=a.type}else this.type=a;this.timeStamp=J();this[G]=true};c.Event.prototype={preventDefault:function(){this.isDefaultPrevented=Z;var a=this.originalEvent;if(a){a.preventDefault&&a.preventDefault();a.returnValue=false}},stopPropagation:function(){this.isPropagationStopped=Z;var a=this.originalEvent;if(a){a.stopPropagation&&a.stopPropagation();a.cancelBubble=true}},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=Z;this.stopPropagation()},isDefaultPrevented:Y,isPropagationStopped:Y,
|
||||
isImmediatePropagationStopped:Y};var Da=function(a){var b=a.relatedTarget;try{for(;b&&b!==this;)b=b.parentNode;if(b!==this){a.type=a.data;c.event.handle.apply(this,arguments)}}catch(d){}},Ea=function(a){a.type=a.data;c.event.handle.apply(this,arguments)};c.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(a,b){c.event.special[a]={setup:function(d){c.event.add(this,b,d&&d.selector?Ea:Da,a)},teardown:function(d){c.event.remove(this,b,d&&d.selector?Ea:Da)}}});if(!c.support.submitBubbles)c.event.special.submit=
|
||||
{setup:function(){if(this.nodeName.toLowerCase()!=="form"){c.event.add(this,"click.specialSubmit",function(a){var b=a.target,d=b.type;if((d==="submit"||d==="image")&&c(b).closest("form").length)return na("submit",this,arguments)});c.event.add(this,"keypress.specialSubmit",function(a){var b=a.target,d=b.type;if((d==="text"||d==="password")&&c(b).closest("form").length&&a.keyCode===13)return na("submit",this,arguments)})}else return false},teardown:function(){c.event.remove(this,".specialSubmit")}};
|
||||
if(!c.support.changeBubbles){var da=/textarea|input|select/i,ea,Fa=function(a){var b=a.type,d=a.value;if(b==="radio"||b==="checkbox")d=a.checked;else if(b==="select-multiple")d=a.selectedIndex>-1?c.map(a.options,function(f){return f.selected}).join("-"):"";else if(a.nodeName.toLowerCase()==="select")d=a.selectedIndex;return d},fa=function(a,b){var d=a.target,f,e;if(!(!da.test(d.nodeName)||d.readOnly)){f=c.data(d,"_change_data");e=Fa(d);if(a.type!=="focusout"||d.type!=="radio")c.data(d,"_change_data",
|
||||
e);if(!(f===w||e===f))if(f!=null||e){a.type="change";return c.event.trigger(a,b,d)}}};c.event.special.change={filters:{focusout:fa,click:function(a){var b=a.target,d=b.type;if(d==="radio"||d==="checkbox"||b.nodeName.toLowerCase()==="select")return fa.call(this,a)},keydown:function(a){var b=a.target,d=b.type;if(a.keyCode===13&&b.nodeName.toLowerCase()!=="textarea"||a.keyCode===32&&(d==="checkbox"||d==="radio")||d==="select-multiple")return fa.call(this,a)},beforeactivate:function(a){a=a.target;c.data(a,
|
||||
"_change_data",Fa(a))}},setup:function(){if(this.type==="file")return false;for(var a in ea)c.event.add(this,a+".specialChange",ea[a]);return da.test(this.nodeName)},teardown:function(){c.event.remove(this,".specialChange");return da.test(this.nodeName)}};ea=c.event.special.change.filters}s.addEventListener&&c.each({focus:"focusin",blur:"focusout"},function(a,b){function d(f){f=c.event.fix(f);f.type=b;return c.event.handle.call(this,f)}c.event.special[b]={setup:function(){this.addEventListener(a,
|
||||
d,true)},teardown:function(){this.removeEventListener(a,d,true)}}});c.each(["bind","one"],function(a,b){c.fn[b]=function(d,f,e){if(typeof d==="object"){for(var j in d)this[b](j,f,d[j],e);return this}if(c.isFunction(f)){e=f;f=w}var i=b==="one"?c.proxy(e,function(k){c(this).unbind(k,i);return e.apply(this,arguments)}):e;if(d==="unload"&&b!=="one")this.one(d,f,e);else{j=0;for(var o=this.length;j<o;j++)c.event.add(this[j],d,i,f)}return this}});c.fn.extend({unbind:function(a,b){if(typeof a==="object"&&
|
||||
!a.preventDefault)for(var d in a)this.unbind(d,a[d]);else{d=0;for(var f=this.length;d<f;d++)c.event.remove(this[d],a,b)}return this},delegate:function(a,b,d,f){return this.live(b,d,f,a)},undelegate:function(a,b,d){return arguments.length===0?this.unbind("live"):this.die(b,null,d,a)},trigger:function(a,b){return this.each(function(){c.event.trigger(a,b,this)})},triggerHandler:function(a,b){if(this[0]){a=c.Event(a);a.preventDefault();a.stopPropagation();c.event.trigger(a,b,this[0]);return a.result}},
|
||||
toggle:function(a){for(var b=arguments,d=1;d<b.length;)c.proxy(a,b[d++]);return this.click(c.proxy(a,function(f){var e=(c.data(this,"lastToggle"+a.guid)||0)%d;c.data(this,"lastToggle"+a.guid,e+1);f.preventDefault();return b[e].apply(this,arguments)||false}))},hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}});var Ga={focus:"focusin",blur:"focusout",mouseenter:"mouseover",mouseleave:"mouseout"};c.each(["live","die"],function(a,b){c.fn[b]=function(d,f,e,j){var i,o=0,k,n,r=j||this.selector,
|
||||
u=j?this:c(this.context);if(c.isFunction(f)){e=f;f=w}for(d=(d||"").split(" ");(i=d[o++])!=null;){j=O.exec(i);k="";if(j){k=j[0];i=i.replace(O,"")}if(i==="hover")d.push("mouseenter"+k,"mouseleave"+k);else{n=i;if(i==="focus"||i==="blur"){d.push(Ga[i]+k);i+=k}else i=(Ga[i]||i)+k;b==="live"?u.each(function(){c.event.add(this,pa(i,r),{data:f,selector:r,handler:e,origType:i,origHandler:e,preType:n})}):u.unbind(pa(i,r),e)}}return this}});c.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error".split(" "),
|
||||
function(a,b){c.fn[b]=function(d){return d?this.bind(b,d):this.trigger(b)};if(c.attrFn)c.attrFn[b]=true});A.attachEvent&&!A.addEventListener&&A.attachEvent("onunload",function(){for(var a in c.cache)if(c.cache[a].handle)try{c.event.remove(c.cache[a].handle.elem)}catch(b){}});(function(){function a(g){for(var h="",l,m=0;g[m];m++){l=g[m];if(l.nodeType===3||l.nodeType===4)h+=l.nodeValue;else if(l.nodeType!==8)h+=a(l.childNodes)}return h}function b(g,h,l,m,q,p){q=0;for(var v=m.length;q<v;q++){var t=m[q];
|
||||
if(t){t=t[g];for(var y=false;t;){if(t.sizcache===l){y=m[t.sizset];break}if(t.nodeType===1&&!p){t.sizcache=l;t.sizset=q}if(t.nodeName.toLowerCase()===h){y=t;break}t=t[g]}m[q]=y}}}function d(g,h,l,m,q,p){q=0;for(var v=m.length;q<v;q++){var t=m[q];if(t){t=t[g];for(var y=false;t;){if(t.sizcache===l){y=m[t.sizset];break}if(t.nodeType===1){if(!p){t.sizcache=l;t.sizset=q}if(typeof h!=="string"){if(t===h){y=true;break}}else if(k.filter(h,[t]).length>0){y=t;break}}t=t[g]}m[q]=y}}}var f=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|['"][^'"]*['"]|[^[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,
|
||||
e=0,j=Object.prototype.toString,i=false,o=true;[0,0].sort(function(){o=false;return 0});var k=function(g,h,l,m){l=l||[];var q=h=h||s;if(h.nodeType!==1&&h.nodeType!==9)return[];if(!g||typeof g!=="string")return l;for(var p=[],v,t,y,S,H=true,M=x(h),I=g;(f.exec(""),v=f.exec(I))!==null;){I=v[3];p.push(v[1]);if(v[2]){S=v[3];break}}if(p.length>1&&r.exec(g))if(p.length===2&&n.relative[p[0]])t=ga(p[0]+p[1],h);else for(t=n.relative[p[0]]?[h]:k(p.shift(),h);p.length;){g=p.shift();if(n.relative[g])g+=p.shift();
|
||||
t=ga(g,t)}else{if(!m&&p.length>1&&h.nodeType===9&&!M&&n.match.ID.test(p[0])&&!n.match.ID.test(p[p.length-1])){v=k.find(p.shift(),h,M);h=v.expr?k.filter(v.expr,v.set)[0]:v.set[0]}if(h){v=m?{expr:p.pop(),set:z(m)}:k.find(p.pop(),p.length===1&&(p[0]==="~"||p[0]==="+")&&h.parentNode?h.parentNode:h,M);t=v.expr?k.filter(v.expr,v.set):v.set;if(p.length>0)y=z(t);else H=false;for(;p.length;){var D=p.pop();v=D;if(n.relative[D])v=p.pop();else D="";if(v==null)v=h;n.relative[D](y,v,M)}}else y=[]}y||(y=t);y||k.error(D||
|
||||
g);if(j.call(y)==="[object Array]")if(H)if(h&&h.nodeType===1)for(g=0;y[g]!=null;g++){if(y[g]&&(y[g]===true||y[g].nodeType===1&&E(h,y[g])))l.push(t[g])}else for(g=0;y[g]!=null;g++)y[g]&&y[g].nodeType===1&&l.push(t[g]);else l.push.apply(l,y);else z(y,l);if(S){k(S,q,l,m);k.uniqueSort(l)}return l};k.uniqueSort=function(g){if(B){i=o;g.sort(B);if(i)for(var h=1;h<g.length;h++)g[h]===g[h-1]&&g.splice(h--,1)}return g};k.matches=function(g,h){return k(g,null,null,h)};k.find=function(g,h,l){var m,q;if(!g)return[];
|
||||
for(var p=0,v=n.order.length;p<v;p++){var t=n.order[p];if(q=n.leftMatch[t].exec(g)){var y=q[1];q.splice(1,1);if(y.substr(y.length-1)!=="\\"){q[1]=(q[1]||"").replace(/\\/g,"");m=n.find[t](q,h,l);if(m!=null){g=g.replace(n.match[t],"");break}}}}m||(m=h.getElementsByTagName("*"));return{set:m,expr:g}};k.filter=function(g,h,l,m){for(var q=g,p=[],v=h,t,y,S=h&&h[0]&&x(h[0]);g&&h.length;){for(var H in n.filter)if((t=n.leftMatch[H].exec(g))!=null&&t[2]){var M=n.filter[H],I,D;D=t[1];y=false;t.splice(1,1);if(D.substr(D.length-
|
||||
1)!=="\\"){if(v===p)p=[];if(n.preFilter[H])if(t=n.preFilter[H](t,v,l,p,m,S)){if(t===true)continue}else y=I=true;if(t)for(var U=0;(D=v[U])!=null;U++)if(D){I=M(D,t,U,v);var Ha=m^!!I;if(l&&I!=null)if(Ha)y=true;else v[U]=false;else if(Ha){p.push(D);y=true}}if(I!==w){l||(v=p);g=g.replace(n.match[H],"");if(!y)return[];break}}}if(g===q)if(y==null)k.error(g);else break;q=g}return v};k.error=function(g){throw"Syntax error, unrecognized expression: "+g;};var n=k.selectors={order:["ID","NAME","TAG"],match:{ID:/#((?:[\w\u00c0-\uFFFF-]|\\.)+)/,
|
||||
CLASS:/\.((?:[\w\u00c0-\uFFFF-]|\\.)+)/,NAME:/\[name=['"]*((?:[\w\u00c0-\uFFFF-]|\\.)+)['"]*\]/,ATTR:/\[\s*((?:[\w\u00c0-\uFFFF-]|\\.)+)\s*(?:(\S?=)\s*(['"]*)(.*?)\3|)\s*\]/,TAG:/^((?:[\w\u00c0-\uFFFF\*-]|\\.)+)/,CHILD:/:(only|nth|last|first)-child(?:\((even|odd|[\dn+-]*)\))?/,POS:/:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^-]|$)/,PSEUDO:/:((?:[\w\u00c0-\uFFFF-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/},leftMatch:{},attrMap:{"class":"className","for":"htmlFor"},attrHandle:{href:function(g){return g.getAttribute("href")}},
|
||||
relative:{"+":function(g,h){var l=typeof h==="string",m=l&&!/\W/.test(h);l=l&&!m;if(m)h=h.toLowerCase();m=0;for(var q=g.length,p;m<q;m++)if(p=g[m]){for(;(p=p.previousSibling)&&p.nodeType!==1;);g[m]=l||p&&p.nodeName.toLowerCase()===h?p||false:p===h}l&&k.filter(h,g,true)},">":function(g,h){var l=typeof h==="string";if(l&&!/\W/.test(h)){h=h.toLowerCase();for(var m=0,q=g.length;m<q;m++){var p=g[m];if(p){l=p.parentNode;g[m]=l.nodeName.toLowerCase()===h?l:false}}}else{m=0;for(q=g.length;m<q;m++)if(p=g[m])g[m]=
|
||||
l?p.parentNode:p.parentNode===h;l&&k.filter(h,g,true)}},"":function(g,h,l){var m=e++,q=d;if(typeof h==="string"&&!/\W/.test(h)){var p=h=h.toLowerCase();q=b}q("parentNode",h,m,g,p,l)},"~":function(g,h,l){var m=e++,q=d;if(typeof h==="string"&&!/\W/.test(h)){var p=h=h.toLowerCase();q=b}q("previousSibling",h,m,g,p,l)}},find:{ID:function(g,h,l){if(typeof h.getElementById!=="undefined"&&!l)return(g=h.getElementById(g[1]))?[g]:[]},NAME:function(g,h){if(typeof h.getElementsByName!=="undefined"){var l=[];
|
||||
h=h.getElementsByName(g[1]);for(var m=0,q=h.length;m<q;m++)h[m].getAttribute("name")===g[1]&&l.push(h[m]);return l.length===0?null:l}},TAG:function(g,h){return h.getElementsByTagName(g[1])}},preFilter:{CLASS:function(g,h,l,m,q,p){g=" "+g[1].replace(/\\/g,"")+" ";if(p)return g;p=0;for(var v;(v=h[p])!=null;p++)if(v)if(q^(v.className&&(" "+v.className+" ").replace(/[\t\n]/g," ").indexOf(g)>=0))l||m.push(v);else if(l)h[p]=false;return false},ID:function(g){return g[1].replace(/\\/g,"")},TAG:function(g){return g[1].toLowerCase()},
|
||||
CHILD:function(g){if(g[1]==="nth"){var h=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(g[2]==="even"&&"2n"||g[2]==="odd"&&"2n+1"||!/\D/.test(g[2])&&"0n+"+g[2]||g[2]);g[2]=h[1]+(h[2]||1)-0;g[3]=h[3]-0}g[0]=e++;return g},ATTR:function(g,h,l,m,q,p){h=g[1].replace(/\\/g,"");if(!p&&n.attrMap[h])g[1]=n.attrMap[h];if(g[2]==="~=")g[4]=" "+g[4]+" ";return g},PSEUDO:function(g,h,l,m,q){if(g[1]==="not")if((f.exec(g[3])||"").length>1||/^\w/.test(g[3]))g[3]=k(g[3],null,null,h);else{g=k.filter(g[3],h,l,true^q);l||m.push.apply(m,
|
||||
g);return false}else if(n.match.POS.test(g[0])||n.match.CHILD.test(g[0]))return true;return g},POS:function(g){g.unshift(true);return g}},filters:{enabled:function(g){return g.disabled===false&&g.type!=="hidden"},disabled:function(g){return g.disabled===true},checked:function(g){return g.checked===true},selected:function(g){return g.selected===true},parent:function(g){return!!g.firstChild},empty:function(g){return!g.firstChild},has:function(g,h,l){return!!k(l[3],g).length},header:function(g){return/h\d/i.test(g.nodeName)},
|
||||
text:function(g){return"text"===g.type},radio:function(g){return"radio"===g.type},checkbox:function(g){return"checkbox"===g.type},file:function(g){return"file"===g.type},password:function(g){return"password"===g.type},submit:function(g){return"submit"===g.type},image:function(g){return"image"===g.type},reset:function(g){return"reset"===g.type},button:function(g){return"button"===g.type||g.nodeName.toLowerCase()==="button"},input:function(g){return/input|select|textarea|button/i.test(g.nodeName)}},
|
||||
setFilters:{first:function(g,h){return h===0},last:function(g,h,l,m){return h===m.length-1},even:function(g,h){return h%2===0},odd:function(g,h){return h%2===1},lt:function(g,h,l){return h<l[3]-0},gt:function(g,h,l){return h>l[3]-0},nth:function(g,h,l){return l[3]-0===h},eq:function(g,h,l){return l[3]-0===h}},filter:{PSEUDO:function(g,h,l,m){var q=h[1],p=n.filters[q];if(p)return p(g,l,h,m);else if(q==="contains")return(g.textContent||g.innerText||a([g])||"").indexOf(h[3])>=0;else if(q==="not"){h=
|
||||
h[3];l=0;for(m=h.length;l<m;l++)if(h[l]===g)return false;return true}else k.error("Syntax error, unrecognized expression: "+q)},CHILD:function(g,h){var l=h[1],m=g;switch(l){case "only":case "first":for(;m=m.previousSibling;)if(m.nodeType===1)return false;if(l==="first")return true;m=g;case "last":for(;m=m.nextSibling;)if(m.nodeType===1)return false;return true;case "nth":l=h[2];var q=h[3];if(l===1&&q===0)return true;h=h[0];var p=g.parentNode;if(p&&(p.sizcache!==h||!g.nodeIndex)){var v=0;for(m=p.firstChild;m;m=
|
||||
m.nextSibling)if(m.nodeType===1)m.nodeIndex=++v;p.sizcache=h}g=g.nodeIndex-q;return l===0?g===0:g%l===0&&g/l>=0}},ID:function(g,h){return g.nodeType===1&&g.getAttribute("id")===h},TAG:function(g,h){return h==="*"&&g.nodeType===1||g.nodeName.toLowerCase()===h},CLASS:function(g,h){return(" "+(g.className||g.getAttribute("class"))+" ").indexOf(h)>-1},ATTR:function(g,h){var l=h[1];g=n.attrHandle[l]?n.attrHandle[l](g):g[l]!=null?g[l]:g.getAttribute(l);l=g+"";var m=h[2];h=h[4];return g==null?m==="!=":m===
|
||||
"="?l===h:m==="*="?l.indexOf(h)>=0:m==="~="?(" "+l+" ").indexOf(h)>=0:!h?l&&g!==false:m==="!="?l!==h:m==="^="?l.indexOf(h)===0:m==="$="?l.substr(l.length-h.length)===h:m==="|="?l===h||l.substr(0,h.length+1)===h+"-":false},POS:function(g,h,l,m){var q=n.setFilters[h[2]];if(q)return q(g,l,h,m)}}},r=n.match.POS;for(var u in n.match){n.match[u]=new RegExp(n.match[u].source+/(?![^\[]*\])(?![^\(]*\))/.source);n.leftMatch[u]=new RegExp(/(^(?:.|\r|\n)*?)/.source+n.match[u].source.replace(/\\(\d+)/g,function(g,
|
||||
h){return"\\"+(h-0+1)}))}var z=function(g,h){g=Array.prototype.slice.call(g,0);if(h){h.push.apply(h,g);return h}return g};try{Array.prototype.slice.call(s.documentElement.childNodes,0)}catch(C){z=function(g,h){h=h||[];if(j.call(g)==="[object Array]")Array.prototype.push.apply(h,g);else if(typeof g.length==="number")for(var l=0,m=g.length;l<m;l++)h.push(g[l]);else for(l=0;g[l];l++)h.push(g[l]);return h}}var B;if(s.documentElement.compareDocumentPosition)B=function(g,h){if(!g.compareDocumentPosition||
|
||||
!h.compareDocumentPosition){if(g==h)i=true;return g.compareDocumentPosition?-1:1}g=g.compareDocumentPosition(h)&4?-1:g===h?0:1;if(g===0)i=true;return g};else if("sourceIndex"in s.documentElement)B=function(g,h){if(!g.sourceIndex||!h.sourceIndex){if(g==h)i=true;return g.sourceIndex?-1:1}g=g.sourceIndex-h.sourceIndex;if(g===0)i=true;return g};else if(s.createRange)B=function(g,h){if(!g.ownerDocument||!h.ownerDocument){if(g==h)i=true;return g.ownerDocument?-1:1}var l=g.ownerDocument.createRange(),m=
|
||||
h.ownerDocument.createRange();l.setStart(g,0);l.setEnd(g,0);m.setStart(h,0);m.setEnd(h,0);g=l.compareBoundaryPoints(Range.START_TO_END,m);if(g===0)i=true;return g};(function(){var g=s.createElement("div"),h="script"+(new Date).getTime();g.innerHTML="<a name='"+h+"'/>";var l=s.documentElement;l.insertBefore(g,l.firstChild);if(s.getElementById(h)){n.find.ID=function(m,q,p){if(typeof q.getElementById!=="undefined"&&!p)return(q=q.getElementById(m[1]))?q.id===m[1]||typeof q.getAttributeNode!=="undefined"&&
|
||||
q.getAttributeNode("id").nodeValue===m[1]?[q]:w:[]};n.filter.ID=function(m,q){var p=typeof m.getAttributeNode!=="undefined"&&m.getAttributeNode("id");return m.nodeType===1&&p&&p.nodeValue===q}}l.removeChild(g);l=g=null})();(function(){var g=s.createElement("div");g.appendChild(s.createComment(""));if(g.getElementsByTagName("*").length>0)n.find.TAG=function(h,l){l=l.getElementsByTagName(h[1]);if(h[1]==="*"){h=[];for(var m=0;l[m];m++)l[m].nodeType===1&&h.push(l[m]);l=h}return l};g.innerHTML="<a href='#'></a>";
|
||||
if(g.firstChild&&typeof g.firstChild.getAttribute!=="undefined"&&g.firstChild.getAttribute("href")!=="#")n.attrHandle.href=function(h){return h.getAttribute("href",2)};g=null})();s.querySelectorAll&&function(){var g=k,h=s.createElement("div");h.innerHTML="<p class='TEST'></p>";if(!(h.querySelectorAll&&h.querySelectorAll(".TEST").length===0)){k=function(m,q,p,v){q=q||s;if(!v&&q.nodeType===9&&!x(q))try{return z(q.querySelectorAll(m),p)}catch(t){}return g(m,q,p,v)};for(var l in g)k[l]=g[l];h=null}}();
|
||||
(function(){var g=s.createElement("div");g.innerHTML="<div class='test e'></div><div class='test'></div>";if(!(!g.getElementsByClassName||g.getElementsByClassName("e").length===0)){g.lastChild.className="e";if(g.getElementsByClassName("e").length!==1){n.order.splice(1,0,"CLASS");n.find.CLASS=function(h,l,m){if(typeof l.getElementsByClassName!=="undefined"&&!m)return l.getElementsByClassName(h[1])};g=null}}})();var E=s.compareDocumentPosition?function(g,h){return!!(g.compareDocumentPosition(h)&16)}:
|
||||
function(g,h){return g!==h&&(g.contains?g.contains(h):true)},x=function(g){return(g=(g?g.ownerDocument||g:0).documentElement)?g.nodeName!=="HTML":false},ga=function(g,h){var l=[],m="",q;for(h=h.nodeType?[h]:h;q=n.match.PSEUDO.exec(g);){m+=q[0];g=g.replace(n.match.PSEUDO,"")}g=n.relative[g]?g+"*":g;q=0;for(var p=h.length;q<p;q++)k(g,h[q],l);return k.filter(m,l)};c.find=k;c.expr=k.selectors;c.expr[":"]=c.expr.filters;c.unique=k.uniqueSort;c.text=a;c.isXMLDoc=x;c.contains=E})();var eb=/Until$/,fb=/^(?:parents|prevUntil|prevAll)/,
|
||||
gb=/,/;R=Array.prototype.slice;var Ia=function(a,b,d){if(c.isFunction(b))return c.grep(a,function(e,j){return!!b.call(e,j,e)===d});else if(b.nodeType)return c.grep(a,function(e){return e===b===d});else if(typeof b==="string"){var f=c.grep(a,function(e){return e.nodeType===1});if(Ua.test(b))return c.filter(b,f,!d);else b=c.filter(b,f)}return c.grep(a,function(e){return c.inArray(e,b)>=0===d})};c.fn.extend({find:function(a){for(var b=this.pushStack("","find",a),d=0,f=0,e=this.length;f<e;f++){d=b.length;
|
||||
c.find(a,this[f],b);if(f>0)for(var j=d;j<b.length;j++)for(var i=0;i<d;i++)if(b[i]===b[j]){b.splice(j--,1);break}}return b},has:function(a){var b=c(a);return this.filter(function(){for(var d=0,f=b.length;d<f;d++)if(c.contains(this,b[d]))return true})},not:function(a){return this.pushStack(Ia(this,a,false),"not",a)},filter:function(a){return this.pushStack(Ia(this,a,true),"filter",a)},is:function(a){return!!a&&c.filter(a,this).length>0},closest:function(a,b){if(c.isArray(a)){var d=[],f=this[0],e,j=
|
||||
{},i;if(f&&a.length){e=0;for(var o=a.length;e<o;e++){i=a[e];j[i]||(j[i]=c.expr.match.POS.test(i)?c(i,b||this.context):i)}for(;f&&f.ownerDocument&&f!==b;){for(i in j){e=j[i];if(e.jquery?e.index(f)>-1:c(f).is(e)){d.push({selector:i,elem:f});delete j[i]}}f=f.parentNode}}return d}var k=c.expr.match.POS.test(a)?c(a,b||this.context):null;return this.map(function(n,r){for(;r&&r.ownerDocument&&r!==b;){if(k?k.index(r)>-1:c(r).is(a))return r;r=r.parentNode}return null})},index:function(a){if(!a||typeof a===
|
||||
"string")return c.inArray(this[0],a?c(a):this.parent().children());return c.inArray(a.jquery?a[0]:a,this)},add:function(a,b){a=typeof a==="string"?c(a,b||this.context):c.makeArray(a);b=c.merge(this.get(),a);return this.pushStack(qa(a[0])||qa(b[0])?b:c.unique(b))},andSelf:function(){return this.add(this.prevObject)}});c.each({parent:function(a){return(a=a.parentNode)&&a.nodeType!==11?a:null},parents:function(a){return c.dir(a,"parentNode")},parentsUntil:function(a,b,d){return c.dir(a,"parentNode",
|
||||
d)},next:function(a){return c.nth(a,2,"nextSibling")},prev:function(a){return c.nth(a,2,"previousSibling")},nextAll:function(a){return c.dir(a,"nextSibling")},prevAll:function(a){return c.dir(a,"previousSibling")},nextUntil:function(a,b,d){return c.dir(a,"nextSibling",d)},prevUntil:function(a,b,d){return c.dir(a,"previousSibling",d)},siblings:function(a){return c.sibling(a.parentNode.firstChild,a)},children:function(a){return c.sibling(a.firstChild)},contents:function(a){return c.nodeName(a,"iframe")?
|
||||
a.contentDocument||a.contentWindow.document:c.makeArray(a.childNodes)}},function(a,b){c.fn[a]=function(d,f){var e=c.map(this,b,d);eb.test(a)||(f=d);if(f&&typeof f==="string")e=c.filter(f,e);e=this.length>1?c.unique(e):e;if((this.length>1||gb.test(f))&&fb.test(a))e=e.reverse();return this.pushStack(e,a,R.call(arguments).join(","))}});c.extend({filter:function(a,b,d){if(d)a=":not("+a+")";return c.find.matches(a,b)},dir:function(a,b,d){var f=[];for(a=a[b];a&&a.nodeType!==9&&(d===w||a.nodeType!==1||!c(a).is(d));){a.nodeType===
|
||||
1&&f.push(a);a=a[b]}return f},nth:function(a,b,d){b=b||1;for(var f=0;a;a=a[d])if(a.nodeType===1&&++f===b)break;return a},sibling:function(a,b){for(var d=[];a;a=a.nextSibling)a.nodeType===1&&a!==b&&d.push(a);return d}});var Ja=/ jQuery\d+="(?:\d+|null)"/g,V=/^\s+/,Ka=/(<([\w:]+)[^>]*?)\/>/g,hb=/^(?:area|br|col|embed|hr|img|input|link|meta|param)$/i,La=/<([\w:]+)/,ib=/<tbody/i,jb=/<|&#?\w+;/,ta=/<script|<object|<embed|<option|<style/i,ua=/checked\s*(?:[^=]|=\s*.checked.)/i,Ma=function(a,b,d){return hb.test(d)?
|
||||
a:b+"></"+d+">"},F={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],area:[1,"<map>","</map>"],_default:[0,"",""]};F.optgroup=F.option;F.tbody=F.tfoot=F.colgroup=F.caption=F.thead;F.th=F.td;if(!c.support.htmlSerialize)F._default=[1,"div<div>","</div>"];c.fn.extend({text:function(a){if(c.isFunction(a))return this.each(function(b){var d=
|
||||
c(this);d.text(a.call(this,b,d.text()))});if(typeof a!=="object"&&a!==w)return this.empty().append((this[0]&&this[0].ownerDocument||s).createTextNode(a));return c.text(this)},wrapAll:function(a){if(c.isFunction(a))return this.each(function(d){c(this).wrapAll(a.call(this,d))});if(this[0]){var b=c(a,this[0].ownerDocument).eq(0).clone(true);this[0].parentNode&&b.insertBefore(this[0]);b.map(function(){for(var d=this;d.firstChild&&d.firstChild.nodeType===1;)d=d.firstChild;return d}).append(this)}return this},
|
||||
wrapInner:function(a){if(c.isFunction(a))return this.each(function(b){c(this).wrapInner(a.call(this,b))});return this.each(function(){var b=c(this),d=b.contents();d.length?d.wrapAll(a):b.append(a)})},wrap:function(a){return this.each(function(){c(this).wrapAll(a)})},unwrap:function(){return this.parent().each(function(){c.nodeName(this,"body")||c(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,true,function(a){this.nodeType===1&&this.appendChild(a)})},
|
||||
prepend:function(){return this.domManip(arguments,true,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,false,function(b){this.parentNode.insertBefore(b,this)});else if(arguments.length){var a=c(arguments[0]);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,false,function(b){this.parentNode.insertBefore(b,
|
||||
this.nextSibling)});else if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,c(arguments[0]).toArray());return a}},remove:function(a,b){for(var d=0,f;(f=this[d])!=null;d++)if(!a||c.filter(a,[f]).length){if(!b&&f.nodeType===1){c.cleanData(f.getElementsByTagName("*"));c.cleanData([f])}f.parentNode&&f.parentNode.removeChild(f)}return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++)for(b.nodeType===1&&c.cleanData(b.getElementsByTagName("*"));b.firstChild;)b.removeChild(b.firstChild);
|
||||
return this},clone:function(a){var b=this.map(function(){if(!c.support.noCloneEvent&&!c.isXMLDoc(this)){var d=this.outerHTML,f=this.ownerDocument;if(!d){d=f.createElement("div");d.appendChild(this.cloneNode(true));d=d.innerHTML}return c.clean([d.replace(Ja,"").replace(/=([^="'>\s]+\/)>/g,'="$1">').replace(V,"")],f)[0]}else return this.cloneNode(true)});if(a===true){ra(this,b);ra(this.find("*"),b.find("*"))}return b},html:function(a){if(a===w)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(Ja,
|
||||
""):null;else if(typeof a==="string"&&!ta.test(a)&&(c.support.leadingWhitespace||!V.test(a))&&!F[(La.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Ka,Ma);try{for(var b=0,d=this.length;b<d;b++)if(this[b].nodeType===1){c.cleanData(this[b].getElementsByTagName("*"));this[b].innerHTML=a}}catch(f){this.empty().append(a)}}else c.isFunction(a)?this.each(function(e){var j=c(this),i=j.html();j.empty().append(function(){return a.call(this,e,i)})}):this.empty().append(a);return this},replaceWith:function(a){if(this[0]&&
|
||||
this[0].parentNode){if(c.isFunction(a))return this.each(function(b){var d=c(this),f=d.html();d.replaceWith(a.call(this,b,f))});if(typeof a!=="string")a=c(a).detach();return this.each(function(){var b=this.nextSibling,d=this.parentNode;c(this).remove();b?c(b).before(a):c(d).append(a)})}else return this.pushStack(c(c.isFunction(a)?a():a),"replaceWith",a)},detach:function(a){return this.remove(a,true)},domManip:function(a,b,d){function f(u){return c.nodeName(u,"table")?u.getElementsByTagName("tbody")[0]||
|
||||
u.appendChild(u.ownerDocument.createElement("tbody")):u}var e,j,i=a[0],o=[],k;if(!c.support.checkClone&&arguments.length===3&&typeof i==="string"&&ua.test(i))return this.each(function(){c(this).domManip(a,b,d,true)});if(c.isFunction(i))return this.each(function(u){var z=c(this);a[0]=i.call(this,u,b?z.html():w);z.domManip(a,b,d)});if(this[0]){e=i&&i.parentNode;e=c.support.parentNode&&e&&e.nodeType===11&&e.childNodes.length===this.length?{fragment:e}:sa(a,this,o);k=e.fragment;if(j=k.childNodes.length===
|
||||
1?(k=k.firstChild):k.firstChild){b=b&&c.nodeName(j,"tr");for(var n=0,r=this.length;n<r;n++)d.call(b?f(this[n],j):this[n],n>0||e.cacheable||this.length>1?k.cloneNode(true):k)}o.length&&c.each(o,Qa)}return this}});c.fragments={};c.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){c.fn[a]=function(d){var f=[];d=c(d);var e=this.length===1&&this[0].parentNode;if(e&&e.nodeType===11&&e.childNodes.length===1&&d.length===1){d[b](this[0]);
|
||||
return this}else{e=0;for(var j=d.length;e<j;e++){var i=(e>0?this.clone(true):this).get();c.fn[b].apply(c(d[e]),i);f=f.concat(i)}return this.pushStack(f,a,d.selector)}}});c.extend({clean:function(a,b,d,f){b=b||s;if(typeof b.createElement==="undefined")b=b.ownerDocument||b[0]&&b[0].ownerDocument||s;for(var e=[],j=0,i;(i=a[j])!=null;j++){if(typeof i==="number")i+="";if(i){if(typeof i==="string"&&!jb.test(i))i=b.createTextNode(i);else if(typeof i==="string"){i=i.replace(Ka,Ma);var o=(La.exec(i)||["",
|
||||
""])[1].toLowerCase(),k=F[o]||F._default,n=k[0],r=b.createElement("div");for(r.innerHTML=k[1]+i+k[2];n--;)r=r.lastChild;if(!c.support.tbody){n=ib.test(i);o=o==="table"&&!n?r.firstChild&&r.firstChild.childNodes:k[1]==="<table>"&&!n?r.childNodes:[];for(k=o.length-1;k>=0;--k)c.nodeName(o[k],"tbody")&&!o[k].childNodes.length&&o[k].parentNode.removeChild(o[k])}!c.support.leadingWhitespace&&V.test(i)&&r.insertBefore(b.createTextNode(V.exec(i)[0]),r.firstChild);i=r.childNodes}if(i.nodeType)e.push(i);else e=
|
||||
c.merge(e,i)}}if(d)for(j=0;e[j];j++)if(f&&c.nodeName(e[j],"script")&&(!e[j].type||e[j].type.toLowerCase()==="text/javascript"))f.push(e[j].parentNode?e[j].parentNode.removeChild(e[j]):e[j]);else{e[j].nodeType===1&&e.splice.apply(e,[j+1,0].concat(c.makeArray(e[j].getElementsByTagName("script"))));d.appendChild(e[j])}return e},cleanData:function(a){for(var b,d,f=c.cache,e=c.event.special,j=c.support.deleteExpando,i=0,o;(o=a[i])!=null;i++)if(d=o[c.expando]){b=f[d];if(b.events)for(var k in b.events)e[k]?
|
||||
c.event.remove(o,k):Ca(o,k,b.handle);if(j)delete o[c.expando];else o.removeAttribute&&o.removeAttribute(c.expando);delete f[d]}}});var kb=/z-?index|font-?weight|opacity|zoom|line-?height/i,Na=/alpha\([^)]*\)/,Oa=/opacity=([^)]*)/,ha=/float/i,ia=/-([a-z])/ig,lb=/([A-Z])/g,mb=/^-?\d+(?:px)?$/i,nb=/^-?\d/,ob={position:"absolute",visibility:"hidden",display:"block"},pb=["Left","Right"],qb=["Top","Bottom"],rb=s.defaultView&&s.defaultView.getComputedStyle,Pa=c.support.cssFloat?"cssFloat":"styleFloat",ja=
|
||||
function(a,b){return b.toUpperCase()};c.fn.css=function(a,b){return X(this,a,b,true,function(d,f,e){if(e===w)return c.curCSS(d,f);if(typeof e==="number"&&!kb.test(f))e+="px";c.style(d,f,e)})};c.extend({style:function(a,b,d){if(!a||a.nodeType===3||a.nodeType===8)return w;if((b==="width"||b==="height")&&parseFloat(d)<0)d=w;var f=a.style||a,e=d!==w;if(!c.support.opacity&&b==="opacity"){if(e){f.zoom=1;b=parseInt(d,10)+""==="NaN"?"":"alpha(opacity="+d*100+")";a=f.filter||c.curCSS(a,"filter")||"";f.filter=
|
||||
Na.test(a)?a.replace(Na,b):b}return f.filter&&f.filter.indexOf("opacity=")>=0?parseFloat(Oa.exec(f.filter)[1])/100+"":""}if(ha.test(b))b=Pa;b=b.replace(ia,ja);if(e)f[b]=d;return f[b]},css:function(a,b,d,f){if(b==="width"||b==="height"){var e,j=b==="width"?pb:qb;function i(){e=b==="width"?a.offsetWidth:a.offsetHeight;f!=="border"&&c.each(j,function(){f||(e-=parseFloat(c.curCSS(a,"padding"+this,true))||0);if(f==="margin")e+=parseFloat(c.curCSS(a,"margin"+this,true))||0;else e-=parseFloat(c.curCSS(a,
|
||||
"border"+this+"Width",true))||0})}a.offsetWidth!==0?i():c.swap(a,ob,i);return Math.max(0,Math.round(e))}return c.curCSS(a,b,d)},curCSS:function(a,b,d){var f,e=a.style;if(!c.support.opacity&&b==="opacity"&&a.currentStyle){f=Oa.test(a.currentStyle.filter||"")?parseFloat(RegExp.$1)/100+"":"";return f===""?"1":f}if(ha.test(b))b=Pa;if(!d&&e&&e[b])f=e[b];else if(rb){if(ha.test(b))b="float";b=b.replace(lb,"-$1").toLowerCase();e=a.ownerDocument.defaultView;if(!e)return null;if(a=e.getComputedStyle(a,null))f=
|
||||
a.getPropertyValue(b);if(b==="opacity"&&f==="")f="1"}else if(a.currentStyle){d=b.replace(ia,ja);f=a.currentStyle[b]||a.currentStyle[d];if(!mb.test(f)&&nb.test(f)){b=e.left;var j=a.runtimeStyle.left;a.runtimeStyle.left=a.currentStyle.left;e.left=d==="fontSize"?"1em":f||0;f=e.pixelLeft+"px";e.left=b;a.runtimeStyle.left=j}}return f},swap:function(a,b,d){var f={};for(var e in b){f[e]=a.style[e];a.style[e]=b[e]}d.call(a);for(e in b)a.style[e]=f[e]}});if(c.expr&&c.expr.filters){c.expr.filters.hidden=function(a){var b=
|
||||
a.offsetWidth,d=a.offsetHeight,f=a.nodeName.toLowerCase()==="tr";return b===0&&d===0&&!f?true:b>0&&d>0&&!f?false:c.curCSS(a,"display")==="none"};c.expr.filters.visible=function(a){return!c.expr.filters.hidden(a)}}var sb=J(),tb=/<script(.|\s)*?\/script>/gi,ub=/select|textarea/i,vb=/color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week/i,N=/=\?(&|$)/,ka=/\?/,wb=/(\?|&)_=.*?(&|$)/,xb=/^(\w+:)?\/\/([^\/?#]+)/,yb=/%20/g,zb=c.fn.load;c.fn.extend({load:function(a,b,d){if(typeof a!==
|
||||
"string")return zb.call(this,a);else if(!this.length)return this;var f=a.indexOf(" ");if(f>=0){var e=a.slice(f,a.length);a=a.slice(0,f)}f="GET";if(b)if(c.isFunction(b)){d=b;b=null}else if(typeof b==="object"){b=c.param(b,c.ajaxSettings.traditional);f="POST"}var j=this;c.ajax({url:a,type:f,dataType:"html",data:b,complete:function(i,o){if(o==="success"||o==="notmodified")j.html(e?c("<div />").append(i.responseText.replace(tb,"")).find(e):i.responseText);d&&j.each(d,[i.responseText,o,i])}});return this},
|
||||
serialize:function(){return c.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?c.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||ub.test(this.nodeName)||vb.test(this.type))}).map(function(a,b){a=c(this).val();return a==null?null:c.isArray(a)?c.map(a,function(d){return{name:b.name,value:d}}):{name:b.name,value:a}}).get()}});c.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),
|
||||
function(a,b){c.fn[b]=function(d){return this.bind(b,d)}});c.extend({get:function(a,b,d,f){if(c.isFunction(b)){f=f||d;d=b;b=null}return c.ajax({type:"GET",url:a,data:b,success:d,dataType:f})},getScript:function(a,b){return c.get(a,null,b,"script")},getJSON:function(a,b,d){return c.get(a,b,d,"json")},post:function(a,b,d,f){if(c.isFunction(b)){f=f||d;d=b;b={}}return c.ajax({type:"POST",url:a,data:b,success:d,dataType:f})},ajaxSetup:function(a){c.extend(c.ajaxSettings,a)},ajaxSettings:{url:location.href,
|
||||
global:true,type:"GET",contentType:"application/x-www-form-urlencoded",processData:true,async:true,xhr:A.XMLHttpRequest&&(A.location.protocol!=="file:"||!A.ActiveXObject)?function(){return new A.XMLHttpRequest}:function(){try{return new A.ActiveXObject("Microsoft.XMLHTTP")}catch(a){}},accepts:{xml:"application/xml, text/xml",html:"text/html",script:"text/javascript, application/javascript",json:"application/json, text/javascript",text:"text/plain",_default:"*/*"}},lastModified:{},etag:{},ajax:function(a){function b(){e.success&&
|
||||
e.success.call(k,o,i,x);e.global&&f("ajaxSuccess",[x,e])}function d(){e.complete&&e.complete.call(k,x,i);e.global&&f("ajaxComplete",[x,e]);e.global&&!--c.active&&c.event.trigger("ajaxStop")}function f(q,p){(e.context?c(e.context):c.event).trigger(q,p)}var e=c.extend(true,{},c.ajaxSettings,a),j,i,o,k=a&&a.context||e,n=e.type.toUpperCase();if(e.data&&e.processData&&typeof e.data!=="string")e.data=c.param(e.data,e.traditional);if(e.dataType==="jsonp"){if(n==="GET")N.test(e.url)||(e.url+=(ka.test(e.url)?
|
||||
"&":"?")+(e.jsonp||"callback")+"=?");else if(!e.data||!N.test(e.data))e.data=(e.data?e.data+"&":"")+(e.jsonp||"callback")+"=?";e.dataType="json"}if(e.dataType==="json"&&(e.data&&N.test(e.data)||N.test(e.url))){j=e.jsonpCallback||"jsonp"+sb++;if(e.data)e.data=(e.data+"").replace(N,"="+j+"$1");e.url=e.url.replace(N,"="+j+"$1");e.dataType="script";A[j]=A[j]||function(q){o=q;b();d();A[j]=w;try{delete A[j]}catch(p){}z&&z.removeChild(C)}}if(e.dataType==="script"&&e.cache===null)e.cache=false;if(e.cache===
|
||||
false&&n==="GET"){var r=J(),u=e.url.replace(wb,"$1_="+r+"$2");e.url=u+(u===e.url?(ka.test(e.url)?"&":"?")+"_="+r:"")}if(e.data&&n==="GET")e.url+=(ka.test(e.url)?"&":"?")+e.data;e.global&&!c.active++&&c.event.trigger("ajaxStart");r=(r=xb.exec(e.url))&&(r[1]&&r[1]!==location.protocol||r[2]!==location.host);if(e.dataType==="script"&&n==="GET"&&r){var z=s.getElementsByTagName("head")[0]||s.documentElement,C=s.createElement("script");C.src=e.url;if(e.scriptCharset)C.charset=e.scriptCharset;if(!j){var B=
|
||||
false;C.onload=C.onreadystatechange=function(){if(!B&&(!this.readyState||this.readyState==="loaded"||this.readyState==="complete")){B=true;b();d();C.onload=C.onreadystatechange=null;z&&C.parentNode&&z.removeChild(C)}}}z.insertBefore(C,z.firstChild);return w}var E=false,x=e.xhr();if(x){e.username?x.open(n,e.url,e.async,e.username,e.password):x.open(n,e.url,e.async);try{if(e.data||a&&a.contentType)x.setRequestHeader("Content-Type",e.contentType);if(e.ifModified){c.lastModified[e.url]&&x.setRequestHeader("If-Modified-Since",
|
||||
c.lastModified[e.url]);c.etag[e.url]&&x.setRequestHeader("If-None-Match",c.etag[e.url])}r||x.setRequestHeader("X-Requested-With","XMLHttpRequest");x.setRequestHeader("Accept",e.dataType&&e.accepts[e.dataType]?e.accepts[e.dataType]+", */*":e.accepts._default)}catch(ga){}if(e.beforeSend&&e.beforeSend.call(k,x,e)===false){e.global&&!--c.active&&c.event.trigger("ajaxStop");x.abort();return false}e.global&&f("ajaxSend",[x,e]);var g=x.onreadystatechange=function(q){if(!x||x.readyState===0||q==="abort"){E||
|
||||
d();E=true;if(x)x.onreadystatechange=c.noop}else if(!E&&x&&(x.readyState===4||q==="timeout")){E=true;x.onreadystatechange=c.noop;i=q==="timeout"?"timeout":!c.httpSuccess(x)?"error":e.ifModified&&c.httpNotModified(x,e.url)?"notmodified":"success";var p;if(i==="success")try{o=c.httpData(x,e.dataType,e)}catch(v){i="parsererror";p=v}if(i==="success"||i==="notmodified")j||b();else c.handleError(e,x,i,p);d();q==="timeout"&&x.abort();if(e.async)x=null}};try{var h=x.abort;x.abort=function(){x&&h.call(x);
|
||||
g("abort")}}catch(l){}e.async&&e.timeout>0&&setTimeout(function(){x&&!E&&g("timeout")},e.timeout);try{x.send(n==="POST"||n==="PUT"||n==="DELETE"?e.data:null)}catch(m){c.handleError(e,x,null,m);d()}e.async||g();return x}},handleError:function(a,b,d,f){if(a.error)a.error.call(a.context||a,b,d,f);if(a.global)(a.context?c(a.context):c.event).trigger("ajaxError",[b,a,f])},active:0,httpSuccess:function(a){try{return!a.status&&location.protocol==="file:"||a.status>=200&&a.status<300||a.status===304||a.status===
|
||||
1223||a.status===0}catch(b){}return false},httpNotModified:function(a,b){var d=a.getResponseHeader("Last-Modified"),f=a.getResponseHeader("Etag");if(d)c.lastModified[b]=d;if(f)c.etag[b]=f;return a.status===304||a.status===0},httpData:function(a,b,d){var f=a.getResponseHeader("content-type")||"",e=b==="xml"||!b&&f.indexOf("xml")>=0;a=e?a.responseXML:a.responseText;e&&a.documentElement.nodeName==="parsererror"&&c.error("parsererror");if(d&&d.dataFilter)a=d.dataFilter(a,b);if(typeof a==="string")if(b===
|
||||
"json"||!b&&f.indexOf("json")>=0)a=c.parseJSON(a);else if(b==="script"||!b&&f.indexOf("javascript")>=0)c.globalEval(a);return a},param:function(a,b){function d(i,o){if(c.isArray(o))c.each(o,function(k,n){b||/\[\]$/.test(i)?f(i,n):d(i+"["+(typeof n==="object"||c.isArray(n)?k:"")+"]",n)});else!b&&o!=null&&typeof o==="object"?c.each(o,function(k,n){d(i+"["+k+"]",n)}):f(i,o)}function f(i,o){o=c.isFunction(o)?o():o;e[e.length]=encodeURIComponent(i)+"="+encodeURIComponent(o)}var e=[];if(b===w)b=c.ajaxSettings.traditional;
|
||||
if(c.isArray(a)||a.jquery)c.each(a,function(){f(this.name,this.value)});else for(var j in a)d(j,a[j]);return e.join("&").replace(yb,"+")}});var la={},Ab=/toggle|show|hide/,Bb=/^([+-]=)?([\d+-.]+)(.*)$/,W,va=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]];c.fn.extend({show:function(a,b){if(a||a===0)return this.animate(K("show",3),a,b);else{a=0;for(b=this.length;a<b;a++){var d=c.data(this[a],"olddisplay");
|
||||
this[a].style.display=d||"";if(c.css(this[a],"display")==="none"){d=this[a].nodeName;var f;if(la[d])f=la[d];else{var e=c("<"+d+" />").appendTo("body");f=e.css("display");if(f==="none")f="block";e.remove();la[d]=f}c.data(this[a],"olddisplay",f)}}a=0;for(b=this.length;a<b;a++)this[a].style.display=c.data(this[a],"olddisplay")||"";return this}},hide:function(a,b){if(a||a===0)return this.animate(K("hide",3),a,b);else{a=0;for(b=this.length;a<b;a++){var d=c.data(this[a],"olddisplay");!d&&d!=="none"&&c.data(this[a],
|
||||
"olddisplay",c.css(this[a],"display"))}a=0;for(b=this.length;a<b;a++)this[a].style.display="none";return this}},_toggle:c.fn.toggle,toggle:function(a,b){var d=typeof a==="boolean";if(c.isFunction(a)&&c.isFunction(b))this._toggle.apply(this,arguments);else a==null||d?this.each(function(){var f=d?a:c(this).is(":hidden");c(this)[f?"show":"hide"]()}):this.animate(K("toggle",3),a,b);return this},fadeTo:function(a,b,d){return this.filter(":hidden").css("opacity",0).show().end().animate({opacity:b},a,d)},
|
||||
animate:function(a,b,d,f){var e=c.speed(b,d,f);if(c.isEmptyObject(a))return this.each(e.complete);return this[e.queue===false?"each":"queue"](function(){var j=c.extend({},e),i,o=this.nodeType===1&&c(this).is(":hidden"),k=this;for(i in a){var n=i.replace(ia,ja);if(i!==n){a[n]=a[i];delete a[i];i=n}if(a[i]==="hide"&&o||a[i]==="show"&&!o)return j.complete.call(this);if((i==="height"||i==="width")&&this.style){j.display=c.css(this,"display");j.overflow=this.style.overflow}if(c.isArray(a[i])){(j.specialEasing=
|
||||
j.specialEasing||{})[i]=a[i][1];a[i]=a[i][0]}}if(j.overflow!=null)this.style.overflow="hidden";j.curAnim=c.extend({},a);c.each(a,function(r,u){var z=new c.fx(k,j,r);if(Ab.test(u))z[u==="toggle"?o?"show":"hide":u](a);else{var C=Bb.exec(u),B=z.cur(true)||0;if(C){u=parseFloat(C[2]);var E=C[3]||"px";if(E!=="px"){k.style[r]=(u||1)+E;B=(u||1)/z.cur(true)*B;k.style[r]=B+E}if(C[1])u=(C[1]==="-="?-1:1)*u+B;z.custom(B,u,E)}else z.custom(B,u,"")}});return true})},stop:function(a,b){var d=c.timers;a&&this.queue([]);
|
||||
this.each(function(){for(var f=d.length-1;f>=0;f--)if(d[f].elem===this){b&&d[f](true);d.splice(f,1)}});b||this.dequeue();return this}});c.each({slideDown:K("show",1),slideUp:K("hide",1),slideToggle:K("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"}},function(a,b){c.fn[a]=function(d,f){return this.animate(b,d,f)}});c.extend({speed:function(a,b,d){var f=a&&typeof a==="object"?a:{complete:d||!d&&b||c.isFunction(a)&&a,duration:a,easing:d&&b||b&&!c.isFunction(b)&&b};f.duration=c.fx.off?0:typeof f.duration===
|
||||
"number"?f.duration:c.fx.speeds[f.duration]||c.fx.speeds._default;f.old=f.complete;f.complete=function(){f.queue!==false&&c(this).dequeue();c.isFunction(f.old)&&f.old.call(this)};return f},easing:{linear:function(a,b,d,f){return d+f*a},swing:function(a,b,d,f){return(-Math.cos(a*Math.PI)/2+0.5)*f+d}},timers:[],fx:function(a,b,d){this.options=b;this.elem=a;this.prop=d;if(!b.orig)b.orig={}}});c.fx.prototype={update:function(){this.options.step&&this.options.step.call(this.elem,this.now,this);(c.fx.step[this.prop]||
|
||||
c.fx.step._default)(this);if((this.prop==="height"||this.prop==="width")&&this.elem.style)this.elem.style.display="block"},cur:function(a){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null))return this.elem[this.prop];return(a=parseFloat(c.css(this.elem,this.prop,a)))&&a>-10000?a:parseFloat(c.curCSS(this.elem,this.prop))||0},custom:function(a,b,d){function f(j){return e.step(j)}this.startTime=J();this.start=a;this.end=b;this.unit=d||this.unit||"px";this.now=this.start;
|
||||
this.pos=this.state=0;var e=this;f.elem=this.elem;if(f()&&c.timers.push(f)&&!W)W=setInterval(c.fx.tick,13)},show:function(){this.options.orig[this.prop]=c.style(this.elem,this.prop);this.options.show=true;this.custom(this.prop==="width"||this.prop==="height"?1:0,this.cur());c(this.elem).show()},hide:function(){this.options.orig[this.prop]=c.style(this.elem,this.prop);this.options.hide=true;this.custom(this.cur(),0)},step:function(a){var b=J(),d=true;if(a||b>=this.options.duration+this.startTime){this.now=
|
||||
this.end;this.pos=this.state=1;this.update();this.options.curAnim[this.prop]=true;for(var f in this.options.curAnim)if(this.options.curAnim[f]!==true)d=false;if(d){if(this.options.display!=null){this.elem.style.overflow=this.options.overflow;a=c.data(this.elem,"olddisplay");this.elem.style.display=a?a:this.options.display;if(c.css(this.elem,"display")==="none")this.elem.style.display="block"}this.options.hide&&c(this.elem).hide();if(this.options.hide||this.options.show)for(var e in this.options.curAnim)c.style(this.elem,
|
||||
e,this.options.orig[e]);this.options.complete.call(this.elem)}return false}else{e=b-this.startTime;this.state=e/this.options.duration;a=this.options.easing||(c.easing.swing?"swing":"linear");this.pos=c.easing[this.options.specialEasing&&this.options.specialEasing[this.prop]||a](this.state,e,0,1,this.options.duration);this.now=this.start+(this.end-this.start)*this.pos;this.update()}return true}};c.extend(c.fx,{tick:function(){for(var a=c.timers,b=0;b<a.length;b++)a[b]()||a.splice(b--,1);a.length||
|
||||
c.fx.stop()},stop:function(){clearInterval(W);W=null},speeds:{slow:600,fast:200,_default:400},step:{opacity:function(a){c.style(a.elem,"opacity",a.now)},_default:function(a){if(a.elem.style&&a.elem.style[a.prop]!=null)a.elem.style[a.prop]=(a.prop==="width"||a.prop==="height"?Math.max(0,a.now):a.now)+a.unit;else a.elem[a.prop]=a.now}}});if(c.expr&&c.expr.filters)c.expr.filters.animated=function(a){return c.grep(c.timers,function(b){return a===b.elem}).length};c.fn.offset="getBoundingClientRect"in s.documentElement?
|
||||
function(a){var b=this[0];if(a)return this.each(function(e){c.offset.setOffset(this,a,e)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return c.offset.bodyOffset(b);var d=b.getBoundingClientRect(),f=b.ownerDocument;b=f.body;f=f.documentElement;return{top:d.top+(self.pageYOffset||c.support.boxModel&&f.scrollTop||b.scrollTop)-(f.clientTop||b.clientTop||0),left:d.left+(self.pageXOffset||c.support.boxModel&&f.scrollLeft||b.scrollLeft)-(f.clientLeft||b.clientLeft||0)}}:function(a){var b=
|
||||
this[0];if(a)return this.each(function(r){c.offset.setOffset(this,a,r)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return c.offset.bodyOffset(b);c.offset.initialize();var d=b.offsetParent,f=b,e=b.ownerDocument,j,i=e.documentElement,o=e.body;f=(e=e.defaultView)?e.getComputedStyle(b,null):b.currentStyle;for(var k=b.offsetTop,n=b.offsetLeft;(b=b.parentNode)&&b!==o&&b!==i;){if(c.offset.supportsFixedPosition&&f.position==="fixed")break;j=e?e.getComputedStyle(b,null):b.currentStyle;
|
||||
k-=b.scrollTop;n-=b.scrollLeft;if(b===d){k+=b.offsetTop;n+=b.offsetLeft;if(c.offset.doesNotAddBorder&&!(c.offset.doesAddBorderForTableAndCells&&/^t(able|d|h)$/i.test(b.nodeName))){k+=parseFloat(j.borderTopWidth)||0;n+=parseFloat(j.borderLeftWidth)||0}f=d;d=b.offsetParent}if(c.offset.subtractsBorderForOverflowNotVisible&&j.overflow!=="visible"){k+=parseFloat(j.borderTopWidth)||0;n+=parseFloat(j.borderLeftWidth)||0}f=j}if(f.position==="relative"||f.position==="static"){k+=o.offsetTop;n+=o.offsetLeft}if(c.offset.supportsFixedPosition&&
|
||||
f.position==="fixed"){k+=Math.max(i.scrollTop,o.scrollTop);n+=Math.max(i.scrollLeft,o.scrollLeft)}return{top:k,left:n}};c.offset={initialize:function(){var a=s.body,b=s.createElement("div"),d,f,e,j=parseFloat(c.curCSS(a,"marginTop",true))||0;c.extend(b.style,{position:"absolute",top:0,left:0,margin:0,border:0,width:"1px",height:"1px",visibility:"hidden"});b.innerHTML="<div style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;'><div></div></div><table style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;' cellpadding='0' cellspacing='0'><tr><td></td></tr></table>";
|
||||
a.insertBefore(b,a.firstChild);d=b.firstChild;f=d.firstChild;e=d.nextSibling.firstChild.firstChild;this.doesNotAddBorder=f.offsetTop!==5;this.doesAddBorderForTableAndCells=e.offsetTop===5;f.style.position="fixed";f.style.top="20px";this.supportsFixedPosition=f.offsetTop===20||f.offsetTop===15;f.style.position=f.style.top="";d.style.overflow="hidden";d.style.position="relative";this.subtractsBorderForOverflowNotVisible=f.offsetTop===-5;this.doesNotIncludeMarginInBodyOffset=a.offsetTop!==j;a.removeChild(b);
|
||||
c.offset.initialize=c.noop},bodyOffset:function(a){var b=a.offsetTop,d=a.offsetLeft;c.offset.initialize();if(c.offset.doesNotIncludeMarginInBodyOffset){b+=parseFloat(c.curCSS(a,"marginTop",true))||0;d+=parseFloat(c.curCSS(a,"marginLeft",true))||0}return{top:b,left:d}},setOffset:function(a,b,d){if(/static/.test(c.curCSS(a,"position")))a.style.position="relative";var f=c(a),e=f.offset(),j=parseInt(c.curCSS(a,"top",true),10)||0,i=parseInt(c.curCSS(a,"left",true),10)||0;if(c.isFunction(b))b=b.call(a,
|
||||
d,e);d={top:b.top-e.top+j,left:b.left-e.left+i};"using"in b?b.using.call(a,d):f.css(d)}};c.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),d=this.offset(),f=/^body|html$/i.test(b[0].nodeName)?{top:0,left:0}:b.offset();d.top-=parseFloat(c.curCSS(a,"marginTop",true))||0;d.left-=parseFloat(c.curCSS(a,"marginLeft",true))||0;f.top+=parseFloat(c.curCSS(b[0],"borderTopWidth",true))||0;f.left+=parseFloat(c.curCSS(b[0],"borderLeftWidth",true))||0;return{top:d.top-
|
||||
f.top,left:d.left-f.left}},offsetParent:function(){return this.map(function(){for(var a=this.offsetParent||s.body;a&&!/^body|html$/i.test(a.nodeName)&&c.css(a,"position")==="static";)a=a.offsetParent;return a})}});c.each(["Left","Top"],function(a,b){var d="scroll"+b;c.fn[d]=function(f){var e=this[0],j;if(!e)return null;if(f!==w)return this.each(function(){if(j=wa(this))j.scrollTo(!a?f:c(j).scrollLeft(),a?f:c(j).scrollTop());else this[d]=f});else return(j=wa(e))?"pageXOffset"in j?j[a?"pageYOffset":
|
||||
"pageXOffset"]:c.support.boxModel&&j.document.documentElement[d]||j.document.body[d]:e[d]}});c.each(["Height","Width"],function(a,b){var d=b.toLowerCase();c.fn["inner"+b]=function(){return this[0]?c.css(this[0],d,false,"padding"):null};c.fn["outer"+b]=function(f){return this[0]?c.css(this[0],d,false,f?"margin":"border"):null};c.fn[d]=function(f){var e=this[0];if(!e)return f==null?null:this;if(c.isFunction(f))return this.each(function(j){var i=c(this);i[d](f.call(this,j,i[d]()))});return"scrollTo"in
|
||||
e&&e.document?e.document.compatMode==="CSS1Compat"&&e.document.documentElement["client"+b]||e.document.body["client"+b]:e.nodeType===9?Math.max(e.documentElement["client"+b],e.body["scroll"+b],e.documentElement["scroll"+b],e.body["offset"+b],e.documentElement["offset"+b]):f===w?c.css(e,d):this.css(d,typeof f==="string"?f:f+"px")}});A.jQuery=A.$=c})(window);
|
|
@ -0,0 +1,489 @@
|
|||
/*
|
||||
* jQuery UI CSS Framework
|
||||
* Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about)
|
||||
* Dual licensed under the MIT (MIT-LICENSE.txt) and GPL (GPL-LICENSE.txt) licenses.
|
||||
*/
|
||||
|
||||
/* Layout helpers
|
||||
----------------------------------*/
|
||||
.ui-helper-hidden { display: none; }
|
||||
.ui-helper-hidden-accessible { position: absolute; left: -99999999px; }
|
||||
.ui-helper-reset { margin: 0; padding: 0; border: 0; outline: 0; line-height: 1.3; text-decoration: none; font-size: 100%; list-style: none; }
|
||||
.ui-helper-clearfix:after { content: "."; display: block; height: 0; clear: both; visibility: hidden; }
|
||||
.ui-helper-clearfix { display: inline-block; }
|
||||
/* required comment for clearfix to work in Opera \*/
|
||||
* html .ui-helper-clearfix { height:1%; }
|
||||
.ui-helper-clearfix { display:block; }
|
||||
/* end clearfix */
|
||||
.ui-helper-zfix { width: 100%; height: 100%; top: 0; left: 0; position: absolute; opacity: 0; filter:Alpha(Opacity=0); }
|
||||
|
||||
|
||||
/* Interaction Cues
|
||||
----------------------------------*/
|
||||
.ui-state-disabled { cursor: default !important; }
|
||||
|
||||
|
||||
/* Icons
|
||||
----------------------------------*/
|
||||
|
||||
/* states and images */
|
||||
.ui-icon { display: block; text-indent: -99999px; overflow: hidden; background-repeat: no-repeat; }
|
||||
|
||||
|
||||
/* Misc visuals
|
||||
----------------------------------*/
|
||||
|
||||
/* Overlays */
|
||||
.ui-widget-overlay { position: absolute; top: 0; left: 0; width: 100%; height: 100%; }
|
||||
|
||||
|
||||
/*
|
||||
* jQuery UI CSS Framework
|
||||
* Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about)
|
||||
* Dual licensed under the MIT (MIT-LICENSE.txt) and GPL (GPL-LICENSE.txt) licenses.
|
||||
* To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Trebuchet%20MS,%20Tahoma,%20Verdana,%20Arial,%20sans-serif&fwDefault=bold&fsDefault=1.1em&cornerRadius=4px&bgColorHeader=f6a828&bgTextureHeader=12_gloss_wave.png&bgImgOpacityHeader=35&borderColorHeader=e78f08&fcHeader=ffffff&iconColorHeader=ffffff&bgColorContent=eeeeee&bgTextureContent=03_highlight_soft.png&bgImgOpacityContent=100&borderColorContent=dddddd&fcContent=333333&iconColorContent=222222&bgColorDefault=f6f6f6&bgTextureDefault=02_glass.png&bgImgOpacityDefault=100&borderColorDefault=cccccc&fcDefault=1c94c4&iconColorDefault=ef8c08&bgColorHover=fdf5ce&bgTextureHover=02_glass.png&bgImgOpacityHover=100&borderColorHover=fbcb09&fcHover=c77405&iconColorHover=ef8c08&bgColorActive=ffffff&bgTextureActive=02_glass.png&bgImgOpacityActive=65&borderColorActive=fbd850&fcActive=eb8f00&iconColorActive=ef8c08&bgColorHighlight=ffe45c&bgTextureHighlight=03_highlight_soft.png&bgImgOpacityHighlight=75&borderColorHighlight=fed22f&fcHighlight=363636&iconColorHighlight=228ef1&bgColorError=b81900&bgTextureError=08_diagonals_thick.png&bgImgOpacityError=18&borderColorError=cd0a0a&fcError=ffffff&iconColorError=ffd27a&bgColorOverlay=666666&bgTextureOverlay=08_diagonals_thick.png&bgImgOpacityOverlay=20&opacityOverlay=50&bgColorShadow=000000&bgTextureShadow=01_flat.png&bgImgOpacityShadow=10&opacityShadow=20&thicknessShadow=5px&offsetTopShadow=-5px&offsetLeftShadow=-5px&cornerRadiusShadow=5px
|
||||
*/
|
||||
|
||||
|
||||
/* Component containers
|
||||
----------------------------------*/
|
||||
.ui-widget { font-family: Trebuchet MS, Tahoma, Verdana, Arial, sans-serif; font-size: 1.1em; }
|
||||
.ui-widget .ui-widget { font-size: 1em; }
|
||||
.ui-widget input, .ui-widget select, .ui-widget textarea, .ui-widget button { font-family: Trebuchet MS, Tahoma, Verdana, Arial, sans-serif; font-size: 1em; }
|
||||
.ui-widget-content { border: 1px solid #dddddd; background: #eeeeee url(images/ui-bg_highlight-soft_100_eeeeee_1x100.png) 50% top repeat-x; color: #333333; }
|
||||
.ui-widget-content a { color: #333333; }
|
||||
.ui-widget-header { border: 1px solid #e78f08; background: #f6a828 url(images/ui-bg_gloss-wave_35_f6a828_500x100.png) 50% 50% repeat-x; color: #ffffff; font-weight: bold; }
|
||||
.ui-widget-header a { color: #ffffff; }
|
||||
|
||||
/* Interaction states
|
||||
----------------------------------*/
|
||||
.ui-state-default, .ui-widget-content .ui-state-default, .ui-widget-header .ui-state-default { border: 1px solid #cccccc; background: #f6f6f6 url(images/ui-bg_glass_100_f6f6f6_1x400.png) 50% 50% repeat-x; font-weight: bold; color: #1c94c4; }
|
||||
.ui-state-default a, .ui-state-default a:link, .ui-state-default a:visited { color: #1c94c4; text-decoration: none; }
|
||||
.ui-state-hover, .ui-widget-content .ui-state-hover, .ui-widget-header .ui-state-hover, .ui-state-focus, .ui-widget-content .ui-state-focus, .ui-widget-header .ui-state-focus { border: 1px solid #fbcb09; background: #fdf5ce url(images/ui-bg_glass_100_fdf5ce_1x400.png) 50% 50% repeat-x; font-weight: bold; color: #c77405; }
|
||||
.ui-state-hover a, .ui-state-hover a:hover { color: #c77405; text-decoration: none; }
|
||||
.ui-state-active, .ui-widget-content .ui-state-active, .ui-widget-header .ui-state-active { border: 1px solid #fbd850; background: #ffffff url(images/ui-bg_glass_65_ffffff_1x400.png) 50% 50% repeat-x; font-weight: bold; color: #eb8f00; }
|
||||
.ui-state-active a, .ui-state-active a:link, .ui-state-active a:visited { color: #eb8f00; text-decoration: none; }
|
||||
.ui-widget :active { outline: none; }
|
||||
|
||||
/* Interaction Cues
|
||||
----------------------------------*/
|
||||
.ui-state-highlight, .ui-widget-content .ui-state-highlight, .ui-widget-header .ui-state-highlight {border: 1px solid #fed22f; background: #ffe45c url(images/ui-bg_highlight-soft_75_ffe45c_1x100.png) 50% top repeat-x; color: #363636; }
|
||||
.ui-state-highlight a, .ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a { color: #363636; }
|
||||
.ui-state-error, .ui-widget-content .ui-state-error, .ui-widget-header .ui-state-error {border: 1px solid #cd0a0a; background: #b81900 url(images/ui-bg_diagonals-thick_18_b81900_40x40.png) 50% 50% repeat; color: #ffffff; }
|
||||
.ui-state-error a, .ui-widget-content .ui-state-error a, .ui-widget-header .ui-state-error a { color: #ffffff; }
|
||||
.ui-state-error-text, .ui-widget-content .ui-state-error-text, .ui-widget-header .ui-state-error-text { color: #ffffff; }
|
||||
.ui-priority-primary, .ui-widget-content .ui-priority-primary, .ui-widget-header .ui-priority-primary { font-weight: bold; }
|
||||
.ui-priority-secondary, .ui-widget-content .ui-priority-secondary, .ui-widget-header .ui-priority-secondary { opacity: .7; filter:Alpha(Opacity=70); font-weight: normal; }
|
||||
.ui-state-disabled, .ui-widget-content .ui-state-disabled, .ui-widget-header .ui-state-disabled { opacity: .35; filter:Alpha(Opacity=35); background-image: none; }
|
||||
|
||||
/* Icons
|
||||
----------------------------------*/
|
||||
|
||||
/* states and images */
|
||||
.ui-icon { width: 16px; height: 16px; background-image: url(images/ui-icons_222222_256x240.png); }
|
||||
.ui-widget-content .ui-icon {background-image: url(images/ui-icons_222222_256x240.png); }
|
||||
.ui-widget-header .ui-icon {background-image: url(images/ui-icons_ffffff_256x240.png); }
|
||||
.ui-state-default .ui-icon { background-image: url(images/ui-icons_ef8c08_256x240.png); }
|
||||
.ui-state-hover .ui-icon, .ui-state-focus .ui-icon {background-image: url(images/ui-icons_ef8c08_256x240.png); }
|
||||
.ui-state-active .ui-icon {background-image: url(images/ui-icons_ef8c08_256x240.png); }
|
||||
.ui-state-highlight .ui-icon {background-image: url(images/ui-icons_228ef1_256x240.png); }
|
||||
.ui-state-error .ui-icon, .ui-state-error-text .ui-icon {background-image: url(images/ui-icons_ffd27a_256x240.png); }
|
||||
|
||||
/* positioning */
|
||||
.ui-icon-carat-1-n { background-position: 0 0; }
|
||||
.ui-icon-carat-1-ne { background-position: -16px 0; }
|
||||
.ui-icon-carat-1-e { background-position: -32px 0; }
|
||||
.ui-icon-carat-1-se { background-position: -48px 0; }
|
||||
.ui-icon-carat-1-s { background-position: -64px 0; }
|
||||
.ui-icon-carat-1-sw { background-position: -80px 0; }
|
||||
.ui-icon-carat-1-w { background-position: -96px 0; }
|
||||
.ui-icon-carat-1-nw { background-position: -112px 0; }
|
||||
.ui-icon-carat-2-n-s { background-position: -128px 0; }
|
||||
.ui-icon-carat-2-e-w { background-position: -144px 0; }
|
||||
.ui-icon-triangle-1-n { background-position: 0 -16px; }
|
||||
.ui-icon-triangle-1-ne { background-position: -16px -16px; }
|
||||
.ui-icon-triangle-1-e { background-position: -32px -16px; }
|
||||
.ui-icon-triangle-1-se { background-position: -48px -16px; }
|
||||
.ui-icon-triangle-1-s { background-position: -64px -16px; }
|
||||
.ui-icon-triangle-1-sw { background-position: -80px -16px; }
|
||||
.ui-icon-triangle-1-w { background-position: -96px -16px; }
|
||||
.ui-icon-triangle-1-nw { background-position: -112px -16px; }
|
||||
.ui-icon-triangle-2-n-s { background-position: -128px -16px; }
|
||||
.ui-icon-triangle-2-e-w { background-position: -144px -16px; }
|
||||
.ui-icon-arrow-1-n { background-position: 0 -32px; }
|
||||
.ui-icon-arrow-1-ne { background-position: -16px -32px; }
|
||||
.ui-icon-arrow-1-e { background-position: -32px -32px; }
|
||||
.ui-icon-arrow-1-se { background-position: -48px -32px; }
|
||||
.ui-icon-arrow-1-s { background-position: -64px -32px; }
|
||||
.ui-icon-arrow-1-sw { background-position: -80px -32px; }
|
||||
.ui-icon-arrow-1-w { background-position: -96px -32px; }
|
||||
.ui-icon-arrow-1-nw { background-position: -112px -32px; }
|
||||
.ui-icon-arrow-2-n-s { background-position: -128px -32px; }
|
||||
.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; }
|
||||
.ui-icon-arrow-2-e-w { background-position: -160px -32px; }
|
||||
.ui-icon-arrow-2-se-nw { background-position: -176px -32px; }
|
||||
.ui-icon-arrowstop-1-n { background-position: -192px -32px; }
|
||||
.ui-icon-arrowstop-1-e { background-position: -208px -32px; }
|
||||
.ui-icon-arrowstop-1-s { background-position: -224px -32px; }
|
||||
.ui-icon-arrowstop-1-w { background-position: -240px -32px; }
|
||||
.ui-icon-arrowthick-1-n { background-position: 0 -48px; }
|
||||
.ui-icon-arrowthick-1-ne { background-position: -16px -48px; }
|
||||
.ui-icon-arrowthick-1-e { background-position: -32px -48px; }
|
||||
.ui-icon-arrowthick-1-se { background-position: -48px -48px; }
|
||||
.ui-icon-arrowthick-1-s { background-position: -64px -48px; }
|
||||
.ui-icon-arrowthick-1-sw { background-position: -80px -48px; }
|
||||
.ui-icon-arrowthick-1-w { background-position: -96px -48px; }
|
||||
.ui-icon-arrowthick-1-nw { background-position: -112px -48px; }
|
||||
.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; }
|
||||
.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; }
|
||||
.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; }
|
||||
.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; }
|
||||
.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; }
|
||||
.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; }
|
||||
.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; }
|
||||
.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; }
|
||||
.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; }
|
||||
.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; }
|
||||
.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; }
|
||||
.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; }
|
||||
.ui-icon-arrowreturn-1-w { background-position: -64px -64px; }
|
||||
.ui-icon-arrowreturn-1-n { background-position: -80px -64px; }
|
||||
.ui-icon-arrowreturn-1-e { background-position: -96px -64px; }
|
||||
.ui-icon-arrowreturn-1-s { background-position: -112px -64px; }
|
||||
.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; }
|
||||
.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; }
|
||||
.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; }
|
||||
.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; }
|
||||
.ui-icon-arrow-4 { background-position: 0 -80px; }
|
||||
.ui-icon-arrow-4-diag { background-position: -16px -80px; }
|
||||
.ui-icon-extlink { background-position: -32px -80px; }
|
||||
.ui-icon-newwin { background-position: -48px -80px; }
|
||||
.ui-icon-refresh { background-position: -64px -80px; }
|
||||
.ui-icon-shuffle { background-position: -80px -80px; }
|
||||
.ui-icon-transfer-e-w { background-position: -96px -80px; }
|
||||
.ui-icon-transferthick-e-w { background-position: -112px -80px; }
|
||||
.ui-icon-folder-collapsed { background-position: 0 -96px; }
|
||||
.ui-icon-folder-open { background-position: -16px -96px; }
|
||||
.ui-icon-document { background-position: -32px -96px; }
|
||||
.ui-icon-document-b { background-position: -48px -96px; }
|
||||
.ui-icon-note { background-position: -64px -96px; }
|
||||
.ui-icon-mail-closed { background-position: -80px -96px; }
|
||||
.ui-icon-mail-open { background-position: -96px -96px; }
|
||||
.ui-icon-suitcase { background-position: -112px -96px; }
|
||||
.ui-icon-comment { background-position: -128px -96px; }
|
||||
.ui-icon-person { background-position: -144px -96px; }
|
||||
.ui-icon-print { background-position: -160px -96px; }
|
||||
.ui-icon-trash { background-position: -176px -96px; }
|
||||
.ui-icon-locked { background-position: -192px -96px; }
|
||||
.ui-icon-unlocked { background-position: -208px -96px; }
|
||||
.ui-icon-bookmark { background-position: -224px -96px; }
|
||||
.ui-icon-tag { background-position: -240px -96px; }
|
||||
.ui-icon-home { background-position: 0 -112px; }
|
||||
.ui-icon-flag { background-position: -16px -112px; }
|
||||
.ui-icon-calendar { background-position: -32px -112px; }
|
||||
.ui-icon-cart { background-position: -48px -112px; }
|
||||
.ui-icon-pencil { background-position: -64px -112px; }
|
||||
.ui-icon-clock { background-position: -80px -112px; }
|
||||
.ui-icon-disk { background-position: -96px -112px; }
|
||||
.ui-icon-calculator { background-position: -112px -112px; }
|
||||
.ui-icon-zoomin { background-position: -128px -112px; }
|
||||
.ui-icon-zoomout { background-position: -144px -112px; }
|
||||
.ui-icon-search { background-position: -160px -112px; }
|
||||
.ui-icon-wrench { background-position: -176px -112px; }
|
||||
.ui-icon-gear { background-position: -192px -112px; }
|
||||
.ui-icon-heart { background-position: -208px -112px; }
|
||||
.ui-icon-star { background-position: -224px -112px; }
|
||||
.ui-icon-link { background-position: -240px -112px; }
|
||||
.ui-icon-cancel { background-position: 0 -128px; }
|
||||
.ui-icon-plus { background-position: -16px -128px; }
|
||||
.ui-icon-plusthick { background-position: -32px -128px; }
|
||||
.ui-icon-minus { background-position: -48px -128px; }
|
||||
.ui-icon-minusthick { background-position: -64px -128px; }
|
||||
.ui-icon-close { background-position: -80px -128px; }
|
||||
.ui-icon-closethick { background-position: -96px -128px; }
|
||||
.ui-icon-key { background-position: -112px -128px; }
|
||||
.ui-icon-lightbulb { background-position: -128px -128px; }
|
||||
.ui-icon-scissors { background-position: -144px -128px; }
|
||||
.ui-icon-clipboard { background-position: -160px -128px; }
|
||||
.ui-icon-copy { background-position: -176px -128px; }
|
||||
.ui-icon-contact { background-position: -192px -128px; }
|
||||
.ui-icon-image { background-position: -208px -128px; }
|
||||
.ui-icon-video { background-position: -224px -128px; }
|
||||
.ui-icon-script { background-position: -240px -128px; }
|
||||
.ui-icon-alert { background-position: 0 -144px; }
|
||||
.ui-icon-info { background-position: -16px -144px; }
|
||||
.ui-icon-notice { background-position: -32px -144px; }
|
||||
.ui-icon-help { background-position: -48px -144px; }
|
||||
.ui-icon-check { background-position: -64px -144px; }
|
||||
.ui-icon-bullet { background-position: -80px -144px; }
|
||||
.ui-icon-radio-off { background-position: -96px -144px; }
|
||||
.ui-icon-radio-on { background-position: -112px -144px; }
|
||||
.ui-icon-pin-w { background-position: -128px -144px; }
|
||||
.ui-icon-pin-s { background-position: -144px -144px; }
|
||||
.ui-icon-play { background-position: 0 -160px; }
|
||||
.ui-icon-pause { background-position: -16px -160px; }
|
||||
.ui-icon-seek-next { background-position: -32px -160px; }
|
||||
.ui-icon-seek-prev { background-position: -48px -160px; }
|
||||
.ui-icon-seek-end { background-position: -64px -160px; }
|
||||
.ui-icon-seek-start { background-position: -80px -160px; }
|
||||
/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */
|
||||
.ui-icon-seek-first { background-position: -80px -160px; }
|
||||
.ui-icon-stop { background-position: -96px -160px; }
|
||||
.ui-icon-eject { background-position: -112px -160px; }
|
||||
.ui-icon-volume-off { background-position: -128px -160px; }
|
||||
.ui-icon-volume-on { background-position: -144px -160px; }
|
||||
.ui-icon-power { background-position: 0 -176px; }
|
||||
.ui-icon-signal-diag { background-position: -16px -176px; }
|
||||
.ui-icon-signal { background-position: -32px -176px; }
|
||||
.ui-icon-battery-0 { background-position: -48px -176px; }
|
||||
.ui-icon-battery-1 { background-position: -64px -176px; }
|
||||
.ui-icon-battery-2 { background-position: -80px -176px; }
|
||||
.ui-icon-battery-3 { background-position: -96px -176px; }
|
||||
.ui-icon-circle-plus { background-position: 0 -192px; }
|
||||
.ui-icon-circle-minus { background-position: -16px -192px; }
|
||||
.ui-icon-circle-close { background-position: -32px -192px; }
|
||||
.ui-icon-circle-triangle-e { background-position: -48px -192px; }
|
||||
.ui-icon-circle-triangle-s { background-position: -64px -192px; }
|
||||
.ui-icon-circle-triangle-w { background-position: -80px -192px; }
|
||||
.ui-icon-circle-triangle-n { background-position: -96px -192px; }
|
||||
.ui-icon-circle-arrow-e { background-position: -112px -192px; }
|
||||
.ui-icon-circle-arrow-s { background-position: -128px -192px; }
|
||||
.ui-icon-circle-arrow-w { background-position: -144px -192px; }
|
||||
.ui-icon-circle-arrow-n { background-position: -160px -192px; }
|
||||
.ui-icon-circle-zoomin { background-position: -176px -192px; }
|
||||
.ui-icon-circle-zoomout { background-position: -192px -192px; }
|
||||
.ui-icon-circle-check { background-position: -208px -192px; }
|
||||
.ui-icon-circlesmall-plus { background-position: 0 -208px; }
|
||||
.ui-icon-circlesmall-minus { background-position: -16px -208px; }
|
||||
.ui-icon-circlesmall-close { background-position: -32px -208px; }
|
||||
.ui-icon-squaresmall-plus { background-position: -48px -208px; }
|
||||
.ui-icon-squaresmall-minus { background-position: -64px -208px; }
|
||||
.ui-icon-squaresmall-close { background-position: -80px -208px; }
|
||||
.ui-icon-grip-dotted-vertical { background-position: 0 -224px; }
|
||||
.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; }
|
||||
.ui-icon-grip-solid-vertical { background-position: -32px -224px; }
|
||||
.ui-icon-grip-solid-horizontal { background-position: -48px -224px; }
|
||||
.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; }
|
||||
.ui-icon-grip-diagonal-se { background-position: -80px -224px; }
|
||||
|
||||
|
||||
/* Misc visuals
|
||||
----------------------------------*/
|
||||
|
||||
/* Corner radius */
|
||||
.ui-corner-tl { -moz-border-radius-topleft: 4px; -webkit-border-top-left-radius: 4px; border-top-left-radius: 4px; }
|
||||
.ui-corner-tr { -moz-border-radius-topright: 4px; -webkit-border-top-right-radius: 4px; border-top-right-radius: 4px; }
|
||||
.ui-corner-bl { -moz-border-radius-bottomleft: 4px; -webkit-border-bottom-left-radius: 4px; border-bottom-left-radius: 4px; }
|
||||
.ui-corner-br { -moz-border-radius-bottomright: 4px; -webkit-border-bottom-right-radius: 4px; border-bottom-right-radius: 4px; }
|
||||
.ui-corner-top { -moz-border-radius-topleft: 4px; -webkit-border-top-left-radius: 4px; border-top-left-radius: 4px; -moz-border-radius-topright: 4px; -webkit-border-top-right-radius: 4px; border-top-right-radius: 4px; }
|
||||
.ui-corner-bottom { -moz-border-radius-bottomleft: 4px; -webkit-border-bottom-left-radius: 4px; border-bottom-left-radius: 4px; -moz-border-radius-bottomright: 4px; -webkit-border-bottom-right-radius: 4px; border-bottom-right-radius: 4px; }
|
||||
.ui-corner-right { -moz-border-radius-topright: 4px; -webkit-border-top-right-radius: 4px; border-top-right-radius: 4px; -moz-border-radius-bottomright: 4px; -webkit-border-bottom-right-radius: 4px; border-bottom-right-radius: 4px; }
|
||||
.ui-corner-left { -moz-border-radius-topleft: 4px; -webkit-border-top-left-radius: 4px; border-top-left-radius: 4px; -moz-border-radius-bottomleft: 4px; -webkit-border-bottom-left-radius: 4px; border-bottom-left-radius: 4px; }
|
||||
.ui-corner-all { -moz-border-radius: 4px; -webkit-border-radius: 4px; border-radius: 4px; }
|
||||
|
||||
/* Overlays */
|
||||
.ui-widget-overlay { background: #666666 url(images/ui-bg_diagonals-thick_20_666666_40x40.png) 50% 50% repeat; opacity: .50;filter:Alpha(Opacity=50); }
|
||||
.ui-widget-shadow { margin: -5px 0 0 -5px; padding: 5px; background: #000000 url(images/ui-bg_flat_10_000000_40x100.png) 50% 50% repeat-x; opacity: .20;filter:Alpha(Opacity=20); -moz-border-radius: 5px; -webkit-border-radius: 5px; border-radius: 5px; }/* Resizable
|
||||
----------------------------------*/
|
||||
.ui-resizable { position: relative;}
|
||||
.ui-resizable-handle { position: absolute;font-size: 0.1px;z-index: 99999; display: block;}
|
||||
.ui-resizable-disabled .ui-resizable-handle, .ui-resizable-autohide .ui-resizable-handle { display: none; }
|
||||
.ui-resizable-n { cursor: n-resize; height: 7px; width: 100%; top: -5px; left: 0; }
|
||||
.ui-resizable-s { cursor: s-resize; height: 7px; width: 100%; bottom: -5px; left: 0; }
|
||||
.ui-resizable-e { cursor: e-resize; width: 7px; right: -5px; top: 0; height: 100%; }
|
||||
.ui-resizable-w { cursor: w-resize; width: 7px; left: -5px; top: 0; height: 100%; }
|
||||
.ui-resizable-se { cursor: se-resize; width: 12px; height: 12px; right: 1px; bottom: 1px; }
|
||||
.ui-resizable-sw { cursor: sw-resize; width: 9px; height: 9px; left: -5px; bottom: -5px; }
|
||||
.ui-resizable-nw { cursor: nw-resize; width: 9px; height: 9px; left: -5px; top: -5px; }
|
||||
.ui-resizable-ne { cursor: ne-resize; width: 9px; height: 9px; right: -5px; top: -5px;}/* Selectable
|
||||
----------------------------------*/
|
||||
.ui-selectable-helper { border:1px dotted black }
|
||||
/* Accordion
|
||||
----------------------------------*/
|
||||
.ui-accordion .ui-accordion-header { cursor: pointer; position: relative; margin-top: 1px; zoom: 1; }
|
||||
.ui-accordion .ui-accordion-li-fix { display: inline; }
|
||||
.ui-accordion .ui-accordion-header-active { border-bottom: 0 !important; }
|
||||
.ui-accordion .ui-accordion-header a { display: block; font-size: 1em; padding: .5em .5em .5em .7em; }
|
||||
/* IE7-/Win - Fix extra vertical space in lists */
|
||||
.ui-accordion a { zoom: 1; }
|
||||
.ui-accordion-icons .ui-accordion-header a { padding-left: 2.2em; }
|
||||
.ui-accordion .ui-accordion-header .ui-icon { position: absolute; left: .5em; top: 50%; margin-top: -8px; }
|
||||
.ui-accordion .ui-accordion-content { padding: 1em 2.2em; border-top: 0; margin-top: -2px; position: relative; top: 1px; margin-bottom: 2px; overflow: auto; display: none; zoom: 1; }
|
||||
.ui-accordion .ui-accordion-content-active { display: block; }/* Autocomplete
|
||||
----------------------------------*/
|
||||
.ui-autocomplete { position: absolute; cursor: default; }
|
||||
.ui-autocomplete-loading { background: white url('images/ui-anim_basic_16x16.gif') right center no-repeat; }
|
||||
|
||||
/* workarounds */
|
||||
* html .ui-autocomplete { width:1px; } /* without this, the menu expands to 100% in IE6 */
|
||||
|
||||
/* Menu
|
||||
----------------------------------*/
|
||||
.ui-menu {
|
||||
list-style:none;
|
||||
padding: 2px;
|
||||
margin: 0;
|
||||
display:block;
|
||||
}
|
||||
.ui-menu .ui-menu {
|
||||
margin-top: -3px;
|
||||
}
|
||||
.ui-menu .ui-menu-item {
|
||||
margin:0;
|
||||
padding: 0;
|
||||
zoom: 1;
|
||||
float: left;
|
||||
clear: left;
|
||||
width: 100%;
|
||||
}
|
||||
.ui-menu .ui-menu-item a {
|
||||
text-decoration:none;
|
||||
display:block;
|
||||
padding:.2em .4em;
|
||||
line-height:1.5;
|
||||
zoom:1;
|
||||
}
|
||||
.ui-menu .ui-menu-item a.ui-state-hover,
|
||||
.ui-menu .ui-menu-item a.ui-state-active {
|
||||
font-weight: normal;
|
||||
margin: -1px;
|
||||
}
|
||||
/* Button
|
||||
----------------------------------*/
|
||||
|
||||
.ui-button { display: inline-block; position: relative; padding: 0; margin-right: .1em; text-decoration: none !important; cursor: pointer; text-align: center; zoom: 1; overflow: visible; } /* the overflow property removes extra width in IE */
|
||||
.ui-button-icon-only { width: 2.2em; } /* to make room for the icon, a width needs to be set here */
|
||||
button.ui-button-icon-only { width: 2.4em; } /* button elements seem to need a little more width */
|
||||
.ui-button-icons-only { width: 3.4em; }
|
||||
button.ui-button-icons-only { width: 3.7em; }
|
||||
|
||||
/*button text element */
|
||||
.ui-button .ui-button-text { display: block; line-height: 1.4; }
|
||||
.ui-button-text-only .ui-button-text { padding: .4em 1em; }
|
||||
.ui-button-icon-only .ui-button-text, .ui-button-icons-only .ui-button-text { padding: .4em; text-indent: -9999999px; }
|
||||
.ui-button-text-icon .ui-button-text, .ui-button-text-icons .ui-button-text { padding: .4em 1em .4em 2.1em; }
|
||||
.ui-button-text-icons .ui-button-text { padding-left: 2.1em; padding-right: 2.1em; }
|
||||
/* no icon support for input elements, provide padding by default */
|
||||
input.ui-button { padding: .4em 1em; }
|
||||
|
||||
/*button icon element(s) */
|
||||
.ui-button-icon-only .ui-icon, .ui-button-text-icon .ui-icon, .ui-button-text-icons .ui-icon, .ui-button-icons-only .ui-icon { position: absolute; top: 50%; margin-top: -8px; }
|
||||
.ui-button-icon-only .ui-icon { left: 50%; margin-left: -8px; }
|
||||
.ui-button-text-icon .ui-button-icon-primary, .ui-button-text-icons .ui-button-icon-primary, .ui-button-icons-only .ui-button-icon-primary { left: .5em; }
|
||||
.ui-button-text-icons .ui-button-icon-secondary, .ui-button-icons-only .ui-button-icon-secondary { right: .5em; }
|
||||
|
||||
/*button sets*/
|
||||
.ui-buttonset { margin-right: 7px; }
|
||||
.ui-buttonset .ui-button { margin-left: 0; margin-right: -.3em; }
|
||||
|
||||
/* workarounds */
|
||||
button.ui-button::-moz-focus-inner { border: 0; padding: 0; } /* reset extra padding in Firefox */
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/* Dialog
|
||||
----------------------------------*/
|
||||
.ui-dialog { position: absolute; padding: .2em; width: 300px; overflow: hidden; }
|
||||
.ui-dialog .ui-dialog-titlebar { padding: .5em 1em .3em; position: relative; }
|
||||
.ui-dialog .ui-dialog-title { float: left; margin: .1em 16px .2em 0; }
|
||||
.ui-dialog .ui-dialog-titlebar-close { position: absolute; right: .3em; top: 50%; width: 19px; margin: -10px 0 0 0; padding: 1px; height: 18px; }
|
||||
.ui-dialog .ui-dialog-titlebar-close span { display: block; margin: 1px; }
|
||||
.ui-dialog .ui-dialog-titlebar-close:hover, .ui-dialog .ui-dialog-titlebar-close:focus { padding: 0; }
|
||||
.ui-dialog .ui-dialog-content { border: 0; padding: .5em 1em; background: none; overflow: auto; zoom: 1; }
|
||||
.ui-dialog .ui-dialog-buttonpane { text-align: left; border-width: 1px 0 0 0; background-image: none; margin: .5em 0 0 0; padding: .3em 1em .5em .4em; }
|
||||
.ui-dialog .ui-dialog-buttonpane button { float: right; margin: .5em .4em .5em 0; cursor: pointer; padding: .2em .6em .3em .6em; line-height: 1.4em; width:auto; overflow:visible; }
|
||||
.ui-dialog .ui-resizable-se { width: 14px; height: 14px; right: 3px; bottom: 3px; }
|
||||
.ui-draggable .ui-dialog-titlebar { cursor: move; }
|
||||
/* Slider
|
||||
----------------------------------*/
|
||||
.ui-slider { position: relative; text-align: left; }
|
||||
.ui-slider .ui-slider-handle { position: absolute; z-index: 2; width: 1.2em; height: 1.2em; cursor: default; }
|
||||
.ui-slider .ui-slider-range { position: absolute; z-index: 1; font-size: .7em; display: block; border: 0; background-position: 0 0; }
|
||||
|
||||
.ui-slider-horizontal { height: .8em; }
|
||||
.ui-slider-horizontal .ui-slider-handle { top: -.3em; margin-left: -.6em; }
|
||||
.ui-slider-horizontal .ui-slider-range { top: 0; height: 100%; }
|
||||
.ui-slider-horizontal .ui-slider-range-min { left: 0; }
|
||||
.ui-slider-horizontal .ui-slider-range-max { right: 0; }
|
||||
|
||||
.ui-slider-vertical { width: .8em; height: 100px; }
|
||||
.ui-slider-vertical .ui-slider-handle { left: -.3em; margin-left: 0; margin-bottom: -.6em; }
|
||||
.ui-slider-vertical .ui-slider-range { left: 0; width: 100%; }
|
||||
.ui-slider-vertical .ui-slider-range-min { bottom: 0; }
|
||||
.ui-slider-vertical .ui-slider-range-max { top: 0; }/* Tabs
|
||||
----------------------------------*/
|
||||
.ui-tabs { position: relative; padding: .2em; zoom: 1; } /* position: relative prevents IE scroll bug (element with position: relative inside container with overflow: auto appear as "fixed") */
|
||||
.ui-tabs .ui-tabs-nav { margin: 0; padding: .2em .2em 0; }
|
||||
.ui-tabs .ui-tabs-nav li { list-style: none; float: left; position: relative; top: 1px; margin: 0 .2em 1px 0; border-bottom: 0 !important; padding: 0; white-space: nowrap; }
|
||||
.ui-tabs .ui-tabs-nav li a { float: left; padding: .5em 1em; text-decoration: none; }
|
||||
.ui-tabs .ui-tabs-nav li.ui-tabs-selected { margin-bottom: 0; padding-bottom: 1px; }
|
||||
.ui-tabs .ui-tabs-nav li.ui-tabs-selected a, .ui-tabs .ui-tabs-nav li.ui-state-disabled a, .ui-tabs .ui-tabs-nav li.ui-state-processing a { cursor: text; }
|
||||
.ui-tabs .ui-tabs-nav li a, .ui-tabs.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-selected a { cursor: pointer; } /* first selector in group seems obsolete, but required to overcome bug in Opera applying cursor: text overall if defined elsewhere... */
|
||||
.ui-tabs .ui-tabs-panel { display: block; border-width: 0; padding: 1em 1.4em; background: none; }
|
||||
.ui-tabs .ui-tabs-hide { display: none !important; }
|
||||
/* Datepicker
|
||||
----------------------------------*/
|
||||
.ui-datepicker { width: 17em; padding: .2em .2em 0; }
|
||||
.ui-datepicker .ui-datepicker-header { position:relative; padding:.2em 0; }
|
||||
.ui-datepicker .ui-datepicker-prev, .ui-datepicker .ui-datepicker-next { position:absolute; top: 2px; width: 1.8em; height: 1.8em; }
|
||||
.ui-datepicker .ui-datepicker-prev-hover, .ui-datepicker .ui-datepicker-next-hover { top: 1px; }
|
||||
.ui-datepicker .ui-datepicker-prev { left:2px; }
|
||||
.ui-datepicker .ui-datepicker-next { right:2px; }
|
||||
.ui-datepicker .ui-datepicker-prev-hover { left:1px; }
|
||||
.ui-datepicker .ui-datepicker-next-hover { right:1px; }
|
||||
.ui-datepicker .ui-datepicker-prev span, .ui-datepicker .ui-datepicker-next span { display: block; position: absolute; left: 50%; margin-left: -8px; top: 50%; margin-top: -8px; }
|
||||
.ui-datepicker .ui-datepicker-title { margin: 0 2.3em; line-height: 1.8em; text-align: center; }
|
||||
.ui-datepicker .ui-datepicker-title select { font-size:1em; margin:1px 0; }
|
||||
.ui-datepicker select.ui-datepicker-month-year {width: 100%;}
|
||||
.ui-datepicker select.ui-datepicker-month,
|
||||
.ui-datepicker select.ui-datepicker-year { width: 49%;}
|
||||
.ui-datepicker table {width: 100%; font-size: .9em; border-collapse: collapse; margin:0 0 .4em; }
|
||||
.ui-datepicker th { padding: .7em .3em; text-align: center; font-weight: bold; border: 0; }
|
||||
.ui-datepicker td { border: 0; padding: 1px; }
|
||||
.ui-datepicker td span, .ui-datepicker td a { display: block; padding: .2em; text-align: right; text-decoration: none; }
|
||||
.ui-datepicker .ui-datepicker-buttonpane { background-image: none; margin: .7em 0 0 0; padding:0 .2em; border-left: 0; border-right: 0; border-bottom: 0; }
|
||||
.ui-datepicker .ui-datepicker-buttonpane button { float: right; margin: .5em .2em .4em; cursor: pointer; padding: .2em .6em .3em .6em; width:auto; overflow:visible; }
|
||||
.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current { float:left; }
|
||||
|
||||
/* with multiple calendars */
|
||||
.ui-datepicker.ui-datepicker-multi { width:auto; }
|
||||
.ui-datepicker-multi .ui-datepicker-group { float:left; }
|
||||
.ui-datepicker-multi .ui-datepicker-group table { width:95%; margin:0 auto .4em; }
|
||||
.ui-datepicker-multi-2 .ui-datepicker-group { width:50%; }
|
||||
.ui-datepicker-multi-3 .ui-datepicker-group { width:33.3%; }
|
||||
.ui-datepicker-multi-4 .ui-datepicker-group { width:25%; }
|
||||
.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header { border-left-width:0; }
|
||||
.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header { border-left-width:0; }
|
||||
.ui-datepicker-multi .ui-datepicker-buttonpane { clear:left; }
|
||||
.ui-datepicker-row-break { clear:both; width:100%; }
|
||||
|
||||
/* RTL support */
|
||||
.ui-datepicker-rtl { direction: rtl; }
|
||||
.ui-datepicker-rtl .ui-datepicker-prev { right: 2px; left: auto; }
|
||||
.ui-datepicker-rtl .ui-datepicker-next { left: 2px; right: auto; }
|
||||
.ui-datepicker-rtl .ui-datepicker-prev:hover { right: 1px; left: auto; }
|
||||
.ui-datepicker-rtl .ui-datepicker-next:hover { left: 1px; right: auto; }
|
||||
.ui-datepicker-rtl .ui-datepicker-buttonpane { clear:right; }
|
||||
.ui-datepicker-rtl .ui-datepicker-buttonpane button { float: left; }
|
||||
.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current { float:right; }
|
||||
.ui-datepicker-rtl .ui-datepicker-group { float:right; }
|
||||
.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header { border-right-width:0; border-left-width:1px; }
|
||||
.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header { border-right-width:0; border-left-width:1px; }
|
||||
|
||||
/* IE6 IFRAME FIX (taken from datepicker 1.5.3 */
|
||||
.ui-datepicker-cover {
|
||||
display: none; /*sorry for IE5*/
|
||||
display/**/: block; /*sorry for IE5*/
|
||||
position: absolute; /*must have*/
|
||||
z-index: -1; /*must have*/
|
||||
filter: mask(); /*must have*/
|
||||
top: -4px; /*must have*/
|
||||
left: -4px; /*must have*/
|
||||
width: 200px; /*must have*/
|
||||
height: 200px; /*must have*/
|
||||
}/* Progressbar
|
||||
----------------------------------*/
|
||||
.ui-progressbar { height:2em; text-align: left; }
|
||||
.ui-progressbar .ui-progressbar-value {margin: -1px; height:100%; }
|
Разница между файлами не показана из-за своего большого размера
Загрузить разницу
|
@ -0,0 +1,49 @@
|
|||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
|
||||
<meta charset=utf8>
|
||||
|
||||
<!--
|
||||
Copyright (C) 2007 Apple Inc. All rights reserved.
|
||||
Copyright (C) 2010 Mozilla Foundation
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions
|
||||
are met:
|
||||
1. Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
2. 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 APPLE COMPUTER, INC. ``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 APPLE COMPUTER, INC. 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.
|
||||
-->
|
||||
|
||||
<title>Kraken JavaScript Benchmark: Gaussian Blur</title>
|
||||
<link rel="stylesheet" href="../kraken.css">
|
||||
<script>
|
||||
|
||||
</script>
|
||||
<style> #display { border: 5px solid rgb(0,0,50);}</style>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<div id="content">
|
||||
<h2>Kraken JavaScript Benchmark: Oscillator</h2>
|
||||
<div id="results">
|
||||
<p>This benchmark generates a soundwave using code from <a href="http://github.com/corbanbrook/dsp.js/">DSP.js</a>.</p>
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
|
@ -0,0 +1,49 @@
|
|||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
|
||||
<meta charset=utf8>
|
||||
|
||||
<!--
|
||||
Copyright (C) 2007 Apple Inc. All rights reserved.
|
||||
Copyright (C) 2010 Mozilla Foundation
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions
|
||||
are met:
|
||||
1. Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
2. 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 APPLE COMPUTER, INC. ``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 APPLE COMPUTER, INC. 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.
|
||||
-->
|
||||
|
||||
<title>Kraken JavaScript Benchmark: JSON Parse - Financial</title>
|
||||
<link rel="stylesheet" href="../kraken.css">
|
||||
<script>
|
||||
|
||||
</script>
|
||||
<style> #display { border: 5px solid rgb(0,0,50);}</style>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<div id="content">
|
||||
<h2>Kraken JavaScript Benchmark: JSON Parse - Financial</h2>
|
||||
<div id="results">
|
||||
<p>This benchmark parses <a href="http://www.json.org">JSON</a> records.</p>
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
Двоичный файл не отображается.
После Ширина: | Высота: | Размер: 172 KiB |
|
@ -0,0 +1,49 @@
|
|||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
|
||||
<meta charset=utf8>
|
||||
|
||||
<!--
|
||||
Copyright (C) 2007 Apple Inc. All rights reserved.
|
||||
Copyright (C) 2010 Mozilla Foundation
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions
|
||||
are met:
|
||||
1. Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
2. 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 APPLE COMPUTER, INC. ``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 APPLE COMPUTER, INC. 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.
|
||||
-->
|
||||
|
||||
<title>Kraken JavaScript Benchmark: JSON Stringify - Tinderbox</title>
|
||||
<link rel="stylesheet" href="../kraken.css">
|
||||
<script>
|
||||
|
||||
</script>
|
||||
<style> #display { border: 5px solid rgb(0,0,50);}</style>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<div id="content">
|
||||
<h2>Kraken JavaScript Benchmark: JSON Stringify - Tinderbox</h2>
|
||||
<div id="results">
|
||||
<p>This benchmark serializes <a href="http://tests.themasta.com/tinderboxpushlog/?tree=Firefox">Tinderbox</a> build data to <a href="http://www.json.org">JSON</a>.</p>
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
Двоичный файл не отображается.
После Ширина: | Высота: | Размер: 65 KiB |
|
@ -0,0 +1,46 @@
|
|||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
|
||||
<meta charset=utf8>
|
||||
|
||||
<!--
|
||||
Copyright (C) 2007 Apple Inc. All rights reserved.
|
||||
Copyright (C) 2010 Mozilla Foundation
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions
|
||||
are met:
|
||||
1. Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
2. 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 APPLE COMPUTER, INC. ``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 APPLE COMPUTER, INC. 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.
|
||||
-->
|
||||
|
||||
<title>Kraken JavaScript Benchmark (version 1.1)</title>
|
||||
<link rel="stylesheet" href="kraken.css">
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<div id="content">
|
||||
<h2>Kraken JavaScript Benchmark (version 1.1)</h2>
|
||||
<div id="results">
|
||||
<p><a href="kraken-1.1/driver.html">Begin</a> <small>(This will start a rather big download)</small></p>
|
||||
<p></p>
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
|
@ -0,0 +1,481 @@
|
|||
/*
|
||||
http://www.JSON.org/json2.js
|
||||
2009-09-29
|
||||
|
||||
Public Domain.
|
||||
|
||||
NO WARRANTY EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK.
|
||||
|
||||
See http://www.JSON.org/js.html
|
||||
|
||||
|
||||
This code should be minified before deployment.
|
||||
See http://javascript.crockford.com/jsmin.html
|
||||
|
||||
USE YOUR OWN COPY. IT IS EXTREMELY UNWISE TO LOAD CODE FROM SERVERS YOU DO
|
||||
NOT CONTROL.
|
||||
|
||||
|
||||
This file creates a global JSON object containing two methods: stringify
|
||||
and parse.
|
||||
|
||||
JSON.stringify(value, replacer, space)
|
||||
value any JavaScript value, usually an object or array.
|
||||
|
||||
replacer an optional parameter that determines how object
|
||||
values are stringified for objects. It can be a
|
||||
function or an array of strings.
|
||||
|
||||
space an optional parameter that specifies the indentation
|
||||
of nested structures. If it is omitted, the text will
|
||||
be packed without extra whitespace. If it is a number,
|
||||
it will specify the number of spaces to indent at each
|
||||
level. If it is a string (such as '\t' or ' '),
|
||||
it contains the characters used to indent at each level.
|
||||
|
||||
This method produces a JSON text from a JavaScript value.
|
||||
|
||||
When an object value is found, if the object contains a toJSON
|
||||
method, its toJSON method will be called and the result will be
|
||||
stringified. A toJSON method does not serialize: it returns the
|
||||
value represented by the name/value pair that should be serialized,
|
||||
or undefined if nothing should be serialized. The toJSON method
|
||||
will be passed the key associated with the value, and this will be
|
||||
bound to the value
|
||||
|
||||
For example, this would serialize Dates as ISO strings.
|
||||
|
||||
Date.prototype.toJSON = function (key) {
|
||||
function f(n) {
|
||||
// Format integers to have at least two digits.
|
||||
return n < 10 ? '0' + n : n;
|
||||
}
|
||||
|
||||
return this.getUTCFullYear() + '-' +
|
||||
f(this.getUTCMonth() + 1) + '-' +
|
||||
f(this.getUTCDate()) + 'T' +
|
||||
f(this.getUTCHours()) + ':' +
|
||||
f(this.getUTCMinutes()) + ':' +
|
||||
f(this.getUTCSeconds()) + 'Z';
|
||||
};
|
||||
|
||||
You can provide an optional replacer method. It will be passed the
|
||||
key and value of each member, with this bound to the containing
|
||||
object. The value that is returned from your method will be
|
||||
serialized. If your method returns undefined, then the member will
|
||||
be excluded from the serialization.
|
||||
|
||||
If the replacer parameter is an array of strings, then it will be
|
||||
used to select the members to be serialized. It filters the results
|
||||
such that only members with keys listed in the replacer array are
|
||||
stringified.
|
||||
|
||||
Values that do not have JSON representations, such as undefined or
|
||||
functions, will not be serialized. Such values in objects will be
|
||||
dropped; in arrays they will be replaced with null. You can use
|
||||
a replacer function to replace those with JSON values.
|
||||
JSON.stringify(undefined) returns undefined.
|
||||
|
||||
The optional space parameter produces a stringification of the
|
||||
value that is filled with line breaks and indentation to make it
|
||||
easier to read.
|
||||
|
||||
If the space parameter is a non-empty string, then that string will
|
||||
be used for indentation. If the space parameter is a number, then
|
||||
the indentation will be that many spaces.
|
||||
|
||||
Example:
|
||||
|
||||
text = JSON.stringify(['e', {pluribus: 'unum'}]);
|
||||
// text is '["e",{"pluribus":"unum"}]'
|
||||
|
||||
|
||||
text = JSON.stringify(['e', {pluribus: 'unum'}], null, '\t');
|
||||
// text is '[\n\t"e",\n\t{\n\t\t"pluribus": "unum"\n\t}\n]'
|
||||
|
||||
text = JSON.stringify([new Date()], function (key, value) {
|
||||
return this[key] instanceof Date ?
|
||||
'Date(' + this[key] + ')' : value;
|
||||
});
|
||||
// text is '["Date(---current time---)"]'
|
||||
|
||||
|
||||
JSON.parse(text, reviver)
|
||||
This method parses a JSON text to produce an object or array.
|
||||
It can throw a SyntaxError exception.
|
||||
|
||||
The optional reviver parameter is a function that can filter and
|
||||
transform the results. It receives each of the keys and values,
|
||||
and its return value is used instead of the original value.
|
||||
If it returns what it received, then the structure is not modified.
|
||||
If it returns undefined then the member is deleted.
|
||||
|
||||
Example:
|
||||
|
||||
// Parse the text. Values that look like ISO date strings will
|
||||
// be converted to Date objects.
|
||||
|
||||
myData = JSON.parse(text, function (key, value) {
|
||||
var a;
|
||||
if (typeof value === 'string') {
|
||||
a =
|
||||
/^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}(?:\.\d*)?)Z$/.exec(value);
|
||||
if (a) {
|
||||
return new Date(Date.UTC(+a[1], +a[2] - 1, +a[3], +a[4],
|
||||
+a[5], +a[6]));
|
||||
}
|
||||
}
|
||||
return value;
|
||||
});
|
||||
|
||||
myData = JSON.parse('["Date(09/09/2001)"]', function (key, value) {
|
||||
var d;
|
||||
if (typeof value === 'string' &&
|
||||
value.slice(0, 5) === 'Date(' &&
|
||||
value.slice(-1) === ')') {
|
||||
d = new Date(value.slice(5, -1));
|
||||
if (d) {
|
||||
return d;
|
||||
}
|
||||
}
|
||||
return value;
|
||||
});
|
||||
|
||||
|
||||
This is a reference implementation. You are free to copy, modify, or
|
||||
redistribute.
|
||||
*/
|
||||
|
||||
/*jslint evil: true, strict: false */
|
||||
|
||||
/*members "", "\b", "\t", "\n", "\f", "\r", "\"", JSON, "\\", apply,
|
||||
call, charCodeAt, getUTCDate, getUTCFullYear, getUTCHours,
|
||||
getUTCMinutes, getUTCMonth, getUTCSeconds, hasOwnProperty, join,
|
||||
lastIndex, length, parse, prototype, push, replace, slice, stringify,
|
||||
test, toJSON, toString, valueOf
|
||||
*/
|
||||
|
||||
|
||||
// Create a JSON object only if one does not already exist. We create the
|
||||
// methods in a closure to avoid creating global variables.
|
||||
|
||||
if (!this.JSON) {
|
||||
this.JSON = {};
|
||||
}
|
||||
|
||||
(function () {
|
||||
|
||||
function f(n) {
|
||||
// Format integers to have at least two digits.
|
||||
return n < 10 ? '0' + n : n;
|
||||
}
|
||||
|
||||
if (typeof Date.prototype.toJSON !== 'function') {
|
||||
|
||||
Date.prototype.toJSON = function (key) {
|
||||
|
||||
return isFinite(this.valueOf()) ?
|
||||
this.getUTCFullYear() + '-' +
|
||||
f(this.getUTCMonth() + 1) + '-' +
|
||||
f(this.getUTCDate()) + 'T' +
|
||||
f(this.getUTCHours()) + ':' +
|
||||
f(this.getUTCMinutes()) + ':' +
|
||||
f(this.getUTCSeconds()) + 'Z' : null;
|
||||
};
|
||||
|
||||
String.prototype.toJSON =
|
||||
Number.prototype.toJSON =
|
||||
Boolean.prototype.toJSON = function (key) {
|
||||
return this.valueOf();
|
||||
};
|
||||
}
|
||||
|
||||
var cx = /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,
|
||||
escapable = /[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,
|
||||
gap,
|
||||
indent,
|
||||
meta = { // table of character substitutions
|
||||
'\b': '\\b',
|
||||
'\t': '\\t',
|
||||
'\n': '\\n',
|
||||
'\f': '\\f',
|
||||
'\r': '\\r',
|
||||
'"' : '\\"',
|
||||
'\\': '\\\\'
|
||||
},
|
||||
rep;
|
||||
|
||||
|
||||
function quote(string) {
|
||||
|
||||
// If the string contains no control characters, no quote characters, and no
|
||||
// backslash characters, then we can safely slap some quotes around it.
|
||||
// Otherwise we must also replace the offending characters with safe escape
|
||||
// sequences.
|
||||
|
||||
escapable.lastIndex = 0;
|
||||
return escapable.test(string) ?
|
||||
'"' + string.replace(escapable, function (a) {
|
||||
var c = meta[a];
|
||||
return typeof c === 'string' ? c :
|
||||
'\\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4);
|
||||
}) + '"' :
|
||||
'"' + string + '"';
|
||||
}
|
||||
|
||||
|
||||
function str(key, holder) {
|
||||
|
||||
// Produce a string from holder[key].
|
||||
|
||||
var i, // The loop counter.
|
||||
k, // The member key.
|
||||
v, // The member value.
|
||||
length,
|
||||
mind = gap,
|
||||
partial,
|
||||
value = holder[key];
|
||||
|
||||
// If the value has a toJSON method, call it to obtain a replacement value.
|
||||
|
||||
if (value && typeof value === 'object' &&
|
||||
typeof value.toJSON === 'function') {
|
||||
value = value.toJSON(key);
|
||||
}
|
||||
|
||||
// If we were called with a replacer function, then call the replacer to
|
||||
// obtain a replacement value.
|
||||
|
||||
if (typeof rep === 'function') {
|
||||
value = rep.call(holder, key, value);
|
||||
}
|
||||
|
||||
// What happens next depends on the value's type.
|
||||
|
||||
switch (typeof value) {
|
||||
case 'string':
|
||||
return quote(value);
|
||||
|
||||
case 'number':
|
||||
|
||||
// JSON numbers must be finite. Encode non-finite numbers as null.
|
||||
|
||||
return isFinite(value) ? String(value) : 'null';
|
||||
|
||||
case 'boolean':
|
||||
case 'null':
|
||||
|
||||
// If the value is a boolean or null, convert it to a string. Note:
|
||||
// typeof null does not produce 'null'. The case is included here in
|
||||
// the remote chance that this gets fixed someday.
|
||||
|
||||
return String(value);
|
||||
|
||||
// If the type is 'object', we might be dealing with an object or an array or
|
||||
// null.
|
||||
|
||||
case 'object':
|
||||
|
||||
// Due to a specification blunder in ECMAScript, typeof null is 'object',
|
||||
// so watch out for that case.
|
||||
|
||||
if (!value) {
|
||||
return 'null';
|
||||
}
|
||||
|
||||
// Make an array to hold the partial results of stringifying this object value.
|
||||
|
||||
gap += indent;
|
||||
partial = [];
|
||||
|
||||
// Is the value an array?
|
||||
|
||||
if (Object.prototype.toString.apply(value) === '[object Array]') {
|
||||
|
||||
// The value is an array. Stringify every element. Use null as a placeholder
|
||||
// for non-JSON values.
|
||||
|
||||
length = value.length;
|
||||
for (i = 0; i < length; i += 1) {
|
||||
partial[i] = str(i, value) || 'null';
|
||||
}
|
||||
|
||||
// Join all of the elements together, separated with commas, and wrap them in
|
||||
// brackets.
|
||||
|
||||
v = partial.length === 0 ? '[]' :
|
||||
gap ? '[\n' + gap +
|
||||
partial.join(',\n' + gap) + '\n' +
|
||||
mind + ']' :
|
||||
'[' + partial.join(',') + ']';
|
||||
gap = mind;
|
||||
return v;
|
||||
}
|
||||
|
||||
// If the replacer is an array, use it to select the members to be stringified.
|
||||
|
||||
if (rep && typeof rep === 'object') {
|
||||
length = rep.length;
|
||||
for (i = 0; i < length; i += 1) {
|
||||
k = rep[i];
|
||||
if (typeof k === 'string') {
|
||||
v = str(k, value);
|
||||
if (v) {
|
||||
partial.push(quote(k) + (gap ? ': ' : ':') + v);
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
|
||||
// Otherwise, iterate through all of the keys in the object.
|
||||
|
||||
for (k in value) {
|
||||
if (Object.hasOwnProperty.call(value, k)) {
|
||||
v = str(k, value);
|
||||
if (v) {
|
||||
partial.push(quote(k) + (gap ? ': ' : ':') + v);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Join all of the member texts together, separated with commas,
|
||||
// and wrap them in braces.
|
||||
|
||||
v = partial.length === 0 ? '{}' :
|
||||
gap ? '{\n' + gap + partial.join(',\n' + gap) + '\n' +
|
||||
mind + '}' : '{' + partial.join(',') + '}';
|
||||
gap = mind;
|
||||
return v;
|
||||
}
|
||||
}
|
||||
|
||||
// If the JSON object does not yet have a stringify method, give it one.
|
||||
|
||||
if (typeof JSON.stringify !== 'function') {
|
||||
JSON.stringify = function (value, replacer, space) {
|
||||
|
||||
// The stringify method takes a value and an optional replacer, and an optional
|
||||
// space parameter, and returns a JSON text. The replacer can be a function
|
||||
// that can replace values, or an array of strings that will select the keys.
|
||||
// A default replacer method can be provided. Use of the space parameter can
|
||||
// produce text that is more easily readable.
|
||||
|
||||
var i;
|
||||
gap = '';
|
||||
indent = '';
|
||||
|
||||
// If the space parameter is a number, make an indent string containing that
|
||||
// many spaces.
|
||||
|
||||
if (typeof space === 'number') {
|
||||
for (i = 0; i < space; i += 1) {
|
||||
indent += ' ';
|
||||
}
|
||||
|
||||
// If the space parameter is a string, it will be used as the indent string.
|
||||
|
||||
} else if (typeof space === 'string') {
|
||||
indent = space;
|
||||
}
|
||||
|
||||
// If there is a replacer, it must be a function or an array.
|
||||
// Otherwise, throw an error.
|
||||
|
||||
rep = replacer;
|
||||
if (replacer && typeof replacer !== 'function' &&
|
||||
(typeof replacer !== 'object' ||
|
||||
typeof replacer.length !== 'number')) {
|
||||
throw new Error('JSON.stringify');
|
||||
}
|
||||
|
||||
// Make a fake root object containing our value under the key of ''.
|
||||
// Return the result of stringifying the value.
|
||||
|
||||
return str('', {'': value});
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
// If the JSON object does not yet have a parse method, give it one.
|
||||
|
||||
if (typeof JSON.parse !== 'function') {
|
||||
JSON.parse = function (text, reviver) {
|
||||
|
||||
// The parse method takes a text and an optional reviver function, and returns
|
||||
// a JavaScript value if the text is a valid JSON text.
|
||||
|
||||
var j;
|
||||
|
||||
function walk(holder, key) {
|
||||
|
||||
// The walk method is used to recursively walk the resulting structure so
|
||||
// that modifications can be made.
|
||||
|
||||
var k, v, value = holder[key];
|
||||
if (value && typeof value === 'object') {
|
||||
for (k in value) {
|
||||
if (Object.hasOwnProperty.call(value, k)) {
|
||||
v = walk(value, k);
|
||||
if (v !== undefined) {
|
||||
value[k] = v;
|
||||
} else {
|
||||
delete value[k];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return reviver.call(holder, key, value);
|
||||
}
|
||||
|
||||
|
||||
// Parsing happens in four stages. In the first stage, we replace certain
|
||||
// Unicode characters with escape sequences. JavaScript handles many characters
|
||||
// incorrectly, either silently deleting them, or treating them as line endings.
|
||||
|
||||
cx.lastIndex = 0;
|
||||
if (cx.test(text)) {
|
||||
text = text.replace(cx, function (a) {
|
||||
return '\\u' +
|
||||
('0000' + a.charCodeAt(0).toString(16)).slice(-4);
|
||||
});
|
||||
}
|
||||
|
||||
// In the second stage, we run the text against regular expressions that look
|
||||
// for non-JSON patterns. We are especially concerned with '()' and 'new'
|
||||
// because they can cause invocation, and '=' because it can cause mutation.
|
||||
// But just to be safe, we want to reject all unexpected forms.
|
||||
|
||||
// We split the second stage into 4 regexp operations in order to work around
|
||||
// crippling inefficiencies in IE's and Safari's regexp engines. First we
|
||||
// replace the JSON backslash pairs with '@' (a non-JSON character). Second, we
|
||||
// replace all simple value tokens with ']' characters. Third, we delete all
|
||||
// open brackets that follow a colon or comma or that begin the text. Finally,
|
||||
// we look to see that the remaining characters are only whitespace or ']' or
|
||||
// ',' or ':' or '{' or '}'. If that is so, then the text is safe for eval.
|
||||
|
||||
if (/^[\],:{}\s]*$/.
|
||||
test(text.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, '@').
|
||||
replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']').
|
||||
replace(/(?:^|:|,)(?:\s*\[)+/g, ''))) {
|
||||
|
||||
// In the third stage we use the eval function to compile the text into a
|
||||
// JavaScript structure. The '{' operator is subject to a syntactic ambiguity
|
||||
// in JavaScript: it can begin a block or an object literal. We wrap the text
|
||||
// in parens to eliminate the ambiguity.
|
||||
|
||||
j = eval('(' + text + ')');
|
||||
|
||||
// In the optional fourth stage, we recursively walk the new structure, passing
|
||||
// each name/value pair to a reviver function for possible transformation.
|
||||
|
||||
return typeof reviver === 'function' ?
|
||||
walk({'': j}, '') : j;
|
||||
}
|
||||
|
||||
// If the text is not JSON parseable, then a SyntaxError is thrown.
|
||||
|
||||
throw new SyntaxError('JSON.parse');
|
||||
};
|
||||
}
|
||||
}());
|
|
@ -0,0 +1,54 @@
|
|||
|
||||
body {
|
||||
font-family: Helvetica, Arial, sans-serif;
|
||||
margin: 20px;
|
||||
background-color: #ffffff;
|
||||
color: #1B0636
|
||||
}
|
||||
|
||||
h2 {
|
||||
background-color: #fff;
|
||||
padding: 30px 20px 20px 20px;
|
||||
border-bottom: 3px solid white;
|
||||
color: black;
|
||||
zoom: 1.0 /* I CAN HAS LAYOUT? (ie hack) */
|
||||
}
|
||||
|
||||
#content {
|
||||
width: 1000px;
|
||||
margin-left: auto;
|
||||
margin-right: auto;
|
||||
}
|
||||
|
||||
#results {
|
||||
padding: 0 20px 20px 20px;
|
||||
}
|
||||
|
||||
|
||||
:link { color: #1363A1 }
|
||||
:visited { color: #1363A1 }
|
||||
|
||||
#testframe { float: left;
|
||||
margin-top: 20px;
|
||||
width: 500px;
|
||||
height: 200px;
|
||||
background-color: white;
|
||||
border: 1px solid #1B0636;}
|
||||
|
||||
#squares {
|
||||
float: left;
|
||||
margin-left: 10px;
|
||||
margin-top: 20px;
|
||||
}
|
||||
|
||||
span.incomplete-square {
|
||||
color: #cccccc;
|
||||
}
|
||||
|
||||
span.complete-square {
|
||||
color: #e7c0c0;
|
||||
}
|
||||
|
||||
small.fine {
|
||||
color: #cccccc;
|
||||
}
|
|
@ -0,0 +1,106 @@
|
|||
#!/usr/bin/python
|
||||
|
||||
# Copyright (C) 2007 Apple Inc. All rights reserved.
|
||||
# Copyright (C) 2010 Mozilla Foundation
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions
|
||||
# are met:
|
||||
# 1. Redistributions of source code must retain the above copyright
|
||||
# notice, this list of conditions and the following disclaimer.
|
||||
# 2. 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 APPLE COMPUTER, INC. ``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 APPLE COMPUTER, INC. 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.
|
||||
|
||||
from __future__ import with_statement
|
||||
import os
|
||||
import shutil
|
||||
|
||||
suites = ["kraken-1.1", "kraken-1.0", "sunspider-0.9.1"]
|
||||
|
||||
def readTemplate(path):
|
||||
with open(path, 'r') as f:
|
||||
return f.read()
|
||||
|
||||
template = readTemplate("resources/TEMPLATE.html")
|
||||
driverTemplate = readTemplate("resources/driver-TEMPLATE.html")
|
||||
resultsTemplate = readTemplate("resources/results-TEMPLATE.html")
|
||||
|
||||
def testListForSuite(suite):
|
||||
tests = []
|
||||
with open("./tests/%s/LIST" % suite, "r") as f:
|
||||
for line in f.readlines():
|
||||
tests.append(line.strip())
|
||||
return tests
|
||||
|
||||
def categoriesFromTests(tests):
|
||||
categories = set()
|
||||
for test in tests:
|
||||
categories.add(test[:test.find("-")])
|
||||
categories = list(categories)
|
||||
categories.sort()
|
||||
return categories
|
||||
|
||||
def escapeTestContent(test,suite):
|
||||
with open("tests/" + suite + "/" + test + ".js") as f:
|
||||
script = f.read()
|
||||
output = template
|
||||
output = output.replace("@NAME@", test)
|
||||
output = output.replace("@SCRIPT@", script)
|
||||
dataPath = "tests/" + suite + "/" + test + "-data.js"
|
||||
if (os.path.exists(dataPath)):
|
||||
with open(dataPath) as f:
|
||||
datascript = f.read()
|
||||
output = output.replace("@DATASCRIPT@", datascript)
|
||||
datascript = None
|
||||
output = output.replace("\\", "\\\\")
|
||||
output = output.replace('"', '\\"')
|
||||
output = output.replace("\n", "\\n\\\n")
|
||||
return output
|
||||
|
||||
def testContentsFromTests(suite, tests):
|
||||
testContents = [];
|
||||
for test in tests:
|
||||
testContents.append(escapeTestContent(test, suite))
|
||||
return testContents
|
||||
|
||||
def writeTemplate(suite, template, fileName):
|
||||
output = template.replace("@SUITE@", suite)
|
||||
with open("hosted/" + suite + "/" + fileName, "w") as f:
|
||||
f.write(output)
|
||||
|
||||
for suite in suites:
|
||||
suiteDir = os.path.join("hosted", suite)
|
||||
if not os.path.exists(suiteDir):
|
||||
os.mkdir(suiteDir)
|
||||
tests = testListForSuite(suite)
|
||||
categories = categoriesFromTests(tests)
|
||||
testContents = testContentsFromTests(suite, tests)
|
||||
writeTemplate(suite, driverTemplate, "driver.html")
|
||||
writeTemplate(suite, resultsTemplate, "results.html")
|
||||
|
||||
prefix = "var tests = [ " + ", ".join(['"%s"' % s for s in tests]) + " ];\n"
|
||||
prefix += "var categories = [ " + ", ".join(['"%s"' % s for s in categories]) + " ];\n"
|
||||
with open("hosted/" + suite + "/test-prefix.js", "w") as f:
|
||||
f.write(prefix)
|
||||
|
||||
contents = "var testContents = [ " + ", ".join(['"%s"' % s for s in testContents]) + " ];\n"
|
||||
with open("hosted/" + suite + "/test-contents.js", "w") as f:
|
||||
f.write(contents)
|
||||
|
||||
shutil.copyfile("resources/analyze-results.js", "hosted/analyze-results.js")
|
||||
shutil.copyfile("resources/compare-results.js", "hosted/compare-results.js")
|
||||
|
||||
print("You're awesome!")
|
|
@ -0,0 +1,60 @@
|
|||
<!DOCTYPE html>
|
||||
<head>
|
||||
|
||||
<meta charset=utf8>
|
||||
|
||||
<!--
|
||||
Copyright (C) 2007 Apple Inc. All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions
|
||||
are met:
|
||||
1. Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
2. 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 APPLE COMPUTER, INC. ``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 APPLE COMPUTER, INC. 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.
|
||||
-->
|
||||
|
||||
<title>SunSpider @NAME@</title>
|
||||
<link rel="stylesheet" href="../kraken.css">
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<h3>@NAME@</h3>
|
||||
<div id="console">
|
||||
</div>
|
||||
<script>
|
||||
function record(time) {
|
||||
document.getElementById("console").innerHTML = time + "ms";
|
||||
if (window.parent) {
|
||||
parent.recordResult(time);
|
||||
}
|
||||
}
|
||||
|
||||
@DATASCRIPT@
|
||||
|
||||
var _sunSpiderStartDate = new Date();
|
||||
|
||||
@SCRIPT@
|
||||
|
||||
var _sunSpiderInterval = new Date() - _sunSpiderStartDate;
|
||||
|
||||
record(_sunSpiderInterval);
|
||||
</script>
|
||||
|
||||
|
||||
</body>
|
||||
</html>
|
|
@ -0,0 +1,275 @@
|
|||
/*
|
||||
* Copyright (C) 2007 Apple Inc. All rights reserved.
|
||||
* Copyright (C) 2010 Mozilla Foundation
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. 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 APPLE COMPUTER, INC. ``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 APPLE COMPUTER, INC. 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.
|
||||
*/
|
||||
|
||||
var count = output.length;
|
||||
|
||||
var itemTotals = {};
|
||||
itemTotals.length = count;
|
||||
|
||||
var total = 0;
|
||||
var categoryTotals = {};
|
||||
var testTotalsByCategory = {};
|
||||
|
||||
var mean = 0;
|
||||
var categoryMeans = {};
|
||||
var testMeansByCategory = {};
|
||||
|
||||
var stdDev = 0;
|
||||
var categoryStdDevs = {};
|
||||
var testStdDevsByCategory = {};
|
||||
|
||||
var stdErr = 0;
|
||||
var categoryStdErrs = {};
|
||||
var testStdErrsByCategory = {};
|
||||
|
||||
function initialize()
|
||||
{
|
||||
itemTotals = {total: []};
|
||||
|
||||
for (var i = 0; i < categories.length; i++) {
|
||||
var category = categories[i];
|
||||
itemTotals[category] = [];
|
||||
categoryTotals[category] = 0;
|
||||
testTotalsByCategory[category] = {};
|
||||
categoryMeans[category] = 0;
|
||||
testMeansByCategory[category] = {};
|
||||
categoryStdDevs[category] = 0;
|
||||
testStdDevsByCategory[category] = {};
|
||||
categoryStdErrs[category] = 0;
|
||||
testStdErrsByCategory[category] = {};
|
||||
}
|
||||
|
||||
for (var i = 0; i < tests.length; i++) {
|
||||
var test = tests[i];
|
||||
itemTotals[test] = [];
|
||||
var category = test.replace(/-.*/, "");
|
||||
testTotalsByCategory[category][test] = 0;
|
||||
testMeansByCategory[category][test] = 0;
|
||||
testStdDevsByCategory[category][test] = 0;
|
||||
testStdErrsByCategory[category][test] = 0;
|
||||
}
|
||||
|
||||
for (var i = 0; i < count; i++) {
|
||||
itemTotals["total"][i] = 0;
|
||||
for (var category in categoryTotals) {
|
||||
itemTotals[category][i] = 0;
|
||||
for (var test in testTotalsByCategory[category]) {
|
||||
itemTotals[test][i] = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function computeItemTotals()
|
||||
{
|
||||
for (var i = 0; i < output.length; i++) {
|
||||
var result = output[i];
|
||||
for (var test in result) {
|
||||
var time = result[test];
|
||||
var category = test.replace(/-.*/, "");
|
||||
itemTotals["total"][i] += time;
|
||||
itemTotals[category][i] += time;
|
||||
itemTotals[test][i] += time;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function computeTotals()
|
||||
{
|
||||
for (var i = 0; i < output.length; i++) {
|
||||
var result = output[i];
|
||||
for (var test in result) {
|
||||
var time = result[test];
|
||||
var category = test.replace(/-.*/, "");
|
||||
total += time;
|
||||
categoryTotals[category] += time;
|
||||
testTotalsByCategory[category][test] += time;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function computeMeans()
|
||||
{
|
||||
mean = total / count;
|
||||
for (var category in categoryTotals) {
|
||||
categoryMeans[category] = categoryTotals[category] / count;
|
||||
for (var test in testTotalsByCategory[category]) {
|
||||
testMeansByCategory[category][test] = testTotalsByCategory[category][test] / count;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function standardDeviation(mean, items)
|
||||
{
|
||||
var deltaSquaredSum = 0;
|
||||
for (var i = 0; i < items.length; i++) {
|
||||
var delta = items[i] - mean;
|
||||
deltaSquaredSum += delta * delta;
|
||||
}
|
||||
variance = deltaSquaredSum / (items.length - 1);
|
||||
return Math.sqrt(variance);
|
||||
}
|
||||
|
||||
function computeStdDevs()
|
||||
{
|
||||
stdDev = standardDeviation(mean, itemTotals["total"]);
|
||||
for (var category in categoryStdDevs) {
|
||||
categoryStdDevs[category] = standardDeviation(categoryMeans[category], itemTotals[category]);
|
||||
}
|
||||
for (var category in categoryStdDevs) {
|
||||
for (var test in testStdDevsByCategory[category]) {
|
||||
testStdDevsByCategory[category][test] = standardDeviation(testMeansByCategory[category][test], itemTotals[test]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function computeStdErrors()
|
||||
{
|
||||
var sqrtCount = Math.sqrt(count);
|
||||
|
||||
stdErr = stdDev / sqrtCount;
|
||||
for (var category in categoryStdErrs) {
|
||||
categoryStdErrs[category] = categoryStdDevs[category] / sqrtCount;
|
||||
}
|
||||
for (var category in categoryStdDevs) {
|
||||
for (var test in testStdErrsByCategory[category]) {
|
||||
testStdErrsByCategory[category][test] = testStdDevsByCategory[category][test] / sqrtCount;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
var tDistribution = [NaN, NaN, 12.71, 4.30, 3.18, 2.78, 2.57, 2.45, 2.36, 2.31, 2.26, 2.23, 2.20, 2.18, 2.16, 2.14, 2.13, 2.12, 2.11, 2.10, 2.09, 2.09, 2.08, 2.07, 2.07, 2.06, 2.06, 2.06, 2.05, 2.05, 2.05, 2.04, 2.04, 2.04, 2.03, 2.03, 2.03, 2.03, 2.03, 2.02, 2.02, 2.02, 2.02, 2.02, 2.02, 2.02, 2.01, 2.01, 2.01, 2.01, 2.01, 2.01, 2.01, 2.01, 2.01, 2.00, 2.00, 2.00, 2.00, 2.00, 2.00, 2.00, 2.00, 2.00, 2.00, 2.00, 2.00, 2.00, 2.00, 2.00, 1.99, 1.99, 1.99, 1.99, 1.99, 1.99, 1.99, 1.99, 1.99, 1.99, 1.99, 1.99, 1.99, 1.99, 1.99, 1.99, 1.99, 1.99, 1.99, 1.99, 1.99, 1.99, 1.99, 1.99, 1.99, 1.99, 1.99, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.96];
|
||||
var tMax = tDistribution.length;
|
||||
var tLimit = 1.96;
|
||||
|
||||
function tDist(n)
|
||||
{
|
||||
if (n > tMax)
|
||||
return tLimit;
|
||||
return tDistribution[n];
|
||||
}
|
||||
|
||||
|
||||
function formatResult(meanWidth, mean, stdErr, n)
|
||||
{
|
||||
var meanString = mean.toFixed(1).toString();
|
||||
while (meanString.length < meanWidth) {
|
||||
meanString = " " + meanString;
|
||||
}
|
||||
|
||||
if (n == 1)
|
||||
return meanString + "ms";
|
||||
|
||||
return meanString + "ms +/- " + ((tDist(n) * stdErr / mean) * 100).toFixed(1) + "%";
|
||||
}
|
||||
|
||||
function computeLabelWidth()
|
||||
{
|
||||
var width = "Total".length;
|
||||
for (var category in categoryMeans) {
|
||||
if (category.length + 2 > width)
|
||||
width = category.length + 2;
|
||||
}
|
||||
for (var i = 0; i < tests.length; i++) {
|
||||
var shortName = tests[i].replace(/^[^-]*-/, "");
|
||||
if (shortName.length + 4 > width)
|
||||
width = shortName.length + 4;
|
||||
}
|
||||
|
||||
return width;
|
||||
}
|
||||
|
||||
function computeMeanWidth()
|
||||
{
|
||||
var width = mean.toFixed(1).toString().length;
|
||||
for (var category in categoryMeans) {
|
||||
var candidate = categoryMeans[category].toFixed(2).toString().length;
|
||||
if (candidate > width)
|
||||
width = candidate;
|
||||
for (var test in testMeansByCategory[category]) {
|
||||
var candidate = testMeansByCategory[category][test].toFixed(2).toString().length;
|
||||
if (candidate > width)
|
||||
width = candidate;
|
||||
}
|
||||
}
|
||||
|
||||
return width;
|
||||
}
|
||||
|
||||
if (!this['explanations'])
|
||||
var explanations = {};
|
||||
|
||||
function resultLine(labelWidth, indent, label, meanWidth, mean, stdErr)
|
||||
{
|
||||
var result = "";
|
||||
for (i = 0; i < indent; i++) {
|
||||
result += " ";
|
||||
}
|
||||
|
||||
if (label in explanations)
|
||||
result += "<a href='" + explanations[label] + "'>" + label + "</a>: ";
|
||||
else
|
||||
result += label + ": ";
|
||||
|
||||
for (i = 0; i < (labelWidth - (label.length + indent)); i++) {
|
||||
result += " ";
|
||||
}
|
||||
|
||||
return result + formatResult(meanWidth, mean, stdErr, count);
|
||||
}
|
||||
|
||||
function printOutput()
|
||||
{
|
||||
var labelWidth = computeLabelWidth();
|
||||
var meanWidth = computeMeanWidth();
|
||||
|
||||
print("\n");
|
||||
print("===============================================");
|
||||
if (count == 1)
|
||||
print("RESULTS");
|
||||
else
|
||||
print("RESULTS (means and 95% confidence intervals)");
|
||||
print("-----------------------------------------------");
|
||||
print(resultLine(labelWidth, 0, "Total", meanWidth, mean, stdErr));
|
||||
print("-----------------------------------------------");
|
||||
for (var category in categoryMeans) {
|
||||
print("");
|
||||
print(resultLine(labelWidth, 2, category, meanWidth, categoryMeans[category], categoryStdErrs[category]));
|
||||
for (var test in testMeansByCategory[category]) {
|
||||
var shortName = test.replace(/^[^-]*-/, "");
|
||||
print(resultLine(labelWidth, 4, shortName, meanWidth, testMeansByCategory[category][test], testStdErrsByCategory[category][test]));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
initialize();
|
||||
computeItemTotals();
|
||||
computeTotals();
|
||||
computeMeans();
|
||||
computeStdDevs();
|
||||
computeStdErrors();
|
||||
printOutput();
|
|
@ -0,0 +1,381 @@
|
|||
/*
|
||||
* Copyright (C) 2007 Apple Inc. All rights reserved.
|
||||
* Copyright (C) 2010 Mozilla Foundation
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. 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 APPLE COMPUTER, INC. ``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 APPLE COMPUTER, INC. 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.
|
||||
*/
|
||||
|
||||
function sunspiderCompareResults(output1, output2)
|
||||
{
|
||||
var count1 = output1.length;
|
||||
var count2 = output2.length;
|
||||
|
||||
var itemTotals1 = {};
|
||||
itemTotals1.length = count1;
|
||||
|
||||
var total1 = 0;
|
||||
var categoryTotals1 = {};
|
||||
var testTotalsByCategory1 = {};
|
||||
|
||||
var mean1 = 0;
|
||||
var categoryMeans1 = {};
|
||||
var testMeansByCategory1 = {};
|
||||
|
||||
var stdDev1 = 0;
|
||||
var categoryStdDevs1 = {};
|
||||
var testStdDevsByCategory1 = {};
|
||||
|
||||
var stdErr1 = 0;
|
||||
var categoryStdErrs1 = {};
|
||||
var testStdErrsByCategory1 = {};
|
||||
|
||||
var itemTotals2 = {};
|
||||
itemTotals2.length = count2;
|
||||
|
||||
var total2 = 0;
|
||||
var categoryTotals2 = {};
|
||||
var testTotalsByCategory2 = {};
|
||||
|
||||
var mean2 = 0;
|
||||
var categoryMeans2 = {};
|
||||
var testMeansByCategory2 = {};
|
||||
|
||||
var stdDev2 = 0;
|
||||
var categoryStdDevs2 = {};
|
||||
var testStdDevsByCategory2 = {};
|
||||
|
||||
var stdErr2 = 0;
|
||||
var categoryStdErrs2 = {};
|
||||
var testStdErrsByCategory2 = {};
|
||||
|
||||
function initialize()
|
||||
{
|
||||
itemTotals1 = {total: []};
|
||||
|
||||
for (var i = 0; i < categories.length; i++) {
|
||||
var category = categories[i];
|
||||
itemTotals1[category] = [];
|
||||
categoryTotals1[category] = 0;
|
||||
testTotalsByCategory1[category] = {};
|
||||
categoryMeans1[category] = 0;
|
||||
testMeansByCategory1[category] = {};
|
||||
categoryStdDevs1[category] = 0;
|
||||
testStdDevsByCategory1[category] = {};
|
||||
categoryStdErrs1[category] = 0;
|
||||
testStdErrsByCategory1[category] = {};
|
||||
}
|
||||
|
||||
for (var i = 0; i < tests.length; i++) {
|
||||
var test = tests[i];
|
||||
itemTotals1[test] = [];
|
||||
var category = test.replace(/-.*/, "");
|
||||
testTotalsByCategory1[category][test] = 0;
|
||||
testMeansByCategory1[category][test] = 0;
|
||||
testStdDevsByCategory1[category][test] = 0;
|
||||
testStdErrsByCategory1[category][test] = 0;
|
||||
}
|
||||
|
||||
for (var i = 0; i < count1; i++) {
|
||||
itemTotals1["total"][i] = 0;
|
||||
for (var category in categoryTotals1) {
|
||||
itemTotals1[category][i] = 0;
|
||||
for (var test in testTotalsByCategory1[category]) {
|
||||
itemTotals1[test][i] = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
itemTotals2 = {total: []};
|
||||
|
||||
for (var i = 0; i < categories.length; i++) {
|
||||
var category = categories[i];
|
||||
itemTotals2[category] = [];
|
||||
categoryTotals2[category] = 0;
|
||||
testTotalsByCategory2[category] = {};
|
||||
categoryMeans2[category] = 0;
|
||||
testMeansByCategory2[category] = {};
|
||||
categoryStdDevs2[category] = 0;
|
||||
testStdDevsByCategory2[category] = {};
|
||||
categoryStdErrs2[category] = 0;
|
||||
testStdErrsByCategory2[category] = {};
|
||||
}
|
||||
|
||||
for (var i = 0; i < tests.length; i++) {
|
||||
var test = tests[i];
|
||||
itemTotals2[test] = [];
|
||||
var category = test.replace(/-.*/, "");
|
||||
testTotalsByCategory2[category][test] = 0;
|
||||
testMeansByCategory2[category][test] = 0;
|
||||
testStdDevsByCategory2[category][test] = 0;
|
||||
testStdErrsByCategory2[category][test] = 0;
|
||||
}
|
||||
|
||||
for (var i = 0; i < count2; i++) {
|
||||
itemTotals2["total"][i] = 0;
|
||||
for (var category in categoryTotals2) {
|
||||
itemTotals2[category][i] = 0;
|
||||
for (var test in testTotalsByCategory2[category]) {
|
||||
itemTotals2[test][i] = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
function computeItemTotals(output, itemTotals)
|
||||
{
|
||||
for (var i = 0; i < output.length; i++) {
|
||||
var result = output[i];
|
||||
for (var test in result) {
|
||||
var time = result[test];
|
||||
var category = test.replace(/-.*/, "");
|
||||
itemTotals["total"][i] += time;
|
||||
itemTotals[category][i] += time;
|
||||
itemTotals[test][i] += time;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function computeTotals(output, categoryTotals, testTotalsByCategory)
|
||||
{
|
||||
var total = 0;
|
||||
|
||||
for (var i = 0; i < output.length; i++) {
|
||||
var result = output[i];
|
||||
for (var test in result) {
|
||||
var time = result[test];
|
||||
var category = test.replace(/-.*/, "");
|
||||
total += time;
|
||||
categoryTotals[category] += time;
|
||||
testTotalsByCategory[category][test] += time;
|
||||
}
|
||||
}
|
||||
|
||||
return total;
|
||||
}
|
||||
|
||||
function computeMeans(count, total, categoryTotals, categoryMeans, testTotalsByCategory, testMeansByCategory)
|
||||
{
|
||||
var mean = total / count;
|
||||
for (var category in categoryTotals) {
|
||||
categoryMeans[category] = categoryTotals[category] / count;
|
||||
for (var test in testTotalsByCategory[category]) {
|
||||
testMeansByCategory[category][test] = testTotalsByCategory[category][test] / count;
|
||||
}
|
||||
}
|
||||
return mean;
|
||||
}
|
||||
|
||||
function standardDeviation(mean, items)
|
||||
{
|
||||
var deltaSquaredSum = 0;
|
||||
for (var i = 0; i < items.length; i++) {
|
||||
var delta = items[i] - mean;
|
||||
deltaSquaredSum += delta * delta;
|
||||
}
|
||||
variance = deltaSquaredSum / (items.length - 1);
|
||||
return Math.sqrt(variance);
|
||||
}
|
||||
|
||||
function computeStdDevs(mean, itemTotals, categoryStdDevs, categoryMeans, testStdDevsByCategory, testMeansByCategory)
|
||||
{
|
||||
var stdDev = standardDeviation(mean, itemTotals["total"]);
|
||||
for (var category in categoryStdDevs) {
|
||||
categoryStdDevs[category] = standardDeviation(categoryMeans[category], itemTotals[category]);
|
||||
}
|
||||
for (var category in categoryStdDevs) {
|
||||
for (var test in testStdDevsByCategory[category]) {
|
||||
testStdDevsByCategory[category][test] = standardDeviation(testMeansByCategory[category][test], itemTotals[test]);
|
||||
}
|
||||
}
|
||||
return stdDev;
|
||||
}
|
||||
|
||||
function computeStdErrors(count, stdDev, categoryStdErrs, categoryStdDevs, testStdErrsByCategory, testStdDevsByCategory)
|
||||
{
|
||||
var sqrtCount = Math.sqrt(count);
|
||||
|
||||
var stdErr = stdDev / sqrtCount;
|
||||
for (var category in categoryStdErrs) {
|
||||
categoryStdErrs[category] = categoryStdDevs[category] / sqrtCount;
|
||||
}
|
||||
for (var category in categoryStdDevs) {
|
||||
for (var test in testStdErrsByCategory[category]) {
|
||||
testStdErrsByCategory[category][test] = testStdDevsByCategory[category][test] / sqrtCount;
|
||||
}
|
||||
}
|
||||
|
||||
return stdErr;
|
||||
}
|
||||
|
||||
var tDistribution = [NaN, NaN, 12.71, 4.30, 3.18, 2.78, 2.57, 2.45, 2.36, 2.31, 2.26, 2.23, 2.20, 2.18, 2.16, 2.14, 2.13, 2.12, 2.11, 2.10, 2.09, 2.09, 2.08, 2.07, 2.07, 2.06, 2.06, 2.06, 2.05, 2.05, 2.05, 2.04, 2.04, 2.04, 2.03, 2.03, 2.03, 2.03, 2.03, 2.02, 2.02, 2.02, 2.02, 2.02, 2.02, 2.02, 2.01, 2.01, 2.01, 2.01, 2.01, 2.01, 2.01, 2.01, 2.01, 2.00, 2.00, 2.00, 2.00, 2.00, 2.00, 2.00, 2.00, 2.00, 2.00, 2.00, 2.00, 2.00, 2.00, 2.00, 1.99, 1.99, 1.99, 1.99, 1.99, 1.99, 1.99, 1.99, 1.99, 1.99, 1.99, 1.99, 1.99, 1.99, 1.99, 1.99, 1.99, 1.99, 1.99, 1.99, 1.99, 1.99, 1.99, 1.99, 1.99, 1.99, 1.99, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.96];
|
||||
var tMax = tDistribution.length;
|
||||
var tLimit = 1.96;
|
||||
|
||||
function tDist(n)
|
||||
{
|
||||
if (n > tMax)
|
||||
return tLimit;
|
||||
return tDistribution[n];
|
||||
}
|
||||
|
||||
|
||||
function formatMean(meanWidth, mean, stdErr, count)
|
||||
{
|
||||
var meanString = mean.toFixed(1).toString();
|
||||
while (meanString.length < meanWidth) {
|
||||
meanString = " " + meanString;
|
||||
}
|
||||
|
||||
var error = "+/- " + ((tDist(count) * stdErr / mean) * 100).toFixed(1) + "% ";
|
||||
|
||||
return meanString + "ms " + error;
|
||||
}
|
||||
|
||||
function computeLabelWidth()
|
||||
{
|
||||
var width = "Total".length;
|
||||
for (var category in categoryMeans1) {
|
||||
if (category.length + 2 > width)
|
||||
width = category.length + 2;
|
||||
}
|
||||
for (var i = 0; i < tests.length; i++) {
|
||||
var shortName = tests[i].replace(/^[^-]*-/, "");
|
||||
if (shortName.length + 4 > width)
|
||||
width = shortName.length + 4;
|
||||
}
|
||||
|
||||
return width;
|
||||
}
|
||||
|
||||
function computeMeanWidth(mean, categoryMeans, testMeansByCategory)
|
||||
{
|
||||
var width = mean.toFixed(1).toString().length;
|
||||
for (var category in categoryMeans) {
|
||||
var candidate = categoryMeans[category].toFixed(1).toString().length;
|
||||
if (candidate > width)
|
||||
width = candidate;
|
||||
for (var test in testMeansByCategory[category]) {
|
||||
var candidate = testMeansByCategory[category][test].toFixed(1).toString().length;
|
||||
if (candidate > width)
|
||||
width = candidate;
|
||||
}
|
||||
}
|
||||
|
||||
return width;
|
||||
}
|
||||
|
||||
function pad(str, n)
|
||||
{
|
||||
while (str.length < n) {
|
||||
str += " ";
|
||||
}
|
||||
return str;
|
||||
}
|
||||
|
||||
function resultLine(labelWidth, indent, label, meanWidth1, mean1, stdErr1, meanWidth2, mean2, stdErr2)
|
||||
{
|
||||
result = pad("", indent);
|
||||
result += label + ": ";
|
||||
result = pad(result, labelWidth + 2);
|
||||
|
||||
var t = (mean1 - mean2) / (Math.sqrt((stdErr1 * stdErr1) + (stdErr2 * stdErr2)));
|
||||
var df = count1 + count2 - 2;
|
||||
|
||||
var statisticallySignificant = (Math.abs(t) > tDist(df+1));
|
||||
var diff = mean2 - mean1;
|
||||
var percentage = 100 * diff / mean1;
|
||||
var isFaster = diff < 0;
|
||||
var probablySame = (percentage < 0.1) && !statisticallySignificant;
|
||||
var ratio = isFaster ? (mean1 / mean2) : (mean2 / mean1);
|
||||
var fixedRatio = (ratio < 1.2) ? ratio.toFixed(3).toString() : ((ratio < 10) ? ratio.toFixed(2).toString() : ratio.toFixed(1).toString());
|
||||
var formattedRatio = isFaster ? fixedRatio + "x as fast" : "*" + fixedRatio + "x as slow*";
|
||||
|
||||
var diffSummary;
|
||||
var diffDetail;
|
||||
|
||||
if (probablySame) {
|
||||
diffSummary = "-";
|
||||
diffDetail = "";
|
||||
} else if (!statisticallySignificant) {
|
||||
diffSummary = "??";
|
||||
diffDetail = " might be " + formattedRatio;
|
||||
} else {
|
||||
diffSummary = formattedRatio;
|
||||
diffDetail = " significant";
|
||||
}
|
||||
|
||||
return result + pad(diffSummary, 18) + formatMean(meanWidth1, mean1, stdErr1, count1) + " " + formatMean(meanWidth2, mean2, stdErr2, count2) + diffDetail;
|
||||
}
|
||||
|
||||
function printOutput()
|
||||
{
|
||||
var labelWidth = computeLabelWidth();
|
||||
var meanWidth1 = computeMeanWidth(mean1, categoryMeans1, testMeansByCategory1);
|
||||
var meanWidth2 = computeMeanWidth(mean2, categoryMeans2, testMeansByCategory2);
|
||||
|
||||
print("\n");
|
||||
var header = "TEST";
|
||||
while (header.length < labelWidth)
|
||||
header += " ";
|
||||
header += " COMPARISON FROM TO DETAILS";
|
||||
print(header);
|
||||
print("");
|
||||
print("====================================================================================");
|
||||
print("");
|
||||
print(resultLine(labelWidth, 0, "** TOTAL **", meanWidth1, mean1, stdErr1, meanWidth2, mean2, stdErr2));
|
||||
print("");
|
||||
print("====================================================================================");
|
||||
|
||||
for (var category in categoryMeans1) {
|
||||
print("");
|
||||
print(resultLine(labelWidth, 2, category,
|
||||
meanWidth1, categoryMeans1[category], categoryStdErrs1[category],
|
||||
meanWidth2, categoryMeans2[category], categoryStdErrs2[category]));
|
||||
for (var test in testMeansByCategory1[category]) {
|
||||
var shortName = test.replace(/^[^-]*-/, "");
|
||||
print(resultLine(labelWidth, 4, shortName,
|
||||
meanWidth1, testMeansByCategory1[category][test], testStdErrsByCategory1[category][test],
|
||||
meanWidth2, testMeansByCategory2[category][test], testStdErrsByCategory2[category][test]));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
initialize();
|
||||
|
||||
computeItemTotals(output1, itemTotals1);
|
||||
computeItemTotals(output2, itemTotals2);
|
||||
|
||||
total1 = computeTotals(output1, categoryTotals1, testTotalsByCategory1);
|
||||
total2 = computeTotals(output2, categoryTotals2, testTotalsByCategory2);
|
||||
|
||||
mean1 = computeMeans(count1, total1, categoryTotals1, categoryMeans1, testTotalsByCategory1, testMeansByCategory1);
|
||||
mean2 = computeMeans(count2, total2, categoryTotals2, categoryMeans2, testTotalsByCategory2, testMeansByCategory2);
|
||||
|
||||
stdDev1 = computeStdDevs(mean1, itemTotals1, categoryStdDevs1, categoryMeans1, testStdDevsByCategory1, testMeansByCategory1);
|
||||
stdDev2 = computeStdDevs(mean2, itemTotals2, categoryStdDevs2, categoryMeans2, testStdDevsByCategory2, testMeansByCategory2);
|
||||
|
||||
stdErr1 = computeStdErrors(count1, stdDev1, categoryStdErrs1, categoryStdDevs1, testStdErrsByCategory1, testStdDevsByCategory1);
|
||||
stdErr2 = computeStdErrors(count2, stdDev2, categoryStdErrs2, categoryStdDevs2, testStdErrsByCategory2, testStdDevsByCategory2);
|
||||
|
||||
printOutput();
|
||||
}
|
|
@ -0,0 +1,144 @@
|
|||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
|
||||
<meta charset=utf8>
|
||||
|
||||
<!--
|
||||
Copyright (C) 2007 Apple Inc. All rights reserved.
|
||||
Copyright (C) 2010 Mozilla Foundation
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions
|
||||
are met:
|
||||
1. Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
2. 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 APPLE COMPUTER, INC. ``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 APPLE COMPUTER, INC. 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.
|
||||
-->
|
||||
|
||||
<title>Kraken JavaScript Benchmark (@SUITE@ test suite - In Progress...)</title>
|
||||
<link rel="stylesheet" href="../kraken.css">
|
||||
</head>
|
||||
|
||||
<body onload="start()">
|
||||
<div id="content">
|
||||
<h2>Kraken JavaScript Benchmark <small>(In Progress...)</small></h2>
|
||||
<div id="results">
|
||||
|
||||
<h3>Content Version: @SUITE@</h3>
|
||||
|
||||
<script src="test-prefix.js"></script>
|
||||
<script src="test-contents.js"></script>
|
||||
<script>
|
||||
var testIndex = -1;
|
||||
var currentRepeat = -1;
|
||||
var repeatCount = 10;
|
||||
|
||||
var currentSquare = 1;
|
||||
|
||||
var output = [];
|
||||
output.length = repeatCount;
|
||||
for (var i = 0; i < output.length; i++) {
|
||||
output[i] = {};
|
||||
}
|
||||
|
||||
function initSquares() {
|
||||
var squaresDiv = document.getElementById("squares");
|
||||
var id = 0;
|
||||
for (var i = 0; i < repeatCount; i++) {
|
||||
for (var j = 0; j <= tests.length; j++) {
|
||||
id++;
|
||||
squaresDiv.innerHTML += "<span class='incomplete-square' id='square-" + id + "'>\u25A0</span>";
|
||||
}
|
||||
squaresDiv.innerHTML += "<br>";
|
||||
}
|
||||
}
|
||||
|
||||
function completeSquare() {
|
||||
var square = document.getElementById("square-" + currentSquare);
|
||||
if (square) {
|
||||
square.className = "complete-square";
|
||||
currentSquare++;
|
||||
}
|
||||
}
|
||||
|
||||
function start()
|
||||
{
|
||||
initSquares();
|
||||
window.setTimeout(reallyNext, 500);
|
||||
}
|
||||
|
||||
function next()
|
||||
{
|
||||
window.setTimeout(reallyNext, 10);
|
||||
}
|
||||
|
||||
function reallyNext()
|
||||
{
|
||||
completeSquare();
|
||||
document.getElementById("frameparent").innerHTML = "";
|
||||
document.getElementById("frameparent").innerHTML = "<iframe id='testframe'>";
|
||||
var testFrame = document.getElementById("testframe");
|
||||
testIndex++;
|
||||
if (testIndex < tests.length) {
|
||||
testFrame.contentDocument.open();
|
||||
testFrame.contentDocument.write(testContents[testIndex]);
|
||||
testFrame.contentDocument.close;
|
||||
} else if (++currentRepeat < repeatCount) {
|
||||
testIndex = 0;
|
||||
testFrame.contentDocument.open();
|
||||
testFrame.contentDocument.write(testContents[testIndex]);
|
||||
testFrame.contentDocument.close;
|
||||
} else {
|
||||
finish();
|
||||
}
|
||||
}
|
||||
|
||||
function recordResult(time)
|
||||
{
|
||||
if (currentRepeat >= 0) // negative repeats are warmups
|
||||
output[currentRepeat][tests[testIndex]] = time;
|
||||
next();
|
||||
}
|
||||
|
||||
function finish()
|
||||
{
|
||||
var outputString = "{";
|
||||
outputString += '"v": "@SUITE@", ';
|
||||
for (var test in output[0]) {
|
||||
outputString += '"' + test + '":[';
|
||||
for (var i = 0; i < output.length; i++) {
|
||||
outputString += output[i][test] + ",";
|
||||
}
|
||||
outputString = outputString.substring(0, outputString.length - 1);
|
||||
outputString += "],";
|
||||
}
|
||||
outputString = outputString.substring(0, outputString.length - 1);
|
||||
outputString += "}";
|
||||
|
||||
location = "results.html?" + encodeURI(outputString);
|
||||
}
|
||||
|
||||
</script>
|
||||
|
||||
<div id="frameparent">
|
||||
</div>
|
||||
<div id="squares"></div>
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
|
@ -0,0 +1,126 @@
|
|||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
|
||||
<meta charset=utf8>
|
||||
|
||||
<!--
|
||||
Copyright (C) 2007 Apple Inc. All rights reserved.
|
||||
Copyright (C) 2010 Mozilla Foundation
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions
|
||||
are met:
|
||||
1. Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
2. 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 APPLE COMPUTER, INC. ``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 APPLE COMPUTER, INC. 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.
|
||||
-->
|
||||
|
||||
<title>Kraken JavaScript Benchmark Results (@SUITE@ test suite)</title>
|
||||
<link rel="stylesheet" href="../kraken.css">
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<div id="content">
|
||||
<h2>Kraken JavaScript Benchmark Results</h2>
|
||||
<div id="results">
|
||||
<h3>Content Version: @SUITE@</h3>
|
||||
|
||||
<p><a href="driver.html">Run Again</a></p>
|
||||
|
||||
<p><input style="width: 100%;" id="selfUrl" type="text" readonly="readonly"><br>
|
||||
<small>(You can bookmark this results URL for later comparison.)</small></p>
|
||||
|
||||
<form onsubmit="event.preventDefault(); compare(other.value);">To compare to another run, paste a saved result URL in the text field below and press enter:<br>
|
||||
<input style="width: 100%;" name="other" type="text"><br>
|
||||
</form>
|
||||
|
||||
<pre id="console"></pre>
|
||||
</div>
|
||||
</div>
|
||||
<script src="../json2.js"></script>
|
||||
<script>
|
||||
|
||||
//XXX generate this automatically
|
||||
var explanations = {
|
||||
"astar":"../explanations/astar.html",
|
||||
"gaussian-blur":"../explanations/gaussian-blur.html",
|
||||
"darkroom":"../explanations/darkroom.html",
|
||||
"desaturate":"../explanations/desaturate.html",
|
||||
"beat-detection":"../explanations/beat-detection.html",
|
||||
"dft":"../explanations/dft.html",
|
||||
"fft":"../explanations/fft.html",
|
||||
"oscillator":"../explanations/oscillator.html",
|
||||
"parse-financial":"../explanations/parse-financial.html",
|
||||
"stringify-tinderbox":"../explanations/stringify-tinderbox.html"
|
||||
|
||||
}
|
||||
|
||||
var selfUrlInput = document.getElementById("selfUrl");
|
||||
selfUrlInput.value = location;
|
||||
|
||||
var outputJSON = JSON.parse(decodeURI(location.search.substring(1)));
|
||||
var version = outputJSON["v"];
|
||||
delete outputJSON["v"];
|
||||
var output = pivot(outputJSON);
|
||||
|
||||
function pivot(input) {
|
||||
var output = [];
|
||||
for (var test in input) {
|
||||
for (var i = 0; i < input[test].length; i++) {
|
||||
if (!output[i])
|
||||
output[i] = {};
|
||||
output[i][test] = input[test][i];
|
||||
}
|
||||
}
|
||||
return output;
|
||||
}
|
||||
|
||||
function print(str) {
|
||||
var console = document.getElementById("console");
|
||||
console.innerHTML += str;
|
||||
console.innerHTML += "<br>";
|
||||
}
|
||||
</script>
|
||||
|
||||
<script src="test-prefix.js"></script>
|
||||
<script src="../analyze-results.js"></script>
|
||||
<script src="../compare-results.js"></script>
|
||||
|
||||
<script>
|
||||
var output2 = output;
|
||||
var version2 = version;
|
||||
|
||||
function compare(other)
|
||||
{
|
||||
document.getElementById("console").innerHTML = "";
|
||||
|
||||
var output1JSON = JSON.parse(decodeURI(other.split("?")[1]));
|
||||
var version1 = output1JSON["v"];
|
||||
delete output1JSON["v"];
|
||||
if (version1 != version2) {
|
||||
print("ERROR: cannot compare version " + version1 + ' with version ' + version2);
|
||||
} else {
|
||||
var output1 = pivot(output1JSON);
|
||||
sunspiderCompareResults(output1, output2);
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
|
||||
</body>
|
||||
</html>
|
|
@ -0,0 +1,26 @@
|
|||
/*
|
||||
* Copyright (C) 2007 Apple Inc. All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. 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 APPLE COMPUTER, INC. ``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 APPLE COMPUTER, INC. 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.
|
||||
*/
|
||||
|
||||
sunspiderCompareResults(output1, output2);
|
|
@ -0,0 +1,57 @@
|
|||
/*
|
||||
* Copyright (C) 2007 Apple Inc. All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. 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 APPLE COMPUTER, INC. ``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 APPLE COMPUTER, INC. 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.
|
||||
*/
|
||||
|
||||
var results = new Array();
|
||||
|
||||
var time = 0;
|
||||
var times = [];
|
||||
times.length = tests.length;
|
||||
|
||||
for (var krakenCounter = 0; krakenCounter < tests.length; krakenCounter++) {
|
||||
var testBase = "tests/" + suiteName + "/" + tests[krakenCounter];
|
||||
var testName = testBase + ".js";
|
||||
var testData = testBase + "-data.js";
|
||||
// load test data
|
||||
load(testData);
|
||||
var startTime = new Date;
|
||||
load(testName);
|
||||
times[krakenCounter] = new Date() - startTime;
|
||||
gc();
|
||||
}
|
||||
|
||||
function recordResults(tests, times)
|
||||
{
|
||||
var output = "{\n";
|
||||
|
||||
for (j = 0; j < tests.length; j++) {
|
||||
output += ' "' + tests[j] + '": ' + times[j] + ',\n';
|
||||
}
|
||||
output = output.substring(0, output.length - 2) + "\n";
|
||||
|
||||
output += "}";
|
||||
print(output);
|
||||
}
|
||||
|
||||
recordResults(tests, times);
|
|
@ -0,0 +1,241 @@
|
|||
#!/usr/bin/perl -w
|
||||
|
||||
# Copyright (C) 2007 Apple Inc. All rights reserved.
|
||||
# Copyright (C) 2007 Eric Seidel <eric@webkit.org>
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions
|
||||
# are met:
|
||||
# 1. Redistributions of source code must retain the above copyright
|
||||
# notice, this list of conditions and the following disclaimer.
|
||||
# 2. 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 APPLE COMPUTER, INC. ``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 APPLE COMPUTER, INC. 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.
|
||||
|
||||
use strict;
|
||||
use Getopt::Long;
|
||||
use File::Basename;
|
||||
use File::Spec;
|
||||
use Cwd;
|
||||
use POSIX qw(strftime);
|
||||
use Time::HiRes qw(gettimeofday tv_interval);
|
||||
|
||||
my $showHelp = 0;
|
||||
my $runShark = 0;
|
||||
my $runShark20 = 0;
|
||||
my $runSharkCache = 0;
|
||||
my $ubench = 0;
|
||||
my $v8suite = 0;
|
||||
my $suite = "";
|
||||
my $parseOnly = 0;
|
||||
my $jsShellPath;
|
||||
my $jsShellArgs = "";
|
||||
my $setBaseline = 0;
|
||||
my $testsPattern;
|
||||
my $testRuns = 10;
|
||||
|
||||
my $programName = basename($0);
|
||||
my $usage = <<EOF;
|
||||
Usage: $programName --shell=[path] [options]
|
||||
--help Show this help message
|
||||
--set-baseline Set baseline for future comparisons
|
||||
--shell Path to JavaScript shell
|
||||
--args Arguments to pass to JavaScript shell
|
||||
--runs Number of times to run tests (default: $testRuns)
|
||||
--tests Only run tests matching provided pattern
|
||||
--shark Sample execution time with the Mac OS X "Shark" performance testing tool (implies --runs=1)
|
||||
--shark20 Like --shark, but with a 20 microsecond sampling interval
|
||||
--shark-cache Like --shark, but performs a L2 cache-miss sample instead of time sample
|
||||
--suite Select a specific benchmark suite. The default is sunspider-0.9.1
|
||||
--ubench Use microbenchmark suite instead of regular tests. Same as --suite=ubench
|
||||
--v8-suite Use the V8 benchmark suite. Same as --suite=v8-v4
|
||||
--parse-only Use the parse-only benchmark suite. Same as --suite=parse-only
|
||||
EOF
|
||||
|
||||
GetOptions('runs=i' => \$testRuns,
|
||||
'set-baseline' => \$setBaseline,
|
||||
'shell=s' => \$jsShellPath,
|
||||
'args=s' => \$jsShellArgs,
|
||||
'shark' => \$runShark,
|
||||
'shark20' => \$runShark20,
|
||||
'shark-cache' => \$runSharkCache,
|
||||
'suite=s' => \$suite,
|
||||
'ubench' => \$ubench,
|
||||
'v8-suite' => \$v8suite,
|
||||
'parse-only' => \$parseOnly,
|
||||
'tests=s' => \$testsPattern,
|
||||
'help' => \$showHelp);
|
||||
|
||||
|
||||
$suite = "ubench" if ($ubench);
|
||||
$suite = "v8-v4" if ($v8suite);
|
||||
$suite = "parse-only" if ($parseOnly);
|
||||
$suite = "sunspider-0.9.1" if (!$suite);
|
||||
|
||||
my $resultDirectory = "${suite}-results";
|
||||
|
||||
$runShark = 1 if $runSharkCache;
|
||||
$runShark = 20 if $runShark20;
|
||||
$testRuns = 1 if $runShark;
|
||||
if ($runShark && ! -x "/usr/bin/shark") {
|
||||
die "Please install CHUD tools from http://developer.apple.com/tools/download/\n";
|
||||
}
|
||||
|
||||
my $sharkCacheProfileIndex = 0;
|
||||
if ($runSharkCache) {
|
||||
my $sharkProfileList = `shark -l 2>&1`;
|
||||
for my $profile (split(/\n/, $sharkProfileList)) {
|
||||
$profile =~ /(\d+) - (.+)/;
|
||||
next unless (defined $1);
|
||||
my $profileIndex = $1;
|
||||
my $profileName = $2;
|
||||
if ($profileName =~ /L2 Cache/) {
|
||||
$sharkCacheProfileIndex = $profileIndex;
|
||||
print "Using Shark L2 Cache Miss Profile: " . $profile . "\n";
|
||||
last;
|
||||
}
|
||||
}
|
||||
die "Failed to find L2 Cache Miss Profile for --shark-cache\n" unless ($sharkCacheProfileIndex);
|
||||
}
|
||||
|
||||
if (!$jsShellPath || $showHelp) {
|
||||
print STDERR $usage;
|
||||
exit 1;
|
||||
}
|
||||
|
||||
sub dumpToFile($$)
|
||||
{
|
||||
my ($contents, $path) = @_;
|
||||
open FILE, ">", $path or die "Failed to open $path";
|
||||
print FILE $contents;
|
||||
close FILE;
|
||||
}
|
||||
|
||||
my @tests = ();
|
||||
my @categories = ();
|
||||
my %uniqueCategories = ();
|
||||
|
||||
sub loadTestsList()
|
||||
{
|
||||
open TESTLIST, "<", "tests/${suite}/LIST" or die "Can't find ./tests/${suite}/LIST";
|
||||
while (<TESTLIST>) {
|
||||
chomp;
|
||||
next unless !$testsPattern || /$testsPattern/;
|
||||
|
||||
push @tests, $_;
|
||||
my $category = $_;
|
||||
$category =~ s/-.*//;
|
||||
if (!$uniqueCategories{$category}) {
|
||||
push @categories, $category;
|
||||
$uniqueCategories{$category} = $category;
|
||||
}
|
||||
}
|
||||
close TESTLIST;
|
||||
}
|
||||
|
||||
my $timeString = strftime "%Y-%m-%d-%H.%M.%S", localtime $^T;
|
||||
my $prefixFile = "$resultDirectory/sunspider-test-prefix.js";
|
||||
my $resultsFile = "$resultDirectory/sunspider-results-$timeString.js";
|
||||
|
||||
sub writePrefixFile()
|
||||
{
|
||||
my $prefix = "var suiteName = " . '"' . $suite . '"' . ";\n";
|
||||
$prefix .= "var tests = [ " . join(", ", map { '"' . $_ . '"' } @tests) . " ];\n";
|
||||
$prefix .= "var categories = [ " . join(", ", map { '"' . $_ . '"' } @categories) . " ];\n";
|
||||
|
||||
mkdir "$resultDirectory";
|
||||
dumpToFile($prefix, $prefixFile);
|
||||
}
|
||||
|
||||
sub runTestsOnce($)
|
||||
{
|
||||
my ($useShark) = @_;
|
||||
my $shellArgs = $jsShellArgs . " -f $prefixFile -f resources/sunspider-standalone-driver.js 2> " . File::Spec->devnull();
|
||||
my $output;
|
||||
if ($useShark) {
|
||||
my $intervalArg = $useShark == 20 ? "-I 20u" : "";
|
||||
my $cacheArg = $runSharkCache ? "-c $sharkCacheProfileIndex" : "";
|
||||
$output = `shark $intervalArg $cacheArg -i -1-q "$jsShellPath" $shellArgs`;
|
||||
} else {
|
||||
$output = `"$jsShellPath" $shellArgs | grep -v break`;
|
||||
}
|
||||
return $output;
|
||||
}
|
||||
|
||||
sub newestFile($$)
|
||||
{
|
||||
my ($dir, $pattern) = @_;
|
||||
|
||||
my $newestAge;
|
||||
my $newestFile = "";
|
||||
opendir DIR, $dir or die;
|
||||
for my $file (readdir DIR) {
|
||||
if ($file =~ $pattern) {
|
||||
my $age = -M "$dir/$file";
|
||||
if (!defined $newestAge || $age < $newestAge) {
|
||||
$newestFile = $file;
|
||||
$newestAge = $age;
|
||||
}
|
||||
}
|
||||
}
|
||||
closedir DIR;
|
||||
|
||||
return "$dir/$newestFile";
|
||||
}
|
||||
|
||||
loadTestsList();
|
||||
if ($testsPattern) {
|
||||
print STDERR "Found " . scalar(@tests) . " tests matching '" . $testsPattern . "'\n";
|
||||
} else {
|
||||
print STDERR "Found " . scalar(@tests) . " tests\n";
|
||||
}
|
||||
die "No tests to run" unless scalar(@tests);
|
||||
print STDERR "Running SunSpider once for warmup, then " . ($runShark ? "under Shark" : "$testRuns time" . ($testRuns == 1 ? "" : "s")) . "\n";
|
||||
writePrefixFile();
|
||||
|
||||
runTestsOnce(0);
|
||||
print "Discarded first run.\n";
|
||||
|
||||
my $result;
|
||||
my $count = 0;
|
||||
my @results = ();
|
||||
my $total = 0;
|
||||
print "[";
|
||||
while ($count++ < $testRuns) {
|
||||
$result = runTestsOnce($runShark);
|
||||
$result =~ s/\r\n/\n/g;
|
||||
chomp $result;
|
||||
push @results, $result;
|
||||
print $result;
|
||||
print ",\n" unless ($count == $testRuns);
|
||||
}
|
||||
print "]\n";
|
||||
|
||||
my $output = "var output = [\n" . join(",\n", @results) . "\n];\n";
|
||||
dumpToFile($output, $resultsFile);
|
||||
dumpToFile(File::Spec->rel2abs($resultsFile), "$resultDirectory/baseline-filename.txt") if $setBaseline;
|
||||
|
||||
system("$jsShellPath", "-f", $prefixFile, "-f", $resultsFile, "-f", "resources/analyze-results.js");
|
||||
|
||||
print("\nResults are located at $resultsFile\n");
|
||||
|
||||
if ($runShark) {
|
||||
my $newestMShark = newestFile(".", qr/\.mshark$/);
|
||||
if ($newestMShark) {
|
||||
my $profileFile = "$resultDirectory/sunspider-profile-$timeString.mshark";
|
||||
rename $newestMShark, $profileFile or die;
|
||||
exec "/usr/bin/open", $profileFile;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,161 @@
|
|||
#!/usr/bin/perl -w
|
||||
|
||||
# Copyright (C) 2007 Apple Inc. All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions
|
||||
# are met:
|
||||
# 1. Redistributions of source code must retain the above copyright
|
||||
# notice, this list of conditions and the following disclaimer.
|
||||
# 2. 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 APPLE COMPUTER, INC. ``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 APPLE COMPUTER, INC. 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.
|
||||
|
||||
use strict;
|
||||
use Getopt::Long;
|
||||
use File::Basename;
|
||||
|
||||
my $showHelp = 0;
|
||||
my $jsShellPath;
|
||||
my $suite = "";
|
||||
my $ubench = 0;
|
||||
my $v8suite = 0;
|
||||
my $parseOnly = 0;
|
||||
|
||||
my $programName = basename($0);
|
||||
my $usage = <<EOF;
|
||||
Usage: $programName --shell=[path] [options] FILE FILE
|
||||
--help Show this help message
|
||||
--shell Path to javascript shell
|
||||
--suite Select a specific benchmark suite. The default is sunspider-0.9.1
|
||||
--ubench Use microbenchmark suite instead of regular tests. Same as --suite=ubench
|
||||
--v8-suite Use the V8 benchmark suite. Same as --suite=v8-v4
|
||||
--parse-only Compare the parse-only benchmark results
|
||||
EOF
|
||||
|
||||
GetOptions('shell=s' => \$jsShellPath,
|
||||
'suite=s' => \$suite,
|
||||
'ubench' => \$ubench,
|
||||
'v8-suite' => \$v8suite,
|
||||
'parse-only' => \$parseOnly,
|
||||
'help' => \$showHelp);
|
||||
|
||||
$suite = "ubench" if ($ubench);
|
||||
$suite = "v8-v4" if ($v8suite);
|
||||
$suite = "parse-only" if ($parseOnly);
|
||||
$suite = "sunspider-0.9.1" if (!$suite);
|
||||
|
||||
my $resultDirectory = "${suite}-results";
|
||||
|
||||
if ((scalar @ARGV != 0 && scalar @ARGV != 2) || !$jsShellPath || $showHelp) {
|
||||
print STDERR $usage;
|
||||
exit 1;
|
||||
}
|
||||
|
||||
sub readResultsFile($)
|
||||
{
|
||||
my ($filename) = @_;
|
||||
open FILE, "<", $filename or die;
|
||||
my $foundStart = 0;
|
||||
my $foundOutput = 0;
|
||||
my $foundEnd = 0;
|
||||
my $result = "";
|
||||
while (<FILE>) {
|
||||
if (!$foundStart) {
|
||||
if (/^\[\{$/) {
|
||||
$foundStart = 1;
|
||||
$result .= $_;
|
||||
} elsif (/^var \w+ = \[$/) {
|
||||
$foundOutput = 1;
|
||||
} elsif ($foundOutput && /^\{$/) {
|
||||
$foundOutput = 0;
|
||||
$foundStart = 1;
|
||||
$result = "[{\n";
|
||||
}
|
||||
} else {
|
||||
if (/\];?$/) {
|
||||
$foundEnd = 1;
|
||||
chomp;
|
||||
s/;$//;
|
||||
$result .= $_;
|
||||
last;
|
||||
} else {
|
||||
$result .= $_;
|
||||
}
|
||||
}
|
||||
}
|
||||
close FILE;
|
||||
|
||||
die "Cound not find data in ${filename} - needs to start with [{" unless $foundStart;
|
||||
die "Cound not find data in ${filename} - needs to end with }]" unless $foundEnd;
|
||||
|
||||
return $result;
|
||||
}
|
||||
|
||||
sub dumpToFile($$)
|
||||
{
|
||||
my ($contents, $path) = @_;
|
||||
open FILE, ">", $path or die;
|
||||
print FILE $contents;
|
||||
close FILE;
|
||||
}
|
||||
|
||||
sub readFile($)
|
||||
{
|
||||
my ($path) = @_;
|
||||
open FILE, "<", $path or die;
|
||||
my $result = <FILE>;
|
||||
close FILE;
|
||||
return $result;
|
||||
}
|
||||
|
||||
sub newestFile($$)
|
||||
{
|
||||
my ($dir, $pattern) = @_;
|
||||
|
||||
my $newestAge;
|
||||
my $newestFile = "";
|
||||
opendir DIR, $dir or die;
|
||||
for my $file (readdir DIR) {
|
||||
if ($file =~ $pattern) {
|
||||
my $age = -M "$dir/$file";
|
||||
if (!defined $newestAge || $age < $newestAge) {
|
||||
$newestFile = $file;
|
||||
$newestAge = $age;
|
||||
}
|
||||
}
|
||||
}
|
||||
closedir DIR;
|
||||
|
||||
return "$dir/$newestFile";
|
||||
}
|
||||
|
||||
my $file1;
|
||||
my $file2;
|
||||
|
||||
if (scalar @ARGV == 2) {
|
||||
$file1 = $ARGV[0];
|
||||
$file2 = $ARGV[1];
|
||||
} else {
|
||||
$file1 = readFile("$resultDirectory/baseline-filename.txt");
|
||||
$file2 = newestFile("$resultDirectory", qr/sunspider-results-.+\.js$/);
|
||||
}
|
||||
|
||||
my $output = "var output1 = " . readResultsFile($file1) . ";\n";
|
||||
$output .= "var output2 = " . readResultsFile($file2) . ";\n";
|
||||
|
||||
dumpToFile($output, "$resultDirectory/sunspider-comparison-data.js");
|
||||
|
||||
system($jsShellPath, "-f", "$resultDirectory/sunspider-test-prefix.js", "-f", "$resultDirectory/sunspider-comparison-data.js", "-f", "resources/sunspider-compare-results.js", "-f", "resources/sunspider-standalone-compare.js");
|
|
@ -0,0 +1,14 @@
|
|||
ai-astar
|
||||
audio-beat-detection
|
||||
audio-dft
|
||||
audio-fft
|
||||
audio-oscillator
|
||||
imaging-gaussian-blur
|
||||
imaging-darkroom
|
||||
imaging-desaturate
|
||||
json-parse-financial
|
||||
json-stringify-tinderbox
|
||||
stanford-crypto-aes
|
||||
stanford-crypto-ccm
|
||||
stanford-crypto-pbkdf2
|
||||
stanford-crypto-sha256-iterative
|
Разница между файлами не показана из-за своего большого размера
Загрузить разницу
|
@ -0,0 +1,150 @@
|
|||
Array.prototype.each = function(f) {
|
||||
if(!f.apply) return;
|
||||
for(var i=0;i<this.length;i++) {
|
||||
f.apply(this[i], [i, this]);
|
||||
}
|
||||
}
|
||||
Array.prototype.findGraphNode = function(obj) {
|
||||
for(var i=0;i<this.length;i++) {
|
||||
if(this[i].pos == obj.pos) { return this[i]; }
|
||||
}
|
||||
return false;
|
||||
};
|
||||
Array.prototype.removeGraphNode = function(obj) {
|
||||
for(var i=0;i<this.length;i++) {
|
||||
if(this[i].pos == obj.pos) { this.splice(i,1); }
|
||||
}
|
||||
return false;
|
||||
};
|
||||
|
||||
function createGraphSet(gridSize, wallFrequency) {
|
||||
var graphSet = [];
|
||||
for(var x=0;x<gridSize;x++) {
|
||||
var row = [];
|
||||
for(var y=0;y<gridSize;y++) {
|
||||
// maybe set this node to be wall
|
||||
var rand = Math.floor(Math.random()*(1/wallFrequency));
|
||||
row.push(new GraphNode(x,y,(rand == 0)));
|
||||
}
|
||||
graphSet.push(row);
|
||||
}
|
||||
return graphSet;
|
||||
}
|
||||
|
||||
// astar.js
|
||||
// Implements the astar search algorithm in javascript
|
||||
|
||||
var astar = {
|
||||
init: function(grid) {
|
||||
for(var x = 0; x < grid.length; x++) {
|
||||
for(var y = 0; y < grid[x].length; y++) {
|
||||
grid[x][y].f = 0;
|
||||
grid[x][y].g = 0;
|
||||
grid[x][y].h = 0;
|
||||
grid[x][y].parent = null;
|
||||
}
|
||||
}
|
||||
},
|
||||
search: function(grid, start, end) {
|
||||
astar.init(grid);
|
||||
|
||||
var openList = [];
|
||||
var closedList = [];
|
||||
openList.push(start);
|
||||
|
||||
while(openList.length > 0) {
|
||||
|
||||
// Grab the lowest f(x) to process next
|
||||
var lowInd = 0;
|
||||
for(var i=0; i<openList.length; i++) {
|
||||
if(openList[i].f < openList[lowInd].f) { lowInd = i; }
|
||||
}
|
||||
var currentNode = openList[lowInd];
|
||||
|
||||
// End case -- result has been found, return the traced path
|
||||
if(currentNode.pos == end.pos) {
|
||||
var curr = currentNode;
|
||||
var ret = [];
|
||||
while(curr.parent) {
|
||||
ret.push(curr);
|
||||
curr = curr.parent;
|
||||
}
|
||||
return ret.reverse();
|
||||
}
|
||||
|
||||
// Normal case -- move currentNode from open to closed, process each of its neighbors
|
||||
openList.removeGraphNode(currentNode);
|
||||
closedList.push(currentNode);
|
||||
var neighbors = astar.neighbors(grid, currentNode);
|
||||
|
||||
for(var j=0; j<neighbors.length;j++) {
|
||||
var neighbor = neighbors[j];
|
||||
if(closedList.findGraphNode(neighbor) || neighbor.isWall()) {
|
||||
// not a valid node to process, skip to next neighbor
|
||||
continue;
|
||||
}
|
||||
|
||||
// g score is the shortest distance from start to current node, we need to check if
|
||||
// the path we have arrived at this neighbor is the shortest one we have seen yet
|
||||
var gScore = currentNode.g + 1; // 1 is the distance from a node to it's neighbor
|
||||
var gScoreIsBest = false;
|
||||
|
||||
|
||||
if(!openList.findGraphNode(neighbor)) {
|
||||
// This the the first time we have arrived at this node, it must be the best
|
||||
// Also, we need to take the h (heuristic) score since we haven't done so yet
|
||||
|
||||
gScoreIsBest = true;
|
||||
neighbor.h = astar.heuristic(neighbor.pos, end.pos);
|
||||
openList.push(neighbor);
|
||||
}
|
||||
else if(gScore < neighbor.g) {
|
||||
// We have already seen the node, but last time it had a worse g (distance from start)
|
||||
gScoreIsBest = true;
|
||||
}
|
||||
|
||||
if(gScoreIsBest) {
|
||||
// Found an optimal (so far) path to this node. Store info on how we got here and
|
||||
// just how good it really is...
|
||||
neighbor.parent = currentNode;
|
||||
neighbor.g = gScore;
|
||||
neighbor.f = neighbor.g + neighbor.h;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// No result was found -- empty array signifies failure to find path
|
||||
return [];
|
||||
},
|
||||
heuristic: function(pos0, pos1) {
|
||||
// This is the Manhattan distance
|
||||
var d1 = Math.abs (pos1.x - pos0.x);
|
||||
var d2 = Math.abs (pos1.y - pos0.y);
|
||||
return d1 + d2;
|
||||
},
|
||||
neighbors: function(grid, node) {
|
||||
var ret = [];
|
||||
var x = node.pos.x;
|
||||
var y = node.pos.y;
|
||||
|
||||
if(grid[x-1] && grid[x-1][y]) {
|
||||
ret.push(grid[x-1][y]);
|
||||
}
|
||||
if(grid[x+1] && grid[x+1][y]) {
|
||||
ret.push(grid[x+1][y]);
|
||||
}
|
||||
if(grid[x][y-1] && grid[x][y-1]) {
|
||||
ret.push(grid[x][y-1]);
|
||||
}
|
||||
if(grid[x][y+1] && grid[x][y+1]) {
|
||||
ret.push(grid[x][y+1]);
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
};
|
||||
|
||||
function go() {
|
||||
path = astar.search(g1, start, end);
|
||||
};
|
||||
|
||||
go();
|
Различия файлов скрыты, потому что одна или несколько строк слишком длинны
|
@ -0,0 +1,19 @@
|
|||
var iterations = 1000;
|
||||
|
||||
var fft = fft = new FFT(frameBufferLength / channels, rate);
|
||||
var bd = new BeatDetektor();
|
||||
var kick_det = new BeatDetektor.modules.vis.BassKick();
|
||||
var vu = new BeatDetektor.modules.vis.VU();
|
||||
|
||||
var calcBeat = function() {
|
||||
var fb = getFramebuffer(), signal = DSP.getChannel(DSP.MIX, fb);
|
||||
|
||||
fft.forward(signal);
|
||||
|
||||
var timestamp = (new Date()).getTime();
|
||||
bd.process(timestamp, fft.spectrum);
|
||||
kick_det.process(bd);
|
||||
vu.process(bd);
|
||||
};
|
||||
|
||||
runTest(calcBeat, iterations);
|
Различия файлов скрыты, потому что одна или несколько строк слишком длинны
|
@ -0,0 +1,10 @@
|
|||
var iterations = 20;
|
||||
|
||||
var dft = new DFT(frameBufferLength / channels, rate);
|
||||
|
||||
var calcDFT = function() {
|
||||
var fb = getFramebuffer(), signal = DSP.getChannel(DSP.MIX, fb);
|
||||
dft.forward(signal);
|
||||
};
|
||||
|
||||
runTest(calcDFT, iterations);
|
Различия файлов скрыты, потому что одна или несколько строк слишком длинны
|
@ -0,0 +1,12 @@
|
|||
var iterations = 1000;
|
||||
|
||||
var fft = new FFT(frameBufferLength / channels, rate);
|
||||
|
||||
var calcFFT = function() {
|
||||
var fb = getFramebuffer(),
|
||||
signal = DSP.getChannel(DSP.MIX, fb);
|
||||
|
||||
fft.forward(signal);
|
||||
};
|
||||
|
||||
runTest(calcFFT, iterations);
|
Различия файлов скрыты, потому что одна или несколько строк слишком длинны
|
@ -0,0 +1,16 @@
|
|||
var iterations = 500;
|
||||
|
||||
var bufferSize = 8192;
|
||||
var sampleRate = 44100.0;
|
||||
var nthHarmonic = 5;
|
||||
var frequency = 344.53;
|
||||
var sine = new Oscillator(Oscillator.Sine, frequency, 1, bufferSize, sampleRate);
|
||||
|
||||
var calcOsc = function() {
|
||||
sine.generate();
|
||||
harmonic = new Oscillator(Oscillator.Sine, frequency*nthHarmonic, 1/nthHarmonic, bufferSize, sampleRate);
|
||||
harmonic.generate();
|
||||
sine.add(harmonic);
|
||||
};
|
||||
|
||||
runTest(calcOsc, iterations);
|
Различия файлов скрыты, потому что одна или несколько строк слишком длинны
|
@ -0,0 +1,5 @@
|
|||
var width = 400, height = 267;
|
||||
for (var index = 0; index < paramArray.length; index++) {
|
||||
var data = squidImageData;
|
||||
data = ProcessImageData(data, width, height, paramArray[index]);
|
||||
}
|
Различия файлов скрыты, потому что одна или несколько строк слишком длинны
|
@ -0,0 +1,40 @@
|
|||
/*
|
||||
* Pixastic Lib - Desaturation filter - v0.1.1
|
||||
* Copyright (c) 2008 Jacob Seidelin, jseidelin@nihilogic.dk, http://blog.nihilogic.dk/
|
||||
* License: [http://www.pixastic.com/lib/license.txt] (MPL 1.1)
|
||||
*/
|
||||
|
||||
var Pixastic = {};
|
||||
Pixastic.Actions = {};
|
||||
Pixastic.Actions.desaturate = {
|
||||
process : function(params) {
|
||||
var useAverage = !!(params.options.average && params.options.average != "false");
|
||||
var data = params.data;
|
||||
var rect = params.options.rect;
|
||||
var w = rect.width;
|
||||
var h = rect.height;
|
||||
|
||||
var p = w*h;
|
||||
var pix = p*4, pix1, pix2;
|
||||
|
||||
if (useAverage) {
|
||||
while (p--)
|
||||
data[pix-=4] = data[pix1=pix+1] = data[pix2=pix+2] = (data[pix]+data[pix1]+data[pix2])/3
|
||||
} else {
|
||||
while (p--)
|
||||
data[pix-=4] = data[pix1=pix+1] = data[pix2=pix+2] = (data[pix]*0.3 + data[pix1]*0.59 + data[pix2]*0.11);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
var params = {
|
||||
options: {
|
||||
rect: { width: width, height: height},
|
||||
},
|
||||
data: squidImageData
|
||||
}
|
||||
|
||||
//XXX improve dataset rather than loop
|
||||
for (var pixcounter = 0; pixcounter < 200; pixcounter++)
|
||||
Pixastic.Actions.desaturate.process(params);
|
Различия файлов скрыты, потому что одна или несколько строк слишком длинны
|
@ -0,0 +1,25 @@
|
|||
//print("i: " + i + "j: " + j);
|
||||
|
||||
function gaussianBlur() {
|
||||
for (var y = 0; y < height; ++y) {
|
||||
for (var x = 0; x < width; ++x) {
|
||||
var r = 0, g = 0, b = 0, a = 0;
|
||||
for (var j = 1 - kernelSize; j < kernelSize; ++j) {
|
||||
if (y + j < 0 || y + j >= height) continue;
|
||||
for (var i = 1 - kernelSize; i < kernelSize; ++i) {
|
||||
if (x + i < 0 || x + i >= width) continue;
|
||||
r += squidImageData[4 * ((y + j) * width + (x + i)) + 0] * kernel[Math.abs(j)][Math.abs(i)];
|
||||
g += squidImageData[4 * ((y + j) * width + (x + i)) + 1] * kernel[Math.abs(j)][Math.abs(i)];
|
||||
b += squidImageData[4 * ((y + j) * width + (x + i)) + 2] * kernel[Math.abs(j)][Math.abs(i)];
|
||||
a += squidImageData[4 * ((y + j) * width + (x + i)) + 3] * kernel[Math.abs(j)][Math.abs(i)];
|
||||
}
|
||||
}
|
||||
squidImageData[4 * (y * width + x) + 0] = r / kernelSum;
|
||||
squidImageData[4 * (y * width + x) + 1] = g / kernelSum;
|
||||
squidImageData[4 * (y * width + x) + 2] = b / kernelSum;
|
||||
squidImageData[4 * (y * width + x) + 3] = a / kernelSum;
|
||||
}
|
||||
}
|
||||
return squidImageData;
|
||||
}
|
||||
gaussianBlur();
|
|
@ -0,0 +1,103 @@
|
|||
var data =
|
||||
"{\"summary\":{\"turnover\":0.3736,\"correlation2\":0." +
|
||||
"7147,\"concentration\":0.3652,\"beta\":0.8814,\"totalValue\":1.3" +
|
||||
"091078259E8,\"correlation\":0.7217},\"watchlist\":[],\"shortCash" +
|
||||
"\":-1611000,\"holdings\":[{\"type\":\"LONG\",\"commission\":1040" +
|
||||
",\"cost\":9001920,\"quantity\":26000,\"lots\":[{\"marketCap\":\"" +
|
||||
"L\",\"industry\":\"TECHNOLOGY\",\"style\":\"G\",\"buyDate\":\"20" +
|
||||
"08-10-08 13:44:20.000\",\"quantity\":8000},{\"marketCap\":\"L\"," +
|
||||
"\"industry\":\"TECHNOLOGY\",\"style\":\"G\",\"buyDate\":\"2008-1" +
|
||||
"0-15 13:28:02.000\",\"quantity\":18000}],\"stock\":\"GOOG\"},{\"" +
|
||||
"type\":\"LONG\",\"commission\":8000,\"cost\":4672000,\"quantity" +
|
||||
"\":200000,\"lots\":[{\"marketCap\":\"L\",\"industry\":\"TECHNOLO" +
|
||||
"GY\",\"style\":\"G\",\"buyDate\":\"2008-10-15 13:28:54.000\",\"q" +
|
||||
"uantity\":200000}],\"stock\":\"MSFT\"},{\"type\":\"LONG\",\"comm" +
|
||||
"ission\":21877,\"cost\":1.001592313E7,\"quantity\":546919,\"lots" +
|
||||
"\":[{\"marketCap\":\"L\",\"industry\":\"FINANCIAL\",\"style\":\"" +
|
||||
"G\",\"buyDate\":\"2008-08-01 09:50:17.000\",\"quantity\":103092}" +
|
||||
",{\"marketCap\":\"L\",\"industry\":\"FINANCIAL\",\"style\":\"G\"" +
|
||||
",\"buyDate\":\"2008-08-18 10:31:34.000\",\"quantity\":49950},{\"" +
|
||||
"marketCap\":\"L\",\"industry\":\"FINANCIAL\",\"style\":\"G\",\"b" +
|
||||
"uyDate\":\"2008-08-29 09:35:22.000\",\"quantity\":45045},{\"mark" +
|
||||
"etCap\":\"L\",\"industry\":\"FINANCIAL\",\"style\":\"G\",\"buyDa" +
|
||||
"te\":\"2008-09-15 09:40:32.000\",\"quantity\":48400},{\"marketCa" +
|
||||
"p\":\"L\",\"industry\":\"FINANCIAL\",\"style\":\"G\",\"buyDate\"" +
|
||||
":\"2008-10-06 11:21:50.000\",\"quantity\":432},{\"marketCap\":\"" +
|
||||
"L\",\"industry\":\"FINANCIAL\",\"style\":\"G\",\"buyDate\":\"200" +
|
||||
"8-10-15 13:30:05.000\",\"quantity\":300000}],\"stock\":\"UBS\"}," +
|
||||
"{\"type\":\"LONG\",\"commission\":4000,\"cost\":6604849.1,\"quan" +
|
||||
"tity\":122741,\"lots\":[{\"marketCap\":\"L\",\"industry\":\"SERV" +
|
||||
"ICES\",\"style\":\"V\",\"buyDate\":\"2008-04-26 04:44:34.000\"," +
|
||||
"\"quantity\":22741},{\"marketCap\":\"L\",\"industry\":\"SERVICES" +
|
||||
"\",\"style\":\"V\",\"buyDate\":\"2008-10-15 13:31:02.000\",\"qua" +
|
||||
"ntity\":100000}],\"stock\":\"V\"},{\"type\":\"LONG\",\"commissio" +
|
||||
"n\":2805,\"cost\":5005558.25,\"quantity\":70121,\"lots\":[{\"mar" +
|
||||
"ketCap\":\"M\",\"industry\":\"RETAIL\",\"style\":\"G\",\"buyDate" +
|
||||
"\":\"2008-10-10 10:48:36.000\",\"quantity\":121},{\"marketCap\":" +
|
||||
"\"M\",\"industry\":\"RETAIL\",\"style\":\"G\",\"buyDate\":\"2008" +
|
||||
"-10-15 13:33:44.000\",\"quantity\":70000}],\"stock\":\"LDG\"},{" +
|
||||
"\"type\":\"LONG\",\"commission\":10000,\"cost\":5382500,\"quanti" +
|
||||
"ty\":250000,\"lots\":[{\"marketCap\":\"L\",\"industry\":\"RETAIL" +
|
||||
"\",\"style\":\"V\",\"buyDate\":\"2008-10-15 13:34:30.000\",\"qua" +
|
||||
"ntity\":250000}],\"stock\":\"SWY\"},{\"type\":\"LONG\",\"commiss" +
|
||||
"ion\":1120,\"cost\":1240960,\"quantity\":28000,\"lots\":[{\"mark" +
|
||||
"etCap\":\"u\",\"industry\":\"ETF\",\"style\":\"B\",\"buyDate\":" +
|
||||
"\"2008-10-15 15:57:39.000\",\"quantity\":28000}],\"stock\":\"OIL" +
|
||||
"\"},{\"type\":\"LONG\",\"commission\":400,\"cost\":236800,\"quan" +
|
||||
"tity\":10000,\"lots\":[{\"marketCap\":\"M\",\"industry\":\"UTILI" +
|
||||
"TIES_AND_ENERGY\",\"style\":\"G\",\"buyDate\":\"2008-10-15 15:58" +
|
||||
":03.000\",\"quantity\":10000}],\"stock\":\"COG\"},{\"type\":\"LO" +
|
||||
"NG\",\"commission\":3200,\"cost\":1369600,\"quantity\":80000,\"l" +
|
||||
"ots\":[{\"marketCap\":\"S\",\"industry\":\"UTILITIES_AND_ENERGY" +
|
||||
"\",\"style\":\"G\",\"buyDate\":\"2008-10-15 15:58:32.000\",\"qua" +
|
||||
"ntity\":80000}],\"stock\":\"CRZO\"},{\"type\":\"LONG\",\"commiss" +
|
||||
"ion\":429,\"cost\":108164.8,\"quantity\":10720,\"lots\":[{\"mark" +
|
||||
"etCap\":\"u\",\"industry\":\"FINANCIAL\",\"style\":\"V\",\"buyDa" +
|
||||
"te\":\"2008-10-16 09:37:06.000\",\"quantity\":10720}],\"stock\":" +
|
||||
"\"FGI\"},{\"type\":\"LONG\",\"commission\":1080,\"cost\":494910," +
|
||||
"\"quantity\":27000,\"lots\":[{\"marketCap\":\"L\",\"industry\":" +
|
||||
"\"RETAIL\",\"style\":\"V\",\"buyDate\":\"2008-10-16 09:37:06.000" +
|
||||
"\",\"quantity\":27000}],\"stock\":\"LOW\"},{\"type\":\"LONG\",\"" +
|
||||
"commission\":4080,\"cost\":4867440,\"quantity\":102000,\"lots\":" +
|
||||
"[{\"marketCap\":\"L\",\"industry\":\"HEALTHCARE\",\"style\":\"V" +
|
||||
"\",\"buyDate\":\"2008-10-16 09:37:06.000\",\"quantity\":102000}]" +
|
||||
",\"stock\":\"AMGN\"},{\"type\":\"SHORT\",\"commission\":4000,\"" +
|
||||
"cost\":-1159000,\"quantity\":-100000,\"lots\":[{\"marketCap\":" +
|
||||
"\"L\",\"industry\":\"TECHNOLOGY\",\"style\":\"V\",\"buyDate\":" +
|
||||
"\"2008-10-16 09:37:06.000\",\"quantity\":-100000}],\"stock\":\"" +
|
||||
"AMAT\"},{\"type\":\"LONG\",\"commission\":2,\"cost\":5640002,\"" +
|
||||
"quantity\":50,\"lots\":[{\"marketCap\":\"L\",\"industry\":\"FIN" +
|
||||
"ANCIAL\",\"style\":\"B\",\"buyDate\":\"2008-10-16 09:37:06.000" +
|
||||
"\",\"quantity\":50}],\"stock\":\"BRKA\"},{\"type\":\"SHORT\",\"" +
|
||||
"commission\":4000,\"cost\":-436000,\"quantity\":-100000,\"lots" +
|
||||
"\":[{\"marketCap\":\"M\",\"industry\":\"TRANSPORTATION\",\"styl" +
|
||||
"e\":\"G\",\"buyDate\":\"2008-10-16 09:37:06.000\",\"quantity\":-" +
|
||||
"100000}],\"stock\":\"JBLU\"},{\"type\":\"LONG\",\"commission\":8" +
|
||||
"000,\"cost\":1.1534E7,\"quantity\":200000,\"lots\":[{\"marketCap" +
|
||||
"\":\"S\",\"industry\":\"FINANCIAL\",\"style\":\"G\",\"buyDate\":" +
|
||||
"\"2008-10-16 14:35:24.000\",\"quantity\":200000}],\"stock\":\"US" +
|
||||
"O\"},{\"type\":\"LONG\",\"commission\":4000,\"cost\":1.0129E7,\"" +
|
||||
"quantity\":100000,\"lots\":[{\"marketCap\":\"L\",\"industry\":\"" +
|
||||
"TECHNOLOGY\",\"style\":\"G\",\"buyDate\":\"2008-10-15 13:28:26.0" +
|
||||
"00\",\"quantity\":50000},{\"marketCap\":\"L\",\"industry\":\"TEC" +
|
||||
"HNOLOGY\",\"style\":\"G\",\"buyDate\":\"2008-10-17 09:33:09.000" +
|
||||
"\",\"quantity\":50000}],\"stock\":\"AAPL\"},{\"type\":\"LONG\"," +
|
||||
"\"commission\":1868,\"cost\":9971367.2,\"quantity\":54280,\"lots" +
|
||||
"\":[{\"marketCap\":\"L\",\"industry\":\"SERVICES\",\"style\":\"G" +
|
||||
"\",\"buyDate\":\"2008-04-26 04:44:34.000\",\"quantity\":7580},{" +
|
||||
"\"marketCap\":\"L\",\"industry\":\"SERVICES\",\"style\":\"G\",\"" +
|
||||
"buyDate\":\"2008-05-29 09:50:28.000\",\"quantity\":7500},{\"mark" +
|
||||
"etCap\":\"L\",\"industry\":\"SERVICES\",\"style\":\"G\",\"buyDat" +
|
||||
"e\":\"2008-10-15 13:30:38.000\",\"quantity\":33000},{\"marketCap" +
|
||||
"\":\"L\",\"industry\":\"SERVICES\",\"style\":\"G\",\"buyDate\":" +
|
||||
"\"2008-10-17 09:33:09.000\",\"quantity\":6200}],\"stock\":\"MA\"" +
|
||||
"}],\"longCash\":4.600368106E7,\"ownerId\":8,\"pendingOrders\":[{" +
|
||||
"\"total\":487000,\"type\":\"cover\",\"subtotal\":483000,\"price" +
|
||||
"\":4.83,\"commission\":4000,\"date\":\"2008-10-17 23:56:06.000\"" +
|
||||
",\"quantity\":100000,\"expires\":\"2008-10-20 16:00:00.000\",\"s" +
|
||||
"tock\":\"JBLU\",\"id\":182375},{\"total\":6271600,\"type\":\"buy" +
|
||||
"\",\"subtotal\":6270000,\"price\":156.75,\"commission\":1600,\"d" +
|
||||
"ate\":\"2008-10-17 23:56:40.000\",\"quantity\":40000,\"expires\"" +
|
||||
":\"2008-10-20 16:00:00.000\",\"stock\":\"MA\",\"id\":182376}],\"" +
|
||||
"inceptionDate\":\"2008-04-26 04:44:29.000\",\"withdrawals\":0,\"" +
|
||||
"id\":219948,\"deposits\":0}";
|
|
@ -0,0 +1,4 @@
|
|||
|
||||
for (var i = 0; i < 1000; i++) {
|
||||
var x = JSON.parse(data);
|
||||
}
|
Различия файлов скрыты, потому что одна или несколько строк слишком длинны
|
@ -0,0 +1,4 @@
|
|||
|
||||
for (var i = 0; i < 20; i++) {
|
||||
var x = JSON.stringify(tinderbox_data);
|
||||
}
|
Разница между файлами не показана из-за своего большого размера
Загрузить разницу
|
@ -0,0 +1,23 @@
|
|||
new sjcl.test.TestCase("AES official known-answer tests", function (cb) {
|
||||
if (!sjcl.cipher.aes) {
|
||||
this.unimplemented();
|
||||
cb && cb();
|
||||
return;
|
||||
}
|
||||
|
||||
var i, kat = sjcl.test.vector.aes, tv, len, aes;
|
||||
|
||||
//XXX add more vectors instead of looping
|
||||
for (var index = 0; index < 8; index++) {
|
||||
for (i=0; i<kat.length; i++) {
|
||||
tv = kat[i];
|
||||
len = 32 * tv.key.length;
|
||||
aes = new sjcl.cipher.aes(tv.key);
|
||||
this.require(sjcl.bitArray.equal(aes.encrypt(tv.pt), tv.ct), "encrypt "+len+" #"+i);
|
||||
this.require(sjcl.bitArray.equal(aes.decrypt(tv.ct), tv.pt), "decrypt "+len+" #"+i);
|
||||
}
|
||||
}
|
||||
cb && cb();
|
||||
});
|
||||
|
||||
sjcl.test.run();
|
Разница между файлами не показана из-за своего большого размера
Загрузить разницу
|
@ -0,0 +1,33 @@
|
|||
new sjcl.test.TestCase("CCM mode tests", function (cb) {
|
||||
if (!sjcl.cipher.aes || !sjcl.mode.ccm) {
|
||||
this.unimplemented();
|
||||
cb && cb();
|
||||
return;
|
||||
}
|
||||
|
||||
var i, kat = sjcl.test.vector.ccm, tv, iv, ct, aes, len, tlen, thiz=this, w=sjcl.bitArray, pt, h=sjcl.codec.hex, ad;
|
||||
browserUtil.cpsIterate(function (j, cbb) {
|
||||
for (i=100*j; i<kat.length && i<100*(j+1); i++) {
|
||||
tv = kat[i];
|
||||
len = 32 * tv.key.length;
|
||||
aes = new sjcl.cipher.aes(h.toBits(tv.key));
|
||||
|
||||
// Convert from strings
|
||||
iv = h.toBits(tv.iv);
|
||||
ad = h.toBits(tv.adata);
|
||||
pt = h.toBits(tv.pt);
|
||||
ct = h.toBits(tv.ct + tv.tag);
|
||||
tlen = tv.tag.length * 4;
|
||||
|
||||
thiz.require(w.equal(sjcl.mode.ccm.encrypt(aes, pt, iv, ad, tlen), ct), "aes-"+len+"-ccm-encrypt #"+i);
|
||||
try {
|
||||
thiz.require(w.equal(sjcl.mode.ccm.decrypt(aes, ct, iv, ad, tlen), pt), "aes-"+len+"-ccm-decrypt #"+i);
|
||||
} catch (e) {
|
||||
thiz.fail("aes-ccm-decrypt #"+i+" (exn "+e+")");
|
||||
}
|
||||
}
|
||||
cbb();
|
||||
}, 0, kat.length / 100, true, cb);
|
||||
});
|
||||
|
||||
sjcl.test.run();
|
|
@ -0,0 +1,222 @@
|
|||
"use strict";
|
||||
|
||||
var sjcl={cipher:{},hash:{},mode:{},misc:{},codec:{},exception:{corrupt:function(a){this.toString=function(){return"CORRUPT: "+this.message};this.message=a},invalid:function(a){this.toString=function(){return"INVALID: "+this.message};this.message=a},bug:function(a){this.toString=function(){return"BUG: "+this.message};this.message=a}}};
|
||||
sjcl.cipher.aes=function(a){this.h[0][0][0]||this.w();var b,c,d,e,f=this.h[0][4],g=this.h[1];b=a.length;var h=1;if(b!==4&&b!==6&&b!==8)throw new sjcl.exception.invalid("invalid aes key size");this.a=[d=a.slice(0),e=[]];for(a=b;a<4*b+28;a++){c=d[a-1];if(a%b===0||b===8&&a%b===4){c=f[c>>>24]<<24^f[c>>16&255]<<16^f[c>>8&255]<<8^f[c&255];if(a%b===0){c=c<<8^c>>>24^h<<24;h=h<<1^(h>>7)*283}}d[a]=d[a-b]^c}for(b=0;a;b++,a--){c=d[b&3?a:a-4];e[b]=a<=4||b<4?c:g[0][f[c>>>24]]^g[1][f[c>>16&255]]^g[2][f[c>>8&255]]^
|
||||
g[3][f[c&255]]}};
|
||||
sjcl.cipher.aes.prototype={encrypt:function(a){return this.H(a,0)},decrypt:function(a){return this.H(a,1)},h:[[[],[],[],[],[]],[[],[],[],[],[]]],w:function(){var a=this.h[0],b=this.h[1],c=a[4],d=b[4],e,f,g,h=[],i=[],k,j,l,m;for(e=0;e<0x100;e++)i[(h[e]=e<<1^(e>>7)*283)^e]=e;for(f=g=0;!c[f];f^=k||1,g=i[g]||1){l=g^g<<1^g<<2^g<<3^g<<4;l=l>>8^l&255^99;c[f]=l;d[l]=f;j=h[e=h[k=h[f]]];m=j*0x1010101^e*0x10001^k*0x101^f*0x1010100;j=h[l]*0x101^l*0x1010100;for(e=0;e<4;e++){a[e][f]=j=j<<24^j>>>8;b[e][l]=m=m<<24^m>>>8}}for(e=
|
||||
0;e<5;e++){a[e]=a[e].slice(0);b[e]=b[e].slice(0)}},H:function(a,b){if(a.length!==4)throw new sjcl.exception.invalid("invalid aes block size");var c=this.a[b],d=a[0]^c[0],e=a[b?3:1]^c[1],f=a[2]^c[2];a=a[b?1:3]^c[3];var g,h,i,k=c.length/4-2,j,l=4,m=[0,0,0,0];g=this.h[b];var n=g[0],o=g[1],p=g[2],q=g[3],r=g[4];for(j=0;j<k;j++){g=n[d>>>24]^o[e>>16&255]^p[f>>8&255]^q[a&255]^c[l];h=n[e>>>24]^o[f>>16&255]^p[a>>8&255]^q[d&255]^c[l+1];i=n[f>>>24]^o[a>>16&255]^p[d>>8&255]^q[e&255]^c[l+2];a=n[a>>>24]^o[d>>16&
|
||||
255]^p[e>>8&255]^q[f&255]^c[l+3];l+=4;d=g;e=h;f=i}for(j=0;j<4;j++){m[b?3&-j:j]=r[d>>>24]<<24^r[e>>16&255]<<16^r[f>>8&255]<<8^r[a&255]^c[l++];g=d;d=e;e=f;f=a;a=g}return m}};
|
||||
sjcl.bitArray={bitSlice:function(a,b,c){a=sjcl.bitArray.P(a.slice(b/32),32-(b&31)).slice(1);return c===undefined?a:sjcl.bitArray.clamp(a,c-b)},concat:function(a,b){if(a.length===0||b.length===0)return a.concat(b);var c=a[a.length-1],d=sjcl.bitArray.getPartial(c);return d===32?a.concat(b):sjcl.bitArray.P(b,d,c|0,a.slice(0,a.length-1))},bitLength:function(a){var b=a.length;if(b===0)return 0;return(b-1)*32+sjcl.bitArray.getPartial(a[b-1])},clamp:function(a,b){if(a.length*32<b)return a;a=a.slice(0,Math.ceil(b/
|
||||
32));var c=a.length;b&=31;if(c>0&&b)a[c-1]=sjcl.bitArray.partial(b,a[c-1]&2147483648>>b-1,1);return a},partial:function(a,b,c){if(a===32)return b;return(c?b|0:b<<32-a)+a*0x10000000000},getPartial:function(a){return Math.round(a/0x10000000000)||32},equal:function(a,b){if(sjcl.bitArray.bitLength(a)!==sjcl.bitArray.bitLength(b))return false;var c=0,d;for(d=0;d<a.length;d++)c|=a[d]^b[d];return c===0},P:function(a,b,c,d){var e;e=0;if(d===undefined)d=[];for(;b>=32;b-=32){d.push(c);c=0}if(b===0)return d.concat(a);
|
||||
for(e=0;e<a.length;e++){d.push(c|a[e]>>>b);c=a[e]<<32-b}e=a.length?a[a.length-1]:0;a=sjcl.bitArray.getPartial(e);d.push(sjcl.bitArray.partial(b+a&31,b+a>32?c:d.pop(),1));return d},k:function(a,b){return[a[0]^b[0],a[1]^b[1],a[2]^b[2],a[3]^b[3]]}};
|
||||
sjcl.codec.utf8String={fromBits:function(a){var b="",c=sjcl.bitArray.bitLength(a),d,e;for(d=0;d<c/8;d++){if((d&3)===0)e=a[d/4];b+=String.fromCharCode(e>>>24);e<<=8}return decodeURIComponent(escape(b))},toBits:function(a){a=unescape(encodeURIComponent(a));var b=[],c,d=0;for(c=0;c<a.length;c++){d=d<<8|a.charCodeAt(c);if((c&3)===3){b.push(d);d=0}}c&3&&b.push(sjcl.bitArray.partial(8*(c&3),d));return b}};
|
||||
sjcl.codec.hex={fromBits:function(a){var b="",c;for(c=0;c<a.length;c++)b+=((a[c]|0)+0xf00000000000).toString(16).substr(4);return b.substr(0,sjcl.bitArray.bitLength(a)/4)},toBits:function(a){var b,c=[],d;a=a.replace(/\s|0x/g,"");d=a.length;a+="00000000";for(b=0;b<a.length;b+=8)c.push(parseInt(a.substr(b,8),16)^0);return sjcl.bitArray.clamp(c,d*4)}};
|
||||
sjcl.codec.base64={D:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",fromBits:function(a,b){var c="",d,e=0,f=sjcl.codec.base64.D,g=0,h=sjcl.bitArray.bitLength(a);for(d=0;c.length*6<h;){c+=f.charAt((g^a[d]>>>e)>>>26);if(e<6){g=a[d]<<6-e;e+=26;d++}else{g<<=6;e-=6}}for(;c.length&3&&!b;)c+="=";return c},toBits:function(a){a=a.replace(/\s|=/g,"");var b=[],c,d=0,e=sjcl.codec.base64.D,f=0,g;for(c=0;c<a.length;c++){g=e.indexOf(a.charAt(c));if(g<0)throw new sjcl.exception.invalid("this isn't base64!");
|
||||
if(d>26){d-=26;b.push(f^g>>>d);f=g<<32-d}else{d+=6;f^=g<<32-d}}d&56&&b.push(sjcl.bitArray.partial(d&56,f,1));return b}};sjcl.hash.sha256=function(a){this.a[0]||this.w();if(a){this.n=a.n.slice(0);this.i=a.i.slice(0);this.e=a.e}else this.reset()};sjcl.hash.sha256.hash=function(a){return(new sjcl.hash.sha256).update(a).finalize()};
|
||||
sjcl.hash.sha256.prototype={blockSize:512,reset:function(){this.n=this.N.slice(0);this.i=[];this.e=0;return this},update:function(a){if(typeof a==="string")a=sjcl.codec.utf8String.toBits(a);var b,c=this.i=sjcl.bitArray.concat(this.i,a);b=this.e;a=this.e=b+sjcl.bitArray.bitLength(a);for(b=512+b&-512;b<=a;b+=512)this.C(c.splice(0,16));return this},finalize:function(){var a,b=this.i,c=this.n;b=sjcl.bitArray.concat(b,[sjcl.bitArray.partial(1,1)]);for(a=b.length+2;a&15;a++)b.push(0);b.push(Math.floor(this.e/
|
||||
4294967296));for(b.push(this.e|0);b.length;)this.C(b.splice(0,16));this.reset();return c},N:[],a:[],w:function(){function a(e){return(e-Math.floor(e))*0x100000000|0}var b=0,c=2,d;a:for(;b<64;c++){for(d=2;d*d<=c;d++)if(c%d===0)continue a;if(b<8)this.N[b]=a(Math.pow(c,0.5));this.a[b]=a(Math.pow(c,1/3));b++}},C:function(a){var b,c,d=a.slice(0),e=this.n,f=this.a,g=e[0],h=e[1],i=e[2],k=e[3],j=e[4],l=e[5],m=e[6],n=e[7];for(a=0;a<64;a++){if(a<16)b=d[a];else{b=d[a+1&15];c=d[a+14&15];b=d[a&15]=(b>>>7^b>>>18^
|
||||
b>>>3^b<<25^b<<14)+(c>>>17^c>>>19^c>>>10^c<<15^c<<13)+d[a&15]+d[a+9&15]|0}b=b+n+(j>>>6^j>>>11^j>>>25^j<<26^j<<21^j<<7)+(m^j&(l^m))+f[a];n=m;m=l;l=j;j=k+b|0;k=i;i=h;h=g;g=b+(h&i^k&(h^i))+(h>>>2^h>>>13^h>>>22^h<<30^h<<19^h<<10)|0}e[0]=e[0]+g|0;e[1]=e[1]+h|0;e[2]=e[2]+i|0;e[3]=e[3]+k|0;e[4]=e[4]+j|0;e[5]=e[5]+l|0;e[6]=e[6]+m|0;e[7]=e[7]+n|0}};
|
||||
sjcl.mode.ccm={name:"ccm",encrypt:function(a,b,c,d,e){var f,g=b.slice(0),h=sjcl.bitArray,i=h.bitLength(c)/8,k=h.bitLength(g)/8;e=e||64;d=d||[];if(i<7)throw new sjcl.exception.invalid("ccm: iv must be at least 7 bytes");for(f=2;f<4&&k>>>8*f;f++);if(f<15-i)f=15-i;c=h.clamp(c,8*(15-f));b=sjcl.mode.ccm.G(a,b,c,d,e,f);g=sjcl.mode.ccm.I(a,g,c,b,e,f);return h.concat(g.data,g.tag)},decrypt:function(a,b,c,d,e){e=e||64;d=d||[];var f=sjcl.bitArray,g=f.bitLength(c)/8,h=f.bitLength(b),i=f.clamp(b,h-e),k=f.bitSlice(b,
|
||||
h-e);h=(h-e)/8;if(g<7)throw new sjcl.exception.invalid("ccm: iv must be at least 7 bytes");for(b=2;b<4&&h>>>8*b;b++);if(b<15-g)b=15-g;c=f.clamp(c,8*(15-b));i=sjcl.mode.ccm.I(a,i,c,k,e,b);a=sjcl.mode.ccm.G(a,i.data,c,d,e,b);if(!f.equal(i.tag,a))throw new sjcl.exception.corrupt("ccm: tag doesn't match");return i.data},G:function(a,b,c,d,e,f){var g=[],h=sjcl.bitArray,i=h.k;e/=8;if(e%2||e<4||e>16)throw new sjcl.exception.invalid("ccm: invalid tag length");if(d.length>0xffffffff||b.length>0xffffffff)throw new sjcl.exception.bug("ccm: can't deal with 4GiB or more data");
|
||||
f=[h.partial(8,(d.length?64:0)|e-2<<2|f-1)];f=h.concat(f,c);f[3]|=h.bitLength(b)/8;f=a.encrypt(f);if(d.length){c=h.bitLength(d)/8;if(c<=65279)g=[h.partial(16,c)];else if(c<=0xffffffff)g=h.concat([h.partial(16,65534)],[c]);g=h.concat(g,d);for(d=0;d<g.length;d+=4)f=a.encrypt(i(f,g.slice(d,d+4)))}for(d=0;d<b.length;d+=4)f=a.encrypt(i(f,b.slice(d,d+4)));return h.clamp(f,e*8)},I:function(a,b,c,d,e,f){var g,h=sjcl.bitArray;g=h.k;var i=b.length,k=h.bitLength(b);c=h.concat([h.partial(8,f-1)],c).concat([0,
|
||||
0,0]).slice(0,4);d=h.bitSlice(g(d,a.encrypt(c)),0,e);if(!i)return{tag:d,data:[]};for(g=0;g<i;g+=4){c[3]++;e=a.encrypt(c);b[g]^=e[0];b[g+1]^=e[1];b[g+2]^=e[2];b[g+3]^=e[3]}return{tag:d,data:h.clamp(b,k)}}};
|
||||
sjcl.mode.ocb2={name:"ocb2",encrypt:function(a,b,c,d,e,f){if(sjcl.bitArray.bitLength(c)!==128)throw new sjcl.exception.invalid("ocb iv must be 128 bits");var g,h=sjcl.mode.ocb2.A,i=sjcl.bitArray,k=i.k,j=[0,0,0,0];c=h(a.encrypt(c));var l,m=[];d=d||[];e=e||64;for(g=0;g+4<b.length;g+=4){l=b.slice(g,g+4);j=k(j,l);m=m.concat(k(c,a.encrypt(k(c,l))));c=h(c)}l=b.slice(g);b=i.bitLength(l);g=a.encrypt(k(c,[0,0,0,b]));l=i.clamp(k(l,g),b);j=k(j,k(l,g));j=a.encrypt(k(j,k(c,h(c))));if(d.length)j=k(j,f?d:sjcl.mode.ocb2.pmac(a,
|
||||
d));return m.concat(i.concat(l,i.clamp(j,e)))},decrypt:function(a,b,c,d,e,f){if(sjcl.bitArray.bitLength(c)!==128)throw new sjcl.exception.invalid("ocb iv must be 128 bits");e=e||64;var g=sjcl.mode.ocb2.A,h=sjcl.bitArray,i=h.k,k=[0,0,0,0],j=g(a.encrypt(c)),l,m,n=sjcl.bitArray.bitLength(b)-e,o=[];d=d||[];for(c=0;c+4<n/32;c+=4){l=i(j,a.decrypt(i(j,b.slice(c,c+4))));k=i(k,l);o=o.concat(l);j=g(j)}m=n-c*32;l=a.encrypt(i(j,[0,0,0,m]));l=i(l,h.clamp(b.slice(c),m));k=i(k,l);k=a.encrypt(i(k,i(j,g(j))));if(d.length)k=
|
||||
i(k,f?d:sjcl.mode.ocb2.pmac(a,d));if(!h.equal(h.clamp(k,e),h.bitSlice(b,n)))throw new sjcl.exception.corrupt("ocb: tag doesn't match");return o.concat(h.clamp(l,m))},pmac:function(a,b){var c,d=sjcl.mode.ocb2.A,e=sjcl.bitArray,f=e.k,g=[0,0,0,0],h=a.encrypt([0,0,0,0]);h=f(h,d(d(h)));for(c=0;c+4<b.length;c+=4){h=d(h);g=f(g,a.encrypt(f(h,b.slice(c,c+4))))}b=b.slice(c);if(e.bitLength(b)<128){h=f(h,d(h));b=e.concat(b,[2147483648|0])}g=f(g,b);return a.encrypt(f(d(f(h,d(h))),g))},A:function(a){return[a[0]<<
|
||||
1^a[1]>>>31,a[1]<<1^a[2]>>>31,a[2]<<1^a[3]>>>31,a[3]<<1^(a[0]>>>31)*135]}};sjcl.misc.hmac=function(a,b){this.M=b=b||sjcl.hash.sha256;var c=[[],[]],d=b.prototype.blockSize/32;this.l=[new b,new b];if(a.length>d)a=b.hash(a);for(b=0;b<d;b++){c[0][b]=a[b]^909522486;c[1][b]=a[b]^1549556828}this.l[0].update(c[0]);this.l[1].update(c[1])};sjcl.misc.hmac.prototype.encrypt=sjcl.misc.hmac.prototype.mac=function(a,b){a=(new this.M(this.l[0])).update(a,b).finalize();return(new this.M(this.l[1])).update(a).finalize()};
|
||||
sjcl.misc.pbkdf2=function(a,b,c,d,e){c=c||1E3;if(d<0||c<0)throw sjcl.exception.invalid("invalid params to pbkdf2");if(typeof a==="string")a=sjcl.codec.utf8String.toBits(a);e=e||sjcl.misc.hmac;a=new e(a);var f,g,h,i,k=[],j=sjcl.bitArray;for(i=1;32*k.length<(d||1);i++){e=f=a.encrypt(j.concat(b,[i]));for(g=1;g<c;g++){f=a.encrypt(f);for(h=0;h<f.length;h++)e[h]^=f[h]}k=k.concat(e)}if(d)k=j.clamp(k,d);return k};
|
||||
sjcl.random={randomWords:function(a,b){var c=[];b=this.isReady(b);var d;if(b===0)throw new sjcl.exception.notready("generator isn't seeded");else b&2&&this.U(!(b&1));for(b=0;b<a;b+=4){(b+1)%0x10000===0&&this.L();d=this.u();c.push(d[0],d[1],d[2],d[3])}this.L();return c.slice(0,a)},setDefaultParanoia:function(a){this.t=a},addEntropy:function(a,b,c){c=c||"user";var d,e,f=(new Date).valueOf(),g=this.q[c],h=this.isReady();d=this.F[c];if(d===undefined)d=this.F[c]=this.R++;if(g===undefined)g=this.q[c]=0;this.q[c]=
|
||||
(this.q[c]+1)%this.b.length;switch(typeof a){case "number":break;case "object":if(b===undefined)for(c=b=0;c<a.length;c++)for(e=a[c];e>0;){b++;e>>>=1}this.b[g].update([d,this.J++,2,b,f,a.length].concat(a));break;case "string":if(b===undefined)b=a.length;this.b[g].update([d,this.J++,3,b,f,a.length]);this.b[g].update(a);break;default:throw new sjcl.exception.bug("random: addEntropy only supports number, array or string");}this.j[g]+=b;this.f+=b;if(h===0){this.isReady()!==0&&this.K("seeded",Math.max(this.g,
|
||||
this.f));this.K("progress",this.getProgress())}},isReady:function(a){a=this.B[a!==undefined?a:this.t];return this.g&&this.g>=a?this.j[0]>80&&(new Date).valueOf()>this.O?3:1:this.f>=a?2:0},getProgress:function(a){a=this.B[a?a:this.t];return this.g>=a?1["0"]:this.f>a?1["0"]:this.f/a},startCollectors:function(){if(!this.m){if(window.addEventListener){window.addEventListener("load",this.o,false);window.addEventListener("mousemove",this.p,false)}else if(document.attachEvent){document.attachEvent("onload",
|
||||
this.o);document.attachEvent("onmousemove",this.p)}else throw new sjcl.exception.bug("can't attach event");this.m=true}},stopCollectors:function(){if(this.m){if(window.removeEventListener){window.removeEventListener("load",this.o);window.removeEventListener("mousemove",this.p)}else if(window.detachEvent){window.detachEvent("onload",this.o);window.detachEvent("onmousemove",this.p)}this.m=false}},addEventListener:function(a,b){this.r[a][this.Q++]=b},removeEventListener:function(a,b){var c;a=this.r[a];
|
||||
var d=[];for(c in a)a.hasOwnProperty[c]&&a[c]===b&&d.push(c);for(b=0;b<d.length;b++){c=d[b];delete a[c]}},b:[new sjcl.hash.sha256],j:[0],z:0,q:{},J:0,F:{},R:0,g:0,f:0,O:0,a:[0,0,0,0,0,0,0,0],d:[0,0,0,0],s:undefined,t:6,m:false,r:{progress:{},seeded:{}},Q:0,B:[0,48,64,96,128,192,0x100,384,512,768,1024],u:function(){for(var a=0;a<4;a++){this.d[a]=this.d[a]+1|0;if(this.d[a])break}return this.s.encrypt(this.d)},L:function(){this.a=this.u().concat(this.u());this.s=new sjcl.cipher.aes(this.a)},T:function(a){this.a=
|
||||
sjcl.hash.sha256.hash(this.a.concat(a));this.s=new sjcl.cipher.aes(this.a);for(a=0;a<4;a++){this.d[a]=this.d[a]+1|0;if(this.d[a])break}},U:function(a){var b=[],c=0,d;this.O=b[0]=(new Date).valueOf()+3E4;for(d=0;d<16;d++)b.push(Math.random()*0x100000000|0);for(d=0;d<this.b.length;d++){b=b.concat(this.b[d].finalize());c+=this.j[d];this.j[d]=0;if(!a&&this.z&1<<d)break}if(this.z>=1<<this.b.length){this.b.push(new sjcl.hash.sha256);this.j.push(0)}this.f-=c;if(c>this.g)this.g=c;this.z++;this.T(b)},p:function(a){sjcl.random.addEntropy([a.x||
|
||||
a.clientX||a.offsetX,a.y||a.clientY||a.offsetY],2,"mouse")},o:function(){sjcl.random.addEntropy(new Date,2,"loadtime")},K:function(a,b){var c;a=sjcl.random.r[a];var d=[];for(c in a)a.hasOwnProperty(c)&&d.push(a[c]);for(c=0;c<d.length;c++)d[c](b)}};
|
||||
sjcl.json={defaults:{v:1,iter:1E3,ks:128,ts:64,mode:"ccm",adata:"",cipher:"aes"},encrypt:function(a,b,c,d){c=c||{};d=d||{};var e=sjcl.json,f=e.c({iv:sjcl.random.randomWords(4,0)},e.defaults);e.c(f,c);if(typeof f.salt==="string")f.salt=sjcl.codec.base64.toBits(f.salt);if(typeof f.iv==="string")f.iv=sjcl.codec.base64.toBits(f.iv);if(!sjcl.mode[f.mode]||!sjcl.cipher[f.cipher]||typeof a==="string"&&f.iter<=100||f.ts!==64&&f.ts!==96&&f.ts!==128||f.ks!==128&&f.ks!==192&&f.ks!==0x100||f.iv.length<2||f.iv.length>
|
||||
4)throw new sjcl.exception.invalid("json encrypt: invalid parameters");if(typeof a==="string"){c=sjcl.misc.cachedPbkdf2(a,f);a=c.key.slice(0,f.ks/32);f.salt=c.salt}if(typeof b==="string")b=sjcl.codec.utf8String.toBits(b);c=new sjcl.cipher[f.cipher](a);e.c(d,f);d.key=a;f.ct=sjcl.mode[f.mode].encrypt(c,b,f.iv,f.adata,f.tag);return e.encode(e.V(f,e.defaults))},decrypt:function(a,b,c,d){c=c||{};d=d||{};var e=sjcl.json;b=e.c(e.c(e.c({},e.defaults),e.decode(b)),c,true);if(typeof b.salt==="string")b.salt=
|
||||
sjcl.codec.base64.toBits(b.salt);if(typeof b.iv==="string")b.iv=sjcl.codec.base64.toBits(b.iv);if(!sjcl.mode[b.mode]||!sjcl.cipher[b.cipher]||typeof a==="string"&&b.iter<=100||b.ts!==64&&b.ts!==96&&b.ts!==128||b.ks!==128&&b.ks!==192&&b.ks!==0x100||!b.iv||b.iv.length<2||b.iv.length>4)throw new sjcl.exception.invalid("json decrypt: invalid parameters");if(typeof a==="string"){c=sjcl.misc.cachedPbkdf2(a,b);a=c.key.slice(0,b.ks/32);b.salt=c.salt}c=new sjcl.cipher[b.cipher](a);c=sjcl.mode[b.mode].decrypt(c,
|
||||
b.ct,b.iv,b.adata,b.tag);e.c(d,b);d.key=a;return sjcl.codec.utf8String.fromBits(c)},encode:function(a){var b,c="{",d="";for(b in a)if(a.hasOwnProperty(b)){if(!b.match(/^[a-z0-9]+$/i))throw new sjcl.exception.invalid("json encode: invalid property name");c+=d+b+":";d=",";switch(typeof a[b]){case "number":case "boolean":c+=a[b];break;case "string":c+='"'+escape(a[b])+'"';break;case "object":c+='"'+sjcl.codec.base64.fromBits(a[b],1)+'"';break;default:throw new sjcl.exception.bug("json encode: unsupported type");
|
||||
}}return c+"}"},decode:function(a){a=a.replace(/\s/g,"");if(!a.match(/^\{.*\}$/))throw new sjcl.exception.invalid("json decode: this isn't json!");a=a.replace(/^\{|\}$/g,"").split(/,/);var b={},c,d;for(c=0;c<a.length;c++){if(!(d=a[c].match(/^([a-z][a-z0-9]*):(?:(\d+)|"([a-z0-9+\/%*_.@=\-]*)")$/i)))throw new sjcl.exception.invalid("json decode: this isn't json!");b[d[1]]=d[2]?parseInt(d[2],10):d[1].match(/^(ct|salt|iv)$/)?sjcl.codec.base64.toBits(d[3]):unescape(d[3])}return b},c:function(a,b,c){if(a===
|
||||
undefined)a={};if(b===undefined)return a;var d;for(d in b)if(b.hasOwnProperty(d)){if(c&&a[d]!==undefined&&a[d]!==b[d])throw new sjcl.exception.invalid("required parameter overridden");a[d]=b[d]}return a},V:function(a,b){var c={},d;for(d in a)if(a.hasOwnProperty(d)&&a[d]!==b[d])c[d]=a[d];return c},W:function(a,b){var c={},d;for(d=0;d<b.length;d++)if(a[b[d]]!==undefined)c[b[d]]=a[b[d]];return c}};sjcl.encrypt=sjcl.json.encrypt;sjcl.decrypt=sjcl.json.decrypt;sjcl.misc.S={};
|
||||
sjcl.misc.cachedPbkdf2=function(a,b){var c=sjcl.misc.S,d;b=b||{};d=b.iter||1E3;c=c[a]=c[a]||{};d=c[d]=c[d]||{firstSalt:b.salt&&b.salt.length?b.salt.slice(0):sjcl.random.randomWords(2,0)};c=b.salt===undefined?d.firstSalt:b.salt;d[c]=d[c]||sjcl.misc.pbkdf2(a,c,b.iter);return{key:d[c].slice(0),salt:c.slice(0)}};
|
||||
|
||||
|
||||
var browserUtil = {
|
||||
isRhino: true,
|
||||
|
||||
pauseAndThen: function (cb) { cb(); },
|
||||
|
||||
cpsIterate: function (f, start, end, pause, callback) {
|
||||
function go() {
|
||||
var called = false;
|
||||
if (start >= end) {
|
||||
callback && callback();
|
||||
} else {
|
||||
f(start, function () {
|
||||
if (!called) { called = true; start++; go(); }
|
||||
});
|
||||
}
|
||||
}
|
||||
go (start);
|
||||
},
|
||||
|
||||
cpsMap: function (map, list, pause, callback) {
|
||||
browserUtil.cpsIterate(function (i, cb) { map(list[i], i, list.length, cb); },
|
||||
0, list.length, pause, callback);
|
||||
},
|
||||
|
||||
loadScripts: function(scriptNames, callback) {
|
||||
for (i=0; i<scriptNames.length; i++) {
|
||||
load(scriptNames[i]);
|
||||
callback && callback();
|
||||
}
|
||||
},
|
||||
|
||||
write: function(type, message) {
|
||||
print(message);
|
||||
return { update: function (type2, message2) {
|
||||
if (type2 === 'pass') { print(" + " + message2); }
|
||||
else if (type2 === 'unimplemented') { print(" ? " + message2); }
|
||||
else { print(" - " + message2); }
|
||||
}};
|
||||
},
|
||||
|
||||
writeNewline: function () { print(""); },
|
||||
|
||||
status: function(message) {}
|
||||
};
|
||||
|
||||
sjcl.test = { vector: {}, all: {} };
|
||||
|
||||
/* A bit of a hack. Because sjcl.test will be reloaded several times
|
||||
* for different variants of sjcl, but browserUtils will not, this
|
||||
* variable keeps a permanent record of whether anything has failed.
|
||||
*/
|
||||
if (typeof browserUtil.allPassed === 'undefined') {
|
||||
browserUtil.allPassed = true;
|
||||
}
|
||||
|
||||
sjcl.test.TestCase = function(name, doRun) {
|
||||
this.doRun = doRun;
|
||||
this.name = name;
|
||||
this.passes = 0;
|
||||
this.failures = 0;
|
||||
this.isUnimplemented = false;
|
||||
sjcl.test.all[name] = this;
|
||||
};
|
||||
|
||||
sjcl.test.TestCase.prototype = {
|
||||
/** Pass some subtest of this test */
|
||||
pass: function () { this.passes ++; },
|
||||
|
||||
/** Fail some subtest of this test */
|
||||
fail: function (message) {
|
||||
if (message !== undefined) {
|
||||
this.log("fail", "*** FAIL *** " + this.name + ": " + message);
|
||||
} else {
|
||||
this.log("fail", "*** FAIL *** " + this.name);
|
||||
}
|
||||
this.failures ++;
|
||||
browserUtil.allPassed = false;
|
||||
},
|
||||
|
||||
unimplemented: function() {
|
||||
this.isUnimplemented = true;
|
||||
},
|
||||
|
||||
/** Log a message to the console */
|
||||
log: browserUtil.write,
|
||||
|
||||
/** Require that the first argument is true; otherwise fail with the given message */
|
||||
require: function (bool, message) {
|
||||
if (bool) {
|
||||
this.pass();
|
||||
} else if (message !== undefined) {
|
||||
this.fail(message);
|
||||
} else {
|
||||
this.fail("requirement failed");
|
||||
}
|
||||
},
|
||||
|
||||
/** Pause and then take the specified action. */
|
||||
pauseAndThen: browserUtil.pauseAndThen,
|
||||
|
||||
/** Continuation-passing-style iteration */
|
||||
cpsIterate: browserUtil.cpsIterate,
|
||||
|
||||
/** Continuation-passing-style iteration */
|
||||
cpsMap: browserUtil.cpsMap,
|
||||
|
||||
/** Report the results of this test. */
|
||||
report: function (repo) {
|
||||
var t = (new Date()).valueOf() - this.startTime;
|
||||
if (this.failures !== 0) {
|
||||
repo.update("fail", "failed " + this.failures + " / " +
|
||||
(this.passes + this.failures) + " tests. (" + t + " ms)");
|
||||
} else if (this.passes === 1) {
|
||||
repo.update("pass", "passed. (" + t + " ms)");
|
||||
} else if (this.isUnimplemented) {
|
||||
repo.update("unimplemented", "unimplemented");
|
||||
} else {
|
||||
repo.update("pass", "passed all " + this.passes + " tests. (" + t + " ms)");
|
||||
}
|
||||
browserUtil.writeNewline();
|
||||
},
|
||||
|
||||
|
||||
/** Run the test. */
|
||||
run: function (ntests, i, cb) {
|
||||
var thiz = this;
|
||||
this.startTime = (new Date()).valueOf();
|
||||
this.pauseAndThen(function () {
|
||||
thiz.doRun(function () {
|
||||
cb && cb();
|
||||
})
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
// pass a list of tests to run, or pass nothing and it will run them all
|
||||
sjcl.test.run = function (tests, callback) {
|
||||
var t;
|
||||
|
||||
if (tests === undefined || tests.length == 0) {
|
||||
tests = [];
|
||||
for (t in sjcl.test.all) {
|
||||
if (sjcl.test.all.hasOwnProperty(t)) {
|
||||
tests.push(t);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
browserUtil.cpsMap(function (t, i, n, cb) {
|
||||
sjcl.test.all[tests[i]].run(n, i+1, cb);
|
||||
}, tests, true, callback);
|
||||
};
|
||||
|
||||
/* Several test scripts rely on sjcl.codec.hex to parse their test
|
||||
* vectors, but we are not guaranteed that sjcl.codec.hex is
|
||||
* implemented.
|
||||
*/
|
||||
sjcl.codec = sjcl.codec || {};
|
||||
sjcl.codec.hex = sjcl.codec.hex ||
|
||||
{
|
||||
fromBits: function (arr) {
|
||||
var out = "", i, x;
|
||||
for (i=0; i<arr.length; i++) {
|
||||
out += ((arr[i]|0)+0xF00000000000).toString(16).substr(4);
|
||||
}
|
||||
return out.substr(0, sjcl.bitArray.bitLength(arr)/4);//.replace(/(.{8})/g, "$1 ");
|
||||
},
|
||||
toBits: function (str) {
|
||||
var i, out=[], len;
|
||||
str = str.replace(/\s|0x/g, "");
|
||||
len = str.length;
|
||||
str = str + "00000000";
|
||||
for (i=0; i<str.length; i+=8) {
|
||||
out.push(parseInt(str.substr(i,8),16)^0);
|
||||
}
|
||||
return sjcl.bitArray.clamp(out, len*4);
|
||||
}
|
||||
};
|
||||
|
|
@ -0,0 +1,20 @@
|
|||
/* From http://www.cryptosys.net/manapi/api_PBE_Kdf2.html */
|
||||
|
||||
new sjcl.test.TestCase("PBKDF2", function (cb) {
|
||||
if (!sjcl.misc.pbkdf2 || !sjcl.misc.hmac || !sjcl.hash.sha256) {
|
||||
this.unimplemented();
|
||||
cb && cb();
|
||||
return;
|
||||
}
|
||||
|
||||
//XXX use 8 inputs, not 8 iterations
|
||||
for (var index = 0; index < 8; index++) {
|
||||
var h = sjcl.codec.hex, password = "password", salt = "78 57 8E 5A 5D 63 CB 06", count = 2048, output,
|
||||
goodOutput = "97b5a91d35af542324881315c4f849e327c4707d1bc9d322";
|
||||
output = sjcl.misc.pbkdf2(password, h.toBits(salt), count);
|
||||
output = h.fromBits(output);
|
||||
this.require(output.substr(0,goodOutput.length) == goodOutput);
|
||||
cb && cb();
|
||||
}
|
||||
});
|
||||
sjcl.test.run();
|
|
@ -0,0 +1,223 @@
|
|||
"use strict";
|
||||
|
||||
var sjcl={cipher:{},hash:{},mode:{},misc:{},codec:{},exception:{corrupt:function(a){this.toString=function(){return"CORRUPT: "+this.message};this.message=a},invalid:function(a){this.toString=function(){return"INVALID: "+this.message};this.message=a},bug:function(a){this.toString=function(){return"BUG: "+this.message};this.message=a}}};
|
||||
sjcl.cipher.aes=function(a){this.h[0][0][0]||this.w();var b,c,d,e,f=this.h[0][4],g=this.h[1];b=a.length;var h=1;if(b!==4&&b!==6&&b!==8)throw new sjcl.exception.invalid("invalid aes key size");this.a=[d=a.slice(0),e=[]];for(a=b;a<4*b+28;a++){c=d[a-1];if(a%b===0||b===8&&a%b===4){c=f[c>>>24]<<24^f[c>>16&255]<<16^f[c>>8&255]<<8^f[c&255];if(a%b===0){c=c<<8^c>>>24^h<<24;h=h<<1^(h>>7)*283}}d[a]=d[a-b]^c}for(b=0;a;b++,a--){c=d[b&3?a:a-4];e[b]=a<=4||b<4?c:g[0][f[c>>>24]]^g[1][f[c>>16&255]]^g[2][f[c>>8&255]]^
|
||||
g[3][f[c&255]]}};
|
||||
sjcl.cipher.aes.prototype={encrypt:function(a){return this.H(a,0)},decrypt:function(a){return this.H(a,1)},h:[[[],[],[],[],[]],[[],[],[],[],[]]],w:function(){var a=this.h[0],b=this.h[1],c=a[4],d=b[4],e,f,g,h=[],i=[],k,j,l,m;for(e=0;e<0x100;e++)i[(h[e]=e<<1^(e>>7)*283)^e]=e;for(f=g=0;!c[f];f^=k||1,g=i[g]||1){l=g^g<<1^g<<2^g<<3^g<<4;l=l>>8^l&255^99;c[f]=l;d[l]=f;j=h[e=h[k=h[f]]];m=j*0x1010101^e*0x10001^k*0x101^f*0x1010100;j=h[l]*0x101^l*0x1010100;for(e=0;e<4;e++){a[e][f]=j=j<<24^j>>>8;b[e][l]=m=m<<24^m>>>8}}for(e=
|
||||
0;e<5;e++){a[e]=a[e].slice(0);b[e]=b[e].slice(0)}},H:function(a,b){if(a.length!==4)throw new sjcl.exception.invalid("invalid aes block size");var c=this.a[b],d=a[0]^c[0],e=a[b?3:1]^c[1],f=a[2]^c[2];a=a[b?1:3]^c[3];var g,h,i,k=c.length/4-2,j,l=4,m=[0,0,0,0];g=this.h[b];var n=g[0],o=g[1],p=g[2],q=g[3],r=g[4];for(j=0;j<k;j++){g=n[d>>>24]^o[e>>16&255]^p[f>>8&255]^q[a&255]^c[l];h=n[e>>>24]^o[f>>16&255]^p[a>>8&255]^q[d&255]^c[l+1];i=n[f>>>24]^o[a>>16&255]^p[d>>8&255]^q[e&255]^c[l+2];a=n[a>>>24]^o[d>>16&
|
||||
255]^p[e>>8&255]^q[f&255]^c[l+3];l+=4;d=g;e=h;f=i}for(j=0;j<4;j++){m[b?3&-j:j]=r[d>>>24]<<24^r[e>>16&255]<<16^r[f>>8&255]<<8^r[a&255]^c[l++];g=d;d=e;e=f;f=a;a=g}return m}};
|
||||
sjcl.bitArray={bitSlice:function(a,b,c){a=sjcl.bitArray.P(a.slice(b/32),32-(b&31)).slice(1);return c===undefined?a:sjcl.bitArray.clamp(a,c-b)},concat:function(a,b){if(a.length===0||b.length===0)return a.concat(b);var c=a[a.length-1],d=sjcl.bitArray.getPartial(c);return d===32?a.concat(b):sjcl.bitArray.P(b,d,c|0,a.slice(0,a.length-1))},bitLength:function(a){var b=a.length;if(b===0)return 0;return(b-1)*32+sjcl.bitArray.getPartial(a[b-1])},clamp:function(a,b){if(a.length*32<b)return a;a=a.slice(0,Math.ceil(b/
|
||||
32));var c=a.length;b&=31;if(c>0&&b)a[c-1]=sjcl.bitArray.partial(b,a[c-1]&2147483648>>b-1,1);return a},partial:function(a,b,c){if(a===32)return b;return(c?b|0:b<<32-a)+a*0x10000000000},getPartial:function(a){return Math.round(a/0x10000000000)||32},equal:function(a,b){if(sjcl.bitArray.bitLength(a)!==sjcl.bitArray.bitLength(b))return false;var c=0,d;for(d=0;d<a.length;d++)c|=a[d]^b[d];return c===0},P:function(a,b,c,d){var e;e=0;if(d===undefined)d=[];for(;b>=32;b-=32){d.push(c);c=0}if(b===0)return d.concat(a);
|
||||
for(e=0;e<a.length;e++){d.push(c|a[e]>>>b);c=a[e]<<32-b}e=a.length?a[a.length-1]:0;a=sjcl.bitArray.getPartial(e);d.push(sjcl.bitArray.partial(b+a&31,b+a>32?c:d.pop(),1));return d},k:function(a,b){return[a[0]^b[0],a[1]^b[1],a[2]^b[2],a[3]^b[3]]}};
|
||||
sjcl.codec.utf8String={fromBits:function(a){var b="",c=sjcl.bitArray.bitLength(a),d,e;for(d=0;d<c/8;d++){if((d&3)===0)e=a[d/4];b+=String.fromCharCode(e>>>24);e<<=8}return decodeURIComponent(escape(b))},toBits:function(a){a=unescape(encodeURIComponent(a));var b=[],c,d=0;for(c=0;c<a.length;c++){d=d<<8|a.charCodeAt(c);if((c&3)===3){b.push(d);d=0}}c&3&&b.push(sjcl.bitArray.partial(8*(c&3),d));return b}};
|
||||
sjcl.codec.hex={fromBits:function(a){var b="",c;for(c=0;c<a.length;c++)b+=((a[c]|0)+0xf00000000000).toString(16).substr(4);return b.substr(0,sjcl.bitArray.bitLength(a)/4)},toBits:function(a){var b,c=[],d;a=a.replace(/\s|0x/g,"");d=a.length;a+="00000000";for(b=0;b<a.length;b+=8)c.push(parseInt(a.substr(b,8),16)^0);return sjcl.bitArray.clamp(c,d*4)}};
|
||||
sjcl.codec.base64={D:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",fromBits:function(a,b){var c="",d,e=0,f=sjcl.codec.base64.D,g=0,h=sjcl.bitArray.bitLength(a);for(d=0;c.length*6<h;){c+=f.charAt((g^a[d]>>>e)>>>26);if(e<6){g=a[d]<<6-e;e+=26;d++}else{g<<=6;e-=6}}for(;c.length&3&&!b;)c+="=";return c},toBits:function(a){a=a.replace(/\s|=/g,"");var b=[],c,d=0,e=sjcl.codec.base64.D,f=0,g;for(c=0;c<a.length;c++){g=e.indexOf(a.charAt(c));if(g<0)throw new sjcl.exception.invalid("this isn't base64!");
|
||||
if(d>26){d-=26;b.push(f^g>>>d);f=g<<32-d}else{d+=6;f^=g<<32-d}}d&56&&b.push(sjcl.bitArray.partial(d&56,f,1));return b}};sjcl.hash.sha256=function(a){this.a[0]||this.w();if(a){this.n=a.n.slice(0);this.i=a.i.slice(0);this.e=a.e}else this.reset()};sjcl.hash.sha256.hash=function(a){return(new sjcl.hash.sha256).update(a).finalize()};
|
||||
sjcl.hash.sha256.prototype={blockSize:512,reset:function(){this.n=this.N.slice(0);this.i=[];this.e=0;return this},update:function(a){if(typeof a==="string")a=sjcl.codec.utf8String.toBits(a);var b,c=this.i=sjcl.bitArray.concat(this.i,a);b=this.e;a=this.e=b+sjcl.bitArray.bitLength(a);for(b=512+b&-512;b<=a;b+=512)this.C(c.splice(0,16));return this},finalize:function(){var a,b=this.i,c=this.n;b=sjcl.bitArray.concat(b,[sjcl.bitArray.partial(1,1)]);for(a=b.length+2;a&15;a++)b.push(0);b.push(Math.floor(this.e/
|
||||
4294967296));for(b.push(this.e|0);b.length;)this.C(b.splice(0,16));this.reset();return c},N:[],a:[],w:function(){function a(e){return(e-Math.floor(e))*0x100000000|0}var b=0,c=2,d;a:for(;b<64;c++){for(d=2;d*d<=c;d++)if(c%d===0)continue a;if(b<8)this.N[b]=a(Math.pow(c,0.5));this.a[b]=a(Math.pow(c,1/3));b++}},C:function(a){var b,c,d=a.slice(0),e=this.n,f=this.a,g=e[0],h=e[1],i=e[2],k=e[3],j=e[4],l=e[5],m=e[6],n=e[7];for(a=0;a<64;a++){if(a<16)b=d[a];else{b=d[a+1&15];c=d[a+14&15];b=d[a&15]=(b>>>7^b>>>18^
|
||||
b>>>3^b<<25^b<<14)+(c>>>17^c>>>19^c>>>10^c<<15^c<<13)+d[a&15]+d[a+9&15]|0}b=b+n+(j>>>6^j>>>11^j>>>25^j<<26^j<<21^j<<7)+(m^j&(l^m))+f[a];n=m;m=l;l=j;j=k+b|0;k=i;i=h;h=g;g=b+(h&i^k&(h^i))+(h>>>2^h>>>13^h>>>22^h<<30^h<<19^h<<10)|0}e[0]=e[0]+g|0;e[1]=e[1]+h|0;e[2]=e[2]+i|0;e[3]=e[3]+k|0;e[4]=e[4]+j|0;e[5]=e[5]+l|0;e[6]=e[6]+m|0;e[7]=e[7]+n|0}};
|
||||
sjcl.mode.ccm={name:"ccm",encrypt:function(a,b,c,d,e){var f,g=b.slice(0),h=sjcl.bitArray,i=h.bitLength(c)/8,k=h.bitLength(g)/8;e=e||64;d=d||[];if(i<7)throw new sjcl.exception.invalid("ccm: iv must be at least 7 bytes");for(f=2;f<4&&k>>>8*f;f++);if(f<15-i)f=15-i;c=h.clamp(c,8*(15-f));b=sjcl.mode.ccm.G(a,b,c,d,e,f);g=sjcl.mode.ccm.I(a,g,c,b,e,f);return h.concat(g.data,g.tag)},decrypt:function(a,b,c,d,e){e=e||64;d=d||[];var f=sjcl.bitArray,g=f.bitLength(c)/8,h=f.bitLength(b),i=f.clamp(b,h-e),k=f.bitSlice(b,
|
||||
h-e);h=(h-e)/8;if(g<7)throw new sjcl.exception.invalid("ccm: iv must be at least 7 bytes");for(b=2;b<4&&h>>>8*b;b++);if(b<15-g)b=15-g;c=f.clamp(c,8*(15-b));i=sjcl.mode.ccm.I(a,i,c,k,e,b);a=sjcl.mode.ccm.G(a,i.data,c,d,e,b);if(!f.equal(i.tag,a))throw new sjcl.exception.corrupt("ccm: tag doesn't match");return i.data},G:function(a,b,c,d,e,f){var g=[],h=sjcl.bitArray,i=h.k;e/=8;if(e%2||e<4||e>16)throw new sjcl.exception.invalid("ccm: invalid tag length");if(d.length>0xffffffff||b.length>0xffffffff)throw new sjcl.exception.bug("ccm: can't deal with 4GiB or more data");
|
||||
f=[h.partial(8,(d.length?64:0)|e-2<<2|f-1)];f=h.concat(f,c);f[3]|=h.bitLength(b)/8;f=a.encrypt(f);if(d.length){c=h.bitLength(d)/8;if(c<=65279)g=[h.partial(16,c)];else if(c<=0xffffffff)g=h.concat([h.partial(16,65534)],[c]);g=h.concat(g,d);for(d=0;d<g.length;d+=4)f=a.encrypt(i(f,g.slice(d,d+4)))}for(d=0;d<b.length;d+=4)f=a.encrypt(i(f,b.slice(d,d+4)));return h.clamp(f,e*8)},I:function(a,b,c,d,e,f){var g,h=sjcl.bitArray;g=h.k;var i=b.length,k=h.bitLength(b);c=h.concat([h.partial(8,f-1)],c).concat([0,
|
||||
0,0]).slice(0,4);d=h.bitSlice(g(d,a.encrypt(c)),0,e);if(!i)return{tag:d,data:[]};for(g=0;g<i;g+=4){c[3]++;e=a.encrypt(c);b[g]^=e[0];b[g+1]^=e[1];b[g+2]^=e[2];b[g+3]^=e[3]}return{tag:d,data:h.clamp(b,k)}}};
|
||||
sjcl.mode.ocb2={name:"ocb2",encrypt:function(a,b,c,d,e,f){if(sjcl.bitArray.bitLength(c)!==128)throw new sjcl.exception.invalid("ocb iv must be 128 bits");var g,h=sjcl.mode.ocb2.A,i=sjcl.bitArray,k=i.k,j=[0,0,0,0];c=h(a.encrypt(c));var l,m=[];d=d||[];e=e||64;for(g=0;g+4<b.length;g+=4){l=b.slice(g,g+4);j=k(j,l);m=m.concat(k(c,a.encrypt(k(c,l))));c=h(c)}l=b.slice(g);b=i.bitLength(l);g=a.encrypt(k(c,[0,0,0,b]));l=i.clamp(k(l,g),b);j=k(j,k(l,g));j=a.encrypt(k(j,k(c,h(c))));if(d.length)j=k(j,f?d:sjcl.mode.ocb2.pmac(a,
|
||||
d));return m.concat(i.concat(l,i.clamp(j,e)))},decrypt:function(a,b,c,d,e,f){if(sjcl.bitArray.bitLength(c)!==128)throw new sjcl.exception.invalid("ocb iv must be 128 bits");e=e||64;var g=sjcl.mode.ocb2.A,h=sjcl.bitArray,i=h.k,k=[0,0,0,0],j=g(a.encrypt(c)),l,m,n=sjcl.bitArray.bitLength(b)-e,o=[];d=d||[];for(c=0;c+4<n/32;c+=4){l=i(j,a.decrypt(i(j,b.slice(c,c+4))));k=i(k,l);o=o.concat(l);j=g(j)}m=n-c*32;l=a.encrypt(i(j,[0,0,0,m]));l=i(l,h.clamp(b.slice(c),m));k=i(k,l);k=a.encrypt(i(k,i(j,g(j))));if(d.length)k=
|
||||
i(k,f?d:sjcl.mode.ocb2.pmac(a,d));if(!h.equal(h.clamp(k,e),h.bitSlice(b,n)))throw new sjcl.exception.corrupt("ocb: tag doesn't match");return o.concat(h.clamp(l,m))},pmac:function(a,b){var c,d=sjcl.mode.ocb2.A,e=sjcl.bitArray,f=e.k,g=[0,0,0,0],h=a.encrypt([0,0,0,0]);h=f(h,d(d(h)));for(c=0;c+4<b.length;c+=4){h=d(h);g=f(g,a.encrypt(f(h,b.slice(c,c+4))))}b=b.slice(c);if(e.bitLength(b)<128){h=f(h,d(h));b=e.concat(b,[2147483648|0])}g=f(g,b);return a.encrypt(f(d(f(h,d(h))),g))},A:function(a){return[a[0]<<
|
||||
1^a[1]>>>31,a[1]<<1^a[2]>>>31,a[2]<<1^a[3]>>>31,a[3]<<1^(a[0]>>>31)*135]}};sjcl.misc.hmac=function(a,b){this.M=b=b||sjcl.hash.sha256;var c=[[],[]],d=b.prototype.blockSize/32;this.l=[new b,new b];if(a.length>d)a=b.hash(a);for(b=0;b<d;b++){c[0][b]=a[b]^909522486;c[1][b]=a[b]^1549556828}this.l[0].update(c[0]);this.l[1].update(c[1])};sjcl.misc.hmac.prototype.encrypt=sjcl.misc.hmac.prototype.mac=function(a,b){a=(new this.M(this.l[0])).update(a,b).finalize();return(new this.M(this.l[1])).update(a).finalize()};
|
||||
sjcl.misc.pbkdf2=function(a,b,c,d,e){c=c||1E3;if(d<0||c<0)throw sjcl.exception.invalid("invalid params to pbkdf2");if(typeof a==="string")a=sjcl.codec.utf8String.toBits(a);e=e||sjcl.misc.hmac;a=new e(a);var f,g,h,i,k=[],j=sjcl.bitArray;for(i=1;32*k.length<(d||1);i++){e=f=a.encrypt(j.concat(b,[i]));for(g=1;g<c;g++){f=a.encrypt(f);for(h=0;h<f.length;h++)e[h]^=f[h]}k=k.concat(e)}if(d)k=j.clamp(k,d);return k};
|
||||
sjcl.random={randomWords:function(a,b){var c=[];b=this.isReady(b);var d;if(b===0)throw new sjcl.exception.notready("generator isn't seeded");else b&2&&this.U(!(b&1));for(b=0;b<a;b+=4){(b+1)%0x10000===0&&this.L();d=this.u();c.push(d[0],d[1],d[2],d[3])}this.L();return c.slice(0,a)},setDefaultParanoia:function(a){this.t=a},addEntropy:function(a,b,c){c=c||"user";var d,e,f=(new Date).valueOf(),g=this.q[c],h=this.isReady();d=this.F[c];if(d===undefined)d=this.F[c]=this.R++;if(g===undefined)g=this.q[c]=0;this.q[c]=
|
||||
(this.q[c]+1)%this.b.length;switch(typeof a){case "number":break;case "object":if(b===undefined)for(c=b=0;c<a.length;c++)for(e=a[c];e>0;){b++;e>>>=1}this.b[g].update([d,this.J++,2,b,f,a.length].concat(a));break;case "string":if(b===undefined)b=a.length;this.b[g].update([d,this.J++,3,b,f,a.length]);this.b[g].update(a);break;default:throw new sjcl.exception.bug("random: addEntropy only supports number, array or string");}this.j[g]+=b;this.f+=b;if(h===0){this.isReady()!==0&&this.K("seeded",Math.max(this.g,
|
||||
this.f));this.K("progress",this.getProgress())}},isReady:function(a){a=this.B[a!==undefined?a:this.t];return this.g&&this.g>=a?this.j[0]>80&&(new Date).valueOf()>this.O?3:1:this.f>=a?2:0},getProgress:function(a){a=this.B[a?a:this.t];return this.g>=a?1["0"]:this.f>a?1["0"]:this.f/a},startCollectors:function(){if(!this.m){if(window.addEventListener){window.addEventListener("load",this.o,false);window.addEventListener("mousemove",this.p,false)}else if(document.attachEvent){document.attachEvent("onload",
|
||||
this.o);document.attachEvent("onmousemove",this.p)}else throw new sjcl.exception.bug("can't attach event");this.m=true}},stopCollectors:function(){if(this.m){if(window.removeEventListener){window.removeEventListener("load",this.o);window.removeEventListener("mousemove",this.p)}else if(window.detachEvent){window.detachEvent("onload",this.o);window.detachEvent("onmousemove",this.p)}this.m=false}},addEventListener:function(a,b){this.r[a][this.Q++]=b},removeEventListener:function(a,b){var c;a=this.r[a];
|
||||
var d=[];for(c in a)a.hasOwnProperty[c]&&a[c]===b&&d.push(c);for(b=0;b<d.length;b++){c=d[b];delete a[c]}},b:[new sjcl.hash.sha256],j:[0],z:0,q:{},J:0,F:{},R:0,g:0,f:0,O:0,a:[0,0,0,0,0,0,0,0],d:[0,0,0,0],s:undefined,t:6,m:false,r:{progress:{},seeded:{}},Q:0,B:[0,48,64,96,128,192,0x100,384,512,768,1024],u:function(){for(var a=0;a<4;a++){this.d[a]=this.d[a]+1|0;if(this.d[a])break}return this.s.encrypt(this.d)},L:function(){this.a=this.u().concat(this.u());this.s=new sjcl.cipher.aes(this.a)},T:function(a){this.a=
|
||||
sjcl.hash.sha256.hash(this.a.concat(a));this.s=new sjcl.cipher.aes(this.a);for(a=0;a<4;a++){this.d[a]=this.d[a]+1|0;if(this.d[a])break}},U:function(a){var b=[],c=0,d;this.O=b[0]=(new Date).valueOf()+3E4;for(d=0;d<16;d++)b.push(Math.random()*0x100000000|0);for(d=0;d<this.b.length;d++){b=b.concat(this.b[d].finalize());c+=this.j[d];this.j[d]=0;if(!a&&this.z&1<<d)break}if(this.z>=1<<this.b.length){this.b.push(new sjcl.hash.sha256);this.j.push(0)}this.f-=c;if(c>this.g)this.g=c;this.z++;this.T(b)},p:function(a){sjcl.random.addEntropy([a.x||
|
||||
a.clientX||a.offsetX,a.y||a.clientY||a.offsetY],2,"mouse")},o:function(){sjcl.random.addEntropy(new Date,2,"loadtime")},K:function(a,b){var c;a=sjcl.random.r[a];var d=[];for(c in a)a.hasOwnProperty(c)&&d.push(a[c]);for(c=0;c<d.length;c++)d[c](b)}};
|
||||
sjcl.json={defaults:{v:1,iter:1E3,ks:128,ts:64,mode:"ccm",adata:"",cipher:"aes"},encrypt:function(a,b,c,d){c=c||{};d=d||{};var e=sjcl.json,f=e.c({iv:sjcl.random.randomWords(4,0)},e.defaults);e.c(f,c);if(typeof f.salt==="string")f.salt=sjcl.codec.base64.toBits(f.salt);if(typeof f.iv==="string")f.iv=sjcl.codec.base64.toBits(f.iv);if(!sjcl.mode[f.mode]||!sjcl.cipher[f.cipher]||typeof a==="string"&&f.iter<=100||f.ts!==64&&f.ts!==96&&f.ts!==128||f.ks!==128&&f.ks!==192&&f.ks!==0x100||f.iv.length<2||f.iv.length>
|
||||
4)throw new sjcl.exception.invalid("json encrypt: invalid parameters");if(typeof a==="string"){c=sjcl.misc.cachedPbkdf2(a,f);a=c.key.slice(0,f.ks/32);f.salt=c.salt}if(typeof b==="string")b=sjcl.codec.utf8String.toBits(b);c=new sjcl.cipher[f.cipher](a);e.c(d,f);d.key=a;f.ct=sjcl.mode[f.mode].encrypt(c,b,f.iv,f.adata,f.tag);return e.encode(e.V(f,e.defaults))},decrypt:function(a,b,c,d){c=c||{};d=d||{};var e=sjcl.json;b=e.c(e.c(e.c({},e.defaults),e.decode(b)),c,true);if(typeof b.salt==="string")b.salt=
|
||||
sjcl.codec.base64.toBits(b.salt);if(typeof b.iv==="string")b.iv=sjcl.codec.base64.toBits(b.iv);if(!sjcl.mode[b.mode]||!sjcl.cipher[b.cipher]||typeof a==="string"&&b.iter<=100||b.ts!==64&&b.ts!==96&&b.ts!==128||b.ks!==128&&b.ks!==192&&b.ks!==0x100||!b.iv||b.iv.length<2||b.iv.length>4)throw new sjcl.exception.invalid("json decrypt: invalid parameters");if(typeof a==="string"){c=sjcl.misc.cachedPbkdf2(a,b);a=c.key.slice(0,b.ks/32);b.salt=c.salt}c=new sjcl.cipher[b.cipher](a);c=sjcl.mode[b.mode].decrypt(c,
|
||||
b.ct,b.iv,b.adata,b.tag);e.c(d,b);d.key=a;return sjcl.codec.utf8String.fromBits(c)},encode:function(a){var b,c="{",d="";for(b in a)if(a.hasOwnProperty(b)){if(!b.match(/^[a-z0-9]+$/i))throw new sjcl.exception.invalid("json encode: invalid property name");c+=d+b+":";d=",";switch(typeof a[b]){case "number":case "boolean":c+=a[b];break;case "string":c+='"'+escape(a[b])+'"';break;case "object":c+='"'+sjcl.codec.base64.fromBits(a[b],1)+'"';break;default:throw new sjcl.exception.bug("json encode: unsupported type");
|
||||
}}return c+"}"},decode:function(a){a=a.replace(/\s/g,"");if(!a.match(/^\{.*\}$/))throw new sjcl.exception.invalid("json decode: this isn't json!");a=a.replace(/^\{|\}$/g,"").split(/,/);var b={},c,d;for(c=0;c<a.length;c++){if(!(d=a[c].match(/^([a-z][a-z0-9]*):(?:(\d+)|"([a-z0-9+\/%*_.@=\-]*)")$/i)))throw new sjcl.exception.invalid("json decode: this isn't json!");b[d[1]]=d[2]?parseInt(d[2],10):d[1].match(/^(ct|salt|iv)$/)?sjcl.codec.base64.toBits(d[3]):unescape(d[3])}return b},c:function(a,b,c){if(a===
|
||||
undefined)a={};if(b===undefined)return a;var d;for(d in b)if(b.hasOwnProperty(d)){if(c&&a[d]!==undefined&&a[d]!==b[d])throw new sjcl.exception.invalid("required parameter overridden");a[d]=b[d]}return a},V:function(a,b){var c={},d;for(d in a)if(a.hasOwnProperty(d)&&a[d]!==b[d])c[d]=a[d];return c},W:function(a,b){var c={},d;for(d=0;d<b.length;d++)if(a[b[d]]!==undefined)c[b[d]]=a[b[d]];return c}};sjcl.encrypt=sjcl.json.encrypt;sjcl.decrypt=sjcl.json.decrypt;sjcl.misc.S={};
|
||||
sjcl.misc.cachedPbkdf2=function(a,b){var c=sjcl.misc.S,d;b=b||{};d=b.iter||1E3;c=c[a]=c[a]||{};d=c[d]=c[d]||{firstSalt:b.salt&&b.salt.length?b.salt.slice(0):sjcl.random.randomWords(2,0)};c=b.salt===undefined?d.firstSalt:b.salt;d[c]=d[c]||sjcl.misc.pbkdf2(a,c,b.iter);return{key:d[c].slice(0),salt:c.slice(0)}};
|
||||
|
||||
|
||||
var browserUtil = {
|
||||
isRhino: true,
|
||||
|
||||
pauseAndThen: function (cb) { cb(); },
|
||||
|
||||
cpsIterate: function (f, start, end, pause, callback) {
|
||||
function go() {
|
||||
var called = false;
|
||||
if (start >= end) {
|
||||
callback && callback();
|
||||
} else {
|
||||
f(start, function () {
|
||||
if (!called) { called = true; start++; go(); }
|
||||
});
|
||||
}
|
||||
}
|
||||
go (start);
|
||||
},
|
||||
|
||||
cpsMap: function (map, list, pause, callback) {
|
||||
browserUtil.cpsIterate(function (i, cb) { map(list[i], i, list.length, cb); },
|
||||
0, list.length, pause, callback);
|
||||
},
|
||||
|
||||
loadScripts: function(scriptNames, callback) {
|
||||
for (i=0; i<scriptNames.length; i++) {
|
||||
load(scriptNames[i]);
|
||||
callback && callback();
|
||||
}
|
||||
},
|
||||
|
||||
write: function(type, message) {
|
||||
print(message);
|
||||
return { update: function (type2, message2) {
|
||||
if (type2 === 'pass') { print(" + " + message2); }
|
||||
else if (type2 === 'unimplemented') { print(" ? " + message2); }
|
||||
else { print(" - " + message2); }
|
||||
}};
|
||||
},
|
||||
|
||||
writeNewline: function () { print(""); },
|
||||
|
||||
status: function(message) {}
|
||||
};
|
||||
|
||||
sjcl.test = { vector: {}, all: {} };
|
||||
|
||||
/* A bit of a hack. Because sjcl.test will be reloaded several times
|
||||
* for different variants of sjcl, but browserUtils will not, this
|
||||
* variable keeps a permanent record of whether anything has failed.
|
||||
*/
|
||||
if (typeof browserUtil.allPassed === 'undefined') {
|
||||
browserUtil.allPassed = true;
|
||||
}
|
||||
|
||||
sjcl.test.TestCase = function(name, doRun) {
|
||||
this.doRun = doRun;
|
||||
this.name = name;
|
||||
this.passes = 0;
|
||||
this.failures = 0;
|
||||
this.isUnimplemented = false;
|
||||
sjcl.test.all[name] = this;
|
||||
};
|
||||
|
||||
sjcl.test.TestCase.prototype = {
|
||||
/** Pass some subtest of this test */
|
||||
pass: function () { this.passes ++; },
|
||||
|
||||
/** Fail some subtest of this test */
|
||||
fail: function (message) {
|
||||
if (message !== undefined) {
|
||||
this.log("fail", "*** FAIL *** " + this.name + ": " + message);
|
||||
} else {
|
||||
this.log("fail", "*** FAIL *** " + this.name);
|
||||
}
|
||||
this.failures ++;
|
||||
browserUtil.allPassed = false;
|
||||
},
|
||||
|
||||
unimplemented: function() {
|
||||
this.isUnimplemented = true;
|
||||
},
|
||||
|
||||
/** Log a message to the console */
|
||||
log: browserUtil.write,
|
||||
|
||||
/** Require that the first argument is true; otherwise fail with the given message */
|
||||
require: function (bool, message) {
|
||||
if (bool) {
|
||||
this.pass();
|
||||
} else if (message !== undefined) {
|
||||
this.fail(message);
|
||||
} else {
|
||||
this.fail("requirement failed");
|
||||
}
|
||||
},
|
||||
|
||||
/** Pause and then take the specified action. */
|
||||
pauseAndThen: browserUtil.pauseAndThen,
|
||||
|
||||
/** Continuation-passing-style iteration */
|
||||
cpsIterate: browserUtil.cpsIterate,
|
||||
|
||||
/** Continuation-passing-style iteration */
|
||||
cpsMap: browserUtil.cpsMap,
|
||||
|
||||
/** Report the results of this test. */
|
||||
report: function (repo) {
|
||||
var t = (new Date()).valueOf() - this.startTime;
|
||||
if (this.failures !== 0) {
|
||||
repo.update("fail", "failed " + this.failures + " / " +
|
||||
(this.passes + this.failures) + " tests. (" + t + " ms)");
|
||||
} else if (this.passes === 1) {
|
||||
repo.update("pass", "passed. (" + t + " ms)");
|
||||
} else if (this.isUnimplemented) {
|
||||
repo.update("unimplemented", "unimplemented");
|
||||
} else {
|
||||
repo.update("pass", "passed all " + this.passes + " tests. (" + t + " ms)");
|
||||
}
|
||||
browserUtil.writeNewline();
|
||||
},
|
||||
|
||||
|
||||
/** Run the test. */
|
||||
run: function (ntests, i, cb) {
|
||||
var thiz = this;
|
||||
this.startTime = (new Date()).valueOf();
|
||||
this.pauseAndThen(function () {
|
||||
thiz.doRun(function () {
|
||||
cb && cb();
|
||||
})
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
// pass a list of tests to run, or pass nothing and it will run them all
|
||||
sjcl.test.run = function (tests, callback) {
|
||||
var t;
|
||||
|
||||
if (tests === undefined || tests.length == 0) {
|
||||
tests = [];
|
||||
for (t in sjcl.test.all) {
|
||||
if (sjcl.test.all.hasOwnProperty(t)) {
|
||||
tests.push(t);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
browserUtil.cpsMap(function (t, i, n, cb) {
|
||||
sjcl.test.all[tests[i]].run(n, i+1, cb);
|
||||
}, tests, true, callback);
|
||||
};
|
||||
|
||||
/* Several test scripts rely on sjcl.codec.hex to parse their test
|
||||
* vectors, but we are not guaranteed that sjcl.codec.hex is
|
||||
* implemented.
|
||||
*/
|
||||
sjcl.codec = sjcl.codec || {};
|
||||
sjcl.codec.hex = sjcl.codec.hex ||
|
||||
{
|
||||
fromBits: function (arr) {
|
||||
var out = "", i, x;
|
||||
for (i=0; i<arr.length; i++) {
|
||||
out += ((arr[i]|0)+0xF00000000000).toString(16).substr(4);
|
||||
}
|
||||
return out.substr(0, sjcl.bitArray.bitLength(arr)/4);//.replace(/(.{8})/g, "$1 ");
|
||||
},
|
||||
toBits: function (str) {
|
||||
var i, out=[], len;
|
||||
str = str.replace(/\s|0x/g, "");
|
||||
len = str.length;
|
||||
str = str + "00000000";
|
||||
for (i=0; i<str.length; i+=8) {
|
||||
out.push(parseInt(str.substr(i,8),16)^0);
|
||||
}
|
||||
return sjcl.bitArray.clamp(out, len*4);
|
||||
}
|
||||
};
|
||||
|
||||
sjcl.test.run();
|
|
@ -0,0 +1,36 @@
|
|||
/**
|
||||
* Test SHA-256 using an ad-hoc iterative technique.
|
||||
* This uses a string buffer which has n characters on the nth iteration.
|
||||
* Each iteration, the buffer is hashed and the hash is converted to a string.
|
||||
* The first two characters of the string are prepended to the buffer, then the
|
||||
* last character of the buffer is removed. This way, neither the beginning nor
|
||||
* the end of the buffer is fixed.
|
||||
*
|
||||
* The hashes from each output step are also hashed together into one final hash.
|
||||
* This is compared against a final hash which was computed with SSL.
|
||||
*/
|
||||
|
||||
new sjcl.test.TestCase("SHA-256 iterative", function (cb) {
|
||||
if (!sjcl.hash.sha256) {
|
||||
this.unimplemented();
|
||||
cb && cb();
|
||||
return;
|
||||
}
|
||||
|
||||
var toBeHashed = "", cumulative = new sjcl.hash.sha256(), hash, thiz=this;
|
||||
browserUtil.cpsIterate(function (i, cbb) {
|
||||
for (var n=100*i; n<100*(i+1); n++) {
|
||||
hash = sjcl.hash.sha256.hash(toBeHashed);
|
||||
hash = sjcl.codec.hex.fromBits(hash);
|
||||
cumulative.update(hash);
|
||||
toBeHashed = (hash.substring(0,2)+toBeHashed).substring(0,n+1);
|
||||
}
|
||||
cbb && cbb();
|
||||
}, 0, 10, true, function () {
|
||||
hash = sjcl.codec.hex.fromBits(cumulative.finalize());
|
||||
thiz.require(hash === "f305c76d5d457ddf04f1927166f5e13429407049a5c5f29021916321fcdcd8b4");
|
||||
cb && cb();
|
||||
});
|
||||
});
|
||||
|
||||
sjcl.test.run();
|
|
@ -0,0 +1,14 @@
|
|||
ai-astar
|
||||
audio-beat-detection
|
||||
audio-dft
|
||||
audio-fft
|
||||
audio-oscillator
|
||||
imaging-gaussian-blur
|
||||
imaging-darkroom
|
||||
imaging-desaturate
|
||||
json-parse-financial
|
||||
json-stringify-tinderbox
|
||||
stanford-crypto-aes
|
||||
stanford-crypto-ccm
|
||||
stanford-crypto-pbkdf2
|
||||
stanford-crypto-sha256-iterative
|
Разница между файлами не показана из-за своего большого размера
Загрузить разницу
|
@ -0,0 +1,150 @@
|
|||
Array.prototype.each = function(f) {
|
||||
if(!f.apply) return;
|
||||
for(var i=0;i<this.length;i++) {
|
||||
f.apply(this[i], [i, this]);
|
||||
}
|
||||
}
|
||||
Array.prototype.findGraphNode = function(obj) {
|
||||
for(var i=0;i<this.length;i++) {
|
||||
if(this[i].pos == obj.pos) { return this[i]; }
|
||||
}
|
||||
return false;
|
||||
};
|
||||
Array.prototype.removeGraphNode = function(obj) {
|
||||
for(var i=0;i<this.length;i++) {
|
||||
if(this[i].pos == obj.pos) { this.splice(i,1); }
|
||||
}
|
||||
return false;
|
||||
};
|
||||
|
||||
function createGraphSet(gridSize, wallFrequency) {
|
||||
var graphSet = [];
|
||||
for(var x=0;x<gridSize;x++) {
|
||||
var row = [];
|
||||
for(var y=0;y<gridSize;y++) {
|
||||
// maybe set this node to be wall
|
||||
var rand = Math.floor(Math.random()*(1/wallFrequency));
|
||||
row.push(new GraphNode(x,y,(rand == 0)));
|
||||
}
|
||||
graphSet.push(row);
|
||||
}
|
||||
return graphSet;
|
||||
}
|
||||
|
||||
// astar.js
|
||||
// Implements the astar search algorithm in javascript
|
||||
|
||||
var astar = {
|
||||
init: function(grid) {
|
||||
for(var x = 0; x < grid.length; x++) {
|
||||
for(var y = 0; y < grid[x].length; y++) {
|
||||
grid[x][y].f = 0;
|
||||
grid[x][y].g = 0;
|
||||
grid[x][y].h = 0;
|
||||
grid[x][y].parent = null;
|
||||
}
|
||||
}
|
||||
},
|
||||
search: function(grid, start, end) {
|
||||
astar.init(grid);
|
||||
|
||||
var openList = [];
|
||||
var closedList = [];
|
||||
openList.push(start);
|
||||
|
||||
while(openList.length > 0) {
|
||||
|
||||
// Grab the lowest f(x) to process next
|
||||
var lowInd = 0;
|
||||
for(var i=0; i<openList.length; i++) {
|
||||
if(openList[i].f < openList[lowInd].f) { lowInd = i; }
|
||||
}
|
||||
var currentNode = openList[lowInd];
|
||||
|
||||
// End case -- result has been found, return the traced path
|
||||
if(currentNode.pos == end.pos) {
|
||||
var curr = currentNode;
|
||||
var ret = [];
|
||||
while(curr.parent) {
|
||||
ret.push(curr);
|
||||
curr = curr.parent;
|
||||
}
|
||||
return ret.reverse();
|
||||
}
|
||||
|
||||
// Normal case -- move currentNode from open to closed, process each of its neighbors
|
||||
openList.removeGraphNode(currentNode);
|
||||
closedList.push(currentNode);
|
||||
var neighbors = astar.neighbors(grid, currentNode);
|
||||
|
||||
for(var j=0; j<neighbors.length;j++) {
|
||||
var neighbor = neighbors[j];
|
||||
if(closedList.findGraphNode(neighbor) || neighbor.isWall()) {
|
||||
// not a valid node to process, skip to next neighbor
|
||||
continue;
|
||||
}
|
||||
|
||||
// g score is the shortest distance from start to current node, we need to check if
|
||||
// the path we have arrived at this neighbor is the shortest one we have seen yet
|
||||
var gScore = currentNode.g + 1; // 1 is the distance from a node to it's neighbor
|
||||
var gScoreIsBest = false;
|
||||
|
||||
|
||||
if(!openList.findGraphNode(neighbor)) {
|
||||
// This the the first time we have arrived at this node, it must be the best
|
||||
// Also, we need to take the h (heuristic) score since we haven't done so yet
|
||||
|
||||
gScoreIsBest = true;
|
||||
neighbor.h = astar.heuristic(neighbor.pos, end.pos);
|
||||
openList.push(neighbor);
|
||||
}
|
||||
else if(gScore < neighbor.g) {
|
||||
// We have already seen the node, but last time it had a worse g (distance from start)
|
||||
gScoreIsBest = true;
|
||||
}
|
||||
|
||||
if(gScoreIsBest) {
|
||||
// Found an optimal (so far) path to this node. Store info on how we got here and
|
||||
// just how good it really is...
|
||||
neighbor.parent = currentNode;
|
||||
neighbor.g = gScore;
|
||||
neighbor.f = neighbor.g + neighbor.h;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// No result was found -- empty array signifies failure to find path
|
||||
return [];
|
||||
},
|
||||
heuristic: function(pos0, pos1) {
|
||||
// This is the Manhattan distance
|
||||
var d1 = Math.abs (pos1.x - pos0.x);
|
||||
var d2 = Math.abs (pos1.y - pos0.y);
|
||||
return d1 + d2;
|
||||
},
|
||||
neighbors: function(grid, node) {
|
||||
var ret = [];
|
||||
var x = node.pos.x;
|
||||
var y = node.pos.y;
|
||||
|
||||
if(grid[x-1] && grid[x-1][y]) {
|
||||
ret.push(grid[x-1][y]);
|
||||
}
|
||||
if(grid[x+1] && grid[x+1][y]) {
|
||||
ret.push(grid[x+1][y]);
|
||||
}
|
||||
if(grid[x][y-1] && grid[x][y-1]) {
|
||||
ret.push(grid[x][y-1]);
|
||||
}
|
||||
if(grid[x][y+1] && grid[x][y+1]) {
|
||||
ret.push(grid[x][y+1]);
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
};
|
||||
|
||||
function go() {
|
||||
path = astar.search(g1, start, end);
|
||||
};
|
||||
|
||||
go();
|
Различия файлов скрыты, потому что одна или несколько строк слишком длинны
|
@ -0,0 +1,19 @@
|
|||
var iterations = 1000;
|
||||
|
||||
var fft = fft = new FFT(frameBufferLength / channels, rate);
|
||||
var bd = new BeatDetektor();
|
||||
var kick_det = new BeatDetektor.modules.vis.BassKick();
|
||||
var vu = new BeatDetektor.modules.vis.VU();
|
||||
|
||||
var calcBeat = function() {
|
||||
var fb = getFramebuffer(), signal = DSP.getChannel(DSP.MIX, fb);
|
||||
|
||||
fft.forward(signal);
|
||||
|
||||
var timestamp = (new Date()).getTime();
|
||||
bd.process(timestamp, fft.spectrum);
|
||||
kick_det.process(bd);
|
||||
vu.process(bd);
|
||||
};
|
||||
|
||||
runTest(calcBeat, iterations);
|
Различия файлов скрыты, потому что одна или несколько строк слишком длинны
|
@ -0,0 +1,10 @@
|
|||
var iterations = 20;
|
||||
|
||||
var dft = new DFT(frameBufferLength / channels, rate);
|
||||
|
||||
var calcDFT = function() {
|
||||
var fb = getFramebuffer(), signal = DSP.getChannel(DSP.MIX, fb);
|
||||
dft.forward(signal);
|
||||
};
|
||||
|
||||
runTest(calcDFT, iterations);
|
Различия файлов скрыты, потому что одна или несколько строк слишком длинны
|
@ -0,0 +1,12 @@
|
|||
var iterations = 1000;
|
||||
|
||||
var fft = new FFT(frameBufferLength / channels, rate);
|
||||
|
||||
var calcFFT = function() {
|
||||
var fb = getFramebuffer(),
|
||||
signal = DSP.getChannel(DSP.MIX, fb);
|
||||
|
||||
fft.forward(signal);
|
||||
};
|
||||
|
||||
runTest(calcFFT, iterations);
|
Различия файлов скрыты, потому что одна или несколько строк слишком длинны
|
@ -0,0 +1,16 @@
|
|||
var iterations = 500;
|
||||
|
||||
var bufferSize = 8192;
|
||||
var sampleRate = 44100.0;
|
||||
var nthHarmonic = 5;
|
||||
var frequency = 344.53;
|
||||
var sine = new Oscillator(Oscillator.Sine, frequency, 1, bufferSize, sampleRate);
|
||||
|
||||
var calcOsc = function() {
|
||||
sine.generate();
|
||||
harmonic = new Oscillator(Oscillator.Sine, frequency*nthHarmonic, 1/nthHarmonic, bufferSize, sampleRate);
|
||||
harmonic.generate();
|
||||
sine.add(harmonic);
|
||||
};
|
||||
|
||||
runTest(calcOsc, iterations);
|
Различия файлов скрыты, потому что одна или несколько строк слишком длинны
|
@ -0,0 +1,5 @@
|
|||
var width = 400, height = 267;
|
||||
for (var index = 0; index < paramArray.length; index++) {
|
||||
var data = squidImageData;
|
||||
data = ProcessImageData(data, width, height, paramArray[index]);
|
||||
}
|
Различия файлов скрыты, потому что одна или несколько строк слишком длинны
|
@ -0,0 +1,40 @@
|
|||
/*
|
||||
* Pixastic Lib - Desaturation filter - v0.1.1
|
||||
* Copyright (c) 2008 Jacob Seidelin, jseidelin@nihilogic.dk, http://blog.nihilogic.dk/
|
||||
* License: [http://www.pixastic.com/lib/license.txt] (MPL 1.1)
|
||||
*/
|
||||
|
||||
var Pixastic = {};
|
||||
Pixastic.Actions = {};
|
||||
Pixastic.Actions.desaturate = {
|
||||
process : function(params) {
|
||||
var useAverage = !!(params.options.average && params.options.average != "false");
|
||||
var data = params.data;
|
||||
var rect = params.options.rect;
|
||||
var w = rect.width;
|
||||
var h = rect.height;
|
||||
|
||||
var p = w*h;
|
||||
var pix = p*4, pix1, pix2;
|
||||
|
||||
if (useAverage) {
|
||||
while (p--)
|
||||
data[pix-=4] = data[pix1=pix+1] = data[pix2=pix+2] = (data[pix]+data[pix1]+data[pix2])/3
|
||||
} else {
|
||||
while (p--)
|
||||
data[pix-=4] = data[pix1=pix+1] = data[pix2=pix+2] = (data[pix]*0.3 + data[pix1]*0.59 + data[pix2]*0.11);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
var params = {
|
||||
options: {
|
||||
rect: { width: width, height: height},
|
||||
},
|
||||
data: squidImageData
|
||||
}
|
||||
|
||||
//XXX improve dataset rather than loop
|
||||
for (var pixcounter = 0; pixcounter < 200; pixcounter++)
|
||||
Pixastic.Actions.desaturate.process(params);
|
Различия файлов скрыты, потому что одна или несколько строк слишком длинны
|
@ -0,0 +1,25 @@
|
|||
//print("i: " + i + "j: " + j);
|
||||
|
||||
function gaussianBlur() {
|
||||
for (var y = 0; y < height; ++y) {
|
||||
for (var x = 0; x < width; ++x) {
|
||||
var r = 0, g = 0, b = 0, a = 0;
|
||||
for (var j = 1 - kernelSize; j < kernelSize; ++j) {
|
||||
if (y + j < 0 || y + j >= height) continue;
|
||||
for (var i = 1 - kernelSize; i < kernelSize; ++i) {
|
||||
if (x + i < 0 || x + i >= width) continue;
|
||||
r += squidImageData[4 * ((y + j) * width + (x + i)) + 0] * kernel[Math.abs(j)][Math.abs(i)];
|
||||
g += squidImageData[4 * ((y + j) * width + (x + i)) + 1] * kernel[Math.abs(j)][Math.abs(i)];
|
||||
b += squidImageData[4 * ((y + j) * width + (x + i)) + 2] * kernel[Math.abs(j)][Math.abs(i)];
|
||||
a += squidImageData[4 * ((y + j) * width + (x + i)) + 3] * kernel[Math.abs(j)][Math.abs(i)];
|
||||
}
|
||||
}
|
||||
squidImageData[4 * (y * width + x) + 0] = r / kernelSum;
|
||||
squidImageData[4 * (y * width + x) + 1] = g / kernelSum;
|
||||
squidImageData[4 * (y * width + x) + 2] = b / kernelSum;
|
||||
squidImageData[4 * (y * width + x) + 3] = a / kernelSum;
|
||||
}
|
||||
}
|
||||
return squidImageData;
|
||||
}
|
||||
gaussianBlur();
|
|
@ -0,0 +1,103 @@
|
|||
var data =
|
||||
"{\"summary\":{\"turnover\":0.3736,\"correlation2\":0." +
|
||||
"7147,\"concentration\":0.3652,\"beta\":0.8814,\"totalValue\":1.3" +
|
||||
"091078259E8,\"correlation\":0.7217},\"watchlist\":[],\"shortCash" +
|
||||
"\":-1611000,\"holdings\":[{\"type\":\"LONG\",\"commission\":1040" +
|
||||
",\"cost\":9001920,\"quantity\":26000,\"lots\":[{\"marketCap\":\"" +
|
||||
"L\",\"industry\":\"TECHNOLOGY\",\"style\":\"G\",\"buyDate\":\"20" +
|
||||
"08-10-08 13:44:20.000\",\"quantity\":8000},{\"marketCap\":\"L\"," +
|
||||
"\"industry\":\"TECHNOLOGY\",\"style\":\"G\",\"buyDate\":\"2008-1" +
|
||||
"0-15 13:28:02.000\",\"quantity\":18000}],\"stock\":\"GOOG\"},{\"" +
|
||||
"type\":\"LONG\",\"commission\":8000,\"cost\":4672000,\"quantity" +
|
||||
"\":200000,\"lots\":[{\"marketCap\":\"L\",\"industry\":\"TECHNOLO" +
|
||||
"GY\",\"style\":\"G\",\"buyDate\":\"2008-10-15 13:28:54.000\",\"q" +
|
||||
"uantity\":200000}],\"stock\":\"MSFT\"},{\"type\":\"LONG\",\"comm" +
|
||||
"ission\":21877,\"cost\":1.001592313E7,\"quantity\":546919,\"lots" +
|
||||
"\":[{\"marketCap\":\"L\",\"industry\":\"FINANCIAL\",\"style\":\"" +
|
||||
"G\",\"buyDate\":\"2008-08-01 09:50:17.000\",\"quantity\":103092}" +
|
||||
",{\"marketCap\":\"L\",\"industry\":\"FINANCIAL\",\"style\":\"G\"" +
|
||||
",\"buyDate\":\"2008-08-18 10:31:34.000\",\"quantity\":49950},{\"" +
|
||||
"marketCap\":\"L\",\"industry\":\"FINANCIAL\",\"style\":\"G\",\"b" +
|
||||
"uyDate\":\"2008-08-29 09:35:22.000\",\"quantity\":45045},{\"mark" +
|
||||
"etCap\":\"L\",\"industry\":\"FINANCIAL\",\"style\":\"G\",\"buyDa" +
|
||||
"te\":\"2008-09-15 09:40:32.000\",\"quantity\":48400},{\"marketCa" +
|
||||
"p\":\"L\",\"industry\":\"FINANCIAL\",\"style\":\"G\",\"buyDate\"" +
|
||||
":\"2008-10-06 11:21:50.000\",\"quantity\":432},{\"marketCap\":\"" +
|
||||
"L\",\"industry\":\"FINANCIAL\",\"style\":\"G\",\"buyDate\":\"200" +
|
||||
"8-10-15 13:30:05.000\",\"quantity\":300000}],\"stock\":\"UBS\"}," +
|
||||
"{\"type\":\"LONG\",\"commission\":4000,\"cost\":6604849.1,\"quan" +
|
||||
"tity\":122741,\"lots\":[{\"marketCap\":\"L\",\"industry\":\"SERV" +
|
||||
"ICES\",\"style\":\"V\",\"buyDate\":\"2008-04-26 04:44:34.000\"," +
|
||||
"\"quantity\":22741},{\"marketCap\":\"L\",\"industry\":\"SERVICES" +
|
||||
"\",\"style\":\"V\",\"buyDate\":\"2008-10-15 13:31:02.000\",\"qua" +
|
||||
"ntity\":100000}],\"stock\":\"V\"},{\"type\":\"LONG\",\"commissio" +
|
||||
"n\":2805,\"cost\":5005558.25,\"quantity\":70121,\"lots\":[{\"mar" +
|
||||
"ketCap\":\"M\",\"industry\":\"RETAIL\",\"style\":\"G\",\"buyDate" +
|
||||
"\":\"2008-10-10 10:48:36.000\",\"quantity\":121},{\"marketCap\":" +
|
||||
"\"M\",\"industry\":\"RETAIL\",\"style\":\"G\",\"buyDate\":\"2008" +
|
||||
"-10-15 13:33:44.000\",\"quantity\":70000}],\"stock\":\"LDG\"},{" +
|
||||
"\"type\":\"LONG\",\"commission\":10000,\"cost\":5382500,\"quanti" +
|
||||
"ty\":250000,\"lots\":[{\"marketCap\":\"L\",\"industry\":\"RETAIL" +
|
||||
"\",\"style\":\"V\",\"buyDate\":\"2008-10-15 13:34:30.000\",\"qua" +
|
||||
"ntity\":250000}],\"stock\":\"SWY\"},{\"type\":\"LONG\",\"commiss" +
|
||||
"ion\":1120,\"cost\":1240960,\"quantity\":28000,\"lots\":[{\"mark" +
|
||||
"etCap\":\"u\",\"industry\":\"ETF\",\"style\":\"B\",\"buyDate\":" +
|
||||
"\"2008-10-15 15:57:39.000\",\"quantity\":28000}],\"stock\":\"OIL" +
|
||||
"\"},{\"type\":\"LONG\",\"commission\":400,\"cost\":236800,\"quan" +
|
||||
"tity\":10000,\"lots\":[{\"marketCap\":\"M\",\"industry\":\"UTILI" +
|
||||
"TIES_AND_ENERGY\",\"style\":\"G\",\"buyDate\":\"2008-10-15 15:58" +
|
||||
":03.000\",\"quantity\":10000}],\"stock\":\"COG\"},{\"type\":\"LO" +
|
||||
"NG\",\"commission\":3200,\"cost\":1369600,\"quantity\":80000,\"l" +
|
||||
"ots\":[{\"marketCap\":\"S\",\"industry\":\"UTILITIES_AND_ENERGY" +
|
||||
"\",\"style\":\"G\",\"buyDate\":\"2008-10-15 15:58:32.000\",\"qua" +
|
||||
"ntity\":80000}],\"stock\":\"CRZO\"},{\"type\":\"LONG\",\"commiss" +
|
||||
"ion\":429,\"cost\":108164.8,\"quantity\":10720,\"lots\":[{\"mark" +
|
||||
"etCap\":\"u\",\"industry\":\"FINANCIAL\",\"style\":\"V\",\"buyDa" +
|
||||
"te\":\"2008-10-16 09:37:06.000\",\"quantity\":10720}],\"stock\":" +
|
||||
"\"FGI\"},{\"type\":\"LONG\",\"commission\":1080,\"cost\":494910," +
|
||||
"\"quantity\":27000,\"lots\":[{\"marketCap\":\"L\",\"industry\":" +
|
||||
"\"RETAIL\",\"style\":\"V\",\"buyDate\":\"2008-10-16 09:37:06.000" +
|
||||
"\",\"quantity\":27000}],\"stock\":\"LOW\"},{\"type\":\"LONG\",\"" +
|
||||
"commission\":4080,\"cost\":4867440,\"quantity\":102000,\"lots\":" +
|
||||
"[{\"marketCap\":\"L\",\"industry\":\"HEALTHCARE\",\"style\":\"V" +
|
||||
"\",\"buyDate\":\"2008-10-16 09:37:06.000\",\"quantity\":102000}]" +
|
||||
",\"stock\":\"AMGN\"},{\"type\":\"SHORT\",\"commission\":4000,\"" +
|
||||
"cost\":-1159000,\"quantity\":-100000,\"lots\":[{\"marketCap\":" +
|
||||
"\"L\",\"industry\":\"TECHNOLOGY\",\"style\":\"V\",\"buyDate\":" +
|
||||
"\"2008-10-16 09:37:06.000\",\"quantity\":-100000}],\"stock\":\"" +
|
||||
"AMAT\"},{\"type\":\"LONG\",\"commission\":2,\"cost\":5640002,\"" +
|
||||
"quantity\":50,\"lots\":[{\"marketCap\":\"L\",\"industry\":\"FIN" +
|
||||
"ANCIAL\",\"style\":\"B\",\"buyDate\":\"2008-10-16 09:37:06.000" +
|
||||
"\",\"quantity\":50}],\"stock\":\"BRKA\"},{\"type\":\"SHORT\",\"" +
|
||||
"commission\":4000,\"cost\":-436000,\"quantity\":-100000,\"lots" +
|
||||
"\":[{\"marketCap\":\"M\",\"industry\":\"TRANSPORTATION\",\"styl" +
|
||||
"e\":\"G\",\"buyDate\":\"2008-10-16 09:37:06.000\",\"quantity\":-" +
|
||||
"100000}],\"stock\":\"JBLU\"},{\"type\":\"LONG\",\"commission\":8" +
|
||||
"000,\"cost\":1.1534E7,\"quantity\":200000,\"lots\":[{\"marketCap" +
|
||||
"\":\"S\",\"industry\":\"FINANCIAL\",\"style\":\"G\",\"buyDate\":" +
|
||||
"\"2008-10-16 14:35:24.000\",\"quantity\":200000}],\"stock\":\"US" +
|
||||
"O\"},{\"type\":\"LONG\",\"commission\":4000,\"cost\":1.0129E7,\"" +
|
||||
"quantity\":100000,\"lots\":[{\"marketCap\":\"L\",\"industry\":\"" +
|
||||
"TECHNOLOGY\",\"style\":\"G\",\"buyDate\":\"2008-10-15 13:28:26.0" +
|
||||
"00\",\"quantity\":50000},{\"marketCap\":\"L\",\"industry\":\"TEC" +
|
||||
"HNOLOGY\",\"style\":\"G\",\"buyDate\":\"2008-10-17 09:33:09.000" +
|
||||
"\",\"quantity\":50000}],\"stock\":\"AAPL\"},{\"type\":\"LONG\"," +
|
||||
"\"commission\":1868,\"cost\":9971367.2,\"quantity\":54280,\"lots" +
|
||||
"\":[{\"marketCap\":\"L\",\"industry\":\"SERVICES\",\"style\":\"G" +
|
||||
"\",\"buyDate\":\"2008-04-26 04:44:34.000\",\"quantity\":7580},{" +
|
||||
"\"marketCap\":\"L\",\"industry\":\"SERVICES\",\"style\":\"G\",\"" +
|
||||
"buyDate\":\"2008-05-29 09:50:28.000\",\"quantity\":7500},{\"mark" +
|
||||
"etCap\":\"L\",\"industry\":\"SERVICES\",\"style\":\"G\",\"buyDat" +
|
||||
"e\":\"2008-10-15 13:30:38.000\",\"quantity\":33000},{\"marketCap" +
|
||||
"\":\"L\",\"industry\":\"SERVICES\",\"style\":\"G\",\"buyDate\":" +
|
||||
"\"2008-10-17 09:33:09.000\",\"quantity\":6200}],\"stock\":\"MA\"" +
|
||||
"}],\"longCash\":4.600368106E7,\"ownerId\":8,\"pendingOrders\":[{" +
|
||||
"\"total\":487000,\"type\":\"cover\",\"subtotal\":483000,\"price" +
|
||||
"\":4.83,\"commission\":4000,\"date\":\"2008-10-17 23:56:06.000\"" +
|
||||
",\"quantity\":100000,\"expires\":\"2008-10-20 16:00:00.000\",\"s" +
|
||||
"tock\":\"JBLU\",\"id\":182375},{\"total\":6271600,\"type\":\"buy" +
|
||||
"\",\"subtotal\":6270000,\"price\":156.75,\"commission\":1600,\"d" +
|
||||
"ate\":\"2008-10-17 23:56:40.000\",\"quantity\":40000,\"expires\"" +
|
||||
":\"2008-10-20 16:00:00.000\",\"stock\":\"MA\",\"id\":182376}],\"" +
|
||||
"inceptionDate\":\"2008-04-26 04:44:29.000\",\"withdrawals\":0,\"" +
|
||||
"id\":219948,\"deposits\":0}";
|
|
@ -0,0 +1,4 @@
|
|||
|
||||
for (var i = 0; i < 1000; i++) {
|
||||
var x = JSON.parse(data);
|
||||
}
|
Различия файлов скрыты, потому что одна или несколько строк слишком длинны
|
@ -0,0 +1,4 @@
|
|||
|
||||
for (var i = 0; i < 20; i++) {
|
||||
var x = JSON.stringify(tinderbox_data);
|
||||
}
|
Разница между файлами не показана из-за своего большого размера
Загрузить разницу
|
@ -0,0 +1,23 @@
|
|||
new sjcl.test.TestCase("AES official known-answer tests", function (cb) {
|
||||
if (!sjcl.cipher.aes) {
|
||||
this.unimplemented();
|
||||
cb && cb();
|
||||
return;
|
||||
}
|
||||
|
||||
var i, kat = sjcl.test.vector.aes, tv, len, aes;
|
||||
|
||||
//XXX add more vectors instead of looping
|
||||
for (var index = 0; index < 8; index++) {
|
||||
for (i=0; i<kat.length; i++) {
|
||||
tv = kat[i];
|
||||
len = 32 * tv.key.length;
|
||||
aes = new sjcl.cipher.aes(tv.key);
|
||||
this.require(sjcl.bitArray.equal(aes.encrypt(tv.pt), tv.ct), "encrypt "+len+" #"+i);
|
||||
this.require(sjcl.bitArray.equal(aes.decrypt(tv.ct), tv.pt), "decrypt "+len+" #"+i);
|
||||
}
|
||||
}
|
||||
cb && cb();
|
||||
});
|
||||
|
||||
sjcl.test.run();
|
Разница между файлами не показана из-за своего большого размера
Загрузить разницу
|
@ -0,0 +1,33 @@
|
|||
new sjcl.test.TestCase("CCM mode tests", function (cb) {
|
||||
if (!sjcl.cipher.aes || !sjcl.mode.ccm) {
|
||||
this.unimplemented();
|
||||
cb && cb();
|
||||
return;
|
||||
}
|
||||
|
||||
var i, kat = sjcl.test.vector.ccm, tv, iv, ct, aes, len, tlen, thiz=this, w=sjcl.bitArray, pt, h=sjcl.codec.hex, ad;
|
||||
browserUtil.cpsIterate(function (j, cbb) {
|
||||
for (i=100*j; i<kat.length && i<100*(j+1); i++) {
|
||||
tv = kat[i];
|
||||
len = 32 * tv.key.length;
|
||||
aes = new sjcl.cipher.aes(h.toBits(tv.key));
|
||||
|
||||
// Convert from strings
|
||||
iv = h.toBits(tv.iv);
|
||||
ad = h.toBits(tv.adata);
|
||||
pt = h.toBits(tv.pt);
|
||||
ct = h.toBits(tv.ct + tv.tag);
|
||||
tlen = tv.tag.length * 4;
|
||||
|
||||
thiz.require(w.equal(sjcl.mode.ccm.encrypt(aes, pt, iv, ad, tlen), ct), "aes-"+len+"-ccm-encrypt #"+i);
|
||||
try {
|
||||
thiz.require(w.equal(sjcl.mode.ccm.decrypt(aes, ct, iv, ad, tlen), pt), "aes-"+len+"-ccm-decrypt #"+i);
|
||||
} catch (e) {
|
||||
thiz.fail("aes-ccm-decrypt #"+i+" (exn "+e+")");
|
||||
}
|
||||
}
|
||||
cbb();
|
||||
}, 0, kat.length / 100, true, cb);
|
||||
});
|
||||
|
||||
sjcl.test.run();
|
|
@ -0,0 +1,222 @@
|
|||
"use strict";
|
||||
|
||||
var sjcl={cipher:{},hash:{},mode:{},misc:{},codec:{},exception:{corrupt:function(a){this.toString=function(){return"CORRUPT: "+this.message};this.message=a},invalid:function(a){this.toString=function(){return"INVALID: "+this.message};this.message=a},bug:function(a){this.toString=function(){return"BUG: "+this.message};this.message=a}}};
|
||||
sjcl.cipher.aes=function(a){this.h[0][0][0]||this.w();var b,c,d,e,f=this.h[0][4],g=this.h[1];b=a.length;var h=1;if(b!==4&&b!==6&&b!==8)throw new sjcl.exception.invalid("invalid aes key size");this.a=[d=a.slice(0),e=[]];for(a=b;a<4*b+28;a++){c=d[a-1];if(a%b===0||b===8&&a%b===4){c=f[c>>>24]<<24^f[c>>16&255]<<16^f[c>>8&255]<<8^f[c&255];if(a%b===0){c=c<<8^c>>>24^h<<24;h=h<<1^(h>>7)*283}}d[a]=d[a-b]^c}for(b=0;a;b++,a--){c=d[b&3?a:a-4];e[b]=a<=4||b<4?c:g[0][f[c>>>24]]^g[1][f[c>>16&255]]^g[2][f[c>>8&255]]^
|
||||
g[3][f[c&255]]}};
|
||||
sjcl.cipher.aes.prototype={encrypt:function(a){return this.H(a,0)},decrypt:function(a){return this.H(a,1)},h:[[[],[],[],[],[]],[[],[],[],[],[]]],w:function(){var a=this.h[0],b=this.h[1],c=a[4],d=b[4],e,f,g,h=[],i=[],k,j,l,m;for(e=0;e<0x100;e++)i[(h[e]=e<<1^(e>>7)*283)^e]=e;for(f=g=0;!c[f];f^=k||1,g=i[g]||1){l=g^g<<1^g<<2^g<<3^g<<4;l=l>>8^l&255^99;c[f]=l;d[l]=f;j=h[e=h[k=h[f]]];m=j*0x1010101^e*0x10001^k*0x101^f*0x1010100;j=h[l]*0x101^l*0x1010100;for(e=0;e<4;e++){a[e][f]=j=j<<24^j>>>8;b[e][l]=m=m<<24^m>>>8}}for(e=
|
||||
0;e<5;e++){a[e]=a[e].slice(0);b[e]=b[e].slice(0)}},H:function(a,b){if(a.length!==4)throw new sjcl.exception.invalid("invalid aes block size");var c=this.a[b],d=a[0]^c[0],e=a[b?3:1]^c[1],f=a[2]^c[2];a=a[b?1:3]^c[3];var g,h,i,k=c.length/4-2,j,l=4,m=[0,0,0,0];g=this.h[b];var n=g[0],o=g[1],p=g[2],q=g[3],r=g[4];for(j=0;j<k;j++){g=n[d>>>24]^o[e>>16&255]^p[f>>8&255]^q[a&255]^c[l];h=n[e>>>24]^o[f>>16&255]^p[a>>8&255]^q[d&255]^c[l+1];i=n[f>>>24]^o[a>>16&255]^p[d>>8&255]^q[e&255]^c[l+2];a=n[a>>>24]^o[d>>16&
|
||||
255]^p[e>>8&255]^q[f&255]^c[l+3];l+=4;d=g;e=h;f=i}for(j=0;j<4;j++){m[b?3&-j:j]=r[d>>>24]<<24^r[e>>16&255]<<16^r[f>>8&255]<<8^r[a&255]^c[l++];g=d;d=e;e=f;f=a;a=g}return m}};
|
||||
sjcl.bitArray={bitSlice:function(a,b,c){a=sjcl.bitArray.P(a.slice(b/32),32-(b&31)).slice(1);return c===undefined?a:sjcl.bitArray.clamp(a,c-b)},concat:function(a,b){if(a.length===0||b.length===0)return a.concat(b);var c=a[a.length-1],d=sjcl.bitArray.getPartial(c);return d===32?a.concat(b):sjcl.bitArray.P(b,d,c|0,a.slice(0,a.length-1))},bitLength:function(a){var b=a.length;if(b===0)return 0;return(b-1)*32+sjcl.bitArray.getPartial(a[b-1])},clamp:function(a,b){if(a.length*32<b)return a;a=a.slice(0,Math.ceil(b/
|
||||
32));var c=a.length;b&=31;if(c>0&&b)a[c-1]=sjcl.bitArray.partial(b,a[c-1]&2147483648>>b-1,1);return a},partial:function(a,b,c){if(a===32)return b;return(c?b|0:b<<32-a)+a*0x10000000000},getPartial:function(a){return Math.round(a/0x10000000000)||32},equal:function(a,b){if(sjcl.bitArray.bitLength(a)!==sjcl.bitArray.bitLength(b))return false;var c=0,d;for(d=0;d<a.length;d++)c|=a[d]^b[d];return c===0},P:function(a,b,c,d){var e;e=0;if(d===undefined)d=[];for(;b>=32;b-=32){d.push(c);c=0}if(b===0)return d.concat(a);
|
||||
for(e=0;e<a.length;e++){d.push(c|a[e]>>>b);c=a[e]<<32-b}e=a.length?a[a.length-1]:0;a=sjcl.bitArray.getPartial(e);d.push(sjcl.bitArray.partial(b+a&31,b+a>32?c:d.pop(),1));return d},k:function(a,b){return[a[0]^b[0],a[1]^b[1],a[2]^b[2],a[3]^b[3]]}};
|
||||
sjcl.codec.utf8String={fromBits:function(a){var b="",c=sjcl.bitArray.bitLength(a),d,e;for(d=0;d<c/8;d++){if((d&3)===0)e=a[d/4];b+=String.fromCharCode(e>>>24);e<<=8}return decodeURIComponent(escape(b))},toBits:function(a){a=unescape(encodeURIComponent(a));var b=[],c,d=0;for(c=0;c<a.length;c++){d=d<<8|a.charCodeAt(c);if((c&3)===3){b.push(d);d=0}}c&3&&b.push(sjcl.bitArray.partial(8*(c&3),d));return b}};
|
||||
sjcl.codec.hex={fromBits:function(a){var b="",c;for(c=0;c<a.length;c++)b+=((a[c]|0)+0xf00000000000).toString(16).substr(4);return b.substr(0,sjcl.bitArray.bitLength(a)/4)},toBits:function(a){var b,c=[],d;a=a.replace(/\s|0x/g,"");d=a.length;a+="00000000";for(b=0;b<a.length;b+=8)c.push(parseInt(a.substr(b,8),16)^0);return sjcl.bitArray.clamp(c,d*4)}};
|
||||
sjcl.codec.base64={D:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",fromBits:function(a,b){var c="",d,e=0,f=sjcl.codec.base64.D,g=0,h=sjcl.bitArray.bitLength(a);for(d=0;c.length*6<h;){c+=f.charAt((g^a[d]>>>e)>>>26);if(e<6){g=a[d]<<6-e;e+=26;d++}else{g<<=6;e-=6}}for(;c.length&3&&!b;)c+="=";return c},toBits:function(a){a=a.replace(/\s|=/g,"");var b=[],c,d=0,e=sjcl.codec.base64.D,f=0,g;for(c=0;c<a.length;c++){g=e.indexOf(a.charAt(c));if(g<0)throw new sjcl.exception.invalid("this isn't base64!");
|
||||
if(d>26){d-=26;b.push(f^g>>>d);f=g<<32-d}else{d+=6;f^=g<<32-d}}d&56&&b.push(sjcl.bitArray.partial(d&56,f,1));return b}};sjcl.hash.sha256=function(a){this.a[0]||this.w();if(a){this.n=a.n.slice(0);this.i=a.i.slice(0);this.e=a.e}else this.reset()};sjcl.hash.sha256.hash=function(a){return(new sjcl.hash.sha256).update(a).finalize()};
|
||||
sjcl.hash.sha256.prototype={blockSize:512,reset:function(){this.n=this.N.slice(0);this.i=[];this.e=0;return this},update:function(a){if(typeof a==="string")a=sjcl.codec.utf8String.toBits(a);var b,c=this.i=sjcl.bitArray.concat(this.i,a);b=this.e;a=this.e=b+sjcl.bitArray.bitLength(a);for(b=512+b&-512;b<=a;b+=512)this.C(c.splice(0,16));return this},finalize:function(){var a,b=this.i,c=this.n;b=sjcl.bitArray.concat(b,[sjcl.bitArray.partial(1,1)]);for(a=b.length+2;a&15;a++)b.push(0);b.push(Math.floor(this.e/
|
||||
4294967296));for(b.push(this.e|0);b.length;)this.C(b.splice(0,16));this.reset();return c},N:[],a:[],w:function(){function a(e){return(e-Math.floor(e))*0x100000000|0}var b=0,c=2,d;a:for(;b<64;c++){for(d=2;d*d<=c;d++)if(c%d===0)continue a;if(b<8)this.N[b]=a(Math.pow(c,0.5));this.a[b]=a(Math.pow(c,1/3));b++}},C:function(a){var b,c,d=a.slice(0),e=this.n,f=this.a,g=e[0],h=e[1],i=e[2],k=e[3],j=e[4],l=e[5],m=e[6],n=e[7];for(a=0;a<64;a++){if(a<16)b=d[a];else{b=d[a+1&15];c=d[a+14&15];b=d[a&15]=(b>>>7^b>>>18^
|
||||
b>>>3^b<<25^b<<14)+(c>>>17^c>>>19^c>>>10^c<<15^c<<13)+d[a&15]+d[a+9&15]|0}b=b+n+(j>>>6^j>>>11^j>>>25^j<<26^j<<21^j<<7)+(m^j&(l^m))+f[a];n=m;m=l;l=j;j=k+b|0;k=i;i=h;h=g;g=b+(h&i^k&(h^i))+(h>>>2^h>>>13^h>>>22^h<<30^h<<19^h<<10)|0}e[0]=e[0]+g|0;e[1]=e[1]+h|0;e[2]=e[2]+i|0;e[3]=e[3]+k|0;e[4]=e[4]+j|0;e[5]=e[5]+l|0;e[6]=e[6]+m|0;e[7]=e[7]+n|0}};
|
||||
sjcl.mode.ccm={name:"ccm",encrypt:function(a,b,c,d,e){var f,g=b.slice(0),h=sjcl.bitArray,i=h.bitLength(c)/8,k=h.bitLength(g)/8;e=e||64;d=d||[];if(i<7)throw new sjcl.exception.invalid("ccm: iv must be at least 7 bytes");for(f=2;f<4&&k>>>8*f;f++);if(f<15-i)f=15-i;c=h.clamp(c,8*(15-f));b=sjcl.mode.ccm.G(a,b,c,d,e,f);g=sjcl.mode.ccm.I(a,g,c,b,e,f);return h.concat(g.data,g.tag)},decrypt:function(a,b,c,d,e){e=e||64;d=d||[];var f=sjcl.bitArray,g=f.bitLength(c)/8,h=f.bitLength(b),i=f.clamp(b,h-e),k=f.bitSlice(b,
|
||||
h-e);h=(h-e)/8;if(g<7)throw new sjcl.exception.invalid("ccm: iv must be at least 7 bytes");for(b=2;b<4&&h>>>8*b;b++);if(b<15-g)b=15-g;c=f.clamp(c,8*(15-b));i=sjcl.mode.ccm.I(a,i,c,k,e,b);a=sjcl.mode.ccm.G(a,i.data,c,d,e,b);if(!f.equal(i.tag,a))throw new sjcl.exception.corrupt("ccm: tag doesn't match");return i.data},G:function(a,b,c,d,e,f){var g=[],h=sjcl.bitArray,i=h.k;e/=8;if(e%2||e<4||e>16)throw new sjcl.exception.invalid("ccm: invalid tag length");if(d.length>0xffffffff||b.length>0xffffffff)throw new sjcl.exception.bug("ccm: can't deal with 4GiB or more data");
|
||||
f=[h.partial(8,(d.length?64:0)|e-2<<2|f-1)];f=h.concat(f,c);f[3]|=h.bitLength(b)/8;f=a.encrypt(f);if(d.length){c=h.bitLength(d)/8;if(c<=65279)g=[h.partial(16,c)];else if(c<=0xffffffff)g=h.concat([h.partial(16,65534)],[c]);g=h.concat(g,d);for(d=0;d<g.length;d+=4)f=a.encrypt(i(f,g.slice(d,d+4)))}for(d=0;d<b.length;d+=4)f=a.encrypt(i(f,b.slice(d,d+4)));return h.clamp(f,e*8)},I:function(a,b,c,d,e,f){var g,h=sjcl.bitArray;g=h.k;var i=b.length,k=h.bitLength(b);c=h.concat([h.partial(8,f-1)],c).concat([0,
|
||||
0,0]).slice(0,4);d=h.bitSlice(g(d,a.encrypt(c)),0,e);if(!i)return{tag:d,data:[]};for(g=0;g<i;g+=4){c[3]++;e=a.encrypt(c);b[g]^=e[0];b[g+1]^=e[1];b[g+2]^=e[2];b[g+3]^=e[3]}return{tag:d,data:h.clamp(b,k)}}};
|
||||
sjcl.mode.ocb2={name:"ocb2",encrypt:function(a,b,c,d,e,f){if(sjcl.bitArray.bitLength(c)!==128)throw new sjcl.exception.invalid("ocb iv must be 128 bits");var g,h=sjcl.mode.ocb2.A,i=sjcl.bitArray,k=i.k,j=[0,0,0,0];c=h(a.encrypt(c));var l,m=[];d=d||[];e=e||64;for(g=0;g+4<b.length;g+=4){l=b.slice(g,g+4);j=k(j,l);m=m.concat(k(c,a.encrypt(k(c,l))));c=h(c)}l=b.slice(g);b=i.bitLength(l);g=a.encrypt(k(c,[0,0,0,b]));l=i.clamp(k(l,g),b);j=k(j,k(l,g));j=a.encrypt(k(j,k(c,h(c))));if(d.length)j=k(j,f?d:sjcl.mode.ocb2.pmac(a,
|
||||
d));return m.concat(i.concat(l,i.clamp(j,e)))},decrypt:function(a,b,c,d,e,f){if(sjcl.bitArray.bitLength(c)!==128)throw new sjcl.exception.invalid("ocb iv must be 128 bits");e=e||64;var g=sjcl.mode.ocb2.A,h=sjcl.bitArray,i=h.k,k=[0,0,0,0],j=g(a.encrypt(c)),l,m,n=sjcl.bitArray.bitLength(b)-e,o=[];d=d||[];for(c=0;c+4<n/32;c+=4){l=i(j,a.decrypt(i(j,b.slice(c,c+4))));k=i(k,l);o=o.concat(l);j=g(j)}m=n-c*32;l=a.encrypt(i(j,[0,0,0,m]));l=i(l,h.clamp(b.slice(c),m));k=i(k,l);k=a.encrypt(i(k,i(j,g(j))));if(d.length)k=
|
||||
i(k,f?d:sjcl.mode.ocb2.pmac(a,d));if(!h.equal(h.clamp(k,e),h.bitSlice(b,n)))throw new sjcl.exception.corrupt("ocb: tag doesn't match");return o.concat(h.clamp(l,m))},pmac:function(a,b){var c,d=sjcl.mode.ocb2.A,e=sjcl.bitArray,f=e.k,g=[0,0,0,0],h=a.encrypt([0,0,0,0]);h=f(h,d(d(h)));for(c=0;c+4<b.length;c+=4){h=d(h);g=f(g,a.encrypt(f(h,b.slice(c,c+4))))}b=b.slice(c);if(e.bitLength(b)<128){h=f(h,d(h));b=e.concat(b,[2147483648|0])}g=f(g,b);return a.encrypt(f(d(f(h,d(h))),g))},A:function(a){return[a[0]<<
|
||||
1^a[1]>>>31,a[1]<<1^a[2]>>>31,a[2]<<1^a[3]>>>31,a[3]<<1^(a[0]>>>31)*135]}};sjcl.misc.hmac=function(a,b){this.M=b=b||sjcl.hash.sha256;var c=[[],[]],d=b.prototype.blockSize/32;this.l=[new b,new b];if(a.length>d)a=b.hash(a);for(b=0;b<d;b++){c[0][b]=a[b]^909522486;c[1][b]=a[b]^1549556828}this.l[0].update(c[0]);this.l[1].update(c[1])};sjcl.misc.hmac.prototype.encrypt=sjcl.misc.hmac.prototype.mac=function(a,b){a=(new this.M(this.l[0])).update(a,b).finalize();return(new this.M(this.l[1])).update(a).finalize()};
|
||||
sjcl.misc.pbkdf2=function(a,b,c,d,e){c=c||1E3;if(d<0||c<0)throw sjcl.exception.invalid("invalid params to pbkdf2");if(typeof a==="string")a=sjcl.codec.utf8String.toBits(a);e=e||sjcl.misc.hmac;a=new e(a);var f,g,h,i,k=[],j=sjcl.bitArray;for(i=1;32*k.length<(d||1);i++){e=f=a.encrypt(j.concat(b,[i]));for(g=1;g<c;g++){f=a.encrypt(f);for(h=0;h<f.length;h++)e[h]^=f[h]}k=k.concat(e)}if(d)k=j.clamp(k,d);return k};
|
||||
sjcl.random={randomWords:function(a,b){var c=[];b=this.isReady(b);var d;if(b===0)throw new sjcl.exception.notready("generator isn't seeded");else b&2&&this.U(!(b&1));for(b=0;b<a;b+=4){(b+1)%0x10000===0&&this.L();d=this.u();c.push(d[0],d[1],d[2],d[3])}this.L();return c.slice(0,a)},setDefaultParanoia:function(a){this.t=a},addEntropy:function(a,b,c){c=c||"user";var d,e,f=(new Date).valueOf(),g=this.q[c],h=this.isReady();d=this.F[c];if(d===undefined)d=this.F[c]=this.R++;if(g===undefined)g=this.q[c]=0;this.q[c]=
|
||||
(this.q[c]+1)%this.b.length;switch(typeof a){case "number":break;case "object":if(b===undefined)for(c=b=0;c<a.length;c++)for(e=a[c];e>0;){b++;e>>>=1}this.b[g].update([d,this.J++,2,b,f,a.length].concat(a));break;case "string":if(b===undefined)b=a.length;this.b[g].update([d,this.J++,3,b,f,a.length]);this.b[g].update(a);break;default:throw new sjcl.exception.bug("random: addEntropy only supports number, array or string");}this.j[g]+=b;this.f+=b;if(h===0){this.isReady()!==0&&this.K("seeded",Math.max(this.g,
|
||||
this.f));this.K("progress",this.getProgress())}},isReady:function(a){a=this.B[a!==undefined?a:this.t];return this.g&&this.g>=a?this.j[0]>80&&(new Date).valueOf()>this.O?3:1:this.f>=a?2:0},getProgress:function(a){a=this.B[a?a:this.t];return this.g>=a?1["0"]:this.f>a?1["0"]:this.f/a},startCollectors:function(){if(!this.m){if(window.addEventListener){window.addEventListener("load",this.o,false);window.addEventListener("mousemove",this.p,false)}else if(document.attachEvent){document.attachEvent("onload",
|
||||
this.o);document.attachEvent("onmousemove",this.p)}else throw new sjcl.exception.bug("can't attach event");this.m=true}},stopCollectors:function(){if(this.m){if(window.removeEventListener){window.removeEventListener("load",this.o);window.removeEventListener("mousemove",this.p)}else if(window.detachEvent){window.detachEvent("onload",this.o);window.detachEvent("onmousemove",this.p)}this.m=false}},addEventListener:function(a,b){this.r[a][this.Q++]=b},removeEventListener:function(a,b){var c;a=this.r[a];
|
||||
var d=[];for(c in a)a.hasOwnProperty[c]&&a[c]===b&&d.push(c);for(b=0;b<d.length;b++){c=d[b];delete a[c]}},b:[new sjcl.hash.sha256],j:[0],z:0,q:{},J:0,F:{},R:0,g:0,f:0,O:0,a:[0,0,0,0,0,0,0,0],d:[0,0,0,0],s:undefined,t:6,m:false,r:{progress:{},seeded:{}},Q:0,B:[0,48,64,96,128,192,0x100,384,512,768,1024],u:function(){for(var a=0;a<4;a++){this.d[a]=this.d[a]+1|0;if(this.d[a])break}return this.s.encrypt(this.d)},L:function(){this.a=this.u().concat(this.u());this.s=new sjcl.cipher.aes(this.a)},T:function(a){this.a=
|
||||
sjcl.hash.sha256.hash(this.a.concat(a));this.s=new sjcl.cipher.aes(this.a);for(a=0;a<4;a++){this.d[a]=this.d[a]+1|0;if(this.d[a])break}},U:function(a){var b=[],c=0,d;this.O=b[0]=(new Date).valueOf()+3E4;for(d=0;d<16;d++)b.push(Math.random()*0x100000000|0);for(d=0;d<this.b.length;d++){b=b.concat(this.b[d].finalize());c+=this.j[d];this.j[d]=0;if(!a&&this.z&1<<d)break}if(this.z>=1<<this.b.length){this.b.push(new sjcl.hash.sha256);this.j.push(0)}this.f-=c;if(c>this.g)this.g=c;this.z++;this.T(b)},p:function(a){sjcl.random.addEntropy([a.x||
|
||||
a.clientX||a.offsetX,a.y||a.clientY||a.offsetY],2,"mouse")},o:function(){sjcl.random.addEntropy(new Date,2,"loadtime")},K:function(a,b){var c;a=sjcl.random.r[a];var d=[];for(c in a)a.hasOwnProperty(c)&&d.push(a[c]);for(c=0;c<d.length;c++)d[c](b)}};
|
||||
sjcl.json={defaults:{v:1,iter:1E3,ks:128,ts:64,mode:"ccm",adata:"",cipher:"aes"},encrypt:function(a,b,c,d){c=c||{};d=d||{};var e=sjcl.json,f=e.c({iv:sjcl.random.randomWords(4,0)},e.defaults);e.c(f,c);if(typeof f.salt==="string")f.salt=sjcl.codec.base64.toBits(f.salt);if(typeof f.iv==="string")f.iv=sjcl.codec.base64.toBits(f.iv);if(!sjcl.mode[f.mode]||!sjcl.cipher[f.cipher]||typeof a==="string"&&f.iter<=100||f.ts!==64&&f.ts!==96&&f.ts!==128||f.ks!==128&&f.ks!==192&&f.ks!==0x100||f.iv.length<2||f.iv.length>
|
||||
4)throw new sjcl.exception.invalid("json encrypt: invalid parameters");if(typeof a==="string"){c=sjcl.misc.cachedPbkdf2(a,f);a=c.key.slice(0,f.ks/32);f.salt=c.salt}if(typeof b==="string")b=sjcl.codec.utf8String.toBits(b);c=new sjcl.cipher[f.cipher](a);e.c(d,f);d.key=a;f.ct=sjcl.mode[f.mode].encrypt(c,b,f.iv,f.adata,f.tag);return e.encode(e.V(f,e.defaults))},decrypt:function(a,b,c,d){c=c||{};d=d||{};var e=sjcl.json;b=e.c(e.c(e.c({},e.defaults),e.decode(b)),c,true);if(typeof b.salt==="string")b.salt=
|
||||
sjcl.codec.base64.toBits(b.salt);if(typeof b.iv==="string")b.iv=sjcl.codec.base64.toBits(b.iv);if(!sjcl.mode[b.mode]||!sjcl.cipher[b.cipher]||typeof a==="string"&&b.iter<=100||b.ts!==64&&b.ts!==96&&b.ts!==128||b.ks!==128&&b.ks!==192&&b.ks!==0x100||!b.iv||b.iv.length<2||b.iv.length>4)throw new sjcl.exception.invalid("json decrypt: invalid parameters");if(typeof a==="string"){c=sjcl.misc.cachedPbkdf2(a,b);a=c.key.slice(0,b.ks/32);b.salt=c.salt}c=new sjcl.cipher[b.cipher](a);c=sjcl.mode[b.mode].decrypt(c,
|
||||
b.ct,b.iv,b.adata,b.tag);e.c(d,b);d.key=a;return sjcl.codec.utf8String.fromBits(c)},encode:function(a){var b,c="{",d="";for(b in a)if(a.hasOwnProperty(b)){if(!b.match(/^[a-z0-9]+$/i))throw new sjcl.exception.invalid("json encode: invalid property name");c+=d+b+":";d=",";switch(typeof a[b]){case "number":case "boolean":c+=a[b];break;case "string":c+='"'+escape(a[b])+'"';break;case "object":c+='"'+sjcl.codec.base64.fromBits(a[b],1)+'"';break;default:throw new sjcl.exception.bug("json encode: unsupported type");
|
||||
}}return c+"}"},decode:function(a){a=a.replace(/\s/g,"");if(!a.match(/^\{.*\}$/))throw new sjcl.exception.invalid("json decode: this isn't json!");a=a.replace(/^\{|\}$/g,"").split(/,/);var b={},c,d;for(c=0;c<a.length;c++){if(!(d=a[c].match(/^([a-z][a-z0-9]*):(?:(\d+)|"([a-z0-9+\/%*_.@=\-]*)")$/i)))throw new sjcl.exception.invalid("json decode: this isn't json!");b[d[1]]=d[2]?parseInt(d[2],10):d[1].match(/^(ct|salt|iv)$/)?sjcl.codec.base64.toBits(d[3]):unescape(d[3])}return b},c:function(a,b,c){if(a===
|
||||
undefined)a={};if(b===undefined)return a;var d;for(d in b)if(b.hasOwnProperty(d)){if(c&&a[d]!==undefined&&a[d]!==b[d])throw new sjcl.exception.invalid("required parameter overridden");a[d]=b[d]}return a},V:function(a,b){var c={},d;for(d in a)if(a.hasOwnProperty(d)&&a[d]!==b[d])c[d]=a[d];return c},W:function(a,b){var c={},d;for(d=0;d<b.length;d++)if(a[b[d]]!==undefined)c[b[d]]=a[b[d]];return c}};sjcl.encrypt=sjcl.json.encrypt;sjcl.decrypt=sjcl.json.decrypt;sjcl.misc.S={};
|
||||
sjcl.misc.cachedPbkdf2=function(a,b){var c=sjcl.misc.S,d;b=b||{};d=b.iter||1E3;c=c[a]=c[a]||{};d=c[d]=c[d]||{firstSalt:b.salt&&b.salt.length?b.salt.slice(0):sjcl.random.randomWords(2,0)};c=b.salt===undefined?d.firstSalt:b.salt;d[c]=d[c]||sjcl.misc.pbkdf2(a,c,b.iter);return{key:d[c].slice(0),salt:c.slice(0)}};
|
||||
|
||||
|
||||
var browserUtil = {
|
||||
isRhino: true,
|
||||
|
||||
pauseAndThen: function (cb) { cb(); },
|
||||
|
||||
cpsIterate: function (f, start, end, pause, callback) {
|
||||
function go() {
|
||||
var called = false;
|
||||
if (start >= end) {
|
||||
callback && callback();
|
||||
} else {
|
||||
f(start, function () {
|
||||
if (!called) { called = true; start++; go(); }
|
||||
});
|
||||
}
|
||||
}
|
||||
go (start);
|
||||
},
|
||||
|
||||
cpsMap: function (map, list, pause, callback) {
|
||||
browserUtil.cpsIterate(function (i, cb) { map(list[i], i, list.length, cb); },
|
||||
0, list.length, pause, callback);
|
||||
},
|
||||
|
||||
loadScripts: function(scriptNames, callback) {
|
||||
for (i=0; i<scriptNames.length; i++) {
|
||||
load(scriptNames[i]);
|
||||
callback && callback();
|
||||
}
|
||||
},
|
||||
|
||||
write: function(type, message) {
|
||||
print(message);
|
||||
return { update: function (type2, message2) {
|
||||
if (type2 === 'pass') { print(" + " + message2); }
|
||||
else if (type2 === 'unimplemented') { print(" ? " + message2); }
|
||||
else { print(" - " + message2); }
|
||||
}};
|
||||
},
|
||||
|
||||
writeNewline: function () { print(""); },
|
||||
|
||||
status: function(message) {}
|
||||
};
|
||||
|
||||
sjcl.test = { vector: {}, all: {} };
|
||||
|
||||
/* A bit of a hack. Because sjcl.test will be reloaded several times
|
||||
* for different variants of sjcl, but browserUtils will not, this
|
||||
* variable keeps a permanent record of whether anything has failed.
|
||||
*/
|
||||
if (typeof browserUtil.allPassed === 'undefined') {
|
||||
browserUtil.allPassed = true;
|
||||
}
|
||||
|
||||
sjcl.test.TestCase = function(name, doRun) {
|
||||
this.doRun = doRun;
|
||||
this.name = name;
|
||||
this.passes = 0;
|
||||
this.failures = 0;
|
||||
this.isUnimplemented = false;
|
||||
sjcl.test.all[name] = this;
|
||||
};
|
||||
|
||||
sjcl.test.TestCase.prototype = {
|
||||
/** Pass some subtest of this test */
|
||||
pass: function () { this.passes ++; },
|
||||
|
||||
/** Fail some subtest of this test */
|
||||
fail: function (message) {
|
||||
if (message !== undefined) {
|
||||
this.log("fail", "*** FAIL *** " + this.name + ": " + message);
|
||||
} else {
|
||||
this.log("fail", "*** FAIL *** " + this.name);
|
||||
}
|
||||
this.failures ++;
|
||||
browserUtil.allPassed = false;
|
||||
},
|
||||
|
||||
unimplemented: function() {
|
||||
this.isUnimplemented = true;
|
||||
},
|
||||
|
||||
/** Log a message to the console */
|
||||
log: browserUtil.write,
|
||||
|
||||
/** Require that the first argument is true; otherwise fail with the given message */
|
||||
require: function (bool, message) {
|
||||
if (bool) {
|
||||
this.pass();
|
||||
} else if (message !== undefined) {
|
||||
this.fail(message);
|
||||
} else {
|
||||
this.fail("requirement failed");
|
||||
}
|
||||
},
|
||||
|
||||
/** Pause and then take the specified action. */
|
||||
pauseAndThen: browserUtil.pauseAndThen,
|
||||
|
||||
/** Continuation-passing-style iteration */
|
||||
cpsIterate: browserUtil.cpsIterate,
|
||||
|
||||
/** Continuation-passing-style iteration */
|
||||
cpsMap: browserUtil.cpsMap,
|
||||
|
||||
/** Report the results of this test. */
|
||||
report: function (repo) {
|
||||
var t = (new Date()).valueOf() - this.startTime;
|
||||
if (this.failures !== 0) {
|
||||
repo.update("fail", "failed " + this.failures + " / " +
|
||||
(this.passes + this.failures) + " tests. (" + t + " ms)");
|
||||
} else if (this.passes === 1) {
|
||||
repo.update("pass", "passed. (" + t + " ms)");
|
||||
} else if (this.isUnimplemented) {
|
||||
repo.update("unimplemented", "unimplemented");
|
||||
} else {
|
||||
repo.update("pass", "passed all " + this.passes + " tests. (" + t + " ms)");
|
||||
}
|
||||
browserUtil.writeNewline();
|
||||
},
|
||||
|
||||
|
||||
/** Run the test. */
|
||||
run: function (ntests, i, cb) {
|
||||
var thiz = this;
|
||||
this.startTime = (new Date()).valueOf();
|
||||
this.pauseAndThen(function () {
|
||||
thiz.doRun(function () {
|
||||
cb && cb();
|
||||
})
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
// pass a list of tests to run, or pass nothing and it will run them all
|
||||
sjcl.test.run = function (tests, callback) {
|
||||
var t;
|
||||
|
||||
if (tests === undefined || tests.length == 0) {
|
||||
tests = [];
|
||||
for (t in sjcl.test.all) {
|
||||
if (sjcl.test.all.hasOwnProperty(t)) {
|
||||
tests.push(t);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
browserUtil.cpsMap(function (t, i, n, cb) {
|
||||
sjcl.test.all[tests[i]].run(n, i+1, cb);
|
||||
}, tests, true, callback);
|
||||
};
|
||||
|
||||
/* Several test scripts rely on sjcl.codec.hex to parse their test
|
||||
* vectors, but we are not guaranteed that sjcl.codec.hex is
|
||||
* implemented.
|
||||
*/
|
||||
sjcl.codec = sjcl.codec || {};
|
||||
sjcl.codec.hex = sjcl.codec.hex ||
|
||||
{
|
||||
fromBits: function (arr) {
|
||||
var out = "", i, x;
|
||||
for (i=0; i<arr.length; i++) {
|
||||
out += ((arr[i]|0)+0xF00000000000).toString(16).substr(4);
|
||||
}
|
||||
return out.substr(0, sjcl.bitArray.bitLength(arr)/4);//.replace(/(.{8})/g, "$1 ");
|
||||
},
|
||||
toBits: function (str) {
|
||||
var i, out=[], len;
|
||||
str = str.replace(/\s|0x/g, "");
|
||||
len = str.length;
|
||||
str = str + "00000000";
|
||||
for (i=0; i<str.length; i+=8) {
|
||||
out.push(parseInt(str.substr(i,8),16)^0);
|
||||
}
|
||||
return sjcl.bitArray.clamp(out, len*4);
|
||||
}
|
||||
};
|
||||
|
|
@ -0,0 +1,20 @@
|
|||
/* From http://www.cryptosys.net/manapi/api_PBE_Kdf2.html */
|
||||
|
||||
new sjcl.test.TestCase("PBKDF2", function (cb) {
|
||||
if (!sjcl.misc.pbkdf2 || !sjcl.misc.hmac || !sjcl.hash.sha256) {
|
||||
this.unimplemented();
|
||||
cb && cb();
|
||||
return;
|
||||
}
|
||||
|
||||
//XXX use 8 inputs, not 8 iterations
|
||||
for (var index = 0; index < 8; index++) {
|
||||
var h = sjcl.codec.hex, password = "password", salt = "78 57 8E 5A 5D 63 CB 06", count = 2048, output,
|
||||
goodOutput = "97b5a91d35af542324881315c4f849e327c4707d1bc9d322";
|
||||
output = sjcl.misc.pbkdf2(password, h.toBits(salt), count);
|
||||
output = h.fromBits(output);
|
||||
this.require(output.substr(0,goodOutput.length) == goodOutput);
|
||||
cb && cb();
|
||||
}
|
||||
});
|
||||
sjcl.test.run();
|
|
@ -0,0 +1,223 @@
|
|||
"use strict";
|
||||
|
||||
var sjcl={cipher:{},hash:{},mode:{},misc:{},codec:{},exception:{corrupt:function(a){this.toString=function(){return"CORRUPT: "+this.message};this.message=a},invalid:function(a){this.toString=function(){return"INVALID: "+this.message};this.message=a},bug:function(a){this.toString=function(){return"BUG: "+this.message};this.message=a}}};
|
||||
sjcl.cipher.aes=function(a){this.h[0][0][0]||this.w();var b,c,d,e,f=this.h[0][4],g=this.h[1];b=a.length;var h=1;if(b!==4&&b!==6&&b!==8)throw new sjcl.exception.invalid("invalid aes key size");this.a=[d=a.slice(0),e=[]];for(a=b;a<4*b+28;a++){c=d[a-1];if(a%b===0||b===8&&a%b===4){c=f[c>>>24]<<24^f[c>>16&255]<<16^f[c>>8&255]<<8^f[c&255];if(a%b===0){c=c<<8^c>>>24^h<<24;h=h<<1^(h>>7)*283}}d[a]=d[a-b]^c}for(b=0;a;b++,a--){c=d[b&3?a:a-4];e[b]=a<=4||b<4?c:g[0][f[c>>>24]]^g[1][f[c>>16&255]]^g[2][f[c>>8&255]]^
|
||||
g[3][f[c&255]]}};
|
||||
sjcl.cipher.aes.prototype={encrypt:function(a){return this.H(a,0)},decrypt:function(a){return this.H(a,1)},h:[[[],[],[],[],[]],[[],[],[],[],[]]],w:function(){var a=this.h[0],b=this.h[1],c=a[4],d=b[4],e,f,g,h=[],i=[],k,j,l,m;for(e=0;e<0x100;e++)i[(h[e]=e<<1^(e>>7)*283)^e]=e;for(f=g=0;!c[f];f^=k||1,g=i[g]||1){l=g^g<<1^g<<2^g<<3^g<<4;l=l>>8^l&255^99;c[f]=l;d[l]=f;j=h[e=h[k=h[f]]];m=j*0x1010101^e*0x10001^k*0x101^f*0x1010100;j=h[l]*0x101^l*0x1010100;for(e=0;e<4;e++){a[e][f]=j=j<<24^j>>>8;b[e][l]=m=m<<24^m>>>8}}for(e=
|
||||
0;e<5;e++){a[e]=a[e].slice(0);b[e]=b[e].slice(0)}},H:function(a,b){if(a.length!==4)throw new sjcl.exception.invalid("invalid aes block size");var c=this.a[b],d=a[0]^c[0],e=a[b?3:1]^c[1],f=a[2]^c[2];a=a[b?1:3]^c[3];var g,h,i,k=c.length/4-2,j,l=4,m=[0,0,0,0];g=this.h[b];var n=g[0],o=g[1],p=g[2],q=g[3],r=g[4];for(j=0;j<k;j++){g=n[d>>>24]^o[e>>16&255]^p[f>>8&255]^q[a&255]^c[l];h=n[e>>>24]^o[f>>16&255]^p[a>>8&255]^q[d&255]^c[l+1];i=n[f>>>24]^o[a>>16&255]^p[d>>8&255]^q[e&255]^c[l+2];a=n[a>>>24]^o[d>>16&
|
||||
255]^p[e>>8&255]^q[f&255]^c[l+3];l+=4;d=g;e=h;f=i}for(j=0;j<4;j++){m[b?3&-j:j]=r[d>>>24]<<24^r[e>>16&255]<<16^r[f>>8&255]<<8^r[a&255]^c[l++];g=d;d=e;e=f;f=a;a=g}return m}};
|
||||
sjcl.bitArray={bitSlice:function(a,b,c){a=sjcl.bitArray.P(a.slice(b/32),32-(b&31)).slice(1);return c===undefined?a:sjcl.bitArray.clamp(a,c-b)},concat:function(a,b){if(a.length===0||b.length===0)return a.concat(b);var c=a[a.length-1],d=sjcl.bitArray.getPartial(c);return d===32?a.concat(b):sjcl.bitArray.P(b,d,c|0,a.slice(0,a.length-1))},bitLength:function(a){var b=a.length;if(b===0)return 0;return(b-1)*32+sjcl.bitArray.getPartial(a[b-1])},clamp:function(a,b){if(a.length*32<b)return a;a=a.slice(0,Math.ceil(b/
|
||||
32));var c=a.length;b&=31;if(c>0&&b)a[c-1]=sjcl.bitArray.partial(b,a[c-1]&2147483648>>b-1,1);return a},partial:function(a,b,c){if(a===32)return b;return(c?b|0:b<<32-a)+a*0x10000000000},getPartial:function(a){return Math.round(a/0x10000000000)||32},equal:function(a,b){if(sjcl.bitArray.bitLength(a)!==sjcl.bitArray.bitLength(b))return false;var c=0,d;for(d=0;d<a.length;d++)c|=a[d]^b[d];return c===0},P:function(a,b,c,d){var e;e=0;if(d===undefined)d=[];for(;b>=32;b-=32){d.push(c);c=0}if(b===0)return d.concat(a);
|
||||
for(e=0;e<a.length;e++){d.push(c|a[e]>>>b);c=a[e]<<32-b}e=a.length?a[a.length-1]:0;a=sjcl.bitArray.getPartial(e);d.push(sjcl.bitArray.partial(b+a&31,b+a>32?c:d.pop(),1));return d},k:function(a,b){return[a[0]^b[0],a[1]^b[1],a[2]^b[2],a[3]^b[3]]}};
|
||||
sjcl.codec.utf8String={fromBits:function(a){var b="",c=sjcl.bitArray.bitLength(a),d,e;for(d=0;d<c/8;d++){if((d&3)===0)e=a[d/4];b+=String.fromCharCode(e>>>24);e<<=8}return decodeURIComponent(escape(b))},toBits:function(a){a=unescape(encodeURIComponent(a));var b=[],c,d=0;for(c=0;c<a.length;c++){d=d<<8|a.charCodeAt(c);if((c&3)===3){b.push(d);d=0}}c&3&&b.push(sjcl.bitArray.partial(8*(c&3),d));return b}};
|
||||
sjcl.codec.hex={fromBits:function(a){var b="",c;for(c=0;c<a.length;c++)b+=((a[c]|0)+0xf00000000000).toString(16).substr(4);return b.substr(0,sjcl.bitArray.bitLength(a)/4)},toBits:function(a){var b,c=[],d;a=a.replace(/\s|0x/g,"");d=a.length;a+="00000000";for(b=0;b<a.length;b+=8)c.push(parseInt(a.substr(b,8),16)^0);return sjcl.bitArray.clamp(c,d*4)}};
|
||||
sjcl.codec.base64={D:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",fromBits:function(a,b){var c="",d,e=0,f=sjcl.codec.base64.D,g=0,h=sjcl.bitArray.bitLength(a);for(d=0;c.length*6<h;){c+=f.charAt((g^a[d]>>>e)>>>26);if(e<6){g=a[d]<<6-e;e+=26;d++}else{g<<=6;e-=6}}for(;c.length&3&&!b;)c+="=";return c},toBits:function(a){a=a.replace(/\s|=/g,"");var b=[],c,d=0,e=sjcl.codec.base64.D,f=0,g;for(c=0;c<a.length;c++){g=e.indexOf(a.charAt(c));if(g<0)throw new sjcl.exception.invalid("this isn't base64!");
|
||||
if(d>26){d-=26;b.push(f^g>>>d);f=g<<32-d}else{d+=6;f^=g<<32-d}}d&56&&b.push(sjcl.bitArray.partial(d&56,f,1));return b}};sjcl.hash.sha256=function(a){this.a[0]||this.w();if(a){this.n=a.n.slice(0);this.i=a.i.slice(0);this.e=a.e}else this.reset()};sjcl.hash.sha256.hash=function(a){return(new sjcl.hash.sha256).update(a).finalize()};
|
||||
sjcl.hash.sha256.prototype={blockSize:512,reset:function(){this.n=this.N.slice(0);this.i=[];this.e=0;return this},update:function(a){if(typeof a==="string")a=sjcl.codec.utf8String.toBits(a);var b,c=this.i=sjcl.bitArray.concat(this.i,a);b=this.e;a=this.e=b+sjcl.bitArray.bitLength(a);for(b=512+b&-512;b<=a;b+=512)this.C(c.splice(0,16));return this},finalize:function(){var a,b=this.i,c=this.n;b=sjcl.bitArray.concat(b,[sjcl.bitArray.partial(1,1)]);for(a=b.length+2;a&15;a++)b.push(0);b.push(Math.floor(this.e/
|
||||
4294967296));for(b.push(this.e|0);b.length;)this.C(b.splice(0,16));this.reset();return c},N:[],a:[],w:function(){function a(e){return(e-Math.floor(e))*0x100000000|0}var b=0,c=2,d;a:for(;b<64;c++){for(d=2;d*d<=c;d++)if(c%d===0)continue a;if(b<8)this.N[b]=a(Math.pow(c,0.5));this.a[b]=a(Math.pow(c,1/3));b++}},C:function(a){var b,c,d=a.slice(0),e=this.n,f=this.a,g=e[0],h=e[1],i=e[2],k=e[3],j=e[4],l=e[5],m=e[6],n=e[7];for(a=0;a<64;a++){if(a<16)b=d[a];else{b=d[a+1&15];c=d[a+14&15];b=d[a&15]=(b>>>7^b>>>18^
|
||||
b>>>3^b<<25^b<<14)+(c>>>17^c>>>19^c>>>10^c<<15^c<<13)+d[a&15]+d[a+9&15]|0}b=b+n+(j>>>6^j>>>11^j>>>25^j<<26^j<<21^j<<7)+(m^j&(l^m))+f[a];n=m;m=l;l=j;j=k+b|0;k=i;i=h;h=g;g=b+(h&i^k&(h^i))+(h>>>2^h>>>13^h>>>22^h<<30^h<<19^h<<10)|0}e[0]=e[0]+g|0;e[1]=e[1]+h|0;e[2]=e[2]+i|0;e[3]=e[3]+k|0;e[4]=e[4]+j|0;e[5]=e[5]+l|0;e[6]=e[6]+m|0;e[7]=e[7]+n|0}};
|
||||
sjcl.mode.ccm={name:"ccm",encrypt:function(a,b,c,d,e){var f,g=b.slice(0),h=sjcl.bitArray,i=h.bitLength(c)/8,k=h.bitLength(g)/8;e=e||64;d=d||[];if(i<7)throw new sjcl.exception.invalid("ccm: iv must be at least 7 bytes");for(f=2;f<4&&k>>>8*f;f++);if(f<15-i)f=15-i;c=h.clamp(c,8*(15-f));b=sjcl.mode.ccm.G(a,b,c,d,e,f);g=sjcl.mode.ccm.I(a,g,c,b,e,f);return h.concat(g.data,g.tag)},decrypt:function(a,b,c,d,e){e=e||64;d=d||[];var f=sjcl.bitArray,g=f.bitLength(c)/8,h=f.bitLength(b),i=f.clamp(b,h-e),k=f.bitSlice(b,
|
||||
h-e);h=(h-e)/8;if(g<7)throw new sjcl.exception.invalid("ccm: iv must be at least 7 bytes");for(b=2;b<4&&h>>>8*b;b++);if(b<15-g)b=15-g;c=f.clamp(c,8*(15-b));i=sjcl.mode.ccm.I(a,i,c,k,e,b);a=sjcl.mode.ccm.G(a,i.data,c,d,e,b);if(!f.equal(i.tag,a))throw new sjcl.exception.corrupt("ccm: tag doesn't match");return i.data},G:function(a,b,c,d,e,f){var g=[],h=sjcl.bitArray,i=h.k;e/=8;if(e%2||e<4||e>16)throw new sjcl.exception.invalid("ccm: invalid tag length");if(d.length>0xffffffff||b.length>0xffffffff)throw new sjcl.exception.bug("ccm: can't deal with 4GiB or more data");
|
||||
f=[h.partial(8,(d.length?64:0)|e-2<<2|f-1)];f=h.concat(f,c);f[3]|=h.bitLength(b)/8;f=a.encrypt(f);if(d.length){c=h.bitLength(d)/8;if(c<=65279)g=[h.partial(16,c)];else if(c<=0xffffffff)g=h.concat([h.partial(16,65534)],[c]);g=h.concat(g,d);for(d=0;d<g.length;d+=4)f=a.encrypt(i(f,g.slice(d,d+4)))}for(d=0;d<b.length;d+=4)f=a.encrypt(i(f,b.slice(d,d+4)));return h.clamp(f,e*8)},I:function(a,b,c,d,e,f){var g,h=sjcl.bitArray;g=h.k;var i=b.length,k=h.bitLength(b);c=h.concat([h.partial(8,f-1)],c).concat([0,
|
||||
0,0]).slice(0,4);d=h.bitSlice(g(d,a.encrypt(c)),0,e);if(!i)return{tag:d,data:[]};for(g=0;g<i;g+=4){c[3]++;e=a.encrypt(c);b[g]^=e[0];b[g+1]^=e[1];b[g+2]^=e[2];b[g+3]^=e[3]}return{tag:d,data:h.clamp(b,k)}}};
|
||||
sjcl.mode.ocb2={name:"ocb2",encrypt:function(a,b,c,d,e,f){if(sjcl.bitArray.bitLength(c)!==128)throw new sjcl.exception.invalid("ocb iv must be 128 bits");var g,h=sjcl.mode.ocb2.A,i=sjcl.bitArray,k=i.k,j=[0,0,0,0];c=h(a.encrypt(c));var l,m=[];d=d||[];e=e||64;for(g=0;g+4<b.length;g+=4){l=b.slice(g,g+4);j=k(j,l);m=m.concat(k(c,a.encrypt(k(c,l))));c=h(c)}l=b.slice(g);b=i.bitLength(l);g=a.encrypt(k(c,[0,0,0,b]));l=i.clamp(k(l,g),b);j=k(j,k(l,g));j=a.encrypt(k(j,k(c,h(c))));if(d.length)j=k(j,f?d:sjcl.mode.ocb2.pmac(a,
|
||||
d));return m.concat(i.concat(l,i.clamp(j,e)))},decrypt:function(a,b,c,d,e,f){if(sjcl.bitArray.bitLength(c)!==128)throw new sjcl.exception.invalid("ocb iv must be 128 bits");e=e||64;var g=sjcl.mode.ocb2.A,h=sjcl.bitArray,i=h.k,k=[0,0,0,0],j=g(a.encrypt(c)),l,m,n=sjcl.bitArray.bitLength(b)-e,o=[];d=d||[];for(c=0;c+4<n/32;c+=4){l=i(j,a.decrypt(i(j,b.slice(c,c+4))));k=i(k,l);o=o.concat(l);j=g(j)}m=n-c*32;l=a.encrypt(i(j,[0,0,0,m]));l=i(l,h.clamp(b.slice(c),m));k=i(k,l);k=a.encrypt(i(k,i(j,g(j))));if(d.length)k=
|
||||
i(k,f?d:sjcl.mode.ocb2.pmac(a,d));if(!h.equal(h.clamp(k,e),h.bitSlice(b,n)))throw new sjcl.exception.corrupt("ocb: tag doesn't match");return o.concat(h.clamp(l,m))},pmac:function(a,b){var c,d=sjcl.mode.ocb2.A,e=sjcl.bitArray,f=e.k,g=[0,0,0,0],h=a.encrypt([0,0,0,0]);h=f(h,d(d(h)));for(c=0;c+4<b.length;c+=4){h=d(h);g=f(g,a.encrypt(f(h,b.slice(c,c+4))))}b=b.slice(c);if(e.bitLength(b)<128){h=f(h,d(h));b=e.concat(b,[2147483648|0])}g=f(g,b);return a.encrypt(f(d(f(h,d(h))),g))},A:function(a){return[a[0]<<
|
||||
1^a[1]>>>31,a[1]<<1^a[2]>>>31,a[2]<<1^a[3]>>>31,a[3]<<1^(a[0]>>>31)*135]}};sjcl.misc.hmac=function(a,b){this.M=b=b||sjcl.hash.sha256;var c=[[],[]],d=b.prototype.blockSize/32;this.l=[new b,new b];if(a.length>d)a=b.hash(a);for(b=0;b<d;b++){c[0][b]=a[b]^909522486;c[1][b]=a[b]^1549556828}this.l[0].update(c[0]);this.l[1].update(c[1])};sjcl.misc.hmac.prototype.encrypt=sjcl.misc.hmac.prototype.mac=function(a,b){a=(new this.M(this.l[0])).update(a,b).finalize();return(new this.M(this.l[1])).update(a).finalize()};
|
||||
sjcl.misc.pbkdf2=function(a,b,c,d,e){c=c||1E3;if(d<0||c<0)throw sjcl.exception.invalid("invalid params to pbkdf2");if(typeof a==="string")a=sjcl.codec.utf8String.toBits(a);e=e||sjcl.misc.hmac;a=new e(a);var f,g,h,i,k=[],j=sjcl.bitArray;for(i=1;32*k.length<(d||1);i++){e=f=a.encrypt(j.concat(b,[i]));for(g=1;g<c;g++){f=a.encrypt(f);for(h=0;h<f.length;h++)e[h]^=f[h]}k=k.concat(e)}if(d)k=j.clamp(k,d);return k};
|
||||
sjcl.random={randomWords:function(a,b){var c=[];b=this.isReady(b);var d;if(b===0)throw new sjcl.exception.notready("generator isn't seeded");else b&2&&this.U(!(b&1));for(b=0;b<a;b+=4){(b+1)%0x10000===0&&this.L();d=this.u();c.push(d[0],d[1],d[2],d[3])}this.L();return c.slice(0,a)},setDefaultParanoia:function(a){this.t=a},addEntropy:function(a,b,c){c=c||"user";var d,e,f=(new Date).valueOf(),g=this.q[c],h=this.isReady();d=this.F[c];if(d===undefined)d=this.F[c]=this.R++;if(g===undefined)g=this.q[c]=0;this.q[c]=
|
||||
(this.q[c]+1)%this.b.length;switch(typeof a){case "number":break;case "object":if(b===undefined)for(c=b=0;c<a.length;c++)for(e=a[c];e>0;){b++;e>>>=1}this.b[g].update([d,this.J++,2,b,f,a.length].concat(a));break;case "string":if(b===undefined)b=a.length;this.b[g].update([d,this.J++,3,b,f,a.length]);this.b[g].update(a);break;default:throw new sjcl.exception.bug("random: addEntropy only supports number, array or string");}this.j[g]+=b;this.f+=b;if(h===0){this.isReady()!==0&&this.K("seeded",Math.max(this.g,
|
||||
this.f));this.K("progress",this.getProgress())}},isReady:function(a){a=this.B[a!==undefined?a:this.t];return this.g&&this.g>=a?this.j[0]>80&&(new Date).valueOf()>this.O?3:1:this.f>=a?2:0},getProgress:function(a){a=this.B[a?a:this.t];return this.g>=a?1["0"]:this.f>a?1["0"]:this.f/a},startCollectors:function(){if(!this.m){if(window.addEventListener){window.addEventListener("load",this.o,false);window.addEventListener("mousemove",this.p,false)}else if(document.attachEvent){document.attachEvent("onload",
|
||||
this.o);document.attachEvent("onmousemove",this.p)}else throw new sjcl.exception.bug("can't attach event");this.m=true}},stopCollectors:function(){if(this.m){if(window.removeEventListener){window.removeEventListener("load",this.o);window.removeEventListener("mousemove",this.p)}else if(window.detachEvent){window.detachEvent("onload",this.o);window.detachEvent("onmousemove",this.p)}this.m=false}},addEventListener:function(a,b){this.r[a][this.Q++]=b},removeEventListener:function(a,b){var c;a=this.r[a];
|
||||
var d=[];for(c in a)a.hasOwnProperty[c]&&a[c]===b&&d.push(c);for(b=0;b<d.length;b++){c=d[b];delete a[c]}},b:[new sjcl.hash.sha256],j:[0],z:0,q:{},J:0,F:{},R:0,g:0,f:0,O:0,a:[0,0,0,0,0,0,0,0],d:[0,0,0,0],s:undefined,t:6,m:false,r:{progress:{},seeded:{}},Q:0,B:[0,48,64,96,128,192,0x100,384,512,768,1024],u:function(){for(var a=0;a<4;a++){this.d[a]=this.d[a]+1|0;if(this.d[a])break}return this.s.encrypt(this.d)},L:function(){this.a=this.u().concat(this.u());this.s=new sjcl.cipher.aes(this.a)},T:function(a){this.a=
|
||||
sjcl.hash.sha256.hash(this.a.concat(a));this.s=new sjcl.cipher.aes(this.a);for(a=0;a<4;a++){this.d[a]=this.d[a]+1|0;if(this.d[a])break}},U:function(a){var b=[],c=0,d;this.O=b[0]=(new Date).valueOf()+3E4;for(d=0;d<16;d++)b.push(Math.random()*0x100000000|0);for(d=0;d<this.b.length;d++){b=b.concat(this.b[d].finalize());c+=this.j[d];this.j[d]=0;if(!a&&this.z&1<<d)break}if(this.z>=1<<this.b.length){this.b.push(new sjcl.hash.sha256);this.j.push(0)}this.f-=c;if(c>this.g)this.g=c;this.z++;this.T(b)},p:function(a){sjcl.random.addEntropy([a.x||
|
||||
a.clientX||a.offsetX,a.y||a.clientY||a.offsetY],2,"mouse")},o:function(){sjcl.random.addEntropy(new Date,2,"loadtime")},K:function(a,b){var c;a=sjcl.random.r[a];var d=[];for(c in a)a.hasOwnProperty(c)&&d.push(a[c]);for(c=0;c<d.length;c++)d[c](b)}};
|
||||
sjcl.json={defaults:{v:1,iter:1E3,ks:128,ts:64,mode:"ccm",adata:"",cipher:"aes"},encrypt:function(a,b,c,d){c=c||{};d=d||{};var e=sjcl.json,f=e.c({iv:sjcl.random.randomWords(4,0)},e.defaults);e.c(f,c);if(typeof f.salt==="string")f.salt=sjcl.codec.base64.toBits(f.salt);if(typeof f.iv==="string")f.iv=sjcl.codec.base64.toBits(f.iv);if(!sjcl.mode[f.mode]||!sjcl.cipher[f.cipher]||typeof a==="string"&&f.iter<=100||f.ts!==64&&f.ts!==96&&f.ts!==128||f.ks!==128&&f.ks!==192&&f.ks!==0x100||f.iv.length<2||f.iv.length>
|
||||
4)throw new sjcl.exception.invalid("json encrypt: invalid parameters");if(typeof a==="string"){c=sjcl.misc.cachedPbkdf2(a,f);a=c.key.slice(0,f.ks/32);f.salt=c.salt}if(typeof b==="string")b=sjcl.codec.utf8String.toBits(b);c=new sjcl.cipher[f.cipher](a);e.c(d,f);d.key=a;f.ct=sjcl.mode[f.mode].encrypt(c,b,f.iv,f.adata,f.tag);return e.encode(e.V(f,e.defaults))},decrypt:function(a,b,c,d){c=c||{};d=d||{};var e=sjcl.json;b=e.c(e.c(e.c({},e.defaults),e.decode(b)),c,true);if(typeof b.salt==="string")b.salt=
|
||||
sjcl.codec.base64.toBits(b.salt);if(typeof b.iv==="string")b.iv=sjcl.codec.base64.toBits(b.iv);if(!sjcl.mode[b.mode]||!sjcl.cipher[b.cipher]||typeof a==="string"&&b.iter<=100||b.ts!==64&&b.ts!==96&&b.ts!==128||b.ks!==128&&b.ks!==192&&b.ks!==0x100||!b.iv||b.iv.length<2||b.iv.length>4)throw new sjcl.exception.invalid("json decrypt: invalid parameters");if(typeof a==="string"){c=sjcl.misc.cachedPbkdf2(a,b);a=c.key.slice(0,b.ks/32);b.salt=c.salt}c=new sjcl.cipher[b.cipher](a);c=sjcl.mode[b.mode].decrypt(c,
|
||||
b.ct,b.iv,b.adata,b.tag);e.c(d,b);d.key=a;return sjcl.codec.utf8String.fromBits(c)},encode:function(a){var b,c="{",d="";for(b in a)if(a.hasOwnProperty(b)){if(!b.match(/^[a-z0-9]+$/i))throw new sjcl.exception.invalid("json encode: invalid property name");c+=d+b+":";d=",";switch(typeof a[b]){case "number":case "boolean":c+=a[b];break;case "string":c+='"'+escape(a[b])+'"';break;case "object":c+='"'+sjcl.codec.base64.fromBits(a[b],1)+'"';break;default:throw new sjcl.exception.bug("json encode: unsupported type");
|
||||
}}return c+"}"},decode:function(a){a=a.replace(/\s/g,"");if(!a.match(/^\{.*\}$/))throw new sjcl.exception.invalid("json decode: this isn't json!");a=a.replace(/^\{|\}$/g,"").split(/,/);var b={},c,d;for(c=0;c<a.length;c++){if(!(d=a[c].match(/^([a-z][a-z0-9]*):(?:(\d+)|"([a-z0-9+\/%*_.@=\-]*)")$/i)))throw new sjcl.exception.invalid("json decode: this isn't json!");b[d[1]]=d[2]?parseInt(d[2],10):d[1].match(/^(ct|salt|iv)$/)?sjcl.codec.base64.toBits(d[3]):unescape(d[3])}return b},c:function(a,b,c){if(a===
|
||||
undefined)a={};if(b===undefined)return a;var d;for(d in b)if(b.hasOwnProperty(d)){if(c&&a[d]!==undefined&&a[d]!==b[d])throw new sjcl.exception.invalid("required parameter overridden");a[d]=b[d]}return a},V:function(a,b){var c={},d;for(d in a)if(a.hasOwnProperty(d)&&a[d]!==b[d])c[d]=a[d];return c},W:function(a,b){var c={},d;for(d=0;d<b.length;d++)if(a[b[d]]!==undefined)c[b[d]]=a[b[d]];return c}};sjcl.encrypt=sjcl.json.encrypt;sjcl.decrypt=sjcl.json.decrypt;sjcl.misc.S={};
|
||||
sjcl.misc.cachedPbkdf2=function(a,b){var c=sjcl.misc.S,d;b=b||{};d=b.iter||1E3;c=c[a]=c[a]||{};d=c[d]=c[d]||{firstSalt:b.salt&&b.salt.length?b.salt.slice(0):sjcl.random.randomWords(2,0)};c=b.salt===undefined?d.firstSalt:b.salt;d[c]=d[c]||sjcl.misc.pbkdf2(a,c,b.iter);return{key:d[c].slice(0),salt:c.slice(0)}};
|
||||
|
||||
|
||||
var browserUtil = {
|
||||
isRhino: true,
|
||||
|
||||
pauseAndThen: function (cb) { cb(); },
|
||||
|
||||
cpsIterate: function (f, start, end, pause, callback) {
|
||||
function go() {
|
||||
var called = false;
|
||||
if (start >= end) {
|
||||
callback && callback();
|
||||
} else {
|
||||
f(start, function () {
|
||||
if (!called) { called = true; start++; go(); }
|
||||
});
|
||||
}
|
||||
}
|
||||
go (start);
|
||||
},
|
||||
|
||||
cpsMap: function (map, list, pause, callback) {
|
||||
browserUtil.cpsIterate(function (i, cb) { map(list[i], i, list.length, cb); },
|
||||
0, list.length, pause, callback);
|
||||
},
|
||||
|
||||
loadScripts: function(scriptNames, callback) {
|
||||
for (i=0; i<scriptNames.length; i++) {
|
||||
load(scriptNames[i]);
|
||||
callback && callback();
|
||||
}
|
||||
},
|
||||
|
||||
write: function(type, message) {
|
||||
print(message);
|
||||
return { update: function (type2, message2) {
|
||||
if (type2 === 'pass') { print(" + " + message2); }
|
||||
else if (type2 === 'unimplemented') { print(" ? " + message2); }
|
||||
else { print(" - " + message2); }
|
||||
}};
|
||||
},
|
||||
|
||||
writeNewline: function () { print(""); },
|
||||
|
||||
status: function(message) {}
|
||||
};
|
||||
|
||||
sjcl.test = { vector: {}, all: {} };
|
||||
|
||||
/* A bit of a hack. Because sjcl.test will be reloaded several times
|
||||
* for different variants of sjcl, but browserUtils will not, this
|
||||
* variable keeps a permanent record of whether anything has failed.
|
||||
*/
|
||||
if (typeof browserUtil.allPassed === 'undefined') {
|
||||
browserUtil.allPassed = true;
|
||||
}
|
||||
|
||||
sjcl.test.TestCase = function(name, doRun) {
|
||||
this.doRun = doRun;
|
||||
this.name = name;
|
||||
this.passes = 0;
|
||||
this.failures = 0;
|
||||
this.isUnimplemented = false;
|
||||
sjcl.test.all[name] = this;
|
||||
};
|
||||
|
||||
sjcl.test.TestCase.prototype = {
|
||||
/** Pass some subtest of this test */
|
||||
pass: function () { this.passes ++; },
|
||||
|
||||
/** Fail some subtest of this test */
|
||||
fail: function (message) {
|
||||
if (message !== undefined) {
|
||||
this.log("fail", "*** FAIL *** " + this.name + ": " + message);
|
||||
} else {
|
||||
this.log("fail", "*** FAIL *** " + this.name);
|
||||
}
|
||||
this.failures ++;
|
||||
browserUtil.allPassed = false;
|
||||
},
|
||||
|
||||
unimplemented: function() {
|
||||
this.isUnimplemented = true;
|
||||
},
|
||||
|
||||
/** Log a message to the console */
|
||||
log: browserUtil.write,
|
||||
|
||||
/** Require that the first argument is true; otherwise fail with the given message */
|
||||
require: function (bool, message) {
|
||||
if (bool) {
|
||||
this.pass();
|
||||
} else if (message !== undefined) {
|
||||
this.fail(message);
|
||||
} else {
|
||||
this.fail("requirement failed");
|
||||
}
|
||||
},
|
||||
|
||||
/** Pause and then take the specified action. */
|
||||
pauseAndThen: browserUtil.pauseAndThen,
|
||||
|
||||
/** Continuation-passing-style iteration */
|
||||
cpsIterate: browserUtil.cpsIterate,
|
||||
|
||||
/** Continuation-passing-style iteration */
|
||||
cpsMap: browserUtil.cpsMap,
|
||||
|
||||
/** Report the results of this test. */
|
||||
report: function (repo) {
|
||||
var t = (new Date()).valueOf() - this.startTime;
|
||||
if (this.failures !== 0) {
|
||||
repo.update("fail", "failed " + this.failures + " / " +
|
||||
(this.passes + this.failures) + " tests. (" + t + " ms)");
|
||||
} else if (this.passes === 1) {
|
||||
repo.update("pass", "passed. (" + t + " ms)");
|
||||
} else if (this.isUnimplemented) {
|
||||
repo.update("unimplemented", "unimplemented");
|
||||
} else {
|
||||
repo.update("pass", "passed all " + this.passes + " tests. (" + t + " ms)");
|
||||
}
|
||||
browserUtil.writeNewline();
|
||||
},
|
||||
|
||||
|
||||
/** Run the test. */
|
||||
run: function (ntests, i, cb) {
|
||||
var thiz = this;
|
||||
this.startTime = (new Date()).valueOf();
|
||||
this.pauseAndThen(function () {
|
||||
thiz.doRun(function () {
|
||||
cb && cb();
|
||||
})
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
// pass a list of tests to run, or pass nothing and it will run them all
|
||||
sjcl.test.run = function (tests, callback) {
|
||||
var t;
|
||||
|
||||
if (tests === undefined || tests.length == 0) {
|
||||
tests = [];
|
||||
for (t in sjcl.test.all) {
|
||||
if (sjcl.test.all.hasOwnProperty(t)) {
|
||||
tests.push(t);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
browserUtil.cpsMap(function (t, i, n, cb) {
|
||||
sjcl.test.all[tests[i]].run(n, i+1, cb);
|
||||
}, tests, true, callback);
|
||||
};
|
||||
|
||||
/* Several test scripts rely on sjcl.codec.hex to parse their test
|
||||
* vectors, but we are not guaranteed that sjcl.codec.hex is
|
||||
* implemented.
|
||||
*/
|
||||
sjcl.codec = sjcl.codec || {};
|
||||
sjcl.codec.hex = sjcl.codec.hex ||
|
||||
{
|
||||
fromBits: function (arr) {
|
||||
var out = "", i, x;
|
||||
for (i=0; i<arr.length; i++) {
|
||||
out += ((arr[i]|0)+0xF00000000000).toString(16).substr(4);
|
||||
}
|
||||
return out.substr(0, sjcl.bitArray.bitLength(arr)/4);//.replace(/(.{8})/g, "$1 ");
|
||||
},
|
||||
toBits: function (str) {
|
||||
var i, out=[], len;
|
||||
str = str.replace(/\s|0x/g, "");
|
||||
len = str.length;
|
||||
str = str + "00000000";
|
||||
for (i=0; i<str.length; i+=8) {
|
||||
out.push(parseInt(str.substr(i,8),16)^0);
|
||||
}
|
||||
return sjcl.bitArray.clamp(out, len*4);
|
||||
}
|
||||
};
|
||||
|
||||
sjcl.test.run();
|
|
@ -0,0 +1,36 @@
|
|||
/**
|
||||
* Test SHA-256 using an ad-hoc iterative technique.
|
||||
* This uses a string buffer which has n characters on the nth iteration.
|
||||
* Each iteration, the buffer is hashed and the hash is converted to a string.
|
||||
* The first two characters of the string are prepended to the buffer, then the
|
||||
* last character of the buffer is removed. This way, neither the beginning nor
|
||||
* the end of the buffer is fixed.
|
||||
*
|
||||
* The hashes from each output step are also hashed together into one final hash.
|
||||
* This is compared against a final hash which was computed with SSL.
|
||||
*/
|
||||
|
||||
new sjcl.test.TestCase("SHA-256 iterative", function (cb) {
|
||||
if (!sjcl.hash.sha256) {
|
||||
this.unimplemented();
|
||||
cb && cb();
|
||||
return;
|
||||
}
|
||||
|
||||
var toBeHashed = "", cumulative = new sjcl.hash.sha256(), hash, thiz=this;
|
||||
browserUtil.cpsIterate(function (i, cbb) {
|
||||
for (var n=100*i; n<100*(i+1); n++) {
|
||||
hash = sjcl.hash.sha256.hash(toBeHashed);
|
||||
hash = sjcl.codec.hex.fromBits(hash);
|
||||
cumulative.update(hash);
|
||||
toBeHashed = (hash.substring(0,2)+toBeHashed).substring(0,n+1);
|
||||
}
|
||||
cbb && cbb();
|
||||
}, 0, 10, true, function () {
|
||||
hash = sjcl.codec.hex.fromBits(cumulative.finalize());
|
||||
thiz.require(hash === "f305c76d5d457ddf04f1927166f5e13429407049a5c5f29021916321fcdcd8b4");
|
||||
cb && cb();
|
||||
});
|
||||
});
|
||||
|
||||
sjcl.test.run();
|
|
@ -0,0 +1,337 @@
|
|||
// 3D Cube Rotation
|
||||
// http://www.speich.net/computer/moztesting/3d.htm
|
||||
// Created by Simon Speich
|
||||
|
||||
var Q = new Array();
|
||||
var MTrans = new Array(); // transformation matrix
|
||||
var MQube = new Array(); // position information of qube
|
||||
var I = new Array(); // entity matrix
|
||||
var Origin = new Object();
|
||||
var Testing = new Object();
|
||||
var LoopTimer;
|
||||
|
||||
var DisplArea = new Object();
|
||||
DisplArea.Width = 300;
|
||||
DisplArea.Height = 300;
|
||||
|
||||
function DrawLine(From, To) {
|
||||
var x1 = From.V[0];
|
||||
var x2 = To.V[0];
|
||||
var y1 = From.V[1];
|
||||
var y2 = To.V[1];
|
||||
var dx = Math.abs(x2 - x1);
|
||||
var dy = Math.abs(y2 - y1);
|
||||
var x = x1;
|
||||
var y = y1;
|
||||
var IncX1, IncY1;
|
||||
var IncX2, IncY2;
|
||||
var Den;
|
||||
var Num;
|
||||
var NumAdd;
|
||||
var NumPix;
|
||||
|
||||
if (x2 >= x1) { IncX1 = 1; IncX2 = 1; }
|
||||
else { IncX1 = -1; IncX2 = -1; }
|
||||
if (y2 >= y1) { IncY1 = 1; IncY2 = 1; }
|
||||
else { IncY1 = -1; IncY2 = -1; }
|
||||
if (dx >= dy) {
|
||||
IncX1 = 0;
|
||||
IncY2 = 0;
|
||||
Den = dx;
|
||||
Num = dx / 2;
|
||||
NumAdd = dy;
|
||||
NumPix = dx;
|
||||
}
|
||||
else {
|
||||
IncX2 = 0;
|
||||
IncY1 = 0;
|
||||
Den = dy;
|
||||
Num = dy / 2;
|
||||
NumAdd = dx;
|
||||
NumPix = dy;
|
||||
}
|
||||
|
||||
NumPix = Math.round(Q.LastPx + NumPix);
|
||||
|
||||
var i = Q.LastPx;
|
||||
for (; i < NumPix; i++) {
|
||||
Num += NumAdd;
|
||||
if (Num >= Den) {
|
||||
Num -= Den;
|
||||
x += IncX1;
|
||||
y += IncY1;
|
||||
}
|
||||
x += IncX2;
|
||||
y += IncY2;
|
||||
}
|
||||
Q.LastPx = NumPix;
|
||||
}
|
||||
|
||||
function CalcCross(V0, V1) {
|
||||
var Cross = new Array();
|
||||
Cross[0] = V0[1]*V1[2] - V0[2]*V1[1];
|
||||
Cross[1] = V0[2]*V1[0] - V0[0]*V1[2];
|
||||
Cross[2] = V0[0]*V1[1] - V0[1]*V1[0];
|
||||
return Cross;
|
||||
}
|
||||
|
||||
function CalcNormal(V0, V1, V2) {
|
||||
var A = new Array(); var B = new Array();
|
||||
for (var i = 0; i < 3; i++) {
|
||||
A[i] = V0[i] - V1[i];
|
||||
B[i] = V2[i] - V1[i];
|
||||
}
|
||||
A = CalcCross(A, B);
|
||||
var Length = Math.sqrt(A[0]*A[0] + A[1]*A[1] + A[2]*A[2]);
|
||||
for (var i = 0; i < 3; i++) A[i] = A[i] / Length;
|
||||
A[3] = 1;
|
||||
return A;
|
||||
}
|
||||
|
||||
function CreateP(X,Y,Z) {
|
||||
this.V = [X,Y,Z,1];
|
||||
}
|
||||
|
||||
// multiplies two matrices
|
||||
function MMulti(M1, M2) {
|
||||
var M = [[],[],[],[]];
|
||||
var i = 0;
|
||||
var j = 0;
|
||||
for (; i < 4; i++) {
|
||||
j = 0;
|
||||
for (; j < 4; j++) M[i][j] = M1[i][0] * M2[0][j] + M1[i][1] * M2[1][j] + M1[i][2] * M2[2][j] + M1[i][3] * M2[3][j];
|
||||
}
|
||||
return M;
|
||||
}
|
||||
|
||||
//multiplies matrix with vector
|
||||
function VMulti(M, V) {
|
||||
var Vect = new Array();
|
||||
var i = 0;
|
||||
for (;i < 4; i++) Vect[i] = M[i][0] * V[0] + M[i][1] * V[1] + M[i][2] * V[2] + M[i][3] * V[3];
|
||||
return Vect;
|
||||
}
|
||||
|
||||
function VMulti2(M, V) {
|
||||
var Vect = new Array();
|
||||
var i = 0;
|
||||
for (;i < 3; i++) Vect[i] = M[i][0] * V[0] + M[i][1] * V[1] + M[i][2] * V[2];
|
||||
return Vect;
|
||||
}
|
||||
|
||||
// add to matrices
|
||||
function MAdd(M1, M2) {
|
||||
var M = [[],[],[],[]];
|
||||
var i = 0;
|
||||
var j = 0;
|
||||
for (; i < 4; i++) {
|
||||
j = 0;
|
||||
for (; j < 4; j++) M[i][j] = M1[i][j] + M2[i][j];
|
||||
}
|
||||
return M;
|
||||
}
|
||||
|
||||
function Translate(M, Dx, Dy, Dz) {
|
||||
var T = [
|
||||
[1,0,0,Dx],
|
||||
[0,1,0,Dy],
|
||||
[0,0,1,Dz],
|
||||
[0,0,0,1]
|
||||
];
|
||||
return MMulti(T, M);
|
||||
}
|
||||
|
||||
function RotateX(M, Phi) {
|
||||
var a = Phi;
|
||||
a *= Math.PI / 180;
|
||||
var Cos = Math.cos(a);
|
||||
var Sin = Math.sin(a);
|
||||
var R = [
|
||||
[1,0,0,0],
|
||||
[0,Cos,-Sin,0],
|
||||
[0,Sin,Cos,0],
|
||||
[0,0,0,1]
|
||||
];
|
||||
return MMulti(R, M);
|
||||
}
|
||||
|
||||
function RotateY(M, Phi) {
|
||||
var a = Phi;
|
||||
a *= Math.PI / 180;
|
||||
var Cos = Math.cos(a);
|
||||
var Sin = Math.sin(a);
|
||||
var R = [
|
||||
[Cos,0,Sin,0],
|
||||
[0,1,0,0],
|
||||
[-Sin,0,Cos,0],
|
||||
[0,0,0,1]
|
||||
];
|
||||
return MMulti(R, M);
|
||||
}
|
||||
|
||||
function RotateZ(M, Phi) {
|
||||
var a = Phi;
|
||||
a *= Math.PI / 180;
|
||||
var Cos = Math.cos(a);
|
||||
var Sin = Math.sin(a);
|
||||
var R = [
|
||||
[Cos,-Sin,0,0],
|
||||
[Sin,Cos,0,0],
|
||||
[0,0,1,0],
|
||||
[0,0,0,1]
|
||||
];
|
||||
return MMulti(R, M);
|
||||
}
|
||||
|
||||
function DrawQube() {
|
||||
// calc current normals
|
||||
var CurN = new Array();
|
||||
var i = 5;
|
||||
Q.LastPx = 0;
|
||||
for (; i > -1; i--) CurN[i] = VMulti2(MQube, Q.Normal[i]);
|
||||
if (CurN[0][2] < 0) {
|
||||
if (!Q.Line[0]) { DrawLine(Q[0], Q[1]); Q.Line[0] = true; };
|
||||
if (!Q.Line[1]) { DrawLine(Q[1], Q[2]); Q.Line[1] = true; };
|
||||
if (!Q.Line[2]) { DrawLine(Q[2], Q[3]); Q.Line[2] = true; };
|
||||
if (!Q.Line[3]) { DrawLine(Q[3], Q[0]); Q.Line[3] = true; };
|
||||
}
|
||||
if (CurN[1][2] < 0) {
|
||||
if (!Q.Line[2]) { DrawLine(Q[3], Q[2]); Q.Line[2] = true; };
|
||||
if (!Q.Line[9]) { DrawLine(Q[2], Q[6]); Q.Line[9] = true; };
|
||||
if (!Q.Line[6]) { DrawLine(Q[6], Q[7]); Q.Line[6] = true; };
|
||||
if (!Q.Line[10]) { DrawLine(Q[7], Q[3]); Q.Line[10] = true; };
|
||||
}
|
||||
if (CurN[2][2] < 0) {
|
||||
if (!Q.Line[4]) { DrawLine(Q[4], Q[5]); Q.Line[4] = true; };
|
||||
if (!Q.Line[5]) { DrawLine(Q[5], Q[6]); Q.Line[5] = true; };
|
||||
if (!Q.Line[6]) { DrawLine(Q[6], Q[7]); Q.Line[6] = true; };
|
||||
if (!Q.Line[7]) { DrawLine(Q[7], Q[4]); Q.Line[7] = true; };
|
||||
}
|
||||
if (CurN[3][2] < 0) {
|
||||
if (!Q.Line[4]) { DrawLine(Q[4], Q[5]); Q.Line[4] = true; };
|
||||
if (!Q.Line[8]) { DrawLine(Q[5], Q[1]); Q.Line[8] = true; };
|
||||
if (!Q.Line[0]) { DrawLine(Q[1], Q[0]); Q.Line[0] = true; };
|
||||
if (!Q.Line[11]) { DrawLine(Q[0], Q[4]); Q.Line[11] = true; };
|
||||
}
|
||||
if (CurN[4][2] < 0) {
|
||||
if (!Q.Line[11]) { DrawLine(Q[4], Q[0]); Q.Line[11] = true; };
|
||||
if (!Q.Line[3]) { DrawLine(Q[0], Q[3]); Q.Line[3] = true; };
|
||||
if (!Q.Line[10]) { DrawLine(Q[3], Q[7]); Q.Line[10] = true; };
|
||||
if (!Q.Line[7]) { DrawLine(Q[7], Q[4]); Q.Line[7] = true; };
|
||||
}
|
||||
if (CurN[5][2] < 0) {
|
||||
if (!Q.Line[8]) { DrawLine(Q[1], Q[5]); Q.Line[8] = true; };
|
||||
if (!Q.Line[5]) { DrawLine(Q[5], Q[6]); Q.Line[5] = true; };
|
||||
if (!Q.Line[9]) { DrawLine(Q[6], Q[2]); Q.Line[9] = true; };
|
||||
if (!Q.Line[1]) { DrawLine(Q[2], Q[1]); Q.Line[1] = true; };
|
||||
}
|
||||
Q.Line = [false,false,false,false,false,false,false,false,false,false,false,false];
|
||||
Q.LastPx = 0;
|
||||
}
|
||||
|
||||
function Loop() {
|
||||
if (Testing.LoopCount > Testing.LoopMax) return;
|
||||
var TestingStr = String(Testing.LoopCount);
|
||||
while (TestingStr.length < 3) TestingStr = "0" + TestingStr;
|
||||
MTrans = Translate(I, -Q[8].V[0], -Q[8].V[1], -Q[8].V[2]);
|
||||
MTrans = RotateX(MTrans, 1);
|
||||
MTrans = RotateY(MTrans, 3);
|
||||
MTrans = RotateZ(MTrans, 5);
|
||||
MTrans = Translate(MTrans, Q[8].V[0], Q[8].V[1], Q[8].V[2]);
|
||||
MQube = MMulti(MTrans, MQube);
|
||||
var i = 8;
|
||||
for (; i > -1; i--) {
|
||||
Q[i].V = VMulti(MTrans, Q[i].V);
|
||||
}
|
||||
DrawQube();
|
||||
Testing.LoopCount++;
|
||||
Loop();
|
||||
}
|
||||
|
||||
function Init(CubeSize) {
|
||||
// init/reset vars
|
||||
Origin.V = [150,150,20,1];
|
||||
Testing.LoopCount = 0;
|
||||
Testing.LoopMax = 50;
|
||||
Testing.TimeMax = 0;
|
||||
Testing.TimeAvg = 0;
|
||||
Testing.TimeMin = 0;
|
||||
Testing.TimeTemp = 0;
|
||||
Testing.TimeTotal = 0;
|
||||
Testing.Init = false;
|
||||
|
||||
// transformation matrix
|
||||
MTrans = [
|
||||
[1,0,0,0],
|
||||
[0,1,0,0],
|
||||
[0,0,1,0],
|
||||
[0,0,0,1]
|
||||
];
|
||||
|
||||
// position information of qube
|
||||
MQube = [
|
||||
[1,0,0,0],
|
||||
[0,1,0,0],
|
||||
[0,0,1,0],
|
||||
[0,0,0,1]
|
||||
];
|
||||
|
||||
// entity matrix
|
||||
I = [
|
||||
[1,0,0,0],
|
||||
[0,1,0,0],
|
||||
[0,0,1,0],
|
||||
[0,0,0,1]
|
||||
];
|
||||
|
||||
// create qube
|
||||
Q[0] = new CreateP(-CubeSize,-CubeSize, CubeSize);
|
||||
Q[1] = new CreateP(-CubeSize, CubeSize, CubeSize);
|
||||
Q[2] = new CreateP( CubeSize, CubeSize, CubeSize);
|
||||
Q[3] = new CreateP( CubeSize,-CubeSize, CubeSize);
|
||||
Q[4] = new CreateP(-CubeSize,-CubeSize,-CubeSize);
|
||||
Q[5] = new CreateP(-CubeSize, CubeSize,-CubeSize);
|
||||
Q[6] = new CreateP( CubeSize, CubeSize,-CubeSize);
|
||||
Q[7] = new CreateP( CubeSize,-CubeSize,-CubeSize);
|
||||
|
||||
// center of gravity
|
||||
Q[8] = new CreateP(0, 0, 0);
|
||||
|
||||
// anti-clockwise edge check
|
||||
Q.Edge = [[0,1,2],[3,2,6],[7,6,5],[4,5,1],[4,0,3],[1,5,6]];
|
||||
|
||||
// calculate squad normals
|
||||
Q.Normal = new Array();
|
||||
for (var i = 0; i < Q.Edge.length; i++) Q.Normal[i] = CalcNormal(Q[Q.Edge[i][0]].V, Q[Q.Edge[i][1]].V, Q[Q.Edge[i][2]].V);
|
||||
|
||||
// line drawn ?
|
||||
Q.Line = [false,false,false,false,false,false,false,false,false,false,false,false];
|
||||
|
||||
// create line pixels
|
||||
Q.NumPx = 9 * 2 * CubeSize;
|
||||
for (var i = 0; i < Q.NumPx; i++) CreateP(0,0,0);
|
||||
|
||||
MTrans = Translate(MTrans, Origin.V[0], Origin.V[1], Origin.V[2]);
|
||||
MQube = MMulti(MTrans, MQube);
|
||||
|
||||
var i = 0;
|
||||
for (; i < 9; i++) {
|
||||
Q[i].V = VMulti(MTrans, Q[i].V);
|
||||
}
|
||||
DrawQube();
|
||||
Testing.Init = true;
|
||||
Loop();
|
||||
}
|
||||
|
||||
for ( var i = 20; i <= 160; i *= 2 ) {
|
||||
Init(i);
|
||||
}
|
||||
|
||||
Q = null;
|
||||
MTrans = null;
|
||||
MQube = null;
|
||||
I = null;
|
||||
Origin = null;
|
||||
Testing = null;
|
||||
LoopTime = null;
|
||||
DisplArea = null;
|
|
@ -0,0 +1,54 @@
|
|||
/*
|
||||
* Copyright (C) 2007 Apple Inc. All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. 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 APPLE COMPUTER, INC. ``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 APPLE COMPUTER, INC. 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.
|
||||
*/
|
||||
|
||||
var loops = 15
|
||||
var nx = 120
|
||||
var nz = 120
|
||||
|
||||
function morph(a, f) {
|
||||
var PI2nx = Math.PI * 8/nx
|
||||
var sin = Math.sin
|
||||
var f30 = -(50 * sin(f*Math.PI*2))
|
||||
|
||||
for (var i = 0; i < nz; ++i) {
|
||||
for (var j = 0; j < nx; ++j) {
|
||||
a[3*(i*nx+j)+1] = sin((j-1) * PI2nx ) * -f30
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
var a = Array()
|
||||
for (var i=0; i < nx*nz*3; ++i)
|
||||
a[i] = 0
|
||||
|
||||
for (var i = 0; i < loops; ++i) {
|
||||
morph(a, i/loops)
|
||||
}
|
||||
|
||||
testOutput = 0;
|
||||
for (var i = 0; i < nx; i++)
|
||||
testOutput += a[3*(i*nx+i)+1];
|
||||
a = null;
|
|
@ -0,0 +1,441 @@
|
|||
/*
|
||||
* Copyright (C) 2007 Apple Inc. All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. 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 APPLE COMPUTER, INC. ``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 APPLE COMPUTER, INC. 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.
|
||||
*/
|
||||
|
||||
function createVector(x,y,z) {
|
||||
return new Array(x,y,z);
|
||||
}
|
||||
|
||||
function sqrLengthVector(self) {
|
||||
return self[0] * self[0] + self[1] * self[1] + self[2] * self[2];
|
||||
}
|
||||
|
||||
function lengthVector(self) {
|
||||
return Math.sqrt(self[0] * self[0] + self[1] * self[1] + self[2] * self[2]);
|
||||
}
|
||||
|
||||
function addVector(self, v) {
|
||||
self[0] += v[0];
|
||||
self[1] += v[1];
|
||||
self[2] += v[2];
|
||||
return self;
|
||||
}
|
||||
|
||||
function subVector(self, v) {
|
||||
self[0] -= v[0];
|
||||
self[1] -= v[1];
|
||||
self[2] -= v[2];
|
||||
return self;
|
||||
}
|
||||
|
||||
function scaleVector(self, scale) {
|
||||
self[0] *= scale;
|
||||
self[1] *= scale;
|
||||
self[2] *= scale;
|
||||
return self;
|
||||
}
|
||||
|
||||
function normaliseVector(self) {
|
||||
var len = Math.sqrt(self[0] * self[0] + self[1] * self[1] + self[2] * self[2]);
|
||||
self[0] /= len;
|
||||
self[1] /= len;
|
||||
self[2] /= len;
|
||||
return self;
|
||||
}
|
||||
|
||||
function add(v1, v2) {
|
||||
return new Array(v1[0] + v2[0], v1[1] + v2[1], v1[2] + v2[2]);
|
||||
}
|
||||
|
||||
function sub(v1, v2) {
|
||||
return new Array(v1[0] - v2[0], v1[1] - v2[1], v1[2] - v2[2]);
|
||||
}
|
||||
|
||||
function scalev(v1, v2) {
|
||||
return new Array(v1[0] * v2[0], v1[1] * v2[1], v1[2] * v2[2]);
|
||||
}
|
||||
|
||||
function dot(v1, v2) {
|
||||
return v1[0] * v2[0] + v1[1] * v2[1] + v1[2] * v2[2];
|
||||
}
|
||||
|
||||
function scale(v, scale) {
|
||||
return [v[0] * scale, v[1] * scale, v[2] * scale];
|
||||
}
|
||||
|
||||
function cross(v1, v2) {
|
||||
return [v1[1] * v2[2] - v1[2] * v2[1],
|
||||
v1[2] * v2[0] - v1[0] * v2[2],
|
||||
v1[0] * v2[1] - v1[1] * v2[0]];
|
||||
|
||||
}
|
||||
|
||||
function normalise(v) {
|
||||
var len = lengthVector(v);
|
||||
return [v[0] / len, v[1] / len, v[2] / len];
|
||||
}
|
||||
|
||||
function transformMatrix(self, v) {
|
||||
var vals = self;
|
||||
var x = vals[0] * v[0] + vals[1] * v[1] + vals[2] * v[2] + vals[3];
|
||||
var y = vals[4] * v[0] + vals[5] * v[1] + vals[6] * v[2] + vals[7];
|
||||
var z = vals[8] * v[0] + vals[9] * v[1] + vals[10] * v[2] + vals[11];
|
||||
return [x, y, z];
|
||||
}
|
||||
|
||||
function invertMatrix(self) {
|
||||
var temp = new Array(16);
|
||||
var tx = -self[3];
|
||||
var ty = -self[7];
|
||||
var tz = -self[11];
|
||||
for (h = 0; h < 3; h++)
|
||||
for (v = 0; v < 3; v++)
|
||||
temp[h + v * 4] = self[v + h * 4];
|
||||
for (i = 0; i < 11; i++)
|
||||
self[i] = temp[i];
|
||||
self[3] = tx * self[0] + ty * self[1] + tz * self[2];
|
||||
self[7] = tx * self[4] + ty * self[5] + tz * self[6];
|
||||
self[11] = tx * self[8] + ty * self[9] + tz * self[10];
|
||||
return self;
|
||||
}
|
||||
|
||||
|
||||
// Triangle intersection using barycentric coord method
|
||||
function Triangle(p1, p2, p3) {
|
||||
var edge1 = sub(p3, p1);
|
||||
var edge2 = sub(p2, p1);
|
||||
var normal = cross(edge1, edge2);
|
||||
if (Math.abs(normal[0]) > Math.abs(normal[1]))
|
||||
if (Math.abs(normal[0]) > Math.abs(normal[2]))
|
||||
this.axis = 0;
|
||||
else
|
||||
this.axis = 2;
|
||||
else
|
||||
if (Math.abs(normal[1]) > Math.abs(normal[2]))
|
||||
this.axis = 1;
|
||||
else
|
||||
this.axis = 2;
|
||||
var u = (this.axis + 1) % 3;
|
||||
var v = (this.axis + 2) % 3;
|
||||
var u1 = edge1[u];
|
||||
var v1 = edge1[v];
|
||||
|
||||
var u2 = edge2[u];
|
||||
var v2 = edge2[v];
|
||||
this.normal = normalise(normal);
|
||||
this.nu = normal[u] / normal[this.axis];
|
||||
this.nv = normal[v] / normal[this.axis];
|
||||
this.nd = dot(normal, p1) / normal[this.axis];
|
||||
var det = u1 * v2 - v1 * u2;
|
||||
this.eu = p1[u];
|
||||
this.ev = p1[v];
|
||||
this.nu1 = u1 / det;
|
||||
this.nv1 = -v1 / det;
|
||||
this.nu2 = v2 / det;
|
||||
this.nv2 = -u2 / det;
|
||||
this.material = [0.7, 0.7, 0.7];
|
||||
}
|
||||
|
||||
Triangle.prototype.intersect = function(orig, dir, near, far) {
|
||||
var u = (this.axis + 1) % 3;
|
||||
var v = (this.axis + 2) % 3;
|
||||
var d = dir[this.axis] + this.nu * dir[u] + this.nv * dir[v];
|
||||
var t = (this.nd - orig[this.axis] - this.nu * orig[u] - this.nv * orig[v]) / d;
|
||||
if (t < near || t > far)
|
||||
return null;
|
||||
var Pu = orig[u] + t * dir[u] - this.eu;
|
||||
var Pv = orig[v] + t * dir[v] - this.ev;
|
||||
var a2 = Pv * this.nu1 + Pu * this.nv1;
|
||||
if (a2 < 0)
|
||||
return null;
|
||||
var a3 = Pu * this.nu2 + Pv * this.nv2;
|
||||
if (a3 < 0)
|
||||
return null;
|
||||
|
||||
if ((a2 + a3) > 1)
|
||||
return null;
|
||||
return t;
|
||||
}
|
||||
|
||||
function Scene(a_triangles) {
|
||||
this.triangles = a_triangles;
|
||||
this.lights = [];
|
||||
this.ambient = [0,0,0];
|
||||
this.background = [0.8,0.8,1];
|
||||
}
|
||||
var zero = new Array(0,0,0);
|
||||
|
||||
Scene.prototype.intersect = function(origin, dir, near, far) {
|
||||
var closest = null;
|
||||
for (i = 0; i < this.triangles.length; i++) {
|
||||
var triangle = this.triangles[i];
|
||||
var d = triangle.intersect(origin, dir, near, far);
|
||||
if (d == null || d > far || d < near)
|
||||
continue;
|
||||
far = d;
|
||||
closest = triangle;
|
||||
}
|
||||
|
||||
if (!closest)
|
||||
return [this.background[0],this.background[1],this.background[2]];
|
||||
|
||||
var normal = closest.normal;
|
||||
var hit = add(origin, scale(dir, far));
|
||||
if (dot(dir, normal) > 0)
|
||||
normal = [-normal[0], -normal[1], -normal[2]];
|
||||
|
||||
var colour = null;
|
||||
if (closest.shader) {
|
||||
colour = closest.shader(closest, hit, dir);
|
||||
} else {
|
||||
colour = closest.material;
|
||||
}
|
||||
|
||||
// do reflection
|
||||
var reflected = null;
|
||||
if (colour.reflection > 0.001) {
|
||||
var reflection = addVector(scale(normal, -2*dot(dir, normal)), dir);
|
||||
reflected = this.intersect(hit, reflection, 0.0001, 1000000);
|
||||
if (colour.reflection >= 0.999999)
|
||||
return reflected;
|
||||
}
|
||||
|
||||
var l = [this.ambient[0], this.ambient[1], this.ambient[2]];
|
||||
for (var i = 0; i < this.lights.length; i++) {
|
||||
var light = this.lights[i];
|
||||
var toLight = sub(light, hit);
|
||||
var distance = lengthVector(toLight);
|
||||
scaleVector(toLight, 1.0/distance);
|
||||
distance -= 0.0001;
|
||||
if (this.blocked(hit, toLight, distance))
|
||||
continue;
|
||||
var nl = dot(normal, toLight);
|
||||
if (nl > 0)
|
||||
addVector(l, scale(light.colour, nl));
|
||||
}
|
||||
l = scalev(l, colour);
|
||||
if (reflected) {
|
||||
l = addVector(scaleVector(l, 1 - colour.reflection), scaleVector(reflected, colour.reflection));
|
||||
}
|
||||
return l;
|
||||
}
|
||||
|
||||
Scene.prototype.blocked = function(O, D, far) {
|
||||
var near = 0.0001;
|
||||
var closest = null;
|
||||
for (i = 0; i < this.triangles.length; i++) {
|
||||
var triangle = this.triangles[i];
|
||||
var d = triangle.intersect(O, D, near, far);
|
||||
if (d == null || d > far || d < near)
|
||||
continue;
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
// this camera code is from notes i made ages ago, it is from *somewhere* -- i cannot remember where
|
||||
// that somewhere is
|
||||
function Camera(origin, lookat, up) {
|
||||
var zaxis = normaliseVector(subVector(lookat, origin));
|
||||
var xaxis = normaliseVector(cross(up, zaxis));
|
||||
var yaxis = normaliseVector(cross(xaxis, subVector([0,0,0], zaxis)));
|
||||
var m = new Array(16);
|
||||
m[0] = xaxis[0]; m[1] = xaxis[1]; m[2] = xaxis[2];
|
||||
m[4] = yaxis[0]; m[5] = yaxis[1]; m[6] = yaxis[2];
|
||||
m[8] = zaxis[0]; m[9] = zaxis[1]; m[10] = zaxis[2];
|
||||
invertMatrix(m);
|
||||
m[3] = 0; m[7] = 0; m[11] = 0;
|
||||
this.origin = origin;
|
||||
this.directions = new Array(4);
|
||||
this.directions[0] = normalise([-0.7, 0.7, 1]);
|
||||
this.directions[1] = normalise([ 0.7, 0.7, 1]);
|
||||
this.directions[2] = normalise([ 0.7, -0.7, 1]);
|
||||
this.directions[3] = normalise([-0.7, -0.7, 1]);
|
||||
this.directions[0] = transformMatrix(m, this.directions[0]);
|
||||
this.directions[1] = transformMatrix(m, this.directions[1]);
|
||||
this.directions[2] = transformMatrix(m, this.directions[2]);
|
||||
this.directions[3] = transformMatrix(m, this.directions[3]);
|
||||
}
|
||||
|
||||
Camera.prototype.generateRayPair = function(y) {
|
||||
rays = new Array(new Object(), new Object());
|
||||
rays[0].origin = this.origin;
|
||||
rays[1].origin = this.origin;
|
||||
rays[0].dir = addVector(scale(this.directions[0], y), scale(this.directions[3], 1 - y));
|
||||
rays[1].dir = addVector(scale(this.directions[1], y), scale(this.directions[2], 1 - y));
|
||||
return rays;
|
||||
}
|
||||
|
||||
function renderRows(camera, scene, pixels, width, height, starty, stopy) {
|
||||
for (var y = starty; y < stopy; y++) {
|
||||
var rays = camera.generateRayPair(y / height);
|
||||
for (var x = 0; x < width; x++) {
|
||||
var xp = x / width;
|
||||
var origin = addVector(scale(rays[0].origin, xp), scale(rays[1].origin, 1 - xp));
|
||||
var dir = normaliseVector(addVector(scale(rays[0].dir, xp), scale(rays[1].dir, 1 - xp)));
|
||||
var l = scene.intersect(origin, dir);
|
||||
pixels[y][x] = l;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Camera.prototype.render = function(scene, pixels, width, height) {
|
||||
var cam = this;
|
||||
var row = 0;
|
||||
renderRows(cam, scene, pixels, width, height, 0, height);
|
||||
}
|
||||
|
||||
|
||||
|
||||
function raytraceScene()
|
||||
{
|
||||
var startDate = new Date().getTime();
|
||||
var numTriangles = 2 * 6;
|
||||
var triangles = new Array();//numTriangles);
|
||||
var tfl = createVector(-10, 10, -10);
|
||||
var tfr = createVector( 10, 10, -10);
|
||||
var tbl = createVector(-10, 10, 10);
|
||||
var tbr = createVector( 10, 10, 10);
|
||||
var bfl = createVector(-10, -10, -10);
|
||||
var bfr = createVector( 10, -10, -10);
|
||||
var bbl = createVector(-10, -10, 10);
|
||||
var bbr = createVector( 10, -10, 10);
|
||||
|
||||
// cube!!!
|
||||
// front
|
||||
var i = 0;
|
||||
|
||||
triangles[i++] = new Triangle(tfl, tfr, bfr);
|
||||
triangles[i++] = new Triangle(tfl, bfr, bfl);
|
||||
// back
|
||||
triangles[i++] = new Triangle(tbl, tbr, bbr);
|
||||
triangles[i++] = new Triangle(tbl, bbr, bbl);
|
||||
// triangles[i-1].material = [0.7,0.2,0.2];
|
||||
// triangles[i-1].material.reflection = 0.8;
|
||||
// left
|
||||
triangles[i++] = new Triangle(tbl, tfl, bbl);
|
||||
// triangles[i-1].reflection = 0.6;
|
||||
triangles[i++] = new Triangle(tfl, bfl, bbl);
|
||||
// triangles[i-1].reflection = 0.6;
|
||||
// right
|
||||
triangles[i++] = new Triangle(tbr, tfr, bbr);
|
||||
triangles[i++] = new Triangle(tfr, bfr, bbr);
|
||||
// top
|
||||
triangles[i++] = new Triangle(tbl, tbr, tfr);
|
||||
triangles[i++] = new Triangle(tbl, tfr, tfl);
|
||||
// bottom
|
||||
triangles[i++] = new Triangle(bbl, bbr, bfr);
|
||||
triangles[i++] = new Triangle(bbl, bfr, bfl);
|
||||
|
||||
//Floor!!!!
|
||||
var green = createVector(0.0, 0.4, 0.0);
|
||||
var grey = createVector(0.4, 0.4, 0.4);
|
||||
grey.reflection = 1.0;
|
||||
var floorShader = function(tri, pos, view) {
|
||||
var x = ((pos[0]/32) % 2 + 2) % 2;
|
||||
var z = ((pos[2]/32 + 0.3) % 2 + 2) % 2;
|
||||
if (x < 1 != z < 1) {
|
||||
//in the real world we use the fresnel term...
|
||||
// var angle = 1-dot(view, tri.normal);
|
||||
// angle *= angle;
|
||||
// angle *= angle;
|
||||
// angle *= angle;
|
||||
//grey.reflection = angle;
|
||||
return grey;
|
||||
} else
|
||||
return green;
|
||||
}
|
||||
var ffl = createVector(-1000, -30, -1000);
|
||||
var ffr = createVector( 1000, -30, -1000);
|
||||
var fbl = createVector(-1000, -30, 1000);
|
||||
var fbr = createVector( 1000, -30, 1000);
|
||||
triangles[i++] = new Triangle(fbl, fbr, ffr);
|
||||
triangles[i-1].shader = floorShader;
|
||||
triangles[i++] = new Triangle(fbl, ffr, ffl);
|
||||
triangles[i-1].shader = floorShader;
|
||||
|
||||
var _scene = new Scene(triangles);
|
||||
_scene.lights[0] = createVector(20, 38, -22);
|
||||
_scene.lights[0].colour = createVector(0.7, 0.3, 0.3);
|
||||
_scene.lights[1] = createVector(-23, 40, 17);
|
||||
_scene.lights[1].colour = createVector(0.7, 0.3, 0.3);
|
||||
_scene.lights[2] = createVector(23, 20, 17);
|
||||
_scene.lights[2].colour = createVector(0.7, 0.7, 0.7);
|
||||
_scene.ambient = createVector(0.1, 0.1, 0.1);
|
||||
// _scene.background = createVector(0.7, 0.7, 1.0);
|
||||
|
||||
var size = 30;
|
||||
var pixels = new Array();
|
||||
for (var y = 0; y < size; y++) {
|
||||
pixels[y] = new Array();
|
||||
for (var x = 0; x < size; x++) {
|
||||
pixels[y][x] = 0;
|
||||
}
|
||||
}
|
||||
|
||||
var _camera = new Camera(createVector(-40, 40, 40), createVector(0, 0, 0), createVector(0, 1, 0));
|
||||
_camera.render(_scene, pixels, size, size);
|
||||
|
||||
return pixels;
|
||||
}
|
||||
|
||||
function arrayToCanvasCommands(pixels)
|
||||
{
|
||||
var s = '<canvas id="renderCanvas" width="30px" height="30px"></canvas><scr' + 'ipt>\nvar pixels = [';
|
||||
var size = 30;
|
||||
for (var y = 0; y < size; y++) {
|
||||
s += "[";
|
||||
for (var x = 0; x < size; x++) {
|
||||
s += "[" + pixels[y][x] + "],";
|
||||
}
|
||||
s+= "],";
|
||||
}
|
||||
s += '];\n var canvas = document.getElementById("renderCanvas").getContext("2d");\n\
|
||||
\n\
|
||||
\n\
|
||||
var size = 30;\n\
|
||||
canvas.fillStyle = "red";\n\
|
||||
canvas.fillRect(0, 0, size, size);\n\
|
||||
canvas.scale(1, -1);\n\
|
||||
canvas.translate(0, -size);\n\
|
||||
\n\
|
||||
if (!canvas.setFillColor)\n\
|
||||
canvas.setFillColor = function(r, g, b, a) {\n\
|
||||
this.fillStyle = "rgb("+[Math.floor(r * 255), Math.floor(g * 255), Math.floor(b * 255)]+")";\n\
|
||||
}\n\
|
||||
\n\
|
||||
for (var y = 0; y < size; y++) {\n\
|
||||
for (var x = 0; x < size; x++) {\n\
|
||||
var l = pixels[y][x];\n\
|
||||
canvas.setFillColor(l[0], l[1], l[2], 1);\n\
|
||||
canvas.fillRect(x, y, 1, 1);\n\
|
||||
}\n\
|
||||
}</scr' + 'ipt>';
|
||||
|
||||
return s;
|
||||
}
|
||||
|
||||
testOutput = arrayToCanvasCommands(raytraceScene());
|
|
@ -0,0 +1,26 @@
|
|||
3d-cube
|
||||
3d-morph
|
||||
3d-raytrace
|
||||
access-binary-trees
|
||||
access-fannkuch
|
||||
access-nbody
|
||||
access-nsieve
|
||||
bitops-3bit-bits-in-byte
|
||||
bitops-bits-in-byte
|
||||
bitops-bitwise-and
|
||||
bitops-nsieve-bits
|
||||
controlflow-recursive
|
||||
crypto-aes
|
||||
crypto-md5
|
||||
crypto-sha1
|
||||
date-format-tofte
|
||||
date-format-xparb
|
||||
math-cordic
|
||||
math-partial-sums
|
||||
math-spectral-norm
|
||||
regexp-dna
|
||||
string-base64
|
||||
string-fasta
|
||||
string-tagcloud
|
||||
string-unpack-code
|
||||
string-validate-input
|
|
@ -0,0 +1,50 @@
|
|||
/* The Great Computer Language Shootout
|
||||
http://shootout.alioth.debian.org/
|
||||
contributed by Isaac Gouy */
|
||||
|
||||
function TreeNode(left,right,item){
|
||||
this.left = left;
|
||||
this.right = right;
|
||||
this.item = item;
|
||||
}
|
||||
|
||||
TreeNode.prototype.itemCheck = function(){
|
||||
if (this.left==null) return this.item;
|
||||
else return this.item + this.left.itemCheck() - this.right.itemCheck();
|
||||
}
|
||||
|
||||
function bottomUpTree(item,depth){
|
||||
if (depth>0){
|
||||
return new TreeNode(
|
||||
bottomUpTree(2*item-1, depth-1)
|
||||
,bottomUpTree(2*item, depth-1)
|
||||
,item
|
||||
);
|
||||
}
|
||||
else {
|
||||
return new TreeNode(null,null,item);
|
||||
}
|
||||
}
|
||||
|
||||
var ret;
|
||||
|
||||
for ( var n = 4; n <= 7; n += 1 ) {
|
||||
var minDepth = 4;
|
||||
var maxDepth = Math.max(minDepth + 2, n);
|
||||
var stretchDepth = maxDepth + 1;
|
||||
|
||||
var check = bottomUpTree(0,stretchDepth).itemCheck();
|
||||
|
||||
var longLivedTree = bottomUpTree(0,maxDepth);
|
||||
for (var depth=minDepth; depth<=maxDepth; depth+=2){
|
||||
var iterations = 1 << (maxDepth - depth + minDepth);
|
||||
|
||||
check = 0;
|
||||
for (var i=1; i<=iterations; i++){
|
||||
check += bottomUpTree(i,depth).itemCheck();
|
||||
check += bottomUpTree(-i,depth).itemCheck();
|
||||
}
|
||||
}
|
||||
|
||||
ret = longLivedTree.itemCheck();
|
||||
}
|
|
@ -0,0 +1,66 @@
|
|||
/* The Great Computer Language Shootout
|
||||
http://shootout.alioth.debian.org/
|
||||
contributed by Isaac Gouy */
|
||||
|
||||
function fannkuch(n) {
|
||||
var check = 0;
|
||||
var perm = Array(n);
|
||||
var perm1 = Array(n);
|
||||
var count = Array(n);
|
||||
var maxPerm = Array(n);
|
||||
var maxFlipsCount = 0;
|
||||
var m = n - 1;
|
||||
|
||||
for (var i = 0; i < n; i++) perm1[i] = i;
|
||||
var r = n;
|
||||
|
||||
while (true) {
|
||||
// write-out the first 30 permutations
|
||||
if (check < 30){
|
||||
var s = "";
|
||||
for(var i=0; i<n; i++) s += (perm1[i]+1).toString();
|
||||
check++;
|
||||
}
|
||||
|
||||
while (r != 1) { count[r - 1] = r; r--; }
|
||||
if (!(perm1[0] == 0 || perm1[m] == m)) {
|
||||
for (var i = 0; i < n; i++) perm[i] = perm1[i];
|
||||
|
||||
var flipsCount = 0;
|
||||
var k;
|
||||
|
||||
while (!((k = perm[0]) == 0)) {
|
||||
var k2 = (k + 1) >> 1;
|
||||
for (var i = 0; i < k2; i++) {
|
||||
var temp = perm[i]; perm[i] = perm[k - i]; perm[k - i] = temp;
|
||||
}
|
||||
flipsCount++;
|
||||
}
|
||||
|
||||
if (flipsCount > maxFlipsCount) {
|
||||
maxFlipsCount = flipsCount;
|
||||
for (var i = 0; i < n; i++) maxPerm[i] = perm1[i];
|
||||
}
|
||||
}
|
||||
|
||||
while (true) {
|
||||
if (r == n) return maxFlipsCount;
|
||||
var perm0 = perm1[0];
|
||||
var i = 0;
|
||||
while (i < r) {
|
||||
var j = i + 1;
|
||||
perm1[i] = perm1[j];
|
||||
i = j;
|
||||
}
|
||||
perm1[r] = perm0;
|
||||
|
||||
count[r] = count[r] - 1;
|
||||
if (count[r] > 0) break;
|
||||
r++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
var n = 8;
|
||||
var ret = fannkuch(n);
|
||||
|
|
@ -0,0 +1,169 @@
|
|||
/* The Great Computer Language Shootout
|
||||
http://shootout.alioth.debian.org/
|
||||
contributed by Isaac Gouy */
|
||||
|
||||
var PI = 3.141592653589793;
|
||||
var SOLAR_MASS = 4 * PI * PI;
|
||||
var DAYS_PER_YEAR = 365.24;
|
||||
|
||||
function Body(x,y,z,vx,vy,vz,mass){
|
||||
this.x = x;
|
||||
this.y = y;
|
||||
this.z = z;
|
||||
this.vx = vx;
|
||||
this.vy = vy;
|
||||
this.vz = vz;
|
||||
this.mass = mass;
|
||||
}
|
||||
|
||||
Body.prototype.offsetMomentum = function(px,py,pz) {
|
||||
this.vx = -px / SOLAR_MASS;
|
||||
this.vy = -py / SOLAR_MASS;
|
||||
this.vz = -pz / SOLAR_MASS;
|
||||
return this;
|
||||
}
|
||||
|
||||
function Jupiter(){
|
||||
return new Body(
|
||||
4.84143144246472090e+00,
|
||||
-1.16032004402742839e+00,
|
||||
-1.03622044471123109e-01,
|
||||
1.66007664274403694e-03 * DAYS_PER_YEAR,
|
||||
7.69901118419740425e-03 * DAYS_PER_YEAR,
|
||||
-6.90460016972063023e-05 * DAYS_PER_YEAR,
|
||||
9.54791938424326609e-04 * SOLAR_MASS
|
||||
);
|
||||
}
|
||||
|
||||
function Saturn(){
|
||||
return new Body(
|
||||
8.34336671824457987e+00,
|
||||
4.12479856412430479e+00,
|
||||
-4.03523417114321381e-01,
|
||||
-2.76742510726862411e-03 * DAYS_PER_YEAR,
|
||||
4.99852801234917238e-03 * DAYS_PER_YEAR,
|
||||
2.30417297573763929e-05 * DAYS_PER_YEAR,
|
||||
2.85885980666130812e-04 * SOLAR_MASS
|
||||
);
|
||||
}
|
||||
|
||||
function Uranus(){
|
||||
return new Body(
|
||||
1.28943695621391310e+01,
|
||||
-1.51111514016986312e+01,
|
||||
-2.23307578892655734e-01,
|
||||
2.96460137564761618e-03 * DAYS_PER_YEAR,
|
||||
2.37847173959480950e-03 * DAYS_PER_YEAR,
|
||||
-2.96589568540237556e-05 * DAYS_PER_YEAR,
|
||||
4.36624404335156298e-05 * SOLAR_MASS
|
||||
);
|
||||
}
|
||||
|
||||
function Neptune(){
|
||||
return new Body(
|
||||
1.53796971148509165e+01,
|
||||
-2.59193146099879641e+01,
|
||||
1.79258772950371181e-01,
|
||||
2.68067772490389322e-03 * DAYS_PER_YEAR,
|
||||
1.62824170038242295e-03 * DAYS_PER_YEAR,
|
||||
-9.51592254519715870e-05 * DAYS_PER_YEAR,
|
||||
5.15138902046611451e-05 * SOLAR_MASS
|
||||
);
|
||||
}
|
||||
|
||||
function Sun(){
|
||||
return new Body(0.0, 0.0, 0.0, 0.0, 0.0, 0.0, SOLAR_MASS);
|
||||
}
|
||||
|
||||
|
||||
function NBodySystem(bodies){
|
||||
this.bodies = bodies;
|
||||
var px = 0.0;
|
||||
var py = 0.0;
|
||||
var pz = 0.0;
|
||||
var size = this.bodies.length;
|
||||
for (var i=0; i<size; i++){
|
||||
var b = this.bodies[i];
|
||||
var m = b.mass;
|
||||
px += b.vx * m;
|
||||
py += b.vy * m;
|
||||
pz += b.vz * m;
|
||||
}
|
||||
this.bodies[0].offsetMomentum(px,py,pz);
|
||||
}
|
||||
|
||||
NBodySystem.prototype.advance = function(dt){
|
||||
var dx, dy, dz, distance, mag;
|
||||
var size = this.bodies.length;
|
||||
|
||||
for (var i=0; i<size; i++) {
|
||||
var bodyi = this.bodies[i];
|
||||
for (var j=i+1; j<size; j++) {
|
||||
var bodyj = this.bodies[j];
|
||||
dx = bodyi.x - bodyj.x;
|
||||
dy = bodyi.y - bodyj.y;
|
||||
dz = bodyi.z - bodyj.z;
|
||||
|
||||
distance = Math.sqrt(dx*dx + dy*dy + dz*dz);
|
||||
mag = dt / (distance * distance * distance);
|
||||
|
||||
bodyi.vx -= dx * bodyj.mass * mag;
|
||||
bodyi.vy -= dy * bodyj.mass * mag;
|
||||
bodyi.vz -= dz * bodyj.mass * mag;
|
||||
|
||||
bodyj.vx += dx * bodyi.mass * mag;
|
||||
bodyj.vy += dy * bodyi.mass * mag;
|
||||
bodyj.vz += dz * bodyi.mass * mag;
|
||||
}
|
||||
}
|
||||
|
||||
for (var i=0; i<size; i++) {
|
||||
var body = this.bodies[i];
|
||||
body.x += dt * body.vx;
|
||||
body.y += dt * body.vy;
|
||||
body.z += dt * body.vz;
|
||||
}
|
||||
}
|
||||
|
||||
NBodySystem.prototype.energy = function(){
|
||||
var dx, dy, dz, distance;
|
||||
var e = 0.0;
|
||||
var size = this.bodies.length;
|
||||
|
||||
for (var i=0; i<size; i++) {
|
||||
var bodyi = this.bodies[i];
|
||||
|
||||
e += 0.5 * bodyi.mass *
|
||||
( bodyi.vx * bodyi.vx
|
||||
+ bodyi.vy * bodyi.vy
|
||||
+ bodyi.vz * bodyi.vz );
|
||||
|
||||
for (var j=i+1; j<size; j++) {
|
||||
var bodyj = this.bodies[j];
|
||||
dx = bodyi.x - bodyj.x;
|
||||
dy = bodyi.y - bodyj.y;
|
||||
dz = bodyi.z - bodyj.z;
|
||||
|
||||
distance = Math.sqrt(dx*dx + dy*dy + dz*dz);
|
||||
e -= (bodyi.mass * bodyj.mass) / distance;
|
||||
}
|
||||
}
|
||||
return e;
|
||||
}
|
||||
|
||||
var ret;
|
||||
|
||||
for ( var n = 3; n <= 24; n *= 2 ) {
|
||||
(function(){
|
||||
var bodies = new NBodySystem( Array(
|
||||
Sun(),Jupiter(),Saturn(),Uranus(),Neptune()
|
||||
));
|
||||
var max = n * 100;
|
||||
|
||||
ret = bodies.energy();
|
||||
for (var i=0; i<max; i++){
|
||||
bodies.advance(0.01);
|
||||
}
|
||||
ret = bodies.energy();
|
||||
})();
|
||||
}
|
|
@ -0,0 +1,38 @@
|
|||
// The Great Computer Language Shootout
|
||||
// http://shootout.alioth.debian.org/
|
||||
//
|
||||
// modified by Isaac Gouy
|
||||
|
||||
function pad(number,width){
|
||||
var s = number.toString();
|
||||
var prefixWidth = width - s.length;
|
||||
if (prefixWidth>0){
|
||||
for (var i=1; i<=prefixWidth; i++) s = " " + s;
|
||||
}
|
||||
return s;
|
||||
}
|
||||
|
||||
function nsieve(m, isPrime){
|
||||
var i, k, count;
|
||||
|
||||
for (i=2; i<=m; i++) { isPrime[i] = true; }
|
||||
count = 0;
|
||||
|
||||
for (i=2; i<=m; i++){
|
||||
if (isPrime[i]) {
|
||||
for (k=i+i; k<=m; k+=i) isPrime[k] = false;
|
||||
count++;
|
||||
}
|
||||
}
|
||||
return count;
|
||||
}
|
||||
|
||||
function sieve() {
|
||||
for (var i = 1; i <= 3; i++ ) {
|
||||
var m = (1<<i)*10000;
|
||||
var flags = Array(m+1);
|
||||
nsieve(m, flags);
|
||||
}
|
||||
}
|
||||
|
||||
sieve();
|
|
@ -0,0 +1,32 @@
|
|||
// Copyright (c) 2004 by Arthur Langereis (arthur_ext at domain xfinitegames, tld com
|
||||
|
||||
// 1 op = 6 ANDs, 3 SHRs, 3 SHLs, 4 assigns, 2 ADDs
|
||||
// O(1)
|
||||
function fast3bitlookup(b) {
|
||||
var c, bi3b = 0xE994; // 0b1110 1001 1001 0100; // 3 2 2 1 2 1 1 0
|
||||
c = 3 & (bi3b >> ((b << 1) & 14));
|
||||
c += 3 & (bi3b >> ((b >> 2) & 14));
|
||||
c += 3 & (bi3b >> ((b >> 5) & 6));
|
||||
return c;
|
||||
|
||||
/*
|
||||
lir4,0xE994; 9 instructions, no memory access, minimal register dependence, 6 shifts, 2 adds, 1 inline assign
|
||||
rlwinmr5,r3,1,28,30
|
||||
rlwinmr6,r3,30,28,30
|
||||
rlwinmr7,r3,27,29,30
|
||||
rlwnmr8,r4,r5,30,31
|
||||
rlwnmr9,r4,r6,30,31
|
||||
rlwnmr10,r4,r7,30,31
|
||||
addr3,r8,r9
|
||||
addr3,r3,r10
|
||||
*/
|
||||
}
|
||||
|
||||
|
||||
function TimeFunc(func) {
|
||||
var x, y, t;
|
||||
for(var x=0; x<500; x++)
|
||||
for(var y=0; y<256; y++) func(y);
|
||||
}
|
||||
|
||||
TimeFunc(fast3bitlookup);
|
|
@ -0,0 +1,21 @@
|
|||
// Copyright (c) 2004 by Arthur Langereis (arthur_ext at domain xfinitegames, tld com)
|
||||
|
||||
|
||||
// 1 op = 2 assigns, 16 compare/branches, 8 ANDs, (0-8) ADDs, 8 SHLs
|
||||
// O(n)
|
||||
function bitsinbyte(b) {
|
||||
var m = 1, c = 0;
|
||||
while(m<0x100) {
|
||||
if(b & m) c++;
|
||||
m <<= 1;
|
||||
}
|
||||
return c;
|
||||
}
|
||||
|
||||
function TimeFunc(func) {
|
||||
var x, y, t;
|
||||
for(var x=0; x<350; x++)
|
||||
for(var y=0; y<256; y++) func(y);
|
||||
}
|
||||
|
||||
TimeFunc(bitsinbyte);
|
|
@ -0,0 +1,28 @@
|
|||
/*
|
||||
* Copyright (C) 2007 Apple Inc. All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. 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 APPLE COMPUTER, INC. ``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 APPLE COMPUTER, INC. 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.
|
||||
*/
|
||||
|
||||
bitwiseAndValue = 4294967296;
|
||||
for (var i = 0; i < 600000; i++)
|
||||
bitwiseAndValue = bitwiseAndValue & i;
|
Некоторые файлы не были показаны из-за слишком большого количества измененных файлов Показать больше
Загрузка…
Ссылка в новой задаче